// Register constructs the finalized prioritized version list and sanity checks // the announced group & versions. Then it calls register. func (gmf *GroupMetaFactory) Register(m *registered.APIRegistrationManager) error { if gmf.GroupArgs == nil { return fmt.Errorf("partially announced groups are not allowed, only got versions: %#v", gmf.VersionArgs) } if len(gmf.VersionArgs) == 0 { return fmt.Errorf("group %v announced but no versions announced", gmf.GroupArgs.GroupName) } pvSet := sets.NewString(gmf.GroupArgs.VersionPreferenceOrder...) if pvSet.Len() != len(gmf.GroupArgs.VersionPreferenceOrder) { return fmt.Errorf("preference order for group %v has duplicates: %v", gmf.GroupArgs.GroupName, gmf.GroupArgs.VersionPreferenceOrder) } prioritizedVersions := []schema.GroupVersion{} for _, v := range gmf.GroupArgs.VersionPreferenceOrder { prioritizedVersions = append( prioritizedVersions, schema.GroupVersion{ Group: gmf.GroupArgs.GroupName, Version: v, }, ) } // Go through versions that weren't explicitly prioritized. unprioritizedVersions := []schema.GroupVersion{} for _, v := range gmf.VersionArgs { if v.GroupName != gmf.GroupArgs.GroupName { return fmt.Errorf("found %v/%v in group %v?", v.GroupName, v.VersionName, gmf.GroupArgs.GroupName) } if pvSet.Has(v.VersionName) { pvSet.Delete(v.VersionName) continue } unprioritizedVersions = append(unprioritizedVersions, schema.GroupVersion{Group: v.GroupName, Version: v.VersionName}) } if len(unprioritizedVersions) > 1 { glog.Warningf("group %v has multiple unprioritized versions: %#v. They will have an arbitrary preference order!", gmf.GroupArgs.GroupName, unprioritizedVersions) } if pvSet.Len() != 0 { return fmt.Errorf("group %v has versions in the priority list that were never announced: %s", gmf.GroupArgs.GroupName, pvSet) } prioritizedVersions = append(prioritizedVersions, unprioritizedVersions...) m.RegisterVersions(prioritizedVersions) gmf.prioritizedVersionList = prioritizedVersions return nil }