diff --git a/pkg/describe/describe.go b/pkg/describe/describe.go index 53ba5dfc..41a09aa6 100644 --- a/pkg/describe/describe.go +++ b/pkg/describe/describe.go @@ -52,6 +52,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" schedulingv1 "k8s.io/api/scheduling/v1" storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/resource" @@ -227,6 +228,7 @@ func describerMap(clientConfig *rest.Config) (map[schema.GroupKind]ResourceDescr {Group: certificatesv1beta1.GroupName, Kind: "CertificateSigningRequest"}: &CertificateSigningRequestDescriber{c}, {Group: storagev1.GroupName, Kind: "StorageClass"}: &StorageClassDescriber{c}, {Group: storagev1.GroupName, Kind: "CSINode"}: &CSINodeDescriber{c}, + {Group: storagev1alpha1.GroupName, Kind: "VolumeAttributesClass"}: &VolumeAttributesClassDescriber{c}, {Group: policyv1beta1.GroupName, Kind: "PodDisruptionBudget"}: &PodDisruptionBudgetDescriber{c}, {Group: policyv1.GroupName, Kind: "PodDisruptionBudget"}: &PodDisruptionBudgetDescriber{c}, {Group: rbacv1.GroupName, Kind: "Role"}: &RoleDescriber{c}, @@ -410,6 +412,7 @@ func init() { describeServiceAccount, describeStatefulSet, describeStorageClass, + describeVolumeAttributesClass, ) if err != nil { klog.Fatalf("Cannot register describers: %v", err) @@ -4686,6 +4689,40 @@ func describeStorageClass(sc *storagev1.StorageClass, events *corev1.EventList) }) } +type VolumeAttributesClassDescriber struct { + clientset.Interface +} + +func (d *VolumeAttributesClassDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { + vac, err := d.StorageV1alpha1().VolumeAttributesClasses().Get(context.TODO(), name, metav1.GetOptions{}) + if err != nil { + return "", err + } + + var events *corev1.EventList + if describerSettings.ShowEvents { + events, _ = searchEvents(d.CoreV1(), vac, describerSettings.ChunkSize) + } + + return describeVolumeAttributesClass(vac, events) +} + +func describeVolumeAttributesClass(vac *storagev1alpha1.VolumeAttributesClass, events *corev1.EventList) (string, error) { + return tabbedString(func(out io.Writer) error { + w := NewPrefixWriter(out) + w.Write(LEVEL_0, "Name:\t%s\n", vac.Name) + w.Write(LEVEL_0, "Annotations:\t%s\n", labels.FormatLabels(vac.Annotations)) + w.Write(LEVEL_0, "DriverName:\t%s\n", vac.DriverName) + w.Write(LEVEL_0, "Parameters:\t%s\n", labels.FormatLabels(vac.Parameters)) + + if events != nil { + DescribeEvents(events, w) + } + + return nil + }) +} + type CSINodeDescriber struct { clientset.Interface } diff --git a/pkg/describe/describe_test.go b/pkg/describe/describe_test.go index 09673bf0..59162a49 100644 --- a/pkg/describe/describe_test.go +++ b/pkg/describe/describe_test.go @@ -40,6 +40,7 @@ import ( policyv1beta1 "k8s.io/api/policy/v1beta1" schedulingv1 "k8s.io/api/scheduling/v1" storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -3453,6 +3454,38 @@ func TestDescribeStorageClass(t *testing.T) { } } +func TestDescribeVolumeAttributesClass(t *testing.T) { + expectedOut := `Name: foo +Annotations: name=bar +DriverName: my-driver +Parameters: param1=value1,param2=value2 +Events: +` + + f := fake.NewSimpleClientset(&storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + ResourceVersion: "4", + Annotations: map[string]string{ + "name": "bar", + }, + }, + DriverName: "my-driver", + Parameters: map[string]string{ + "param1": "value1", + "param2": "value2", + }, + }) + s := VolumeAttributesClassDescriber{f} + out, err := s.Describe("", "foo", DescriberSettings{ShowEvents: true}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if out != expectedOut { + t.Errorf("expected:\n %s\n but got output:\n %s diff:\n%s", expectedOut, out, cmp.Diff(out, expectedOut)) + } +} + func TestDescribeCSINode(t *testing.T) { limit := utilpointer.Int32Ptr(int32(2)) f := fake.NewSimpleClientset(&storagev1.CSINode{ diff --git a/pkg/scheme/install.go b/pkg/scheme/install.go index 52a7ce6a..34c98782 100644 --- a/pkg/scheme/install.go +++ b/pkg/scheme/install.go @@ -45,6 +45,7 @@ import ( rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" storagev1beta1 "k8s.io/api/storage/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" @@ -78,5 +79,5 @@ func init() { utilruntime.Must(Scheme.SetVersionPriority(policyv1beta1.SchemeGroupVersion, policyv1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(rbacv1.SchemeGroupVersion, rbacv1beta1.SchemeGroupVersion, rbacv1alpha1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(schedulingv1alpha1.SchemeGroupVersion)) - utilruntime.Must(Scheme.SetVersionPriority(storagev1.SchemeGroupVersion, storagev1beta1.SchemeGroupVersion)) + utilruntime.Must(Scheme.SetVersionPriority(storagev1.SchemeGroupVersion, storagev1beta1.SchemeGroupVersion, storagev1alpha1.SchemeGroupVersion)) }