mirror of https://github.com/k3s-io/k3s
Merge pull request #65074 from wgliang/master.describe-pv
Automatic merge from submit-queue (batch tested with PRs 65074, 67469). If you want to cherry-pick this change to another branch, please follow the instructions here: https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md. Add CSI volume attributes for kubectl describe pv **What this PR does / why we need it**: /king feature kubectl describe pv doesn't show the volume attributes. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #65021 **Special notes for your reviewer**: /cc @saad-ali **Release note**: ```release-note Add CSI volume attributes for kubectl describe pv. ```pull/8/head
commit
789c361eb7
|
@ -1129,6 +1129,48 @@ func printCSIPersistentVolumeSource(csi *api.CSIPersistentVolumeSource, w Prefix
|
||||||
" VolumeHandle:\t%v\n"+
|
" VolumeHandle:\t%v\n"+
|
||||||
" ReadOnly:\t%v\n",
|
" ReadOnly:\t%v\n",
|
||||||
csi.Driver, csi.VolumeHandle, csi.ReadOnly)
|
csi.Driver, csi.VolumeHandle, csi.ReadOnly)
|
||||||
|
printCSIPersistentVolumeAttributesMultiline(w, "VolumeAttributes", csi.VolumeAttributes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printCSIPersistentVolumeAttributesMultiline(w PrefixWriter, title string, annotations map[string]string) {
|
||||||
|
printCSIPersistentVolumeAttributesMultilineIndent(w, "", title, "\t", annotations, sets.NewString())
|
||||||
|
}
|
||||||
|
|
||||||
|
func printCSIPersistentVolumeAttributesMultilineIndent(w PrefixWriter, initialIndent, title, innerIndent string, attributes map[string]string, skip sets.String) {
|
||||||
|
w.Write(LEVEL_2, "%s%s:%s", initialIndent, title, innerIndent)
|
||||||
|
|
||||||
|
if len(attributes) == 0 {
|
||||||
|
w.WriteLine("<none>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// to print labels in the sorted order
|
||||||
|
keys := make([]string, 0, len(attributes))
|
||||||
|
for key := range attributes {
|
||||||
|
if skip.Has(key) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
if len(attributes) == 0 {
|
||||||
|
w.WriteLine("<none>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
|
for i, key := range keys {
|
||||||
|
if i != 0 {
|
||||||
|
w.Write(LEVEL_2, initialIndent)
|
||||||
|
w.Write(LEVEL_2, innerIndent)
|
||||||
|
}
|
||||||
|
line := fmt.Sprintf("%s=%s", key, attributes[key])
|
||||||
|
if len(line) > maxAnnotationLen {
|
||||||
|
w.Write(LEVEL_2, "%s...\n", line[:maxAnnotationLen])
|
||||||
|
} else {
|
||||||
|
w.Write(LEVEL_2, "%s\n", line)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type PersistentVolumeDescriber struct {
|
type PersistentVolumeDescriber struct {
|
||||||
|
@ -1197,8 +1239,8 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) (
|
||||||
return tabbedString(func(out io.Writer) error {
|
return tabbedString(func(out io.Writer) error {
|
||||||
w := NewPrefixWriter(out)
|
w := NewPrefixWriter(out)
|
||||||
w.Write(LEVEL_0, "Name:\t%s\n", pv.Name)
|
w.Write(LEVEL_0, "Name:\t%s\n", pv.Name)
|
||||||
printLabelsMultiline(w, "Labels", pv.Labels)
|
printLabelsMultiline(w, "Labels", pv.ObjectMeta.Labels)
|
||||||
printAnnotationsMultiline(w, "Annotations", pv.Annotations)
|
printAnnotationsMultiline(w, "Annotations", pv.ObjectMeta.Annotations)
|
||||||
w.Write(LEVEL_0, "Finalizers:\t%v\n", pv.ObjectMeta.Finalizers)
|
w.Write(LEVEL_0, "Finalizers:\t%v\n", pv.ObjectMeta.Finalizers)
|
||||||
w.Write(LEVEL_0, "StorageClass:\t%s\n", helper.GetPersistentVolumeClass(pv))
|
w.Write(LEVEL_0, "StorageClass:\t%s\n", helper.GetPersistentVolumeClass(pv))
|
||||||
if pv.ObjectMeta.DeletionTimestamp != nil {
|
if pv.ObjectMeta.DeletionTimestamp != nil {
|
||||||
|
|
|
@ -1163,6 +1163,80 @@ func TestPersistentVolumeDescriber(t *testing.T) {
|
||||||
},
|
},
|
||||||
expectedElements: []string{"Terminating (lasts 10y)"},
|
expectedElements: []string{"Terminating (lasts 10y)"},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "test16",
|
||||||
|
plugin: "local",
|
||||||
|
pv: &api.PersistentVolume{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "bar",
|
||||||
|
GenerateName: "test-GenerateName",
|
||||||
|
UID: "test-UID",
|
||||||
|
CreationTimestamp: metav1.Time{Time: time.Now()},
|
||||||
|
DeletionTimestamp: &metav1.Time{Time: time.Now()},
|
||||||
|
DeletionGracePeriodSeconds: new(int64),
|
||||||
|
Labels: map[string]string{"label1": "label1", "label2": "label2", "label3": "label3"},
|
||||||
|
Annotations: map[string]string{"annotation1": "annotation1", "annotation2": "annotation2", "annotation3": "annotation3"},
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
Local: &api.LocalVolumeSource{},
|
||||||
|
},
|
||||||
|
NodeAffinity: &api.VolumeNodeAffinity{
|
||||||
|
Required: &api.NodeSelector{
|
||||||
|
NodeSelectorTerms: []api.NodeSelectorTerm{
|
||||||
|
{
|
||||||
|
MatchExpressions: []api.NodeSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "foo",
|
||||||
|
Operator: "In",
|
||||||
|
Values: []string{"val1", "val2"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "foo",
|
||||||
|
Operator: "Exists",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedElements: []string{"Node Affinity", "Required Terms", "Term 0",
|
||||||
|
"foo in [val1, val2]",
|
||||||
|
"foo exists"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "test17",
|
||||||
|
plugin: "local",
|
||||||
|
pv: &api.PersistentVolume{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "bar",
|
||||||
|
GenerateName: "test-GenerateName",
|
||||||
|
UID: "test-UID",
|
||||||
|
CreationTimestamp: metav1.Time{Time: time.Now()},
|
||||||
|
DeletionTimestamp: &metav1.Time{Time: time.Now()},
|
||||||
|
DeletionGracePeriodSeconds: new(int64),
|
||||||
|
Labels: map[string]string{"label1": "label1", "label2": "label2", "label3": "label3"},
|
||||||
|
Annotations: map[string]string{"annotation1": "annotation1", "annotation2": "annotation2", "annotation3": "annotation3"},
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
CSI: &api.CSIPersistentVolumeSource{
|
||||||
|
Driver: "drive",
|
||||||
|
VolumeHandle: "handler",
|
||||||
|
ReadOnly: true,
|
||||||
|
VolumeAttributes: map[string]string{
|
||||||
|
"Attribute1": "Value1",
|
||||||
|
"Attribute2": "Value2",
|
||||||
|
"Attribute3": "Value3",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedElements: []string{"Driver", "VolumeHandle", "ReadOnly", "VolumeAttributes"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
|
Loading…
Reference in New Issue