resource_config.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package genericapiserver
  14. import (
  15. "k8s.io/kubernetes/pkg/api/unversioned"
  16. "k8s.io/kubernetes/pkg/util/sets"
  17. )
  18. // APIResourceConfigSource is the interface to determine which versions and resources are enabled
  19. type APIResourceConfigSource interface {
  20. AnyVersionOfResourceEnabled(resource unversioned.GroupResource) bool
  21. ResourceEnabled(resource unversioned.GroupVersionResource) bool
  22. AllResourcesForVersionEnabled(version unversioned.GroupVersion) bool
  23. AnyResourcesForVersionEnabled(version unversioned.GroupVersion) bool
  24. AnyResourcesForGroupEnabled(group string) bool
  25. }
  26. // Specifies the overrides for various API group versions.
  27. // This can be used to enable/disable entire group versions or specific resources.
  28. type GroupVersionResourceConfig struct {
  29. // Whether to enable or disable this entire group version. This dominates any enablement check.
  30. // Enable=true means the group version is enabled, and EnabledResources/DisabledResources are considered.
  31. // Enable=false means the group version is disabled, and EnabledResources/DisabledResources are not considered.
  32. Enable bool
  33. // DisabledResources lists the resources that are specifically disabled for a group/version
  34. // DisabledResources trumps EnabledResources
  35. DisabledResources sets.String
  36. // EnabledResources lists the resources that should be enabled by default. This is a little
  37. // unusual, but we need it for compatibility with old code for now. An empty set means
  38. // enable all, a non-empty set means that all other resources are disabled.
  39. EnabledResources sets.String
  40. }
  41. var _ APIResourceConfigSource = &ResourceConfig{}
  42. type ResourceConfig struct {
  43. GroupVersionResourceConfigs map[unversioned.GroupVersion]*GroupVersionResourceConfig
  44. }
  45. func NewResourceConfig() *ResourceConfig {
  46. return &ResourceConfig{GroupVersionResourceConfigs: map[unversioned.GroupVersion]*GroupVersionResourceConfig{}}
  47. }
  48. func NewGroupVersionResourceConfig() *GroupVersionResourceConfig {
  49. return &GroupVersionResourceConfig{Enable: true, DisabledResources: sets.String{}, EnabledResources: sets.String{}}
  50. }
  51. // DisableVersions disables the versions entirely. No resources (even those whitelisted in EnabledResources) will be enabled
  52. func (o *ResourceConfig) DisableVersions(versions ...unversioned.GroupVersion) {
  53. for _, version := range versions {
  54. _, versionExists := o.GroupVersionResourceConfigs[version]
  55. if !versionExists {
  56. o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
  57. }
  58. o.GroupVersionResourceConfigs[version].Enable = false
  59. }
  60. }
  61. func (o *ResourceConfig) EnableVersions(versions ...unversioned.GroupVersion) {
  62. for _, version := range versions {
  63. _, versionExists := o.GroupVersionResourceConfigs[version]
  64. if !versionExists {
  65. o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
  66. }
  67. o.GroupVersionResourceConfigs[version].Enable = true
  68. }
  69. }
  70. func (o *ResourceConfig) DisableResources(resources ...unversioned.GroupVersionResource) {
  71. for _, resource := range resources {
  72. version := resource.GroupVersion()
  73. _, versionExists := o.GroupVersionResourceConfigs[version]
  74. if !versionExists {
  75. o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
  76. }
  77. o.GroupVersionResourceConfigs[version].DisabledResources.Insert(resource.Resource)
  78. }
  79. }
  80. func (o *ResourceConfig) EnableResources(resources ...unversioned.GroupVersionResource) {
  81. for _, resource := range resources {
  82. version := resource.GroupVersion()
  83. _, versionExists := o.GroupVersionResourceConfigs[version]
  84. if !versionExists {
  85. o.GroupVersionResourceConfigs[version] = NewGroupVersionResourceConfig()
  86. }
  87. o.GroupVersionResourceConfigs[version].EnabledResources.Insert(resource.Resource)
  88. o.GroupVersionResourceConfigs[version].DisabledResources.Delete(resource.Resource)
  89. }
  90. }
  91. // AnyResourcesForVersionEnabled only considers matches based on exactly group/resource lexical matching. This means that
  92. // resource renames across versions are NOT considered to be the same resource by this method. You'll need to manually check
  93. // using the ResourceEnabled function.
  94. func (o *ResourceConfig) AnyVersionOfResourceEnabled(resource unversioned.GroupResource) bool {
  95. for version := range o.GroupVersionResourceConfigs {
  96. if version.Group != resource.Group {
  97. continue
  98. }
  99. if o.ResourceEnabled(version.WithResource(resource.Resource)) {
  100. return true
  101. }
  102. }
  103. return false
  104. }
  105. func (o *ResourceConfig) ResourceEnabled(resource unversioned.GroupVersionResource) bool {
  106. versionOverride, versionExists := o.GroupVersionResourceConfigs[resource.GroupVersion()]
  107. if !versionExists {
  108. return false
  109. }
  110. if !versionOverride.Enable {
  111. return false
  112. }
  113. if versionOverride.DisabledResources.Has(resource.Resource) {
  114. return false
  115. }
  116. if len(versionOverride.EnabledResources) > 0 {
  117. return versionOverride.EnabledResources.Has(resource.Resource)
  118. }
  119. return true
  120. }
  121. func (o *ResourceConfig) AllResourcesForVersionEnabled(version unversioned.GroupVersion) bool {
  122. versionOverride, versionExists := o.GroupVersionResourceConfigs[version]
  123. if !versionExists {
  124. return false
  125. }
  126. if !versionOverride.Enable {
  127. return false
  128. }
  129. if len(versionOverride.EnabledResources) == 0 && len(versionOverride.DisabledResources) == 0 {
  130. return true
  131. }
  132. return false
  133. }
  134. func (o *ResourceConfig) AnyResourcesForVersionEnabled(version unversioned.GroupVersion) bool {
  135. versionOverride, versionExists := o.GroupVersionResourceConfigs[version]
  136. if !versionExists {
  137. return false
  138. }
  139. return versionOverride.Enable
  140. }
  141. func (o *ResourceConfig) AnyResourcesForGroupEnabled(group string) bool {
  142. for version := range o.GroupVersionResourceConfigs {
  143. if version.Group == group {
  144. if o.AnyResourcesForVersionEnabled(version) {
  145. return true
  146. }
  147. }
  148. }
  149. return false
  150. }