func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) { scheme := runtime.NewScheme() scheme.AddKnownTypeWithName("", "Type", &internalType{}) scheme.AddKnownTypeWithName("unlikelyversion", "Type", &externalType{}) //This tests that kubectl will not confuse the external scheme with the internal scheme, even when they accidentally have versions of the same name. scheme.AddKnownTypeWithName(testapi.Default.Version(), "Type", &ExternalType2{}) codec := runtime.CodecFor(scheme, "unlikelyversion") validVersion := testapi.Default.Version() mapper := meta.NewDefaultRESTMapper("apitest", []string{"unlikelyversion", validVersion}, func(version string) (*meta.VersionInterfaces, error) { return &meta.VersionInterfaces{ Codec: runtime.CodecFor(scheme, version), ObjectConvertor: scheme, MetadataAccessor: meta.NewAccessor(), }, versionErrIfFalse(version == validVersion || version == "unlikelyversion") }) for _, version := range []string{"unlikelyversion", validVersion} { for kind := range scheme.KnownTypes(version) { mixedCase := false scope := meta.RESTScopeNamespace mapper.Add(scope, kind, version, mixedCase) } } return scheme, mapper, codec }
func init() { // Use the first API version in the list of registered versions as the latest. Version = registered.RegisteredVersions[0] OldestVersion = registered.RegisteredVersions[len(registered.RegisteredVersions)-1] Codec = runtime.CodecFor(api.Scheme, Version) // Put the registered versions in Versions in reverse order. versions := registered.RegisteredVersions Versions = []string{} for i := len(versions) - 1; i >= 0; i-- { Versions = append(Versions, versions[i]) } mapper := meta.NewDefaultRESTMapper( versions, func(version string) (*meta.VersionInterfaces, bool) { interfaces, err := InterfacesFor(version) if err != nil { return nil, false } return interfaces, true }, ) // the list of kinds that are scoped at the root of the api hierarchy // if a kind is not enumerated here, it is assumed to have a namespace scope kindToRootScope := map[string]bool{ "Node": true, "Minion": true, "Namespace": true, "PersistentVolume": true, } // setup aliases for groups of resources mapper.AddResourceAlias("all", userResources...) // these kinds should be excluded from the list of resources ignoredKinds := util.NewStringSet( "ListOptions", "DeleteOptions", "Status", "PodLogOptions", "PodExecOptions", "PodProxyOptions") // enumerate all supported versions, get the kinds, and register with the mapper how to address our resources. for _, version := range versions { for kind := range api.Scheme.KnownTypes(version) { if ignoredKinds.Has(kind) { continue } scope := meta.RESTScopeNamespace if kindToRootScope[kind] { scope = meta.RESTScopeRoot } mapper.Add(scope, kind, version, false) } } RESTMapper = mapper }
func NewDefaultRESTMapper(group string, versions []string, interfacesFunc meta.VersionInterfacesFunc, importPathPrefix string, ignoredKinds, rootScoped sets.String) *meta.DefaultRESTMapper { mapper := meta.NewDefaultRESTMapper(group, versions, interfacesFunc) // enumerate all supported versions, get the kinds, and register with the mapper how to address // our resources. for _, version := range versions { for kind, oType := range Scheme.KnownTypes(version) { // TODO: Remove import path prefix check. // We check the import path prefix because we currently stuff both "api" and "extensions" objects // into the same group within Scheme since Scheme has no notion of groups yet. if !strings.HasPrefix(oType.PkgPath(), importPathPrefix) || ignoredKinds.Has(kind) { continue } scope := meta.RESTScopeNamespace if rootScoped.Has(kind) { scope = meta.RESTScopeRoot } mapper.Add(scope, kind, version, false) } } return mapper }