Skip to content

Commit a5dca32

Browse files
committed
Test: update E2E tests to use AgentRuntime for label application
Removes manual kagenti.io/type labels from all E2E test fixtures (echoAgent, noProtoAgent, auditAgent, signedAgent, authBridgeAgent, authBridgeDisabledAgent) and adds AgentRuntime CRs to drive the label via the operator. Each test now deploys the workload without the protected label, creates an AgentRuntime, waits for the operator to apply kagenti.io/type, then proceeds with existing assertions. This aligns E2E tests with the new ValidatingAdmissionPolicy that prevents manual label application. Signed-off-by: Daniels Nagornuks <dnagornu@redhat.com> Assisted-By: Claude (Anthropic AI) <noreply@anthropic.com>
1 parent bcceefb commit a5dca32

2 files changed

Lines changed: 170 additions & 30 deletions

File tree

kagenti-operator/test/e2e/e2e_test.go

Lines changed: 99 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,28 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
470470
_, err := utils.KubectlApplyStdin(authBridgeAgentFixture(), authBridgeTestNamespace)
471471
Expect(err).NotTo(HaveOccurred())
472472

473+
By("waiting for operator to apply kagenti.io/type label via AgentRuntime")
474+
Eventually(func(g Gomega) {
475+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "authbridge-agent", authBridgeTestNamespace,
476+
"{.metadata.labels.kagenti\\.io/type}")
477+
g.Expect(labelErr).NotTo(HaveOccurred())
478+
g.Expect(typeLabel).To(Equal("agent"))
479+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
480+
481+
By("waiting for pod template to have kagenti.io/type label (triggers rolling update)")
482+
Eventually(func(g Gomega) {
483+
tmplLabel, labelErr := utils.KubectlGetJsonpath("deployment", "authbridge-agent", authBridgeTestNamespace,
484+
"{.spec.template.metadata.labels.kagenti\\.io/type}")
485+
g.Expect(labelErr).NotTo(HaveOccurred())
486+
g.Expect(tmplLabel).To(Equal("agent"))
487+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
488+
489+
By("waiting for rollout to complete")
490+
rolloutCmd := exec.Command("kubectl", "rollout", "status",
491+
"deployment/authbridge-agent", "-n", authBridgeTestNamespace, "--timeout=3m")
492+
_, rolloutErr := utils.Run(rolloutCmd)
493+
Expect(rolloutErr).NotTo(HaveOccurred())
494+
473495
By("waiting for deployment to be ready")
474496
Expect(utils.WaitForDeploymentReady("authbridge-agent", authBridgeTestNamespace, 3*time.Minute)).To(Succeed())
475497

@@ -529,11 +551,11 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
529551
})
530552

531553
It("should not duplicate sidecars on pod recreation (idempotency)", func() {
532-
By("getting current pod name")
554+
By("getting current injected pod name")
533555
var oldPodName string
534556
Eventually(func(g Gomega) {
535557
cmd := exec.Command("kubectl", "get", "pods",
536-
"-l", "app.kubernetes.io/name=authbridge-agent",
558+
"-l", "app.kubernetes.io/name=authbridge-agent,kagenti.io/type=agent",
537559
"-n", authBridgeTestNamespace,
538560
"-o", "jsonpath={.items[0].metadata.name}")
539561
output, err := utils.Run(cmd)
@@ -550,7 +572,7 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
550572
By("waiting for new pod to be running with a different name")
551573
Eventually(func(g Gomega) {
552574
cmd := exec.Command("kubectl", "get", "pods",
553-
"-l", "app.kubernetes.io/name=authbridge-agent",
575+
"-l", "app.kubernetes.io/name=authbridge-agent,kagenti.io/type=agent",
554576
"-n", authBridgeTestNamespace,
555577
"-o", "jsonpath={.items[0].metadata.name}")
556578
output, err := utils.Run(cmd)
@@ -565,7 +587,7 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
565587

566588
By("verifying exactly 1 envoy-proxy and 1 proxy-init (no separate spiffe-helper)")
567589
cmd = exec.Command("kubectl", "get", "pods",
568-
"-l", "app.kubernetes.io/name=authbridge-agent",
590+
"-l", "app.kubernetes.io/name=authbridge-agent,kagenti.io/type=agent",
569591
"-n", authBridgeTestNamespace,
570592
"-o", "jsonpath={.items[0].spec.containers[*].name}")
571593
containers, err := utils.Run(cmd)
@@ -575,7 +597,7 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
575597
"spiffe-helper is bundled inside envoy-proxy, should not appear as a separate container")
576598

577599
cmd = exec.Command("kubectl", "get", "pods",
578-
"-l", "app.kubernetes.io/name=authbridge-agent",
600+
"-l", "app.kubernetes.io/name=authbridge-agent,kagenti.io/type=agent",
579601
"-n", authBridgeTestNamespace,
580602
"-o", "jsonpath={.items[0].spec.initContainers[*].name}")
581603
initContainers, err := utils.Run(cmd)
@@ -586,9 +608,12 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
586608

587609
Context("Injection opt-out", func() {
588610
It("should not inject when kagenti.io/inject=disabled", func() {
611+
var err error
589612
By("creating AgentRuntime for disabled agent")
590-
_, err := utils.KubectlApplyStdin(authBridgeDisabledAgentRuntimeFixture(), authBridgeTestNamespace)
591-
Expect(err).NotTo(HaveOccurred())
613+
Eventually(func(g Gomega) {
614+
_, applyErr := utils.KubectlApplyStdin(authBridgeDisabledAgentRuntimeFixture(), authBridgeTestNamespace)
615+
g.Expect(applyErr).NotTo(HaveOccurred())
616+
}, 2*time.Minute, 2*time.Second).Should(Succeed())
592617

593618
By("verifying AgentRuntime CR exists")
594619
_, err = utils.KubectlGetJsonpath("agentruntime", "authbridge-disabled-agent",
@@ -599,6 +624,14 @@ var _ = Describe("AuthBridge Injection E2E", Ordered, func() {
599624
_, err = utils.KubectlApplyStdin(authBridgeDisabledAgentFixture(), authBridgeTestNamespace)
600625
Expect(err).NotTo(HaveOccurred())
601626

627+
By("waiting for operator to apply kagenti.io/type label via AgentRuntime")
628+
Eventually(func(g Gomega) {
629+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "authbridge-disabled-agent",
630+
authBridgeTestNamespace, "{.metadata.labels.kagenti\\.io/type}")
631+
g.Expect(labelErr).NotTo(HaveOccurred())
632+
g.Expect(typeLabel).To(Equal("agent"))
633+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
634+
602635
By("waiting for deployment to be ready")
603636
Expect(utils.WaitForDeploymentReady(
604637
"authbridge-disabled-agent", authBridgeTestNamespace, 2*time.Minute,
@@ -820,6 +853,20 @@ var _ = Describe("AgentCard E2E", Ordered, func() {
820853
_, err := utils.KubectlApplyStdin(noProtocolAgentFixture(), testNamespace)
821854
Expect(err).NotTo(HaveOccurred())
822855

856+
By("creating AgentRuntime for noproto-agent")
857+
Eventually(func(g Gomega) {
858+
_, applyErr := utils.KubectlApplyStdin(noProtoAgentRuntimeFixture(), testNamespace)
859+
g.Expect(applyErr).NotTo(HaveOccurred())
860+
}, 2*time.Minute, 2*time.Second).Should(Succeed())
861+
862+
By("waiting for operator to apply kagenti.io/type label")
863+
Eventually(func(g Gomega) {
864+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "noproto-agent", testNamespace,
865+
"{.metadata.labels.kagenti\\.io/type}")
866+
g.Expect(labelErr).NotTo(HaveOccurred())
867+
g.Expect(typeLabel).To(Equal("agent"))
868+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
869+
823870
By("waiting for deployment to be ready")
824871
Expect(utils.WaitForDeploymentReady("noproto-agent", testNamespace, 2*time.Minute)).To(Succeed())
825872

@@ -833,10 +880,24 @@ var _ = Describe("AgentCard E2E", Ordered, func() {
833880
})
834881

835882
It("should auto-create AgentCard for labelled workload", func() {
836-
By("deploying echo-agent with agent and protocol labels")
883+
By("deploying echo-agent with protocol label")
837884
_, err := utils.KubectlApplyStdin(echoAgentFixture(), testNamespace)
838885
Expect(err).NotTo(HaveOccurred())
839886

887+
By("creating AgentRuntime for echo-agent")
888+
Eventually(func(g Gomega) {
889+
_, applyErr := utils.KubectlApplyStdin(echoAgentRuntimeFixture(), testNamespace)
890+
g.Expect(applyErr).NotTo(HaveOccurred())
891+
}, 2*time.Minute, 2*time.Second).Should(Succeed())
892+
893+
By("waiting for operator to apply kagenti.io/type label")
894+
Eventually(func(g Gomega) {
895+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "echo-agent", testNamespace,
896+
"{.metadata.labels.kagenti\\.io/type}")
897+
g.Expect(labelErr).NotTo(HaveOccurred())
898+
g.Expect(typeLabel).To(Equal("agent"))
899+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
900+
840901
By("waiting for deployment to be ready")
841902
Expect(utils.WaitForDeploymentReady("echo-agent", testNamespace, 2*time.Minute)).To(Succeed())
842903

@@ -963,6 +1024,21 @@ var _ = Describe("AgentCard E2E", Ordered, func() {
9631024
By("deploying audit-agent (unsigned)")
9641025
_, err := utils.KubectlApplyStdin(auditAgentFixture(), testNamespace)
9651026
Expect(err).NotTo(HaveOccurred())
1027+
1028+
By("creating AgentRuntime for audit-agent")
1029+
Eventually(func(g Gomega) {
1030+
_, applyErr := utils.KubectlApplyStdin(auditAgentRuntimeFixture(), testNamespace)
1031+
g.Expect(applyErr).NotTo(HaveOccurred())
1032+
}, 2*time.Minute, 2*time.Second).Should(Succeed())
1033+
1034+
By("waiting for operator to apply kagenti.io/type label")
1035+
Eventually(func(g Gomega) {
1036+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "audit-agent", testNamespace,
1037+
"{.metadata.labels.kagenti\\.io/type}")
1038+
g.Expect(labelErr).NotTo(HaveOccurred())
1039+
g.Expect(typeLabel).To(Equal("agent"))
1040+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
1041+
9661042
Expect(utils.WaitForDeploymentReady("audit-agent", testNamespace, 2*time.Minute)).To(Succeed())
9671043

9681044
By("updating auto-created AgentCard for audit-agent")
@@ -1004,6 +1080,21 @@ var _ = Describe("AgentCard E2E", Ordered, func() {
10041080
By("deploying signed-agent stack")
10051081
_, err = utils.KubectlApplyStdin(signedAgentFixture(), testNamespace)
10061082
Expect(err).NotTo(HaveOccurred())
1083+
1084+
By("creating AgentRuntime for signed-agent")
1085+
Eventually(func(g Gomega) {
1086+
_, applyErr := utils.KubectlApplyStdin(signedAgentRuntimeFixture(), testNamespace)
1087+
g.Expect(applyErr).NotTo(HaveOccurred())
1088+
}, 2*time.Minute, 2*time.Second).Should(Succeed())
1089+
1090+
By("waiting for operator to apply kagenti.io/type label")
1091+
Eventually(func(g Gomega) {
1092+
typeLabel, labelErr := utils.KubectlGetJsonpath("deployment", "signed-agent", testNamespace,
1093+
"{.metadata.labels.kagenti\\.io/type}")
1094+
g.Expect(labelErr).NotTo(HaveOccurred())
1095+
g.Expect(typeLabel).To(Equal("agent"))
1096+
}, 1*time.Minute, 2*time.Second).Should(Succeed())
1097+
10071098
Expect(utils.WaitForDeploymentReady("signed-agent", testNamespace, 3*time.Minute)).To(Succeed())
10081099

10091100
By("updating auto-created AgentCard with identityBinding")

0 commit comments

Comments
 (0)