Skip to content

Commit bcfba49

Browse files
authored
Merge pull request kubernetes#94580 from kiyoshim55/fix-kubectl-alpha-debug-panic
Fix index out of range panic for kubectl alpha debug
2 parents 56b9a69 + bf3dfaf commit bcfba49

File tree

2 files changed

+176
-2
lines changed

2 files changed

+176
-2
lines changed

staging/src/k8s.io/kubectl/pkg/cmd/debug/debug.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ func (o *DebugOptions) generatePodCopyWithDebugContainer(pod *corev1.Pod) (*core
485485
},
486486
Spec: *pod.Spec.DeepCopy(),
487487
}
488+
// set EphemeralContainers to nil so that the copy of pod can be created
489+
copied.Spec.EphemeralContainers = nil
488490
// change ShareProcessNamespace configuration only when commanded explicitly
489491
if o.shareProcessedChanged {
490492
copied.Spec.ShareProcessNamespace = pointer.BoolPtr(o.ShareProcesses)
@@ -544,11 +546,11 @@ func containerNameToRef(pod *corev1.Pod) map[string]*corev1.Container {
544546
names[ref.Name] = ref
545547
}
546548
for i := range pod.Spec.InitContainers {
547-
ref := &pod.Spec.Containers[i]
549+
ref := &pod.Spec.InitContainers[i]
548550
names[ref.Name] = ref
549551
}
550552
for i := range pod.Spec.EphemeralContainers {
551-
ref := &pod.Spec.Containers[i]
553+
ref := (*corev1.Container)(&pod.Spec.EphemeralContainers[i].EphemeralContainerCommon)
552554
names[ref.Name] = ref
553555
}
554556
return names

staging/src/k8s.io/kubectl/pkg/cmd/debug/debug_test.go

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,74 @@ func TestGenerateDebugContainer(t *testing.T) {
153153
},
154154
},
155155
},
156+
{
157+
name: "pod with init containers",
158+
opts: &DebugOptions{
159+
Image: "busybox",
160+
PullPolicy: corev1.PullIfNotPresent,
161+
},
162+
pod: &corev1.Pod{
163+
Spec: corev1.PodSpec{
164+
InitContainers: []corev1.Container{
165+
{
166+
Name: "init-container-1",
167+
},
168+
{
169+
Name: "init-container-2",
170+
},
171+
},
172+
Containers: []corev1.Container{
173+
{
174+
Name: "debugger",
175+
},
176+
},
177+
},
178+
},
179+
expected: &corev1.EphemeralContainer{
180+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
181+
Name: "debugger-1",
182+
Image: "busybox",
183+
ImagePullPolicy: "IfNotPresent",
184+
TerminationMessagePolicy: "File",
185+
},
186+
},
187+
},
188+
{
189+
name: "pod with ephemeral containers",
190+
opts: &DebugOptions{
191+
Image: "busybox",
192+
PullPolicy: corev1.PullIfNotPresent,
193+
},
194+
pod: &corev1.Pod{
195+
Spec: corev1.PodSpec{
196+
Containers: []corev1.Container{
197+
{
198+
Name: "debugger",
199+
},
200+
},
201+
EphemeralContainers: []corev1.EphemeralContainer{
202+
{
203+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
204+
Name: "ephemeral-container-1",
205+
},
206+
},
207+
{
208+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
209+
Name: "ephemeral-container-2",
210+
},
211+
},
212+
},
213+
},
214+
},
215+
expected: &corev1.EphemeralContainer{
216+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
217+
Name: "debugger-1",
218+
Image: "busybox",
219+
ImagePullPolicy: "IfNotPresent",
220+
TerminationMessagePolicy: "File",
221+
},
222+
},
223+
},
156224
} {
157225
t.Run(tc.name, func(t *testing.T) {
158226
tc.opts.IOStreams = genericclioptions.NewTestIOStreamsDiscard()
@@ -590,6 +658,110 @@ func TestGeneratePodCopyWithDebugContainer(t *testing.T) {
590658
},
591659
},
592660
},
661+
{
662+
name: "pod with init containers",
663+
opts: &DebugOptions{
664+
CopyTo: "debugger",
665+
Image: "busybox",
666+
PullPolicy: corev1.PullIfNotPresent,
667+
},
668+
pod: &corev1.Pod{
669+
ObjectMeta: metav1.ObjectMeta{
670+
Name: "target",
671+
},
672+
Spec: corev1.PodSpec{
673+
InitContainers: []corev1.Container{
674+
{
675+
Name: "init-container-1",
676+
},
677+
{
678+
Name: "init-container-2",
679+
},
680+
},
681+
Containers: []corev1.Container{
682+
{
683+
Name: "debugger-1",
684+
},
685+
},
686+
},
687+
},
688+
expected: &corev1.Pod{
689+
ObjectMeta: metav1.ObjectMeta{
690+
Name: "debugger",
691+
},
692+
Spec: corev1.PodSpec{
693+
InitContainers: []corev1.Container{
694+
{
695+
Name: "init-container-1",
696+
},
697+
{
698+
Name: "init-container-2",
699+
},
700+
},
701+
Containers: []corev1.Container{
702+
{
703+
Name: "debugger-1",
704+
},
705+
{
706+
Name: "debugger-2",
707+
Image: "busybox",
708+
ImagePullPolicy: corev1.PullIfNotPresent,
709+
TerminationMessagePolicy: corev1.TerminationMessageReadFile,
710+
},
711+
},
712+
},
713+
},
714+
},
715+
{
716+
name: "pod with ephemeral containers",
717+
opts: &DebugOptions{
718+
CopyTo: "debugger",
719+
Image: "busybox",
720+
PullPolicy: corev1.PullIfNotPresent,
721+
},
722+
pod: &corev1.Pod{
723+
ObjectMeta: metav1.ObjectMeta{
724+
Name: "target",
725+
},
726+
Spec: corev1.PodSpec{
727+
Containers: []corev1.Container{
728+
{
729+
Name: "debugger-1",
730+
},
731+
},
732+
EphemeralContainers: []corev1.EphemeralContainer{
733+
{
734+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
735+
Name: "ephemeral-container-1",
736+
},
737+
},
738+
{
739+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
740+
Name: "ephemeral-container-2",
741+
},
742+
},
743+
},
744+
},
745+
},
746+
expected: &corev1.Pod{
747+
ObjectMeta: metav1.ObjectMeta{
748+
Name: "debugger",
749+
},
750+
Spec: corev1.PodSpec{
751+
Containers: []corev1.Container{
752+
{
753+
Name: "debugger-1",
754+
},
755+
{
756+
Name: "debugger-2",
757+
Image: "busybox",
758+
ImagePullPolicy: corev1.PullIfNotPresent,
759+
TerminationMessagePolicy: corev1.TerminationMessageReadFile,
760+
},
761+
},
762+
},
763+
},
764+
},
593765
{
594766
name: "shared process namespace",
595767
opts: &DebugOptions{

0 commit comments

Comments
 (0)