diff --git a/cmd/kube-controller-manager/app/autoscaling.go b/cmd/kube-controller-manager/app/autoscaling.go index 23540665986..aabfaa03dc9 100644 --- a/cmd/kube-controller-manager/app/autoscaling.go +++ b/cmd/kube-controller-manager/app/autoscaling.go @@ -22,7 +22,6 @@ package app import ( "context" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/dynamic" "k8s.io/client-go/scale" @@ -37,10 +36,6 @@ import ( ) func startHPAController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { - if !controllerContext.AvailableResources[schema.GroupVersionResource{Group: "autoscaling", Version: "v1", Resource: "horizontalpodautoscalers"}] { - return nil, false, nil - } - return startHPAControllerWithRESTClient(ctx, controllerContext) } diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index e0ebfc9dbba..bb387feb970 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -30,7 +30,6 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/uuid" @@ -355,9 +354,6 @@ type ControllerContext struct { // requested. RESTMapper *restmapper.DeferredDiscoveryRESTMapper - // AvailableResources is a map listing currently available resources - AvailableResources map[schema.GroupVersionResource]bool - // Cloud is the cloud provider interface for the controllers to use. // It must be initialized and ready to use. Cloud cloudprovider.Interface @@ -491,35 +487,6 @@ func NewControllerInitializers(loopMode ControllerLoopMode) map[string]InitFunc return controllers } -// GetAvailableResources gets the map which contains all available resources of the apiserver -// TODO: In general, any controller checking this needs to be dynamic so -// users don't have to restart their controller manager if they change the apiserver. -// Until we get there, the structure here needs to be exposed for the construction of a proper ControllerContext. -func GetAvailableResources(clientBuilder clientbuilder.ControllerClientBuilder) (map[schema.GroupVersionResource]bool, error) { - client := clientBuilder.ClientOrDie("controller-discovery") - discoveryClient := client.Discovery() - _, resourceMap, err := discoveryClient.ServerGroupsAndResources() - if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to get all supported resources from server: %v", err)) - } - if len(resourceMap) == 0 { - return nil, fmt.Errorf("unable to get any supported resources from server") - } - - allResources := map[schema.GroupVersionResource]bool{} - for _, apiResourceList := range resourceMap { - version, err := schema.ParseGroupVersion(apiResourceList.GroupVersion) - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList.APIResources { - allResources[version.WithResource(apiResource.Name)] = true - } - } - - return allResources, nil -} - // CreateControllerContext creates a context struct containing references to resources needed by the // controllers such as the cloud provider and clientBuilder. rootClientBuilder is only used for // the shared-informers client and token controller. @@ -544,11 +511,6 @@ func CreateControllerContext(logger klog.Logger, s *config.CompletedConfig, root restMapper.Reset() }, 30*time.Second, stop) - availableResources, err := GetAvailableResources(rootClientBuilder) - if err != nil { - return ControllerContext{}, err - } - cloud, loopMode, err := createCloudProvider(logger, s.ComponentConfig.KubeCloudShared.CloudProvider.Name, s.ComponentConfig.KubeCloudShared.ExternalCloudVolumePlugin, s.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile, s.ComponentConfig.KubeCloudShared.AllowUntaggedCloud, sharedInformers) if err != nil { @@ -561,7 +523,6 @@ func CreateControllerContext(logger klog.Logger, s *config.CompletedConfig, root ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers), ComponentConfig: s.ComponentConfig, RESTMapper: restMapper, - AvailableResources: availableResources, Cloud: cloud, LoopMode: loopMode, InformersStarted: make(chan struct{}), diff --git a/cmd/kube-controller-manager/app/rbac.go b/cmd/kube-controller-manager/app/rbac.go index 020ae38db63..334dc74c012 100644 --- a/cmd/kube-controller-manager/app/rbac.go +++ b/cmd/kube-controller-manager/app/rbac.go @@ -19,15 +19,11 @@ package app import ( "context" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/controller-manager/controller" "k8s.io/kubernetes/pkg/controller/clusterroleaggregation" ) func startClusterRoleAggregrationController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { - if !controllerContext.AvailableResources[schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterroles"}] { - return nil, false, nil - } go clusterroleaggregation.NewClusterRoleAggregation( controllerContext.InformerFactory.Rbac().V1().ClusterRoles(), controllerContext.ClientBuilder.ClientOrDie("clusterrole-aggregation-controller").RbacV1(), diff --git a/cmd/kube-controller-manager/app/validatingadmissionpolicystatus.go b/cmd/kube-controller-manager/app/validatingadmissionpolicystatus.go index 10e99b73591..833d24d77f7 100644 --- a/cmd/kube-controller-manager/app/validatingadmissionpolicystatus.go +++ b/cmd/kube-controller-manager/app/validatingadmissionpolicystatus.go @@ -19,7 +19,6 @@ package app import ( "context" - admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" pluginvalidatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy" "k8s.io/apiserver/pkg/cel/openapi/resolver" "k8s.io/client-go/kubernetes/scheme" @@ -28,14 +27,8 @@ import ( "k8s.io/kubernetes/pkg/generated/openapi" ) -var validatingAdmissionPolicyResource = admissionregistrationv1beta1.SchemeGroupVersion.WithResource("validatingadmissionpolicies") - func startValidatingAdmissionPolicyStatusController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { - // intended check against served resource but not feature gate. // KCM won't start the controller without the feature gate set. - if !controllerContext.AvailableResources[validatingAdmissionPolicyResource] { - return nil, false, nil - } typeChecker := &pluginvalidatingadmissionpolicy.TypeChecker{ SchemaResolver: resolver.NewDefinitionsSchemaResolver(scheme.Scheme, openapi.GetOpenAPIDefinitions), RestMapper: controllerContext.RESTMapper, diff --git a/staging/src/k8s.io/cloud-provider/app/controllermanager.go b/staging/src/k8s.io/cloud-provider/app/controllermanager.go index ee869578e59..56fd0053136 100644 --- a/staging/src/k8s.io/cloud-provider/app/controllermanager.go +++ b/staging/src/k8s.io/cloud-provider/app/controllermanager.go @@ -26,7 +26,6 @@ import ( "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/uuid" @@ -492,17 +491,11 @@ func CreateControllerContext(s *cloudcontrollerconfig.CompletedConfig, clientBui restMapper.Reset() }, 30*time.Second, stop) - availableResources, err := GetAvailableResources(clientBuilder) - if err != nil { - return genericcontrollermanager.ControllerContext{}, err - } - ctx := genericcontrollermanager.ControllerContext{ ClientBuilder: clientBuilder, InformerFactory: sharedInformers, ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers), RESTMapper: restMapper, - AvailableResources: availableResources, Stop: stop, InformersStarted: make(chan struct{}), ResyncPeriod: ResyncPeriod(s), @@ -512,35 +505,6 @@ func CreateControllerContext(s *cloudcontrollerconfig.CompletedConfig, clientBui return ctx, nil } -// GetAvailableResources gets the map which contains all available resources of the apiserver -// TODO: In general, any controller checking this needs to be dynamic so -// users don't have to restart their controller manager if they change the apiserver. -// Until we get there, the structure here needs to be exposed for the construction of a proper ControllerContext. -func GetAvailableResources(clientBuilder clientbuilder.ControllerClientBuilder) (map[schema.GroupVersionResource]bool, error) { - client := clientBuilder.ClientOrDie("controller-discovery") - discoveryClient := client.Discovery() - _, resourceMap, err := discoveryClient.ServerGroupsAndResources() - if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to get all supported resources from server: %v", err)) - } - if len(resourceMap) == 0 { - return nil, fmt.Errorf("unable to get any supported resources from server") - } - - allResources := map[schema.GroupVersionResource]bool{} - for _, apiResourceList := range resourceMap { - version, err := schema.ParseGroupVersion(apiResourceList.GroupVersion) - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList.APIResources { - allResources[version.WithResource(apiResource.Name)] = true - } - } - - return allResources, nil -} - // ResyncPeriod returns a function which generates a duration each time it is // invoked; this is so that multiple controllers don't get into lock-step and all // hammer the apiserver with list requests simultaneously. diff --git a/staging/src/k8s.io/controller-manager/app/controllercontext.go b/staging/src/k8s.io/controller-manager/app/controllercontext.go index a1b940d3d35..d3e108f12fb 100644 --- a/staging/src/k8s.io/controller-manager/app/controllercontext.go +++ b/staging/src/k8s.io/controller-manager/app/controllercontext.go @@ -19,7 +19,6 @@ package app import ( "time" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/informers" "k8s.io/client-go/restmapper" controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers" @@ -46,9 +45,6 @@ type ControllerContext struct { // requested. RESTMapper *restmapper.DeferredDiscoveryRESTMapper - // AvailableResources is a map listing currently available resources - AvailableResources map[schema.GroupVersionResource]bool - // Stop is the stop channel Stop <-chan struct{}