From 6f8fc60d06ff73aa0fada4b8eca4532bf40c19b7 Mon Sep 17 00:00:00 2001 From: jianhuiz Date: Thu, 5 May 2016 10:30:50 -0700 Subject: [PATCH] describe for clusters --- pkg/kubectl/cmd/util/factory.go | 9 +++++ pkg/kubectl/describe.go | 59 +++++++++++++++++++++++++++++++++ pkg/kubectl/describe_test.go | 36 ++++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 0f1350b851..f2f213e379 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -356,6 +356,15 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { }, Describer: func(mapping *meta.RESTMapping) (kubectl.Describer, error) { mappingVersion := mapping.GroupVersionKind.GroupVersion() + if mapping.GroupVersionKind.Group == federation.GroupName { + fedClientSet, err := clients.FederationClientSetForVersion(&mappingVersion) + if err != nil { + return nil, err + } + if mapping.GroupVersionKind.Kind == "Cluster" { + return &kubectl.ClusterDescriber{Interface: fedClientSet}, nil + } + } client, err := clients.ClientForVersion(&mappingVersion) if err != nil { return nil, err diff --git a/pkg/kubectl/describe.go b/pkg/kubectl/describe.go index c0189f5604..09e234e422 100644 --- a/pkg/kubectl/describe.go +++ b/pkg/kubectl/describe.go @@ -29,6 +29,8 @@ import ( "time" "github.com/golang/glog" + "k8s.io/kubernetes/federation/apis/federation" + fed_clientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/resource" @@ -2016,6 +2018,63 @@ func describeConfigMap(configMap *api.ConfigMap) (string, error) { }) } +type ClusterDescriber struct { + fed_clientset.Interface +} + +func (d *ClusterDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { + cluster, err := d.Federation().Clusters().Get(name) + if err != nil { + return "", err + } + return describeCluster(cluster) +} + +func describeCluster(cluster *federation.Cluster) (string, error) { + return tabbedString(func(out io.Writer) error { + fmt.Fprintf(out, "Name:\t%s\n", cluster.Name) + fmt.Fprintf(out, "Labels:\t%s\n", labels.FormatLabels(cluster.Labels)) + + fmt.Fprintf(out, "ServerAddressByClientCIDRs:\n ClientCIDR\tServerAddress\n") + fmt.Fprintf(out, " ----\t----\n") + for _, cidrAddr := range cluster.Spec.ServerAddressByClientCIDRs { + fmt.Fprintf(out, " %v \t%v\n\n", cidrAddr.ClientCIDR, cidrAddr.ServerAddress) + } + + if len(cluster.Status.Conditions) > 0 { + fmt.Fprint(out, "Conditions:\n Type\tStatus\tLastUpdateTime\tLastTransitionTime\tReason\tMessage\n") + fmt.Fprint(out, " ----\t------\t-----------------\t------------------\t------\t-------\n") + for _, c := range cluster.Status.Conditions { + fmt.Fprintf(out, " %v \t%v \t%s \t%s \t%v \t%v\n", + c.Type, + c.Status, + c.LastProbeTime.Time.Format(time.RFC1123Z), + c.LastTransitionTime.Time.Format(time.RFC1123Z), + c.Reason, + c.Message) + } + } + + fmt.Fprintf(out, "Version:\t%s\n", cluster.Status.Version) + + if len(cluster.Status.Capacity) > 0 { + fmt.Fprintf(out, "Capacity:\n") + for resource, value := range cluster.Status.Capacity { + fmt.Fprintf(out, " %s:\t%s\n", resource, value.String()) + } + } + + if len(cluster.Status.Allocatable) > 0 { + fmt.Fprintf(out, "Allocatable:\n") + for resource, value := range cluster.Status.Allocatable { + fmt.Fprintf(out, " %s:\t%s\n", resource, value.String()) + } + } + + return nil + }) +} + // newErrNoDescriber creates a new ErrNoDescriber with the names of the provided types. func newErrNoDescriber(types ...reflect.Type) error { names := []string{} diff --git a/pkg/kubectl/describe_test.go b/pkg/kubectl/describe_test.go index f073d3050c..be6e1d3f9c 100644 --- a/pkg/kubectl/describe_test.go +++ b/pkg/kubectl/describe_test.go @@ -24,6 +24,8 @@ import ( "testing" "time" + "k8s.io/kubernetes/federation/apis/federation" + fed_fake "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset/fake" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/unversioned" @@ -522,6 +524,40 @@ func TestDescribeDeployment(t *testing.T) { } } +func TestDescribeCluster(t *testing.T) { + cluster := federation.Cluster{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + ResourceVersion: "4", + Labels: map[string]string{ + "name": "foo", + }, + }, + Spec: federation.ClusterSpec{ + ServerAddressByClientCIDRs: []federation.ServerAddressByClientCIDR{ + { + ClientCIDR: "0.0.0.0/0", + ServerAddress: "localhost:8888", + }, + }, + }, + Status: federation.ClusterStatus{ + Conditions: []federation.ClusterCondition{ + {Type: federation.ClusterReady, Status: api.ConditionTrue}, + }, + }, + } + fake := fed_fake.NewSimpleClientset(&cluster) + d := ClusterDescriber{Interface: fake} + out, err := d.Describe("any", "foo", DescriberSettings{ShowEvents: true}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if !strings.Contains(out, "foo") || !strings.Contains(out, "Version:") { + t.Errorf("unexpected out: %s", out) + } +} + func TestDescribeEvents(t *testing.T) { events := &api.EventList{