// 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 }
// Enable enables group versions that are allowed, adds methods to the scheme, etc. func (gmf *GroupMetaFactory) Enable(m *registered.APIRegistrationManager, scheme *runtime.Scheme) error { externalVersions := []schema.GroupVersion{} for _, v := range gmf.prioritizedVersionList { if !m.IsAllowedVersion(v) { continue } externalVersions = append(externalVersions, v) if err := m.EnableVersions(v); err != nil { return err } gmf.VersionArgs[v.Version].AddToScheme(scheme) } if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", gmf.GroupArgs.GroupName) return nil } if gmf.GroupArgs.AddInternalObjectsToScheme != nil { gmf.GroupArgs.AddInternalObjectsToScheme(scheme) } preferredExternalVersion := externalVersions[0] accessor := meta.NewAccessor() groupMeta := &apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, SelfLinker: runtime.SelfLinker(accessor), } for _, v := range externalVersions { gvf := gmf.VersionArgs[v.Version] if err := groupMeta.AddVersionInterfaces( schema.GroupVersion{Group: gvf.GroupName, Version: gvf.VersionName}, &meta.VersionInterfaces{ ObjectConvertor: scheme, MetadataAccessor: accessor, }, ); err != nil { return err } } groupMeta.InterfacesFor = groupMeta.DefaultInterfacesFor groupMeta.RESTMapper = gmf.newRESTMapper(scheme, externalVersions, groupMeta) if err := m.RegisterGroup(*groupMeta); err != nil { return err } return nil }