From 9156981e731b5ea5676c4df065e0c716ac493ad7 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Thu, 16 Feb 2017 10:32:10 +0100 Subject: [PATCH] pkg/api/install: use apimachinery/announce+registered --- pkg/api/install/BUILD | 7 +- pkg/api/install/install.go | 157 ++++++++------------------------ pkg/api/install/install_test.go | 11 +++ 3 files changed, 51 insertions(+), 124 deletions(-) diff --git a/pkg/api/install/BUILD b/pkg/api/install/BUILD index 245f0bba4d3..398e2df27ac 100644 --- a/pkg/api/install/BUILD +++ b/pkg/api/install/BUILD @@ -15,11 +15,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", - "//vendor:github.com/golang/glog", - "//vendor:k8s.io/apimachinery/pkg/api/meta", - "//vendor:k8s.io/apimachinery/pkg/apimachinery", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", "//vendor:k8s.io/apimachinery/pkg/runtime", - "//vendor:k8s.io/apimachinery/pkg/runtime/schema", "//vendor:k8s.io/apimachinery/pkg/util/sets", ], ) @@ -31,6 +29,7 @@ go_test( tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/v1:go_default_library", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", diff --git a/pkg/api/install/install.go b/pkg/api/install/install.go index ed729a428db..53730940ae8 100644 --- a/pkg/api/install/install.go +++ b/pkg/api/install/install.go @@ -19,135 +19,52 @@ limitations under the License. package install import ( - "fmt" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apimachinery" + "k8s.io/apimachinery/pkg/apimachinery/announced" + "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" ) -const importPrefix = "k8s.io/kubernetes/pkg/api" - -var accessor = meta.NewAccessor() - -// availableVersions lists all known external versions for this group from most preferred to least preferred -var availableVersions = []schema.GroupVersion{v1.SchemeGroupVersion} - func init() { - api.Registry.RegisterVersions(availableVersions) - externalVersions := []schema.GroupVersion{} - for _, v := range availableVersions { - if api.Registry.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 := api.Registry.EnableVersions(externalVersions...); err != nil { - glog.V(4).Infof("%v", err) - return - } - if err := enableVersions(externalVersions); err != nil { - glog.V(4).Infof("%v", err) - return - } + Install(api.GroupFactoryRegistry, api.Registry, api.Scheme) } -// TODO: enableVersions should be centralized rather than spread in each API -// group. -// We can combine api.Registry.RegisterVersions, api.Registry.EnableVersions and -// api.Registry.RegisterGroup once we have moved enableVersions there. -func enableVersions(externalVersions []schema.GroupVersion) error { - addVersionsToScheme(externalVersions...) - preferredExternalVersion := externalVersions[0] - - groupMeta := apimachinery.GroupMeta{ - GroupVersion: preferredExternalVersion, - GroupVersions: externalVersions, - RESTMapper: newRESTMapper(externalVersions), - SelfLinker: runtime.SelfLinker(accessor), - InterfacesFor: interfacesFor, - } - - if err := api.Registry.RegisterGroup(groupMeta); err != nil { - return err - } - return nil -} - -func newRESTMapper(externalVersions []schema.GroupVersion) meta.RESTMapper { - // 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 - rootScoped := sets.NewString( - "Node", - "Namespace", - "PersistentVolume", - "ComponentStatus", - ) - - // these kinds should be excluded from the list of resources - ignoredKinds := sets.NewString( - "ListOptions", - "DeleteOptions", - "Status", - "PodLogOptions", - "PodExecOptions", - "PodAttachOptions", - "PodPortForwardOptions", - "PodProxyOptions", - "NodeProxyOptions", - "ServiceProxyOptions", - "ThirdPartyResource", - "ThirdPartyResourceData", - "ThirdPartyResourceList") - - mapper := meta.NewDefaultRESTMapperFromScheme(externalVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped, api.Scheme) - - return mapper -} - -// InterfacesFor returns the default Codec and ResourceVersioner for a given version -// string, or an error if the version is not known. -func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { - switch version { - case v1.SchemeGroupVersion: - return &meta.VersionInterfaces{ - ObjectConvertor: api.Scheme, - MetadataAccessor: accessor, - }, nil - default: - g, _ := api.Registry.Group(api.GroupName) - return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) - } -} - -func addVersionsToScheme(externalVersions ...schema.GroupVersion) { - // add the internal version to Scheme - if err := api.AddToScheme(api.Scheme); err != nil { - // Programmer error, detect immediately +// Install registers the API group and adds types to a scheme +func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { + if err := announced.NewGroupMetaFactory( + &announced.GroupMetaFactoryArgs{ + GroupName: api.GroupName, + VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version}, + ImportPrefix: "k8s.io/kubernetes/pkg/api", + AddInternalObjectsToScheme: api.AddToScheme, + RootScopedKinds: sets.NewString( + "Node", + "Namespace", + "PersistentVolume", + "ComponentStatus", + ), + IgnoredKinds: sets.NewString( + "ListOptions", + "DeleteOptions", + "Status", + "PodLogOptions", + "PodExecOptions", + "PodAttachOptions", + "PodPortForwardOptions", + "PodProxyOptions", + "NodeProxyOptions", + "ServiceProxyOptions", + "ThirdPartyResource", + "ThirdPartyResourceData", + "ThirdPartyResourceList", + ), + }, + announced.VersionToSchemeFunc{ + v1.SchemeGroupVersion.Version: v1.AddToScheme, + }, + ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { panic(err) } - // add the enabled external versions to Scheme - for _, v := range externalVersions { - if !api.Registry.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: - if err := v1.AddToScheme(api.Scheme); err != nil { - // Programmer error, detect immediately - panic(err) - } - } - } } diff --git a/pkg/api/install/install_test.go b/pkg/api/install/install_test.go index 9ede3ca1e5d..294c7482f4e 100644 --- a/pkg/api/install/install_test.go +++ b/pkg/api/install/install_test.go @@ -25,9 +25,20 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" internal "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/v1" ) func TestResourceVersioner(t *testing.T) { + g, err := internal.Registry.Group(v1.GroupName) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + intf, err := g.DefaultInterfacesFor(v1.SchemeGroupVersion) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + accessor := intf.MetadataAccessor + pod := internal.Pod{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "10"}} version, err := accessor.ResourceVersion(&pod) if err != nil {