From 6c8427411312d6d5cc075526977cbb26a13dd287 Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Thu, 14 Sep 2017 20:11:39 +0800 Subject: [PATCH 1/2] fix kubectl get cronjob lose age info --- pkg/printers/internalversion/printers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index aff3b46cee..7fb8f7c347 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -817,10 +817,10 @@ func printCronJob(obj *batch.CronJob, options printers.PrintOptions) ([]metav1al lastScheduleTime := "" if obj.Status.LastScheduleTime != nil { - lastScheduleTime = obj.Status.LastScheduleTime.Time.Format(time.RFC1123Z) + lastScheduleTime = translateTimestamp(*obj.Status.LastScheduleTime) } - row.Cells = append(row.Cells, obj.Name, obj.Spec.Schedule, printBoolPtr(obj.Spec.Suspend), len(obj.Status.Active), lastScheduleTime) + row.Cells = append(row.Cells, obj.Name, obj.Spec.Schedule, printBoolPtr(obj.Spec.Suspend), len(obj.Status.Active), lastScheduleTime, translateTimestamp(obj.CreationTimestamp)) if options.Wide { names, images := layoutContainerCells(obj.Spec.JobTemplate.Spec.Template.Spec.Containers) row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.JobTemplate.Spec.Selector)) From f755759997aade111f7ccee6d864be582cb9e33d Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Fri, 15 Sep 2017 17:55:40 +0800 Subject: [PATCH 2/2] add age column for storageclass and cronjob test --- pkg/printers/internalversion/printers.go | 3 +- pkg/printers/internalversion/printers_test.go | 114 ++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 7fb8f7c347..41ee8f8f0c 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -411,6 +411,7 @@ func AddHandlers(h printers.PrintHandler) { storageClassColumnDefinitions := []metav1alpha1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, {Name: "Provisioner", Type: "string", Description: storagev1.StorageClass{}.SwaggerDoc()["provisioner"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } h.TableHandler(storageClassColumnDefinitions, printStorageClass) @@ -1707,7 +1708,7 @@ func printStorageClass(obj *storage.StorageClass, options printers.PrintOptions) name += " (default)" } provtype := obj.Provisioner - row.Cells = append(row.Cells, name, provtype) + row.Cells = append(row.Cells, name, provtype, translateTimestamp(obj.CreationTimestamp)) return []metav1alpha1.TableRow{row}, nil } diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index ababeaca3b..0c2454ebd2 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -48,6 +48,7 @@ import ( "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/apis/storage" kubectltesting "k8s.io/kubernetes/pkg/kubectl/testing" "k8s.io/kubernetes/pkg/printers" ) @@ -3017,3 +3018,116 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { buf.Reset() } } + +func TestPrintCronJob(t *testing.T) { + suspend := false + tests := []struct { + cronjob batch.CronJob + expect string + }{ + { + batch.CronJob{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cronjob1", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + Spec: batch.CronJobSpec{ + Schedule: "0/5 * * * ?", + Suspend: &suspend, + }, + Status: batch.CronJobStatus{ + LastScheduleTime: &metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + }, + "cronjob1\t0/5 * * * ?\tFalse\t0\t0s\t0s\n", + }, + { + batch.CronJob{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cronjob2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(-3e11)}, + }, + Spec: batch.CronJobSpec{ + Schedule: "0/5 * * * ?", + Suspend: &suspend, + }, + Status: batch.CronJobStatus{ + LastScheduleTime: &metav1.Time{Time: time.Now().Add(-3e10)}, + }, + }, + "cronjob2\t0/5 * * * ?\tFalse\t0\t30s\t5m\n", + }, + { + batch.CronJob{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cronjob3", + CreationTimestamp: metav1.Time{Time: time.Now().Add(-3e11)}, + }, + Spec: batch.CronJobSpec{ + Schedule: "0/5 * * * ?", + Suspend: &suspend, + }, + Status: batch.CronJobStatus{}, + }, + "cronjob3\t0/5 * * * ?\tFalse\t0\t\t5m\n", + }, + } + + buf := bytes.NewBuffer([]byte{}) + for _, test := range tests { + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.cronjob, 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() + } +} + +func TestPrintStorageClass(t *testing.T) { + tests := []struct { + sc storage.StorageClass + expect string + }{ + { + storage.StorageClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sc1", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + Provisioner: "kubernetes.io/glusterfs", + }, + "sc1\tkubernetes.io/glusterfs\t0s\n", + }, + { + storage.StorageClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sc2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(-3e11)}, + }, + Provisioner: "kubernetes.io/nfs", + }, + "sc2\tkubernetes.io/nfs\t5m\n", + }, + } + + buf := bytes.NewBuffer([]byte{}) + for _, test := range tests { + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.sc, 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() + } +}