Skip to content

OCPCLOUD-3542: Add CRD Compatibility Checker OTE e2e tests#599

Open
stefanonardo wants to merge 1 commit into
openshift:mainfrom
stefanonardo:OCPCLOUD-3542
Open

OCPCLOUD-3542: Add CRD Compatibility Checker OTE e2e tests#599
stefanonardo wants to merge 1 commit into
openshift:mainfrom
stefanonardo:OCPCLOUD-3542

Conversation

@stefanonardo

@stefanonardo stefanonardo commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Add 10 e2e tests covering all three webhook paths of the CRD Compatibility Checker: CRD schema validation, object validation, and object pruning

Summary by CodeRabbit

  • Tests
    • Added a Ginkgo/Gomega end-to-end suite for CRD compatibility behavior, gated by the feature setting.
    • Validates controller Deployment health, required validating webhooks, and expected replica/topology alignment.
    • Covers CRD admission and update compatibility (compatible updates succeed; incompatible changes are eventually rejected with compatibility-related errors).
    • Adds object schema validation coverage for deny behavior, including missing required-field rejection messaging.
    • Extended the shared e2e framework with create-and-cleanup and delete-and-wait helpers, and expanded the test scheme with OpenShift API types.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 4b7f73cc-d49d-45c8-9112-d3c430c1e384

📥 Commits

Reviewing files that changed from the base of the PR and between f754efd and bdd8eaa.

⛔ Files ignored due to path filters (2)
  • e2e/go.sum is excluded by !**/*.sum
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (4)
  • e2e/crd_compatibility_test.go
  • e2e/e2e_common.go
  • e2e/framework/framework.go
  • e2e/go.mod
✅ Files skipped from review due to trivial changes (1)
  • e2e/e2e_common.go
🚧 Files skipped from review as they are similar to previous changes (3)
  • e2e/go.mod
  • e2e/framework/framework.go
  • e2e/crd_compatibility_test.go

Walkthrough

Adds a comprehensive Ginkgo/Gomega e2e test suite for the CRDCompatibilityRequirement controller that verifies deployment health, validates CRD-level schema compatibility enforcement (accepting compatible updates, rejecting incompatible ones), and tests CR-level object validation through dynamic webhooks. Introduces test helper functions for resource lifecycle management, registers OpenShift apiextensions/v1alpha1 types into the controller-runtime scheme, and updates Go module dependencies.

Changes

CRD Compatibility e2e Test Suite

Layer / File(s) Summary
Test structure and lifecycle framework
e2e/crd_compatibility_test.go, e2e/e2e_common.go, e2e/framework/framework.go
Establishes test file scaffolding with feature-gate constant and imports; registers OpenShift apiextensions/v1alpha1 types into controller-runtime scheme; introduces CreateAndCleanup and DeleteAndWait helpers that manage object creation, deferred cleanup, and polling for object removal.
CRD compatibility test helpers
e2e/crd_compatibility_test.go
Defines unexported helpers that wait for CompatibilityRequirement admission readiness by polling observed CRD UID/generation and condition status, create test CRDs with corresponding requirements, and derive target CRD GVK from requirement spec.
Controller deployment health and prerequisites
e2e/crd_compatibility_test.go
Verifies compatibility-requirements-controller Deployment reaches Available status, all controller pods are Running, both required static ValidatingWebhookConfigurations exist, and Deployment replica count matches detected control-plane topology.
CRD-level schema compatibility validation
e2e/crd_compatibility_test.go
Tests CRD admission by creating test CRD and CompatibilityRequirement; validates that compatible schema updates (adding optional properties) succeed while incompatible updates (removing status property and subresources) are eventually rejected with compatibility error.
CR-level object schema validation and admission
e2e/crd_compatibility_test.go
Configures test CRD schema to require appName property and sets object schema validation action to Deny; waits for dynamic ValidatingWebhookConfiguration and verifies conforming CRs are accepted while CRs missing required fields are rejected.
Go module dependency updates
e2e/go.mod
Adds indirect dependencies for containerd estargz snapshotter, Docker modules, go-containerregistry, compression/homedir utilities, local manifests-gen module, logrus, and tar-split.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~28 minutes

🚥 Pre-merge checks | ✅ 12 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning Test structure violates custom check requirements: (1) First It block tests 4 unrelated behaviors (not single responsibility); (2) Missing assertion messages on lines 159, 164; (3) Inconsistent cle... Refactor first It block into separate tests; add messages to all assertions; use framework.DeleteAndWait or consistent cleanup patterns throughout.
Microshift Test Compatibility ⚠️ Warning Tests use config.openshift.io/v1 (Infrastructure API via infra variable, FeatureGates) which is unavailable on MicroShift. Tests lack protection mechanisms ([Skipped:MicroShift], [apigroup:...], or... Add [apigroup:config.openshift.io] tag to the test suite Describe block, or wrap the test with IsMicroShiftCluster() check with Skip(), or add [Skipped:MicroShift] label since config.openshift.io APIs are only available on full OpenShift.
✅ Passed checks (12 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding end-to-end tests for the CRD Compatibility Checker component, which aligns with the PR objectives of adding 10 e2e tests for CRD schema validation, object validation, and object pruning webhooks.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed All 10 Ginkgo tests in crd_compatibility_test.go use static, deterministic names with no dynamic information (UUIDs, timestamps, pod names, IPs, etc.). Test titles are descriptive and follow best p...
Single Node Openshift (Sno) Test Compatibility ✅ Passed All new Ginkgo e2e tests in crd_compatibility_test.go are SNO-compatible. The "Deployment replicas" test explicitly checks infra.Status.ControlPlaneTopology and correctly expects 1 replica for Sing...
Topology-Aware Scheduling Compatibility ✅ Passed PR adds only e2e tests that validate topology-aware scheduling of existing deployments; does not introduce or modify deployment manifests, operator code, or scheduling constraints.
Ote Binary Stdout Contract ✅ Passed All process-level code (init(), test helpers) contains no fmt.Print*/log/klog stdout writes. Test code properly wraps fmt.Sprintf in Ginkgo blocks (By, It) where framework intercepts output.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed Test file contains no IPv4 hardcoded addresses, IPv4-specific parsing, or external connectivity requirements. All operations are against local cluster APIs.
No-Weak-Crypto ✅ Passed No weak cryptographic algorithms (MD5, SHA1, DES, RC4, 3DES, Blowfish), ECB mode, custom crypto implementations, or non-constant-time secret comparisons found in any of the modified files.
Container-Privileges ✅ Passed PR contains only Go test/source files and module dependencies; no Kubernetes manifests or container definitions with privileged settings are present.
No-Sensitive-Data-In-Logs ✅ Passed No sensitive data exposure in logs. All logging (13 By() calls + 2 fmt.Sprintf) contains only test descriptions, object type names, object names, and public cluster topology—no passwords, tokens, A...

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci openshift-ci Bot requested review from mdbooth and nrb June 16, 2026 11:34
@openshift-ci

openshift-ci Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign damdo 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

@stefanonardo stefanonardo changed the title e2e: add CRD Compatibility Checker tests OCPCLOUD-3542: Add CRD Compatibility Checker e2e tests Jun 16, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jun 16, 2026
@openshift-ci-robot

openshift-ci-robot commented Jun 16, 2026

Copy link
Copy Markdown

@stefanonardo: This pull request references OCPCLOUD-3542 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Add 10 e2e tests covering all three webhook paths of the CRD Compatibility Checker: CRD schema validation, object validation, and object pruning

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 openshift-eng/jira-lifecycle-plugin repository.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
e2e/crd_compatibility_test.go (1)

132-137: ⚡ Quick win

Add explicit assertion messages on setup assertions for faster triage.

These setup-time Expect(...).To(Succeed()) calls should include failure messages (resource name/context) to make e2e failures actionable.

As per coding guidelines, “Assertion messages—assertions should include meaningful failure messages, flag missing messages.”

Example improvement
- Expect(cl.Create(ctx, crd)).To(Succeed())
+ Expect(cl.Create(ctx, crd)).To(Succeed(), "failed to create test CRD %s", crd.Name)

- Expect(cl.Create(ctx, requirement)).To(Succeed())
+ Expect(cl.Create(ctx, requirement)).To(Succeed(), "failed to create CompatibilityRequirement %s", requirement.Name)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/crd_compatibility_test.go` around lines 132 - 137, Add explicit assertion
failure messages to the setup-time Expect().To(Succeed()) calls for the CRD and
CompatibilityRequirement creation. Include meaningful context in each assertion
message (such as the resource name and operation being performed) by passing a
message string as an argument to the To(Succeed()) calls. This will provide
actionable error information when these assertions fail during e2e test
execution, making it easier to diagnose failures in the test setup phase.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@e2e/crd_compatibility_test.go`:
- Around line 160-201: The test title in the It() block claims to verify
"webhook services" but the implementation only validates
ValidatingWebhookConfiguration resources (at lines 196-200), without checking
any Service objects. Either add explicit assertions to verify the webhook
Services exist using cl.Get() with the appropriate Service object keys in the
framework.CompatibilityRequirementsNamespace, or update the test description
string to remove the reference to "webhook services" so it accurately reflects
only the ValidatingWebhookConfiguration validation that is performed.

---

Nitpick comments:
In `@e2e/crd_compatibility_test.go`:
- Around line 132-137: Add explicit assertion failure messages to the setup-time
Expect().To(Succeed()) calls for the CRD and CompatibilityRequirement creation.
Include meaningful context in each assertion message (such as the resource name
and operation being performed) by passing a message string as an argument to the
To(Succeed()) calls. This will provide actionable error information when these
assertions fail during e2e test execution, making it easier to diagnose failures
in the test setup phase.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: d3f9cce6-3717-44fb-8852-69c2ef9de93d

📥 Commits

Reviewing files that changed from the base of the PR and between 05c113e and 5cad8fe.

📒 Files selected for processing (2)
  • e2e/crd_compatibility_test.go
  • e2e/e2e_common.go

Comment thread e2e/crd_compatibility_test.go Outdated
@stefanonardo stefanonardo force-pushed the OCPCLOUD-3542 branch 2 times, most recently from 2c1b25e to 46e7394 Compare June 16, 2026 13:18

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@e2e/crd_compatibility_test.go`:
- Around line 183-200: The pod status checks and ValidatingWebhookConfiguration
existence assertions in the test (pod listing loop checking Phase equals
corev1.PodRunning, and the two client.Get calls for staticVWCCRDValidation and
staticVWCCRValidation webhook configurations) are performing one-shot
synchronous reads that don't account for eventual consistency. Wrap these
assertions with Eventually blocks that include appropriate timeout and retry
intervals to wait for pods to reach Running state and for the webhook
configurations to become available, rather than expecting them to be immediately
ready after deployment.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 846ab123-182b-4c77-8297-3d24aed34cea

📥 Commits

Reviewing files that changed from the base of the PR and between 2c1b25e and 46e7394.

⛔ Files ignored due to path filters (2)
  • e2e/go.sum is excluded by !**/*.sum
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (3)
  • e2e/crd_compatibility_test.go
  • e2e/e2e_common.go
  • e2e/go.mod
🚧 Files skipped from review as they are similar to previous changes (1)
  • e2e/e2e_common.go

Comment thread e2e/crd_compatibility_test.go Outdated

@mdbooth mdbooth left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I've paused reviewing for the moment. Posted discussion point in https://redhat-internal.slack.com/archives/C05KZA3NVU6/p1781619084762889

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +51 to +66
func skipUnlessCompatibilityRequirementCRD() {
GinkgoHelper()

By("Checking for the presence of the CompatibilityRequirement CRD")

crd := &apiextensionsv1.CustomResourceDefinition{}

Eventually(func() error {
err := cl.Get(ctx, client.ObjectKey{Name: compatibilityRequirementCRDName}, crd)
if apierrors.IsNotFound(err) {
Skip("CompatibilityRequirement CRD is not installed (feature gate CRDCompatibilityRequirementOperator not enabled). Skipping CRD compatibility tests.")
}

return err
}).Should(Succeed(), "failed to check for CompatibilityRequirement CRD")
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should gate on the feature gate rather than the CRD. Can anybody more familiar with such things confirm? Perhaps @simkam or @JoelSpeed ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It looks like our existing tests check the feature gate instead of CRD presence.

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +68 to +106
func cleanupCompatibilityRequirement(requirement *apiextensionsv1alpha1.CompatibilityRequirement) {
GinkgoHelper()

key := client.ObjectKeyFromObject(requirement)

Eventually(func() error {
err := cl.Delete(ctx, requirement)
if apierrors.IsNotFound(err) {
return nil
}

return err
}).WithTimeout(framework.WaitShort).Should(Succeed(), "failed to delete CompatibilityRequirement")

Eventually(func() bool {
err := cl.Get(ctx, key, &apiextensionsv1alpha1.CompatibilityRequirement{})
return apierrors.IsNotFound(err)
}).WithTimeout(framework.WaitMedium).WithPolling(framework.RetryMedium).Should(BeTrue(), "CompatibilityRequirement was not fully deleted")
}

func cleanupTestCRD(crd *apiextensionsv1.CustomResourceDefinition) {
GinkgoHelper()

key := client.ObjectKeyFromObject(crd)

Eventually(func() error {
err := cl.Delete(ctx, crd)
if apierrors.IsNotFound(err) {
return nil
}

return err
}).WithTimeout(framework.WaitShort).Should(Succeed(), "failed to delete test CRD")

Eventually(func() bool {
err := cl.Get(ctx, key, &apiextensionsv1.CustomResourceDefinition{})
return apierrors.IsNotFound(err)
}).WithTimeout(framework.WaitMedium).WithPolling(framework.RetryMedium).Should(BeTrue(), "test CRD was not fully deleted")
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think we already have a generic cleanupResource helper (or similar) which would cover both of these cases? Or perhaps that's only in the integration tests...

Can you look harder for one, anyway? If it doesn't exist we should write it. It's identical to both of these except it takes a client.Object instead of a specific type. You can use an Unstructured for the get if you don't want to get fancy.

Comment thread e2e/crd_compatibility_test.go Outdated
test.HaveCondition(apiextensionsv1alpha1.CompatibilityRequirementProgressing).
WithStatus(metav1.ConditionFalse).
WithReason(apiextensionsv1alpha1.CompatibilityRequirementUpToDateReason),
))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We also need to check that status.ObservedCRD has the expected UID and Generation to avoid races.

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +141 to +142
cleanupCompatibilityRequirement(requirement)
cleanupTestCRD(crd)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ideally you want to put the DeferCleanup immediately after the create (so 2 DeferCleanups here). Otherwise a failure of the second Create means the first object will not be cleaned up.

Although, is there a createTestResource helper which both creates the object and also schedules its cleanup?

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +196 to +200
By("Checking the CRD validation ValidatingWebhookConfiguration exists")
Expect(cl.Get(ctx, client.ObjectKey{Name: staticVWCCRDValidation}, &admissionregistrationv1.ValidatingWebhookConfiguration{})).To(Succeed())

By("Checking the CompatibilityRequirement validation ValidatingWebhookConfiguration exists")
Expect(cl.Get(ctx, client.ObjectKey{Name: staticVWCCRValidation}, &admissionregistrationv1.ValidatingWebhookConfiguration{})).To(Succeed())

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IIRC these are created dynamically by the controller itself, so we should put these in an Eventually for robustness.

Also, top Ginkgo tip: the logs are better structured if you pass the actions associated with By to the By call as a lambda, e.g.:

			By("Checking the CompatibilityRequirement validation ValidatingWebhookConfiguration exists", func() {
			  Eventually(cl.Get(ctx, client.ObjectKey{Name: staticVWCCRValidation}, &admissionregistrationv1.ValidatingWebhookConfiguration{})).Should(Succeed())
            })

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +183 to +190
By("Checking all pods are Running")

pods := &corev1.PodList{}
Expect(cl.List(ctx, pods,
client.InNamespace(framework.CompatibilityRequirementsNamespace),
client.MatchingLabels{"k8s-app": crdCompatibilityDeploymentName},
)).To(Succeed())
Expect(pods.Items).ToNot(BeEmpty(), "expected at least one pod")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Eventually

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +204 to +209
Context("CRD schema validation with Deny action", func() {
It("should reject incompatible CRD updates", func() {
testCRD := test.GenerateTestCRD()
requirement := test.GenerateTestCompatibilityRequirement(testCRD)
createTestCRDAndRequirement(testCRD, requirement)
waitForRequirementReady(requirement)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There's a lot of duplicated preamble here. We'd typically try to structure this nested. Perhaps:

  Context("When a CRD has a valid CompatibilityRequirement", func() {
    var (
      testCRD *CRD...
      required *CompatReq...
    )

    BeforeEach(func() {
      testCRD = test.GenerateTestCRD()
      requirement = test.GenerateTestCompatibilityRequirement(testCRD)    
	  createTestCRDAndRequirement(testCRD, requirement)
	  waitForRequirementReady(requirement)
    })

    It("should reject incompatible CRD updates", func() {
        ...
    })

    It("should reject CRD deletion while a CompatibilityRequirement references it", func() {
      ...
    })
  })

Comment thread e2e/crd_compatibility_test.go Outdated
Comment on lines +213 to +232
Eventually(func() error {
fresh := &apiextensionsv1.CustomResourceDefinition{}
if err := cl.Get(ctx, client.ObjectKeyFromObject(testCRD), fresh); err != nil {
return err
}

delete(fresh.Spec.Versions[0].Schema.OpenAPIV3Schema.Properties, "status")
fresh.Spec.Versions[0].Subresources = nil

err := cl.Update(ctx, fresh)
if err == nil {
return StopTrying("CRD update succeeded but should have been rejected")
}

if apierrors.IsForbidden(err) {
return nil
}

return err
}).WithTimeout(framework.WaitShort).WithPolling(framework.RetryShort).Should(Succeed(), "incompatible CRD update should be rejected with Forbidden")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Here we should match the returned error. So keep the StopTrying return if the error is nil, but after that just return the error. Then instead of Succeed() as the matcher, it should be "MatchError(...some specific portion of the error message...)"

@stefanonardo

stefanonardo commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

/hold depends on OCPCLOUD-3539

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Jun 17, 2026
Expect(*deployment.Spec.Replicas).To(BeNumerically(">", int32(1)),
"HA cluster should have more than 1 replica")
default:
Fail(fmt.Sprintf("unknown control plane topology %q, update this test to handle it", infra.Status.ControlPlaneTopology))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

it might change after review but currently all topologies, except SingleReplica, have 2 replicas.

https://github.com/openshift/cluster-capi-operator/pull/600/changes#diff-a496892d68f33b5513cd57332ceb7211e5522620f72cc64ae3ec28b4af04c67cR34

@stefanonardo stefanonardo Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

will fix once #600 gets merged

Comment thread e2e/crd_compatibility_test.go Outdated
@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 23, 2026
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 23, 2026
Add 10 e2e tests covering all three webhook paths: CRD schema
validation, object validation, and object pruning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@stefanonardo stefanonardo changed the title OCPCLOUD-3542: Add CRD Compatibility Checker e2e tests OCPCLOUD-3542: Add CRD Compatibility Checker OTE e2e tests Jun 23, 2026
@openshift-ci

openshift-ci Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

@stefanonardo: The following test 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/vendor bdd8eaa link true /test vendor

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.

@pmeida

pmeida commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Just want to leave the note that the OTE framework is now fully integrated (origin#31307, cluster-capi-operator#597).

Once your test is integrated with OTE (e.g. by removing the _test suffix from the filename), it will run automatically in these presubmits via openshift-e2e-test step with TEST_SUITE=openshift/conformance/parallel:

  • e2e-aws-ovn-techpreview
  • e2e-gcp-ovn-techpreview
  • e2e-azure-ovn-techpreview
  • e2e-openstack-ovn-techpreview

These are the presubmits that use TPNU and the conformance suite. So you can quickly understand the outcome of the integrated tests, although the data will not feed sippy for feature promotion as they are presubmits.
Another option is run run /pj-rehearse with a top-level release periodic.

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

Labels

do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants