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  }