mirror of https://github.com/k3s-io/k3s
Merge pull request #52484 from zjj2wry/cronjob
Automatic merge from submit-queue (batch tested with PRs 50890, 52484, 52542, 52567, 50672). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.. fix kubectl get cronjob lose age info **What this PR does / why we need it**: relate with #20941 befere output: ``` NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE pi 0/5 * * * ? False 1 Thu, 14 Sep 2017 20:10:00 +0800 ``` now output: ``` admindeMacBook-Pro-2:kubectl admin$ ./kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE pi 0/5 * * * ? False 1 3m 4m ``` **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # **Special notes for your reviewer**: thanks **Release note**: ```release-note NONE ```pull/6/head
commit
476e207aef
|
@ -411,6 +411,7 @@ func AddHandlers(h printers.PrintHandler) {
|
||||||
storageClassColumnDefinitions := []metav1alpha1.TableColumnDefinition{
|
storageClassColumnDefinitions := []metav1alpha1.TableColumnDefinition{
|
||||||
{Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
|
{Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
|
||||||
{Name: "Provisioner", Type: "string", Description: storagev1.StorageClass{}.SwaggerDoc()["provisioner"]},
|
{Name: "Provisioner", Type: "string", Description: storagev1.StorageClass{}.SwaggerDoc()["provisioner"]},
|
||||||
|
{Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
|
||||||
}
|
}
|
||||||
|
|
||||||
h.TableHandler(storageClassColumnDefinitions, printStorageClass)
|
h.TableHandler(storageClassColumnDefinitions, printStorageClass)
|
||||||
|
@ -817,10 +818,10 @@ func printCronJob(obj *batch.CronJob, options printers.PrintOptions) ([]metav1al
|
||||||
|
|
||||||
lastScheduleTime := "<none>"
|
lastScheduleTime := "<none>"
|
||||||
if obj.Status.LastScheduleTime != nil {
|
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 {
|
if options.Wide {
|
||||||
names, images := layoutContainerCells(obj.Spec.JobTemplate.Spec.Template.Spec.Containers)
|
names, images := layoutContainerCells(obj.Spec.JobTemplate.Spec.Template.Spec.Containers)
|
||||||
row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.JobTemplate.Spec.Selector))
|
row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.JobTemplate.Spec.Selector))
|
||||||
|
@ -1707,7 +1708,7 @@ func printStorageClass(obj *storage.StorageClass, options printers.PrintOptions)
|
||||||
name += " (default)"
|
name += " (default)"
|
||||||
}
|
}
|
||||||
provtype := obj.Provisioner
|
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
|
return []metav1alpha1.TableRow{row}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/apis/batch"
|
"k8s.io/kubernetes/pkg/apis/batch"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
"k8s.io/kubernetes/pkg/apis/policy"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
kubectltesting "k8s.io/kubernetes/pkg/kubectl/testing"
|
kubectltesting "k8s.io/kubernetes/pkg/kubectl/testing"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
)
|
)
|
||||||
|
@ -3017,3 +3018,116 @@ func TestPrintPersistentVolumeClaim(t *testing.T) {
|
||||||
buf.Reset()
|
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<none>\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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue