mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Merge pull request #108029 from deads2k/just-runtimeconfig
update the --runtime-config handling to ensure that user preferences always take priority over hardcoded preferences
This commit is contained in:
commit
542a979c03
@ -146,7 +146,7 @@ func createAggregatorServer(aggregatorConfig *aggregatorapiserver.Config, delega
|
||||
// let the CRD controller process the initial set of CRDs before starting the autoregistration controller.
|
||||
// this prevents the autoregistration controller's initial sync from deleting APIServices for CRDs that still exist.
|
||||
// we only need to do this if CRDs are enabled on this server. We can't use discovery because we are the source for discovery.
|
||||
if aggregatorConfig.GenericConfig.MergedResourceConfig.AnyVersionForGroupEnabled("apiextensions.k8s.io") {
|
||||
if aggregatorConfig.GenericConfig.MergedResourceConfig.AnyResourceForGroupEnabled("apiextensions.k8s.io") {
|
||||
crdRegistrationController.WaitForInitialSync()
|
||||
}
|
||||
autoRegistrationController.Run(5, context.StopCh)
|
||||
|
@ -563,7 +563,7 @@ func (m *Instance) InstallAPIs(apiResourceConfigSource serverstorage.APIResource
|
||||
|
||||
for _, restStorageBuilder := range restStorageProviders {
|
||||
groupName := restStorageBuilder.GroupName()
|
||||
if !apiResourceConfigSource.AnyVersionForGroupEnabled(groupName) {
|
||||
if !apiResourceConfigSource.AnyResourceForGroupEnabled(groupName) {
|
||||
klog.V(1).Infof("Skipping disabled API group %q.", groupName)
|
||||
continue
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
serverstore "k8s.io/apiserver/pkg/server/storage"
|
||||
cliflag "k8s.io/component-base/cli/flag"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// GroupVersionRegistry provides access to registered group versions.
|
||||
@ -65,7 +64,7 @@ var (
|
||||
betaPattern = regexp.MustCompile(`^v\d+beta\d+$`)
|
||||
alphaPattern = regexp.MustCompile(`^v\d+alpha\d+$`)
|
||||
|
||||
matchers = map[string]func(gv schema.GroupVersion) bool{
|
||||
groupVersionMatchers = map[string]func(gv schema.GroupVersion) bool{
|
||||
// allows users to address all api versions
|
||||
APIAll: func(gv schema.GroupVersion) bool { return true },
|
||||
// allows users to address all api versions in the form v[0-9]+
|
||||
@ -76,9 +75,26 @@ var (
|
||||
APIAlpha: func(gv schema.GroupVersion) bool { return alphaPattern.MatchString(gv.Version) },
|
||||
}
|
||||
|
||||
matcherOrder = []string{APIAll, APIGA, APIBeta, APIAlpha}
|
||||
groupVersionMatchersOrder = []string{APIAll, APIGA, APIBeta, APIAlpha}
|
||||
|
||||
groupVersionResourceMatchers = map[string]func(gvr schema.GroupVersionResource) bool{
|
||||
// allows users to address all api versions
|
||||
APIAll: func(gvr schema.GroupVersionResource) bool { return true },
|
||||
// allows users to address all api versions in the form v[0-9]+
|
||||
APIGA: func(gvr schema.GroupVersionResource) bool { return gaPattern.MatchString(gvr.Version) },
|
||||
// allows users to address all beta api versions
|
||||
APIBeta: func(gvr schema.GroupVersionResource) bool { return betaPattern.MatchString(gvr.Version) },
|
||||
// allows users to address all alpha api versions
|
||||
APIAlpha: func(gvr schema.GroupVersionResource) bool { return alphaPattern.MatchString(gvr.Version) },
|
||||
}
|
||||
)
|
||||
|
||||
func resourceMatcherForVersion(gv schema.GroupVersion) func(gvr schema.GroupVersionResource) bool {
|
||||
return func(gvr schema.GroupVersionResource) bool {
|
||||
return gv == gvr.GroupVersion()
|
||||
}
|
||||
}
|
||||
|
||||
// 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.
|
||||
@ -90,29 +106,44 @@ func MergeAPIResourceConfigs(
|
||||
resourceConfig := defaultAPIResourceConfig
|
||||
overrides := resourceConfigOverrides
|
||||
|
||||
for _, flag := range matcherOrder {
|
||||
for _, flag := range groupVersionMatchersOrder {
|
||||
if value, ok := overrides[flag]; ok {
|
||||
if value == "false" {
|
||||
resourceConfig.DisableMatchingVersions(matchers[flag])
|
||||
resourceConfig.DisableMatchingVersions(groupVersionMatchers[flag])
|
||||
} else if value == "true" {
|
||||
resourceConfig.EnableMatchingVersions(matchers[flag])
|
||||
resourceConfig.EnableMatchingVersions(groupVersionMatchers[flag])
|
||||
} else {
|
||||
return nil, fmt.Errorf("invalid value %v=%v", flag, value)
|
||||
}
|
||||
// remove individual resource preferences that were hardcoded into the default. The override trumps those settings.
|
||||
resourceConfig.RemoveMatchingResourcePreferences(groupVersionResourceMatchers[flag])
|
||||
}
|
||||
}
|
||||
|
||||
type versionEnablementPreference struct {
|
||||
key string
|
||||
enabled bool
|
||||
groupVersion schema.GroupVersion
|
||||
}
|
||||
type resourceEnablementPreference struct {
|
||||
key string
|
||||
enabled bool
|
||||
groupVersionResource schema.GroupVersionResource
|
||||
}
|
||||
versionPreferences := []versionEnablementPreference{}
|
||||
resourcePreferences := []resourceEnablementPreference{}
|
||||
|
||||
// "<resourceSpecifier>={true|false} allows users to enable/disable API.
|
||||
// This takes preference over api/all, if specified.
|
||||
// Iterate through all group/version overrides specified in runtimeConfig.
|
||||
for key := range overrides {
|
||||
// Have already handled them above. Can skip them here.
|
||||
if _, ok := matchers[key]; ok {
|
||||
if _, ok := groupVersionMatchers[key]; ok {
|
||||
continue
|
||||
}
|
||||
|
||||
tokens := strings.Split(key, "/")
|
||||
if len(tokens) < 2 {
|
||||
if len(tokens) < 2 || len(tokens) > 3 {
|
||||
continue
|
||||
}
|
||||
groupVersionString := tokens[0] + "/" + tokens[1]
|
||||
@ -121,13 +152,6 @@ func MergeAPIResourceConfigs(
|
||||
return nil, fmt.Errorf("invalid key %s", key)
|
||||
}
|
||||
|
||||
// individual resource enablement/disablement is only supported in the extensions/v1beta1 API group for legacy reasons.
|
||||
// all other API groups are expected to contain coherent sets of resources that are enabled/disabled together.
|
||||
if len(tokens) > 2 && (groupVersion != schema.GroupVersion{Group: "extensions", Version: "v1beta1"}) {
|
||||
klog.Warningf("ignoring invalid key %s, individual resource enablement/disablement is not supported in %s, and will prevent starting in future releases", key, groupVersion.String())
|
||||
continue
|
||||
}
|
||||
|
||||
// Exclude group not registered into the registry.
|
||||
if !registry.IsGroupRegistered(groupVersion.Group) {
|
||||
continue
|
||||
@ -141,22 +165,47 @@ func MergeAPIResourceConfigs(
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if enabled {
|
||||
// enable the groupVersion for "group/version=true" and "group/version/resource=true"
|
||||
resourceConfig.EnableVersions(groupVersion)
|
||||
} else if len(tokens) == 2 {
|
||||
// disable the groupVersion only for "group/version=false", not "group/version/resource=false"
|
||||
resourceConfig.DisableVersions(groupVersion)
|
||||
}
|
||||
|
||||
if len(tokens) < 3 {
|
||||
continue
|
||||
switch len(tokens) {
|
||||
case 2:
|
||||
versionPreferences = append(versionPreferences, versionEnablementPreference{
|
||||
key: key,
|
||||
enabled: enabled,
|
||||
groupVersion: groupVersion,
|
||||
})
|
||||
case 3:
|
||||
if strings.ToLower(tokens[2]) != tokens[2] {
|
||||
return nil, fmt.Errorf("invalid key %v: group/version/resource and resource is always lowercase plural, not %q", key, tokens[2])
|
||||
}
|
||||
resourcePreferences = append(resourcePreferences, resourceEnablementPreference{
|
||||
key: key,
|
||||
enabled: enabled,
|
||||
groupVersionResource: groupVersion.WithResource(tokens[2]),
|
||||
})
|
||||
}
|
||||
groupVersionResource := groupVersion.WithResource(tokens[2])
|
||||
if enabled {
|
||||
resourceConfig.EnableResources(groupVersionResource)
|
||||
}
|
||||
|
||||
// apply version preferences first, so that we can remove the hardcoded resource preferences that are being overridden
|
||||
for _, versionPreference := range versionPreferences {
|
||||
// if a user has expressed a preference about a version, that preference takes priority over the hardcoded resources
|
||||
resourceConfig.RemoveMatchingResourcePreferences(resourceMatcherForVersion(versionPreference.groupVersion))
|
||||
if versionPreference.enabled {
|
||||
// enable the groupVersion for "group/version=true"
|
||||
resourceConfig.EnableVersions(versionPreference.groupVersion)
|
||||
|
||||
} else {
|
||||
resourceConfig.DisableResources(groupVersionResource)
|
||||
// disable the groupVersion only for "group/version=false"
|
||||
resourceConfig.DisableVersions(versionPreference.groupVersion)
|
||||
}
|
||||
}
|
||||
|
||||
// apply resource preferences last, so they have the highest priority
|
||||
for _, resourcePreference := range resourcePreferences {
|
||||
if resourcePreference.enabled {
|
||||
// enable the resource for "group/version/resource=true"
|
||||
resourceConfig.EnableResources(resourcePreference.groupVersionResource)
|
||||
} else {
|
||||
resourceConfig.DisableResources(resourcePreference.groupVersionResource)
|
||||
}
|
||||
}
|
||||
|
||||
@ -182,7 +231,7 @@ func getRuntimeConfigValue(overrides cliflag.ConfigurationMap, apiKey string, de
|
||||
func ParseGroups(resourceConfig cliflag.ConfigurationMap) ([]string, error) {
|
||||
groups := []string{}
|
||||
for key := range resourceConfig {
|
||||
if _, ok := matchers[key]; ok {
|
||||
if _, ok := groupVersionMatchers[key]; ok {
|
||||
continue
|
||||
}
|
||||
tokens := strings.Split(key, "/")
|
||||
|
@ -22,9 +22,11 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
serverstore "k8s.io/apiserver/pkg/server/storage"
|
||||
)
|
||||
|
||||
@ -32,13 +34,29 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
scheme := newFakeScheme(t)
|
||||
apiv1GroupVersion := apiv1.SchemeGroupVersion
|
||||
testCases := []struct {
|
||||
name string
|
||||
runtimeConfig map[string]string
|
||||
defaultResourceConfig func() *serverstore.ResourceConfig
|
||||
expectedAPIConfig func() *serverstore.ResourceConfig
|
||||
expectedEnabledAPIs map[schema.GroupVersionResource]bool
|
||||
err bool
|
||||
}{
|
||||
{
|
||||
// everything default value.
|
||||
name: "using-kind",
|
||||
runtimeConfig: map[string]string{
|
||||
"apps/v1/Deployment": "false",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedEnabledAPIs: defaultFakeEnabledResources(),
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "everything-default-value",
|
||||
runtimeConfig: map[string]string{},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
@ -46,10 +64,11 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: defaultFakeEnabledResources(),
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// no runtimeConfig override.
|
||||
name: "no-runtimeConfig-override",
|
||||
runtimeConfig: map[string]string{},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
@ -61,10 +80,11 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion)
|
||||
return config
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: defaultFakeEnabledResources(),
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// version enabled by runtimeConfig override.
|
||||
name: "version-enabled-by-runtimeConfig-override",
|
||||
runtimeConfig: map[string]string{
|
||||
"apps/v1": "",
|
||||
},
|
||||
@ -76,10 +96,11 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
return config
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: defaultFakeEnabledResources(),
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// Disable v1.
|
||||
name: "disable-v1",
|
||||
runtimeConfig: map[string]string{
|
||||
"/v1": "false",
|
||||
},
|
||||
@ -91,10 +112,18 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
config.DisableVersions(apiv1GroupVersion)
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): false,
|
||||
},
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// invalid runtime config
|
||||
name: "invalid-runtime-config",
|
||||
runtimeConfig: map[string]string{
|
||||
"invalidgroup/version": "false",
|
||||
},
|
||||
@ -104,10 +133,11 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: defaultFakeEnabledResources(),
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// enable all
|
||||
name: "enable-all",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/all": "true",
|
||||
},
|
||||
@ -117,12 +147,22 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.EnableVersions(scheme.PrioritizedVersionsAllGroups()...)
|
||||
// disabling groups of APIs removes the individual resource preferences from the default
|
||||
config.RemoveMatchingResourcePreferences(matchAllExplicitResourcesForFake)
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): true,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// only enable v1
|
||||
name: "only-enable-v1",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/all": "false",
|
||||
"/v1": "true",
|
||||
@ -132,13 +172,24 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(appsv1.SchemeGroupVersion)
|
||||
config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion)
|
||||
// disabling groups of APIs removes the individual resource preferences from the default
|
||||
config.RemoveMatchingResourcePreferences(matchAllExplicitResourcesForFake)
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false,
|
||||
},
|
||||
{
|
||||
// enable specific extensions resources
|
||||
name: "enable-specific-extensions-resources",
|
||||
runtimeConfig: map[string]string{
|
||||
"extensions/v1beta1/deployments": "true",
|
||||
},
|
||||
@ -150,10 +201,17 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
config.EnableResources(extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
}, err: false,
|
||||
},
|
||||
{
|
||||
// disable specific extensions resources
|
||||
name: "disable-specific-extensions-resources",
|
||||
runtimeConfig: map[string]string{
|
||||
"extensions/v1beta1/ingresses": "false",
|
||||
},
|
||||
@ -165,10 +223,17 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
config.DisableResources(extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"))
|
||||
return config
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
}, err: false,
|
||||
},
|
||||
{
|
||||
// disable all extensions resources
|
||||
name: "disable-all-extensions-resources",
|
||||
runtimeConfig: map[string]string{
|
||||
"extensions/v1beta1": "false",
|
||||
},
|
||||
@ -178,12 +243,21 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion)
|
||||
// disabling groups of APIs removes the individual resource preferences from the default
|
||||
config.RemoveMatchingResourcePreferences(matchAllExplicitResourcesForFake)
|
||||
return config
|
||||
},
|
||||
err: false,
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
}, err: false,
|
||||
},
|
||||
{
|
||||
// disable a non-extensions resource
|
||||
name: "disable-a-no-extensions-resources",
|
||||
runtimeConfig: map[string]string{
|
||||
"apps/v1/deployments": "false",
|
||||
},
|
||||
@ -191,12 +265,22 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
// disable all beta resources
|
||||
name: "disable-all-beta-resources",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/beta": "false",
|
||||
},
|
||||
@ -206,24 +290,261 @@ func TestParseRuntimeConfig(t *testing.T) {
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion)
|
||||
// disabling groups of APIs removes the individual resource preferences from the default
|
||||
config.RemoveMatchingResourcePreferences(matchAllExplicitResourcesForFake)
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-disable-resource-over-user-version-enable",
|
||||
runtimeConfig: map[string]string{
|
||||
"apps/v1": "true",
|
||||
"apps/v1/deployments": "false",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-enable-resource-over-user-version-disable",
|
||||
runtimeConfig: map[string]string{
|
||||
"apps/v1": "false",
|
||||
"apps/v1/deployments": "true",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(appsv1.SchemeGroupVersion)
|
||||
config.EnableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
appsv1.SchemeGroupVersion.WithResource("other"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-disable-resource-over-user-stability-enable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "true",
|
||||
"apps/v1/deployments": "false",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-enable-resource-over-user-stability-disable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "false",
|
||||
"apps/v1/deployments": "true",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(apiv1.SchemeGroupVersion)
|
||||
config.DisableVersions(appsv1.SchemeGroupVersion)
|
||||
config.EnableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): false,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-disable-resource-over-user-version-enable-over-user-stability-disable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "false",
|
||||
"apps/v1": "true",
|
||||
"apps/v1/deployments": "false",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(apiv1.SchemeGroupVersion)
|
||||
config.EnableVersions(appsv1.SchemeGroupVersion)
|
||||
config.DisableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("other"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): false,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-enable-resource-over-user-version-disable-over-user-stability-disable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "false",
|
||||
"apps/v1": "false",
|
||||
"apps/v1/deployments": "true",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(apiv1.SchemeGroupVersion)
|
||||
config.DisableVersions(appsv1.SchemeGroupVersion)
|
||||
config.EnableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): false,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-disable-resource-over-user-version-enable-over-user-stability-enable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "true",
|
||||
"apps/v1": "true",
|
||||
"apps/v1/deployments": "false",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.EnableVersions(appsv1.SchemeGroupVersion)
|
||||
config.DisableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
{
|
||||
name: "user-explicit-enable-resource-over-user-version-disable-over-user-stability-enable",
|
||||
runtimeConfig: map[string]string{
|
||||
"api/ga": "true",
|
||||
"apps/v1": "false",
|
||||
"apps/v1/deployments": "true",
|
||||
},
|
||||
defaultResourceConfig: func() *serverstore.ResourceConfig {
|
||||
return newFakeAPIResourceConfigSource()
|
||||
},
|
||||
expectedAPIConfig: func() *serverstore.ResourceConfig {
|
||||
config := newFakeAPIResourceConfigSource()
|
||||
config.DisableVersions(appsv1.SchemeGroupVersion)
|
||||
config.EnableResources(appsv1.SchemeGroupVersion.WithResource("deployments"))
|
||||
return config
|
||||
},
|
||||
expectedEnabledAPIs: map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
appsv1.SchemeGroupVersion.WithResource("other"): false,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
},
|
||||
err: false, // no error for backwards compatibility
|
||||
},
|
||||
}
|
||||
for index, test := range testCases {
|
||||
t.Log(scheme.PrioritizedVersionsAllGroups())
|
||||
actualDisablers, err := MergeAPIResourceConfigs(test.defaultResourceConfig(), test.runtimeConfig, scheme)
|
||||
if err == nil && test.err {
|
||||
t.Fatalf("expected error for test case: %v", index)
|
||||
} else if err != nil && !test.err {
|
||||
t.Fatalf("unexpected error: %s, for test: %v", err, test)
|
||||
}
|
||||
for _, test := range testCases {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
t.Log(scheme.PrioritizedVersionsAllGroups())
|
||||
actualDisablers, err := MergeAPIResourceConfigs(test.defaultResourceConfig(), test.runtimeConfig, scheme)
|
||||
if err == nil && test.err {
|
||||
t.Fatalf("expected error")
|
||||
} else if err != nil && !test.err {
|
||||
t.Fatalf("unexpected error: %s, for test: %v", err, test)
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
expectedConfig := test.expectedAPIConfig()
|
||||
if err == nil && !reflect.DeepEqual(actualDisablers, expectedConfig) {
|
||||
t.Fatalf("%v: unexpected apiResourceDisablers. Actual: %v\n expected: %v", test.runtimeConfig, actualDisablers, expectedConfig)
|
||||
}
|
||||
expectedConfig := test.expectedAPIConfig()
|
||||
if !reflect.DeepEqual(actualDisablers, expectedConfig) {
|
||||
t.Fatalf("%v: unexpected apiResourceDisablers. Actual: %v\n expected: %v", test.runtimeConfig, actualDisablers, expectedConfig)
|
||||
}
|
||||
|
||||
for _, resourceToCheck := range apiResourcesToCheck() {
|
||||
actual := actualDisablers.ResourceEnabled(resourceToCheck)
|
||||
expected := test.expectedEnabledAPIs[resourceToCheck]
|
||||
if actual != expected {
|
||||
t.Errorf("for %v, actual=%v, expected=%v", resourceToCheck, actual, expected)
|
||||
}
|
||||
}
|
||||
for resourceToCheck, expected := range test.expectedEnabledAPIs {
|
||||
actual := actualDisablers.ResourceEnabled(resourceToCheck)
|
||||
if actual != expected {
|
||||
t.Errorf("for %v, actual=%v, expected=%v", resourceToCheck, actual, expected)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,6 +553,7 @@ func newFakeAPIResourceConfigSource() *serverstore.ResourceConfig {
|
||||
// NOTE: GroupVersions listed here will be enabled by default. Don't put alpha versions in the list.
|
||||
ret.EnableVersions(
|
||||
apiv1.SchemeGroupVersion,
|
||||
appsv1.SchemeGroupVersion,
|
||||
extensionsapiv1beta1.SchemeGroupVersion,
|
||||
)
|
||||
ret.EnableResources(
|
||||
@ -246,9 +568,44 @@ func newFakeAPIResourceConfigSource() *serverstore.ResourceConfig {
|
||||
return ret
|
||||
}
|
||||
|
||||
func matchAllExplicitResourcesForFake(gvr schema.GroupVersionResource) bool {
|
||||
switch gvr {
|
||||
case extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"):
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// apiResourcesToCheck are the apis we use in this set of unit tests. They will be check for enable/disable status
|
||||
func apiResourcesToCheck() []schema.GroupVersionResource {
|
||||
return []schema.GroupVersionResource{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"),
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"),
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"),
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"),
|
||||
}
|
||||
}
|
||||
|
||||
func defaultFakeEnabledResources() map[schema.GroupVersionResource]bool {
|
||||
return map[schema.GroupVersionResource]bool{
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("ingresses"): true,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("deployments"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("replicasets"): false,
|
||||
extensionsapiv1beta1.SchemeGroupVersion.WithResource("daemonsets"): false,
|
||||
appsv1.SchemeGroupVersion.WithResource("deployments"): true,
|
||||
apiv1.SchemeGroupVersion.WithResource("pods"): true,
|
||||
}
|
||||
}
|
||||
|
||||
func newFakeScheme(t *testing.T) *runtime.Scheme {
|
||||
ret := runtime.NewScheme()
|
||||
require.NoError(t, apiv1.AddToScheme(ret))
|
||||
require.NoError(t, appsv1.AddToScheme(ret))
|
||||
require.NoError(t, extensionsapiv1beta1.AddToScheme(ret))
|
||||
|
||||
require.NoError(t, ret.SetVersionPriority(apiv1.SchemeGroupVersion))
|
||||
|
@ -24,7 +24,7 @@ import (
|
||||
type APIResourceConfigSource interface {
|
||||
VersionEnabled(version schema.GroupVersion) bool
|
||||
ResourceEnabled(resource schema.GroupVersionResource) bool
|
||||
AnyVersionForGroupEnabled(group string) bool
|
||||
AnyResourceForGroupEnabled(group string) bool
|
||||
}
|
||||
|
||||
var _ APIResourceConfigSource = &ResourceConfig{}
|
||||
@ -38,20 +38,6 @@ func NewResourceConfig() *ResourceConfig {
|
||||
return &ResourceConfig{GroupVersionConfigs: map[schema.GroupVersion]bool{}, ResourceConfigs: map[schema.GroupVersionResource]bool{}}
|
||||
}
|
||||
|
||||
// DisableAll disables all group/versions. It does not modify individual resource enablement/disablement.
|
||||
func (o *ResourceConfig) DisableAll() {
|
||||
for k := range o.GroupVersionConfigs {
|
||||
o.GroupVersionConfigs[k] = false
|
||||
}
|
||||
}
|
||||
|
||||
// EnableAll enables all group/versions. It does not modify individual resource enablement/disablement.
|
||||
func (o *ResourceConfig) EnableAll() {
|
||||
for k := range o.GroupVersionConfigs {
|
||||
o.GroupVersionConfigs[k] = true
|
||||
}
|
||||
}
|
||||
|
||||
// DisableMatchingVersions disables all group/versions for which the matcher function returns true. It does not modify individual resource enablement/disablement.
|
||||
func (o *ResourceConfig) DisableMatchingVersions(matcher func(gv schema.GroupVersion) bool) {
|
||||
for k := range o.GroupVersionConfigs {
|
||||
@ -70,6 +56,20 @@ func (o *ResourceConfig) EnableMatchingVersions(matcher func(gv schema.GroupVers
|
||||
}
|
||||
}
|
||||
|
||||
// RemoveMatchingResourcePreferences removes individual resource preferences that match. This is useful when an override of a version or level enablement should
|
||||
// override the previously individual preferences.
|
||||
func (o *ResourceConfig) RemoveMatchingResourcePreferences(matcher func(gvr schema.GroupVersionResource) bool) {
|
||||
keysToRemove := []schema.GroupVersionResource{}
|
||||
for k := range o.ResourceConfigs {
|
||||
if matcher(k) {
|
||||
keysToRemove = append(keysToRemove, k)
|
||||
}
|
||||
}
|
||||
for _, k := range keysToRemove {
|
||||
delete(o.ResourceConfigs, k)
|
||||
}
|
||||
}
|
||||
|
||||
// DisableVersions disables the versions entirely.
|
||||
func (o *ResourceConfig) DisableVersions(versions ...schema.GroupVersion) {
|
||||
for _, version := range versions {
|
||||
@ -83,6 +83,7 @@ func (o *ResourceConfig) EnableVersions(versions ...schema.GroupVersion) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO this must be removed and we enable/disable individual resources.
|
||||
func (o *ResourceConfig) VersionEnabled(version schema.GroupVersion) bool {
|
||||
enabled, _ := o.GroupVersionConfigs[version]
|
||||
return enabled
|
||||
@ -101,17 +102,20 @@ func (o *ResourceConfig) EnableResources(resources ...schema.GroupVersionResourc
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) ResourceEnabled(resource schema.GroupVersionResource) bool {
|
||||
// if a resource is explicitly set, that takes priority over the preference of the version.
|
||||
resourceEnabled, explicitlySet := o.ResourceConfigs[resource]
|
||||
if explicitlySet {
|
||||
return resourceEnabled
|
||||
}
|
||||
|
||||
if !o.VersionEnabled(resource.GroupVersion()) {
|
||||
return false
|
||||
}
|
||||
resourceEnabled, explicitlySet := o.ResourceConfigs[resource]
|
||||
if !explicitlySet {
|
||||
return true
|
||||
}
|
||||
return resourceEnabled
|
||||
// they are enabled by default.
|
||||
return true
|
||||
}
|
||||
|
||||
func (o *ResourceConfig) AnyVersionForGroupEnabled(group string) bool {
|
||||
func (o *ResourceConfig) AnyResourceForGroupEnabled(group string) bool {
|
||||
for version := range o.GroupVersionConfigs {
|
||||
if version.Group == group {
|
||||
if o.VersionEnabled(version) {
|
||||
@ -119,6 +123,11 @@ func (o *ResourceConfig) AnyVersionForGroupEnabled(group string) bool {
|
||||
}
|
||||
}
|
||||
}
|
||||
for resource := range o.ResourceConfigs {
|
||||
if resource.Group == group && o.ResourceEnabled(resource) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
@ -65,16 +65,19 @@ func TestDisabledResource(t *testing.T) {
|
||||
config.EnableResources(g1v1rEnabled, g1v2rEnabled, g2v1rEnabled)
|
||||
config.DisableResources(g1v1rDisabled, g1v2rDisabled, g2v1rDisabled)
|
||||
|
||||
// all resources under g1v1 are disabled because the group-version is disabled
|
||||
// all resources not explicitly enabled under g1v1 are disabled because the group-version is disabled
|
||||
if config.ResourceEnabled(g1v1rUnspecified) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rUnspecified, config)
|
||||
}
|
||||
if config.ResourceEnabled(g1v1rEnabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rEnabled, config)
|
||||
if !config.ResourceEnabled(g1v1rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1rEnabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g1v1rDisabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rDisabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g1v1rUnspecified) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rUnspecified, config)
|
||||
}
|
||||
|
||||
// explicitly disabled resources in enabled group-versions are disabled
|
||||
if config.ResourceEnabled(g1v2rDisabled) {
|
||||
@ -97,61 +100,6 @@ func TestDisabledResource(t *testing.T) {
|
||||
if !config.ResourceEnabled(g2v1rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g2v1rEnabled, config)
|
||||
}
|
||||
|
||||
// DisableAll() only disables to the group/version level for compatibility
|
||||
// corresponds to --runtime-config=api/all=false
|
||||
config.DisableAll()
|
||||
if config.ResourceEnabled(g1v1rEnabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rEnabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g1v2rEnabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v2rEnabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g2v1rEnabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g2v1rEnabled, config)
|
||||
}
|
||||
|
||||
// DisableAll() only disables to the group/version level for compatibility
|
||||
// corresponds to --runtime-config=api/all=false,g1/v1=true
|
||||
config.DisableAll()
|
||||
config.EnableVersions(g1v1)
|
||||
if !config.ResourceEnabled(g1v1rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1rEnabled, config)
|
||||
}
|
||||
|
||||
// EnableAll() only enables to the group/version level for compatibility
|
||||
config.EnableAll()
|
||||
|
||||
// all unspecified or enabled resources under all groups now enabled
|
||||
if !config.ResourceEnabled(g1v1rUnspecified) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1rUnspecified, config)
|
||||
}
|
||||
if !config.ResourceEnabled(g1v1rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v1rEnabled, config)
|
||||
}
|
||||
if !config.ResourceEnabled(g1v2rUnspecified) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v2rUnspecified, config)
|
||||
}
|
||||
if !config.ResourceEnabled(g1v2rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g1v2rEnabled, config)
|
||||
}
|
||||
if !config.ResourceEnabled(g2v1rUnspecified) {
|
||||
t.Errorf("expected enabled for %v, from %v", g2v1rUnspecified, config)
|
||||
}
|
||||
if !config.ResourceEnabled(g2v1rEnabled) {
|
||||
t.Errorf("expected enabled for %v, from %v", g2v1rEnabled, config)
|
||||
}
|
||||
|
||||
// previously disabled resources are still disabled
|
||||
if config.ResourceEnabled(g1v1rDisabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v1rDisabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g1v2rDisabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g1v2rDisabled, config)
|
||||
}
|
||||
if config.ResourceEnabled(g2v1rDisabled) {
|
||||
t.Errorf("expected disabled for %v, from %v", g2v1rDisabled, config)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAnyVersionForGroupEnabled(t *testing.T) {
|
||||
@ -192,13 +140,39 @@ func TestAnyVersionForGroupEnabled(t *testing.T) {
|
||||
},
|
||||
testGroup: "one",
|
||||
|
||||
expectedResult: true,
|
||||
},
|
||||
{
|
||||
name: "present, and one resource enabled",
|
||||
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,
|
||||
},
|
||||
{
|
||||
name: "present, and one resource under disabled version enabled",
|
||||
creator: func() APIResourceConfigSource {
|
||||
ret := NewResourceConfig()
|
||||
ret.DisableVersions(schema.GroupVersion{Group: "one", Version: "version1"})
|
||||
ret.EnableResources(schema.GroupVersionResource{Group: "one", Version: "version1", Resource: "foo"})
|
||||
return ret
|
||||
},
|
||||
testGroup: "one",
|
||||
|
||||
expectedResult: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
if e, a := tc.expectedResult, tc.creator().AnyVersionForGroupEnabled(tc.testGroup); e != a {
|
||||
t.Errorf("%s: expected %v, got %v", tc.name, e, a)
|
||||
}
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
if e, a := tc.expectedResult, tc.creator().AnyResourceForGroupEnabled(tc.testGroup); e != a {
|
||||
t.Errorf("expected %v, got %v", 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.AnyVersionForGroupEnabled(potentialStorageResource.Group) {
|
||||
if s.APIResourceConfigSource.AnyResourceForGroupEnabled(potentialStorageResource.Group) {
|
||||
return potentialStorageResource
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user