From 2b5b708b70b41761e5cd68dc6e4ea35994d0fe09 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Fri, 18 Dec 2015 21:08:34 -0800 Subject: [PATCH 1/2] Refactor the API registration and installation --- cmd/genconversion/conversion.go | 11 +- cmd/gendeepcopy/deep_copy.go | 11 +- .../apis/testgroup/install/install.go | 17 +- .../testdata/apis/testgroup/register.go | 4 +- .../testdata/apis/testgroup/v1/register.go | 4 +- contrib/mesos/pkg/podutil/gzip.go | 1 + docs/admin/kube-apiserver.md | 2 +- pkg/api/install/install.go | 47 ++++-- pkg/api/register.go | 4 +- pkg/api/registered/registered.go | 151 ++++++++++++------ pkg/api/testing/fuzzer.go | 7 +- pkg/api/v1/register.go | 10 +- pkg/apis/componentconfig/install/install.go | 45 ++++-- pkg/apis/componentconfig/register.go | 2 +- pkg/apis/componentconfig/v1alpha1/register.go | 2 +- pkg/apis/extensions/install/install.go | 45 ++++-- pkg/apis/extensions/register.go | 4 +- pkg/apis/extensions/v1beta1/defaults_test.go | 5 +- pkg/apis/extensions/v1beta1/register.go | 2 +- pkg/apis/metrics/install/install.go | 45 ++++-- pkg/apis/metrics/register.go | 4 +- pkg/apis/metrics/v1alpha1/register.go | 4 +- .../unversioned/import_known_versions.go | 9 ++ .../unversioned/testclient/testclient.go | 2 +- pkg/kubectl/cmd/convert.go | 2 +- pkg/kubectl/cmd/util/clientcache.go | 2 +- pkg/kubectl/cmd/util/factory.go | 4 +- pkg/kubectl/resource/mapper.go | 4 +- pkg/kubelet/config/common_test.go | 4 +- pkg/master/import_known_versions.go | 9 ++ 30 files changed, 327 insertions(+), 136 deletions(-) diff --git a/cmd/genconversion/conversion.go b/cmd/genconversion/conversion.go index ee2ca60ffde2..d43f1fb2a38e 100644 --- a/cmd/genconversion/conversion.go +++ b/cmd/genconversion/conversion.go @@ -25,14 +25,11 @@ import ( "runtime" "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/unversioned" - _ "k8s.io/kubernetes/pkg/api/v1" - _ "k8s.io/kubernetes/pkg/apis/componentconfig" - _ "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" - _ "k8s.io/kubernetes/pkg/apis/extensions" - _ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - _ "k8s.io/kubernetes/pkg/apis/metrics" - _ "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1" + _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" + _ "k8s.io/kubernetes/pkg/apis/extensions/install" + _ "k8s.io/kubernetes/pkg/apis/metrics/install" kruntime "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" diff --git a/cmd/gendeepcopy/deep_copy.go b/cmd/gendeepcopy/deep_copy.go index 963264ab7e3d..990b87e7206d 100644 --- a/cmd/gendeepcopy/deep_copy.go +++ b/cmd/gendeepcopy/deep_copy.go @@ -26,14 +26,11 @@ import ( "strings" "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/unversioned" - _ "k8s.io/kubernetes/pkg/api/v1" - _ "k8s.io/kubernetes/pkg/apis/componentconfig" - _ "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" - _ "k8s.io/kubernetes/pkg/apis/extensions" - _ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - _ "k8s.io/kubernetes/pkg/apis/metrics" - _ "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1" + _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" + _ "k8s.io/kubernetes/pkg/apis/extensions/install" + _ "k8s.io/kubernetes/pkg/apis/metrics/install" kruntime "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go index 9cf8ca27b316..19f17e3fdca7 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go @@ -23,11 +23,11 @@ import ( "github.com/golang/glog" + "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" @@ -43,10 +43,9 @@ const groupName = "testgroup" var availableVersions = []unversioned.GroupVersion{{Group: groupName, Version: "v1"}} func init() { - registered.RegisteredGroupVersions = append(registered.RegisteredGroupVersions, v1.SchemeGroupVersion) - externalVersions := availableVersions preferredExternalVersion := externalVersions[0] + addVersionsToScheme(externalVersions...) groupMeta := latest.GroupMeta{ GroupVersion: preferredExternalVersion, @@ -95,3 +94,15 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } } + +func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { + // add the internal version to Scheme + testgroup.AddToScheme() + // add the enabled external versions to Scheme + for _, v := range externalVersions { + switch v { + case v1.SchemeGroupVersion: + v1.AddToScheme() + } + } +} diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go index ed66d6abc66f..ccdc6dba5e02 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go @@ -23,8 +23,8 @@ import ( var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: ""} -func init() { - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() } diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go index 6c6a70e907c4..fd578fbb6918 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go @@ -27,8 +27,8 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: " var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func init() { - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() } diff --git a/contrib/mesos/pkg/podutil/gzip.go b/contrib/mesos/pkg/podutil/gzip.go index 751f5d5e78ca..8778326d092b 100644 --- a/contrib/mesos/pkg/podutil/gzip.go +++ b/contrib/mesos/pkg/podutil/gzip.go @@ -23,6 +23,7 @@ import ( "io/ioutil" "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/v1" ) diff --git a/docs/admin/kube-apiserver.md b/docs/admin/kube-apiserver.md index 15ef3e38f5b9..45eff1778a07 100644 --- a/docs/admin/kube-apiserver.md +++ b/docs/admin/kube-apiserver.md @@ -100,7 +100,7 @@ kube-apiserver --service-node-port-range=: A port range to reserve for services with NodePort visibility. Example: '30000-32767'. Inclusive at both ends of the range. --ssh-keyfile="": If non-empty, use secure SSH proxy to the nodes, using this user keyfile --ssh-user="": If non-empty, use secure SSH proxy to the nodes, using this user name - --storage-versions="componentconfig/v1alpha1,extensions/v1beta1,v1": The versions to store resources with. Different groups may be stored in different versions. Specified in the format "group1/version1,group2/version2...". This flag expects a complete list of storage versions of ALL groups registered in the server. It defaults to a list of preferred versions of all registered groups, which is derived from the KUBE_API_VERSIONS environment variable. + --storage-versions="componentconfig/v1alpha1,extensions/v1beta1,metrics/v1alpha1,v1": The versions to store resources with. Different groups may be stored in different versions. Specified in the format "group1/version1,group2/version2...". This flag expects a complete list of storage versions of ALL groups registered in the server. It defaults to a list of preferred versions of all registered groups, which is derived from the KUBE_API_VERSIONS environment variable. --tls-cert-file="": File containing x509 Certificate for HTTPS. (CA cert, if any, concatenated after server cert). If HTTPS serving is enabled, and --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key are generated for the public address and saved to /var/run/kubernetes. --tls-private-key-file="": File containing x509 private key matching --tls-cert-file. --token-auth-file="": If set, the file that will be used to secure the secure port of the API server via token authentication. diff --git a/pkg/api/install/install.go b/pkg/api/install/install.go index 8c1ade872868..cebaccd757de 100644 --- a/pkg/api/install/install.go +++ b/pkg/api/install/install.go @@ -25,10 +25,10 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/latest" + "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/runtime" @@ -42,20 +42,32 @@ var accessor = meta.NewAccessor() var availableVersions = []unversioned.GroupVersion{v1.SchemeGroupVersion} func init() { + registered.RegisterVersions(availableVersions...) + externalVersions := []unversioned.GroupVersion{} - for _, allowedVersion := range registered.GroupVersionsForGroup(api.GroupName) { - for _, externalVersion := range availableVersions { - if externalVersion == allowedVersion { - externalVersions = append(externalVersions, externalVersion) - } + for _, v := range availableVersions { + if registered.IsAllowedVersion(v) { + externalVersions = append(externalVersions, v) } } - if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", api.GroupName) return } + if err := registered.EnableVersions(externalVersions...); err != nil { + glog.V(4).Infof("%v", err) + return + } + if err := enableVersions(externalVersions); err != nil { + glog.V(4).Infof("%v", err) + return + } +} +// TODO: enableVersions should be centralized rather than spread in each API +// group. +func enableVersions(externalVersions []unversioned.GroupVersion) error { + addVersionsToScheme(externalVersions...) preferredExternalVersion := externalVersions[0] groupMeta := latest.GroupMeta{ @@ -68,11 +80,10 @@ func init() { } if err := latest.RegisterGroup(groupMeta); err != nil { - glog.V(4).Infof("%v", err) - return + return err } - api.RegisterRESTMapper(groupMeta.RESTMapper) + return nil } // userResources is a group of resources mostly used by a kubectl user @@ -128,3 +139,19 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } } + +func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { + // add the internal version to Scheme + api.AddToScheme() + // add the enabled external versions to Scheme + for _, v := range externalVersions { + if !registered.IsEnabledVersion(v) { + glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v) + continue + } + switch v { + case v1.SchemeGroupVersion: + v1.AddToScheme() + } + } +} diff --git a/pkg/api/register.go b/pkg/api/register.go index c85a33ed8822..e80421c7060b 100644 --- a/pkg/api/register.go +++ b/pkg/api/register.go @@ -41,7 +41,7 @@ func Resource(resource string) unversioned.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } -func init() { +func AddToScheme() { Scheme.AddKnownTypes(SchemeGroupVersion, &Pod{}, &PodList{}, @@ -86,7 +86,7 @@ func init() { &RangeAllocation{}, ) - // Register Unversioned types + // Add the Unversioned types to Scheme. // TODO this should not be done here Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.ExportOptions{}) Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) diff --git a/pkg/api/registered/registered.go b/pkg/api/registered/registered.go index 6040c542e5c5..fd23ceee6f18 100644 --- a/pkg/api/registered/registered.go +++ b/pkg/api/registered/registered.go @@ -18,6 +18,7 @@ limitations under the License. package registered import ( + "fmt" "os" "strings" @@ -25,71 +26,129 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" ) -// List of registered API versions. -// The list is in the order of most preferred to the least. -var RegisteredGroupVersions []unversioned.GroupVersion +var ( + // registeredVersions represents all registered API versions. Please call + // RegisterVersions() to add registered versions. + registeredVersions = map[unversioned.GroupVersion]struct{}{} -func init() { - validGroupVersions := map[unversioned.GroupVersion]bool{ - unversioned.GroupVersion{Group: "", Version: "v1"}: true, - unversioned.GroupVersion{Group: "extensions", Version: "v1beta1"}: true, - unversioned.GroupVersion{Group: "componentconfig", Version: "v1alpha1"}: true, - unversioned.GroupVersion{Group: "metrics", Version: "v1alpha1"}: true, - } + // enabledVersions represents all enabled API versions. It should be a + // subset of registeredVersions. Please call EnableVersions() to add + // enabled versions. + enabledVersions = map[unversioned.GroupVersion]struct{}{} - // The default list of supported api versions, in order of most preferred to the least. - supportedVersions := []unversioned.GroupVersion{ - {Group: "", Version: "v1"}, - {Group: "extensions", Version: "v1beta1"}, - {Group: "componentconfig", Version: "v1alpha1"}, - } + // envRequestedVersions represents the versions requested via the + // KUBE_API_VERSIONS environment variable. The install package of each group + // checks this list before add their versions to the latest package and + // Scheme. + envRequestedVersions = map[unversioned.GroupVersion]struct{}{} +) - // Env var KUBE_API_VERSIONS is a comma separated list of API versions that should be registered in the scheme. - // The versions should be in the order of most preferred to the least. - userRequestedVersions := os.Getenv("KUBE_API_VERSIONS") - if len(userRequestedVersions) != 0 { - // reset the supported versions - supportedVersions = []unversioned.GroupVersion{} - for _, version := range strings.Split(userRequestedVersions, ",") { +func init() { + // Env var KUBE_API_VERSIONS is a comma separated list of API versions that + // should be registered in the scheme. + kubeAPIVersions := os.Getenv("KUBE_API_VERSIONS") + if len(kubeAPIVersions) != 0 { + for _, version := range strings.Split(kubeAPIVersions, ",") { gv, err := unversioned.ParseGroupVersion(version) if err != nil { - glog.Fatalf("invalid api version: %s in KUBE_API_VERSIONS: %s. List of valid API versions: %v", - version, os.Getenv("KUBE_API_VERSIONS"), validGroupVersions) + glog.Fatalf("invalid api version: %s in KUBE_API_VERSIONS: %s.", + version, os.Getenv("KUBE_API_VERSIONS")) } + envRequestedVersions[gv] = struct{}{} + } + } +} - // Verify that the version is valid. - valid, ok := validGroupVersions[gv] - if !ok || !valid { - // Not a valid API version. - glog.Fatalf("invalid api version: %s in KUBE_API_VERSIONS: %s. List of valid API versions: %v", - version, os.Getenv("KUBE_API_VERSIONS"), validGroupVersions) - } +// RegisterVersions add the versions the registeredVersions. +func RegisterVersions(versions ...unversioned.GroupVersion) { + for _, v := range versions { + registeredVersions[v] = struct{}{} + } +} - supportedVersions = append(supportedVersions, gv) +// EnableVersions add the versions to the enabledVersions. The caller of this +// function is responsible to add the version to 'latest' and 'Scheme'. +func EnableVersions(versions ...unversioned.GroupVersion) error { + var unregisteredVersions []unversioned.GroupVersion + for _, v := range versions { + if _, found := registeredVersions[v]; !found { + unregisteredVersions = append(unregisteredVersions, v) } + enabledVersions[v] = struct{}{} + } + if len(unregisteredVersions) != 0 { + return fmt.Errorf("Please register versions before enabling them: %v", unregisteredVersions) + } + return nil +} + +// IsAllowedVersion returns if the version is allowed by the KUBE_API_VERSIONS +// environment variable. If the environment variable is empty, then it always +// returns true. +func IsAllowedVersion(v unversioned.GroupVersion) bool { + if len(envRequestedVersions) == 0 { + return true } + _, found := envRequestedVersions[v] + return found +} + +// IsEnabledVersion returns if a version is enabled. +func IsEnabledVersion(v unversioned.GroupVersion) bool { + _, found := enabledVersions[v] + return found +} + +// IsRegisteredVersion returns if a version is registered. +func IsRegisteredVersion(v unversioned.GroupVersion) bool { + _, found := registeredVersions[v] + return found +} - RegisteredGroupVersions = supportedVersions +// EnabledVersions returns all enabled versions. +func EnabledVersions() (ret []unversioned.GroupVersion) { + for v := range enabledVersions { + ret = append(ret, v) + } + return } -// Returns true if the given api version is one of the registered api versions. -func IsRegisteredAPIGroupVersion(gv unversioned.GroupVersion) bool { - for _, currGV := range RegisteredGroupVersions { - if currGV == gv { - return true +// RegisteredVersions returns all registered versions. +func RegisteredVersions() (ret []unversioned.GroupVersion) { + for v := range registeredVersions { + ret = append(ret, v) + } + return +} + +// EnabledVersionsForGroup returns all enabled versions for a group. +func EnabledVersionsForGroup(group string) (ret []unversioned.GroupVersion) { + for v := range enabledVersions { + if v.Group == group { + ret = append(ret, v) } } - return false + return } -// GroupVersionsForGroup returns the registered versions of a group in the form -// of "group/version". -func GroupVersionsForGroup(group string) []unversioned.GroupVersion { - ret := []unversioned.GroupVersion{} - for _, v := range RegisteredGroupVersions { +// RegisteredVersionsForGroup returns all registered versions for a group. +func RegisteredVersionsForGroup(group string) (ret []unversioned.GroupVersion) { + for v := range registeredVersions { if v.Group == group { ret = append(ret, v) } } - return ret + return +} + +// ValidateEnvRequestedVersions returns a list of versions that are requested in +// the KUBE_API_VERSIONS environment variable, but not enabled. +func ValidateEnvRequestedVersions() []unversioned.GroupVersion { + var missingVersions []unversioned.GroupVersion + for v := range envRequestedVersions { + if _, found := enabledVersions[v]; !found { + missingVersions = append(missingVersions, v) + } + } + return missingVersions } diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index 6e31eeff6c23..90db9d44645e 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -25,8 +25,8 @@ import ( docker "github.com/fsouza/go-dockerclient" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/resource" + "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/fields" @@ -311,7 +311,10 @@ func FuzzerFor(t *testing.T, version string, src rand.Source) *fuzz.Fuzzer { ev.ValueFrom = &api.EnvVarSource{} ev.ValueFrom.FieldRef = &api.ObjectFieldSelector{} - versions := registered.RegisteredGroupVersions + var versions []unversioned.GroupVersion + for _, testGroup := range testapi.Groups { + versions = append(versions, *testGroup.GroupVersion()) + } ev.ValueFrom.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))].String() ev.ValueFrom.FieldRef.FieldPath = c.RandString() diff --git a/pkg/api/v1/register.go b/pkg/api/v1/register.go index 695519c909cd..f238aa0d94d0 100644 --- a/pkg/api/v1/register.go +++ b/pkg/api/v1/register.go @@ -18,7 +18,6 @@ package v1 import ( "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" ) @@ -32,13 +31,8 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 // Codec encodes internal objects to the v1 scheme var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func init() { - // Check if v1 is in the list of supported API versions. - if !registered.IsRegisteredAPIGroupVersion(SchemeGroupVersion) { - return - } - - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() addConversionFuncs() addDefaultingFuncs() diff --git a/pkg/apis/componentconfig/install/install.go b/pkg/apis/componentconfig/install/install.go index 25b3c808bf72..f0163550f796 100644 --- a/pkg/apis/componentconfig/install/install.go +++ b/pkg/apis/componentconfig/install/install.go @@ -42,20 +42,32 @@ var accessor = meta.NewAccessor() var availableVersions = []unversioned.GroupVersion{v1alpha1.SchemeGroupVersion} func init() { + registered.RegisterVersions(availableVersions...) + externalVersions := []unversioned.GroupVersion{} - for _, allowedVersion := range registered.GroupVersionsForGroup(componentconfig.GroupName) { - for _, externalVersion := range availableVersions { - if externalVersion == allowedVersion { - externalVersions = append(externalVersions, externalVersion) - } + for _, v := range availableVersions { + if registered.IsAllowedVersion(v) { + externalVersions = append(externalVersions, v) } } - if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", componentconfig.GroupName) return } + if err := registered.EnableVersions(externalVersions...); err != nil { + glog.V(4).Infof("%v", err) + return + } + if err := enableVersions(externalVersions); err != nil { + glog.V(4).Infof("%v", err) + return + } +} +// TODO: enableVersions should be centralized rather than spread in each API +// group. +func enableVersions(externalVersions []unversioned.GroupVersion) error { + addVersionsToScheme(externalVersions...) preferredExternalVersion := externalVersions[0] groupMeta := latest.GroupMeta{ @@ -68,11 +80,10 @@ func init() { } if err := latest.RegisterGroup(groupMeta); err != nil { - glog.V(4).Infof("%v", err) - return + return err } - api.RegisterRESTMapper(groupMeta.RESTMapper) + return nil } func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper { @@ -105,3 +116,19 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } } + +func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { + // add the internal version to Scheme + componentconfig.AddToScheme() + // add the enabled external versions to Scheme + for _, v := range externalVersions { + if !registered.IsEnabledVersion(v) { + glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v) + continue + } + switch v { + case v1alpha1.SchemeGroupVersion: + v1alpha1.AddToScheme() + } + } +} diff --git a/pkg/apis/componentconfig/register.go b/pkg/apis/componentconfig/register.go index ec012ee3b7a8..cf4467ce56ca 100644 --- a/pkg/apis/componentconfig/register.go +++ b/pkg/apis/componentconfig/register.go @@ -21,7 +21,7 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" ) -func init() { +func AddToScheme() { addKnownTypes() } diff --git a/pkg/apis/componentconfig/v1alpha1/register.go b/pkg/apis/componentconfig/v1alpha1/register.go index 937e5acfeb8b..449c3281bfcb 100644 --- a/pkg/apis/componentconfig/v1alpha1/register.go +++ b/pkg/apis/componentconfig/v1alpha1/register.go @@ -30,7 +30,7 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func init() { +func AddToScheme() { addKnownTypes() addDefaultingFuncs() } diff --git a/pkg/apis/extensions/install/install.go b/pkg/apis/extensions/install/install.go index 11257c848d58..d6f1ef4b0e2b 100644 --- a/pkg/apis/extensions/install/install.go +++ b/pkg/apis/extensions/install/install.go @@ -42,20 +42,32 @@ var accessor = meta.NewAccessor() var availableVersions = []unversioned.GroupVersion{v1beta1.SchemeGroupVersion} func init() { + registered.RegisterVersions(availableVersions...) + externalVersions := []unversioned.GroupVersion{} - for _, allowedVersion := range registered.GroupVersionsForGroup(extensions.GroupName) { - for _, externalVersion := range availableVersions { - if externalVersion == allowedVersion { - externalVersions = append(externalVersions, externalVersion) - } + for _, v := range availableVersions { + if registered.IsAllowedVersion(v) { + externalVersions = append(externalVersions, v) } } - if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", extensions.GroupName) return } + if err := registered.EnableVersions(externalVersions...); err != nil { + glog.V(4).Infof("%v", err) + return + } + if err := enableVersions(externalVersions); err != nil { + glog.V(4).Infof("%v", err) + return + } +} +// TODO: enableVersions should be centralized rather than spread in each API +// group. +func enableVersions(externalVersions []unversioned.GroupVersion) error { + addVersionsToScheme(externalVersions...) preferredExternalVersion := externalVersions[0] groupMeta := latest.GroupMeta{ @@ -68,11 +80,10 @@ func init() { } if err := latest.RegisterGroup(groupMeta); err != nil { - glog.V(4).Infof("%v", err) - return + return err } - api.RegisterRESTMapper(groupMeta.RESTMapper) + return nil } func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper { @@ -105,3 +116,19 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } } + +func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { + // add the internal version to Scheme + extensions.AddToScheme() + // add the enabled external versions to Scheme + for _, v := range externalVersions { + if !registered.IsEnabledVersion(v) { + glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v) + continue + } + switch v { + case v1beta1.SchemeGroupVersion: + v1beta1.AddToScheme() + } + } +} diff --git a/pkg/apis/extensions/register.go b/pkg/apis/extensions/register.go index abd175d61697..f4cd7573be63 100644 --- a/pkg/apis/extensions/register.go +++ b/pkg/apis/extensions/register.go @@ -37,8 +37,8 @@ func Resource(resource string) unversioned.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } -func init() { - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() } diff --git a/pkg/apis/extensions/v1beta1/defaults_test.go b/pkg/apis/extensions/v1beta1/defaults_test.go index 60f2cb1cc170..89e07cf8f1eb 100644 --- a/pkg/apis/extensions/v1beta1/defaults_test.go +++ b/pkg/apis/extensions/v1beta1/defaults_test.go @@ -14,14 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1beta1 +package v1beta1_test import ( "reflect" "testing" "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/v1" + _ "k8s.io/kubernetes/pkg/apis/extensions/install" + . "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/intstr" ) diff --git a/pkg/apis/extensions/v1beta1/register.go b/pkg/apis/extensions/v1beta1/register.go index 65230ca816e4..178546bb5237 100644 --- a/pkg/apis/extensions/v1beta1/register.go +++ b/pkg/apis/extensions/v1beta1/register.go @@ -31,7 +31,7 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func init() { +func AddToScheme() { addKnownTypes() addDefaultingFuncs() addConversionFuncs() diff --git a/pkg/apis/metrics/install/install.go b/pkg/apis/metrics/install/install.go index 95acc9d1c589..0fa5e86af4cf 100644 --- a/pkg/apis/metrics/install/install.go +++ b/pkg/apis/metrics/install/install.go @@ -42,20 +42,32 @@ var accessor = meta.NewAccessor() var availableVersions = []unversioned.GroupVersion{v1alpha1.SchemeGroupVersion} func init() { + registered.RegisterVersions(availableVersions...) + externalVersions := []unversioned.GroupVersion{} - for _, allowedVersion := range registered.GroupVersionsForGroup(metrics.GroupName) { - for _, externalVersion := range availableVersions { - if externalVersion == allowedVersion { - externalVersions = append(externalVersions, externalVersion) - } + for _, v := range availableVersions { + if registered.IsAllowedVersion(v) { + externalVersions = append(externalVersions, v) } } - if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", metrics.GroupName) return } + if err := registered.EnableVersions(externalVersions...); err != nil { + glog.V(4).Infof("%v", err) + return + } + if err := enableVersions(externalVersions); err != nil { + glog.V(4).Infof("%v", err) + return + } +} +// TODO: enableVersions should be centralized rather than spread in each API +// group. +func enableVersions(externalVersions []unversioned.GroupVersion) error { + addVersionsToScheme(externalVersions...) preferredExternalVersion := externalVersions[0] groupMeta := latest.GroupMeta{ @@ -68,11 +80,10 @@ func init() { } if err := latest.RegisterGroup(groupMeta); err != nil { - glog.V(4).Infof("%v", err) - return + return err } - api.RegisterRESTMapper(groupMeta.RESTMapper) + return nil } func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper { @@ -105,3 +116,19 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } } + +func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { + // add the internal version to Scheme + metrics.AddToScheme() + // add the enabled external versions to Scheme + for _, v := range externalVersions { + if !registered.IsEnabledVersion(v) { + glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v) + continue + } + switch v { + case v1alpha1.SchemeGroupVersion: + v1alpha1.AddToScheme() + } + } +} diff --git a/pkg/apis/metrics/register.go b/pkg/apis/metrics/register.go index b59ef1f13de9..5639768c73c8 100644 --- a/pkg/apis/metrics/register.go +++ b/pkg/apis/metrics/register.go @@ -21,8 +21,8 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" ) -func init() { - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() } diff --git a/pkg/apis/metrics/v1alpha1/register.go b/pkg/apis/metrics/v1alpha1/register.go index 4d7eb457ec1e..7f4c4b7549d3 100644 --- a/pkg/apis/metrics/v1alpha1/register.go +++ b/pkg/apis/metrics/v1alpha1/register.go @@ -31,8 +31,8 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func init() { - // Register the API. +func AddToScheme() { + // Add the API to Scheme. addKnownTypes() } diff --git a/pkg/client/unversioned/import_known_versions.go b/pkg/client/unversioned/import_known_versions.go index 71b83a77862d..de3eea015351 100644 --- a/pkg/client/unversioned/import_known_versions.go +++ b/pkg/client/unversioned/import_known_versions.go @@ -18,8 +18,17 @@ package unversioned // These imports are the API groups the client will support. import ( + "fmt" + _ "k8s.io/kubernetes/pkg/api/install" + "k8s.io/kubernetes/pkg/api/registered" _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" _ "k8s.io/kubernetes/pkg/apis/extensions/install" _ "k8s.io/kubernetes/pkg/apis/metrics/install" ) + +func init() { + if missingVersions := registered.ValidateEnvRequestedVersions(); len(missingVersions) != 0 { + panic(fmt.Sprintf("KUBE_API_VERSIONS contains versions that are not installed: %q.", missingVersions)) + } +} diff --git a/pkg/client/unversioned/testclient/testclient.go b/pkg/client/unversioned/testclient/testclient.go index c7d817eaf452..faf5dac19a3e 100644 --- a/pkg/client/unversioned/testclient/testclient.go +++ b/pkg/client/unversioned/testclient/testclient.go @@ -296,7 +296,7 @@ func (c *Fake) ServerAPIVersions() (*unversioned.APIVersions, error) { c.Invokes(action, nil) gvStrings := []string{} - for _, gv := range registered.RegisteredGroupVersions { + for _, gv := range registered.EnabledVersions() { gvStrings = append(gvStrings, gv.String()) } return &unversioned.APIVersions{Versions: gvStrings}, nil diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index 3f8bd962bc98..224142ff2f6e 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -99,7 +99,7 @@ func (o *ConvertOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra. if err != nil { return err } - if !registered.IsRegisteredAPIGroupVersion(o.outputVersion) { + if !registered.IsEnabledVersion(o.outputVersion) { cmdutil.UsageError(cmd, "'%s' is not a registered version.", o.outputVersion) } diff --git a/pkg/kubectl/cmd/util/clientcache.go b/pkg/kubectl/cmd/util/clientcache.go index e1e690ca3dd7..87cda13e2d21 100644 --- a/pkg/kubectl/cmd/util/clientcache.go +++ b/pkg/kubectl/cmd/util/clientcache.go @@ -72,7 +72,7 @@ func (c *ClientCache) ClientConfigForVersion(version *unversioned.GroupVersion) preferredGV = &versionCopy } - negotiatedVersion, err := client.NegotiateVersion(c.defaultClient, &config, preferredGV, registered.RegisteredGroupVersions) + negotiatedVersion, err := client.NegotiateVersion(c.defaultClient, &config, preferredGV, registered.EnabledVersions()) if err != nil { return nil, err } diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 16cd43d2e9b1..333b72a75da4 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -531,8 +531,8 @@ func (c *clientSwaggerSchema) ValidateBytes(data []byte) error { if err != nil { return err } - if ok := registered.IsRegisteredAPIGroupVersion(gvk.GroupVersion()); !ok { - return fmt.Errorf("API version %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), registered.RegisteredGroupVersions) + if ok := registered.IsEnabledVersion(gvk.GroupVersion()); !ok { + return fmt.Errorf("API version %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), registered.EnabledVersions()) } if gvk.Group == extensions.GroupName { if c.c.ExtensionsClient == nil { diff --git a/pkg/kubectl/resource/mapper.go b/pkg/kubectl/resource/mapper.go index 27607f72e33b..0ed5b619f1fe 100644 --- a/pkg/kubectl/resource/mapper.go +++ b/pkg/kubectl/resource/mapper.go @@ -48,8 +48,8 @@ func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { if err != nil { return nil, fmt.Errorf("unable to get type info from %q: %v", source, err) } - if ok := registered.IsRegisteredAPIGroupVersion(gvk.GroupVersion()); !ok { - return nil, fmt.Errorf("API version %q in %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), source, registered.RegisteredGroupVersions) + if ok := registered.IsEnabledVersion(gvk.GroupVersion()); !ok { + return nil, fmt.Errorf("API version %q in %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), source, registered.EnabledVersions()) } if gvk.Kind == "" { return nil, fmt.Errorf("kind not set in %q", source) diff --git a/pkg/kubelet/config/common_test.go b/pkg/kubelet/config/common_test.go index 93563f1e42c3..2d38a7aff609 100644 --- a/pkg/kubelet/config/common_test.go +++ b/pkg/kubelet/config/common_test.go @@ -71,7 +71,7 @@ func TestDecodeSinglePod(t *testing.T) { t.Errorf("expected:\n%#v\ngot:\n%#v\n%s", pod, podOut, string(json)) } - for _, gv := range registered.GroupVersionsForGroup("") { + for _, gv := range registered.EnabledVersionsForGroup(api.GroupName) { externalPod, err := testapi.Default.Converter().ConvertToVersion(pod, gv.String()) if err != nil { t.Errorf("unexpected error: %v", err) @@ -137,7 +137,7 @@ func TestDecodePodList(t *testing.T) { t.Errorf("expected:\n%#v\ngot:\n%#v\n%s", podList, &podListOut, string(json)) } - for _, gv := range registered.GroupVersionsForGroup("") { + for _, gv := range registered.EnabledVersionsForGroup(api.GroupName) { externalPodList, err := testapi.Default.Converter().ConvertToVersion(podList, gv.String()) if err != nil { t.Errorf("unexpected error: %v", err) diff --git a/pkg/master/import_known_versions.go b/pkg/master/import_known_versions.go index 148dc4052611..f11e24730824 100644 --- a/pkg/master/import_known_versions.go +++ b/pkg/master/import_known_versions.go @@ -18,7 +18,16 @@ package master // These imports are the API groups the API server will support. import ( + "fmt" + _ "k8s.io/kubernetes/pkg/api/install" + "k8s.io/kubernetes/pkg/api/registered" _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" _ "k8s.io/kubernetes/pkg/apis/extensions/install" ) + +func init() { + if missingVersions := registered.ValidateEnvRequestedVersions(); len(missingVersions) != 0 { + panic(fmt.Sprintf("KUBE_API_VERSIONS contains versions that are not installed: %q.", missingVersions)) + } +} From ad484c79f7accd94a4f4877e175d7a7c5dad33e0 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 23 Dec 2015 22:55:06 -0800 Subject: [PATCH 2/2] pass runtime.Scheme as parameter to AddToScheme --- .../testdata/apis/testgroup/install/install.go | 4 ++-- .../testdata/apis/testgroup/register.go | 11 ++++++----- .../testdata/apis/testgroup/v1/register.go | 10 +++++----- pkg/api/install/install.go | 4 ++-- pkg/api/register.go | 18 +++++++++--------- pkg/api/v1/conversion.go | 5 +++-- pkg/api/v1/defaults.go | 6 +++--- pkg/api/v1/register.go | 14 +++++++------- pkg/apis/componentconfig/install/install.go | 4 ++-- pkg/apis/componentconfig/register.go | 10 +++++----- pkg/apis/componentconfig/v1alpha1/defaults.go | 6 +++--- pkg/apis/componentconfig/v1alpha1/register.go | 10 +++++----- pkg/apis/extensions/install/install.go | 4 ++-- pkg/apis/extensions/register.go | 9 +++++---- pkg/apis/extensions/v1beta1/conversion.go | 5 +++-- pkg/apis/extensions/v1beta1/defaults.go | 6 +++--- pkg/apis/extensions/v1beta1/register.go | 12 ++++++------ pkg/apis/metrics/install/install.go | 4 ++-- pkg/apis/metrics/register.go | 10 +++++----- pkg/apis/metrics/v1alpha1/register.go | 8 ++++---- 20 files changed, 82 insertions(+), 78 deletions(-) diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go index 19f17e3fdca7..8ce6da33f86f 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go @@ -97,12 +97,12 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme - testgroup.AddToScheme() + testgroup.AddToScheme(api.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { switch v { case v1.SchemeGroupVersion: - v1.AddToScheme() + v1.AddToScheme(api.Scheme) } } } diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go index ccdc6dba5e02..ec99f0cfe451 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go @@ -19,23 +19,24 @@ package testgroup import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" ) var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: ""} -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() + addKnownTypes(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &TestType{}, &TestTypeList{}, ) - api.Scheme.AddKnownTypes(SchemeGroupVersion, + scheme.AddKnownTypes(SchemeGroupVersion, &api.ListOptions{}) } diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go index fd578fbb6918..9f6e96ae0a78 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go @@ -27,19 +27,19 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: " var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() + addKnownTypes(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &TestType{}, &TestTypeList{}, ) - api.Scheme.AddKnownTypes(SchemeGroupVersion, + scheme.AddKnownTypes(SchemeGroupVersion, &v1.ListOptions{}) } diff --git a/pkg/api/install/install.go b/pkg/api/install/install.go index cebaccd757de..d52224916fb1 100644 --- a/pkg/api/install/install.go +++ b/pkg/api/install/install.go @@ -142,7 +142,7 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme - api.AddToScheme() + api.AddToScheme(api.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { if !registered.IsEnabledVersion(v) { @@ -151,7 +151,7 @@ func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { } switch v { case v1.SchemeGroupVersion: - v1.AddToScheme() + v1.AddToScheme(api.Scheme) } } } diff --git a/pkg/api/register.go b/pkg/api/register.go index e80421c7060b..c1e9e9157aa3 100644 --- a/pkg/api/register.go +++ b/pkg/api/register.go @@ -41,8 +41,8 @@ func Resource(resource string) unversioned.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } -func AddToScheme() { - Scheme.AddKnownTypes(SchemeGroupVersion, +func AddToScheme(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &Pod{}, &PodList{}, &PodStatusResult{}, @@ -86,14 +86,14 @@ func AddToScheme() { &RangeAllocation{}, ) - // Add the Unversioned types to Scheme. + // Add the Unversioned types to scheme. // TODO this should not be done here - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.ExportOptions{}) - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIVersions{}) - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroupList{}) - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroup{}) - Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIResourceList{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.ExportOptions{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIVersions{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroupList{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroup{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIResourceList{}) } func (obj *Pod) GetObjectMeta() meta.Object { return &obj.ObjectMeta } diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index c480cbca3785..3ec145240dfc 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -22,6 +22,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/conversion" + "k8s.io/kubernetes/pkg/runtime" ) const ( @@ -32,9 +33,9 @@ const ( mirrorAnnotationValue_1_0 = "mirror" ) -func addConversionFuncs() { +func addConversionFuncs(scheme *runtime.Scheme) { // Add non-generated conversion functions - err := api.Scheme.AddConversionFuncs( + err := scheme.AddConversionFuncs( convert_api_Pod_To_v1_Pod, convert_api_PodSpec_To_v1_PodSpec, convert_api_ReplicationControllerSpec_To_v1_ReplicationControllerSpec, diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index 4359a70defb1..aadad513a66a 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -17,14 +17,14 @@ limitations under the License. package v1 import ( - "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/parsers" ) -func addDefaultingFuncs() { - api.Scheme.AddDefaultingFuncs( +func addDefaultingFuncs(scheme *runtime.Scheme) { + scheme.AddDefaultingFuncs( func(obj *PodExecOptions) { obj.Stdout = true obj.Stderr = true diff --git a/pkg/api/v1/register.go b/pkg/api/v1/register.go index f238aa0d94d0..14b2e5adfe22 100644 --- a/pkg/api/v1/register.go +++ b/pkg/api/v1/register.go @@ -31,16 +31,16 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 // Codec encodes internal objects to the v1 scheme var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() - addConversionFuncs() - addDefaultingFuncs() + addKnownTypes(scheme) + addConversionFuncs(scheme) + addDefaultingFuncs(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &Pod{}, &PodList{}, &PodStatusResult{}, @@ -86,7 +86,7 @@ func addKnownTypes() { ) // Add common types - api.Scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) + scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) } func (obj *Pod) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } diff --git a/pkg/apis/componentconfig/install/install.go b/pkg/apis/componentconfig/install/install.go index f0163550f796..febc3eeec420 100644 --- a/pkg/apis/componentconfig/install/install.go +++ b/pkg/apis/componentconfig/install/install.go @@ -119,7 +119,7 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme - componentconfig.AddToScheme() + componentconfig.AddToScheme(api.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { if !registered.IsEnabledVersion(v) { @@ -128,7 +128,7 @@ func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { } switch v { case v1alpha1.SchemeGroupVersion: - v1alpha1.AddToScheme() + v1alpha1.AddToScheme(api.Scheme) } } } diff --git a/pkg/apis/componentconfig/register.go b/pkg/apis/componentconfig/register.go index cf4467ce56ca..ce29ed8baf40 100644 --- a/pkg/apis/componentconfig/register.go +++ b/pkg/apis/componentconfig/register.go @@ -17,12 +17,12 @@ limitations under the License. package componentconfig import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" ) -func AddToScheme() { - addKnownTypes() +func AddToScheme(scheme *runtime.Scheme) { + addKnownTypes(scheme) } // GroupName is the group name use in this package @@ -41,9 +41,9 @@ func Resource(resource string) unversioned.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } -func addKnownTypes() { +func addKnownTypes(scheme *runtime.Scheme) { // TODO this will get cleaned up with the scheme types are fixed - api.Scheme.AddKnownTypes(SchemeGroupVersion, + scheme.AddKnownTypes(SchemeGroupVersion, &KubeProxyConfiguration{}, ) } diff --git a/pkg/apis/componentconfig/v1alpha1/defaults.go b/pkg/apis/componentconfig/v1alpha1/defaults.go index 32938babe64a..2731771de153 100644 --- a/pkg/apis/componentconfig/v1alpha1/defaults.go +++ b/pkg/apis/componentconfig/v1alpha1/defaults.go @@ -17,12 +17,12 @@ limitations under the License. package v1alpha1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubelet/qos" + "k8s.io/kubernetes/pkg/runtime" ) -func addDefaultingFuncs() { - api.Scheme.AddDefaultingFuncs( +func addDefaultingFuncs(scheme *runtime.Scheme) { + scheme.AddDefaultingFuncs( func(obj *KubeProxyConfiguration) { if obj.BindAddress == "" { obj.BindAddress = "0.0.0.0" diff --git a/pkg/apis/componentconfig/v1alpha1/register.go b/pkg/apis/componentconfig/v1alpha1/register.go index 449c3281bfcb..aeec8975ab4b 100644 --- a/pkg/apis/componentconfig/v1alpha1/register.go +++ b/pkg/apis/componentconfig/v1alpha1/register.go @@ -30,13 +30,13 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func AddToScheme() { - addKnownTypes() - addDefaultingFuncs() +func AddToScheme(scheme *runtime.Scheme) { + addKnownTypes(scheme) + addDefaultingFuncs(scheme) } -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &KubeProxyConfiguration{}, ) } diff --git a/pkg/apis/extensions/install/install.go b/pkg/apis/extensions/install/install.go index d6f1ef4b0e2b..9b82a9962df5 100644 --- a/pkg/apis/extensions/install/install.go +++ b/pkg/apis/extensions/install/install.go @@ -119,7 +119,7 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme - extensions.AddToScheme() + extensions.AddToScheme(api.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { if !registered.IsEnabledVersion(v) { @@ -128,7 +128,7 @@ func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { } switch v { case v1beta1.SchemeGroupVersion: - v1beta1.AddToScheme() + v1beta1.AddToScheme(api.Scheme) } } } diff --git a/pkg/apis/extensions/register.go b/pkg/apis/extensions/register.go index f4cd7573be63..60038753bd8b 100644 --- a/pkg/apis/extensions/register.go +++ b/pkg/apis/extensions/register.go @@ -19,6 +19,7 @@ package extensions import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" ) // GroupName is the group name use in this package @@ -37,15 +38,15 @@ func Resource(resource string) unversioned.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() + addKnownTypes(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { +func addKnownTypes(scheme *runtime.Scheme) { // TODO this gets cleaned up when the types are fixed - api.Scheme.AddKnownTypes(SchemeGroupVersion, + scheme.AddKnownTypes(SchemeGroupVersion, &ClusterAutoscaler{}, &ClusterAutoscalerList{}, &Deployment{}, diff --git a/pkg/apis/extensions/v1beta1/conversion.go b/pkg/apis/extensions/v1beta1/conversion.go index 1d7da2a0b2c4..0f104ef2cdcd 100644 --- a/pkg/apis/extensions/v1beta1/conversion.go +++ b/pkg/apis/extensions/v1beta1/conversion.go @@ -23,12 +23,13 @@ import ( v1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/conversion" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/intstr" ) -func addConversionFuncs() { +func addConversionFuncs(scheme *runtime.Scheme) { // Add non-generated conversion functions - err := api.Scheme.AddConversionFuncs( + err := scheme.AddConversionFuncs( convert_api_PodSpec_To_v1_PodSpec, convert_v1_PodSpec_To_api_PodSpec, convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec, diff --git a/pkg/apis/extensions/v1beta1/defaults.go b/pkg/apis/extensions/v1beta1/defaults.go index 3344df1217bb..adb72f6a35b0 100644 --- a/pkg/apis/extensions/v1beta1/defaults.go +++ b/pkg/apis/extensions/v1beta1/defaults.go @@ -17,12 +17,12 @@ limitations under the License. package v1beta1 import ( - "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/intstr" ) -func addDefaultingFuncs() { - api.Scheme.AddDefaultingFuncs( +func addDefaultingFuncs(scheme *runtime.Scheme) { + scheme.AddDefaultingFuncs( func(obj *APIVersion) { if len(obj.APIGroup) == 0 { obj.APIGroup = GroupName diff --git a/pkg/apis/extensions/v1beta1/register.go b/pkg/apis/extensions/v1beta1/register.go index 178546bb5237..36cde91321f1 100644 --- a/pkg/apis/extensions/v1beta1/register.go +++ b/pkg/apis/extensions/v1beta1/register.go @@ -31,15 +31,15 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func AddToScheme() { - addKnownTypes() - addDefaultingFuncs() - addConversionFuncs() +func AddToScheme(scheme *runtime.Scheme) { + addKnownTypes(scheme) + addDefaultingFuncs(scheme) + addConversionFuncs(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &ClusterAutoscaler{}, &ClusterAutoscalerList{}, &Deployment{}, diff --git a/pkg/apis/metrics/install/install.go b/pkg/apis/metrics/install/install.go index 0fa5e86af4cf..c74d59260d52 100644 --- a/pkg/apis/metrics/install/install.go +++ b/pkg/apis/metrics/install/install.go @@ -119,7 +119,7 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme - metrics.AddToScheme() + metrics.AddToScheme(api.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { if !registered.IsEnabledVersion(v) { @@ -128,7 +128,7 @@ func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { } switch v { case v1alpha1.SchemeGroupVersion: - v1alpha1.AddToScheme() + v1alpha1.AddToScheme(api.Scheme) } } } diff --git a/pkg/apis/metrics/register.go b/pkg/apis/metrics/register.go index 5639768c73c8..99bcb529c14e 100644 --- a/pkg/apis/metrics/register.go +++ b/pkg/apis/metrics/register.go @@ -17,13 +17,13 @@ limitations under the License. package metrics import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" ) -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() + addKnownTypes(scheme) } // GroupName is the group name use in this package @@ -43,9 +43,9 @@ func Resource(resource string) unversioned.GroupResource { } // Adds the list of known types to api.Scheme. -func addKnownTypes() { +func addKnownTypes(scheme *runtime.Scheme) { // TODO this will get cleaned up with the scheme types are fixed - api.Scheme.AddKnownTypes(SchemeGroupVersion, + scheme.AddKnownTypes(SchemeGroupVersion, &RawNode{}, &RawPod{}, ) diff --git a/pkg/apis/metrics/v1alpha1/register.go b/pkg/apis/metrics/v1alpha1/register.go index 7f4c4b7549d3..1643f6e7e474 100644 --- a/pkg/apis/metrics/v1alpha1/register.go +++ b/pkg/apis/metrics/v1alpha1/register.go @@ -31,14 +31,14 @@ var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1 var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) -func AddToScheme() { +func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. - addKnownTypes() + addKnownTypes(scheme) } // Adds the list of known types to api.Scheme. -func addKnownTypes() { - api.Scheme.AddKnownTypes(SchemeGroupVersion, +func addKnownTypes(scheme *runtime.Scheme) { + scheme.AddKnownTypes(SchemeGroupVersion, &RawNode{}, &RawPod{}, &v1.DeleteOptions{},