mirror of https://github.com/k3s-io/k3s
Merge pull request #31607 from jsafrane/describe-storageclass
Automatic merge from submit-queue Add kubectl describe storageclass. Sample output: ``` Name: fast Annotations: storage.beta.kubernetes.io/default-class=true Provisioner: kubernetes.io/aws-ebs Parameters: type=gp2 No events. Name: slow Annotations: <none> Provisioner: kubernetes.io/aws-ebs Parameters: type=sc1 No events. ``` (it looks nicely aligned in terminal) Proposing 1.4, it's bugfix, not a feature.pull/6/head
commit
ba4dba8be2
|
@ -39,6 +39,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/apis/batch"
|
||||
"k8s.io/kubernetes/pkg/apis/certificates"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
"k8s.io/kubernetes/pkg/apis/storage"
|
||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
adapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
|
||||
|
@ -116,6 +117,7 @@ func describerMap(c *client.Client) map[unversioned.GroupKind]Describer {
|
|||
batch.Kind("ScheduledJob"): &ScheduledJobDescriber{adapter.FromUnversionedClient(c)},
|
||||
apps.Kind("PetSet"): &PetSetDescriber{c},
|
||||
certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c},
|
||||
storage.Kind("StorageClass"): &StorageClassDescriber{c},
|
||||
}
|
||||
|
||||
return m
|
||||
|
@ -2385,6 +2387,33 @@ func describeNetworkPolicy(networkPolicy *extensions.NetworkPolicy) (string, err
|
|||
})
|
||||
}
|
||||
|
||||
type StorageClassDescriber struct {
|
||||
client.Interface
|
||||
}
|
||||
|
||||
func (s *StorageClassDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
|
||||
sc, err := s.Storage().StorageClasses().Get(name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return tabbedString(func(out io.Writer) error {
|
||||
fmt.Fprintf(out, "Name:\t%s\n", sc.Name)
|
||||
fmt.Fprintf(out, "Annotations:\t%s\n", labels.FormatLabels(sc.Annotations))
|
||||
fmt.Fprintf(out, "Provisioner:\t%s\n", sc.Provisioner)
|
||||
fmt.Fprintf(out, "Parameters:\t%s\n", labels.FormatLabels(sc.Parameters))
|
||||
if describerSettings.ShowEvents {
|
||||
events, err := s.Events(namespace).Search(sc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if events != nil {
|
||||
DescribeEvents(events, out)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// newErrNoDescriber creates a new ErrNoDescriber with the names of the provided types.
|
||||
func newErrNoDescriber(types ...reflect.Type) error {
|
||||
names := make([]string, 0, len(types))
|
||||
|
|
|
@ -31,6 +31,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/resource"
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
"k8s.io/kubernetes/pkg/apis/storage"
|
||||
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
|
||||
|
@ -606,6 +607,31 @@ func TestDescribeCluster(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestDescribeStorageClass(t *testing.T) {
|
||||
f := testclient.NewSimpleFake(&storage.StorageClass{
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "foo",
|
||||
ResourceVersion: "4",
|
||||
Annotations: map[string]string{
|
||||
"name": "foo",
|
||||
},
|
||||
},
|
||||
Provisioner: "my-provisioner",
|
||||
Parameters: map[string]string{
|
||||
"param1": "value1",
|
||||
"param2": "value2",
|
||||
},
|
||||
})
|
||||
s := StorageClassDescriber{f}
|
||||
out, err := s.Describe("", "foo", DescriberSettings{ShowEvents: true})
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
if !strings.Contains(out, "foo") {
|
||||
t.Errorf("unexpected out: %s", out)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDescribeEvents(t *testing.T) {
|
||||
|
||||
events := &api.EventList{
|
||||
|
@ -704,6 +730,14 @@ func TestDescribeEvents(t *testing.T) {
|
|||
},
|
||||
}, events),
|
||||
},
|
||||
"StorageClass": &StorageClassDescriber{
|
||||
testclient.NewSimpleFake(&storage.StorageClass{
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "bar",
|
||||
Namespace: "foo",
|
||||
},
|
||||
}, events),
|
||||
},
|
||||
}
|
||||
|
||||
for name, d := range m {
|
||||
|
|
Loading…
Reference in New Issue