From 20c75956fd990b5c0d1cd6473914e8bb644cdd29 Mon Sep 17 00:00:00 2001 From: Quinton Hoole Date: Wed, 25 May 2016 16:41:18 -0700 Subject: [PATCH] Add federation cluster status zone and region update. --- .../cluster/cluster_client.go | 55 +++++++++++++++++++ .../cluster/clustercontroller.go | 22 ++++++++ 2 files changed, 77 insertions(+) diff --git a/federation/pkg/federation-controller/cluster/cluster_client.go b/federation/pkg/federation-controller/cluster/cluster_client.go index 12df45edc46..d177c7709ce 100644 --- a/federation/pkg/federation-controller/cluster/cluster_client.go +++ b/federation/pkg/federation-controller/cluster/cluster_client.go @@ -22,15 +22,19 @@ import ( "os" "strings" + "github.com/golang/glog" federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" + clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/typed/discovery" client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" utilnet "k8s.io/kubernetes/pkg/util/net" + "k8s.io/kubernetes/pkg/util/sets" ) const ( @@ -153,3 +157,54 @@ func (self *ClusterClient) GetClusterHealthStatus() *federation_v1alpha1.Cluster } return &clusterStatus } + +// 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) +} + +// Find the name of the zone in which a Node is running +func getZoneNameForNode(node api.Node) (string, error) { + for key, value := range node.Labels { + if key == unversioned.LabelZoneFailureDomain { + return value, nil + } + } + return "", fmt.Errorf("Zone name for node %s not found. No label with key %s", + node.Name, unversioned.LabelZoneFailureDomain) +} + +// Find the name of the region in which a Node is running +func getRegionNameForNode(node api.Node) (string, error) { + for key, value := range node.Labels { + if key == unversioned.LabelZoneRegion { + return value, nil + } + } + return "", fmt.Errorf("Region name for node %s not found. No label with key %s", + node.Name, unversioned.LabelZoneRegion) +} + +// Find the names of all zones and the region in which we have nodes in this cluster. +func getZoneNames(client *clientset.Clientset) (zones []string, region string, err error) { + zoneNames := sets.NewString() + nodes, err := client.Core().Nodes().List(api.ListOptions{}) + if err != nil { + glog.Errorf("Failed to list nodes while getting zone names: %v", err) + return nil, "", err + } + for i, node := range nodes.Items { + zoneName, err := getZoneNameForNode(node) + if err != nil { + return nil, "", err + } + zoneNames.Insert(zoneName) + if i == 0 { + region, err = getRegionNameForNode(node) + if err != nil { + return nil, "", err + } + } + } + return zoneNames.List(), region, nil +} diff --git a/federation/pkg/federation-controller/cluster/clustercontroller.go b/federation/pkg/federation-controller/cluster/clustercontroller.go index 3b1ae48e9ac..f3a10982a96 100644 --- a/federation/pkg/federation-controller/cluster/clustercontroller.go +++ b/federation/pkg/federation-controller/cluster/clustercontroller.go @@ -27,6 +27,9 @@ 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" @@ -184,6 +187,14 @@ func (cc *ClusterController) UpdateClusterStatus() error { } } } + clusterClientSet, _ := NewClusterClientset(&cluster) + zones, region, err := GetClusterZones(clusterClientSet) + if err != nil { + glog.Errorf("Failed to get zones and region for cluster %s: %v", cluster.Name, err) + } else { + clusterStatusNew.Zones = zones + clusterStatusNew.Region = region + } cc.clusterClusterStatusMap[cluster.Name] = *clusterStatusNew cluster.Status = *clusterStatusNew cluster, err := cc.federationClient.Federation().Clusters().UpdateStatus(&cluster) @@ -194,3 +205,14 @@ func (cc *ClusterController) UpdateClusterStatus() error { } 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 +}