From 12812438602aa92f1d3b6a0a81a18edae037a973 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 21 Aug 2018 12:49:57 -0700 Subject: [PATCH 1/5] Remove the --storage-versions flag from kube-apiserver. The storage version now is solely decided by the scheme.PrioritizedVersionsForGroup(). For cohabitating resources, the storage version will be that of the overriding group as returned by storageFactory.getStorageGroupResource(). --- cmd/kube-apiserver/app/options/options.go | 3 - .../app/options/options_test.go | 5 - cmd/kube-apiserver/app/server.go | 2 +- .../default_storage_factory_builder.go | 14 +- pkg/kubeapiserver/options/options.go | 2 + pkg/kubeapiserver/options/storage_versions.go | 124 ------------------ .../options/storage_versions_test.go | 73 ----------- 7 files changed, 5 insertions(+), 218 deletions(-) delete mode 100644 pkg/kubeapiserver/options/storage_versions.go delete mode 100644 pkg/kubeapiserver/options/storage_versions_test.go diff --git a/cmd/kube-apiserver/app/options/options.go b/cmd/kube-apiserver/app/options/options.go index 23146dd913..05eac5a759 100644 --- a/cmd/kube-apiserver/app/options/options.go +++ b/cmd/kube-apiserver/app/options/options.go @@ -47,7 +47,6 @@ type ServerRunOptions struct { Authentication *kubeoptions.BuiltInAuthenticationOptions Authorization *kubeoptions.BuiltInAuthorizationOptions CloudProvider *kubeoptions.CloudProviderOptions - StorageSerialization *kubeoptions.StorageSerializationOptions APIEnablement *genericoptions.APIEnablementOptions AllowPrivileged bool @@ -87,7 +86,6 @@ func NewServerRunOptions() *ServerRunOptions { Authentication: kubeoptions.NewBuiltInAuthenticationOptions().WithAll(), Authorization: kubeoptions.NewBuiltInAuthorizationOptions(), CloudProvider: kubeoptions.NewCloudProviderOptions(), - StorageSerialization: kubeoptions.NewStorageSerializationOptions(), APIEnablement: genericoptions.NewAPIEnablementOptions(), EnableLogsHandler: true, @@ -135,7 +133,6 @@ func (s *ServerRunOptions) Flags() (fss apiserverflag.NamedFlagSets) { s.Authentication.AddFlags(fss.FlagSet("authentication")) s.Authorization.AddFlags(fss.FlagSet("authorization")) s.CloudProvider.AddFlags(fss.FlagSet("cloud provider")) - s.StorageSerialization.AddFlags(fss.FlagSet("storage")) s.APIEnablement.AddFlags(fss.FlagSet("api enablement")) s.Admission.AddFlags(fss.FlagSet("admission")) diff --git a/cmd/kube-apiserver/app/options/options_test.go b/cmd/kube-apiserver/app/options/options_test.go index e4173130a3..a036202b5b 100644 --- a/cmd/kube-apiserver/app/options/options_test.go +++ b/cmd/kube-apiserver/app/options/options_test.go @@ -32,7 +32,6 @@ import ( auditdynamic "k8s.io/apiserver/plugin/pkg/audit/dynamic" audittruncate "k8s.io/apiserver/plugin/pkg/audit/truncate" restclient "k8s.io/client-go/rest" - "k8s.io/kubernetes/pkg/api/legacyscheme" kapi "k8s.io/kubernetes/pkg/apis/core" kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" @@ -287,10 +286,6 @@ func TestAddFlags(t *testing.T) { CloudConfigFile: "/cloud-config", CloudProvider: "azure", }, - StorageSerialization: &kubeoptions.StorageSerializationOptions{ - StorageVersions: kubeoptions.ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()), - DefaultStorageVersions: kubeoptions.ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()), - }, APIEnablement: &apiserveroptions.APIEnablementOptions{ RuntimeConfig: utilflag.ConfigurationMap{}, }, diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 50bf1fe889..499f6d1490 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -415,7 +415,7 @@ func buildGenericConfig( storageFactoryConfig := kubeapiserver.NewStorageFactoryConfig() storageFactoryConfig.ApiResourceConfig = genericConfig.MergedResourceConfig - completedStorageFactoryConfig, err := storageFactoryConfig.Complete(s.Etcd, s.StorageSerialization) + completedStorageFactoryConfig, err := storageFactoryConfig.Complete(s.Etcd) if err != nil { lastErr = err return diff --git a/pkg/kubeapiserver/default_storage_factory_builder.go b/pkg/kubeapiserver/default_storage_factory_builder.go index 3029924b75..1ad4ee800b 100644 --- a/pkg/kubeapiserver/default_storage_factory_builder.go +++ b/pkg/kubeapiserver/default_storage_factory_builder.go @@ -19,8 +19,6 @@ package kubeapiserver import ( "strings" - "fmt" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" serveroptions "k8s.io/apiserver/pkg/server/options" @@ -37,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/policy" apisstorage "k8s.io/kubernetes/pkg/apis/storage" - kubeapiserveroptions "k8s.io/kubernetes/pkg/kubeapiserver/options" ) // SpecialDefaultResourcePrefixes are prefixes compiled into Kubernetes. @@ -68,18 +65,12 @@ type StorageFactoryConfig struct { DefaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig DefaultStorageMediaType string Serializer runtime.StorageSerializer - StorageEncodingOverrides map[string]schema.GroupVersion ResourceEncodingOverrides []schema.GroupVersionResource EtcdServersOverrides []string EncryptionProviderConfigFilepath string } -func (c *StorageFactoryConfig) Complete(etcdOptions *serveroptions.EtcdOptions, serializationOptions *kubeapiserveroptions.StorageSerializationOptions) (*completedStorageFactoryConfig, error) { - storageGroupsToEncodingVersion, err := serializationOptions.StorageGroupsToEncodingVersion() - if err != nil { - return nil, fmt.Errorf("error generating storage version map: %s", err) - } - c.StorageEncodingOverrides = storageGroupsToEncodingVersion +func (c *StorageFactoryConfig) Complete(etcdOptions *serveroptions.EtcdOptions) (*completedStorageFactoryConfig, error) { c.StorageConfig = etcdOptions.StorageConfig c.DefaultStorageMediaType = etcdOptions.DefaultStorageMediaType c.EtcdServersOverrides = etcdOptions.EtcdServersOverrides @@ -92,8 +83,7 @@ type completedStorageFactoryConfig struct { } func (c *completedStorageFactoryConfig) New() (*serverstorage.DefaultStorageFactory, error) { - resourceEncodingConfig := resourceconfig.MergeGroupEncodingConfigs(c.DefaultResourceEncoding, c.StorageEncodingOverrides) - resourceEncodingConfig = resourceconfig.MergeResourceEncodingConfigs(resourceEncodingConfig, c.ResourceEncodingOverrides) + resourceEncodingConfig := resourceconfig.MergeResourceEncodingConfigs(c.DefaultResourceEncoding, c.ResourceEncodingOverrides) storageFactory := serverstorage.NewDefaultStorageFactory( c.StorageConfig, c.DefaultStorageMediaType, diff --git a/pkg/kubeapiserver/options/options.go b/pkg/kubeapiserver/options/options.go index f7e6eedaf7..e38bd99996 100644 --- a/pkg/kubeapiserver/options/options.go +++ b/pkg/kubeapiserver/options/options.go @@ -27,3 +27,5 @@ var DefaultServiceNodePortRange = utilnet.PortRange{Base: 30000, Size: 2768} // DefaultServiceIPCIDR is a CIDR notation of IP range from which to allocate service cluster IPs var DefaultServiceIPCIDR net.IPNet = net.IPNet{IP: net.ParseIP("10.0.0.0"), Mask: net.CIDRMask(24, 32)} + +const DefaultEtcdPathPrefix = "/registry" diff --git a/pkg/kubeapiserver/options/storage_versions.go b/pkg/kubeapiserver/options/storage_versions.go deleted file mode 100644 index 67950bb715..0000000000 --- a/pkg/kubeapiserver/options/storage_versions.go +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package options - -import ( - "sort" - "strings" - - "github.com/spf13/pflag" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/kubernetes/pkg/api/legacyscheme" -) - -const ( - DefaultEtcdPathPrefix = "/registry" -) - -// StorageSerializationOptions contains the options for encoding resources. -type StorageSerializationOptions struct { - StorageVersions string - // The default values for StorageVersions. StorageVersions overrides - // these; you can change this if you want to change the defaults (e.g., - // for testing). This is not actually exposed as a flag. - DefaultStorageVersions string -} - -func NewStorageSerializationOptions() *StorageSerializationOptions { - return &StorageSerializationOptions{ - DefaultStorageVersions: ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()), - StorageVersions: ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()), - } -} - -// StorageGroupsToEncodingVersion returns a map from group name to group version, -// computed from s.StorageVersions flag. -func (s *StorageSerializationOptions) StorageGroupsToEncodingVersion() (map[string]schema.GroupVersion, error) { - storageVersionMap := map[string]schema.GroupVersion{} - - // First, get the defaults. - if err := mergeGroupVersionIntoMap(s.DefaultStorageVersions, storageVersionMap); err != nil { - return nil, err - } - // Override any defaults with the user settings. - if err := mergeGroupVersionIntoMap(s.StorageVersions, storageVersionMap); err != nil { - return nil, err - } - - return storageVersionMap, nil -} - -// dest must be a map of group to groupVersion. -func mergeGroupVersionIntoMap(gvList string, dest map[string]schema.GroupVersion) error { - for _, gvString := range strings.Split(gvList, ",") { - if gvString == "" { - continue - } - // We accept two formats. "group/version" OR - // "group=group/version". The latter is used when types - // move between groups. - if !strings.Contains(gvString, "=") { - gv, err := schema.ParseGroupVersion(gvString) - if err != nil { - return err - } - dest[gv.Group] = gv - - } else { - parts := strings.SplitN(gvString, "=", 2) - gv, err := schema.ParseGroupVersion(parts[1]) - if err != nil { - return err - } - dest[parts[0]] = gv - } - } - - return nil -} - -// AddFlags adds flags for a specific APIServer to the specified FlagSet -func (s *StorageSerializationOptions) AddFlags(fs *pflag.FlagSet) { - // Note: the weird ""+ in below lines seems to be the only way to get gofmt to - // arrange these text blocks sensibly. Grrr. - fs.StringVar(&s.StorageVersions, "storage-versions", s.StorageVersions, ""+ - "The per-group version to store resources in. "+ - "Specified in the format \"group1/version1,group2/version2,...\". "+ - "In the case where objects are moved from one group to the other, "+ - "you may specify the format \"group1=group2/v1beta1,group3/v1beta1,...\". "+ - "You only need to pass the groups you wish to change from the defaults. "+ - "It defaults to a list of preferred versions of all known groups.") - - fs.MarkDeprecated("storage-versions", ""+ - "Please omit this flag to ensure the default storage versions are used ."+ - "Otherwise the cluster is not safe to upgrade to a version newer than 1.12. "+ - "This flag will be removed in 1.13.") - -} - -// ToPreferredVersionString returns the preferred versions of all registered -// groups in the form of "group1/version1,group2/version2,...". This is compatible -// with the flag format -func ToPreferredVersionString(versions []schema.GroupVersion) string { - var defaults []string - for _, version := range versions { - defaults = append(defaults, version.String()) - } - // sorting provides stable output for help. - sort.Strings(defaults) - return strings.Join(defaults, ",") -} diff --git a/pkg/kubeapiserver/options/storage_versions_test.go b/pkg/kubeapiserver/options/storage_versions_test.go deleted file mode 100644 index abbe211a80..0000000000 --- a/pkg/kubeapiserver/options/storage_versions_test.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package options - -import ( - "reflect" - "testing" - - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func TestGenerateStorageVersionMap(t *testing.T) { - testCases := []struct { - storageVersions string - defaultVersions string - expectedMap map[string]schema.GroupVersion - }{ - { - storageVersions: "v1,extensions/v1beta1", - expectedMap: map[string]schema.GroupVersion{ - "": {Version: "v1"}, - "extensions": {Group: "extensions", Version: "v1beta1"}, - }, - }, - { - storageVersions: "extensions/v1beta1,v1", - expectedMap: map[string]schema.GroupVersion{ - "": {Version: "v1"}, - "extensions": {Group: "extensions", Version: "v1beta1"}, - }, - }, - { - storageVersions: "autoscaling=extensions/v1beta1,v1", - defaultVersions: "extensions/v1beta1,v1,autoscaling/v1", - expectedMap: map[string]schema.GroupVersion{ - "": {Version: "v1"}, - "autoscaling": {Group: "extensions", Version: "v1beta1"}, - "extensions": {Group: "extensions", Version: "v1beta1"}, - }, - }, - { - storageVersions: "", - expectedMap: map[string]schema.GroupVersion{}, - }, - } - for i, test := range testCases { - s := &StorageSerializationOptions{ - StorageVersions: test.storageVersions, - DefaultStorageVersions: test.defaultVersions, - } - output, err := s.StorageGroupsToEncodingVersion() - if err != nil { - t.Errorf("%v: unexpected error: %v", i, err) - } - if !reflect.DeepEqual(test.expectedMap, output) { - t.Errorf("%v: unexpected error. expect: %v, got: %v", i, test.expectedMap, output) - } - } -} From 98a1003f57988ccc361af7aee5d0ae49de66dbb4 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 21 Aug 2018 17:45:14 -0700 Subject: [PATCH 2/5] Remove unnecessary group storage version defaults. The storage version is either decided by the schema's version priority, or by the per resource override. This fixes a bug where the "batch" group is encoded in v1beta1, which was hidden when --storage-versions is a valid flag. --- pkg/master/master_test.go | 20 -------------- .../pkg/server/resourceconfig/helpers.go | 12 --------- .../storage/resource_encoding_config.go | 26 +++++-------------- test/integration/framework/master_utils.go | 4 --- 4 files changed, 7 insertions(+), 55 deletions(-) diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 5ee2fa4f83..63c9a9ea19 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -31,8 +31,6 @@ import ( certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/version" @@ -46,14 +44,7 @@ import ( restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/apis/autoscaling" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/certificates" api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/apis/rbac" - "k8s.io/kubernetes/pkg/apis/storage" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/master/reconcilers" certificatesrest "k8s.io/kubernetes/pkg/registry/certificates/rest" @@ -79,17 +70,6 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion } resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Scheme) - resourceEncoding.SetVersionEncoding(api.GroupName, schema.GroupVersion{Group: "", Version: "v1"}, schema.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetVersionEncoding(autoscaling.GroupName, schema.GroupVersion{Group: "autoscaling", Version: "v1"}, schema.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetVersionEncoding(batch.GroupName, schema.GroupVersion{Group: "batch", Version: "v1"}, schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) - // FIXME (soltysh): this GroupVersionResource override should be configurable - resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: "batch", Resource: "cronjobs"}, schema.GroupVersion{Group: batch.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: "storage.k8s.io", Resource: "volumeattachments"}, schema.GroupVersion{Group: storage.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: storage.GroupName, Version: runtime.APIVersionInternal}) - - resourceEncoding.SetVersionEncoding(apps.GroupName, schema.GroupVersion{Group: "apps", Version: "v1"}, schema.GroupVersion{Group: apps.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetVersionEncoding(extensions.GroupName, schema.GroupVersion{Group: "extensions", Version: "v1beta1"}, schema.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetVersionEncoding(rbac.GroupName, schema.GroupVersion{Group: "rbac.authorization.k8s.io", Version: "v1"}, schema.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal}) - resourceEncoding.SetVersionEncoding(certificates.GroupName, schema.GroupVersion{Group: "certificates.k8s.io", Version: "v1beta1"}, schema.GroupVersion{Group: certificates.GroupName, Version: runtime.APIVersionInternal}) storageFactory := serverstorage.NewDefaultStorageFactory(*storageConfig, testapi.StorageMediaType(), legacyscheme.Codecs, resourceEncoding, DefaultAPIResourceConfigSource(), nil) etcdOptions := options.NewEtcdOptions(storageConfig) diff --git a/staging/src/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go b/staging/src/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go index ad0d5f5784..fa5fcc7686 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go +++ b/staging/src/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go @@ -51,18 +51,6 @@ func MergeResourceEncodingConfigs( return resourceEncodingConfig } -// MergeGroupEncodingConfigs merges the given defaultResourceConfig with specific GroupVersion overrides. -func MergeGroupEncodingConfigs( - defaultResourceEncoding *serverstore.DefaultResourceEncodingConfig, - storageEncodingOverrides map[string]schema.GroupVersion, -) *serverstore.DefaultResourceEncodingConfig { - resourceEncodingConfig := defaultResourceEncoding - for group, storageEncodingVersion := range storageEncodingOverrides { - resourceEncodingConfig.SetVersionEncoding(group, storageEncodingVersion, schema.GroupVersion{Group: group, Version: runtime.APIVersionInternal}) - } - return resourceEncodingConfig -} - // MergeAPIResourceConfigs merges the given defaultAPIResourceConfig with the given resourceConfigOverrides. // Exclude the groups not registered in registry, and check if version is // not registered in group, then it will fail. diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go index eff1fe8a41..cdfdac65e8 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go @@ -39,10 +39,7 @@ type DefaultResourceEncodingConfig struct { } type GroupResourceEncodingConfig struct { - DefaultExternalEncoding schema.GroupVersion ExternalResourceEncodings map[string]schema.GroupVersion - - DefaultInternalEncoding schema.GroupVersion InternalResourceEncodings map[string]schema.GroupVersion } @@ -52,28 +49,18 @@ func NewDefaultResourceEncodingConfig(scheme *runtime.Scheme) *DefaultResourceEn return &DefaultResourceEncodingConfig{groups: map[string]*GroupResourceEncodingConfig{}, scheme: scheme} } -func newGroupResourceEncodingConfig(defaultEncoding, defaultInternalVersion schema.GroupVersion) *GroupResourceEncodingConfig { +func newGroupResourceEncodingConfig() *GroupResourceEncodingConfig { return &GroupResourceEncodingConfig{ - DefaultExternalEncoding: defaultEncoding, ExternalResourceEncodings: map[string]schema.GroupVersion{}, - DefaultInternalEncoding: defaultInternalVersion, InternalResourceEncodings: map[string]schema.GroupVersion{}, + ExternalResourceEncodings: map[string]schema.GroupVersion{}, + InternalResourceEncodings: map[string]schema.GroupVersion{}, } } -func (o *DefaultResourceEncodingConfig) SetVersionEncoding(group string, externalEncodingVersion, internalVersion schema.GroupVersion) { - _, groupExists := o.groups[group] - if !groupExists { - o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) - } - - o.groups[group].DefaultExternalEncoding = externalEncodingVersion - o.groups[group].DefaultInternalEncoding = internalVersion -} - func (o *DefaultResourceEncodingConfig) SetResourceEncoding(resourceBeingStored schema.GroupResource, externalEncodingVersion, internalVersion schema.GroupVersion) { group := resourceBeingStored.Group _, groupExists := o.groups[group] if !groupExists { - o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) + o.groups[group] = newGroupResourceEncodingConfig() } o.groups[group].ExternalResourceEncodings[resourceBeingStored.Resource] = externalEncodingVersion @@ -94,7 +81,8 @@ func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.Group resourceOverride, resourceExists := groupEncoding.ExternalResourceEncodings[resource.Resource] if !resourceExists { - return groupEncoding.DefaultExternalEncoding, nil + // return the most preferred external version for the group + return o.scheme.PrioritizedVersionsForGroup(resource.Group)[0], nil } return resourceOverride, nil @@ -112,7 +100,7 @@ func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource schema.Grou resourceOverride, resourceExists := groupEncoding.InternalResourceEncodings[resource.Resource] if !resourceExists { - return groupEncoding.DefaultInternalEncoding, nil + return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil } return resourceOverride, nil diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 95b7d3d837..e31659732e 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -56,7 +56,6 @@ import ( clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/apis/batch" policy "k8s.io/kubernetes/pkg/apis/policy/v1beta1" "k8s.io/kubernetes/pkg/generated/openapi" @@ -257,11 +256,8 @@ func NewMasterConfig() *master.Config { resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Scheme) // FIXME (soltysh): this GroupVersionResource override should be configurable - // we need to set both for the whole group and for cronjobs, separately - resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: batch.GroupName, Resource: "cronjobs"}, schema.GroupVersion{Group: batch.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) // we also need to set both for the storage group and for volumeattachments, separately - resourceEncoding.SetVersionEncoding(storage.GroupName, *testapi.Storage.GroupVersion(), schema.GroupVersion{Group: storage.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: storage.GroupName, Resource: "volumeattachments"}, schema.GroupVersion{Group: storage.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: storage.GroupName, Version: runtime.APIVersionInternal}) storageFactory := serverstorage.NewDefaultStorageFactory(etcdOptions.StorageConfig, runtime.ContentTypeJSON, ns, resourceEncoding, master.DefaultAPIResourceConfigSource(), nil) From bed7696876b19d332ddb6332904800f43394710b Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 21 Aug 2018 14:04:29 -0700 Subject: [PATCH 3/5] generated BUILD files --- cmd/kube-apiserver/app/options/BUILD | 1 - pkg/kubeapiserver/BUILD | 1 - pkg/kubeapiserver/options/BUILD | 5 ----- pkg/master/BUILD | 8 -------- test/integration/framework/BUILD | 1 - 5 files changed, 16 deletions(-) diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index a6d11a840e..d71d082e14 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -45,7 +45,6 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/kubeapiserver/options:go_default_library", "//pkg/kubelet/client:go_default_library", diff --git a/pkg/kubeapiserver/BUILD b/pkg/kubeapiserver/BUILD index 6c557cd9b4..4a9c0ea502 100644 --- a/pkg/kubeapiserver/BUILD +++ b/pkg/kubeapiserver/BUILD @@ -22,7 +22,6 @@ go_library( "//pkg/apis/networking:go_default_library", "//pkg/apis/policy:go_default_library", "//pkg/apis/storage:go_default_library", - "//pkg/kubeapiserver/options:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", diff --git a/pkg/kubeapiserver/options/BUILD b/pkg/kubeapiserver/options/BUILD index eda73f5cef..ae7c2ca42e 100644 --- a/pkg/kubeapiserver/options/BUILD +++ b/pkg/kubeapiserver/options/BUILD @@ -16,11 +16,9 @@ go_library( "options.go", "plugins.go", "serving.go", - "storage_versions.go", ], importpath = "k8s.io/kubernetes/pkg/kubeapiserver/options", deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/cloudprovider/providers:go_default_library", "//pkg/features:go_default_library", "//pkg/kubeapiserver/authenticator:go_default_library", @@ -54,7 +52,6 @@ go_library( "//plugin/pkg/admission/storage/storageclass/setdefault:go_default_library", "//plugin/pkg/admission/storage/storageobjectinuseprotection:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", @@ -92,13 +89,11 @@ go_test( "admission_test.go", "authentication_test.go", "authorization_test.go", - "storage_versions_test.go", ], embed = [":go_default_library"], deps = [ "//pkg/kubeapiserver/authenticator:go_default_library", "//pkg/kubeapiserver/authorizer/modes:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", diff --git a/pkg/master/BUILD b/pkg/master/BUILD index 413f120aed..bcf3667653 100644 --- a/pkg/master/BUILD +++ b/pkg/master/BUILD @@ -134,14 +134,7 @@ go_test( deps = [ "//pkg/api/legacyscheme:go_default_library", "//pkg/api/testapi:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/certificates:go_default_library", "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/storage:go_default_library", "//pkg/generated/openapi:go_default_library", "//pkg/kubelet/client:go_default_library", "//pkg/master/reconcilers:go_default_library", @@ -154,7 +147,6 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/naming:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", diff --git a/test/integration/framework/BUILD b/test/integration/framework/BUILD index 5c485081ad..19708a45d7 100644 --- a/test/integration/framework/BUILD +++ b/test/integration/framework/BUILD @@ -24,7 +24,6 @@ go_library( "//cmd/kube-apiserver/app/options:go_default_library", "//cmd/kubeadm/app/util/pkiutil:go_default_library", "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/testapi:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/apis/policy/v1beta1:go_default_library", "//pkg/generated/openapi:go_default_library", From a76c26669332233e3279bcb1cfb9c412622bed90 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 22 Aug 2018 14:00:39 -0700 Subject: [PATCH 4/5] don't run test-update-storage-objects.sh --- hack/jenkins/test-dockerized.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/hack/jenkins/test-dockerized.sh b/hack/jenkins/test-dockerized.sh index 6ef9728a75..b08c28a4d3 100755 --- a/hack/jenkins/test-dockerized.sh +++ b/hack/jenkins/test-dockerized.sh @@ -56,4 +56,3 @@ go install ./cmd/... make test-cmd make test-integration -./hack/test-update-storage-objects.sh From 4ea07084dddde5be97d5405696fae47bca4d4663 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Fri, 28 Sep 2018 16:07:31 -0700 Subject: [PATCH 5/5] Simplify the resource_encoding_config.go, since we don't need per group override at all --- .../storage/resource_encoding_config.go | 61 ++++++------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go index cdfdac65e8..efb22fbc8d 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go @@ -34,37 +34,27 @@ type ResourceEncodingConfig interface { } type DefaultResourceEncodingConfig struct { - groups map[string]*GroupResourceEncodingConfig - scheme *runtime.Scheme + // resources records the overriding encoding configs for individual resources. + resources map[schema.GroupResource]*OverridingResourceEncoding + scheme *runtime.Scheme } -type GroupResourceEncodingConfig struct { - ExternalResourceEncodings map[string]schema.GroupVersion - InternalResourceEncodings map[string]schema.GroupVersion +type OverridingResourceEncoding struct { + ExternalResourceEncoding schema.GroupVersion + InternalResourceEncoding schema.GroupVersion } var _ ResourceEncodingConfig = &DefaultResourceEncodingConfig{} func NewDefaultResourceEncodingConfig(scheme *runtime.Scheme) *DefaultResourceEncodingConfig { - return &DefaultResourceEncodingConfig{groups: map[string]*GroupResourceEncodingConfig{}, scheme: scheme} -} - -func newGroupResourceEncodingConfig() *GroupResourceEncodingConfig { - return &GroupResourceEncodingConfig{ - ExternalResourceEncodings: map[string]schema.GroupVersion{}, - InternalResourceEncodings: map[string]schema.GroupVersion{}, - } + return &DefaultResourceEncodingConfig{resources: map[schema.GroupResource]*OverridingResourceEncoding{}, scheme: scheme} } func (o *DefaultResourceEncodingConfig) SetResourceEncoding(resourceBeingStored schema.GroupResource, externalEncodingVersion, internalVersion schema.GroupVersion) { - group := resourceBeingStored.Group - _, groupExists := o.groups[group] - if !groupExists { - o.groups[group] = newGroupResourceEncodingConfig() + o.resources[resourceBeingStored] = &OverridingResourceEncoding{ + ExternalResourceEncoding: externalEncodingVersion, + InternalResourceEncoding: internalVersion, } - - o.groups[group].ExternalResourceEncodings[resourceBeingStored.Resource] = externalEncodingVersion - o.groups[group].InternalResourceEncodings[resourceBeingStored.Resource] = internalVersion } func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) { @@ -72,20 +62,13 @@ func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.Group return schema.GroupVersion{}, fmt.Errorf("group %q is not registered in scheme", resource.Group) } - groupEncoding, groupExists := o.groups[resource.Group] - - if !groupExists { - // return the most preferred external version for the group - return o.scheme.PrioritizedVersionsForGroup(resource.Group)[0], nil + resourceOverride, resourceExists := o.resources[resource] + if resourceExists { + return resourceOverride.ExternalResourceEncoding, nil } - resourceOverride, resourceExists := groupEncoding.ExternalResourceEncodings[resource.Resource] - if !resourceExists { - // return the most preferred external version for the group - return o.scheme.PrioritizedVersionsForGroup(resource.Group)[0], nil - } - - return resourceOverride, nil + // return the most preferred external version for the group + return o.scheme.PrioritizedVersionsForGroup(resource.Group)[0], nil } func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) { @@ -93,15 +76,9 @@ func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource schema.Grou return schema.GroupVersion{}, fmt.Errorf("group %q is not registered in scheme", resource.Group) } - groupEncoding, groupExists := o.groups[resource.Group] - if !groupExists { - return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil + resourceOverride, resourceExists := o.resources[resource] + if resourceExists { + return resourceOverride.InternalResourceEncoding, nil } - - resourceOverride, resourceExists := groupEncoding.InternalResourceEncodings[resource.Resource] - if !resourceExists { - return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil - } - - return resourceOverride, nil + return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil }