diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe.go b/staging/src/k8s.io/kubectl/pkg/describe/describe.go index 754ddd0d246..a8ba083b145 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe.go @@ -1082,15 +1082,17 @@ func printProjectedVolumeSource(projected *corev1.ProjectedVolumeSource, w Prefi w.Write(LEVEL_2, "Type:\tProjected (a volume that contains injected data from multiple sources)\n") for _, source := range projected.Sources { if source.Secret != nil { + optional := source.Secret.Optional != nil && *source.Secret.Optional w.Write(LEVEL_2, "SecretName:\t%v\n"+ - " SecretOptionalName:\t%v\n", - source.Secret.Name, source.Secret.Optional) + " Optional:\t%v\n", + source.Secret.Name, optional) } else if source.DownwardAPI != nil { w.Write(LEVEL_2, "DownwardAPI:\ttrue\n") } else if source.ConfigMap != nil { + optional := source.ConfigMap.Optional != nil && *source.ConfigMap.Optional w.Write(LEVEL_2, "ConfigMapName:\t%v\n"+ - " ConfigMapOptional:\t%v\n", - source.ConfigMap.Name, source.ConfigMap.Optional) + " Optional:\t%v\n", + source.ConfigMap.Name, optional) } else if source.ServiceAccountToken != nil { w.Write(LEVEL_2, "TokenExpirationSeconds:\t%d\n", *source.ServiceAccountToken.ExpirationSeconds) diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go index 946ece04b68..1d0213abeb4 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go @@ -6906,3 +6906,43 @@ func TestDescribeSeccompProfile(t *testing.T) { }) } } + +func TestDescribeProjectedVolumesOptionalSecret(t *testing.T) { + fake := fake.NewSimpleClientset(&corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "bar", + Namespace: "foo", + }, + Spec: corev1.PodSpec{ + Volumes: []corev1.Volume{ + { + Name: "optional-secret", + VolumeSource: corev1.VolumeSource{ + Projected: &corev1.ProjectedVolumeSource{ + Sources: []corev1.VolumeProjection{ + { + Secret: &corev1.SecretProjection{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "optional-secret", + }, + Optional: ptr.To(true), + }, + }, + }, + }, + }, + }, + }, + }, + }) + c := &describeClient{T: t, Namespace: "foo", Interface: fake} + d := PodDescriber{c} + out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + expectedOut := "SecretName: optional-secret\n Optional: true" + if !strings.Contains(out, expectedOut) { + t.Errorf("expected to find %q in output: %q", expectedOut, out) + } +}