diff --git a/federation/pkg/federation-controller/cluster/cluster_client.go b/federation/pkg/federation-controller/cluster/cluster_client.go index d177c7709ce..7f5aa57e217 100644 --- a/federation/pkg/federation-controller/cluster/cluster_client.go +++ b/federation/pkg/federation-controller/cluster/cluster_client.go @@ -72,6 +72,7 @@ var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd. type ClusterClient struct { discoveryClient *discovery.DiscoveryClient + kubeClient *clientset.Clientset } func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) { @@ -105,6 +106,10 @@ func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) if clusterClientSet.discoveryClient == nil { return nil, nil } + clusterClientSet.kubeClient = clientset.NewForConfigOrDie((restclient.AddUserAgent(clusterConfig, UserAgentName))) + if clusterClientSet.kubeClient == nil { + return nil, nil + } } return &clusterClientSet, err } @@ -159,8 +164,8 @@ func (self *ClusterClient) GetClusterHealthStatus() *federation_v1alpha1.Cluster } // GetClusterZones gets the kubernetes cluster zones and region by inspecting labels on nodes in the cluster. -func GetClusterZones(client *clientset.Clientset) (zones []string, region string, err error) { - return getZoneNames(client) +func (self *ClusterClient) GetClusterZones() (zones []string, region string, err error) { + return getZoneNames(self.kubeClient) } // Find the name of the zone in which a Node is running @@ -194,6 +199,11 @@ func getZoneNames(client *clientset.Clientset) (zones []string, region string, e return nil, "", err } for i, node := range nodes.Items { + // TODO: quinton-hoole make this more efficient. + // For non-multi-zone clusters the zone will + // be identical for all nodes, so we only need to look at one node + // For multi-zone clusters we know at build time + // which zones are included. Rather get this info from there, because it's cheaper. zoneName, err := getZoneNameForNode(node) if err != nil { return nil, "", err diff --git a/federation/pkg/federation-controller/cluster/clustercontroller.go b/federation/pkg/federation-controller/cluster/clustercontroller.go index f3a10982a96..1d3d2d5b88b 100644 --- a/federation/pkg/federation-controller/cluster/clustercontroller.go +++ b/federation/pkg/federation-controller/cluster/clustercontroller.go @@ -27,9 +27,6 @@ import ( federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/framework" "k8s.io/kubernetes/pkg/runtime" @@ -187,10 +184,16 @@ func (cc *ClusterController) UpdateClusterStatus() error { } } } - clusterClientSet, _ := NewClusterClientset(&cluster) - zones, region, err := GetClusterZones(clusterClientSet) + clusterClient, found := cc.clusterKubeClientMap[cluster.Name] + if !found { + glog.Warningf("Failed to client for cluster %s", cluster.Name) + continue + } + + zones, region, err := clusterClient.GetClusterZones() if err != nil { - glog.Errorf("Failed to get zones and region for cluster %s: %v", cluster.Name, err) + glog.Warningf("Failed to get zones and region for cluster %s: %v", cluster.Name, err) + // Don't return err here, as we want the rest of the status update to proceed. } else { clusterStatusNew.Zones = zones clusterStatusNew.Region = region @@ -199,20 +202,10 @@ func (cc *ClusterController) UpdateClusterStatus() error { cluster.Status = *clusterStatusNew cluster, err := cc.federationClient.Federation().Clusters().UpdateStatus(&cluster) if err != nil { - glog.Infof("Failed to update the status of cluster: %v ,error is : %v", cluster.Name, err) + glog.Warningf("Failed to update the status of cluster: %v ,error is : %v", cluster.Name, err) + // Don't return err here, as we want to continue processing remaining clusters. continue } } return nil } - -func NewClusterClientset(c *federation_v1alpha1.Cluster) (*clientset.Clientset, error) { // TODO: Stolen from federation/pkg/federation-controller/service/cluster_helper.go - factor it out of there. - clusterConfig, err := clientcmd.BuildConfigFromFlags(c.Spec.ServerAddressByClientCIDRs[0].ServerAddress, "") - if err != nil { - return nil, err - } - clusterConfig.QPS = KubeAPIQPS - clusterConfig.Burst = KubeAPIBurst - clientset := clientset.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, UserAgentName)) - return clientset, nil -}