mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #95885 from jiahuif/refactor/controller-manager
refactor: controller manager: InitFunc and base controller interface.
This commit is contained in:
		@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
@@ -31,6 +30,7 @@ import (
 | 
				
			|||||||
	"k8s.io/cloud-provider/app"
 | 
						"k8s.io/cloud-provider/app"
 | 
				
			||||||
	cloudcontrollerconfig "k8s.io/cloud-provider/app/config"
 | 
						cloudcontrollerconfig "k8s.io/cloud-provider/app/config"
 | 
				
			||||||
	genericcontrollermanager "k8s.io/controller-manager/app"
 | 
						genericcontrollermanager "k8s.io/controller-manager/app"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/features"
 | 
						"k8s.io/controller-manager/pkg/features"
 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	nodeipamcontrolleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
 | 
						nodeipamcontrolleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
 | 
				
			||||||
@@ -59,12 +59,12 @@ func (nodeIpamController *nodeIPAMController) StartNodeIpamControllerWrapper(ini
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	nodeIpamController.nodeIPAMControllerOptions.ApplyTo(&nodeIpamController.nodeIPAMControllerConfiguration)
 | 
						nodeIpamController.nodeIPAMControllerOptions.ApplyTo(&nodeIpamController.nodeIPAMControllerConfiguration)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
 | 
						return func(ctx genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
		return startNodeIpamController(initContext, completedConfig, nodeIpamController.nodeIPAMControllerConfiguration, ctx, cloud)
 | 
							return startNodeIpamController(initContext, completedConfig, nodeIpamController.nodeIPAMControllerConfiguration, ctx, cloud)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startNodeIpamController(initContext app.ControllerInitContext, ccmConfig *cloudcontrollerconfig.CompletedConfig, nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration, ctx genericcontrollermanager.ControllerContext, cloud cloudprovider.Interface) (http.Handler, bool, error) {
 | 
					func startNodeIpamController(initContext app.ControllerInitContext, ccmConfig *cloudcontrollerconfig.CompletedConfig, nodeIPAMConfig nodeipamconfig.NodeIPAMControllerConfiguration, ctx genericcontrollermanager.ControllerContext, cloud cloudprovider.Interface) (controller.Interface, bool, error) {
 | 
				
			||||||
	var serviceCIDR *net.IPNet
 | 
						var serviceCIDR *net.IPNet
 | 
				
			||||||
	var secondaryServiceCIDR *net.IPNet
 | 
						var secondaryServiceCIDR *net.IPNet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,17 +22,17 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/client-go/util/flowcontrol"
 | 
						"k8s.io/client-go/util/flowcontrol"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/daemon"
 | 
						"k8s.io/kubernetes/pkg/controller/daemon"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/deployment"
 | 
						"k8s.io/kubernetes/pkg/controller/deployment"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/replicaset"
 | 
						"k8s.io/kubernetes/pkg/controller/replicaset"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/statefulset"
 | 
						"k8s.io/kubernetes/pkg/controller/statefulset"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startDaemonSetController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startDaemonSetController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	dsc, err := daemon.NewDaemonSetsController(
 | 
						dsc, err := daemon.NewDaemonSetsController(
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().DaemonSets(),
 | 
							ctx.InformerFactory.Apps().V1().DaemonSets(),
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().ControllerRevisions(),
 | 
							ctx.InformerFactory.Apps().V1().ControllerRevisions(),
 | 
				
			||||||
@@ -48,7 +48,7 @@ func startDaemonSetController(ctx ControllerContext) (http.Handler, bool, error)
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startStatefulSetController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startStatefulSetController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go statefulset.NewStatefulSetController(
 | 
						go statefulset.NewStatefulSetController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().StatefulSets(),
 | 
							ctx.InformerFactory.Apps().V1().StatefulSets(),
 | 
				
			||||||
@@ -59,7 +59,7 @@ func startStatefulSetController(ctx ControllerContext) (http.Handler, bool, erro
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startReplicaSetController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startReplicaSetController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go replicaset.NewReplicaSetController(
 | 
						go replicaset.NewReplicaSetController(
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().ReplicaSets(),
 | 
							ctx.InformerFactory.Apps().V1().ReplicaSets(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
@@ -69,7 +69,7 @@ func startReplicaSetController(ctx ControllerContext) (http.Handler, bool, error
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startDeploymentController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startDeploymentController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	dc, err := deployment.NewDeploymentController(
 | 
						dc, err := deployment.NewDeploymentController(
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().Deployments(),
 | 
							ctx.InformerFactory.Apps().V1().Deployments(),
 | 
				
			||||||
		ctx.InformerFactory.Apps().V1().ReplicaSets(),
 | 
							ctx.InformerFactory.Apps().V1().ReplicaSets(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,11 +21,10 @@ limitations under the License.
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
	"k8s.io/client-go/dynamic"
 | 
						"k8s.io/client-go/dynamic"
 | 
				
			||||||
	"k8s.io/client-go/scale"
 | 
						"k8s.io/client-go/scale"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/podautoscaler"
 | 
						"k8s.io/kubernetes/pkg/controller/podautoscaler"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/podautoscaler/metrics"
 | 
						"k8s.io/kubernetes/pkg/controller/podautoscaler/metrics"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,7 +33,7 @@ import (
 | 
				
			|||||||
	"k8s.io/metrics/pkg/client/external_metrics"
 | 
						"k8s.io/metrics/pkg/client/external_metrics"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startHPAController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startHPAController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.AvailableResources[schema.GroupVersionResource{Group: "autoscaling", Version: "v1", Resource: "horizontalpodautoscalers"}] {
 | 
						if !ctx.AvailableResources[schema.GroupVersionResource{Group: "autoscaling", Version: "v1", Resource: "horizontalpodautoscalers"}] {
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -42,7 +41,7 @@ func startHPAController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return startHPAControllerWithRESTClient(ctx)
 | 
						return startHPAControllerWithRESTClient(ctx)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startHPAControllerWithRESTClient(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startHPAControllerWithRESTClient(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	clientConfig := ctx.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
 | 
						clientConfig := ctx.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
 | 
				
			||||||
	hpaClient := ctx.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
 | 
						hpaClient := ctx.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -62,7 +61,7 @@ func startHPAControllerWithRESTClient(ctx ControllerContext) (http.Handler, bool
 | 
				
			|||||||
	return startHPAControllerWithMetricsClient(ctx, metricsClient)
 | 
						return startHPAControllerWithMetricsClient(ctx, metricsClient)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startHPAControllerWithMetricsClient(ctx ControllerContext, metricsClient metrics.MetricsClient) (http.Handler, bool, error) {
 | 
					func startHPAControllerWithMetricsClient(ctx ControllerContext, metricsClient metrics.MetricsClient) (controller.Interface, bool, error) {
 | 
				
			||||||
	hpaClient := ctx.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
 | 
						hpaClient := ctx.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
 | 
				
			||||||
	hpaClientConfig := ctx.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
 | 
						hpaClientConfig := ctx.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,15 +22,15 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/cronjob"
 | 
						"k8s.io/kubernetes/pkg/controller/cronjob"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/job"
 | 
						"k8s.io/kubernetes/pkg/controller/job"
 | 
				
			||||||
	kubefeatures "k8s.io/kubernetes/pkg/features"
 | 
						kubefeatures "k8s.io/kubernetes/pkg/features"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startJobController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startJobController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go job.NewController(
 | 
						go job.NewController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
		ctx.InformerFactory.Batch().V1().Jobs(),
 | 
							ctx.InformerFactory.Batch().V1().Jobs(),
 | 
				
			||||||
@@ -39,7 +39,7 @@ func startJobController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCronJobController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startCronJobController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CronJobControllerV2) {
 | 
						if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CronJobControllerV2) {
 | 
				
			||||||
		cj2c, err := cronjob.NewControllerV2(ctx.InformerFactory.Batch().V1().Jobs(),
 | 
							cj2c, err := cronjob.NewControllerV2(ctx.InformerFactory.Batch().V1().Jobs(),
 | 
				
			||||||
			ctx.InformerFactory.Batch().V1().CronJobs(),
 | 
								ctx.InformerFactory.Batch().V1().CronJobs(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,11 @@ package app
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"net/http"
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/bootstrap"
 | 
						"k8s.io/kubernetes/pkg/controller/bootstrap"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startBootstrapSignerController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startBootstrapSignerController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	bsc, err := bootstrap.NewSigner(
 | 
						bsc, err := bootstrap.NewSigner(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("bootstrap-signer"),
 | 
							ctx.ClientBuilder.ClientOrDie("bootstrap-signer"),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Secrets(),
 | 
							ctx.InformerFactory.Core().V1().Secrets(),
 | 
				
			||||||
@@ -38,7 +37,7 @@ func startBootstrapSignerController(ctx ControllerContext) (http.Handler, bool,
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startTokenCleanerController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startTokenCleanerController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	tcc, err := bootstrap.NewTokenCleaner(
 | 
						tcc, err := bootstrap.NewTokenCleaner(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("token-cleaner"),
 | 
							ctx.ClientBuilder.ClientOrDie("token-cleaner"),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Secrets(),
 | 
							ctx.InformerFactory.Core().V1().Secrets(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,8 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/certificates/approver"
 | 
						"k8s.io/kubernetes/pkg/controller/certificates/approver"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/certificates/cleaner"
 | 
						"k8s.io/kubernetes/pkg/controller/certificates/cleaner"
 | 
				
			||||||
@@ -32,7 +32,7 @@ import (
 | 
				
			|||||||
	csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
 | 
						csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCSRSigningController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startCSRSigningController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	missingSingleSigningFile := ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile == "" || ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile == ""
 | 
						missingSingleSigningFile := ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile == "" || ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile == ""
 | 
				
			||||||
	if missingSingleSigningFile && !anySpecificFilesSet(ctx.ComponentConfig.CSRSigningController) {
 | 
						if missingSingleSigningFile && !anySpecificFilesSet(ctx.ComponentConfig.CSRSigningController) {
 | 
				
			||||||
		klog.V(2).Info("skipping CSR signer controller because no csr cert/key was specified")
 | 
							klog.V(2).Info("skipping CSR signer controller because no csr cert/key was specified")
 | 
				
			||||||
@@ -147,7 +147,7 @@ func getLegacyUnknownSignerFiles(config csrsigningconfig.CSRSigningControllerCon
 | 
				
			|||||||
	return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
						return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCSRApprovingController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startCSRApprovingController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	approver := approver.NewCSRApprovingController(
 | 
						approver := approver.NewCSRApprovingController(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("certificate-controller"),
 | 
							ctx.ClientBuilder.ClientOrDie("certificate-controller"),
 | 
				
			||||||
		ctx.InformerFactory.Certificates().V1().CertificateSigningRequests(),
 | 
							ctx.InformerFactory.Certificates().V1().CertificateSigningRequests(),
 | 
				
			||||||
@@ -157,7 +157,7 @@ func startCSRApprovingController(ctx ControllerContext) (http.Handler, bool, err
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCSRCleanerController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startCSRCleanerController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	cleaner := cleaner.NewCSRCleanerController(
 | 
						cleaner := cleaner.NewCSRCleanerController(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("certificate-controller").CertificatesV1().CertificateSigningRequests(),
 | 
							ctx.ClientBuilder.ClientOrDie("certificate-controller").CertificatesV1().CertificateSigningRequests(),
 | 
				
			||||||
		ctx.InformerFactory.Certificates().V1().CertificateSigningRequests(),
 | 
							ctx.InformerFactory.Certificates().V1().CertificateSigningRequests(),
 | 
				
			||||||
@@ -166,7 +166,7 @@ func startCSRCleanerController(ctx ControllerContext) (http.Handler, bool, error
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startRootCACertPublisher(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startRootCACertPublisher(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		rootCA []byte
 | 
							rootCA []byte
 | 
				
			||||||
		err    error
 | 
							err    error
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ import (
 | 
				
			|||||||
	"k8s.io/component-base/version"
 | 
						"k8s.io/component-base/version"
 | 
				
			||||||
	"k8s.io/component-base/version/verflag"
 | 
						"k8s.io/component-base/version/verflag"
 | 
				
			||||||
	genericcontrollermanager "k8s.io/controller-manager/app"
 | 
						genericcontrollermanager "k8s.io/controller-manager/app"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/clientbuilder"
 | 
						"k8s.io/controller-manager/pkg/clientbuilder"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/informerfactory"
 | 
						"k8s.io/controller-manager/pkg/informerfactory"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/leadermigration"
 | 
						"k8s.io/controller-manager/pkg/leadermigration"
 | 
				
			||||||
@@ -262,7 +263,7 @@ func Run(c *config.CompletedConfig, stopCh <-chan struct{}) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Wrap saTokenControllerInitFunc to signal readiness for migration after starting
 | 
							// Wrap saTokenControllerInitFunc to signal readiness for migration after starting
 | 
				
			||||||
		//  the controller.
 | 
							//  the controller.
 | 
				
			||||||
		startSATokenController = func(ctx ControllerContext) (http.Handler, bool, error) {
 | 
							startSATokenController = func(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
			defer close(leaderMigrator.MigrationReady)
 | 
								defer close(leaderMigrator.MigrationReady)
 | 
				
			||||||
			return saTokenControllerInitFunc(ctx)
 | 
								return saTokenControllerInitFunc(ctx)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -367,10 +368,14 @@ func (c ControllerContext) IsControllerEnabled(name string) bool {
 | 
				
			|||||||
	return genericcontrollermanager.IsControllerEnabled(name, ControllersDisabledByDefault, c.ComponentConfig.Generic.Controllers)
 | 
						return genericcontrollermanager.IsControllerEnabled(name, ControllersDisabledByDefault, c.ComponentConfig.Generic.Controllers)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitFunc is used to launch a particular controller.  It may run additional "should I activate checks".
 | 
					// InitFunc is used to launch a particular controller. It returns a controller
 | 
				
			||||||
 | 
					// that can optionally implement other interfaces so that the controller manager
 | 
				
			||||||
 | 
					// can support the requested features.
 | 
				
			||||||
 | 
					// The returned controller may be nil, which will be considered an anonymous controller
 | 
				
			||||||
 | 
					// that requests no additional features from the controller manager.
 | 
				
			||||||
// Any error returned will cause the controller process to `Fatal`
 | 
					// Any error returned will cause the controller process to `Fatal`
 | 
				
			||||||
// The bool indicates whether the controller was enabled.
 | 
					// The bool indicates whether the controller was enabled.
 | 
				
			||||||
type InitFunc func(ctx ControllerContext) (debuggingHandler http.Handler, enabled bool, err error)
 | 
					type InitFunc func(ctx ControllerContext) (controller controller.Interface, enabled bool, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ControllerInitializersFunc is used to create a collection of initializers
 | 
					// ControllerInitializersFunc is used to create a collection of initializers
 | 
				
			||||||
//  given the loopMode.
 | 
					//  given the loopMode.
 | 
				
			||||||
@@ -560,7 +565,7 @@ func StartControllers(ctx ControllerContext, startSATokenController InitFunc, co
 | 
				
			|||||||
		time.Sleep(wait.Jitter(ctx.ComponentConfig.Generic.ControllerStartInterval.Duration, ControllerStartJitter))
 | 
							time.Sleep(wait.Jitter(ctx.ComponentConfig.Generic.ControllerStartInterval.Duration, ControllerStartJitter))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		klog.V(1).Infof("Starting %q", controllerName)
 | 
							klog.V(1).Infof("Starting %q", controllerName)
 | 
				
			||||||
		debugHandler, started, err := initFn(ctx)
 | 
							ctrl, started, err := initFn(ctx)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			klog.Errorf("Error starting %q", controllerName)
 | 
								klog.Errorf("Error starting %q", controllerName)
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -569,11 +574,17 @@ func StartControllers(ctx ControllerContext, startSATokenController InitFunc, co
 | 
				
			|||||||
			klog.Warningf("Skipping %q", controllerName)
 | 
								klog.Warningf("Skipping %q", controllerName)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if debugHandler != nil && unsecuredMux != nil {
 | 
							if ctrl != nil {
 | 
				
			||||||
 | 
								// check if the controller supports and requests a debugHandler
 | 
				
			||||||
 | 
								// and it needs the unsecuredMux to mount the handler onto.
 | 
				
			||||||
 | 
								if debuggable, ok := ctrl.(controller.Debuggable); ok && unsecuredMux != nil {
 | 
				
			||||||
 | 
									if debugHandler := debuggable.DebuggingHandler(); debugHandler != nil {
 | 
				
			||||||
					basePath := "/debug/controllers/" + controllerName
 | 
										basePath := "/debug/controllers/" + controllerName
 | 
				
			||||||
					unsecuredMux.UnlistedHandle(basePath, http.StripPrefix(basePath, debugHandler))
 | 
										unsecuredMux.UnlistedHandle(basePath, http.StripPrefix(basePath, debugHandler))
 | 
				
			||||||
					unsecuredMux.UnlistedHandlePrefix(basePath+"/", http.StripPrefix(basePath, debugHandler))
 | 
										unsecuredMux.UnlistedHandlePrefix(basePath+"/", http.StripPrefix(basePath, debugHandler))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		klog.Infof("Started %q", controllerName)
 | 
							klog.Infof("Started %q", controllerName)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -587,7 +598,7 @@ type serviceAccountTokenControllerStarter struct {
 | 
				
			|||||||
	rootClientBuilder clientbuilder.ControllerClientBuilder
 | 
						rootClientBuilder clientbuilder.ControllerClientBuilder
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c serviceAccountTokenControllerStarter) startServiceAccountTokenController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func (c serviceAccountTokenControllerStarter) startServiceAccountTokenController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.IsControllerEnabled(saTokenControllerName) {
 | 
						if !ctx.IsControllerEnabled(saTokenControllerName) {
 | 
				
			||||||
		klog.Warningf("%q is disabled", saTokenControllerName)
 | 
							klog.Warningf("%q is disabled", saTokenControllerName)
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,6 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,9 +40,10 @@ import (
 | 
				
			|||||||
	routecontroller "k8s.io/cloud-provider/controllers/route"
 | 
						routecontroller "k8s.io/cloud-provider/controllers/route"
 | 
				
			||||||
	servicecontroller "k8s.io/cloud-provider/controllers/service"
 | 
						servicecontroller "k8s.io/cloud-provider/controllers/service"
 | 
				
			||||||
	"k8s.io/component-base/metrics/prometheus/ratelimiter"
 | 
						"k8s.io/component-base/metrics/prometheus/ratelimiter"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	csitrans "k8s.io/csi-translation-lib"
 | 
						csitrans "k8s.io/csi-translation-lib"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
 | 
						"k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller"
 | 
						pkgcontroller "k8s.io/kubernetes/pkg/controller"
 | 
				
			||||||
	endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint"
 | 
						endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/garbagecollector"
 | 
						"k8s.io/kubernetes/pkg/controller/garbagecollector"
 | 
				
			||||||
	namespacecontroller "k8s.io/kubernetes/pkg/controller/namespace"
 | 
						namespacecontroller "k8s.io/kubernetes/pkg/controller/namespace"
 | 
				
			||||||
@@ -77,7 +77,7 @@ const (
 | 
				
			|||||||
	defaultNodeMaskCIDRIPv6 = 64
 | 
						defaultNodeMaskCIDRIPv6 = 64
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startServiceController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startServiceController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	serviceController, err := servicecontroller.New(
 | 
						serviceController, err := servicecontroller.New(
 | 
				
			||||||
		ctx.Cloud,
 | 
							ctx.Cloud,
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("service-controller"),
 | 
							ctx.ClientBuilder.ClientOrDie("service-controller"),
 | 
				
			||||||
@@ -95,7 +95,7 @@ func startServiceController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startNodeIpamController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startNodeIpamController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	var serviceCIDR *net.IPNet
 | 
						var serviceCIDR *net.IPNet
 | 
				
			||||||
	var secondaryServiceCIDR *net.IPNet
 | 
						var secondaryServiceCIDR *net.IPNet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -192,7 +192,7 @@ func startNodeIpamController(ctx ControllerContext) (http.Handler, bool, error)
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startNodeLifecycleController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startNodeLifecycleController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	lifecycleController, err := lifecyclecontroller.NewNodeLifecycleController(
 | 
						lifecycleController, err := lifecyclecontroller.NewNodeLifecycleController(
 | 
				
			||||||
		ctx.InformerFactory.Coordination().V1().Leases(),
 | 
							ctx.InformerFactory.Coordination().V1().Leases(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
@@ -217,7 +217,7 @@ func startNodeLifecycleController(ctx ControllerContext) (http.Handler, bool, er
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCloudNodeLifecycleController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startCloudNodeLifecycleController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
 | 
						cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Nodes(),
 | 
							ctx.InformerFactory.Core().V1().Nodes(),
 | 
				
			||||||
		// cloud node lifecycle controller uses existing cluster role from node-controller
 | 
							// cloud node lifecycle controller uses existing cluster role from node-controller
 | 
				
			||||||
@@ -236,7 +236,7 @@ func startCloudNodeLifecycleController(ctx ControllerContext) (http.Handler, boo
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startRouteController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startRouteController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs || !ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes {
 | 
						if !ctx.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs || !ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes {
 | 
				
			||||||
		klog.Infof("Will not configure cloud provider routes for allocate-node-cidrs: %v, configure-cloud-routes: %v.", ctx.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs, ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes)
 | 
							klog.Infof("Will not configure cloud provider routes for allocate-node-cidrs: %v, configure-cloud-routes: %v.", ctx.ComponentConfig.KubeCloudShared.AllocateNodeCIDRs, ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes)
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
@@ -281,7 +281,7 @@ func startRouteController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startPersistentVolumeBinderController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startPersistentVolumeBinderController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	plugins, err := ProbeControllerVolumePlugins(ctx.Cloud, ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration)
 | 
						plugins, err := ProbeControllerVolumePlugins(ctx.Cloud, ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, true, fmt.Errorf("failed to probe volume plugins when starting persistentvolume controller: %v", err)
 | 
							return nil, true, fmt.Errorf("failed to probe volume plugins when starting persistentvolume controller: %v", err)
 | 
				
			||||||
@@ -314,7 +314,7 @@ func startPersistentVolumeBinderController(ctx ControllerContext) (http.Handler,
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startAttachDetachController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startAttachDetachController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if ctx.ComponentConfig.AttachDetachController.ReconcilerSyncLoopPeriod.Duration < time.Second {
 | 
						if ctx.ComponentConfig.AttachDetachController.ReconcilerSyncLoopPeriod.Duration < time.Second {
 | 
				
			||||||
		return nil, true, fmt.Errorf("duration time must be greater than one second as set via command line option reconcile-sync-loop-period")
 | 
							return nil, true, fmt.Errorf("duration time must be greater than one second as set via command line option reconcile-sync-loop-period")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -359,7 +359,7 @@ func startAttachDetachController(ctx ControllerContext) (http.Handler, bool, err
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startVolumeExpandController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startVolumeExpandController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) {
 | 
						if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) {
 | 
				
			||||||
		plugins, err := ProbeExpandableVolumePlugins(ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration)
 | 
							plugins, err := ProbeExpandableVolumePlugins(ctx.ComponentConfig.PersistentVolumeBinderController.VolumeConfiguration)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -392,7 +392,7 @@ func startVolumeExpandController(ctx ControllerContext) (http.Handler, bool, err
 | 
				
			|||||||
	return nil, false, nil
 | 
						return nil, false, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startEphemeralVolumeController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startEphemeralVolumeController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) {
 | 
						if utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) {
 | 
				
			||||||
		ephemeralController, err := ephemeral.NewController(
 | 
							ephemeralController, err := ephemeral.NewController(
 | 
				
			||||||
			ctx.ClientBuilder.ClientOrDie("ephemeral-volume-controller"),
 | 
								ctx.ClientBuilder.ClientOrDie("ephemeral-volume-controller"),
 | 
				
			||||||
@@ -407,7 +407,7 @@ func startEphemeralVolumeController(ctx ControllerContext) (http.Handler, bool,
 | 
				
			|||||||
	return nil, false, nil
 | 
						return nil, false, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startEndpointController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startEndpointController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go endpointcontroller.NewEndpointController(
 | 
						go endpointcontroller.NewEndpointController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Services(),
 | 
							ctx.InformerFactory.Core().V1().Services(),
 | 
				
			||||||
@@ -418,7 +418,7 @@ func startEndpointController(ctx ControllerContext) (http.Handler, bool, error)
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startReplicationController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startReplicationController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go replicationcontroller.NewReplicationManager(
 | 
						go replicationcontroller.NewReplicationManager(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().ReplicationControllers(),
 | 
							ctx.InformerFactory.Core().V1().ReplicationControllers(),
 | 
				
			||||||
@@ -428,7 +428,7 @@ func startReplicationController(ctx ControllerContext) (http.Handler, bool, erro
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startPodGCController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startPodGCController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go podgc.NewPodGC(
 | 
						go podgc.NewPodGC(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("pod-garbage-collector"),
 | 
							ctx.ClientBuilder.ClientOrDie("pod-garbage-collector"),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
@@ -438,7 +438,7 @@ func startPodGCController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startResourceQuotaController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startResourceQuotaController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	resourceQuotaControllerClient := ctx.ClientBuilder.ClientOrDie("resourcequota-controller")
 | 
						resourceQuotaControllerClient := ctx.ClientBuilder.ClientOrDie("resourcequota-controller")
 | 
				
			||||||
	resourceQuotaControllerDiscoveryClient := ctx.ClientBuilder.DiscoveryClientOrDie("resourcequota-controller")
 | 
						resourceQuotaControllerDiscoveryClient := ctx.ClientBuilder.DiscoveryClientOrDie("resourcequota-controller")
 | 
				
			||||||
	discoveryFunc := resourceQuotaControllerDiscoveryClient.ServerPreferredNamespacedResources
 | 
						discoveryFunc := resourceQuotaControllerDiscoveryClient.ServerPreferredNamespacedResources
 | 
				
			||||||
@@ -448,7 +448,7 @@ func startResourceQuotaController(ctx ControllerContext) (http.Handler, bool, er
 | 
				
			|||||||
	resourceQuotaControllerOptions := &resourcequotacontroller.ControllerOptions{
 | 
						resourceQuotaControllerOptions := &resourcequotacontroller.ControllerOptions{
 | 
				
			||||||
		QuotaClient:               resourceQuotaControllerClient.CoreV1(),
 | 
							QuotaClient:               resourceQuotaControllerClient.CoreV1(),
 | 
				
			||||||
		ResourceQuotaInformer:     ctx.InformerFactory.Core().V1().ResourceQuotas(),
 | 
							ResourceQuotaInformer:     ctx.InformerFactory.Core().V1().ResourceQuotas(),
 | 
				
			||||||
		ResyncPeriod:              controller.StaticResyncPeriodFunc(ctx.ComponentConfig.ResourceQuotaController.ResourceQuotaSyncPeriod.Duration),
 | 
							ResyncPeriod:              pkgcontroller.StaticResyncPeriodFunc(ctx.ComponentConfig.ResourceQuotaController.ResourceQuotaSyncPeriod.Duration),
 | 
				
			||||||
		InformerFactory:           ctx.ObjectOrMetadataInformerFactory,
 | 
							InformerFactory:           ctx.ObjectOrMetadataInformerFactory,
 | 
				
			||||||
		ReplenishmentResyncPeriod: ctx.ResyncPeriod,
 | 
							ReplenishmentResyncPeriod: ctx.ResyncPeriod,
 | 
				
			||||||
		DiscoveryFunc:             discoveryFunc,
 | 
							DiscoveryFunc:             discoveryFunc,
 | 
				
			||||||
@@ -474,7 +474,7 @@ func startResourceQuotaController(ctx ControllerContext) (http.Handler, bool, er
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startNamespaceController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startNamespaceController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	// the namespace cleanup controller is very chatty.  It makes lots of discovery calls and then it makes lots of delete calls
 | 
						// the namespace cleanup controller is very chatty.  It makes lots of discovery calls and then it makes lots of delete calls
 | 
				
			||||||
	// the ratelimiter negatively affects its speed.  Deleting 100 total items in a namespace (that's only a few of each resource
 | 
						// the ratelimiter negatively affects its speed.  Deleting 100 total items in a namespace (that's only a few of each resource
 | 
				
			||||||
	// including events), takes ~10 seconds by default.
 | 
						// including events), takes ~10 seconds by default.
 | 
				
			||||||
@@ -485,7 +485,7 @@ func startNamespaceController(ctx ControllerContext) (http.Handler, bool, error)
 | 
				
			|||||||
	return startModifiedNamespaceController(ctx, namespaceKubeClient, nsKubeconfig)
 | 
						return startModifiedNamespaceController(ctx, namespaceKubeClient, nsKubeconfig)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startModifiedNamespaceController(ctx ControllerContext, namespaceKubeClient clientset.Interface, nsKubeconfig *restclient.Config) (http.Handler, bool, error) {
 | 
					func startModifiedNamespaceController(ctx ControllerContext, namespaceKubeClient clientset.Interface, nsKubeconfig *restclient.Config) (controller.Interface, bool, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	metadataClient, err := metadata.NewForConfig(nsKubeconfig)
 | 
						metadataClient, err := metadata.NewForConfig(nsKubeconfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -507,7 +507,7 @@ func startModifiedNamespaceController(ctx ControllerContext, namespaceKubeClient
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startServiceAccountController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startServiceAccountController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	sac, err := serviceaccountcontroller.NewServiceAccountsController(
 | 
						sac, err := serviceaccountcontroller.NewServiceAccountsController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().ServiceAccounts(),
 | 
							ctx.InformerFactory.Core().V1().ServiceAccounts(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Namespaces(),
 | 
							ctx.InformerFactory.Core().V1().Namespaces(),
 | 
				
			||||||
@@ -521,7 +521,7 @@ func startServiceAccountController(ctx ControllerContext) (http.Handler, bool, e
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startTTLController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startTTLController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go ttlcontroller.NewTTLController(
 | 
						go ttlcontroller.NewTTLController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Nodes(),
 | 
							ctx.InformerFactory.Core().V1().Nodes(),
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("ttl-controller"),
 | 
							ctx.ClientBuilder.ClientOrDie("ttl-controller"),
 | 
				
			||||||
@@ -529,7 +529,7 @@ func startTTLController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startGarbageCollectorController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startGarbageCollectorController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.ComponentConfig.GarbageCollectorController.EnableGarbageCollector {
 | 
						if !ctx.ComponentConfig.GarbageCollectorController.EnableGarbageCollector {
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -567,10 +567,10 @@ func startGarbageCollectorController(ctx ControllerContext) (http.Handler, bool,
 | 
				
			|||||||
	// the garbage collector.
 | 
						// the garbage collector.
 | 
				
			||||||
	go garbageCollector.Sync(discoveryClient, 30*time.Second, ctx.Stop)
 | 
						go garbageCollector.Sync(discoveryClient, 30*time.Second, ctx.Stop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return garbagecollector.NewDebugHandler(garbageCollector), true, nil
 | 
						return garbageCollector, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startPVCProtectionController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startPVCProtectionController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	pvcProtectionController, err := pvcprotection.NewPVCProtectionController(
 | 
						pvcProtectionController, err := pvcprotection.NewPVCProtectionController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().PersistentVolumeClaims(),
 | 
							ctx.InformerFactory.Core().V1().PersistentVolumeClaims(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
@@ -585,7 +585,7 @@ func startPVCProtectionController(ctx ControllerContext) (http.Handler, bool, er
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startPVProtectionController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startPVProtectionController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go pvprotection.NewPVProtectionController(
 | 
						go pvprotection.NewPVProtectionController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().PersistentVolumes(),
 | 
							ctx.InformerFactory.Core().V1().PersistentVolumes(),
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("pv-protection-controller"),
 | 
							ctx.ClientBuilder.ClientOrDie("pv-protection-controller"),
 | 
				
			||||||
@@ -594,7 +594,7 @@ func startPVProtectionController(ctx ControllerContext) (http.Handler, bool, err
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startTTLAfterFinishedController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startTTLAfterFinishedController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !utilfeature.DefaultFeatureGate.Enabled(features.TTLAfterFinished) {
 | 
						if !utilfeature.DefaultFeatureGate.Enabled(features.TTLAfterFinished) {
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -672,7 +672,7 @@ func getNodeCIDRMaskSizes(clusterCIDRs []*net.IPNet, maskSizeIPv4, maskSizeIPv6
 | 
				
			|||||||
	return nodeMaskCIDRs
 | 
						return nodeMaskCIDRs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startStorageVersionGCController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startStorageVersionGCController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go storageversiongc.NewStorageVersionGC(
 | 
						go storageversiongc.NewStorageVersionGC(
 | 
				
			||||||
		ctx.ClientBuilder.ClientOrDie("storage-version-garbage-collector"),
 | 
							ctx.ClientBuilder.ClientOrDie("storage-version-garbage-collector"),
 | 
				
			||||||
		ctx.InformerFactory.Coordination().V1().Leases(),
 | 
							ctx.InformerFactory.Coordination().V1().Leases(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,6 @@ limitations under the License.
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,6 +27,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	fakeclientset "k8s.io/client-go/kubernetes/fake"
 | 
						fakeclientset "k8s.io/client-go/kubernetes/fake"
 | 
				
			||||||
	restclient "k8s.io/client-go/rest"
 | 
						restclient "k8s.io/client-go/rest"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TestClientBuilder inherits ClientBuilder and can accept a given fake clientset.
 | 
					// TestClientBuilder inherits ClientBuilder and can accept a given fake clientset.
 | 
				
			||||||
@@ -104,7 +104,7 @@ func possibleDiscoveryResource() []*metav1.APIResourceList {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type controllerInitFunc func(ControllerContext) (http.Handler, bool, error)
 | 
					type controllerInitFunc func(ControllerContext) (controller.Interface, bool, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestController_DiscoveryError(t *testing.T) {
 | 
					func TestController_DiscoveryError(t *testing.T) {
 | 
				
			||||||
	controllerInitFuncMap := map[string]controllerInitFunc{
 | 
						controllerInitFuncMap := map[string]controllerInitFunc{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,13 +21,12 @@ limitations under the License.
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	endpointslicecontroller "k8s.io/kubernetes/pkg/controller/endpointslice"
 | 
						endpointslicecontroller "k8s.io/kubernetes/pkg/controller/endpointslice"
 | 
				
			||||||
	endpointslicemirroringcontroller "k8s.io/kubernetes/pkg/controller/endpointslicemirroring"
 | 
						endpointslicemirroringcontroller "k8s.io/kubernetes/pkg/controller/endpointslicemirroring"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startEndpointSliceController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startEndpointSliceController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go endpointslicecontroller.NewController(
 | 
						go endpointslicecontroller.NewController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Pods(),
 | 
							ctx.InformerFactory.Core().V1().Pods(),
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Services(),
 | 
							ctx.InformerFactory.Core().V1().Services(),
 | 
				
			||||||
@@ -40,7 +39,7 @@ func startEndpointSliceController(ctx ControllerContext) (http.Handler, bool, er
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startEndpointSliceMirroringController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startEndpointSliceMirroringController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	go endpointslicemirroringcontroller.NewController(
 | 
						go endpointslicemirroringcontroller.NewController(
 | 
				
			||||||
		ctx.InformerFactory.Core().V1().Endpoints(),
 | 
							ctx.InformerFactory.Core().V1().Endpoints(),
 | 
				
			||||||
		ctx.InformerFactory.Discovery().V1().EndpointSlices(),
 | 
							ctx.InformerFactory.Discovery().V1().EndpointSlices(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,18 +21,17 @@ limitations under the License.
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
	"k8s.io/client-go/dynamic"
 | 
						"k8s.io/client-go/dynamic"
 | 
				
			||||||
	"k8s.io/client-go/scale"
 | 
						"k8s.io/client-go/scale"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/disruption"
 | 
						"k8s.io/kubernetes/pkg/controller/disruption"
 | 
				
			||||||
	kubefeatures "k8s.io/kubernetes/pkg/features"
 | 
						kubefeatures "k8s.io/kubernetes/pkg/features"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startDisruptionController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startDisruptionController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.PodDisruptionBudget) {
 | 
						if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.PodDisruptionBudget) {
 | 
				
			||||||
		klog.InfoS("Refusing to start disruption because the PodDisruptionBudget feature is disabled")
 | 
							klog.InfoS("Refusing to start disruption because the PodDisruptionBudget feature is disabled")
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,13 +17,12 @@ limitations under the License.
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/clusterroleaggregation"
 | 
						"k8s.io/kubernetes/pkg/controller/clusterroleaggregation"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startClusterRoleAggregrationController(ctx ControllerContext) (http.Handler, bool, error) {
 | 
					func startClusterRoleAggregrationController(ctx ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.AvailableResources[schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterroles"}] {
 | 
						if !ctx.AvailableResources[schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterroles"}] {
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -281,3 +281,7 @@ func (h *debugHTTPHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 | 
				
			|||||||
	w.Write(data)
 | 
						w.Write(data)
 | 
				
			||||||
	w.WriteHeader(http.StatusOK)
 | 
						w.WriteHeader(http.StatusOK)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (gc *GarbageCollector) DebuggingHandler() http.Handler {
 | 
				
			||||||
 | 
						return NewDebugHandler(gc)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,7 @@ import (
 | 
				
			|||||||
	"k8s.io/client-go/tools/cache"
 | 
						"k8s.io/client-go/tools/cache"
 | 
				
			||||||
	"k8s.io/client-go/tools/record"
 | 
						"k8s.io/client-go/tools/record"
 | 
				
			||||||
	"k8s.io/client-go/util/workqueue"
 | 
						"k8s.io/client-go/util/workqueue"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/informerfactory"
 | 
						"k8s.io/controller-manager/pkg/informerfactory"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/apis/config/scheme"
 | 
						"k8s.io/kubernetes/pkg/controller/apis/config/scheme"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,6 +79,9 @@ type GarbageCollector struct {
 | 
				
			|||||||
	workerLock sync.RWMutex
 | 
						workerLock sync.RWMutex
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ controller.Interface = (*GarbageCollector)(nil)
 | 
				
			||||||
 | 
					var _ controller.Debuggable = (*GarbageCollector)(nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewGarbageCollector creates a new GarbageCollector.
 | 
					// NewGarbageCollector creates a new GarbageCollector.
 | 
				
			||||||
func NewGarbageCollector(
 | 
					func NewGarbageCollector(
 | 
				
			||||||
	kubeClient clientset.Interface,
 | 
						kubeClient clientset.Interface,
 | 
				
			||||||
@@ -726,3 +730,7 @@ func GetDeletableResources(discoveryClient discovery.ServerResourcesInterface) m
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return deletableGroupVersionResources
 | 
						return deletableGroupVersionResources
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (gc *GarbageCollector) Name() string {
 | 
				
			||||||
 | 
						return "garbagecollector"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,6 @@ import (
 | 
				
			|||||||
	"flag"
 | 
						"flag"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"math/rand"
 | 
						"math/rand"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,6 +49,7 @@ import (
 | 
				
			|||||||
	"k8s.io/component-base/version"
 | 
						"k8s.io/component-base/version"
 | 
				
			||||||
	"k8s.io/component-base/version/verflag"
 | 
						"k8s.io/component-base/version/verflag"
 | 
				
			||||||
	genericcontrollermanager "k8s.io/controller-manager/app"
 | 
						genericcontrollermanager "k8s.io/controller-manager/app"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/clientbuilder"
 | 
						"k8s.io/controller-manager/pkg/clientbuilder"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/informerfactory"
 | 
						"k8s.io/controller-manager/pkg/informerfactory"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/leadermigration"
 | 
						"k8s.io/controller-manager/pkg/leadermigration"
 | 
				
			||||||
@@ -302,10 +302,14 @@ func startControllers(cloud cloudprovider.Interface, ctx genericcontrollermanage
 | 
				
			|||||||
// InitCloudFunc is used to initialize cloud
 | 
					// InitCloudFunc is used to initialize cloud
 | 
				
			||||||
type InitCloudFunc func(config *cloudcontrollerconfig.CompletedConfig) cloudprovider.Interface
 | 
					type InitCloudFunc func(config *cloudcontrollerconfig.CompletedConfig) cloudprovider.Interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitFunc is used to launch a particular controller.  It may run additional "should I activate checks".
 | 
					// InitFunc is used to launch a particular controller. It returns a controller
 | 
				
			||||||
 | 
					// that can optionally implement other interfaces so that the controller manager
 | 
				
			||||||
 | 
					// can support the requested features.
 | 
				
			||||||
 | 
					// The returned controller may be nil, which will be considered an anonymous controller
 | 
				
			||||||
 | 
					// that requests no additional features from the controller manager.
 | 
				
			||||||
// Any error returned will cause the controller process to `Fatal`
 | 
					// Any error returned will cause the controller process to `Fatal`
 | 
				
			||||||
// The bool indicates whether the controller was enabled.
 | 
					// The bool indicates whether the controller was enabled.
 | 
				
			||||||
type InitFunc func(ctx genericcontrollermanager.ControllerContext) (debuggingHandler http.Handler, enabled bool, err error)
 | 
					type InitFunc func(ctx genericcontrollermanager.ControllerContext) (controller controller.Interface, enabled bool, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitFuncConstructor is used to construct InitFunc
 | 
					// InitFuncConstructor is used to construct InitFunc
 | 
				
			||||||
type InitFuncConstructor func(initcontext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc
 | 
					type InitFuncConstructor func(initcontext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc
 | 
				
			||||||
@@ -340,28 +344,28 @@ type ControllerInitContext struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// StartCloudNodeControllerWrapper is used to take cloud cofig as input and start cloud node controller
 | 
					// StartCloudNodeControllerWrapper is used to take cloud cofig as input and start cloud node controller
 | 
				
			||||||
func StartCloudNodeControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
					func StartCloudNodeControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
				
			||||||
	return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
 | 
						return func(ctx genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
		return startCloudNodeController(initContext, completedConfig, cloud, ctx.Stop)
 | 
							return startCloudNodeController(initContext, completedConfig, cloud, ctx.Stop)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StartCloudNodeLifecycleControllerWrapper is used to take cloud cofig as input and start cloud node lifecycle controller
 | 
					// StartCloudNodeLifecycleControllerWrapper is used to take cloud cofig as input and start cloud node lifecycle controller
 | 
				
			||||||
func StartCloudNodeLifecycleControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
					func StartCloudNodeLifecycleControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
				
			||||||
	return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
 | 
						return func(ctx genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
		return startCloudNodeLifecycleController(initContext, completedConfig, cloud, ctx.Stop)
 | 
							return startCloudNodeLifecycleController(initContext, completedConfig, cloud, ctx.Stop)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StartServiceControllerWrapper is used to take cloud cofig as input and start service controller
 | 
					// StartServiceControllerWrapper is used to take cloud cofig as input and start service controller
 | 
				
			||||||
func StartServiceControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
					func StartServiceControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
				
			||||||
	return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
 | 
						return func(ctx genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
		return startServiceController(initContext, completedConfig, cloud, ctx.Stop)
 | 
							return startServiceController(initContext, completedConfig, cloud, ctx.Stop)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StartRouteControllerWrapper is used to take cloud cofig as input and start route controller
 | 
					// StartRouteControllerWrapper is used to take cloud cofig as input and start route controller
 | 
				
			||||||
func StartRouteControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
					func StartRouteControllerWrapper(initContext ControllerInitContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) InitFunc {
 | 
				
			||||||
	return func(ctx genericcontrollermanager.ControllerContext) (http.Handler, bool, error) {
 | 
						return func(ctx genericcontrollermanager.ControllerContext) (controller.Interface, bool, error) {
 | 
				
			||||||
		return startRouteController(initContext, completedConfig, cloud, ctx.Stop)
 | 
							return startRouteController(initContext, completedConfig, cloud, ctx.Stop)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@ package app
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cloudprovider "k8s.io/cloud-provider"
 | 
						cloudprovider "k8s.io/cloud-provider"
 | 
				
			||||||
@@ -32,6 +31,7 @@ import (
 | 
				
			|||||||
	cloudnodelifecyclecontroller "k8s.io/cloud-provider/controllers/nodelifecycle"
 | 
						cloudnodelifecyclecontroller "k8s.io/cloud-provider/controllers/nodelifecycle"
 | 
				
			||||||
	routecontroller "k8s.io/cloud-provider/controllers/route"
 | 
						routecontroller "k8s.io/cloud-provider/controllers/route"
 | 
				
			||||||
	servicecontroller "k8s.io/cloud-provider/controllers/service"
 | 
						servicecontroller "k8s.io/cloud-provider/controllers/service"
 | 
				
			||||||
 | 
						"k8s.io/controller-manager/controller"
 | 
				
			||||||
	"k8s.io/controller-manager/pkg/features"
 | 
						"k8s.io/controller-manager/pkg/features"
 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	netutils "k8s.io/utils/net"
 | 
						netutils "k8s.io/utils/net"
 | 
				
			||||||
@@ -39,7 +39,7 @@ import (
 | 
				
			|||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCloudNodeController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (http.Handler, bool, error) {
 | 
					func startCloudNodeController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (controller.Interface, bool, error) {
 | 
				
			||||||
	// Start the CloudNodeController
 | 
						// Start the CloudNodeController
 | 
				
			||||||
	nodeController, err := cloudnodecontroller.NewCloudNodeController(
 | 
						nodeController, err := cloudnodecontroller.NewCloudNodeController(
 | 
				
			||||||
		ctx.SharedInformers.Core().V1().Nodes(),
 | 
							ctx.SharedInformers.Core().V1().Nodes(),
 | 
				
			||||||
@@ -58,7 +58,7 @@ func startCloudNodeController(initContext ControllerInitContext, ctx *config.Com
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCloudNodeLifecycleController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (http.Handler, bool, error) {
 | 
					func startCloudNodeLifecycleController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (controller.Interface, bool, error) {
 | 
				
			||||||
	// Start the cloudNodeLifecycleController
 | 
						// Start the cloudNodeLifecycleController
 | 
				
			||||||
	cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
 | 
						cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
 | 
				
			||||||
		ctx.SharedInformers.Core().V1().Nodes(),
 | 
							ctx.SharedInformers.Core().V1().Nodes(),
 | 
				
			||||||
@@ -77,7 +77,7 @@ func startCloudNodeLifecycleController(initContext ControllerInitContext, ctx *c
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startServiceController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (http.Handler, bool, error) {
 | 
					func startServiceController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (controller.Interface, bool, error) {
 | 
				
			||||||
	// Start the service controller
 | 
						// Start the service controller
 | 
				
			||||||
	serviceController, err := servicecontroller.New(
 | 
						serviceController, err := servicecontroller.New(
 | 
				
			||||||
		cloud,
 | 
							cloud,
 | 
				
			||||||
@@ -98,7 +98,7 @@ func startServiceController(initContext ControllerInitContext, ctx *config.Compl
 | 
				
			|||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startRouteController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (http.Handler, bool, error) {
 | 
					func startRouteController(initContext ControllerInitContext, ctx *config.CompletedConfig, cloud cloudprovider.Interface, stopCh <-chan struct{}) (controller.Interface, bool, error) {
 | 
				
			||||||
	if !ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes {
 | 
						if !ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes {
 | 
				
			||||||
		klog.Infof("Will not configure cloud provider routes, --configure-cloud-routes: %v", ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes)
 | 
							klog.Infof("Will not configure cloud provider routes, --configure-cloud-routes: %v", ctx.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes)
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -1969,6 +1969,7 @@ k8s.io/controller-manager/app
 | 
				
			|||||||
k8s.io/controller-manager/config
 | 
					k8s.io/controller-manager/config
 | 
				
			||||||
k8s.io/controller-manager/config/v1alpha1
 | 
					k8s.io/controller-manager/config/v1alpha1
 | 
				
			||||||
k8s.io/controller-manager/config/v1beta1
 | 
					k8s.io/controller-manager/config/v1beta1
 | 
				
			||||||
 | 
					k8s.io/controller-manager/controller
 | 
				
			||||||
k8s.io/controller-manager/options
 | 
					k8s.io/controller-manager/options
 | 
				
			||||||
k8s.io/controller-manager/pkg/clientbuilder
 | 
					k8s.io/controller-manager/pkg/clientbuilder
 | 
				
			||||||
k8s.io/controller-manager/pkg/features
 | 
					k8s.io/controller-manager/pkg/features
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user