From 84fa429f28bcc2febdccacd28258e77b264e88f4 Mon Sep 17 00:00:00 2001 From: Bhargavi Gudi Date: Mon, 18 May 2026 13:11:45 +0530 Subject: [PATCH] Migrate OCP-55486: check no MountVolume.SetUp failed error in cronjob events Migrates test from openshift-tests-private to origin. Test validates that cronjob events do not contain the error: "MountVolume.SetUp failed for volume ... object ... not registered" This is a regression test for a bug where volume mounting in cronjobs could fail with an error about unregistered objects. The test: 1. Gets all cronjob namespaces in the cluster 2. Retrieves events from each cronjob namespace 3. Checks for the error pattern using regex 4. Fails if any cronjob events contain the mount error Updates: - Add test to test/extended/node/node_e2e/node.go - Add regexp import for pattern matching - Document test in test/extended/node/README.md --- test/extended/node/README.md | 1 + test/extended/node/node_e2e/node.go | 38 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/test/extended/node/README.md b/test/extended/node/README.md index 4d0f1f7abd0c..b5701c77fe6e 100644 --- a/test/extended/node/README.md +++ b/test/extended/node/README.md @@ -19,6 +19,7 @@ This directory contains OpenShift end-to-end tests for node-related features. - **image_volume.go** - Tests mounting container images as volumes in pods, including subPath and error handling - **node_swap.go** - Tests default kubelet swap settings (failSwapOn and swapBehavior) and rejection of user overrides - **zstd_chunked.go** - Tests building and running images with zstd:chunked compression format +- **node_e2e/node.go** - Cronjob volume mount error check (OCP-55486) - Verifies that cronjob events do not contain MountVolume.SetUp failed errors for unregistered objects ## Directory Structure diff --git a/test/extended/node/node_e2e/node.go b/test/extended/node/node_e2e/node.go index 5f43c93e20af..ceb2b23aca93 100644 --- a/test/extended/node/node_e2e/node.go +++ b/test/extended/node/node_e2e/node.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "path/filepath" + "regexp" "strings" "time" @@ -164,6 +165,43 @@ var _ = g.Describe("[sig-node] [Jira:Node/Kubelet] Kubelet, CRI-O, CPU manager", e2e.Logf("/dev/fuse mount output: %s", output) o.Expect(output).To(o.ContainSubstring("fuse"), "dev fuse is not mounted inside pod") }) + + //author: bgudi@redhat.com + g.It("[OTP][Late] Cronjob events should not contain MountVolume.SetUp failed errors [OCP-55486]", func() { + g.By("Check events in all cronjob namespaces for volume mount errors") + err := wait.Poll(1*time.Second, 10*time.Second, func() (bool, error) { + allCronjobs, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("cronjob", "--all-namespaces", "-o=jsonpath={range .items[*]}{@.metadata.namespace}{\"\\n\"}{end}").Output() + if err != nil { + e2e.Logf("Error getting cronjobs: %v", err) + return false, nil + } + e2e.Logf("Cronjob namespaces: %v", allCronjobs) + + for _, ns := range strings.Fields(allCronjobs) { + // Use jsonpath to get event messages directly instead of table output + events, err := oc.AsAdmin().WithoutNamespace().Run("get").Args( + "events", "-n", ns, "-o=jsonpath={range .items[*]}{.message}{\"\\n\"}{end}", + ).Output() + if err != nil { + e2e.Logf("Error getting events in namespace %s: %v", ns, err) + continue + } + + // Check for the error pattern: MountVolume.SetUp failed for volume ... object ... not registered + errorPattern := regexp.MustCompile(`MountVolume\.SetUp failed for volume.*object.*not registered`) + matches := errorPattern.FindAllString(events, -1) + if len(matches) > 0 { + return false, fmt.Errorf("found mount error in namespace %s: %v", ns, matches[0]) + } + } + + // Keep polling until timeout - no errors found in this iteration + return false, nil + }) + // Expect timeout (no errors found during the full polling window) + o.Expect(err).To(o.HaveOccurred()) + o.Expect(err.Error()).To(o.ContainSubstring("timed out")) + }) }) // author: asahay@redhat.com