From 98c9fbb52972c84f007f2d5e5e28e489481f6d40 Mon Sep 17 00:00:00 2001 From: nikhiljindal Date: Fri, 3 Jun 2016 15:06:05 -0700 Subject: [PATCH] Updating federation-controller-manager to use secret to get federation-apiserver's kubeconfig --- .../app/controllermanager.go | 9 ++++++++- .../cluster/cluster_client.go | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/federation/cmd/federation-controller-manager/app/controllermanager.go b/federation/cmd/federation-controller-manager/app/controllermanager.go index abc1db454da..b1227bd55f8 100644 --- a/federation/cmd/federation-controller-manager/app/controllermanager.go +++ b/federation/cmd/federation-controller-manager/app/controllermanager.go @@ -44,6 +44,11 @@ import ( "github.com/spf13/pflag" ) +const ( + // "federation-apiserver-secret" is a reserved secret name which stores the kubeconfig for federation-apiserver. + FederationAPIServerSecretName = "federation-apiserver-secret" +) + // NewControllerManagerCommand creates a *cobra.Command object with default parameters func NewControllerManagerCommand() *cobra.Command { s := options.NewCMServer() @@ -71,7 +76,9 @@ func Run(s *options.CMServer) error { } else { glog.Errorf("unable to register configz: %s", err) } - restClientCfg, err := clientcmd.BuildConfigFromFlags(s.Master, s.Kubeconfig) + // Create the config to talk to federation-apiserver. + kubeconfigGetter := clustercontroller.KubeconfigGetterForSecret(FederationAPIServerSecretName) + restClientCfg, err := clientcmd.BuildConfigFromKubeconfigGetter(s.Master, kubeconfigGetter) if err != nil { return err } diff --git a/federation/pkg/federation-controller/cluster/cluster_client.go b/federation/pkg/federation-controller/cluster/cluster_client.go index 785d459d4e1..7f9157878d8 100644 --- a/federation/pkg/federation-controller/cluster/cluster_client.go +++ b/federation/pkg/federation-controller/cluster/cluster_client.go @@ -47,6 +47,19 @@ const ( // This is to inject a different kubeconfigGetter in tests. // We dont use the standard one which calls NewInCluster in tests to avoid having to setup service accounts and mount files with secret tokens. var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter { + return func() (*clientcmdapi.Config, error) { + secretRefName := "" + if c.Spec.SecretRef != nil { + secretRefName = c.Spec.SecretRef.Name + } else { + glog.Infof("didnt find secretRef for cluster %s. Trying insecure access", c.Name) + } + return KubeconfigGetterForSecret(secretRefName)() + } +} + +// KubeconfigGettterForSecret is used to get the kubeconfig from the given secret. +var KubeconfigGetterForSecret = func(secretName string) clientcmd.KubeconfigGetter { return func() (*clientcmdapi.Config, error) { // Get the namespace this is running in from the env variable. namespace := os.Getenv("POD_NAMESPACE") @@ -59,8 +72,8 @@ var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd. return nil, fmt.Errorf("error in creating in-cluster client: %s", err) } data := []byte{} - if c.Spec.SecretRef != nil { - secret, err := client.Secrets(namespace).Get(c.Spec.SecretRef.Name) + if secretName != "" { + secret, err := client.Secrets(namespace).Get(secretName) if err != nil { return nil, fmt.Errorf("error in fetching secret: %s", err) } @@ -69,8 +82,6 @@ var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd. if !ok { return nil, fmt.Errorf("secret does not have data with key: %s", KubeconfigSecretDataKey) } - } else { - glog.Infof("didnt find secretRef for cluster %s. Trying insecure access", c.Name) } return clientcmd.Load(data) }