diff --git a/test/e2e/metrics_endpoint_test.go b/test/e2e/metrics_endpoint_test.go new file mode 100644 index 00000000..a5735ef5 --- /dev/null +++ b/test/e2e/metrics_endpoint_test.go @@ -0,0 +1,78 @@ +package e2e + +import ( + "bytes" + "os/exec" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Catalogd Metrics Workflow Validation", func() { + + var ( + token string + curlPod = "curl-metrics" + namespace = "olmv1-system" + ) + + BeforeEach(func() { + By("Creating ClusterRoleBinding for catalogd metrics") + _, err := exec.Command("kubectl", "create", "clusterrolebinding", "catalogd-metrics-binding", + "--clusterrole=catalogd-metrics-reader", + "--serviceaccount="+namespace+":catalogd-controller-manager").CombinedOutput() + Expect(err).ToNot(HaveOccurred()) + + By("Generating a token for the catalogd-controller-manager ServiceAccount") + out, err := exec.Command("kubectl", "create", "token", "catalogd-controller-manager", "-n", namespace).Output() + Expect(err).ToNot(HaveOccurred()) + token = string(bytes.TrimSpace(out)) + + By("Creating a curl pod to validate the metrics endpoint") + curlPodManifest := ` +apiVersion: v1 +kind: Pod +metadata: + name: curl-metrics + namespace: olmv1-system +spec: + serviceAccountName: catalogd-controller-manager + containers: + - name: curl + image: curlimages/curl:7.87.0 + command: + - sh + - -c + - sleep 3600 + restartPolicy: Never` + cmd := exec.Command("kubectl", "apply", "-f", "-") + cmd.Stdin = bytes.NewReader([]byte(curlPodManifest)) + Expect(cmd.Run()).To(Succeed()) + + By("Waiting for the curl pod to be ready") + Eventually(func() string { + out, _ := exec.Command("kubectl", "get", "pod", curlPod, "-n", namespace, "-o", "jsonpath={.status.phase}").Output() + return string(out) + }, "60s", "5s").Should(Equal("Running")) + }) + + It("Validates the metrics endpoint", func() { + By("Calling the metrics endpoint from within the curl pod") + metricsURL := "https://catalogd-service.olmv1-system.svc.cluster.local:7443/metrics" + curlCmd := []string{ + "exec", "-it", curlPod, "-n", namespace, "--", "curl", "-v", "-k", + "-H", "Authorization: Bearer " + token, metricsURL, + } + cmd := exec.Command("kubectl", curlCmd...) + output, err := cmd.CombinedOutput() + Expect(err).ToNot(HaveOccurred()) + Expect(string(output)).To(ContainSubstring("200 OK")) + Expect(string(output)).To(ContainSubstring("# HELP")) + }) + + AfterEach(func() { + By("Cleaning up resources") + _ = exec.Command("kubectl", "delete", "pod", curlPod, "-n", namespace, "--ignore-not-found=true").Run() + _ = exec.Command("kubectl", "delete", "clusterrolebinding", "catalogd-metrics-binding", "--ignore-not-found=true").Run() + }) +})