From 0f69f74c31595ce8f6d31eaece5d5951e3b83ebe Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 15:37:18 +0800 Subject: [PATCH 01/17] Add Event table printer --- pkg/printers/internalversion/printers.go | 75 +++++++++++------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 32c80da9f7b..dcf3f9cf6f7 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - eventColumns = []string{"LASTSEEN", "FIRSTSEEN", "COUNT", "NAME", "KIND", "SUBOBJECT", "TYPE", "REASON", "SOURCE", "MESSAGE"} namespaceColumns = []string{"NAME", "STATUS", "AGE"} secretColumns = []string{"NAME", "TYPE", "DATA", "AGE"} serviceAccountColumns = []string{"NAME", "SECRETS", "AGE"} @@ -248,8 +247,21 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(nodeColumnDefinitions, printNode) h.TableHandler(nodeColumnDefinitions, printNodeList) - h.Handler(eventColumns, nil, printEvent) - h.Handler(eventColumns, nil, printEventList) + eventColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Lastseen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["lastTimestamp"]}, + {Name: "Firtseen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["firstTimestamp"]}, + {Name: "Count", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["count"]}, + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Kind", Type: "string", Description: apiv1.Event{}.InvolvedObject.SwaggerDoc()["kind"]}, + {Name: "Subobject", Type: "string", Description: apiv1.Event{}.InvolvedObject.SwaggerDoc()["fieldPath"]}, + {Name: "Type", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["type"]}, + {Name: "Reason", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["reason"]}, + {Name: "Source", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["source"]}, + {Name: "Message", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["message"]}, + } + h.TableHandler(eventColumnDefinitions, printEvent) + h.TableHandler(eventColumnDefinitions, printEventList) + h.Handler(namespaceColumns, nil, printNamespace) h.Handler(namespaceColumns, nil, printNamespaceList) h.Handler(secretColumns, nil, printSecret) @@ -1177,57 +1189,40 @@ func printPersistentVolumeClaimList(list *api.PersistentVolumeClaimList, w io.Wr return nil } -func printEvent(event *api.Event, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, event.InvolvedObject.Name, options.WithKind) - - namespace := event.Namespace - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printEvent(obj *api.Event, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - // While watching event, we should print absolute time. var FirstTimestamp, LastTimestamp string if options.AbsoluteTimestamps { - FirstTimestamp = event.FirstTimestamp.String() - LastTimestamp = event.LastTimestamp.String() + FirstTimestamp = obj.FirstTimestamp.String() + LastTimestamp = obj.LastTimestamp.String() } else { - FirstTimestamp = translateTimestamp(event.FirstTimestamp) - LastTimestamp = translateTimestamp(event.LastTimestamp) + FirstTimestamp = translateTimestamp(obj.FirstTimestamp) + LastTimestamp = translateTimestamp(obj.LastTimestamp) } + row.Cells = append(row.Cells, LastTimestamp, FirstTimestamp, + obj.Count, obj.Name, obj.InvolvedObject.Kind, + obj.InvolvedObject.FieldPath, obj.Type, obj.Reason, + formatEventSource(obj.Source), obj.Message) - if _, err := fmt.Fprintf( - w, "%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s", - LastTimestamp, - FirstTimestamp, - event.Count, - name, - event.InvolvedObject.Kind, - event.InvolvedObject.FieldPath, - event.Type, - event.Reason, - formatEventSource(event.Source), - event.Message, - ); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(event.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, event.Labels)) - return err + return []metav1alpha1.TableRow{row}, nil } // Sorts and prints the EventList in a human-friendly format. -func printEventList(list *api.EventList, w io.Writer, options printers.PrintOptions) error { +func printEventList(list *api.EventList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + sort.Sort(events.SortableEvents(list.Items)) + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printEvent(&list.Items[i], w, options); err != nil { - return err + r, err := printEvent(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printRoleBinding(roleBinding *rbac.RoleBinding, w io.Writer, options printers.PrintOptions) error { From 9543d81bf6da96d3ca2aeacd0d477adb1c3807ae Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:04:33 +0800 Subject: [PATCH 02/17] Add namespace table printer --- pkg/printers/internalversion/printers.go | 43 ++++++++++++------------ 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index dcf3f9cf6f7..1a25c15965c 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - namespaceColumns = []string{"NAME", "STATUS", "AGE"} secretColumns = []string{"NAME", "TYPE", "DATA", "AGE"} serviceAccountColumns = []string{"NAME", "SECRETS", "AGE"} persistentVolumeColumns = []string{"NAME", "CAPACITY", "ACCESSMODES", "RECLAIMPOLICY", "STATUS", "CLAIM", "STORAGECLASS", "REASON", "AGE"} @@ -261,9 +260,15 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(eventColumnDefinitions, printEvent) h.TableHandler(eventColumnDefinitions, printEventList) + //namespaceColumns = []string{"NAME", "STATUS", "AGE"} + namespaceColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Status", Type: "string", Description: "The status of the namespace"}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(namespaceColumnDefinitions, printNamespace) + h.TableHandler(namespaceColumnDefinitions, printNamespaceList) - h.Handler(namespaceColumns, nil, printNamespace) - h.Handler(namespaceColumns, nil, printNamespaceList) h.Handler(secretColumns, nil, printSecret) h.Handler(secretColumns, nil, printSecretList) h.Handler(serviceAccountColumns, nil, printServiceAccount) @@ -947,30 +952,24 @@ func printEndpointsList(list *api.EndpointsList, options printers.PrintOptions) return rows, nil } -func printNamespace(item *api.Namespace, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, item.Name, options.WithKind) - - if options.WithNamespace { - return fmt.Errorf("namespace is not namespaced") +func printNamespace(obj *api.Namespace, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - - if _, err := fmt.Fprintf(w, "%s\t%s\t%s", name, item.Status.Phase, translateTimestamp(item.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(item.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, item.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, obj.Status.Phase, translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printNamespaceList(list *api.NamespaceList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printNamespace(&item, w, options); err != nil { - return err +func printNamespaceList(list *api.NamespaceList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printNamespace(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printSecret(item *api.Secret, w io.Writer, options printers.PrintOptions) error { From 703af6964c2a9c7d761500f9e19891ef00de7748 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:10:57 +0800 Subject: [PATCH 03/17] Add secret table printer --- pkg/printers/internalversion/printers.go | 51 ++++++++++-------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 1a25c15965c..b9245a1e125 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - secretColumns = []string{"NAME", "TYPE", "DATA", "AGE"} serviceAccountColumns = []string{"NAME", "SECRETS", "AGE"} persistentVolumeColumns = []string{"NAME", "CAPACITY", "ACCESSMODES", "RECLAIMPOLICY", "STATUS", "CLAIM", "STORAGECLASS", "REASON", "AGE"} persistentVolumeClaimColumns = []string{"NAME", "STATUS", "VOLUME", "CAPACITY", "ACCESSMODES", "STORAGECLASS", "AGE"} @@ -230,8 +229,6 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(endpointColumnDefinitions, printEndpoints) h.TableHandler(endpointColumnDefinitions, printEndpointsList) - //nodeColumns = []string{"NAME", "STATUS", "AGE", "VERSION"} - //nodeWideColumns = []string{"EXTERNAL-IP", "OS-IMAGE", "KERNEL-VERSION", "CONTAINER-RUNTIME"} nodeColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Status", Type: "string", Description: "The status of the node"}, @@ -260,7 +257,7 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(eventColumnDefinitions, printEvent) h.TableHandler(eventColumnDefinitions, printEventList) - //namespaceColumns = []string{"NAME", "STATUS", "AGE"} + namespaceColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Status", Type: "string", Description: "The status of the namespace"}, @@ -269,8 +266,14 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(namespaceColumnDefinitions, printNamespace) h.TableHandler(namespaceColumnDefinitions, printNamespaceList) - h.Handler(secretColumns, nil, printSecret) - h.Handler(secretColumns, nil, printSecretList) + secretColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Type", Type: "string", Description: apiv1.Secret{}.SwaggerDoc()["type"]}, + {Name: "Data", Type: "string", Description: apiv1.Secret{}.SwaggerDoc()["data"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(secretColumnDefinitions, printSecret) + h.TableHandler(secretColumnDefinitions, printSecretList) h.Handler(serviceAccountColumns, nil, printServiceAccount) h.Handler(serviceAccountColumns, nil, printServiceAccountList) h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaim) @@ -972,34 +975,24 @@ func printNamespaceList(list *api.NamespaceList, options printers.PrintOptions) return rows, nil } -func printSecret(item *api.Secret, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, item.Name, options.WithKind) - - namespace := item.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printSecret(obj *api.Secret,options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if _, err := fmt.Fprintf(w, "%s\t%s\t%v\t%s", name, item.Type, len(item.Data), translateTimestamp(item.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(item.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, item.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, obj.Type, len(obj.Data),translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printSecret(&item, w, options); err != nil { - return err +func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printSecret(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - - return nil + return rows, nil } func printServiceAccount(item *api.ServiceAccount, w io.Writer, options printers.PrintOptions) error { From 6f893913548ab41e2eb847ead814d8a14fb0f416 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:14:27 +0800 Subject: [PATCH 04/17] Add serviceAccount table printer --- pkg/printers/internalversion/printers.go | 55 +++++++++++------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index b9245a1e125..a1da4746df8 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - serviceAccountColumns = []string{"NAME", "SECRETS", "AGE"} persistentVolumeColumns = []string{"NAME", "CAPACITY", "ACCESSMODES", "RECLAIMPOLICY", "STATUS", "CLAIM", "STORAGECLASS", "REASON", "AGE"} persistentVolumeClaimColumns = []string{"NAME", "STATUS", "VOLUME", "CAPACITY", "ACCESSMODES", "STORAGECLASS", "AGE"} componentStatusColumns = []string{"NAME", "STATUS", "MESSAGE", "ERROR"} @@ -272,10 +271,16 @@ func AddHandlers(h printers.PrintHandler) { {Name: "Data", Type: "string", Description: apiv1.Secret{}.SwaggerDoc()["data"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } - h.TableHandler(secretColumnDefinitions, printSecret) + h.TableHandler(secretColumnDefinitions, printSecret) h.TableHandler(secretColumnDefinitions, printSecretList) - h.Handler(serviceAccountColumns, nil, printServiceAccount) - h.Handler(serviceAccountColumns, nil, printServiceAccountList) + + serviceAccountColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Secrets", Type: "string", Description: apiv1.ServiceAccount{}.SwaggerDoc()["secrets"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(serviceAccountColumnDefinitions, printServiceAccount) + h.TableHandler(serviceAccountColumnDefinitions, printServiceAccountList) h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaim) h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaimList) h.Handler(persistentVolumeColumns, nil, printPersistentVolume) @@ -975,15 +980,15 @@ func printNamespaceList(list *api.NamespaceList, options printers.PrintOptions) return rows, nil } -func printSecret(obj *api.Secret,options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { +func printSecret(obj *api.Secret, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { row := metav1alpha1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells = append(row.Cells, obj.Name, obj.Type, len(obj.Data),translateTimestamp(obj.CreationTimestamp)) + row.Cells = append(row.Cells, obj.Name, obj.Type, len(obj.Data), translateTimestamp(obj.CreationTimestamp)) return []metav1alpha1.TableRow{row}, nil } -func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { +func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { r, err := printSecret(&list.Items[i], options) @@ -995,34 +1000,24 @@ func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOp return rows, nil } -func printServiceAccount(item *api.ServiceAccount, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, item.Name, options.WithKind) - - namespace := item.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printServiceAccount(obj *api.ServiceAccount, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if _, err := fmt.Fprintf(w, "%s\t%d\t%s", name, len(item.Secrets), translateTimestamp(item.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(item.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, item.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, len(obj.Secrets), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printServiceAccountList(list *api.ServiceAccountList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printServiceAccount(&item, w, options); err != nil { - return err +func printServiceAccountList(list *api.ServiceAccountList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printServiceAccount(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - - return nil + return rows, nil } func printNode(obj *api.Node, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { From 11b531b7395b83efcdab082106fd1f9cba2d8a8c Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:26:54 +0800 Subject: [PATCH 05/17] Add persistentVolume table printer --- pkg/printers/internalversion/printers.go | 73 ++++++++++++------------ 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index a1da4746df8..7c374f5e517 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - persistentVolumeColumns = []string{"NAME", "CAPACITY", "ACCESSMODES", "RECLAIMPOLICY", "STATUS", "CLAIM", "STORAGECLASS", "REASON", "AGE"} persistentVolumeClaimColumns = []string{"NAME", "STATUS", "VOLUME", "CAPACITY", "ACCESSMODES", "STORAGECLASS", "AGE"} componentStatusColumns = []string{"NAME", "STATUS", "MESSAGE", "ERROR"} thirdPartyResourceColumns = []string{"NAME", "DESCRIPTION", "VERSION(S)"} @@ -281,10 +280,24 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(serviceAccountColumnDefinitions, printServiceAccount) h.TableHandler(serviceAccountColumnDefinitions, printServiceAccountList) + + persistentVolumeColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["capacity"]}, + {Name: "AccessModes", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["accessModes"]}, + {Name: "ReclaimPolicy", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["persistentVolumeReclaimPolicy"]}, + {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["phase"]}, + {Name: "Claim", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["claimRef"]}, + {Name: "StorageClass", Type: "string", Description: "StorageClass of the pv"}, + {Name: "Reason", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["reason"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolume) + h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolumeList) + h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaim) h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaimList) - h.Handler(persistentVolumeColumns, nil, printPersistentVolume) - h.Handler(persistentVolumeColumns, nil, printPersistentVolumeList) + h.Handler(componentStatusColumns, nil, printComponentStatus) h.Handler(componentStatusColumns, nil, printComponentStatusList) h.Handler(thirdPartyResourceColumns, nil, printThirdPartyResource) @@ -1089,51 +1102,41 @@ func printNodeList(list *api.NodeList, options printers.PrintOptions) ([]metav1a return rows, nil } -func printPersistentVolume(pv *api.PersistentVolume, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, pv.Name, options.WithKind) - - if options.WithNamespace { - return fmt.Errorf("persistentVolume is not namespaced") +func printPersistentVolume(obj *api.PersistentVolume, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } claimRefUID := "" - if pv.Spec.ClaimRef != nil { - claimRefUID += pv.Spec.ClaimRef.Namespace + if obj.Spec.ClaimRef != nil { + claimRefUID += obj.Spec.ClaimRef.Namespace claimRefUID += "/" - claimRefUID += pv.Spec.ClaimRef.Name + claimRefUID += obj.Spec.ClaimRef.Name } - modesStr := helper.GetAccessModesAsString(pv.Spec.AccessModes) - reclaimPolicyStr := string(pv.Spec.PersistentVolumeReclaimPolicy) + modesStr := helper.GetAccessModesAsString(obj.Spec.AccessModes) + reclaimPolicyStr := string(obj.Spec.PersistentVolumeReclaimPolicy) - aQty := pv.Spec.Capacity[api.ResourceStorage] + aQty := obj.Spec.Capacity[api.ResourceStorage] aSize := aQty.String() - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", - name, - aSize, modesStr, reclaimPolicyStr, - pv.Status.Phase, - claimRefUID, - helper.GetPersistentVolumeClass(pv), - pv.Status.Reason, - translateTimestamp(pv.CreationTimestamp), - ); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(pv.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, pv.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, aSize, modesStr, reclaimPolicyStr, + obj.Status.Phase, claimRefUID, helper.GetPersistentVolumeClass(obj), + obj.Status.Reason, + translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printPersistentVolumeList(list *api.PersistentVolumeList, w io.Writer, options printers.PrintOptions) error { - for _, pv := range list.Items { - if err := printPersistentVolume(&pv, w, options); err != nil { - return err +func printPersistentVolumeList(list *api.PersistentVolumeList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printPersistentVolume(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printPersistentVolumeClaim(pvc *api.PersistentVolumeClaim, w io.Writer, options printers.PrintOptions) error { From c1ff87996ac3d65f20abe6bb6e6afe9259a7d8c4 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:34:23 +0800 Subject: [PATCH 06/17] Add persistentVolumeClaim table printer --- pkg/printers/internalversion/printers.go | 58 ++++++++++++------------ 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 7c374f5e517..51e8991ac3d 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - persistentVolumeClaimColumns = []string{"NAME", "STATUS", "VOLUME", "CAPACITY", "ACCESSMODES", "STORAGECLASS", "AGE"} componentStatusColumns = []string{"NAME", "STATUS", "MESSAGE", "ERROR"} thirdPartyResourceColumns = []string{"NAME", "DESCRIPTION", "VERSION(S)"} roleBindingColumns = []string{"NAME", "AGE"} @@ -295,8 +294,16 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolume) h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolumeList) - h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaim) - h.Handler(persistentVolumeClaimColumns, nil, printPersistentVolumeClaimList) + persistentVolumeClaimColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["phase"]}, + {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["capacity"]}, + {Name: "AccessModes", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["accessModes"]}, + {Name: "StorageClass", Type: "string", Description: "StorageClass of the pvc"}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaim) + h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaimList) h.Handler(componentStatusColumns, nil, printComponentStatus) h.Handler(componentStatusColumns, nil, printComponentStatusList) @@ -1139,44 +1146,35 @@ func printPersistentVolumeList(list *api.PersistentVolumeList, options printers. return rows, nil } -func printPersistentVolumeClaim(pvc *api.PersistentVolumeClaim, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, pvc.Name, options.WithKind) - - namespace := pvc.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printPersistentVolumeClaim(obj *api.PersistentVolumeClaim, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - phase := pvc.Status.Phase - storage := pvc.Spec.Resources.Requests[api.ResourceStorage] + phase := obj.Status.Phase + storage := obj.Spec.Resources.Requests[api.ResourceStorage] capacity := "" accessModes := "" - if pvc.Spec.VolumeName != "" { - accessModes = helper.GetAccessModesAsString(pvc.Status.AccessModes) - storage = pvc.Status.Capacity[api.ResourceStorage] + if obj.Spec.VolumeName != "" { + accessModes = helper.GetAccessModesAsString(obj.Status.AccessModes) + storage = obj.Status.Capacity[api.ResourceStorage] capacity = storage.String() } - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s", name, phase, pvc.Spec.VolumeName, capacity, accessModes, helper.GetPersistentVolumeClaimClass(pvc), translateTimestamp(pvc.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(pvc.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, pvc.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, phase, obj.Spec.VolumeName, capacity, accessModes, helper.GetPersistentVolumeClaimClass(obj), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printPersistentVolumeClaimList(list *api.PersistentVolumeClaimList, w io.Writer, options printers.PrintOptions) error { - for _, psd := range list.Items { - if err := printPersistentVolumeClaim(&psd, w, options); err != nil { - return err +func printPersistentVolumeClaimList(list *api.PersistentVolumeClaimList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printPersistentVolumeClaim(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printEvent(obj *api.Event, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { From d3d18b5f51f3230c90ba867a34d9f97cad3cd0a1 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 16:57:58 +0800 Subject: [PATCH 07/17] Add componentStatus table printer --- pkg/printers/internalversion/printers.go | 48 ++++++++++++------------ 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 51e8991ac3d..cee333ba999 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - componentStatusColumns = []string{"NAME", "STATUS", "MESSAGE", "ERROR"} thirdPartyResourceColumns = []string{"NAME", "DESCRIPTION", "VERSION(S)"} roleBindingColumns = []string{"NAME", "AGE"} roleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} @@ -305,8 +304,15 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaim) h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaimList) - h.Handler(componentStatusColumns, nil, printComponentStatus) - h.Handler(componentStatusColumns, nil, printComponentStatusList) + componentStatusColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Status", Type: "string", Description: "Status of the component conditions"}, + {Name: "Message", Type: "string", Description: "Message of the component conditions"}, + {Name: "Error", Type: "string", Description: "Error of the component conditions"}, + } + h.TableHandler(componentStatusColumnDefinitions, printComponentStatus) + h.TableHandler(componentStatusColumnDefinitions, printComponentStatusList) + h.Handler(thirdPartyResourceColumns, nil, printThirdPartyResource) h.Handler(thirdPartyResourceColumns, nil, printThirdPartyResourceList) h.Handler(deploymentColumns, deploymentWideColumns, printDeployment) @@ -1200,7 +1206,6 @@ func printEvent(obj *api.Event, options printers.PrintOptions) ([]metav1alpha1.T // Sorts and prints the EventList in a human-friendly format. func printEventList(list *api.EventList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { - sort.Sort(events.SortableEvents(list.Items)) rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { @@ -1368,16 +1373,14 @@ func printCertificateSigningRequestList(list *certificates.CertificateSigningReq return nil } -func printComponentStatus(item *api.ComponentStatus, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, item.Name, options.WithKind) - - if options.WithNamespace { - return fmt.Errorf("componentStatus is not namespaced") +func printComponentStatus(obj *api.ComponentStatus, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } status := "Unknown" message := "" error := "" - for _, condition := range item.Conditions { + for _, condition := range obj.Conditions { if condition.Type == api.ComponentHealthy { if condition.Status == api.ConditionTrue { status = "Healthy" @@ -1389,25 +1392,20 @@ func printComponentStatus(item *api.ComponentStatus, w io.Writer, options printe break } } - - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s", name, status, message, error); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(item.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, item.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, status, message, error) + return []metav1alpha1.TableRow{row}, nil } -func printComponentStatusList(list *api.ComponentStatusList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printComponentStatus(&item, w, options); err != nil { - return err +func printComponentStatusList(list *api.ComponentStatusList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printComponentStatus(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - - return nil + return rows, nil } func printThirdPartyResource(rsrc *extensions.ThirdPartyResource, w io.Writer, options printers.PrintOptions) error { From 143cc7797642603960783fa1eada8726a1cacffd Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 17:22:48 +0800 Subject: [PATCH 08/17] Add table printer for 3rdpartyResource and deployment --- pkg/printers/internalversion/printers.go | 122 +++++++++--------- pkg/printers/internalversion/printers_test.go | 13 +- 2 files changed, 74 insertions(+), 61 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index cee333ba999..2db839a86a1 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -61,7 +61,6 @@ 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 ( - thirdPartyResourceColumns = []string{"NAME", "DESCRIPTION", "VERSION(S)"} roleBindingColumns = []string{"NAME", "AGE"} roleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} clusterRoleBindingColumns = []string{"NAME", "AGE"} @@ -70,8 +69,6 @@ var ( statusColumns = []string{"STATUS", "REASON", "MESSAGE"} horizontalPodAutoscalerColumns = []string{"NAME", "REFERENCE", "TARGETS", "MINPODS", "MAXPODS", "REPLICAS", "AGE"} - deploymentColumns = []string{"NAME", "DESIRED", "CURRENT", "UP-TO-DATE", "AVAILABLE", "AGE"} - deploymentWideColumns = []string{"CONTAINER(S)", "IMAGE(S)", "SELECTOR"} configMapColumns = []string{"NAME", "DATA", "AGE"} podSecurityPolicyColumns = []string{"NAME", "PRIV", "CAPS", "SELINUX", "RUNASUSER", "FSGROUP", "SUPGROUP", "READONLYROOTFS", "VOLUMES"} clusterColumns = []string{"NAME", "STATUS", "AGE"} @@ -313,10 +310,29 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(componentStatusColumnDefinitions, printComponentStatus) h.TableHandler(componentStatusColumnDefinitions, printComponentStatusList) - h.Handler(thirdPartyResourceColumns, nil, printThirdPartyResource) - h.Handler(thirdPartyResourceColumns, nil, printThirdPartyResourceList) - h.Handler(deploymentColumns, deploymentWideColumns, printDeployment) - h.Handler(deploymentColumns, deploymentWideColumns, printDeploymentList) + thirdPartyResourceColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Description", Type: "string", Description: extensionsv1beta1.ThirdPartyResource{}.SwaggerDoc()["description"]}, + {Name: "version(s)", Type: "string", Description: extensionsv1beta1.ThirdPartyResource{}.SwaggerDoc()["versions"]}, + } + + h.TableHandler(thirdPartyResourceColumnDefinitions, printThirdPartyResource) + h.TableHandler(thirdPartyResourceColumnDefinitions, printThirdPartyResourceList) + + deploymentColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Desired", Type: "string", Description: extensionsv1beta1.DeploymentSpec{}.SwaggerDoc()["replicas"]}, + {Name: "Current", Type: "string", Description: extensionsv1beta1.DeploymentStatus{}.SwaggerDoc()["replicas"]}, + {Name: "Up-to-date", Type: "string", Description: extensionsv1beta1.DeploymentStatus{}.SwaggerDoc()["updatedReplicas"]}, + {Name: "Available", Type: "string", Description: extensionsv1beta1.DeploymentStatus{}.SwaggerDoc()["availableReplicas"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."}, + {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."}, + {Name: "Selector", Type: "string", Priority: 1, Description: extensionsv1beta1.DeploymentSpec{}.SwaggerDoc()["selector"]}, + } + h.TableHandler(deploymentColumnDefinitions, printDeployment) + h.TableHandler(deploymentColumnDefinitions, printDeploymentList) + h.Handler(horizontalPodAutoscalerColumns, nil, printHorizontalPodAutoscaler) h.Handler(horizontalPodAutoscalerColumns, nil, printHorizontalPodAutoscalerList) h.Handler(configMapColumns, nil, printConfigMap) @@ -1408,29 +1424,31 @@ func printComponentStatusList(list *api.ComponentStatusList, options printers.Pr return rows, nil } -func printThirdPartyResource(rsrc *extensions.ThirdPartyResource, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, rsrc.Name, options.WithKind) +func printThirdPartyResource(obj *extensions.ThirdPartyResource, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } - versions := make([]string, len(rsrc.Versions)) - for ix := range rsrc.Versions { - version := &rsrc.Versions[ix] + versions := make([]string, len(obj.Versions)) + for ix := range obj.Versions { + version := &obj.Versions[ix] versions[ix] = fmt.Sprintf("%s", version.Name) } versionsString := strings.Join(versions, ",") - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", name, rsrc.Description, versionsString); err != nil { - return err - } - return nil + row.Cells = append(row.Cells, obj.Name, obj.Description, versionsString) + return []metav1alpha1.TableRow{row}, nil } -func printThirdPartyResourceList(list *extensions.ThirdPartyResourceList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printThirdPartyResource(&item, w, options); err != nil { - return err +func printThirdPartyResourceList(list *extensions.ThirdPartyResourceList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printThirdPartyResource(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - - return nil + return rows, nil } func truncate(str string, maxLen int) string { @@ -1440,53 +1458,39 @@ func truncate(str string, maxLen int) string { return str } -func printDeployment(deployment *extensions.Deployment, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, deployment.Name, options.WithKind) - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", deployment.Namespace); err != nil { - return err - } +func printDeployment(obj *extensions.Deployment, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - - desiredReplicas := deployment.Spec.Replicas - currentReplicas := deployment.Status.Replicas - updatedReplicas := deployment.Status.UpdatedReplicas - availableReplicas := deployment.Status.AvailableReplicas - age := translateTimestamp(deployment.CreationTimestamp) - containers := deployment.Spec.Template.Spec.Containers - selector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector) + desiredReplicas := obj.Spec.Replicas + currentReplicas := obj.Status.Replicas + updatedReplicas := obj.Status.UpdatedReplicas + availableReplicas := obj.Status.AvailableReplicas + age := translateTimestamp(obj.CreationTimestamp) + containers := obj.Spec.Template.Spec.Containers + selector, err := metav1.LabelSelectorAsSelector(obj.Spec.Selector) if err != nil { // this shouldn't happen if LabelSelector passed validation - return err - } - - if _, err := fmt.Fprintf(w, "%s\t%d\t%d\t%d\t%d\t%s", name, desiredReplicas, currentReplicas, updatedReplicas, availableReplicas, age); err != nil { - return err + return nil, err } + row.Cells = append(row.Cells, obj.Name, desiredReplicas, currentReplicas, updatedReplicas, availableReplicas, age) if options.Wide { - if err := layoutContainers(containers, w); err != nil { - return err - } - if _, err := fmt.Fprintf(w, "\t%s", selector.String()); err != nil { - return err - } + containers, images := layoutContainerCells(containers) + row.Cells = append(row.Cells, containers, images, selector.String()) } - - if _, err := fmt.Fprint(w, printers.AppendLabels(deployment.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err = fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, deployment.Labels)) - return err + return []metav1alpha1.TableRow{row}, nil } -func printDeploymentList(list *extensions.DeploymentList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printDeployment(&item, w, options); err != nil { - return err +func printDeploymentList(list *extensions.DeploymentList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printDeployment(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func formatHPAMetrics(specs []autoscaling.MetricSpec, statuses []autoscaling.MetricStatus) string { diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index a4542309eb9..54fdd673edb 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -1902,13 +1902,22 @@ func TestPrintDeployment(t *testing.T) { buf := bytes.NewBuffer([]byte{}) for _, test := range tests { - printDeployment(&test.deployment, buf, printers.PrintOptions{}) + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.deployment, 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, got: %s", test.expect, buf.String()) } buf.Reset() + table, err = printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.deployment, printers.PrintOptions{Wide: true}) // print deployment with '-o wide' option - printDeployment(&test.deployment, buf, printers.PrintOptions{Wide: true}) + if err := printers.PrintTable(table, buf, printers.PrintOptions{Wide: true, NoHeaders: true}); err != nil { + t.Fatal(err) + } if buf.String() != test.wideExpect { t.Fatalf("Expected: %s, got: %s", test.wideExpect, buf.String()) } From 69c52988861f25b8313cba1122d770d6ddef6315 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 18:02:54 +0800 Subject: [PATCH 09/17] Add table printer for hpa --- pkg/printers/internalversion/printers.go | 85 +++++++++---------- pkg/printers/internalversion/printers_test.go | 10 +-- 2 files changed, 43 insertions(+), 52 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 2db839a86a1..dd20a9584ca 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -27,6 +27,7 @@ import ( "time" appsv1beta1 "k8s.io/api/apps/v1beta1" + autoscalingv2alpha1 "k8s.io/api/autoscaling/v2alpha1" batchv1 "k8s.io/api/batch/v1" batchv2alpha1 "k8s.io/api/batch/v2alpha1" apiv1 "k8s.io/api/core/v1" @@ -61,14 +62,12 @@ 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 ( - roleBindingColumns = []string{"NAME", "AGE"} - roleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} - clusterRoleBindingColumns = []string{"NAME", "AGE"} - clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} - storageClassColumns = []string{"NAME", "PROVISIONER"} - statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - - horizontalPodAutoscalerColumns = []string{"NAME", "REFERENCE", "TARGETS", "MINPODS", "MAXPODS", "REPLICAS", "AGE"} + roleBindingColumns = []string{"NAME", "AGE"} + roleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} + clusterRoleBindingColumns = []string{"NAME", "AGE"} + clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} + storageClassColumns = []string{"NAME", "PROVISIONER"} + statusColumns = []string{"STATUS", "REASON", "MESSAGE"} configMapColumns = []string{"NAME", "DATA", "AGE"} podSecurityPolicyColumns = []string{"NAME", "PRIV", "CAPS", "SELINUX", "RUNASUSER", "FSGROUP", "SUPGROUP", "READONLYROOTFS", "VOLUMES"} clusterColumns = []string{"NAME", "STATUS", "AGE"} @@ -333,8 +332,17 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(deploymentColumnDefinitions, printDeployment) h.TableHandler(deploymentColumnDefinitions, printDeploymentList) - h.Handler(horizontalPodAutoscalerColumns, nil, printHorizontalPodAutoscaler) - h.Handler(horizontalPodAutoscalerColumns, nil, printHorizontalPodAutoscalerList) + horizontalPodAutoscalerColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Refrence", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["scaleTargetRef"]}, + {Name: "Targets", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["metrics"]}, + {Name: "MinPods", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["minReplicas"]}, + {Name: "MaxPods", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["maxReplicas"]}, + {Name: "Replicas", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerStatus{}.SwaggerDoc()["currentReplicas"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscaler) + h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscalerList) h.Handler(configMapColumns, nil, printConfigMap) h.Handler(configMapColumns, nil, printConfigMapList) h.Handler(podSecurityPolicyColumns, nil, printPodSecurityPolicy) @@ -1553,52 +1561,35 @@ func formatHPAMetrics(specs []autoscaling.MetricSpec, statuses []autoscaling.Met return ret } -func printHorizontalPodAutoscaler(hpa *autoscaling.HorizontalPodAutoscaler, w io.Writer, options printers.PrintOptions) error { - namespace := hpa.Namespace - name := printers.FormatResourceName(options.Kind, hpa.Name, options.WithKind) +func printHorizontalPodAutoscaler(obj *autoscaling.HorizontalPodAutoscaler, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } reference := fmt.Sprintf("%s/%s", - hpa.Spec.ScaleTargetRef.Kind, - hpa.Spec.ScaleTargetRef.Name) + obj.Spec.ScaleTargetRef.Kind, + obj.Spec.ScaleTargetRef.Name) minPods := "" - metrics := formatHPAMetrics(hpa.Spec.Metrics, hpa.Status.CurrentMetrics) - if hpa.Spec.MinReplicas != nil { - minPods = fmt.Sprintf("%d", *hpa.Spec.MinReplicas) + metrics := formatHPAMetrics(obj.Spec.Metrics, obj.Status.CurrentMetrics) + if obj.Spec.MinReplicas != nil { + minPods = fmt.Sprintf("%d", *obj.Spec.MinReplicas) } - maxPods := hpa.Spec.MaxReplicas - currentReplicas := hpa.Status.CurrentReplicas - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } - } - - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\t%d\t%s", - name, - reference, - metrics, - minPods, - maxPods, - currentReplicas, - translateTimestamp(hpa.CreationTimestamp), - ); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(hpa.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, hpa.Labels)) - return err + maxPods := obj.Spec.MaxReplicas + currentReplicas := obj.Status.CurrentReplicas + row.Cells = append(row.Cells, obj.Name, reference, metrics, minPods, maxPods, currentReplicas, translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printHorizontalPodAutoscalerList(list *autoscaling.HorizontalPodAutoscalerList, w io.Writer, options printers.PrintOptions) error { +func printHorizontalPodAutoscalerList(list *autoscaling.HorizontalPodAutoscalerList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printHorizontalPodAutoscaler(&list.Items[i], w, options); err != nil { - return err + r, err := printHorizontalPodAutoscaler(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printConfigMap(configMap *api.ConfigMap, w io.Writer, options printers.PrintOptions) error { diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 54fdd673edb..9ec97aa904d 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -2385,13 +2385,13 @@ func TestPrintHPA(t *testing.T) { buff := bytes.NewBuffer([]byte{}) for _, test := range tests { - err := printHorizontalPodAutoscaler(&test.hpa, buff, printers.PrintOptions{}) + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.hpa, printers.PrintOptions{}) if err != nil { - t.Errorf("expected %q, got error: %v", test.expected, err) - buff.Reset() - continue + t.Fatal(err) + } + if err := printers.PrintTable(table, buff, printers.PrintOptions{NoHeaders: true}); err != nil { + t.Fatal(err) } - if buff.String() != test.expected { t.Errorf("expected %q, got %q", test.expected, buff.String()) } From c4fc7168d87db263607e28aaba1d797a85194698 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 27 Jul 2017 18:12:39 +0800 Subject: [PATCH 10/17] Add table printer for configMap --- pkg/printers/internalversion/printers.go | 44 +++++++++++------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index dd20a9584ca..82e16897f11 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -68,7 +68,6 @@ var ( clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} storageClassColumns = []string{"NAME", "PROVISIONER"} statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - configMapColumns = []string{"NAME", "DATA", "AGE"} podSecurityPolicyColumns = []string{"NAME", "PRIV", "CAPS", "SELINUX", "RUNASUSER", "FSGROUP", "SUPGROUP", "READONLYROOTFS", "VOLUMES"} clusterColumns = []string{"NAME", "STATUS", "AGE"} networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"} @@ -343,8 +342,14 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscaler) h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscalerList) - h.Handler(configMapColumns, nil, printConfigMap) - h.Handler(configMapColumns, nil, printConfigMapList) + + configMapColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Data", Type: "string", Description: apiv1.ConfigMap{}.SwaggerDoc()["data"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(configMapColumnDefinitions, printConfigMap) + h.TableHandler(configMapColumnDefinitions, printConfigMapList) h.Handler(podSecurityPolicyColumns, nil, printPodSecurityPolicy) h.Handler(podSecurityPolicyColumns, nil, printPodSecurityPolicyList) h.Handler(clusterColumns, nil, printCluster) @@ -1592,33 +1597,24 @@ func printHorizontalPodAutoscalerList(list *autoscaling.HorizontalPodAutoscalerL return rows, nil } -func printConfigMap(configMap *api.ConfigMap, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, configMap.Name, options.WithKind) - - namespace := configMap.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printConfigMap(obj *api.ConfigMap, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if _, err := fmt.Fprintf(w, "%s\t%v\t%s", name, len(configMap.Data), translateTimestamp(configMap.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(configMap.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, configMap.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, len(obj.Data), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printConfigMapList(list *api.ConfigMapList, w io.Writer, options printers.PrintOptions) error { +func printConfigMapList(list *api.ConfigMapList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printConfigMap(&list.Items[i], w, options); err != nil { - return err + r, err := printConfigMap(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printPodSecurityPolicy(item *extensions.PodSecurityPolicy, w io.Writer, options printers.PrintOptions) error { From 241f30b96931468488139f3c8b27faaa28d71513 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 14:34:32 +0800 Subject: [PATCH 11/17] Add table printer for psp --- pkg/printers/internalversion/BUILD | 1 + pkg/printers/internalversion/printers.go | 46 +++++++++++++++--------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 2c38c4d9ecc..1df7fb1b80a 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -91,6 +91,7 @@ go_library( "//vendor/github.com/fatih/camelcase:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", + "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 82e16897f11..e37346454d1 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -68,7 +68,6 @@ var ( clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} storageClassColumns = []string{"NAME", "PROVISIONER"} statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - podSecurityPolicyColumns = []string{"NAME", "PRIV", "CAPS", "SELINUX", "RUNASUSER", "FSGROUP", "SUPGROUP", "READONLYROOTFS", "VOLUMES"} clusterColumns = []string{"NAME", "STATUS", "AGE"} networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"} certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"} @@ -350,8 +349,20 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(configMapColumnDefinitions, printConfigMap) h.TableHandler(configMapColumnDefinitions, printConfigMapList) - h.Handler(podSecurityPolicyColumns, nil, printPodSecurityPolicy) - h.Handler(podSecurityPolicyColumns, nil, printPodSecurityPolicyList) + + podSecurityPolicyColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Data", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["privileged"]}, + {Name: "Caps", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["allowedCapabilities"]}, + {Name: "Selinux", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["seLinux"]}, + {Name: "RunAsUser", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["runAsUser"]}, + {Name: "FsGroup", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["fsGroup"]}, + {Name: "SupGroup", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["supplementalGroups"]}, + {Name: "ReadOnlyRootFs", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["readOnlyRootFilesystem"]}, + {Name: "Volumes", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["volumes"]}, + } + h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicy) + h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicyList) h.Handler(clusterColumns, nil, printCluster) h.Handler(clusterColumns, nil, printClusterList) h.Handler(networkPolicyColumns, nil, printExtensionsNetworkPolicy) @@ -1617,23 +1628,26 @@ func printConfigMapList(list *api.ConfigMapList, options printers.PrintOptions) return rows, nil } -func printPodSecurityPolicy(item *extensions.PodSecurityPolicy, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, item.Name, options.WithKind) - - _, err := fmt.Fprintf(w, "%s\t%t\t%v\t%s\t%s\t%s\t%s\t%t\t%v\n", name, item.Spec.Privileged, - item.Spec.AllowedCapabilities, item.Spec.SELinux.Rule, - item.Spec.RunAsUser.Rule, item.Spec.FSGroup.Rule, item.Spec.SupplementalGroups.Rule, item.Spec.ReadOnlyRootFilesystem, item.Spec.Volumes) - return err +func printPodSecurityPolicy(obj *extensions.PodSecurityPolicy, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + row.Cells = append(row.Cells, obj.Name, obj.Spec.Privileged, + obj.Spec.AllowedCapabilities, obj.Spec.SELinux.Rule, + obj.Spec.RunAsUser.Rule, obj.Spec.FSGroup.Rule, obj.Spec.SupplementalGroups.Rule, obj.Spec.ReadOnlyRootFilesystem, obj.Spec.Volumes) + return []metav1alpha1.TableRow{row}, nil } -func printPodSecurityPolicyList(list *extensions.PodSecurityPolicyList, w io.Writer, options printers.PrintOptions) error { - for _, item := range list.Items { - if err := printPodSecurityPolicy(&item, w, options); err != nil { - return err +func printPodSecurityPolicyList(list *extensions.PodSecurityPolicyList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printPodSecurityPolicy(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - - return nil + return rows, nil } func printExtensionsNetworkPolicy(networkPolicy *extensions.NetworkPolicy, w io.Writer, options printers.PrintOptions) error { From cd91fc53cd359ed3b9c35497acd6cf2b2f9bb505 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 14:50:05 +0800 Subject: [PATCH 12/17] Add table printer for cluster --- pkg/printers/internalversion/printers.go | 45 +++++++++++++----------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index e37346454d1..e7cc625789c 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -68,7 +68,6 @@ var ( clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} storageClassColumns = []string{"NAME", "PROVISIONER"} statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - clusterColumns = []string{"NAME", "STATUS", "AGE"} networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"} certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"} podPresetColumns = []string{"NAME", "AGE"} @@ -363,8 +362,15 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicy) h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicyList) - h.Handler(clusterColumns, nil, printCluster) - h.Handler(clusterColumns, nil, printClusterList) + + clusterColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Status", Description: "Status of the cluster"}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(clusterColumnDefinitions, printCluster) + h.TableHandler(clusterColumnDefinitions, printClusterList) + h.Handler(networkPolicyColumns, nil, printExtensionsNetworkPolicy) h.Handler(networkPolicyColumns, nil, printExtensionsNetworkPolicyList) h.Handler(networkPolicyColumns, nil, printNetworkPolicy) @@ -694,11 +700,13 @@ func printReplicaSetList(list *extensions.ReplicaSetList, options printers.Print return rows, nil } -func printCluster(c *federation.Cluster, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, c.Name, options.WithKind) +func printCluster(obj *federation.Cluster, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } var statuses []string - for _, condition := range c.Status.Conditions { + for _, condition := range obj.Status.Conditions { if condition.Status == api.ConditionTrue { statuses = append(statuses, string(condition.Type)) } else { @@ -708,23 +716,20 @@ func printCluster(c *federation.Cluster, w io.Writer, options printers.PrintOpti if len(statuses) == 0 { statuses = append(statuses, "Unknown") } - - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", - name, - strings.Join(statuses, ","), - translateTimestamp(c.CreationTimestamp), - ); err != nil { - return err - } - return nil + row.Cells = append(row.Cells, obj.Name, strings.Join(statuses, ","), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printClusterList(list *federation.ClusterList, w io.Writer, options printers.PrintOptions) error { - for _, rs := range list.Items { - if err := printCluster(&rs, w, options); err != nil { - return err + +func printClusterList(list *federation.ClusterList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printCluster(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printJob(obj *batch.Job, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { From 623efb4e9c401355ab3351dd6fbf7c66fbdf81dd Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 15:20:13 +0800 Subject: [PATCH 13/17] Add table printer for rolebinding clusterRoleBinding --- pkg/printers/internalversion/printers.go | 213 +++++++++-------------- 1 file changed, 87 insertions(+), 126 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index e7cc625789c..6fa040ffd6c 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -32,6 +32,7 @@ import ( batchv2alpha1 "k8s.io/api/batch/v2alpha1" apiv1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1alpha1 "k8s.io/apimachinery/pkg/apis/meta/v1alpha1" @@ -62,13 +63,8 @@ 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 ( - roleBindingColumns = []string{"NAME", "AGE"} - roleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} - clusterRoleBindingColumns = []string{"NAME", "AGE"} - clusterRoleBindingWideColumns = []string{"ROLE", "USERS", "GROUPS", "SERVICEACCOUNTS"} storageClassColumns = []string{"NAME", "PROVISIONER"} statusColumns = []string{"STATUS", "REASON", "MESSAGE"} - networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"} certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"} podPresetColumns = []string{"NAME", "AGE"} controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"} @@ -362,7 +358,7 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicy) h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicyList) - + clusterColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Status", Description: "Status of the cluster"}, @@ -371,14 +367,37 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(clusterColumnDefinitions, printCluster) h.TableHandler(clusterColumnDefinitions, printClusterList) - h.Handler(networkPolicyColumns, nil, printExtensionsNetworkPolicy) - h.Handler(networkPolicyColumns, nil, printExtensionsNetworkPolicyList) - h.Handler(networkPolicyColumns, nil, printNetworkPolicy) - h.Handler(networkPolicyColumns, nil, printNetworkPolicyList) - h.Handler(roleBindingColumns, roleBindingWideColumns, printRoleBinding) - h.Handler(roleBindingColumns, roleBindingWideColumns, printRoleBindingList) - h.Handler(clusterRoleBindingColumns, clusterRoleBindingWideColumns, printClusterRoleBinding) - h.Handler(clusterRoleBindingColumns, clusterRoleBindingWideColumns, printClusterRoleBindingList) + networkPolicyColumnDefinitioins := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Pod-Selector", Description: extensionsv1beta1.NetworkPolicySpec{}.SwaggerDoc()["podSelector"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(networkPolicyColumnDefinitioins, printExtensionsNetworkPolicy) + h.TableHandler(networkPolicyColumnDefinitioins, printExtensionsNetworkPolicyList) + h.TableHandler(networkPolicyColumnDefinitioins, printNetworkPolicy) + h.TableHandler(networkPolicyColumnDefinitioins, printNetworkPolicyList) + + roleBindingsColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + {Name: "Role", Type: "string", Priority: 1, Description: rbacv1beta1.RoleBinding{}.SwaggerDoc()["roleRef"]}, + {Name: "Users", Type: "string", Priority: 1, Description: "Users in the roleBinding"}, + {Name: "Groups", Type: "string", Priority: 1, Description: "Gruops in the roleBinding"}, + {Name: "ServiceAccounts", Type: "string", Priority: 1, Description: "ServiceAccounts in the roleBinding"}, + } + h.TableHandler(roleBindingsColumnDefinitions, printRoleBinding) + h.TableHandler(roleBindingsColumnDefinitions, printRoleBindingList) + + clusterRoleBindingsColumnDefinitions := []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + {Name: "Role", Type: "string", Priority: 1, Description: rbacv1beta1.ClusterRoleBinding{}.SwaggerDoc()["roleRef"]}, + {Name: "Users", Type: "string", Priority: 1, Description: "Users in the roleBinding"}, + {Name: "Groups", Type: "string", Priority: 1, Description: "Gruops in the roleBinding"}, + {Name: "ServiceAccounts", Type: "string", Priority: 1, Description: "ServiceAccounts in the roleBinding"}, + } + h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBinding) + h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBindingList) h.Handler(certificateSigningRequestColumns, nil, printCertificateSigningRequest) h.Handler(certificateSigningRequestColumns, nil, printCertificateSigningRequestList) h.Handler(storageClassColumns, nil, printStorageClass) @@ -1263,98 +1282,58 @@ func printEventList(list *api.EventList, options printers.PrintOptions) ([]metav return rows, nil } -func printRoleBinding(roleBinding *rbac.RoleBinding, w io.Writer, options printers.PrintOptions) error { - meta := roleBinding.ObjectMeta - name := printers.FormatResourceName(options.Kind, meta.Name, options.WithKind) - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", meta.Namespace); err != nil { - return err - } - } - - if _, err := fmt.Fprintf( - w, "%s\t%s", - name, - translateTimestamp(meta.CreationTimestamp), - ); err != nil { - return err +func printRoleBinding(obj *rbac.RoleBinding, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } + row.Cells = append(row.Cells, obj.Name, translateTimestamp(obj.CreationTimestamp)) if options.Wide { - roleRef := fmt.Sprintf("%s/%s", roleBinding.RoleRef.Kind, roleBinding.RoleRef.Name) - users, groups, sas, _ := rbac.SubjectsStrings(roleBinding.Subjects) - if _, err := fmt.Fprintf(w, "\t%s\t%v\t%v\t%v", - roleRef, - strings.Join(users, ", "), - strings.Join(groups, ", "), - strings.Join(sas, ", "), - ); err != nil { - return err - } + roleRef := fmt.Sprintf("%s/%s", obj.RoleRef.Kind, obj.RoleRef.Name) + users, groups, sas, _ := rbac.SubjectsStrings(obj.Subjects) + row.Cells = append(row.Cells, roleRef, strings.Join(users, ", "), strings.Join(groups, ", "), strings.Join(sas, ", ")) } - - if _, err := fmt.Fprint(w, printers.AppendLabels(meta.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, meta.Labels)) - return err + return []metav1alpha1.TableRow{row}, nil } // Prints the RoleBinding in a human-friendly format. -func printRoleBindingList(list *rbac.RoleBindingList, w io.Writer, options printers.PrintOptions) error { +func printRoleBindingList(list *rbac.RoleBindingList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printRoleBinding(&list.Items[i], w, options); err != nil { - return err + r, err := printRoleBinding(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } -func printClusterRoleBinding(clusterRoleBinding *rbac.ClusterRoleBinding, w io.Writer, options printers.PrintOptions) error { - meta := clusterRoleBinding.ObjectMeta - name := printers.FormatResourceName(options.Kind, meta.Name, options.WithKind) - - if options.WithNamespace { - return fmt.Errorf("clusterRoleBinding is not namespaced") - } - - if _, err := fmt.Fprintf( - w, "%s\t%s", - name, - translateTimestamp(meta.CreationTimestamp), - ); err != nil { - return err +func printClusterRoleBinding(obj *rbac.ClusterRoleBinding, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } + row.Cells = append(row.Cells, obj.Name, translateTimestamp(obj.CreationTimestamp)) if options.Wide { - roleRef := clusterRoleBinding.RoleRef.Name - users, groups, sas, _ := rbac.SubjectsStrings(clusterRoleBinding.Subjects) - if _, err := fmt.Fprintf(w, "\t%s\t%v\t%v\t%v", - roleRef, - strings.Join(users, ", "), - strings.Join(groups, ", "), - strings.Join(sas, ", "), - ); err != nil { - return err - } + roleRef := fmt.Sprintf("%s/%s", obj.RoleRef.Kind, obj.RoleRef.Name) + users, groups, sas, _ := rbac.SubjectsStrings(obj.Subjects) + row.Cells = append(row.Cells, roleRef, strings.Join(users, ", "), strings.Join(groups, ", "), strings.Join(sas, ", ")) } - - if _, err := fmt.Fprint(w, printers.AppendLabels(meta.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, meta.Labels)) - return err + return []metav1alpha1.TableRow{row}, nil } // Prints the ClusterRoleBinding in a human-friendly format. -func printClusterRoleBindingList(list *rbac.ClusterRoleBindingList, w io.Writer, options printers.PrintOptions) error { +func printClusterRoleBindingList(list *rbac.ClusterRoleBindingList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printClusterRoleBinding(&list.Items[i], w, options); err != nil { - return err + r, err := printClusterRoleBinding(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printCertificateSigningRequest(csr *certificates.CertificateSigningRequest, w io.Writer, options printers.PrintOptions) error { @@ -1655,62 +1634,44 @@ func printPodSecurityPolicyList(list *extensions.PodSecurityPolicyList, options return rows, nil } -func printExtensionsNetworkPolicy(networkPolicy *extensions.NetworkPolicy, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, networkPolicy.Name, options.WithKind) - - namespace := networkPolicy.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printExtensionsNetworkPolicy(obj *extensions.NetworkPolicy, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if _, err := fmt.Fprintf(w, "%s\t%v\t%s", name, metav1.FormatLabelSelector(&networkPolicy.Spec.PodSelector), translateTimestamp(networkPolicy.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(networkPolicy.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, networkPolicy.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, metav1.FormatLabelSelector(&obj.Spec.PodSelector), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printExtensionsNetworkPolicyList(list *extensions.NetworkPolicyList, w io.Writer, options printers.PrintOptions) error { +func printExtensionsNetworkPolicyList(list *extensions.NetworkPolicyList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printExtensionsNetworkPolicy(&list.Items[i], w, options); err != nil { - return err + r, err := printExtensionsNetworkPolicy(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } -func printNetworkPolicy(networkPolicy *networking.NetworkPolicy, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, networkPolicy.Name, options.WithKind) - - namespace := networkPolicy.Namespace - - if options.WithNamespace { - if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { - return err - } +func printNetworkPolicy(obj *networking.NetworkPolicy, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, } - if _, err := fmt.Fprintf(w, "%s\t%v\t%s", name, metav1.FormatLabelSelector(&networkPolicy.Spec.PodSelector), translateTimestamp(networkPolicy.CreationTimestamp)); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(networkPolicy.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, networkPolicy.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, metav1.FormatLabelSelector(&obj.Spec.PodSelector), translateTimestamp(obj.CreationTimestamp)) + return []metav1alpha1.TableRow{row}, nil } -func printNetworkPolicyList(list *networking.NetworkPolicyList, w io.Writer, options printers.PrintOptions) error { +func printNetworkPolicyList(list *networking.NetworkPolicyList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printNetworkPolicy(&list.Items[i], w, options); err != nil { - return err + r, err := printNetworkPolicy(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printStorageClass(sc *storage.StorageClass, w io.Writer, options printers.PrintOptions) error { From 07dc45ea4c8280672385a685707c7ef1b1779d2a Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 15:31:20 +0800 Subject: [PATCH 14/17] Add table printer for csr --- pkg/printers/internalversion/BUILD | 2 + pkg/printers/internalversion/printers.go | 62 ++++++++++++------------ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 1df7fb1b80a..28c3161d9a2 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -94,8 +94,10 @@ go_library( "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", + "//vendor/k8s.io/api/certificates/v1beta1:go_default_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/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 6fa040ffd6c..402865b410a 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -30,6 +30,7 @@ import ( autoscalingv2alpha1 "k8s.io/api/autoscaling/v2alpha1" batchv1 "k8s.io/api/batch/v1" batchv2alpha1 "k8s.io/api/batch/v2alpha1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" apiv1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" @@ -63,11 +64,10 @@ 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"} - certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"} - podPresetColumns = []string{"NAME", "AGE"} - controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"} + 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. @@ -398,8 +398,16 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBinding) h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBindingList) - h.Handler(certificateSigningRequestColumns, nil, printCertificateSigningRequest) - h.Handler(certificateSigningRequestColumns, nil, printCertificateSigningRequestList) + + 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"]}, + } + h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequest) + h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequestList) + h.Handler(storageClassColumns, nil, printStorageClass) h.Handler(storageClassColumns, nil, printStorageClassList) h.Handler(statusColumns, nil, printStatus) @@ -1336,29 +1344,16 @@ func printClusterRoleBindingList(list *rbac.ClusterRoleBindingList, options prin return rows, nil } -func printCertificateSigningRequest(csr *certificates.CertificateSigningRequest, w io.Writer, options printers.PrintOptions) error { - name := printers.FormatResourceName(options.Kind, csr.Name, options.WithKind) - meta := csr.ObjectMeta - - status, err := extractCSRStatus(csr) +func printCertificateSigningRequest(obj *certificates.CertificateSigningRequest, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + row := metav1alpha1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + status, err := extractCSRStatus(obj) if err != nil { - return err + return nil, err } - - if _, err := fmt.Fprintf( - w, "%s\t%s\t%s\t%s", - name, - translateTimestamp(meta.CreationTimestamp), - csr.Spec.Username, - status, - ); err != nil { - return err - } - if _, err := fmt.Fprint(w, printers.AppendLabels(meta.Labels, options.ColumnLabels)); err != nil { - return err - } - _, err = fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, meta.Labels)) - return err + row.Cells = append(row.Cells, obj.Name, translateTimestamp(obj.CreationTimestamp), obj.Spec.Username, status) + return []metav1alpha1.TableRow{row}, nil } func extractCSRStatus(csr *certificates.CertificateSigningRequest) (string, error) { @@ -1388,13 +1383,16 @@ func extractCSRStatus(csr *certificates.CertificateSigningRequest) (string, erro return status, nil } -func printCertificateSigningRequestList(list *certificates.CertificateSigningRequestList, w io.Writer, options printers.PrintOptions) error { +func printCertificateSigningRequestList(list *certificates.CertificateSigningRequestList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { + rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { - if err := printCertificateSigningRequest(&list.Items[i], w, options); err != nil { - return err + r, err := printCertificateSigningRequest(&list.Items[i], options) + if err != nil { + return nil, err } + rows = append(rows, r...) } - return nil + return rows, nil } func printComponentStatus(obj *api.ComponentStatus, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { From 3d6e2b57a9c08287b419a237c22d0a1b193db9eb Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 16:29:45 +0800 Subject: [PATCH 15/17] 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()) } From 17c4cff90621e3bc2b289cd48755a2d572e43049 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Fri, 28 Jul 2017 21:21:11 +0800 Subject: [PATCH 16/17] fix secret printer --- pkg/printers/internalversion/printers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index a106114be63..95ef4aba7df 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -1097,7 +1097,7 @@ func printSecret(obj *api.Secret, options printers.PrintOptions) ([]metav1alpha1 return []metav1alpha1.TableRow{row}, nil } -func printSecretList(list *api.SecretList, w io.Writer, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { +func printSecretList(list *api.SecretList, options printers.PrintOptions) ([]metav1alpha1.TableRow, error) { rows := make([]metav1alpha1.TableRow, 0, len(list.Items)) for i := range list.Items { r, err := printSecret(&list.Items[i], options) From ecb6af2c3d793dc2ddce316c5ca8fadaaf8ea436 Mon Sep 17 00:00:00 2001 From: Haoran Wang Date: Thu, 3 Aug 2017 10:44:02 +0800 Subject: [PATCH 17/17] address comments --- pkg/printers/internalversion/printers.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 95ef4aba7df..596a8f8340d 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -221,8 +221,8 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(nodeColumnDefinitions, printNodeList) eventColumnDefinitions := []metav1alpha1.TableColumnDefinition{ - {Name: "Lastseen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["lastTimestamp"]}, - {Name: "Firtseen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["firstTimestamp"]}, + {Name: "Last Seen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["lastTimestamp"]}, + {Name: "First Seen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["firstTimestamp"]}, {Name: "Count", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["count"]}, {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Kind", Type: "string", Description: apiv1.Event{}.InvolvedObject.SwaggerDoc()["kind"]}, @@ -263,8 +263,8 @@ func AddHandlers(h printers.PrintHandler) { persistentVolumeColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["capacity"]}, - {Name: "AccessModes", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["accessModes"]}, - {Name: "ReclaimPolicy", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["persistentVolumeReclaimPolicy"]}, + {Name: "Access Modes", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["accessModes"]}, + {Name: "Reclaim Policy", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["persistentVolumeReclaimPolicy"]}, {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["phase"]}, {Name: "Claim", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["claimRef"]}, {Name: "StorageClass", Type: "string", Description: "StorageClass of the pv"}, @@ -278,7 +278,7 @@ func AddHandlers(h printers.PrintHandler) { {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["phase"]}, {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["capacity"]}, - {Name: "AccessModes", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["accessModes"]}, + {Name: "Access Modes", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["accessModes"]}, {Name: "StorageClass", Type: "string", Description: "StorageClass of the pvc"}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } @@ -297,7 +297,7 @@ func AddHandlers(h printers.PrintHandler) { thirdPartyResourceColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Description", Type: "string", Description: extensionsv1beta1.ThirdPartyResource{}.SwaggerDoc()["description"]}, - {Name: "version(s)", Type: "string", Description: extensionsv1beta1.ThirdPartyResource{}.SwaggerDoc()["versions"]}, + {Name: "Version(s)", Type: "string", Description: extensionsv1beta1.ThirdPartyResource{}.SwaggerDoc()["versions"]}, } h.TableHandler(thirdPartyResourceColumnDefinitions, printThirdPartyResource) @@ -319,7 +319,7 @@ func AddHandlers(h printers.PrintHandler) { horizontalPodAutoscalerColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "Refrence", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["scaleTargetRef"]}, + {Name: "Reference", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["scaleTargetRef"]}, {Name: "Targets", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["metrics"]}, {Name: "MinPods", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["minReplicas"]}, {Name: "MaxPods", Type: "string", Description: autoscalingv2alpha1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["maxReplicas"]}, @@ -341,7 +341,7 @@ func AddHandlers(h printers.PrintHandler) { {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Data", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["privileged"]}, {Name: "Caps", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["allowedCapabilities"]}, - {Name: "Selinux", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["seLinux"]}, + {Name: "SELinux", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["seLinux"]}, {Name: "RunAsUser", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["runAsUser"]}, {Name: "FsGroup", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["fsGroup"]}, {Name: "SupGroup", Type: "string", Description: extensionsv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["supplementalGroups"]},