Skip to content

Conversation

@anuragthehatter
Copy link

OTE framework for Ingress Node Firewall and migrating a LEVEL0 usecase

Once this PR merge, next steps would be

  • create imageStream to define the location of the binary
  • CI workflow which want to test the operator, add a step to deploy the operator in day2
  • when the operator is setup and imageStream would be created

Ran a test with operator installed on a cluster

$ ./test/bin/ingress-node-firewall-tests run-test --ginkgo.focus="61481" --ginkgo.v   
Running ingress-node-firewall tests...                                                                                                            

Running Suite: ingress-node-firewall Extended Test Suite - /home/anusaxen/git/ingress-node-firewall
===================================================================================================
Random Seed: 1769305656

Will run 1 of 1 specs
------------------------------
[sig-network] INFW Author:anusaxen-High-61481-LEVEL0-StagerunBoth-Ingress Node Firewall Operator Installation [apigroup:ingressnodefirewall.openshift.io]
/home/anusaxen/git/ingress-node-firewall/test/e2e/operator/operator.go:37
  STEP: Checking Ingress Node Firewall operator installation @ 01/24/26 20:47:36.007
  STEP: Verifying CRDs are installed @ 01/24/26 20:47:36.301
  STEP: Verifying operator deployment is running @ 01/24/26 20:47:36.59
  STEP: SUCCESS - Ingress Node Firewall operator and CRDs installed @ 01/24/26 20:47:37.182
Operator install and CRDs check successful!
• [1.176 seconds]
------------------------------

Ran 1 of 1 Specs in 1.177 seconds
SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped

@openshift-ci openshift-ci bot requested review from abhat and jcaamano January 25, 2026 02:47
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Jan 25, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: anuragthehatter
Once this PR has been reviewed and has the lgtm label, please assign tssurya for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@anuragthehatter
Copy link
Author

cc @zhaozhanqi @asood-rh

@coderabbitai
Copy link

coderabbitai bot commented Jan 25, 2026

Important

Review skipped

Auto reviews are limited based on label configuration.

🚫 Excluded labels (none allowed) (1)
  • do-not-merge/work-in-progress

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review

Walkthrough

This pull request introduces end-to-end testing infrastructure for Ingress Node Firewall. Changes include Dockerfile modifications to package test binaries, new Makefile targets for building and cleaning tests, expanded Go module dependencies (Ginkgo v2, OpenShift tests extension, Cobra), a test build system, OTE-based test registry entrypoint, Kubernetes E2E utilities and oc command wrapper, and an initial Ginkgo-based operator test suite.

Changes

Cohort / File(s) Summary
Docker & Build Configuration
Dockerfile.openshift, Makefile
Adds test build stage in Dockerfile; copies test/ directory and builds e2e-tests binary via make, gzips result, and includes in final image. Top-level Makefile introduces .PHONY targets build-e2e-tests and clean-e2e-tests to invoke test submake.
Go Module Dependencies
go.mod
Adds direct dependencies (github.com/onsi/ginkgo/v2, github.com/openshift-eng/openshift-tests-extension, github.com/spf13/cobra) and large indirect dependency set. Introduces replace block mapping Kubernetes modules to v0.32.3 and OTE framework versions.
Test Build System
test/Makefile
New Makefile for building extended e2e test binary with version metadata via ldflags. Defines targets: all, build-e2e-tests, clean, help. Configures binary name, paths, Go flags (CGO disabled, static binary), and vendor mode.
Test Framework Entry
test/cmd/main.go
Wires OTE test registry under "ingress-node-firewall" label. Constructs Cobra root command and attaches DefaultExtensionCommands to expose standard OTE subcommands (info, list, run-test).
E2E Test Utilities
test/e2e/util.go, test/e2e/cli.go
Adds 10 utility functions for kubeconfig resolution, Kubernetes client/config creation, and namespace/pod/deployment/daemonset operations with polling. Introduces OCClient wrapper for oc command execution with kubeconfig, providing methods: Run, Apply, Delete, Get.
E2E Test Suite
test/e2e/operator/operator.go
Implements Ginkgo test verifying operator installation: checks namespace existence, lists and validates three CRDs, confirms deployments present, waits for ingress-node-firewall-controller-manager deployment readiness (5-minute timeout).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@test/e2e/operator/operator.go`:
- Around line 15-16: The defer g.GinkgoRecover() call is misplaced inside the
g.Describe callback; remove it from the Describe block and either delete it
entirely or relocate it to the setup of any goroutine-starting tests (e.g.,
inside BeforeEach/It where goroutines are spawned) so that GinkgoRecover() is
deferred in the same function that starts those goroutines; search for
g.Describe and GinkgoRecover to find and update the placement accordingly.

In `@test/e2e/util.go`:
- Around line 91-92: Check for nil before dereferencing
deployment.Spec.Replicas: compute an int32 desiredReplicas := int32(1) and if
deployment.Spec.Replicas != nil set desiredReplicas = *deployment.Spec.Replicas,
then compare deployment.Status.ReadyReplicas == desiredReplicas &&
deployment.Status.UpdatedReplicas == desiredReplicas instead of directly
dereferencing deployment.Spec.Replicas; update the conditional that currently
uses deployment.Spec.Replicas to use this safe desiredReplicas value.
- Around line 52-59: CreateNamespace currently fails if the namespace already
exists; update CreateNamespace to call client.CoreV1().Namespaces().Create and,
if it returns an error, check kubernetes API error using
apierrors.IsAlreadyExists(err) and in that case return the existing namespace
via client.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{}) with a nil
error; otherwise propagate the original error. Use the apierrors.IsAlreadyExists
helper and the CreateNamespace function name to locate where to add this
handling.
🧹 Nitpick comments (4)
test/e2e/util.go (1)

70-72: Consider tolerating transient errors during polling.

Returning false, err on Get failure stops polling immediately. For NotFound errors (pod not yet created), this may be premature. Consider returning false, nil for transient/expected errors to allow polling to continue.

Proposed approach
 		pod, err := client.CoreV1().Pods(namespace).Get(ctx, podName, metav1.GetOptions{})
 		if err != nil {
+			if k8serrors.IsNotFound(err) {
+				return false, nil // Pod not yet created, keep polling
+			}
 			return false, err
 		}
test/e2e/operator/operator.go (1)

55-58: Use ContainSubstring matcher directly for cleaner assertions.

More idiomatic Gomega
 		for _, crd := range expectedCRDs {
-			o.Expect(strings.Contains(crdOutput, crd)).To(o.BeTrue(),
-				"CRD %s should be installed", crd)
+			o.Expect(crdOutput).To(o.ContainSubstring(crd),
+				"CRD %s should be installed", crd)
 		}
test/extension/registry.go (1)

9-14: Consider if mutex is necessary for the current usage pattern.

The RWMutex provides thread-safety, but based on the usage in test/cmd/main.go, the registry is created and populated once during startup before any concurrent access. If concurrent registration isn't a requirement, the mutex adds unnecessary complexity. However, this is fine to keep if you anticipate future concurrent usage.

test/extension/cmd/commands.go (1)

43-50: Hardcoded test list will become stale.

The test names are hardcoded, which means this list must be manually updated whenever tests are added or removed. Consider generating this dynamically from Ginkgo's spec tree, or documenting that this list requires manual maintenance.

Comment on lines 15 to 16
var _ = g.Describe("[sig-network] INFW", func() {
defer g.GinkgoRecover()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Misplaced GinkgoRecover() - remove or relocate.

defer g.GinkgoRecover() inside the Describe callback executes when the setup function returns, not during test execution. It's intended for goroutines spawned during tests. This is likely ineffective here.

Proposed fix
 var _ = g.Describe("[sig-network] INFW", func() {
-	defer g.GinkgoRecover()
-
 	var (
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var _ = g.Describe("[sig-network] INFW", func() {
defer g.GinkgoRecover()
var _ = g.Describe("[sig-network] INFW", func() {
var (
🤖 Prompt for AI Agents
In `@test/e2e/operator/operator.go` around lines 15 - 16, The defer
g.GinkgoRecover() call is misplaced inside the g.Describe callback; remove it
from the Describe block and either delete it entirely or relocate it to the
setup of any goroutine-starting tests (e.g., inside BeforeEach/It where
goroutines are spawned) so that GinkgoRecover() is deferred in the same function
that starts those goroutines; search for g.Describe and GinkgoRecover to find
and update the placement accordingly.

test/e2e/util.go Outdated
Comment on lines 52 to 59
func CreateNamespace(ctx context.Context, client kubernetes.Interface, name string) (*corev1.Namespace, error) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
}
return client.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

CreateNamespace should handle AlreadyExists for idempotency.

Unlike the existing namespaces.Create in test/e2e/namespaces/namespaces.go (lines 32-42), this function returns an error if the namespace already exists. This will cause test failures on reruns or when the namespace pre-exists.

Proposed fix
+import k8serrors "k8s.io/apimachinery/pkg/api/errors"
+
 // CreateNamespace creates a namespace with the given name
 func CreateNamespace(ctx context.Context, client kubernetes.Interface, name string) (*corev1.Namespace, error) {
 	ns := &corev1.Namespace{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: name,
 		},
 	}
-	return client.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
+	created, err := client.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
+	if k8serrors.IsAlreadyExists(err) {
+		return client.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{})
+	}
+	return created, err
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
func CreateNamespace(ctx context.Context, client kubernetes.Interface, name string) (*corev1.Namespace, error) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
}
return client.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
}
func CreateNamespace(ctx context.Context, client kubernetes.Interface, name string) (*corev1.Namespace, error) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
}
created, err := client.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
if k8serrors.IsAlreadyExists(err) {
return client.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{})
}
return created, err
}
🤖 Prompt for AI Agents
In `@test/e2e/util.go` around lines 52 - 59, CreateNamespace currently fails if
the namespace already exists; update CreateNamespace to call
client.CoreV1().Namespaces().Create and, if it returns an error, check
kubernetes API error using apierrors.IsAlreadyExists(err) and in that case
return the existing namespace via client.CoreV1().Namespaces().Get(ctx, name,
metav1.GetOptions{}) with a nil error; otherwise propagate the original error.
Use the apierrors.IsAlreadyExists helper and the CreateNamespace function name
to locate where to add this handling.

test/e2e/util.go Outdated
Comment on lines 91 to 92
if deployment.Status.ReadyReplicas == *deployment.Spec.Replicas &&
deployment.Status.UpdatedReplicas == *deployment.Spec.Replicas {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Potential nil pointer dereference on Spec.Replicas.

deployment.Spec.Replicas can be nil (defaults to 1 when unset). Dereferencing without a nil check will panic.

Proposed fix
+func int32PtrDerefOr(ptr *int32, def int32) int32 {
+	if ptr != nil {
+		return *ptr
+	}
+	return def
+}
+
 // WaitForDeploymentReady waits for a deployment to be ready
 func WaitForDeploymentReady(ctx context.Context, client kubernetes.Interface, namespace, deploymentName string) error {
 	return wait.PollUntilContextTimeout(ctx, DefaultInterval, DefaultTimeout, true, func(ctx context.Context) (bool, error) {
 		deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deploymentName, metav1.GetOptions{})
 		if err != nil {
 			return false, err
 		}
 
-		if deployment.Status.ReadyReplicas == *deployment.Spec.Replicas &&
-			deployment.Status.UpdatedReplicas == *deployment.Spec.Replicas {
+		replicas := int32PtrDerefOr(deployment.Spec.Replicas, 1)
+		if deployment.Status.ReadyReplicas == replicas &&
+			deployment.Status.UpdatedReplicas == replicas {
 			return true, nil
 		}
 		return false, nil
 	})
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if deployment.Status.ReadyReplicas == *deployment.Spec.Replicas &&
deployment.Status.UpdatedReplicas == *deployment.Spec.Replicas {
func int32PtrDerefOr(ptr *int32, def int32) int32 {
if ptr != nil {
return *ptr
}
return def
}
// WaitForDeploymentReady waits for a deployment to be ready
func WaitForDeploymentReady(ctx context.Context, client kubernetes.Interface, namespace, deploymentName string) error {
return wait.PollUntilContextTimeout(ctx, DefaultInterval, DefaultTimeout, true, func(ctx context.Context) (bool, error) {
deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deploymentName, metav1.GetOptions{})
if err != nil {
return false, err
}
replicas := int32PtrDerefOr(deployment.Spec.Replicas, 1)
if deployment.Status.ReadyReplicas == replicas &&
deployment.Status.UpdatedReplicas == replicas {
return true, nil
}
return false, nil
})
}
🤖 Prompt for AI Agents
In `@test/e2e/util.go` around lines 91 - 92, Check for nil before dereferencing
deployment.Spec.Replicas: compute an int32 desiredReplicas := int32(1) and if
deployment.Spec.Replicas != nil set desiredReplicas = *deployment.Spec.Replicas,
then compare deployment.Status.ReadyReplicas == desiredReplicas &&
deployment.Status.UpdatedReplicas == desiredReplicas instead of directly
dereferencing deployment.Spec.Replicas; update the conditional that currently
uses deployment.Spec.Replicas to use this safe desiredReplicas value.

@zhaozhanqi
Copy link

You are not using OTE framework ? but title named 'OTE' . and you are building the binary with owned options.

@zhaozhanqi
Copy link

Could you make the go vendor and go.sum .etc in one separate commit thus we can review others changes easily? thanks

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@go.mod`:
- Line 94: Upgrade the indirect dependency golang.org/x/oauth2 in go.mod from
v0.25.0 to v0.27.0 (or newer) to remediate CVE-2025-22868; update the version
string for golang.org/x/oauth2, run go mod tidy to refresh go.sum, and re-run
your build/tests to ensure no dependency breakage (look for the
golang.org/x/oauth2 entry in go.mod and the resulting changes in go.sum).
🧹 Nitpick comments (2)
test/e2e/cli.go (1)

49-57: Consider adding --ignore-not-found flag for cleanup resilience.

The Delete method may fail if the resource doesn't exist, which can cause issues during test cleanup or idempotent operations.

♻️ Proposed enhancement
 // Delete deletes a resource
-func (c *OCClient) Delete(ctx context.Context, resourceType, name, namespace string) error {
-	args := []string{"delete", resourceType, name}
+func (c *OCClient) Delete(ctx context.Context, resourceType, name, namespace string, ignoreNotFound bool) error {
+	args := []string{"delete", resourceType, name}
+	if ignoreNotFound {
+		args = append(args, "--ignore-not-found")
+	}
 	if namespace != "" {
 		args = append(args, "-n", namespace)
 	}
test/e2e/operator/operator.go (1)

71-72: Use g.By() or GinkgoWriter instead of fmt.Println.

fmt.Println output may not be captured properly by Ginkgo's test output handling. For consistency with the rest of the test, use g.By() for step logging.

♻️ Proposed fix
 		g.By("SUCCESS - Ingress Node Firewall operator and CRDs installed")
-		fmt.Println("Operator install and CRDs check successful!")

The g.By() call on line 71 already logs the success message, making the fmt.Println redundant.

go.mod Outdated
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/net v0.37.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

golang.org/x/oauth2 v0.25.0 GO-2025-3488 security vulnerability

💡 Result:

golang.org/x/oauth2 v0.25.0 is vulnerable to GO-2025-3488 (aliases: CVE-2025-22868, GHSA-6v2p-p543-phr9). The issue is unexpected/unbounded memory consumption while parsing a malformed token, which can be triggered remotely and can lead to denial of service (availability impact). Affected code is in golang.org/x/oauth2/jws (notably Verify). [1][2][3]

Affected versions: all versions before v0.27.0 (so v0.25.0 is affected). [1][2][3]
Fixed version: v0.27.0. [1][2][3]

Remediation: upgrade:

  • go get golang.org/x/oauth2@v0.27.0 (or later) [2][3]

🌐 Web query:

GHSA-6v2p-p543-phr9 golang.org/x/oauth2 vulnerability

💡 Result:

GHSA-6v2p-p543-phr9 is CVE-2025-22868 affecting golang.org/x/oauth2. It allows an attacker to send a malformed token that triggers unexpected / excessive memory consumption during token parsing, potentially causing denial of service (DoS). [1][2]

  • Affected: golang.org/x/oauth2 versions < v0.27.0 (specifically the golang.org/x/oauth2/jws package, Verify function). [1][3]
  • Fixed: v0.27.0. [1][3]
  • Remediation: upgrade dependency, e.g. go get golang.org/x/oauth2@v0.27.0 (or newer). [1][3]

Sources: [1] OSV (GO-2025-3488) [2] OSV (GHSA entry) [3] Go vuln report (pkg.go.dev/vuln/GO-2025-3488


🏁 Script executed:

# Check golang.org/x/oauth2 security advisories from OSV database
curl -s "https://api.osv.dev/v1/query" \
  -H "Content-Type: application/json" \
  -d '{"package": {"name": "golang.org/x/oauth2", "ecosystem": "Go"}, "version": "0.25.0"}' | jq '.'

Repository: openshift/ingress-node-firewall

Length of output: 4520


Upgrade golang.org/x/oauth2 to v0.27.0 or later to address a HIGH severity denial-of-service vulnerability.

golang.org/x/oauth2 v0.25.0 is affected by GO-2025-3488 (CVE-2025-22868), which allows an attacker to trigger unexpected memory consumption during token parsing in the jws package, causing denial of service. All versions before v0.27.0 are affected. Upgrade to v0.27.0 or later.

🧰 Tools
🪛 OSV Scanner (2.3.2)

[HIGH] 94-94: golang.org/x/oauth2 0.25.0: Unexpected memory consumption during token parsing in golang.org/x/oauth2

(GO-2025-3488)


[HIGH] 94-94: golang.org/x/oauth2 0.25.0: golang.org/x/oauth2 Improper Validation of Syntactic Correctness of Input vulnerability

(GHSA-6v2p-p543-phr9)

🤖 Prompt for AI Agents
In `@go.mod` at line 94, Upgrade the indirect dependency golang.org/x/oauth2 in
go.mod from v0.25.0 to v0.27.0 (or newer) to remediate CVE-2025-22868; update
the version string for golang.org/x/oauth2, run go mod tidy to refresh go.sum,
and re-run your build/tests to ensure no dependency breakage (look for the
golang.org/x/oauth2 entry in go.mod and the resulting changes in go.sum).

@anuragthehatter
Copy link
Author

anuragthehatter commented Jan 26, 2026

You are not using OTE framework ? but title named 'OTE' . and you are building the binary with owned options.

You're right. This is fixed. Thanks for reviewing that. Re-ran the usecase. It was an experiment and seems like real cimmit was missed :(

$ ./test/bin/ingress-node-firewall-tests run-test -n "[sig-network] INFW Author:anusaxen-High-61481-[LEVEL0][OTP]-StagerunBoth-Ingress Node Firewall Operator Installation [apigroup:ingressnodefirewall.openshift.io]"                                                                           
 
  Running Suite:  - /home/anusaxen/git/ingress-node-firewall
  ==========================================================
  Random Seed: 1769462563 - will randomize all specs

  Will run 1 of 1 specs
  ------------------------------
  [sig-network] INFW Author:anusaxen-High-61481-[LEVEL0][OTP]-StagerunBoth-Ingress Node Firewall Operator Installation [apigroup:ingressnodefirewall.openshift.io]
  /home/anusaxen/git/ingress-node-firewall/test/e2e/operator/operator.go:37
    STEP: Checking Ingress Node Firewall operator installation @ 01/26/26 16:22:43.688
    STEP: Verifying CRDs are installed @ 01/26/26 16:22:44.008
    STEP: Verifying operator deployment is running @ 01/26/26 16:22:44.341
    STEP: SUCCESS - Ingress Node Firewall operator and CRDs installed @ 01/26/26 16:22:44.977
Operator install and CRDs check successful!
  • [1.290 seconds]
  ------------------------------

  Ran 1 of 1 Specs in 1.290 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[

test/e2e/cli.go Outdated
}

// Apply applies a resource from a file
func (c *OCClient) Apply(ctx context.Context, file string) error {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems this function is not used

@anuragthehatter anuragthehatter changed the title OTE framework for Ingress Node Firewall and migrating a LEVEL0 usecase WIP: OTE framework for Ingress Node Firewall and migrating a LEVEL0 usecase Jan 29, 2026
@openshift-ci openshift-ci bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jan 29, 2026
anuragthehatter and others added 2 commits February 2, 2026 21:52
Add vendor dependencies required for the OpenShift Tests Extension (OTE)
framework integration, including:
- github.com/openshift-eng/openshift-tests-extension
- github.com/onsi/ginkgo/v2 (OpenShift fork)
- github.com/spf13/cobra for CLI support
- google.golang.org/cel-go and related CEL dependencies
- Additional supporting libraries

Also upgrade golang.org/x/oauth2 from v0.25.0 to v0.27.0 to address
CVE-2025-22868 (GO-2025-3488, GHSA-6v2p-p543-phr9), a HIGH severity
denial-of-service vulnerability that allows attackers to trigger
unexpected memory consumption during token parsing.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive test infrastructure using the OpenShift Tests Extension
(OTE) framework to enable standardized testing and integration with the
OpenShift testing ecosystem.

Changes include:
- Add test/cmd/main.go as the entry point for OTE-based tests
- Add test/e2e/cli.go with OCClient for executing oc commands
- Add test/e2e/util.go with GetKubeconfig helper
- Add test/e2e/operator/operator.go with OCP-61481 test case for operator
  installation verification
- Add test/Makefile with targets for building and running OTE tests
- Update Dockerfile.openshift to include test binary in the image
- Update Makefile with test-related targets

Code improvements and cleanup:
- Remove misplaced defer GinkgoRecover() from Describe block
- Remove unused OCClient methods (Apply, Delete)
- Remove apigroup annotation from test case OCP-61481

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Feb 3, 2026

@anuragthehatter: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/ingress-node-firewall-e2e-metal-ipi f519c43 link true /test ingress-node-firewall-e2e-metal-ipi
ci/prow/verify-deps f519c43 link true /test verify-deps
ci/prow/images f519c43 link true /test images
ci/prow/test-fmt f519c43 link true /test test-fmt
ci/prow/ci-index f519c43 link true /test ci-index
ci/prow/unit-test f519c43 link true /test unit-test

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants