From dca310aa88272e466cd6559fecf395a46bd73483 Mon Sep 17 00:00:00 2001 From: nikhiljindal Date: Tue, 24 May 2016 00:27:39 -0700 Subject: [PATCH] Updating tests --- .../cluster/cluster_client.go | 49 ++++++++++--------- .../cluster/clustercontroller_test.go | 12 +++++ federation/registry/cluster/etcd/etcd_test.go | 4 +- federation/registry/cluster/strategy_test.go | 4 +- .../unversioned/clientcmd/client_config.go | 1 + 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/federation/pkg/federation-controller/cluster/cluster_client.go b/federation/pkg/federation-controller/cluster/cluster_client.go index 0b8fdd4ebcd..12df45edc46 100644 --- a/federation/pkg/federation-controller/cluster/cluster_client.go +++ b/federation/pkg/federation-controller/cluster/cluster_client.go @@ -40,6 +40,32 @@ const ( KubeconfigSecretDataKey = "kubeconfig" ) +// 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) { + // Get the namespace this is running in from the env variable. + namespace := os.Getenv("POD_NAMESPACE") + if namespace == "" { + return nil, fmt.Errorf("unexpected: POD_NAMESPACE env var returned empty string") + } + // Get a client to talk to the k8s apiserver, to fetch secrets from it. + client, err := client.NewInCluster() + if err != nil { + return nil, fmt.Errorf("error in creating in-cluster client: %s", err) + } + secret, err := client.Secrets(namespace).Get(c.Spec.SecretRef.Name) + if err != nil { + return nil, fmt.Errorf("error in fetching secret: %s", err) + } + data, ok := secret.Data[KubeconfigSecretDataKey] + if !ok { + return nil, fmt.Errorf("secret does not have data with key: %s", KubeconfigSecretDataKey) + } + return clientcmd.Load(data) + } +} + type ClusterClient struct { discoveryClient *discovery.DiscoveryClient } @@ -64,28 +90,7 @@ func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) } var clusterClientSet = ClusterClient{} if serverAddress != "" { - // Get a client to talk to the k8s apiserver, to fetch secrets from it. - client, err := client.NewInCluster() - if err != nil { - return nil, fmt.Errorf("error in creating in-cluster client: %s", err) - } - kubeconfigGetter := func() (*clientcmdapi.Config, error) { - // Get the namespace this is running in from the env variable. - namespace := os.Getenv("POD_NAMESPACE") - if namespace == "" { - return nil, fmt.Errorf("unexpected: POD_NAMESPACE env var returned empty string") - } - secret, err := client.Secrets(namespace).Get(c.Spec.SecretRef.Name) - if err != nil { - return nil, fmt.Errorf("error in fetching secret: %s", err) - } - data, ok := secret.Data[KubeconfigSecretDataKey] - if !ok { - return nil, fmt.Errorf("secret does not have data with key: %s", KubeconfigSecretDataKey) - } - return clientcmd.Load(data) - } - + kubeconfigGetter := KubeconfigGetterForCluster(c) clusterConfig, err := clientcmd.BuildConfigFromKubeconfigGetter(serverAddress, kubeconfigGetter) if err != nil { return nil, err diff --git a/federation/pkg/federation-controller/cluster/clustercontroller_test.go b/federation/pkg/federation-controller/cluster/clustercontroller_test.go index 13491dccd40..ca7c918a01a 100644 --- a/federation/pkg/federation-controller/cluster/clustercontroller_test.go +++ b/federation/pkg/federation-controller/cluster/clustercontroller_test.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" + clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" "k8s.io/kubernetes/pkg/util" ) @@ -122,6 +123,14 @@ func TestUpdateClusterStatusOK(t *testing.T) { } federationClientSet := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller")) + // Override KubeconfigGetterForCluster to avoid having to setup service accounts and mount files with secret tokens. + originalGetter := KubeconfigGetterForCluster + KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter { + return func() (*clientcmdapi.Config, error) { + return &clientcmdapi.Config{}, nil + } + } + manager := NewclusterController(federationClientSet, 5) err = manager.UpdateClusterStatus() if err != nil { @@ -135,4 +144,7 @@ func TestUpdateClusterStatusOK(t *testing.T) { t.Errorf("Failed to Update Cluster Status") } } + + // Reset KubeconfigGetterForCluster + KubeconfigGetterForCluster = originalGetter } diff --git a/federation/registry/cluster/etcd/etcd_test.go b/federation/registry/cluster/etcd/etcd_test.go index b709c6ded56..f04a329bbd8 100644 --- a/federation/registry/cluster/etcd/etcd_test.go +++ b/federation/registry/cluster/etcd/etcd_test.go @@ -87,7 +87,9 @@ func TestUpdate(t *testing.T) { // updateFunc func(obj runtime.Object) runtime.Object { object := obj.(*federation.Cluster) - object.Spec.Credential = "bar" + object.Spec.SecretRef = &api.LocalObjectReference{ + Name: "bar", + } return object }, ) diff --git a/federation/registry/cluster/strategy_test.go b/federation/registry/cluster/strategy_test.go index 954acd89622..28db1d1abd3 100644 --- a/federation/registry/cluster/strategy_test.go +++ b/federation/registry/cluster/strategy_test.go @@ -54,14 +54,12 @@ func validNewCluster() *federation.Cluster { } func invalidNewCluster() *federation.Cluster { + // Create a cluster with empty ServerAddressByClientCIDRs (which is a required field). return &federation.Cluster{ ObjectMeta: api.ObjectMeta{ Name: "foo2", ResourceVersion: "5", }, - Spec: federation.ClusterSpec{ - Credential: "bar", - }, Status: federation.ClusterStatus{ Conditions: []federation.ClusterCondition{ {Type: federation.ClusterReady, Status: api.ConditionFalse}, diff --git a/pkg/client/unversioned/clientcmd/client_config.go b/pkg/client/unversioned/clientcmd/client_config.go index 40ccdb64eb0..c83f315a318 100644 --- a/pkg/client/unversioned/clientcmd/client_config.go +++ b/pkg/client/unversioned/clientcmd/client_config.go @@ -403,6 +403,7 @@ func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, // BuildConfigFromKubeconfigGetter is a helper function that builds configs from a master // url and a kubeconfigGetter. func BuildConfigFromKubeconfigGetter(masterUrl string, kubeconfigGetter KubeconfigGetter) (*restclient.Config, error) { + // TODO: We do not need a DeferredLoader here. Refactor code and see if we can use DirectClientConfig here. cc := NewNonInteractiveDeferredLoadingClientConfig( &ClientConfigGetter{kubeconfigGetter: kubeconfigGetter}, &ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterUrl}})