k8s.io/apiserver@v0.31.1/pkg/server/storage/resource_config.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package storage 18 19 import ( 20 "k8s.io/apimachinery/pkg/runtime/schema" 21 ) 22 23 // APIResourceConfigSource is the interface to determine which groups and versions are enabled 24 type APIResourceConfigSource interface { 25 ResourceEnabled(resource schema.GroupVersionResource) bool 26 AnyResourceForGroupEnabled(group string) bool 27 } 28 29 var _ APIResourceConfigSource = &ResourceConfig{} 30 31 type ResourceConfig struct { 32 GroupVersionConfigs map[schema.GroupVersion]bool 33 ResourceConfigs map[schema.GroupVersionResource]bool 34 } 35 36 func NewResourceConfig() *ResourceConfig { 37 return &ResourceConfig{GroupVersionConfigs: map[schema.GroupVersion]bool{}, ResourceConfigs: map[schema.GroupVersionResource]bool{}} 38 } 39 40 // DisableMatchingVersions disables all group/versions for which the matcher function returns true. 41 // This will remove any preferences previously set on individual resources. 42 func (o *ResourceConfig) DisableMatchingVersions(matcher func(gv schema.GroupVersion) bool) { 43 for version := range o.GroupVersionConfigs { 44 if matcher(version) { 45 o.GroupVersionConfigs[version] = false 46 o.removeMatchingResourcePreferences(resourceMatcherForVersion(version)) 47 } 48 } 49 } 50 51 // EnableMatchingVersions enables all group/versions for which the matcher function returns true. 52 // This will remove any preferences previously set on individual resources. 53 func (o *ResourceConfig) EnableMatchingVersions(matcher func(gv schema.GroupVersion) bool) { 54 for version := range o.GroupVersionConfigs { 55 if matcher(version) { 56 o.GroupVersionConfigs[version] = true 57 o.removeMatchingResourcePreferences(resourceMatcherForVersion(version)) 58 } 59 } 60 } 61 62 // resourceMatcherForVersion matches resources in the specified version 63 func resourceMatcherForVersion(gv schema.GroupVersion) func(gvr schema.GroupVersionResource) bool { 64 return func(gvr schema.GroupVersionResource) bool { 65 return gv == gvr.GroupVersion() 66 } 67 } 68 69 // removeMatchingResourcePreferences removes individual resource preferences that match. This is useful when an override of a version or level enablement should 70 // override the previously individual preferences. 71 func (o *ResourceConfig) removeMatchingResourcePreferences(matcher func(gvr schema.GroupVersionResource) bool) { 72 keysToRemove := []schema.GroupVersionResource{} 73 for k := range o.ResourceConfigs { 74 if matcher(k) { 75 keysToRemove = append(keysToRemove, k) 76 } 77 } 78 for _, k := range keysToRemove { 79 delete(o.ResourceConfigs, k) 80 } 81 } 82 83 // DisableVersions disables the versions entirely. 84 // This will remove any preferences previously set on individual resources. 85 func (o *ResourceConfig) DisableVersions(versions ...schema.GroupVersion) { 86 for _, version := range versions { 87 o.GroupVersionConfigs[version] = false 88 89 // a preference about a version takes priority over the previously set resources 90 o.removeMatchingResourcePreferences(resourceMatcherForVersion(version)) 91 } 92 } 93 94 // EnableVersions enables all resources in a given groupVersion. 95 // This will remove any preferences previously set on individual resources. 96 func (o *ResourceConfig) EnableVersions(versions ...schema.GroupVersion) { 97 for _, version := range versions { 98 o.GroupVersionConfigs[version] = true 99 100 // a preference about a version takes priority over the previously set resources 101 o.removeMatchingResourcePreferences(resourceMatcherForVersion(version)) 102 } 103 104 } 105 106 // TODO this must be removed and we enable/disable individual resources. 107 func (o *ResourceConfig) versionEnabled(version schema.GroupVersion) bool { 108 enabled, _ := o.GroupVersionConfigs[version] 109 return enabled 110 } 111 112 func (o *ResourceConfig) DisableResources(resources ...schema.GroupVersionResource) { 113 for _, resource := range resources { 114 o.ResourceConfigs[resource] = false 115 } 116 } 117 118 func (o *ResourceConfig) EnableResources(resources ...schema.GroupVersionResource) { 119 for _, resource := range resources { 120 o.ResourceConfigs[resource] = true 121 } 122 } 123 124 func (o *ResourceConfig) ResourceEnabled(resource schema.GroupVersionResource) bool { 125 // if a resource is explicitly set, that takes priority over the preference of the version. 126 resourceEnabled, explicitlySet := o.ResourceConfigs[resource] 127 if explicitlySet { 128 return resourceEnabled 129 } 130 131 if !o.versionEnabled(resource.GroupVersion()) { 132 return false 133 } 134 // they are enabled by default. 135 return true 136 } 137 138 func (o *ResourceConfig) AnyResourceForGroupEnabled(group string) bool { 139 for version := range o.GroupVersionConfigs { 140 if version.Group == group { 141 if o.versionEnabled(version) { 142 return true 143 } 144 } 145 } 146 for resource := range o.ResourceConfigs { 147 if resource.Group == group && o.ResourceEnabled(resource) { 148 return true 149 } 150 } 151 152 return false 153 }