Skip to content

OCPCLOUD-3318: Integrate CompatibilityRequirements into the CCAPIO Insaller (WIP)#604

Draft
theobarberbany wants to merge 7 commits into
openshift:mainfrom
theobarberbany:tb/3318
Draft

OCPCLOUD-3318: Integrate CompatibilityRequirements into the CCAPIO Insaller (WIP)#604
theobarberbany wants to merge 7 commits into
openshift:mainfrom
theobarberbany:tb/3318

Conversation

@theobarberbany

@theobarberbany theobarberbany commented Jun 19, 2026

Copy link
Copy Markdown
Contributor
  • Adds compatibility requirement probes for boxcutter
  • Adds Plumbing to the revision reconciler and revision controller (producer/consumer) to bring unmanaged CRDs through.
  • Adds synthetic component with only compatibility requirements for unmanaged CRDs
  • Tests

Summary by CodeRabbit

  • New Features
    • Expanded OpenShift compatibility requirement probe coverage to include additional selectors for the admitted and compatible conditions.
    • Added unmanaged Custom Resource Definition support: unmanaged CRDs are excluded from managed installation targets but are recorded on generated installer revisions.
    • Updated rendered revision output to omit synthetic components from the installer revision.
  • Tests
    • Extended revision, installer, and rendering tests to validate unmanaged CRD propagation, compatibility requirement generation/labels, synthetic component inclusion/exclusion, content ID changes, and compatibility-gated reconciliation/teardown behavior.

@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

@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 19, 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 Jun 19, 2026
@openshift-ci-robot

openshift-ci-robot commented Jun 19, 2026

Copy link
Copy Markdown

@theobarberbany: This pull request references OCPCLOUD-3318 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 epic to target the "5.0.0" version, but no target version was set.

Details

In response to this:

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.

@openshift-ci

openshift-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci

openshift-ci Bot commented Jun 19, 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 radekmanak 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

@coderabbitai

coderabbitai Bot commented Jun 19, 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

Walkthrough

The PR threads UnmanagedCustomResourceDefinitions through revision rendering and installer revision creation, turns unmanaged CRDs into synthetic CompatibilityRequirement objects, filters synthetic components from API revisions, and adds probes and tests for the new compatibility flow.

Changes

Unmanaged CRD revision flow

Layer / File(s) Summary
Controller plumbing
pkg/controllers/revision/revision_controller.go, pkg/controllers/installer/revision_reconciler.go
reconcile() reads clusterAPI.Spec.UnmanagedCustomResourceDefinitions and passes it into rendered revision generation; the installer reconciler passes apiRev.UnmanagedCustomResourceDefinitions into installer revision creation.
Revision generator core
pkg/revisiongenerator/revision.go, pkg/revisiongenerator/compatibility.go, pkg/revisiongenerator/revision_test.go
renderedRevision, revisionRenderConfig, and renderedComponent gain unmanaged CRD and synthetic-component state; WithUnmanagedCRDs is added; ToAPIRevision() omits synthetic components and copies unmanaged CRDs onto the API revision; unmanaged CRDs are rendered into synthetic CompatibilityRequirement objects and covered by generator tests.
Installer probes and tests
pkg/controllers/installer/probes.go, pkg/controllers/installer/helpers_test.go, pkg/controllers/installer/installer_controller_test.go
allProbes() now includes probes for CompatibilityRequirement Admitted=True and Compatible=True conditions, and installer tests cover compatibility requirement lifecycle, gating, teardown, and drift correction.
Revision controller tests
pkg/controllers/revision/revision_controller_test.go, pkg/controllers/revision/suite_test.go
Tests cover unmanaged CRD propagation into revision status and new revision content IDs, and the provider fixture now includes a generated CRD manifest.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 12 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.00% 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 The new revision-controller specs use bare Eventually calls (e.g. unmanagedCustomResourceDefinitions path) with no explicit timeout, and several added assertions still lack diagnostic messages. Add explicit WithTimeout/default Eventually settings to the new cluster waits, and give the bare assertions targeted failure messages where they add debugging value.
Microshift Test Compatibility ⚠️ Warning New Ginkgo tests use config.openshift.io ClusterOperator and OpenShift CompatibilityRequirement APIs, with no MicroShift skip/tag/guard. Add a MicroShift skip/tag or runtime guard (e.g. [apigroup:...], [Skipped:MicroShift], or g.Skip() after IsMicroShiftCluster()), or keep them out of MicroShift CI.
✅ 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 identifies the main change: integrating CompatibilityRequirements into the CCAPIO installer.
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 new/changed Ginkgo titles are static string literals; no dynamic names, timestamps, UUIDs, or generated identifiers were added.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The added Ginkgo specs are envtest/controller tests, and I found no node-count, topology, scheduling, drain, or HA assumptions in them.
Topology-Aware Scheduling Compatibility ✅ Passed No new pod scheduling constraints, node selectors, affinity, or replica logic were added; changes only add CompatibilityRequirement plumbing/probes and revision rendering.
Ote Binary Stdout Contract ✅ Passed No changed process-level code writes to stdout; suite setup uses a GinkgoWriter-backed logger and no fmt.Print/log.SetOutput/klog stdout config.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed New Ginkgo tests only manipulate cluster objects/fixtures; no hardcoded IPv4, localhost, host-join, or public-internet calls were found.
No-Weak-Crypto ✅ Passed No added MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or unsafe secret-compare patterns appear in the PR diff.
Container-Privileges ✅ Passed No changed code/manifests set privileged or host namespace flags, CAP_SYS_ADMIN, or allowPrivilegeEscalation; new resources are CompatibilityRequirements, not containers.
No-Sensitive-Data-In-Logs ✅ Passed No added logs expose secrets/PII; the changed code only logs revision/object IDs and status, and new compatibility code has no logging.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
pkg/revisiongenerator/revision.go (2)

240-257: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix linter-flagged formatting issues.

Static analysis reports two issues:

  1. Missing blank line between the var declaration (line 241) and the for loop (line 242)
  2. Formatting issue at line 265
🔧 Proposed formatting fix
 func (r *installerRevision) ToAPIRevision() (operatorv1alpha1.ClusterAPIInstallerRevision, error) {
 	var apiComponents []operatorv1alpha1.ClusterAPIInstallerComponent
+
 	for _, component := range r.components {
 		if component.synthetic {
 			continue
 		}

Run make fmt to fix all formatting issues.

🤖 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 `@pkg/revisiongenerator/revision.go` around lines 240 - 257, In the
ToAPIRevision method of the installerRevision type, add a blank line between the
var apiComponents declaration and the for loop that iterates over r.components.
Additionally, run make fmt to automatically fix all remaining formatting issues
flagged by the linter, including the formatting issue at line 265.

Source: Linters/SAST tools


402-410: ⚠️ Potential issue | 🟡 Minor

The synthetic field filtering logic is never triggered because no components are created with synthetic set to true.

The renderedComponent struct includes a synthetic field that is checked in ToAPIRevision() at line 243 to skip components from the API revision output. However, in newRenderedComponent() at lines 413-416, new components are instantiated without explicitly setting synthetic, leaving it at the zero value (false). No code in the repository sets synthetic to true, making the filtering condition dead code.

The comment at line 317 ("objects in a synthetic component and filtered from their normal phases") suggests this filtering was intended for a feature that is not yet implemented. Either remove the unused field and filtering logic, or implement the feature to create synthetic components.

🤖 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 `@pkg/revisiongenerator/revision.go` around lines 402 - 410, The `synthetic`
field in the `renderedComponent` struct is never set to `true` anywhere in the
codebase, making the filtering logic in `ToAPIRevision()` dead code. Either
remove the unused `synthetic` field from the `renderedComponent` struct
definition, delete the filtering check in `ToAPIRevision()` that skips
components where synthetic is true, and remove the related comment at line 317,
or implement the feature by identifying where synthetic components should
actually be created and setting `synthetic` to `true` in
`newRenderedComponent()` or elsewhere when instantiating those components.
🤖 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 `@pkg/controllers/installer/probes.go`:
- Around line 34-35: The probeSucceededPredicate logic stops at the first
matching probe when evaluating status transitions, which causes the second
compatibilityRequirementCompatibleProbe to be masked and never trigger reconcile
events. Both compatibilityRequirementAdmittedProbe and
compatibilityRequirementCompatibleProbe share the same GroupKind, so the
predicate stops after finding the first one. Modify the predicate logic to
evaluate both probes instead of stopping at the first match, ensuring that
status transitions for both the Admitted and Compatible conditions can properly
trigger reconciliation events.

---

Outside diff comments:
In `@pkg/revisiongenerator/revision.go`:
- Around line 240-257: In the ToAPIRevision method of the installerRevision
type, add a blank line between the var apiComponents declaration and the for
loop that iterates over r.components. Additionally, run make fmt to
automatically fix all remaining formatting issues flagged by the linter,
including the formatting issue at line 265.
- Around line 402-410: The `synthetic` field in the `renderedComponent` struct
is never set to `true` anywhere in the codebase, making the filtering logic in
`ToAPIRevision()` dead code. Either remove the unused `synthetic` field from the
`renderedComponent` struct definition, delete the filtering check in
`ToAPIRevision()` that skips components where synthetic is true, and remove the
related comment at line 317, or implement the feature by identifying where
synthetic components should actually be created and setting `synthetic` to
`true` in `newRenderedComponent()` or elsewhere when instantiating those
components.
🪄 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: 5962f1c7-9a1a-41b9-b031-971b7f903227

📥 Commits

Reviewing files that changed from the base of the PR and between 33e0119 and 79f9a43.

📒 Files selected for processing (4)
  • pkg/controllers/installer/probes.go
  • pkg/controllers/installer/revision_reconciler.go
  • pkg/controllers/revision/revision_controller.go
  • pkg/revisiongenerator/revision.go

Comment thread pkg/controllers/installer/probes.go
@theobarberbany theobarberbany changed the title OCPCLOUD-3318: Integrate CompatibilityRequirements into the CCAPIO Insaller OCPCLOUD-3318: Integrate CompatibilityRequirements into the CCAPIO Insaller (WIP) Jun 19, 2026

@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)
pkg/revisiongenerator/revision.go (1)

182-185: 💤 Low value

Define a sentinel error for missing unmanaged CRDs.

The linter correctly flags that dynamic errors prevent programmatic error checking with errors.Is(). Define a sentinel error to allow callers to distinguish this specific failure mode.

♻️ Proposed fix

Add a package-level sentinel error:

var ErrUnmanagedCRDsNotFound = errors.New("unmanaged CRDs not found in any component")

Then wrap it at line 184:

-		return fmt.Errorf("unmanaged CRDs not found in any component: %v", sets.List(missing))
+		return fmt.Errorf("%w: %v", ErrUnmanagedCRDsNotFound, sets.List(missing))
🤖 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 `@pkg/revisiongenerator/revision.go` around lines 182 - 185, Define a
package-level sentinel error ErrUnmanagedCRDsNotFound using errors.New() at the
top of the revision.go file. Then modify the return statement where the error is
currently returned to use fmt.Errorf with the %w verb to wrap the sentinel error
while including the missing CRDs information, allowing callers to check for this
specific error type using errors.Is().

Source: Linters/SAST tools

🤖 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 `@pkg/revisiongenerator/compatibility.go`:
- Around line 49-50: The Name field construction at line 49 concatenates
compatibilityRequirementNamePrefix with crd.GetName() without validating the
total length, which can exceed Kubernetes' 253-character DNS-subdomain limit for
long CRD names. Add length validation to ensure the resulting name stays within
the limit. If the concatenated name would be too long, either truncate the CRD
name proportionally or use a hash-based suffix of the CRD name to keep the
overall name length valid and deterministic while preventing reconciliation
failures for long CRD names.

---

Nitpick comments:
In `@pkg/revisiongenerator/revision.go`:
- Around line 182-185: Define a package-level sentinel error
ErrUnmanagedCRDsNotFound using errors.New() at the top of the revision.go file.
Then modify the return statement where the error is currently returned to use
fmt.Errorf with the %w verb to wrap the sentinel error while including the
missing CRDs information, allowing callers to check for this specific error type
using errors.Is().
🪄 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: f8dec810-3119-4457-9b54-78dcd47dc009

📥 Commits

Reviewing files that changed from the base of the PR and between 2de3d3a and 9156c02.

📒 Files selected for processing (4)
  • pkg/controllers/revision/revision_controller_test.go
  • pkg/controllers/revision/suite_test.go
  • pkg/revisiongenerator/compatibility.go
  • pkg/revisiongenerator/revision.go

Comment on lines +49 to +50
Name: compatibilityRequirementNamePrefix + crd.GetName(),
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Guard against invalid CompatibilityRequirement names for long CRD names.

Line 49 can generate a metadata.name longer than Kubernetes’ max DNS-subdomain length when a CRD name is already near the limit. That will make the synthetic object invalid and break reconciliation for those unmanaged CRDs.

Suggested fix
+const maxK8sNameLen = 253
+
+func compatibilityRequirementName(crdName string) string {
+	name := compatibilityRequirementNamePrefix + crdName
+	if len(name) <= maxK8sNameLen {
+		return name
+	}
+
+	// keep deterministic name while preserving uniqueness
+	sum := sha256.Sum256([]byte(crdName))
+	suffix := "-" + hex.EncodeToString(sum[:8])
+	keep := maxK8sNameLen - len(suffix)
+	return name[:keep] + suffix
+}
+
 func buildCompatibilityRequirement(crd unstructured.Unstructured) (unstructured.Unstructured, error) {
@@
 		ObjectMeta: metav1.ObjectMeta{
-			Name: compatibilityRequirementNamePrefix + crd.GetName(),
+			Name: compatibilityRequirementName(crd.GetName()),
 		},
🤖 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 `@pkg/revisiongenerator/compatibility.go` around lines 49 - 50, The Name field
construction at line 49 concatenates compatibilityRequirementNamePrefix with
crd.GetName() without validating the total length, which can exceed Kubernetes'
253-character DNS-subdomain limit for long CRD names. Add length validation to
ensure the resulting name stays within the limit. If the concatenated name would
be too long, either truncate the CRD name proportionally or use a hash-based
suffix of the CRD name to keep the overall name length valid and deterministic
while preventing reconciliation failures for long CRD names.

@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 `@pkg/revisiongenerator/revision_test.go`:
- Around line 701-713: The collector subtest in revision_test.go has a wsl_v5
layout violation caused by extra blank-line spacing around the local setup and
assertion. Clean up the whitespace in this test block by tightening the
separation between the collector setup, the NewRenderedRevision call, and the
final Expect assertion while keeping the same behavior. Use the surrounding
subtest body and the NewRenderedRevision/WithObjectCollectors call site to
locate and adjust the formatting.
🪄 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: 5c1a8ec7-c1c9-4397-8ebc-3d6d24dbf93f

📥 Commits

Reviewing files that changed from the base of the PR and between 9156c02 and 6619812.

📒 Files selected for processing (3)
  • pkg/controllers/revision/revision_controller_test.go
  • pkg/controllers/revision/suite_test.go
  • pkg/revisiongenerator/revision_test.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • pkg/controllers/revision/revision_controller_test.go
  • pkg/controllers/revision/suite_test.go

Comment thread pkg/revisiongenerator/revision_test.go

@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: 2

🧹 Nitpick comments (1)
pkg/controllers/installer/installer_controller_test.go (1)

129-130: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive CompatibilityRequirement names from the production builder.

These literals duplicate the synthetic naming contract from the revision generator, so any future prefix/normalization change will break these tests without changing installer behavior. Please compute the expected name through the shared helper/constant instead of hard-coding ccapio-.... As per coding guidelines, "ALWAYS check for existing patterns, and use them if found."

Also applies to: 545-546, 579-580, 631-632

🤖 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 `@pkg/controllers/installer/installer_controller_test.go` around lines 129 -
130, The test hard-codes the synthetic CompatibilityRequirement name with the
ccapio- prefix, which duplicates the naming contract and can drift from
production behavior. Update the installer_controller_test assertions to derive
the expected name through the same shared helper/constant used by the production
builder or revision generator, instead of constructing literals like crName
directly. Apply this change at all listed test cases so the expectations stay
aligned with the builder’s normalization/prefix logic.

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 `@pkg/controllers/installer/helpers_test.go`:
- Line 343: The setCompatibilityRequirementConditions helper currently takes an
admitted parameter that is never meaningfully varied, so golangci-lint flags it
as unused configurability. Either remove admitted from
setCompatibilityRequirementConditions and update all call sites that always pass
true, or add a test that exercises the admitted=false path so the parameter is
actually required.

In `@pkg/controllers/installer/installer_controller_test.go`:
- Around line 140-143: Add the missing blank line after each By(...) step in the
installer_controller_test.go suite to satisfy wsl_v5; update the affected test
blocks around the CompatibilityRequirement checks so the declarations like cr
are separated from the preceding By call, matching the surrounding test style at
the other flagged locations.

---

Nitpick comments:
In `@pkg/controllers/installer/installer_controller_test.go`:
- Around line 129-130: The test hard-codes the synthetic
CompatibilityRequirement name with the ccapio- prefix, which duplicates the
naming contract and can drift from production behavior. Update the
installer_controller_test assertions to derive the expected name through the
same shared helper/constant used by the production builder or revision
generator, instead of constructing literals like crName directly. Apply this
change at all listed test cases so the expectations stay aligned with the
builder’s normalization/prefix logic.
🪄 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: 07df3959-69ae-4722-9715-4144b4268a7d

📥 Commits

Reviewing files that changed from the base of the PR and between 6619812 and d568b60.

📒 Files selected for processing (3)
  • pkg/controllers/installer/helpers_test.go
  • pkg/controllers/installer/installer_controller_test.go
  • pkg/revisiongenerator/compatibility.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/revisiongenerator/compatibility.go

Comment thread pkg/controllers/installer/helpers_test.go
Comment thread pkg/controllers/installer/installer_controller_test.go
@theobarberbany theobarberbany force-pushed the tb/3318 branch 2 times, most recently from 02c5ad7 to 8865b93 Compare June 29, 2026 15:08
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. 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.

2 participants