From 3d6e2b57a9c08287b419a237c22d0a1b193db9eb Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 16:29:45 +0800 Subject: [PATCH] Add some more table printer --- pkg/printers/internalversion/BUILD | 1 + pkg/printers/internalversion/printers.go | 134 +++++++++--------- pkg/printers/internalversion/printers_test.go | 8 +- 3 files changed, 74 insertions(+), 69 deletions(-) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 28c3161d9a2..965d2a4a23c 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -98,6 +98,7 @@ go_library( "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 402865b410a..a106114be63 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -34,6 +34,7 @@ import ( apiv1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" + storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1alpha1 "k8s.io/apimachinery/pkg/apis/meta/v1alpha1" @@ -61,15 +62,6 @@ import ( const loadBalancerWidth = 16 -// NOTE: When adding a new resource type here, please update the list -// pkg/kubectl/cmd/get.go to reflect the new resource type. -var ( - storageClassColumns = []string{"NAME", "PROVISIONER"} - statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - podPresetColumns = []string{"NAME", "AGE"} - controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"} -) - // AddHandlers adds print handlers for default Kubernetes types dealing with internal versions. // TODO: handle errors from Handler func AddHandlers(h printers.PrintHandler) { @@ -361,7 +353,7 @@ func AddHandlers(h printers.PrintHandler) { clusterColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "Status", Description: "Status of the cluster"}, + {Name: "Status", Type: "string", Description: "Status of the cluster"}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } h.TableHandler(clusterColumnDefinitions, printCluster) @@ -369,7 +361,7 @@ func AddHandlers(h printers.PrintHandler) { networkPolicyColumnDefinitioins := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "Pod-Selector", Description: extensionsv1beta1.NetworkPolicySpec{}.SwaggerDoc()["podSelector"]}, + {Name: "Pod-Selector", Type: "string", Description: extensionsv1beta1.NetworkPolicySpec{}.SwaggerDoc()["podSelector"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } h.TableHandler(networkPolicyColumnDefinitioins, printExtensionsNetworkPolicy) @@ -402,17 +394,36 @@ func AddHandlers(h printers.PrintHandler) { certificateSigningRequestColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, - {Name: "Requestor", Description: certificatesv1beta1.CertificateSigningRequestSpec{}.SwaggerDoc()["request"]}, - {Name: "Condition", Description: certificatesv1beta1.CertificateSigningRequestStatus{}.SwaggerDoc()["conditions"]}, + {Name: "Requestor", Type: "string", Description: certificatesv1beta1.CertificateSigningRequestSpec{}.SwaggerDoc()["request"]}, + {Name: "Condition", Type: "string", Description: certificatesv1beta1.CertificateSigningRequestStatus{}.SwaggerDoc()["conditions"]}, } h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequest) h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequestList) - h.Handler(storageClassColumns, nil, printStorageClass) - h.Handler(storageClassColumns, nil, printStorageClassList) - h.Handler(statusColumns, nil, printStatus) - h.Handler(controllerRevisionColumns, nil, printControllerRevision) - h.Handler(controllerRevisionColumns, nil, printControllerRevisionList) + storageClassColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Provisioner", Type: "string", Description: storagev1.StorageClass{}.SwaggerDoc()["provisioner"]}, + } + + h.TableHandler(storageClassColumnDefinitions, printStorageClass) + h.TableHandler(storageClassColumnDefinitions, printStorageClassList) + + statusColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Status", Type: "string", Description: metav1.Status{}.SwaggerDoc()["status"]}, + {Name: "Reason", Type: "string", Description: metav1.Status{}.SwaggerDoc()["reason"]}, + {Name: "Message", Type: "string", Description: metav1.Status{}.SwaggerDoc()["Message"]}, + } + + h.TableHandler(statusColumnDefinitions, printStatus) + + controllerRevisionColumnDefinition := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Controller", Type: "string", Description: "Controller of the object"}, + {Name: "Revision", Type: "string", Description: appsv1beta1.ControllerRevision{}.SwaggerDoc()["revision"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(controllerRevisionColumnDefinition, printControllerRevision) + h.TableHandler(controllerRevisionColumnDefinition, printControllerRevisionList) AddDefaultHandlers(h) } @@ -1672,46 +1683,40 @@ func printNetworkPolicyList(list *networking.NetworkPolicyList, options printers return rows, nil } -func printStorageClass(sc *storage.StorageClass, w io.Writer, options printers.PrintOptions) error { - name := sc.Name - - if options.WithNamespace { - return fmt.Errorf("storageclass is not namespaced") +func printStorageClass(obj *storage.StorageClass, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if storageutil.IsDefaultAnnotation(sc.ObjectMeta) { + name := obj.Name + if storageutil.IsDefaultAnnotation(obj.ObjectMeta) { name += " (default)" } - provtype := sc.Provisioner + provtype := obj.Provisioner + row.Cells = append(row.Cells, name, provtype) - if _, err := fmt.Fprintf(w, "%s\t%s\t", name, provtype); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(sc.Labels, options.ColumnLabels)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, sc.Labels)); err != nil { - return err - } - - return nil + return []metav1alpha1.TableRow{row}, nil } -func printStorageClassList(scList *storage.StorageClassList, w io.Writer, options printers.PrintOptions) error { - for _, sc := range scList.Items { - if err := printStorageClass(&sc, w, options); err != nil { - return err +func printStorageClassList(list *storage.StorageClassList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printStorageClass(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } -func printStatus(status *metav1.Status, w io.Writer, options printers.PrintOptions) error { - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", status.Status, status.Reason, status.Message); err != nil { - return err +func printStatus(obj *metav1.Status, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } + row.Cells = append(row.Cells, obj.Status, obj.Reason, obj.Message) - return nil + return []metav1alpha1.TableRow{row}, nil } // Lay out all the containers on one line if use wide output. @@ -1760,38 +1765,31 @@ func formatEventSource(es api.EventSource) string { return strings.Join(EventSourceString, ", ") } -func printControllerRevision(history *apps.ControllerRevision, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, history.Name, options.WithKind) - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", history.Namespace); err != nil { - return err - } +func printControllerRevision(obj *apps.ControllerRevision, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - controllerRef := controller.GetControllerOf(history) + controllerRef := controller.GetControllerOf(obj) controllerName := "" if controllerRef != nil { withKind := true controllerName = printers.FormatResourceName(controllerRef.Kind, controllerRef.Name, withKind) } - revision := history.Revision - age := translateTimestamp(history.CreationTimestamp) - if _, err := fmt.Fprintf(w, "%s\t%s\t%d\t%s", name, controllerName, revision, age); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(history.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, history.Labels)) - return err + revision := obj.Revision + age := translateTimestamp(obj.CreationTimestamp) + row.Cells = append(row.Cells, obj.Name, controllerName, revision, age) + return []metav1alpha1.TableRow{row}, nil } -func printControllerRevisionList(list *apps.ControllerRevisionList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printControllerRevision(&item, w, options); err != nil { - return err +func printControllerRevisionList(list *apps.ControllerRevisionList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printControllerRevision(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 9ec97aa904d..1e79699829a 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -2770,7 +2770,13 @@ func TestPrintControllerRevision(t *testing.T) { buf := bytes.NewBuffer([]byte{}) for _, test := range tests { - printControllerRevision(&test.history, buf, printers.PrintOptions{}) + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.history, printers.PrintOptions{}) + if err != nil { + t.Fatal(err) + } + if err := printers.PrintTable(table, buf, printers.PrintOptions{NoHeaders: true}); err != nil { + t.Fatal(err) + } if buf.String() != test.expect { t.Fatalf("Expected: %s, but got: %s", test.expect, buf.String()) }