From cc7e7245a31c4fef00fcfcf5f3cb4e4c681ab9d5 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Tue, 26 Nov 2019 13:09:58 -0500 Subject: [PATCH] Add CSINode/CSIDriver printers --- pkg/printers/internalversion/BUILD | 1 + pkg/printers/internalversion/printers.go | 75 +++++++++++++++++++ pkg/registry/storage/csidriver/storage/BUILD | 3 + .../storage/csidriver/storage/storage.go | 5 ++ pkg/registry/storage/csinode/storage/BUILD | 3 + .../storage/csinode/storage/storage.go | 5 ++ 6 files changed, 92 insertions(+) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 79cc54c71a5..76db20e35e9 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -91,6 +91,7 @@ go_library( "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index c34022a32d7..785ca6746e4 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -38,6 +38,7 @@ import ( rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1 "k8s.io/api/scheduling/v1" storagev1 "k8s.io/api/storage/v1" + storagev1beta1 "k8s.io/api/storage/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -481,6 +482,24 @@ func AddHandlers(h printers.PrintHandler) { } h.TableHandler(endpointSliceColumnDefinitions, printEndpointSlice) h.TableHandler(endpointSliceColumnDefinitions, printEndpointSliceList) + + csiNodeColumnDefinitions := []metav1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "Drivers", Type: "integer", Description: "Drivers indicates the number of CSI drivers registered on the node"}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(csiNodeColumnDefinitions, printCSINode) + h.TableHandler(csiNodeColumnDefinitions, printCSINodeList) + + csiDriverColumnDefinitions := []metav1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "AttachRequired", Type: "boolean", Description: storagev1beta1.CSIDriverSpec{}.SwaggerDoc()["attachRequired"]}, + {Name: "PodInfoOnMount", Type: "boolean", Description: storagev1beta1.CSIDriverSpec{}.SwaggerDoc()["podInfoOnMount"]}, + {Name: "Modes", Type: "string", Description: storagev1beta1.CSIDriverSpec{}.SwaggerDoc()["volumeLifecycleModes"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + h.TableHandler(csiDriverColumnDefinitions, printCSIDriver) + h.TableHandler(csiDriverColumnDefinitions, printCSIDriverList) } // Pass ports=nil for all ports. @@ -1188,6 +1207,62 @@ func printEndpointSliceList(list *discovery.EndpointSliceList, options printers. return rows, nil } +func printCSINode(obj *storage.CSINode, options printers.GenerateOptions) ([]metav1.TableRow, error) { + row := metav1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + row.Cells = append(row.Cells, obj.Name, len(obj.Spec.Drivers), translateTimestampSince(obj.CreationTimestamp)) + return []metav1.TableRow{row}, nil +} + +func printCSINodeList(list *storage.CSINodeList, options printers.GenerateOptions) ([]metav1.TableRow, error) { + rows := make([]metav1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printCSINode(&list.Items[i], options) + if err != nil { + return nil, err + } + rows = append(rows, r...) + } + return rows, nil +} + +func printCSIDriver(obj *storage.CSIDriver, options printers.GenerateOptions) ([]metav1.TableRow, error) { + row := metav1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + attachRequired := true + if obj.Spec.AttachRequired != nil { + attachRequired = *obj.Spec.AttachRequired + } + podInfoOnMount := false + if obj.Spec.PodInfoOnMount != nil { + podInfoOnMount = *obj.Spec.PodInfoOnMount + } + allModes := []string{} + for _, mode := range obj.Spec.VolumeLifecycleModes { + allModes = append(allModes, string(mode)) + } + modes := strings.Join(allModes, ",") + if len(modes) == 0 { + modes = "" + } + + row.Cells = append(row.Cells, obj.Name, attachRequired, podInfoOnMount, modes, translateTimestampSince(obj.CreationTimestamp)) + return []metav1.TableRow{row}, nil +} + +func printCSIDriverList(list *storage.CSIDriverList, options printers.GenerateOptions) ([]metav1.TableRow, error) { + rows := make([]metav1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printCSIDriver(&list.Items[i], options) + if err != nil { + return nil, err + } + rows = append(rows, r...) + } + return rows, nil +} func printNamespace(obj *api.Namespace, options printers.GenerateOptions) ([]metav1.TableRow, error) { row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, diff --git a/pkg/registry/storage/csidriver/storage/BUILD b/pkg/registry/storage/csidriver/storage/BUILD index 9f13812034b..7e899d90899 100644 --- a/pkg/registry/storage/csidriver/storage/BUILD +++ b/pkg/registry/storage/csidriver/storage/BUILD @@ -7,6 +7,9 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/apis/storage:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/storage/csidriver:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", diff --git a/pkg/registry/storage/csidriver/storage/storage.go b/pkg/registry/storage/csidriver/storage/storage.go index c25753aade2..3f3fea2774a 100644 --- a/pkg/registry/storage/csidriver/storage/storage.go +++ b/pkg/registry/storage/csidriver/storage/storage.go @@ -21,6 +21,9 @@ import ( "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" storageapi "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/storage/csidriver" ) @@ -45,6 +48,8 @@ func NewStorage(optsGetter generic.RESTOptionsGetter) (*CSIDriverStorage, error) UpdateStrategy: csidriver.Strategy, DeleteStrategy: csidriver.Strategy, ReturnDeletedObject: true, + + TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/storage/csinode/storage/BUILD b/pkg/registry/storage/csinode/storage/BUILD index 8c6cab452c5..e80352ce642 100644 --- a/pkg/registry/storage/csinode/storage/BUILD +++ b/pkg/registry/storage/csinode/storage/BUILD @@ -7,6 +7,9 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/apis/storage:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/storage/csinode:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", diff --git a/pkg/registry/storage/csinode/storage/storage.go b/pkg/registry/storage/csinode/storage/storage.go index 15e5d64af06..6fd562f1fa0 100644 --- a/pkg/registry/storage/csinode/storage/storage.go +++ b/pkg/registry/storage/csinode/storage/storage.go @@ -21,6 +21,9 @@ import ( "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" storageapi "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/storage/csinode" ) @@ -45,6 +48,8 @@ func NewStorage(optsGetter generic.RESTOptionsGetter) (*CSINodeStorage, error) { UpdateStrategy: csinode.Strategy, DeleteStrategy: csinode.Strategy, ReturnDeletedObject: true, + + TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil {