diff --git a/hack/.golint_failures b/hack/.golint_failures index 55af91ab71b..953bf46eff1 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -357,7 +357,6 @@ pkg/registry/rbac/rolebinding pkg/registry/rbac/rolebinding/policybased pkg/registry/rbac/validation pkg/registry/registrytest -pkg/registry/scheduling/priorityclass/storage pkg/registry/scheduling/rest pkg/registry/settings/podpreset/storage pkg/registry/settings/rest diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index e27e9f9ec15..de875327561 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -25,6 +25,7 @@ go_test( "//pkg/apis/extensions:go_default_library", "//pkg/apis/networking:go_default_library", "//pkg/apis/policy:go_default_library", + "//pkg/apis/scheduling:go_default_library", "//pkg/apis/storage:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", @@ -97,6 +98,7 @@ go_library( "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/api/rbac/v1:go_default_library", "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index d63208d0b7c..57c156a056f 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -35,6 +35,7 @@ import ( apiv1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -55,6 +56,7 @@ import ( "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/rbac" + "k8s.io/kubernetes/pkg/apis/scheduling" "k8s.io/kubernetes/pkg/apis/storage" storageutil "k8s.io/kubernetes/pkg/apis/storage/util" "k8s.io/kubernetes/pkg/printers" @@ -438,6 +440,15 @@ func AddHandlers(h printers.PrintHandler) { h.TableHandler(resorceQuotaColumnDefinitions, printResourceQuota) h.TableHandler(resorceQuotaColumnDefinitions, printResourceQuotaList) + priorityClassColumnDefinitions := []metav1beta1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Value", Type: "integer", Description: schedulingv1beta1.PriorityClass{}.SwaggerDoc()["value"]}, + {Name: "Global-Default", Type: "boolean", Description: schedulingv1beta1.PriorityClass{}.SwaggerDoc()["globalDefault"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(priorityClassColumnDefinitions, printPriorityClass) + h.TableHandler(priorityClassColumnDefinitions, printPriorityClassList) + AddDefaultHandlers(h) } @@ -1938,3 +1949,28 @@ func printResourceQuotaList(list *api.ResourceQuotaList, options printers.PrintO } return rows, nil } + +func printPriorityClass(obj *scheduling.PriorityClass, options printers.PrintOptions) ([]metav1beta1.TableRow, error) { + row := metav1beta1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + + name := obj.Name + value := obj.Value + globalDefault := obj.GlobalDefault + row.Cells = append(row.Cells, name, int64(value), globalDefault, translateTimestampSince(obj.CreationTimestamp)) + + return []metav1beta1.TableRow{row}, nil +} + +func printPriorityClassList(list *scheduling.PriorityClassList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) { + rows := make([]metav1beta1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printPriorityClass(&list.Items[i], options) + if err != nil { + return nil, err + } + rows = append(rows, r...) + } + return rows, nil +} diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 2b0acc7940a..0c1903a66b6 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -52,6 +52,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/apis/scheduling" "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/printers" ) @@ -3487,6 +3488,51 @@ func TestPrintLease(t *testing.T) { } } +func TestPrintPriorityClass(t *testing.T) { + tests := []struct { + pc scheduling.PriorityClass + expect string + }{ + { + scheduling.PriorityClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pc1", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + Value: 1, + }, + "pc1\t1\tfalse\t0s\n", + }, + { + scheduling.PriorityClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pc2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(-3e11)}, + }, + Value: 1000000000, + GlobalDefault: true, + }, + "pc2\t1000000000\ttrue\t5m\n", + }, + } + + buf := bytes.NewBuffer([]byte{}) + for _, test := range tests { + table, err := printers.NewTablePrinter().With(AddHandlers).PrintTable(&test.pc, printers.PrintOptions{}) + if err != nil { + t.Fatal(err) + } + verifyTable(t, table) + 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 verifyTable(t *testing.T, table *metav1beta1.Table) { var panicErr interface{} func() { diff --git a/pkg/registry/scheduling/priorityclass/storage/BUILD b/pkg/registry/scheduling/priorityclass/storage/BUILD index 10bccf9d5d7..002dbc8441a 100644 --- a/pkg/registry/scheduling/priorityclass/storage/BUILD +++ b/pkg/registry/scheduling/priorityclass/storage/BUILD @@ -30,6 +30,9 @@ go_library( importpath = "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage", deps = [ "//pkg/apis/scheduling:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/scheduling/priorityclass:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/scheduling/priorityclass/storage/storage.go b/pkg/registry/scheduling/priorityclass/storage/storage.go index e0594bb16cc..2c6d7c248b8 100644 --- a/pkg/registry/scheduling/priorityclass/storage/storage.go +++ b/pkg/registry/scheduling/priorityclass/storage/storage.go @@ -27,10 +27,13 @@ import ( genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass" ) -// rest implements a RESTStorage for priority classes against etcd +// REST implements a RESTStorage for priority classes against etcd type REST struct { *genericregistry.Store } @@ -45,6 +48,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { CreateStrategy: priorityclass.Strategy, UpdateStrategy: priorityclass.Strategy, DeleteStrategy: priorityclass.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil {