mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #90822 from deads2k/csr-separate-signer-flags-02
allow setting different certificates for kube-controller-managed CSR signers
This commit is contained in:
		@@ -472,9 +472,15 @@ API rule violation: names_match,k8s.io/apimachinery/pkg/util/intstr,IntOrString,
 | 
				
			|||||||
API rule violation: names_match,k8s.io/apimachinery/pkg/util/intstr,IntOrString,Type
 | 
					API rule violation: names_match,k8s.io/apimachinery/pkg/util/intstr,IntOrString,Type
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,AttachDetachControllerConfiguration,DisableAttachDetachReconcilerSync
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,AttachDetachControllerConfiguration,DisableAttachDetachReconcilerSync
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,AttachDetachControllerConfiguration,ReconcilerSyncLoopPeriod
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,AttachDetachControllerConfiguration,ReconcilerSyncLoopPeriod
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningConfiguration,CertFile
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningConfiguration,KeyFile
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningCertFile
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningCertFile
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningDuration
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningDuration
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningKeyFile
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,ClusterSigningKeyFile
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,KubeAPIServerClientSignerConfiguration
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,KubeletClientSignerConfiguration
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,KubeletServingSignerConfiguration
 | 
				
			||||||
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CSRSigningControllerConfiguration,LegacyUnknownSignerConfiguration
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CloudProviderConfiguration,CloudConfigFile
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CloudProviderConfiguration,CloudConfigFile
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CloudProviderConfiguration,Name
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,CloudProviderConfiguration,Name
 | 
				
			||||||
API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,DaemonSetControllerConfiguration,ConcurrentDaemonSetSyncs
 | 
					API rule violation: names_match,k8s.io/kube-controller-manager/config/v1alpha1,DaemonSetControllerConfiguration,ConcurrentDaemonSetSyncs
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,9 +160,13 @@ go_library(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
go_test(
 | 
					go_test(
 | 
				
			||||||
    name = "go_default_test",
 | 
					    name = "go_default_test",
 | 
				
			||||||
    srcs = ["core_test.go"],
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "certificates_test.go",
 | 
				
			||||||
 | 
					        "core_test.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    embed = [":go_default_library"],
 | 
					    embed = [":go_default_library"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//pkg/controller/certificates/signer/config:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
					        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/client-go/discovery:go_default_library",
 | 
					        "//staging/src/k8s.io/client-go/discovery:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/client-go/discovery/fake:go_default_library",
 | 
					        "//staging/src/k8s.io/client-go/discovery/fake:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,14 +22,11 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	kubeoptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
 | 
					 | 
				
			||||||
	"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"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/certificates/rootcacertpublisher"
 | 
						"k8s.io/kubernetes/pkg/controller/certificates/rootcacertpublisher"
 | 
				
			||||||
@@ -44,87 +41,129 @@ func startCSRSigningController(ctx ControllerContext) (http.Handler, bool, error
 | 
				
			|||||||
		klog.Warningf("Resource %s is not available now", gvr.String())
 | 
							klog.Warningf("Resource %s is not available now", gvr.String())
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile == "" || ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile == "" {
 | 
						missingSingleSigningFile := ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile == "" || ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile == ""
 | 
				
			||||||
 | 
						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")
 | 
				
			||||||
		return nil, false, nil
 | 
							return nil, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if !missingSingleSigningFile && anySpecificFilesSet(ctx.ComponentConfig.CSRSigningController) {
 | 
				
			||||||
	// Deprecation warning for old defaults.
 | 
							return nil, false, fmt.Errorf("cannot specify default and per controller certs at the same time")
 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// * If the signing cert and key are the default paths but the files
 | 
					 | 
				
			||||||
	// exist, warn that the paths need to be specified explicitly in a
 | 
					 | 
				
			||||||
	// later release and the defaults will be removed. We don't expect this
 | 
					 | 
				
			||||||
	// to be the case.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// * If the signing cert and key are default paths but the files don't exist,
 | 
					 | 
				
			||||||
	// bail out of startController without logging.
 | 
					 | 
				
			||||||
	var keyFileExists, keyUsesDefault, certFileExists, certUsesDefault bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_, err := os.Stat(ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile)
 | 
					 | 
				
			||||||
	certFileExists = !os.IsNotExist(err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	certUsesDefault = (ctx.ComponentConfig.CSRSigningController.ClusterSigningCertFile == kubeoptions.DefaultClusterSigningCertFile)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_, err = os.Stat(ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile)
 | 
					 | 
				
			||||||
	keyFileExists = !os.IsNotExist(err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	keyUsesDefault = (ctx.ComponentConfig.CSRSigningController.ClusterSigningKeyFile == kubeoptions.DefaultClusterSigningKeyFile)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case (keyFileExists && keyUsesDefault) || (certFileExists && certUsesDefault):
 | 
					 | 
				
			||||||
		klog.Warningf("You might be using flag defaulting for --cluster-signing-cert-file and" +
 | 
					 | 
				
			||||||
			" --cluster-signing-key-file. These defaults are deprecated and will be removed" +
 | 
					 | 
				
			||||||
			" in a subsequent release. Please pass these options explicitly.")
 | 
					 | 
				
			||||||
	case (!keyFileExists && keyUsesDefault) && (!certFileExists && certUsesDefault):
 | 
					 | 
				
			||||||
		// This is what we expect right now if people aren't
 | 
					 | 
				
			||||||
		// setting up the signing controller. This isn't
 | 
					 | 
				
			||||||
		// actually a problem since the signer is not a
 | 
					 | 
				
			||||||
		// required controller.
 | 
					 | 
				
			||||||
		klog.V(2).Info("skipping CSR signer controller because no csr cert/key was specified and the default files are missing")
 | 
					 | 
				
			||||||
		return nil, false, nil
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		// Note that '!filesExist && !usesDefaults' is obviously
 | 
					 | 
				
			||||||
		// operator error. We don't handle this case here and instead
 | 
					 | 
				
			||||||
		// allow it to be handled by NewCSR... below.
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c := ctx.ClientBuilder.ClientOrDie("certificate-controller")
 | 
						c := ctx.ClientBuilder.ClientOrDie("certificate-controller")
 | 
				
			||||||
	csrInformer := ctx.InformerFactory.Certificates().V1().CertificateSigningRequests()
 | 
						csrInformer := ctx.InformerFactory.Certificates().V1().CertificateSigningRequests()
 | 
				
			||||||
	certTTL := ctx.ComponentConfig.CSRSigningController.ClusterSigningDuration.Duration
 | 
						certTTL := ctx.ComponentConfig.CSRSigningController.ClusterSigningDuration.Duration
 | 
				
			||||||
	caFile, caKeyFile := getKubeletServingSignerFiles(ctx.ComponentConfig.CSRSigningController)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO get different signer cert and key files for each signer when we add flags.
 | 
						if kubeletServingSignerCertFile, kubeletServingSignerKeyFile := getKubeletServingSignerFiles(ctx.ComponentConfig.CSRSigningController); len(kubeletServingSignerCertFile) > 0 || len(kubeletServingSignerKeyFile) > 0 {
 | 
				
			||||||
 | 
							kubeletServingSigner, err := signer.NewKubeletServingCSRSigningController(c, csrInformer, kubeletServingSignerCertFile, kubeletServingSignerKeyFile, certTTL)
 | 
				
			||||||
	kubeletServingSigner, err := signer.NewKubeletServingCSRSigningController(c, csrInformer, caFile, caKeyFile, certTTL)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, false, fmt.Errorf("failed to start kubernetes.io/kubelet-serving certificate controller: %v", err)
 | 
								return nil, false, fmt.Errorf("failed to start kubernetes.io/kubelet-serving certificate controller: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		go kubeletServingSigner.Run(1, ctx.Stop)
 | 
							go kubeletServingSigner.Run(1, ctx.Stop)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							klog.V(2).Infof("skipping CSR signer controller %q because specific files were specified for other signers and not this one.", "kubernetes.io/kubelet-serving")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kubeletClientSigner, err := signer.NewKubeletClientCSRSigningController(c, csrInformer, caFile, caKeyFile, certTTL)
 | 
						if kubeletClientSignerCertFile, kubeletClientSignerKeyFile := getKubeletClientSignerFiles(ctx.ComponentConfig.CSRSigningController); len(kubeletClientSignerCertFile) > 0 || len(kubeletClientSignerKeyFile) > 0 {
 | 
				
			||||||
 | 
							kubeletClientSigner, err := signer.NewKubeletClientCSRSigningController(c, csrInformer, kubeletClientSignerCertFile, kubeletClientSignerKeyFile, certTTL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, false, fmt.Errorf("failed to start kubernetes.io/kube-apiserver-client-kubelet certificate controller: %v", err)
 | 
								return nil, false, fmt.Errorf("failed to start kubernetes.io/kube-apiserver-client-kubelet certificate controller: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		go kubeletClientSigner.Run(1, ctx.Stop)
 | 
							go kubeletClientSigner.Run(1, ctx.Stop)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							klog.V(2).Infof("skipping CSR signer controller %q because specific files were specified for other signers and not this one.", "kubernetes.io/kube-apiserver-client-kubelet")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kubeAPIServerClientSigner, err := signer.NewKubeAPIServerClientCSRSigningController(c, csrInformer, caFile, caKeyFile, certTTL)
 | 
						if kubeAPIServerSignerCertFile, kubeAPIServerSignerKeyFile := getKubeAPIServerClientSignerFiles(ctx.ComponentConfig.CSRSigningController); len(kubeAPIServerSignerCertFile) > 0 || len(kubeAPIServerSignerKeyFile) > 0 {
 | 
				
			||||||
 | 
							kubeAPIServerClientSigner, err := signer.NewKubeAPIServerClientCSRSigningController(c, csrInformer, kubeAPIServerSignerCertFile, kubeAPIServerSignerKeyFile, certTTL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, false, fmt.Errorf("failed to start kubernetes.io/kube-apiserver-client certificate controller: %v", err)
 | 
								return nil, false, fmt.Errorf("failed to start kubernetes.io/kube-apiserver-client certificate controller: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		go kubeAPIServerClientSigner.Run(1, ctx.Stop)
 | 
							go kubeAPIServerClientSigner.Run(1, ctx.Stop)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							klog.V(2).Infof("skipping CSR signer controller %q because specific files were specified for other signers and not this one.", "kubernetes.io/kube-apiserver-client")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	legacyUnknownSigner, err := signer.NewLegacyUnknownCSRSigningController(c, csrInformer, caFile, caKeyFile, certTTL)
 | 
						if legacyUnknownSignerCertFile, legacyUnknownSignerKeyFile := getLegacyUnknownSignerFiles(ctx.ComponentConfig.CSRSigningController); len(legacyUnknownSignerCertFile) > 0 || len(legacyUnknownSignerKeyFile) > 0 {
 | 
				
			||||||
 | 
							legacyUnknownSigner, err := signer.NewLegacyUnknownCSRSigningController(c, csrInformer, legacyUnknownSignerCertFile, legacyUnknownSignerKeyFile, certTTL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, false, fmt.Errorf("failed to start kubernetes.io/legacy-unknown certificate controller: %v", err)
 | 
								return nil, false, fmt.Errorf("failed to start kubernetes.io/legacy-unknown certificate controller: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		go legacyUnknownSigner.Run(1, ctx.Stop)
 | 
							go legacyUnknownSigner.Run(1, ctx.Stop)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							klog.V(2).Infof("skipping CSR signer controller %q because specific files were specified for other signers and not this one.", "kubernetes.io/legacy-unknown")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, true, nil
 | 
						return nil, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getKubeletServingSignerFiles returns the cert and key for signing.
 | 
					func areKubeletServingSignerFilesSpecified(config csrsigningconfig.CSRSigningControllerConfiguration) bool {
 | 
				
			||||||
// TODO we will extended this for each signer so that it prefers the specific flag (to be added) and falls back to the single flag
 | 
						if len(config.KubeletServingSignerConfiguration.CertFile) > 0 || len(config.KubeletServingSignerConfiguration.KeyFile) > 0 {
 | 
				
			||||||
 | 
							// if only one is specified, it will error later during construction
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func areKubeletClientSignerFilesSpecified(config csrsigningconfig.CSRSigningControllerConfiguration) bool {
 | 
				
			||||||
 | 
						if len(config.KubeletClientSignerConfiguration.CertFile) > 0 || len(config.KubeletClientSignerConfiguration.KeyFile) > 0 {
 | 
				
			||||||
 | 
							// if only one is specified, it will error later during construction
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func areKubeAPIServerClientSignerFilesSpecified(config csrsigningconfig.CSRSigningControllerConfiguration) bool {
 | 
				
			||||||
 | 
						if len(config.KubeAPIServerClientSignerConfiguration.CertFile) > 0 || len(config.KubeAPIServerClientSignerConfiguration.KeyFile) > 0 {
 | 
				
			||||||
 | 
							// if only one is specified, it will error later during construction
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func areLegacyUnknownSignerFilesSpecified(config csrsigningconfig.CSRSigningControllerConfiguration) bool {
 | 
				
			||||||
 | 
						if len(config.LegacyUnknownSignerConfiguration.CertFile) > 0 || len(config.LegacyUnknownSignerConfiguration.KeyFile) > 0 {
 | 
				
			||||||
 | 
							// if only one is specified, it will error later during construction
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func anySpecificFilesSet(config csrsigningconfig.CSRSigningControllerConfiguration) bool {
 | 
				
			||||||
 | 
						return areKubeletServingSignerFilesSpecified(config) ||
 | 
				
			||||||
 | 
							areKubeletClientSignerFilesSpecified(config) ||
 | 
				
			||||||
 | 
							areKubeAPIServerClientSignerFilesSpecified(config) ||
 | 
				
			||||||
 | 
							areLegacyUnknownSignerFilesSpecified(config)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getKubeletServingSignerFiles(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string) {
 | 
					func getKubeletServingSignerFiles(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string) {
 | 
				
			||||||
 | 
						// if any cert/key is set for specific CSR signing loops, then the --cluster-signing-{cert,key}-file are not used for any CSR signing loop.
 | 
				
			||||||
 | 
						if anySpecificFilesSet(config) {
 | 
				
			||||||
 | 
							return config.KubeletServingSignerConfiguration.CertFile, config.KubeletServingSignerConfiguration.KeyFile
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getKubeletClientSignerFiles(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string) {
 | 
				
			||||||
 | 
						// if any cert/key is set for specific CSR signing loops, then the --cluster-signing-{cert,key}-file are not used for any CSR signing loop.
 | 
				
			||||||
 | 
						if anySpecificFilesSet(config) {
 | 
				
			||||||
 | 
							return config.KubeletClientSignerConfiguration.CertFile, config.KubeletClientSignerConfiguration.KeyFile
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getKubeAPIServerClientSignerFiles(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string) {
 | 
				
			||||||
 | 
						// if any cert/key is set for specific CSR signing loops, then the --cluster-signing-{cert,key}-file are not used for any CSR signing loop.
 | 
				
			||||||
 | 
						if anySpecificFilesSet(config) {
 | 
				
			||||||
 | 
							return config.KubeAPIServerClientSignerConfiguration.CertFile, config.KubeAPIServerClientSignerConfiguration.KeyFile
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getLegacyUnknownSignerFiles(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string) {
 | 
				
			||||||
 | 
						// if any cert/key is set for specific CSR signing loops, then the --cluster-signing-{cert,key}-file are not used for any CSR signing loop.
 | 
				
			||||||
 | 
						if anySpecificFilesSet(config) {
 | 
				
			||||||
 | 
							return config.LegacyUnknownSignerConfiguration.CertFile, config.LegacyUnknownSignerConfiguration.KeyFile
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
						return config.ClusterSigningCertFile, config.ClusterSigningKeyFile
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										309
									
								
								cmd/kube-controller-manager/app/certificates_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										309
									
								
								cmd/kube-controller-manager/app/certificates_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,309 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2020 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
						csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCertSpecified(t *testing.T) {
 | 
				
			||||||
 | 
						allConfig := csrsigningconfig.CSRSigningControllerConfiguration{
 | 
				
			||||||
 | 
							ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
 | 
							ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
 | 
							ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
							KubeletServingSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							KubeletClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							KubeAPIServerClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							LegacyUnknownSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defaultOnly := csrsigningconfig.CSRSigningControllerConfiguration{
 | 
				
			||||||
 | 
							ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
 | 
							ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
 | 
							ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						specifiedOnly := csrsigningconfig.CSRSigningControllerConfiguration{
 | 
				
			||||||
 | 
							KubeletServingSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							KubeletClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							KubeAPIServerClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							LegacyUnknownSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						halfASpecified := csrsigningconfig.CSRSigningControllerConfiguration{
 | 
				
			||||||
 | 
							ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
 | 
							ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
 | 
							ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
							KubeletServingSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							KubeletClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						halfBSpecified := csrsigningconfig.CSRSigningControllerConfiguration{
 | 
				
			||||||
 | 
							ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
 | 
							ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
 | 
							ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
							KubeAPIServerClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							LegacyUnknownSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
								CertFile: "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								KeyFile:  "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name              string
 | 
				
			||||||
 | 
							config            csrsigningconfig.CSRSigningControllerConfiguration
 | 
				
			||||||
 | 
							specifiedFn       func(config csrsigningconfig.CSRSigningControllerConfiguration) bool
 | 
				
			||||||
 | 
							expectedSpecified bool
 | 
				
			||||||
 | 
							filesFn           func(config csrsigningconfig.CSRSigningControllerConfiguration) (string, string)
 | 
				
			||||||
 | 
							expectedCert      string
 | 
				
			||||||
 | 
							expectedKey       string
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "allConfig-KubeletServingSignerFilesSpecified",
 | 
				
			||||||
 | 
								config:            allConfig,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletServingSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletServingSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "defaultOnly-KubeletServingSignerFilesSpecified",
 | 
				
			||||||
 | 
								config:            defaultOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletServingSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeletServingSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-cert",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-key",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "specifiedOnly-KubeletServingSignerFilesSpecified",
 | 
				
			||||||
 | 
								config:            specifiedOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletServingSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletServingSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfASpecified-KubeletServingSignerFilesSpecified",
 | 
				
			||||||
 | 
								config:            halfASpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletServingSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletServingSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfBSpecified-KubeletServingSignerFilesSpecified",
 | 
				
			||||||
 | 
								config:            halfBSpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletServingSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeletServingSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "",
 | 
				
			||||||
 | 
								expectedKey:       "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "allConfig-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            allConfig,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "defaultOnly-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            defaultOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeletClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-cert",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-key",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "specifiedOnly-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            specifiedOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfASpecified-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            halfASpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeletClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfBSpecified-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            halfBSpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeletClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeletClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "",
 | 
				
			||||||
 | 
								expectedKey:       "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "allConfig-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            allConfig,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeAPIServerClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeAPIServerClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "defaultOnly-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            defaultOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeAPIServerClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeAPIServerClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-cert",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-key",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "specifiedOnly-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            specifiedOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeAPIServerClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeAPIServerClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfASpecified-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            halfASpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeAPIServerClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getKubeAPIServerClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "",
 | 
				
			||||||
 | 
								expectedKey:       "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfBSpecified-KubeletClientSignerFiles",
 | 
				
			||||||
 | 
								config:            halfBSpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areKubeAPIServerClientSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getKubeAPIServerClientSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "allConfig-LegacyUnknownSignerFiles",
 | 
				
			||||||
 | 
								config:            allConfig,
 | 
				
			||||||
 | 
								specifiedFn:       areLegacyUnknownSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getLegacyUnknownSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "defaultOnly-LegacyUnknownSignerFiles",
 | 
				
			||||||
 | 
								config:            defaultOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areLegacyUnknownSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getLegacyUnknownSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-cert",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-key",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "specifiedOnly-LegacyUnknownSignerFiles",
 | 
				
			||||||
 | 
								config:            specifiedOnly,
 | 
				
			||||||
 | 
								specifiedFn:       areLegacyUnknownSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getLegacyUnknownSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfASpecified-LegacyUnknownSignerFiles",
 | 
				
			||||||
 | 
								config:            halfASpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areLegacyUnknownSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: false,
 | 
				
			||||||
 | 
								filesFn:           getLegacyUnknownSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "",
 | 
				
			||||||
 | 
								expectedKey:       "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:              "halfBSpecified-LegacyUnknownSignerFiles",
 | 
				
			||||||
 | 
								config:            halfBSpecified,
 | 
				
			||||||
 | 
								specifiedFn:       areLegacyUnknownSignerFilesSpecified,
 | 
				
			||||||
 | 
								expectedSpecified: true,
 | 
				
			||||||
 | 
								filesFn:           getLegacyUnknownSignerFiles,
 | 
				
			||||||
 | 
								expectedCert:      "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
								expectedKey:       "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, test := range tests {
 | 
				
			||||||
 | 
							t.Run(test.name, func(t *testing.T) {
 | 
				
			||||||
 | 
								actualSpecified := test.specifiedFn(test.config)
 | 
				
			||||||
 | 
								if actualSpecified != test.expectedSpecified {
 | 
				
			||||||
 | 
									t.Error(actualSpecified)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								actualCert, actualKey := test.filesFn(test.config)
 | 
				
			||||||
 | 
								if actualCert != test.expectedCert {
 | 
				
			||||||
 | 
									t.Error(actualCert)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if actualKey != test.expectedKey {
 | 
				
			||||||
 | 
									t.Error(actualKey)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,21 +17,13 @@ limitations under the License.
 | 
				
			|||||||
package options
 | 
					package options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/spf13/pflag"
 | 
						"github.com/spf13/pflag"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
 | 
						csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	// These defaults are deprecated and exported so that we can warn if
 | 
					 | 
				
			||||||
	// they are being used.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DefaultClusterSigningCertFile is deprecated. Do not use.
 | 
					 | 
				
			||||||
	DefaultClusterSigningCertFile = "/etc/kubernetes/ca/ca.pem"
 | 
					 | 
				
			||||||
	// DefaultClusterSigningKeyFile is deprecated. Do not use.
 | 
					 | 
				
			||||||
	DefaultClusterSigningKeyFile = "/etc/kubernetes/ca/ca.key"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CSRSigningControllerOptions holds the CSRSigningController options.
 | 
					// CSRSigningControllerOptions holds the CSRSigningController options.
 | 
				
			||||||
type CSRSigningControllerOptions struct {
 | 
					type CSRSigningControllerOptions struct {
 | 
				
			||||||
	*csrsigningconfig.CSRSigningControllerConfiguration
 | 
						*csrsigningconfig.CSRSigningControllerConfiguration
 | 
				
			||||||
@@ -43,8 +35,16 @@ func (o *CSRSigningControllerOptions) AddFlags(fs *pflag.FlagSet) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fs.StringVar(&o.ClusterSigningCertFile, "cluster-signing-cert-file", o.ClusterSigningCertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue cluster-scoped certificates")
 | 
						fs.StringVar(&o.ClusterSigningCertFile, "cluster-signing-cert-file", o.ClusterSigningCertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue cluster-scoped certificates.  If specified, no more specific --cluster-signing-* flag may be specified.")
 | 
				
			||||||
	fs.StringVar(&o.ClusterSigningKeyFile, "cluster-signing-key-file", o.ClusterSigningKeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign cluster-scoped certificates")
 | 
						fs.StringVar(&o.ClusterSigningKeyFile, "cluster-signing-key-file", o.ClusterSigningKeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign cluster-scoped certificates.  If specified, no more specific --cluster-signing-* flag may be specified.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeletServingSignerConfiguration.CertFile, "cluster-signing-kubelet-serving-cert-file", o.KubeletServingSignerConfiguration.CertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue certificates for the kubernetes.io/kubelet-serving signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeletServingSignerConfiguration.KeyFile, "cluster-signing-kubelet-serving-key-file", o.KubeletServingSignerConfiguration.KeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign certificates for the kubernetes.io/kubelet-serving signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeletClientSignerConfiguration.CertFile, "cluster-signing-kubelet-client-cert-file", o.KubeletClientSignerConfiguration.CertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue certificates for the kubernetes.io/kube-apiserver-client-kubelet signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeletClientSignerConfiguration.KeyFile, "cluster-signing-kubelet-client-key-file", o.KubeletClientSignerConfiguration.KeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign certificates for the kubernetes.io/kube-apiserver-client-kubelet signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeAPIServerClientSignerConfiguration.CertFile, "cluster-signing-kube-apiserver-client-cert-file", o.KubeAPIServerClientSignerConfiguration.CertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue certificates for the kubernetes.io/kube-apiserver-client signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.KubeAPIServerClientSignerConfiguration.KeyFile, "cluster-signing-kube-apiserver-client-key-file", o.KubeAPIServerClientSignerConfiguration.KeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign certificates for the kubernetes.io/kube-apiserver-client signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.LegacyUnknownSignerConfiguration.CertFile, "cluster-signing-legacy-unknown-cert-file", o.LegacyUnknownSignerConfiguration.CertFile, "Filename containing a PEM-encoded X509 CA certificate used to issue certificates for the kubernetes.io/legacy-unknown signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
 | 
						fs.StringVar(&o.LegacyUnknownSignerConfiguration.KeyFile, "cluster-signing-legacy-unknown-key-file", o.LegacyUnknownSignerConfiguration.KeyFile, "Filename containing a PEM-encoded RSA or ECDSA private key used to sign certificates for the kubernetes.io/legacy-unknown signer.  If specified, --cluster-signing-{cert,key}-file must not be set.")
 | 
				
			||||||
	fs.DurationVar(&o.ClusterSigningDuration.Duration, "cluster-signing-duration", o.ClusterSigningDuration.Duration, "The length of duration signed certificates will be given.")
 | 
						fs.DurationVar(&o.ClusterSigningDuration.Duration, "cluster-signing-duration", o.ClusterSigningDuration.Duration, "The length of duration signed certificates will be given.")
 | 
				
			||||||
	fs.DurationVar(&o.ClusterSigningDuration.Duration, "experimental-cluster-signing-duration", o.ClusterSigningDuration.Duration, "The length of duration signed certificates will be given.")
 | 
						fs.DurationVar(&o.ClusterSigningDuration.Duration, "experimental-cluster-signing-duration", o.ClusterSigningDuration.Duration, "The length of duration signed certificates will be given.")
 | 
				
			||||||
	fs.MarkDeprecated("experimental-cluster-signing-duration", "use --cluster-signing-duration")
 | 
						fs.MarkDeprecated("experimental-cluster-signing-duration", "use --cluster-signing-duration")
 | 
				
			||||||
@@ -58,6 +58,10 @@ func (o *CSRSigningControllerOptions) ApplyTo(cfg *csrsigningconfig.CSRSigningCo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cfg.ClusterSigningCertFile = o.ClusterSigningCertFile
 | 
						cfg.ClusterSigningCertFile = o.ClusterSigningCertFile
 | 
				
			||||||
	cfg.ClusterSigningKeyFile = o.ClusterSigningKeyFile
 | 
						cfg.ClusterSigningKeyFile = o.ClusterSigningKeyFile
 | 
				
			||||||
 | 
						cfg.KubeletServingSignerConfiguration = o.KubeletServingSignerConfiguration
 | 
				
			||||||
 | 
						cfg.KubeletClientSignerConfiguration = o.KubeletClientSignerConfiguration
 | 
				
			||||||
 | 
						cfg.KubeAPIServerClientSignerConfiguration = o.KubeAPIServerClientSignerConfiguration
 | 
				
			||||||
 | 
						cfg.LegacyUnknownSignerConfiguration = o.LegacyUnknownSignerConfiguration
 | 
				
			||||||
	cfg.ClusterSigningDuration = o.ClusterSigningDuration
 | 
						cfg.ClusterSigningDuration = o.ClusterSigningDuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -70,5 +74,43 @@ func (o *CSRSigningControllerOptions) Validate() []error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errs := []error{}
 | 
						errs := []error{}
 | 
				
			||||||
 | 
						if err := csrSigningFilesValid(o.KubeletServingSignerConfiguration); err != nil {
 | 
				
			||||||
 | 
							errs = append(errs, fmt.Errorf("%q: %v", "cluster-signing-kubelet-serving", err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := csrSigningFilesValid(o.KubeletClientSignerConfiguration); err != nil {
 | 
				
			||||||
 | 
							errs = append(errs, fmt.Errorf("%q: %v", "cluster-signing-kube-apiserver-client", err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := csrSigningFilesValid(o.KubeAPIServerClientSignerConfiguration); err != nil {
 | 
				
			||||||
 | 
							errs = append(errs, fmt.Errorf("%q: %v", "cluster-signing-kube-apiserver", err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := csrSigningFilesValid(o.LegacyUnknownSignerConfiguration); err != nil {
 | 
				
			||||||
 | 
							errs = append(errs, fmt.Errorf("%q: %v", "cluster-signing-legacy-unknown", err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						singleSigningFile := len(o.ClusterSigningCertFile) > 0 || len(o.ClusterSigningKeyFile) > 0
 | 
				
			||||||
 | 
						anySpecificFilesSet := len(o.KubeletServingSignerConfiguration.CertFile) > 0 || len(o.KubeletServingSignerConfiguration.KeyFile) > 0 ||
 | 
				
			||||||
 | 
							len(o.KubeletClientSignerConfiguration.CertFile) > 0 || len(o.KubeletClientSignerConfiguration.KeyFile) > 0 ||
 | 
				
			||||||
 | 
							len(o.KubeAPIServerClientSignerConfiguration.CertFile) > 0 || len(o.KubeAPIServerClientSignerConfiguration.KeyFile) > 0 ||
 | 
				
			||||||
 | 
							len(o.LegacyUnknownSignerConfiguration.CertFile) > 0 || len(o.LegacyUnknownSignerConfiguration.KeyFile) > 0
 | 
				
			||||||
 | 
						if singleSigningFile && anySpecificFilesSet {
 | 
				
			||||||
 | 
							errs = append(errs, fmt.Errorf("cannot specify --cluster-signing-{cert,key}-file and other --cluster-signing-*-file flags at the same time"))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return errs
 | 
						return errs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// both must be specified or both must be empty
 | 
				
			||||||
 | 
					func csrSigningFilesValid(config csrsigningconfig.CSRSigningConfiguration) error {
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case (len(config.CertFile) == 0) && (len(config.KeyFile) == 0):
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						case (len(config.CertFile) != 0) && (len(config.KeyFile) != 0):
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						case (len(config.CertFile) == 0) && (len(config.KeyFile) != 0):
 | 
				
			||||||
 | 
							return fmt.Errorf("cannot specify key without cert")
 | 
				
			||||||
 | 
						case (len(config.CertFile) != 0) && (len(config.KeyFile) == 0):
 | 
				
			||||||
 | 
							return fmt.Errorf("cannot specify cert without key")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return fmt.Errorf("math broke")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -69,6 +69,14 @@ var args = []string{
 | 
				
			|||||||
	"--cluster-name=k8s",
 | 
						"--cluster-name=k8s",
 | 
				
			||||||
	"--cluster-signing-cert-file=/cluster-signing-cert",
 | 
						"--cluster-signing-cert-file=/cluster-signing-cert",
 | 
				
			||||||
	"--cluster-signing-key-file=/cluster-signing-key",
 | 
						"--cluster-signing-key-file=/cluster-signing-key",
 | 
				
			||||||
 | 
						"--cluster-signing-kubelet-serving-cert-file=/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
						"--cluster-signing-kubelet-serving-key-file=/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
						"--cluster-signing-kubelet-client-cert-file=/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
						"--cluster-signing-kubelet-client-key-file=/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
						"--cluster-signing-kube-apiserver-client-cert-file=/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
						"--cluster-signing-kube-apiserver-client-key-file=/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
						"--cluster-signing-legacy-unknown-cert-file=/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
						"--cluster-signing-legacy-unknown-key-file=/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
	"--concurrent-deployment-syncs=10",
 | 
						"--concurrent-deployment-syncs=10",
 | 
				
			||||||
	"--concurrent-statefulset-syncs=15",
 | 
						"--concurrent-statefulset-syncs=15",
 | 
				
			||||||
	"--concurrent-endpoint-syncs=10",
 | 
						"--concurrent-endpoint-syncs=10",
 | 
				
			||||||
@@ -219,6 +227,22 @@ func TestAddFlags(t *testing.T) {
 | 
				
			|||||||
				ClusterSigningCertFile: "/cluster-signing-cert",
 | 
									ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
				ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
									ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
				ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
									ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
									KubeletServingSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									KubeletClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									KubeAPIServerClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									LegacyUnknownSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DaemonSetController: &DaemonSetControllerOptions{
 | 
							DaemonSetController: &DaemonSetControllerOptions{
 | 
				
			||||||
@@ -470,6 +494,22 @@ func TestApplyTo(t *testing.T) {
 | 
				
			|||||||
				ClusterSigningCertFile: "/cluster-signing-cert",
 | 
									ClusterSigningCertFile: "/cluster-signing-cert",
 | 
				
			||||||
				ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
									ClusterSigningKeyFile:  "/cluster-signing-key",
 | 
				
			||||||
				ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
									ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
 | 
				
			||||||
 | 
									KubeletServingSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kubelet-serving/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kubelet-serving/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									KubeletClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kubelet-client/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kubelet-client/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									KubeAPIServerClientSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-kube-apiserver-client/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-kube-apiserver-client/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									LegacyUnknownSignerConfiguration: csrsigningconfig.CSRSigningConfiguration{
 | 
				
			||||||
 | 
										CertFile: "/cluster-signing-legacy-unknown/cert-file",
 | 
				
			||||||
 | 
										KeyFile:  "/cluster-signing-legacy-unknown/key-file",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			DaemonSetController: daemonconfig.DaemonSetControllerConfiguration{
 | 
								DaemonSetController: daemonconfig.DaemonSetControllerConfiguration{
 | 
				
			||||||
				ConcurrentDaemonSetSyncs: 2,
 | 
									ConcurrentDaemonSetSyncs: 2,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,27 @@ type CSRSigningControllerConfiguration struct {
 | 
				
			|||||||
	// clusterSigningCertFile is the filename containing a PEM-encoded
 | 
						// clusterSigningCertFile is the filename containing a PEM-encoded
 | 
				
			||||||
	// RSA or ECDSA private key used to issue cluster-scoped certificates
 | 
						// RSA or ECDSA private key used to issue cluster-scoped certificates
 | 
				
			||||||
	ClusterSigningKeyFile string
 | 
						ClusterSigningKeyFile string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// kubeletServingSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kubelet-serving signer
 | 
				
			||||||
 | 
						KubeletServingSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// kubeletClientSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kube-apiserver-client-kubelet
 | 
				
			||||||
 | 
						KubeletClientSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// kubeAPIServerClientSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kube-apiserver-client
 | 
				
			||||||
 | 
						KubeAPIServerClientSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// legacyUnknownSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/legacy-unknown
 | 
				
			||||||
 | 
						LegacyUnknownSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// clusterSigningDuration is the length of duration signed certificates
 | 
						// clusterSigningDuration is the length of duration signed certificates
 | 
				
			||||||
	// will be given.
 | 
						// will be given.
 | 
				
			||||||
	ClusterSigningDuration metav1.Duration
 | 
						ClusterSigningDuration metav1.Duration
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CSRSigningConfiguration holds information about a particular CSR signer
 | 
				
			||||||
 | 
					type CSRSigningConfiguration struct {
 | 
				
			||||||
 | 
						// certFile is the filename containing a PEM-encoded
 | 
				
			||||||
 | 
						// X509 CA certificate used to issue certificates
 | 
				
			||||||
 | 
						CertFile string
 | 
				
			||||||
 | 
						// keyFile is the filename containing a PEM-encoded
 | 
				
			||||||
 | 
						// RSA or ECDSA private key used to issue certificates
 | 
				
			||||||
 | 
						KeyFile string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,12 +34,6 @@ import (
 | 
				
			|||||||
// run it in your wrapper struct of this type in its `SetDefaults_` method.
 | 
					// run it in your wrapper struct of this type in its `SetDefaults_` method.
 | 
				
			||||||
func RecommendedDefaultCSRSigningControllerConfiguration(obj *kubectrlmgrconfigv1alpha1.CSRSigningControllerConfiguration) {
 | 
					func RecommendedDefaultCSRSigningControllerConfiguration(obj *kubectrlmgrconfigv1alpha1.CSRSigningControllerConfiguration) {
 | 
				
			||||||
	zero := metav1.Duration{}
 | 
						zero := metav1.Duration{}
 | 
				
			||||||
	if obj.ClusterSigningCertFile == "" {
 | 
					 | 
				
			||||||
		obj.ClusterSigningCertFile = "/etc/kubernetes/ca/ca.pem"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if obj.ClusterSigningKeyFile == "" {
 | 
					 | 
				
			||||||
		obj.ClusterSigningKeyFile = "/etc/kubernetes/ca/ca.key"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if obj.ClusterSigningDuration == zero {
 | 
						if obj.ClusterSigningDuration == zero {
 | 
				
			||||||
		obj.ClusterSigningDuration = metav1.Duration{Duration: 365 * 24 * time.Hour}
 | 
							obj.ClusterSigningDuration = metav1.Duration{Duration: 365 * 24 * time.Hour}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,16 @@ func init() {
 | 
				
			|||||||
// RegisterConversions adds conversion functions to the given scheme.
 | 
					// RegisterConversions adds conversion functions to the given scheme.
 | 
				
			||||||
// Public to allow building arbitrary schemes.
 | 
					// Public to allow building arbitrary schemes.
 | 
				
			||||||
func RegisterConversions(s *runtime.Scheme) error {
 | 
					func RegisterConversions(s *runtime.Scheme) error {
 | 
				
			||||||
 | 
						if err := s.AddGeneratedConversionFunc((*v1alpha1.CSRSigningConfiguration)(nil), (*config.CSRSigningConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
				
			||||||
 | 
							return Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(a.(*v1alpha1.CSRSigningConfiguration), b.(*config.CSRSigningConfiguration), scope)
 | 
				
			||||||
 | 
						}); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := s.AddGeneratedConversionFunc((*config.CSRSigningConfiguration)(nil), (*v1alpha1.CSRSigningConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
				
			||||||
 | 
							return Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(a.(*config.CSRSigningConfiguration), b.(*v1alpha1.CSRSigningConfiguration), scope)
 | 
				
			||||||
 | 
						}); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if err := s.AddGeneratedConversionFunc((*v1alpha1.GroupResource)(nil), (*v1.GroupResource)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
						if err := s.AddGeneratedConversionFunc((*v1alpha1.GroupResource)(nil), (*v1.GroupResource)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
				
			||||||
		return Convert_v1alpha1_GroupResource_To_v1_GroupResource(a.(*v1alpha1.GroupResource), b.(*v1.GroupResource), scope)
 | 
							return Convert_v1alpha1_GroupResource_To_v1_GroupResource(a.(*v1alpha1.GroupResource), b.(*v1.GroupResource), scope)
 | 
				
			||||||
	}); err != nil {
 | 
						}); err != nil {
 | 
				
			||||||
@@ -58,9 +68,43 @@ func RegisterConversions(s *runtime.Scheme) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func autoConvert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(in *v1alpha1.CSRSigningConfiguration, out *config.CSRSigningConfiguration, s conversion.Scope) error {
 | 
				
			||||||
 | 
						out.CertFile = in.CertFile
 | 
				
			||||||
 | 
						out.KeyFile = in.KeyFile
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration is an autogenerated conversion function.
 | 
				
			||||||
 | 
					func Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(in *v1alpha1.CSRSigningConfiguration, out *config.CSRSigningConfiguration, s conversion.Scope) error {
 | 
				
			||||||
 | 
						return autoConvert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(in, out, s)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func autoConvert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(in *config.CSRSigningConfiguration, out *v1alpha1.CSRSigningConfiguration, s conversion.Scope) error {
 | 
				
			||||||
 | 
						out.CertFile = in.CertFile
 | 
				
			||||||
 | 
						out.KeyFile = in.KeyFile
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration is an autogenerated conversion function.
 | 
				
			||||||
 | 
					func Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(in *config.CSRSigningConfiguration, out *v1alpha1.CSRSigningConfiguration, s conversion.Scope) error {
 | 
				
			||||||
 | 
						return autoConvert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(in, out, s)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func autoConvert_v1alpha1_CSRSigningControllerConfiguration_To_config_CSRSigningControllerConfiguration(in *v1alpha1.CSRSigningControllerConfiguration, out *config.CSRSigningControllerConfiguration, s conversion.Scope) error {
 | 
					func autoConvert_v1alpha1_CSRSigningControllerConfiguration_To_config_CSRSigningControllerConfiguration(in *v1alpha1.CSRSigningControllerConfiguration, out *config.CSRSigningControllerConfiguration, s conversion.Scope) error {
 | 
				
			||||||
	out.ClusterSigningCertFile = in.ClusterSigningCertFile
 | 
						out.ClusterSigningCertFile = in.ClusterSigningCertFile
 | 
				
			||||||
	out.ClusterSigningKeyFile = in.ClusterSigningKeyFile
 | 
						out.ClusterSigningKeyFile = in.ClusterSigningKeyFile
 | 
				
			||||||
 | 
						if err := Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(&in.KubeletServingSignerConfiguration, &out.KubeletServingSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(&in.KubeletClientSignerConfiguration, &out.KubeletClientSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(&in.KubeAPIServerClientSignerConfiguration, &out.KubeAPIServerClientSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_v1alpha1_CSRSigningConfiguration_To_config_CSRSigningConfiguration(&in.LegacyUnknownSignerConfiguration, &out.LegacyUnknownSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
						out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -68,6 +112,18 @@ func autoConvert_v1alpha1_CSRSigningControllerConfiguration_To_config_CSRSigning
 | 
				
			|||||||
func autoConvert_config_CSRSigningControllerConfiguration_To_v1alpha1_CSRSigningControllerConfiguration(in *config.CSRSigningControllerConfiguration, out *v1alpha1.CSRSigningControllerConfiguration, s conversion.Scope) error {
 | 
					func autoConvert_config_CSRSigningControllerConfiguration_To_v1alpha1_CSRSigningControllerConfiguration(in *config.CSRSigningControllerConfiguration, out *v1alpha1.CSRSigningControllerConfiguration, s conversion.Scope) error {
 | 
				
			||||||
	out.ClusterSigningCertFile = in.ClusterSigningCertFile
 | 
						out.ClusterSigningCertFile = in.ClusterSigningCertFile
 | 
				
			||||||
	out.ClusterSigningKeyFile = in.ClusterSigningKeyFile
 | 
						out.ClusterSigningKeyFile = in.ClusterSigningKeyFile
 | 
				
			||||||
 | 
						if err := Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(&in.KubeletServingSignerConfiguration, &out.KubeletServingSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(&in.KubeletClientSignerConfiguration, &out.KubeletClientSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(&in.KubeAPIServerClientSignerConfiguration, &out.KubeAPIServerClientSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := Convert_config_CSRSigningConfiguration_To_v1alpha1_CSRSigningConfiguration(&in.LegacyUnknownSignerConfiguration, &out.LegacyUnknownSignerConfiguration, s); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
						out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,9 +20,29 @@ limitations under the License.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package config
 | 
					package config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
				
			||||||
 | 
					func (in *CSRSigningConfiguration) DeepCopyInto(out *CSRSigningConfiguration) {
 | 
				
			||||||
 | 
						*out = *in
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSRSigningConfiguration.
 | 
				
			||||||
 | 
					func (in *CSRSigningConfiguration) DeepCopy() *CSRSigningConfiguration {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						out := new(CSRSigningConfiguration)
 | 
				
			||||||
 | 
						in.DeepCopyInto(out)
 | 
				
			||||||
 | 
						return out
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
					// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
				
			||||||
func (in *CSRSigningControllerConfiguration) DeepCopyInto(out *CSRSigningControllerConfiguration) {
 | 
					func (in *CSRSigningControllerConfiguration) DeepCopyInto(out *CSRSigningControllerConfiguration) {
 | 
				
			||||||
	*out = *in
 | 
						*out = *in
 | 
				
			||||||
 | 
						out.KubeletServingSignerConfiguration = in.KubeletServingSignerConfiguration
 | 
				
			||||||
 | 
						out.KubeletClientSignerConfiguration = in.KubeletClientSignerConfiguration
 | 
				
			||||||
 | 
						out.KubeAPIServerClientSignerConfiguration = in.KubeAPIServerClientSignerConfiguration
 | 
				
			||||||
 | 
						out.LegacyUnknownSignerConfiguration = in.LegacyUnknownSignerConfiguration
 | 
				
			||||||
	out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
						out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -246,11 +246,31 @@ type CSRSigningControllerConfiguration struct {
 | 
				
			|||||||
	// clusterSigningCertFile is the filename containing a PEM-encoded
 | 
						// clusterSigningCertFile is the filename containing a PEM-encoded
 | 
				
			||||||
	// RSA or ECDSA private key used to issue cluster-scoped certificates
 | 
						// RSA or ECDSA private key used to issue cluster-scoped certificates
 | 
				
			||||||
	ClusterSigningKeyFile string
 | 
						ClusterSigningKeyFile string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// kubeletServingSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kubelet-serving signer
 | 
				
			||||||
 | 
						KubeletServingSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// kubeletClientSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kube-apiserver-client-kubelet
 | 
				
			||||||
 | 
						KubeletClientSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// kubeAPIServerClientSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/kube-apiserver-client
 | 
				
			||||||
 | 
						KubeAPIServerClientSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
						// legacyUnknownSignerConfiguration holds the certificate and key used to issue certificates for the kubernetes.io/legacy-unknown
 | 
				
			||||||
 | 
						LegacyUnknownSignerConfiguration CSRSigningConfiguration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// clusterSigningDuration is the length of duration signed certificates
 | 
						// clusterSigningDuration is the length of duration signed certificates
 | 
				
			||||||
	// will be given.
 | 
						// will be given.
 | 
				
			||||||
	ClusterSigningDuration metav1.Duration
 | 
						ClusterSigningDuration metav1.Duration
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CSRSigningConfiguration holds information about a particular CSR signer
 | 
				
			||||||
 | 
					type CSRSigningConfiguration struct {
 | 
				
			||||||
 | 
						// certFile is the filename containing a PEM-encoded
 | 
				
			||||||
 | 
						// X509 CA certificate used to issue certificates
 | 
				
			||||||
 | 
						CertFile string
 | 
				
			||||||
 | 
						// keyFile is the filename containing a PEM-encoded
 | 
				
			||||||
 | 
						// RSA or ECDSA private key used to issue certificates
 | 
				
			||||||
 | 
						KeyFile string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DaemonSetControllerConfiguration contains elements describing DaemonSetController.
 | 
					// DaemonSetControllerConfiguration contains elements describing DaemonSetController.
 | 
				
			||||||
type DaemonSetControllerConfiguration struct {
 | 
					type DaemonSetControllerConfiguration struct {
 | 
				
			||||||
	// concurrentDaemonSetSyncs is the number of daemonset objects that are
 | 
						// concurrentDaemonSetSyncs is the number of daemonset objects that are
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,9 +41,29 @@ func (in *AttachDetachControllerConfiguration) DeepCopy() *AttachDetachControlle
 | 
				
			|||||||
	return out
 | 
						return out
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
				
			||||||
 | 
					func (in *CSRSigningConfiguration) DeepCopyInto(out *CSRSigningConfiguration) {
 | 
				
			||||||
 | 
						*out = *in
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSRSigningConfiguration.
 | 
				
			||||||
 | 
					func (in *CSRSigningConfiguration) DeepCopy() *CSRSigningConfiguration {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						out := new(CSRSigningConfiguration)
 | 
				
			||||||
 | 
						in.DeepCopyInto(out)
 | 
				
			||||||
 | 
						return out
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
					// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
				
			||||||
func (in *CSRSigningControllerConfiguration) DeepCopyInto(out *CSRSigningControllerConfiguration) {
 | 
					func (in *CSRSigningControllerConfiguration) DeepCopyInto(out *CSRSigningControllerConfiguration) {
 | 
				
			||||||
	*out = *in
 | 
						*out = *in
 | 
				
			||||||
 | 
						out.KubeletServingSignerConfiguration = in.KubeletServingSignerConfiguration
 | 
				
			||||||
 | 
						out.KubeletClientSignerConfiguration = in.KubeletClientSignerConfiguration
 | 
				
			||||||
 | 
						out.KubeAPIServerClientSignerConfiguration = in.KubeAPIServerClientSignerConfiguration
 | 
				
			||||||
 | 
						out.LegacyUnknownSignerConfiguration = in.LegacyUnknownSignerConfiguration
 | 
				
			||||||
	out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
						out.ClusterSigningDuration = in.ClusterSigningDuration
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user