mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-29 21:29:24 +00:00
Merge pull request #58863 from hzxuzhonghu/runtime-config-resource-remove
Automatic merge from submit-queue (batch tested with PRs 56995, 58498, 57426, 58902, 58863). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. cleanup enable/disable api resources code **What this PR does / why we need it**: After #57228, `runtime-config` flag has stop support enable/disable resources of a specific groupVersion, so this pr does some clean work about this. Mainly delete unused code in `k8s.io/apiserver/pkg/server/storage/resource_config.go` **Special notes for your reviewer**: /assign @deads2k @sttts **Release note**: ```release-note NONE ``` /kind cleanup
This commit is contained in:
@@ -134,15 +134,14 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
|
||||
|
||||
apiResourceConfig := c.GenericConfig.MergedResourceConfig
|
||||
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, Registry, Scheme, metav1.ParameterCodec, Codecs)
|
||||
if apiResourceConfig.AnyResourcesForVersionEnabled(v1beta1.SchemeGroupVersion) {
|
||||
if apiResourceConfig.VersionEnabled(v1beta1.SchemeGroupVersion) {
|
||||
apiGroupInfo.GroupMeta.GroupVersion = v1beta1.SchemeGroupVersion
|
||||
storage := map[string]rest.Storage{}
|
||||
version := v1beta1.SchemeGroupVersion
|
||||
if apiResourceConfig.ResourceEnabled(version.WithResource("customresourcedefinitions")) {
|
||||
customResourceDefintionStorage := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["customresourcedefinitions"] = customResourceDefintionStorage
|
||||
storage["customresourcedefinitions/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefintionStorage)
|
||||
}
|
||||
// customresourcedefinitions
|
||||
customResourceDefintionStorage := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["customresourcedefinitions"] = customResourceDefintionStorage
|
||||
storage["customresourcedefinitions/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefintionStorage)
|
||||
|
||||
apiGroupInfo.VersionedResourcesStorageMap["v1beta1"] = storage
|
||||
}
|
||||
|
||||
|
||||
@@ -18,164 +18,50 @@ package storage
|
||||
|
||||
import (
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
)
|
||||
|
||||
// APIResourceConfigSource is the interface to determine which versions and resources are enabled
|
||||
// APIResourceConfigSource is the interface to determine which groups and versions are enabled
|
||||
type APIResourceConfigSource interface {
|
||||
AnyVersionOfResourceEnabled(resource schema.GroupResource) bool
|
||||
ResourceEnabled(resource schema.GroupVersionResource) bool
|
||||
AllResourcesForVersionEnabled(version schema.GroupVersion) bool
|
||||
AnyResourcesForVersionEnabled(version schema.GroupVersion) bool
|
||||
AnyResourcesForGroupEnabled(group string) bool
|
||||
}
|
||||
|
||||
// Specifies the overrides for various API group versions.
|
||||
// This can be used to enable/disable entire group versions or specific resources.
|
||||
type GroupVersionResourceConfig struct {
|
||||
// Whether to enable or disable this entire group version. This dominates any enablement check.
|
||||
// Enable=true means the group version is enabled, and EnabledResources/DisabledResources are considered.
|
||||
// Enable=false means the group version is disabled, and EnabledResources/DisabledResources are not considered.
|
||||
Enable bool
|
||||
|
||||
// DisabledResources lists the resources that are specifically disabled for a group/version
|
||||
// DisabledResources trumps EnabledResources
|
||||
DisabledResources sets.String
|
||||
|
||||
// EnabledResources lists the resources that should be enabled by default. This is a little
|
||||
// unusual, but we need it for compatibility with old code for now. An empty set means
|
||||
// enable all, a non-empty set means that all other resources are disabled.
|
||||
EnabledResources sets.String
|
||||
VersionEnabled(version schema.GroupVersion) bool
|
||||
AnyVersionForGroupEnabled(group string) bool
|
||||
}
|
||||
|
||||
var _ APIResourceConfigSource = &ResourceConfig{}
|
||||
|
||||
type ResourceConfig struct {
|
||||
GroupVersionResourceConfigs map[schema.GroupVersion]*GroupVersionResourceConfig
|
||||
GroupVersionConfigs map[schema.GroupVersion]bool
|
||||
}
|
||||
|
||||
func NewResourceConfig() *ResourceConfig {
|
||||
return &ResourceConfig{GroupVersionResourceConfigs: map[schema.GroupVersion]*GroupVersionResourceConfig{}}
|
||||
return &ResourceConfig{GroupVersionConfigs: map[schema.GroupVersion]bool{}}
|
||||
}
|
||||
|
||||
func NewGroupVersionResourceConfig() *GroupVersionResourceConfig {
|
||||
return &GroupVersionResourceConfig{Enable: true, DisabledResources: sets.String{}, EnabledResources: sets.String{}}
|
||||
}
|
||||
|
||||
// DisableVersions disables the versions entirely. No resources (even those whitelisted in EnabledResources) will be enabled
|
||||
// DisableVersions disables the versions entirely.
|
||||
func (o *ResourceConfig) DisableVersions(versions ...schema.GroupVersion) {
|
||||
for _, version := range versions {
|
||||
_, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
|
||||
}
|
||||
|
||||
o.GroupVersionResourceConfigs[version].Enable = false
|
||||
o.GroupVersionConfigs[version] = false
|
||||
}
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) EnableVersions(versions ...schema.GroupVersion) {
|
||||
for _, version := range versions {
|
||||
_, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
|
||||
}
|
||||
|
||||
o.GroupVersionResourceConfigs[version].Enable = true
|
||||
o.GroupVersionConfigs[version] = true
|
||||
}
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) DisableResources(resources ...schema.GroupVersionResource) {
|
||||
for _, resource := range resources {
|
||||
version := resource.GroupVersion()
|
||||
_, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
|
||||
}
|
||||
|
||||
o.GroupVersionResourceConfigs[version].DisabledResources.Insert(resource.Resource)
|
||||
}
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) EnableResources(resources ...schema.GroupVersionResource) {
|
||||
for _, resource := range resources {
|
||||
version := resource.GroupVersion()
|
||||
_, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
|
||||
}
|
||||
|
||||
o.GroupVersionResourceConfigs[version].EnabledResources.Insert(resource.Resource)
|
||||
o.GroupVersionResourceConfigs[version].DisabledResources.Delete(resource.Resource)
|
||||
}
|
||||
}
|
||||
|
||||
// AnyResourcesForVersionEnabled only considers matches based on exactly group/resource lexical matching. This means that
|
||||
// resource renames across versions are NOT considered to be the same resource by this method. You'll need to manually check
|
||||
// using the ResourceEnabled function.
|
||||
func (o *ResourceConfig) AnyVersionOfResourceEnabled(resource schema.GroupResource) bool {
|
||||
for version := range o.GroupVersionResourceConfigs {
|
||||
if version.Group != resource.Group {
|
||||
continue
|
||||
}
|
||||
|
||||
if o.ResourceEnabled(version.WithResource(resource.Resource)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) ResourceEnabled(resource schema.GroupVersionResource) bool {
|
||||
versionOverride, versionExists := o.GroupVersionResourceConfigs[resource.GroupVersion()]
|
||||
if !versionExists {
|
||||
return false
|
||||
}
|
||||
if !versionOverride.Enable {
|
||||
return false
|
||||
}
|
||||
|
||||
if versionOverride.DisabledResources.Has(resource.Resource) {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(versionOverride.EnabledResources) > 0 {
|
||||
return versionOverride.EnabledResources.Has(resource.Resource)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) AllResourcesForVersionEnabled(version schema.GroupVersion) bool {
|
||||
versionOverride, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
return false
|
||||
}
|
||||
if !versionOverride.Enable {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(versionOverride.EnabledResources) == 0 && len(versionOverride.DisabledResources) == 0 {
|
||||
func (o *ResourceConfig) VersionEnabled(version schema.GroupVersion) bool {
|
||||
enabled, _ := o.GroupVersionConfigs[version]
|
||||
if enabled {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) AnyResourcesForVersionEnabled(version schema.GroupVersion) bool {
|
||||
versionOverride, versionExists := o.GroupVersionResourceConfigs[version]
|
||||
if !versionExists {
|
||||
return false
|
||||
}
|
||||
|
||||
return versionOverride.Enable
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) AnyResourcesForGroupEnabled(group string) bool {
|
||||
for version := range o.GroupVersionResourceConfigs {
|
||||
func (o *ResourceConfig) AnyVersionForGroupEnabled(group string) bool {
|
||||
for version := range o.GroupVersionConfigs {
|
||||
if version.Group == group {
|
||||
if o.AnyResourcesForVersionEnabled(version) {
|
||||
if o.VersionEnabled(version) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,79 +26,24 @@ func TestDisabledVersion(t *testing.T) {
|
||||
g1v1 := schema.GroupVersion{Group: "group1", Version: "version1"}
|
||||
g1v2 := schema.GroupVersion{Group: "group1", Version: "version2"}
|
||||
g2v1 := schema.GroupVersion{Group: "group2", Version: "version1"}
|
||||
g3v1 := schema.GroupVersion{Group: "group3", Version: "version1"}
|
||||
|
||||
resourceType := "the-resource"
|
||||
disabledResourceType := "the-disabled-resource"
|
||||
|
||||
config := NewResourceConfig()
|
||||
|
||||
config.DisableVersions(g1v1)
|
||||
config.EnableVersions(g1v2, g3v1)
|
||||
config.EnableResources(g1v1.WithResource(resourceType), g2v1.WithResource(resourceType))
|
||||
config.DisableResources(g1v2.WithResource(disabledResourceType))
|
||||
config.EnableVersions(g1v2, g2v1)
|
||||
|
||||
expectedEnabledResources := []schema.GroupVersionResource{
|
||||
g1v2.WithResource(resourceType),
|
||||
g2v1.WithResource(resourceType),
|
||||
if config.VersionEnabled(g1v1) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1, config)
|
||||
}
|
||||
expectedDisabledResources := []schema.GroupVersionResource{
|
||||
g1v1.WithResource(resourceType), g1v1.WithResource(disabledResourceType),
|
||||
g1v2.WithResource(disabledResourceType),
|
||||
g2v1.WithResource(disabledResourceType),
|
||||
if !config.VersionEnabled(g1v2) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1, config)
|
||||
}
|
||||
|
||||
for _, expectedResource := range expectedEnabledResources {
|
||||
if !config.ResourceEnabled(expectedResource) {
|
||||
t.Errorf("expected enabled for %v, from %v", expectedResource, config)
|
||||
}
|
||||
if !config.VersionEnabled(g2v1) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1, config)
|
||||
}
|
||||
for _, expectedResource := range expectedDisabledResources {
|
||||
if config.ResourceEnabled(expectedResource) {
|
||||
t.Errorf("expected disabled for %v, from %v", expectedResource, config)
|
||||
}
|
||||
}
|
||||
|
||||
if e, a := false, config.AnyResourcesForVersionEnabled(g1v1); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
if e, a := false, config.AllResourcesForVersionEnabled(g1v1); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
if e, a := true, config.AnyResourcesForVersionEnabled(g1v2); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
if e, a := false, config.AllResourcesForVersionEnabled(g1v2); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
if e, a := true, config.AnyResourcesForVersionEnabled(g3v1); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
if e, a := true, config.AllResourcesForVersionEnabled(g3v1); e != a {
|
||||
t.Errorf("expected %v, got %v", e, a)
|
||||
}
|
||||
|
||||
expectedEnabledAnyVersionResources := []schema.GroupResource{
|
||||
{Group: "group1", Resource: resourceType},
|
||||
}
|
||||
expectedDisabledAnyResources := []schema.GroupResource{
|
||||
{Group: "group1", Resource: disabledResourceType},
|
||||
}
|
||||
|
||||
for _, expectedResource := range expectedEnabledAnyVersionResources {
|
||||
if !config.AnyVersionOfResourceEnabled(expectedResource) {
|
||||
t.Errorf("expected enabled for %v, from %v", expectedResource, config)
|
||||
}
|
||||
}
|
||||
for _, expectedResource := range expectedDisabledAnyResources {
|
||||
if config.AnyVersionOfResourceEnabled(expectedResource) {
|
||||
t.Errorf("expected disabled for %v, from %v", expectedResource, config)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestAnyResourcesForGroupEnabled(t *testing.T) {
|
||||
func TestAnyVersionForGroupEnabled(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
creator func() APIResourceConfigSource
|
||||
@@ -136,24 +81,12 @@ func TestAnyResourcesForGroupEnabled(t *testing.T) {
|
||||
},
|
||||
testGroup: "one",
|
||||
|
||||
expectedResult: true,
|
||||
},
|
||||
{
|
||||
name: "present, and one resource",
|
||||
creator: func() APIResourceConfigSource {
|
||||
ret := NewResourceConfig()
|
||||
ret.DisableVersions(schema.GroupVersion{Group: "one", Version: "version1"})
|
||||
ret.EnableResources(schema.GroupVersionResource{Group: "one", Version: "version2", Resource: "foo"})
|
||||
return ret
|
||||
},
|
||||
testGroup: "one",
|
||||
|
||||
expectedResult: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
if e, a := tc.expectedResult, tc.creator().AnyResourcesForGroupEnabled(tc.testGroup); e != a {
|
||||
if e, a := tc.expectedResult, tc.creator().AnyVersionForGroupEnabled(tc.testGroup); e != a {
|
||||
t.Errorf("%s: expected %v, got %v", tc.name, e, a)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ func getAllResourcesAlias(resource schema.GroupResource) schema.GroupResource {
|
||||
|
||||
func (s *DefaultStorageFactory) getStorageGroupResource(groupResource schema.GroupResource) schema.GroupResource {
|
||||
for _, potentialStorageResource := range s.Overrides[groupResource].cohabitatingResources {
|
||||
if s.APIResourceConfigSource.AnyVersionOfResourceEnabled(potentialStorageResource) {
|
||||
if s.APIResourceConfigSource.AnyVersionForGroupEnabled(potentialStorageResource.Group) {
|
||||
return potentialStorageResource
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,26 +185,23 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg
|
||||
|
||||
apiResourceConfig := c.GenericConfig.MergedResourceConfig
|
||||
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, Registry, Scheme, metav1.ParameterCodec, Codecs)
|
||||
if apiResourceConfig.AnyResourcesForVersionEnabled(v1beta1.SchemeGroupVersion) {
|
||||
if apiResourceConfig.VersionEnabled(v1beta1.SchemeGroupVersion) {
|
||||
apiGroupInfo.GroupMeta.GroupVersion = v1beta1.SchemeGroupVersion
|
||||
storage := map[string]rest.Storage{}
|
||||
version := v1beta1.SchemeGroupVersion
|
||||
if apiResourceConfig.ResourceEnabled(version.WithResource("apiservices")) {
|
||||
apiServiceREST := apiservicestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["apiservices"] = apiServiceREST
|
||||
storage["apiservices/status"] = apiservicestorage.NewStatusREST(Scheme, apiServiceREST)
|
||||
}
|
||||
// apiservices
|
||||
apiServiceREST := apiservicestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["apiservices"] = apiServiceREST
|
||||
storage["apiservices/status"] = apiservicestorage.NewStatusREST(Scheme, apiServiceREST)
|
||||
apiGroupInfo.VersionedResourcesStorageMap["v1beta1"] = storage
|
||||
}
|
||||
if apiResourceConfig.AnyResourcesForVersionEnabled(v1.SchemeGroupVersion) {
|
||||
if apiResourceConfig.VersionEnabled(v1.SchemeGroupVersion) {
|
||||
apiGroupInfo.GroupMeta.GroupVersion = v1.SchemeGroupVersion
|
||||
storage := map[string]rest.Storage{}
|
||||
version := v1.SchemeGroupVersion
|
||||
if apiResourceConfig.ResourceEnabled(version.WithResource("apiservices")) {
|
||||
apiServiceREST := apiservicestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["apiservices"] = apiServiceREST
|
||||
storage["apiservices/status"] = apiservicestorage.NewStatusREST(Scheme, apiServiceREST)
|
||||
}
|
||||
// apiservices
|
||||
apiServiceREST := apiservicestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||
storage["apiservices"] = apiServiceREST
|
||||
storage["apiservices/status"] = apiservicestorage.NewStatusREST(Scheme, apiServiceREST)
|
||||
|
||||
apiGroupInfo.VersionedResourcesStorageMap["v1"] = storage
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user