Skip to content

Commit bf3dfaf

Browse files
committed
Fix index out of range panic for kubectl alpha debug
Fix containerNameToRef func to get init containers and ephemeral containers properly. Set EphemeralContainers in generatePodCopyWithDebugContainer func to nil which means dropping ephemeral containers from a copy of pod so that it can be created successfully, otherwise it is rejected by the API server.
1 parent 16ea9dc commit bf3dfaf

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)