From 53d4b15b8748d23338da38b3862448f20248edc9 Mon Sep 17 00:00:00 2001 From: AdoHe Date: Sun, 14 Feb 2016 03:14:20 -0500 Subject: [PATCH] move columns into wide option to make result more readable --- pkg/kubectl/cmd/cmd_test.go | 51 +++++++++++++++++-- pkg/kubectl/resource_printer.go | 89 ++++++++++++++++++++++++--------- 2 files changed, 112 insertions(+), 28 deletions(-) diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index 88c2bbc259..82783c34f1 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -363,8 +363,49 @@ func ExamplePrintReplicationControllerWithNamespace() { fmt.Printf("Unexpected error: %v", err) } // Output: - // NAMESPACE CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE - // beep foo foo someimage foo=bar 1 10y + // NAMESPACE CONTROLLER REPLICAS AGE + // beep foo 1 10y +} + +func ExamplePrintReplicationControllerWithWide() { + f, tf, codec := NewAPIFactory() + tf.Printer = kubectl.NewHumanReadablePrinter(false, false, true, false, false, false, []string{}) + tf.Client = &fake.RESTClient{ + Codec: codec, + Client: nil, + } + cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) + ctrl := &api.ReplicationController{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + Labels: map[string]string{"foo": "bar"}, + CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, + }, + Spec: api.ReplicationControllerSpec{ + Replicas: 1, + Selector: map[string]string{"foo": "bar"}, + Template: &api.PodTemplateSpec{ + ObjectMeta: api.ObjectMeta{ + Labels: map[string]string{"foo": "bar"}, + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "foo", + Image: "someimage", + }, + }, + }, + }, + }, + } + err := f.PrintObject(cmd, ctrl, os.Stdout) + if err != nil { + fmt.Printf("Unexpected error: %v", err) + } + // Output: + // CONTROLLER REPLICAS AGE CONTAINER(S) IMAGE(S) SELECTOR + // foo 1 10y foo someimage foo=bar } func ExamplePrintPodWithWideFormat() { @@ -635,9 +676,9 @@ func ExamplePrintServiceWithNamespacesAndLabels() { fmt.Printf("Unexpected error: %v", err) } // Output: - // |NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR AGE L1| - // |ns1 svc1 10.1.1.1 unknown 53/UDP,53/TCP s=magic 10y value| - // |ns2 svc2 10.1.1.2 unknown 80/TCP,8080/TCP s=kazam 10y dolla-bill-yall| + // |NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE L1| + // |ns1 svc1 10.1.1.1 unknown 53/UDP,53/TCP 10y value| + // |ns2 svc2 10.1.1.2 unknown 80/TCP,8080/TCP 10y dolla-bill-yall| // || } diff --git a/pkg/kubectl/resource_printer.go b/pkg/kubectl/resource_printer.go index 3d5d4e2329..5236dff7c8 100644 --- a/pkg/kubectl/resource_printer.go +++ b/pkg/kubectl/resource_printer.go @@ -396,14 +396,14 @@ func (h *HumanReadablePrinter) HandledResources() []string { // pkg/kubectl/cmd/get.go to reflect the new resource type. var podColumns = []string{"NAME", "READY", "STATUS", "RESTARTS", "AGE"} var podTemplateColumns = []string{"TEMPLATE", "CONTAINER(S)", "IMAGE(S)", "PODLABELS"} -var replicationControllerColumns = []string{"CONTROLLER", "CONTAINER(S)", "IMAGE(S)", "SELECTOR", "REPLICAS", "AGE"} -var replicaSetColumns = []string{"CONTROLLER", "CONTAINER(S)", "IMAGE(S)", "SELECTOR", "REPLICAS", "AGE"} -var jobColumns = []string{"JOB", "CONTAINER(S)", "IMAGE(S)", "SELECTOR", "SUCCESSFUL"} -var serviceColumns = []string{"NAME", "CLUSTER-IP", "EXTERNAL-IP", "PORT(S)", "SELECTOR", "AGE"} +var replicationControllerColumns = []string{"CONTROLLER", "REPLICAS", "AGE"} +var replicaSetColumns = []string{"CONTROLLER", "REPLICAS", "AGE"} +var jobColumns = []string{"JOB", "SUCCESSFUL"} +var serviceColumns = []string{"NAME", "CLUSTER-IP", "EXTERNAL-IP", "PORT(S)", "AGE"} var ingressColumns = []string{"NAME", "RULE", "BACKEND", "ADDRESS"} var endpointColumns = []string{"NAME", "ENDPOINTS", "AGE"} var nodeColumns = []string{"NAME", "STATUS", "AGE"} -var daemonSetColumns = []string{"NAME", "CONTAINER(S)", "IMAGE(S)", "SELECTOR", "NODE-SELECTOR"} +var daemonSetColumns = []string{"NAME", "NODE-SELECTOR"} var eventColumns = []string{"FIRSTSEEN", "LASTSEEN", "COUNT", "NAME", "KIND", "SUBOBJECT", "TYPE", "REASON", "SOURCE", "MESSAGE"} var limitRangeColumns = []string{"NAME", "AGE"} var resourceQuotaColumns = []string{"NAME", "AGE"} @@ -703,16 +703,22 @@ func printReplicationController(controller *api.ReplicationController, w io.Writ return err } } - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\t%s", + if _, err := fmt.Fprintf(w, "%s\t%d\t%s", name, - firstContainer.Name, - firstContainer.Image, - labels.FormatLabels(controller.Spec.Selector), controller.Spec.Replicas, translateTimestamp(controller.CreationTimestamp), ); err != nil { return err } + if options.Wide { + if _, err := fmt.Fprintf(w, "\t%s\t%s\t%s", + firstContainer.Name, + firstContainer.Image, + labels.FormatLabels(controller.Spec.Selector), + ); err != nil { + return err + } + } if _, err := fmt.Fprint(w, appendLabels(controller.Labels, options.ColumnLabels)); err != nil { return err } @@ -760,16 +766,22 @@ func printReplicaSet(rs *extensions.ReplicaSet, w io.Writer, options PrintOption return err } } - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\t%s", + if _, err := fmt.Fprintf(w, "%s\t%d\t%s", name, - firstContainer.Name, - firstContainer.Image, - unversioned.FormatLabelSelector(rs.Spec.Selector), rs.Spec.Replicas, translateTimestamp(rs.CreationTimestamp), ); err != nil { return err } + if options.Wide { + if _, err := fmt.Fprintf(w, "\t%s\t%s\t%s", + firstContainer.Name, + firstContainer.Image, + unversioned.FormatLabelSelector(rs.Spec.Selector), + ); err != nil { + return err + } + } if _, err := fmt.Fprint(w, appendLabels(rs.Labels, options.ColumnLabels)); err != nil { return err } @@ -818,15 +830,21 @@ func printJob(job *extensions.Job, w io.Writer, options PrintOptions) error { } selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector) - _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d", + _, err := fmt.Fprintf(w, "%s\t%d", name, - firstContainer.Name, - firstContainer.Image, - selector.String(), job.Status.Succeeded) if err != nil { return err } + if options.Wide { + if _, err := fmt.Fprintf(w, "\t%s\t%s\t%s", + firstContainer.Name, + firstContainer.Image, + selector.String(), + ); err != nil { + return err + } + } if _, err := fmt.Fprint(w, appendLabels(job.Labels, options.ColumnLabels)); err != nil { return err } @@ -916,16 +934,20 @@ func printService(svc *api.Service, w io.Writer, options PrintOptions) error { return err } } - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s", + if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s", name, internalIP, externalIP, makePortString(svc.Spec.Ports), - labels.FormatLabels(svc.Spec.Selector), translateTimestamp(svc.CreationTimestamp), ); err != nil { return err } + if options.Wide { + if _, err := fmt.Fprintf(w, "\t%s", labels.FormatLabels(svc.Spec.Selector)); err != nil { + return err + } + } if _, err := fmt.Fprint(w, appendLabels(svc.Labels, options.ColumnLabels)); err != nil { return err } @@ -1031,15 +1053,21 @@ func printDaemonSet(ds *extensions.DaemonSet, w io.Writer, options PrintOptions) // this shouldn't happen if LabelSelector passed validation return err } - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s", + if _, err := fmt.Fprintf(w, "%s\t%s", name, - firstContainer.Name, - firstContainer.Image, - selector, labels.FormatLabels(ds.Spec.Template.Spec.NodeSelector), ); err != nil { return err } + if options.Wide { + if _, err := fmt.Fprintf(w, "\t%s\t%s\t%s", + firstContainer.Name, + firstContainer.Image, + selector, + ); err != nil { + return err + } + } if _, err := fmt.Fprint(w, appendLabels(ds.Labels, options.ColumnLabels)); err != nil { return err } @@ -1684,6 +1712,21 @@ func formatWideHeaders(wide bool, t reflect.Type) []string { if t.String() == "*api.Pod" || t.String() == "*api.PodList" { return []string{"NODE"} } + if t.String() == "*api.ReplicationController" || t.String() == "*api.ReplicationControllerList" { + return []string{"CONTAINER(S)", "IMAGE(S)", "SELECTOR"} + } + if t.String() == "*extensions.Job" || t.String() == "*extensions.JobList" { + return []string{"CONTAINER(S)", "IMAGE(S)", "SELECTOR"} + } + if t.String() == "*api.Service" || t.String() == "*api.ServiceList" { + return []string{"SELECTOR"} + } + if t.String() == "*extensions.DaemonSet" || t.String() == "*extensions.DaemonSetList" { + return []string{"CONTAINER(S)", "IMAGE(S)", "SELECTOR"} + } + if t.String() == "*extensions.ReplicaSet" || t.String() == "*extensions.ReplicaSetList" { + return []string{"CONTAINER(S)", "IMAGE(S)", "SELECTOR"} + } } return nil }