mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
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.
This commit is contained in:
commit
ba4dba8be2
@ -39,6 +39,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/apis/batch"
|
"k8s.io/kubernetes/pkg/apis/batch"
|
||||||
"k8s.io/kubernetes/pkg/apis/certificates"
|
"k8s.io/kubernetes/pkg/apis/certificates"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
||||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
adapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
|
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)},
|
batch.Kind("ScheduledJob"): &ScheduledJobDescriber{adapter.FromUnversionedClient(c)},
|
||||||
apps.Kind("PetSet"): &PetSetDescriber{c},
|
apps.Kind("PetSet"): &PetSetDescriber{c},
|
||||||
certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c},
|
certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c},
|
||||||
|
storage.Kind("StorageClass"): &StorageClassDescriber{c},
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
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.
|
// newErrNoDescriber creates a new ErrNoDescriber with the names of the provided types.
|
||||||
func newErrNoDescriber(types ...reflect.Type) error {
|
func newErrNoDescriber(types ...reflect.Type) error {
|
||||||
names := make([]string, 0, len(types))
|
names := make([]string, 0, len(types))
|
||||||
|
@ -31,6 +31,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/resource"
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
|
||||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
|
"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) {
|
func TestDescribeEvents(t *testing.T) {
|
||||||
|
|
||||||
events := &api.EventList{
|
events := &api.EventList{
|
||||||
@ -704,6 +730,14 @@ func TestDescribeEvents(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}, events),
|
}, events),
|
||||||
},
|
},
|
||||||
|
"StorageClass": &StorageClassDescriber{
|
||||||
|
testclient.NewSimpleFake(&storage.StorageClass{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Name: "bar",
|
||||||
|
Namespace: "foo",
|
||||||
|
},
|
||||||
|
}, events),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, d := range m {
|
for name, d := range m {
|
||||||
|
Loading…
Reference in New Issue
Block a user