From 80af0012f510d3048a843a04176735af953948c3 Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Tue, 30 May 2017 16:10:56 -0700 Subject: [PATCH] Implement kubectl get controllerrevisions --- pkg/printers/internalversion/BUILD | 1 + pkg/printers/internalversion/printers.go | 40 ++++++++++ pkg/printers/internalversion/printers_test.go | 78 +++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 8388489de2..d736500ec2 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -23,6 +23,7 @@ go_test( "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/v1:go_default_library", + "//pkg/apis/apps:go_default_library", "//pkg/apis/autoscaling:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index fdc141cdb6..682ab2b872 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -44,6 +44,7 @@ import ( "k8s.io/kubernetes/pkg/apis/settings" "k8s.io/kubernetes/pkg/apis/storage" storageutil "k8s.io/kubernetes/pkg/apis/storage/util" + "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/printers" "k8s.io/kubernetes/pkg/util/node" ) @@ -103,6 +104,7 @@ var ( networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"} certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"} podPresetColumns = []string{"NAME", "AGE"} + controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"} ) func printPod(pod *api.Pod, w io.Writer, options printers.PrintOptions) error { @@ -201,6 +203,8 @@ func AddHandlers(h *printers.HumanReadablePrinter) { h.Handler(podPresetColumns, nil, printPodPreset) h.Handler(podPresetColumns, nil, printPodPresetList) h.Handler(statusColumns, nil, printStatus) + h.Handler(controllerRevisionColumns, nil, printControllerRevision) + h.Handler(controllerRevisionColumns, nil, printControllerRevisionList) } // Pass ports=nil for all ports. @@ -2000,3 +2004,39 @@ 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 + } + } + + controllerRef := controller.GetControllerOf(history) + 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 +} + +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 + } + } + return nil +} diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index ff940fb278..e55071b947 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -40,6 +40,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/extensions" @@ -2257,3 +2258,80 @@ func TestAllowMissingKeys(t *testing.T) { } } } + +func TestPrintControllerRevision(t *testing.T) { + tests := []struct { + history apps.ControllerRevision + expect string + }{ + { + apps.ControllerRevision{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test1", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + OwnerReferences: []metav1.OwnerReference{ + { + Controller: boolP(true), + Kind: "DaemonSet", + Name: "foo", + }, + }, + }, + Revision: 1, + }, + "test1\tDaemonSet/foo\t1\t0s\n", + }, + { + apps.ControllerRevision{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + OwnerReferences: []metav1.OwnerReference{ + { + Controller: boolP(false), + Kind: "ABC", + Name: "foo", + }, + }, + }, + Revision: 2, + }, + "test2\t\t2\t0s\n", + }, + { + apps.ControllerRevision{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test3", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + OwnerReferences: []metav1.OwnerReference{}, + }, + Revision: 3, + }, + "test3\t\t3\t0s\n", + }, + { + apps.ControllerRevision{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test4", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + OwnerReferences: nil, + }, + Revision: 4, + }, + "test4\t\t4\t0s\n", + }, + } + + buf := bytes.NewBuffer([]byte{}) + for _, test := range tests { + printControllerRevision(&test.history, buf, printers.PrintOptions{}) + if buf.String() != test.expect { + t.Fatalf("Expected: %s, but got: %s", test.expect, buf.String()) + } + buf.Reset() + } +} + +func boolP(b bool) *bool { + return &b +}