// mergeGroupMeta takes an lhs and an rhs GroupMeta, then builds a resulting GroupMeta that contains the // merged information. Order of merging matters: lhs wins. func mergeGroupMeta(lhs, rhs apimachinery.GroupMeta) apimachinery.GroupMeta { merged := apimachinery.GroupMeta{} merged.GroupVersion = lhs.GroupVersion merged.SelfLinker = lhs.SelfLinker knownGVs := sets.String{} for _, lhsGV := range lhs.GroupVersions { knownGVs.Insert(lhsGV.String()) merged.GroupVersions = append(merged.GroupVersions, lhsGV) } for _, rhsGV := range lhs.GroupVersions { if knownGVs.Has(rhsGV.String()) { continue } merged.GroupVersions = append(merged.GroupVersions, rhsGV) } merged.RESTMapper = meta.MultiRESTMapper(append([]meta.RESTMapper{}, lhs.RESTMapper, rhs.RESTMapper)) merged.InterfacesFor = func(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { if ret, err := lhs.InterfacesFor(version); err == nil { return ret, nil } return rhs.InterfacesFor(version) } return merged }
func (s *GenericAPIServer) newAPIGroupVersion(groupMeta apimachinery.GroupMeta, groupVersion unversioned.GroupVersion) (*apiserver.APIGroupVersion, error) { versionInterface, err := groupMeta.InterfacesFor(groupVersion) if err != nil { return nil, err } return &apiserver.APIGroupVersion{ RequestInfoResolver: s.NewRequestInfoResolver(), Creater: api.Scheme, Convertor: api.Scheme, Typer: api.Scheme, GroupVersion: groupVersion, Linker: groupMeta.SelfLinker, Mapper: groupMeta.RESTMapper, Codec: versionInterface.Codec, Admit: s.AdmissionControl, Context: s.RequestContextMapper, MinRequestTimeout: s.MinRequestTimeout, }, nil }