@@ -567,3 +567,95 @@ run_kubectl_debug_netadmin_node_tests() {
567
567
set +o nounset
568
568
set +o errexit
569
569
}
570
+
571
+ run_kubectl_debug_custom_profile_tests () {
572
+ set -o nounset
573
+ set -o errexit
574
+
575
+ create_and_use_new_namespace
576
+ kube::log::status " Testing kubectl debug custom profile"
577
+
578
+ # ## Pod Troubleshooting by ephemeral containers with netadmin profile
579
+ # Pre-Condition: Pod "nginx" is created
580
+ kubectl run target-debug " --image=${IMAGE_NGINX:? } " " ${kube_flags[@]:? } "
581
+ kube::test::get_object_assert pod " {{range.items}}{{${id_field:? } }}:{{end}}" ' target-debug:'
582
+
583
+ cat > " ${TMPDIR:-/ tmp} " /custom_profile.json << EOF
584
+ {
585
+ "env": [
586
+ {
587
+ "name": "ENV_VAR1",
588
+ "value": "value1"
589
+ },
590
+ {
591
+ "name": "ENV_VAR2",
592
+ "value": "value2"
593
+ }
594
+ ]
595
+ }
596
+ EOF
597
+
598
+ cat > " ${TMPDIR:-/ tmp} " /custom_profile.yaml << EOF
599
+ env:
600
+ - name: ENV_VAR3
601
+ value: value3
602
+ - name: ENV_VAR4
603
+ value: value4
604
+ EOF
605
+
606
+ # Command: add a new debug container with general profile
607
+ output_message=$( kubectl debug target-debug -it --image=busybox --attach=false -c debug-container --profile=general --custom=" ${TMPDIR:-/ tmp} " /custom_profile.json " ${kube_flags[@]:? } " )
608
+
609
+ # Post-Conditions
610
+ kube::test::get_object_assert pod/target-debug ' {{range.spec.ephemeralContainers}}{{.name}}:{{end}}' ' debug-container:'
611
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 0).env 0)).name}}' ' ENV_VAR1'
612
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 0).env 0)).value}}' ' value1'
613
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 0).env 1)).name}}' ' ENV_VAR2'
614
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 0).env 1)).value}}' ' value2'
615
+
616
+ # Command: add a new debug container with general profile
617
+ kubectl debug target-debug -it --image=busybox --attach=false -c debug-container-2 --profile=general --custom=" ${TMPDIR:-/ tmp} " /custom_profile.yaml " ${kube_flags[@]:? } "
618
+
619
+ # Post-Conditions
620
+ kube::test::get_object_assert pod/target-debug ' {{range.spec.ephemeralContainers}}{{.name}}:{{end}}' ' debug-container:debug-container-2:'
621
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 1).env 0)).name}}' ' ENV_VAR3'
622
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 1).env 0)).value}}' ' value3'
623
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 1).env 1)).name}}' ' ENV_VAR4'
624
+ kube::test::get_object_assert pod/target-debug ' {{((index (index .spec.ephemeralContainers 1).env 1)).value}}' ' value4'
625
+
626
+ # Command: create a copy of target with a new debug container
627
+ kubectl debug target-debug -it --copy-to=target-copy --image=busybox --container=debug-container-3 --attach=false --profile=general --custom=" ${TMPDIR:-/ tmp} " /custom_profile.json " ${kube_flags[@]:? } "
628
+ # Post-Conditions
629
+ kube::test::get_object_assert pod/target-copy ' {{range.spec.containers}}{{.name}}:{{end}}' ' target-debug:debug-container-3:'
630
+ kube::test::get_object_assert pod/target-copy ' {{((index (index .spec.containers 1).env 0)).name}}' ' ENV_VAR1'
631
+ kube::test::get_object_assert pod/target-copy ' {{((index (index .spec.containers 1).env 0)).value}}' ' value1'
632
+ kube::test::get_object_assert pod/target-copy ' {{((index (index .spec.containers 1).env 1)).name}}' ' ENV_VAR2'
633
+ kube::test::get_object_assert pod/target-copy ' {{((index (index .spec.containers 1).env 1)).value}}' ' value2'
634
+
635
+ # Clean up
636
+ kubectl delete pod target-copy " ${kube_flags[@]:? } "
637
+ kubectl delete pod target-debug " ${kube_flags[@]:? } "
638
+
639
+ # ## Debug node with custom profile
640
+ # Pre-Condition: node exists
641
+ kube::test::get_object_assert nodes " {{range.items}}{{${id_field:? } }}:{{end}}" ' 127.0.0.1:'
642
+ # Command: create a new node debugger pod
643
+ output_message=$( kubectl debug --profile general node/127.0.0.1 --image=busybox --custom=" ${TMPDIR:-/ tmp} " /custom_profile.yaml --attach=false " ${kube_flags[@]:? } " -- true)
644
+ # Post-Conditions
645
+ kube::test::get_object_assert pod " {{(len .items)}}" ' 1'
646
+ debugger=$( kubectl get pod -o go-template=" {{(index .items 0)${id_field:? } }}" )
647
+ kube::test::if_has_string " ${output_message:? } " " ${debugger:? } "
648
+ kube::test::get_object_assert " pod/${debugger:? } " " {{${image_field:? } }}" ' busybox'
649
+ kube::test::get_object_assert " pod/${debugger:? } " ' {{.spec.nodeName}}' ' 127.0.0.1'
650
+ kube::test::get_object_assert " pod/${debugger:? } " ' {{((index (index .spec.containers 0).env 0)).name}}' ' ENV_VAR3'
651
+ kube::test::get_object_assert " pod/${debugger:? } " ' {{((index (index .spec.containers 0).env 0)).value}}' ' value3'
652
+ kube::test::get_object_assert " pod/${debugger:? } " ' {{((index (index .spec.containers 0).env 1)).name}}' ' ENV_VAR4'
653
+ kube::test::get_object_assert " pod/${debugger:? } " ' {{((index (index .spec.containers 0).env 1)).value}}' ' value4'
654
+ # Clean up
655
+ # pod.spec.nodeName is set by kubectl debug node which causes the delete to hang,
656
+ # presumably waiting for a kubelet that's not present. Force the delete.
657
+ kubectl delete --force pod " ${debugger:? } " " ${kube_flags[@]:? } "
658
+
659
+ set +o nounset
660
+ set +o errexit
661
+ }
0 commit comments