Skip to content

[release-4.19] NE-2286: Backport noOLM / Sail Library to release-4.19#1460

Draft
gcs278 wants to merge 16 commits into
openshift:release-4.19from
gcs278:backport-noOLM-4.19
Draft

[release-4.19] NE-2286: Backport noOLM / Sail Library to release-4.19#1460
gcs278 wants to merge 16 commits into
openshift:release-4.19from
gcs278:backport-noOLM-4.19

Conversation

@gcs278

@gcs278 gcs278 commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Backport of the noOLM / Sail Library installation path (NE-2286, shipped in 4.22) to release-4.19. Same pattern as 4.21 (PR #1442) and 4.20 (PR #1459). The primary driver is OCPBUGS-86778, which blocks all OSSM z-stream upgrades via OLM on 4.19-4.21, preventing CVE fixes from shipping.

This PR is intended to merge with the GatewayAPIWithoutOLM feature gate disabled, making it a no-op on merge. The goal is to subsequently enable the gate by default (via openshift/api) to activate the Sail Library path and resolve the OLM issues.

Cherry-picked PRs

Prerequisites (4.19→4.20 changes the noOLM code depends on)

PR Title Why
#1217 OCPBUGS-54745: Conditionally add CRDs to relatedObjects Adds CRD resource constants, GatewayAPIControllerEnabled config field, ctx parameter to getOperatorState, relatedObjects namespace fixes
#1268 NE-2066: Set degraded=true when OSSM 3 can't be installed Adds subscriptionCache, ossmSubscriptions conflict detection, compareVersionNums, GatewayAPIOperatorVersion, GatewayClassIndexFieldName, computeGatewayAPIInstallDegradedCondition

Main noOLM PRs

PR Title Why
#1354 NE-2471: Replace OLM-based Istio install with Sail Library Core change — adds istio_sail_installer.go, istio_olm.go refactor, migration.go, status.go, CRD manifests, Sail Library RBAC manifests
#1402 OCPBUGS-79467: Change default log level from DEBUG to INFO Sail Library generates ~2,000 debug logs/hour; without this fix, enabling noOLM floods the logs
#1404 NE-2519: Move Sail Library to official release branch Moves from dev Sail Library branch to official OSSM 3.3.1 release

Note: #1393 (OCPBUGS-79667: Use feature-gate annotation for Sail Library RBAC) was also a dependency but is being skipped because CVO on this release does not support the release.openshift.io/feature-gate annotation (openshift/cluster-version-operator#1273 was not backported). As a result, the Sail Library RBAC manifests use the release.openshift.io/feature-set annotation and a separate PR will be needed to remove this annotation before promoting the feature gate to GA.

Versioning

This backport does not bump the Gateway API CRDs (remain at v1.3.0) or the Istio version (remains at v1.26.2). When the GatewayAPIWithoutOLM feature gate is enabled, the Sail Library will install Istio using the same v1.26.2 version that the OLM path currently uses.

Dependency Pinning Approach

Same approach as the 4.20 backport (PR #1459). The sail-operator (OSSM 3.3.1) requires k8s 0.34 and controller-runtime 0.22, but its pkg/install package only uses basic CRUD operations unchanged in older versions.

Module Pinned Version
k8s.io/api v0.32.2
k8s.io/apimachinery v0.32.2
k8s.io/client-go v0.32.1
k8s.io/apiextensions-apiserver v0.32.0
k8s.io/apiserver v0.32.0
k8s.io/component-base v0.32.0
k8s.io/kube-openapi v0.0.0-20250304...
sigs.k8s.io/controller-runtime v0.20.3
sigs.k8s.io/gateway-api v1.2.1
github.com/google/gnostic-models v0.6.9

Risk assessment: The sail-operator install package uses only stable controller-runtime interfaces (client.Client CRUD, pkg/log, pkg/scheme). No APIs from newer versions are used. The structured-merge-diff/v4 vs v6 incompatibility is avoided entirely.

Conflicts resolved

  • go.mod: Kept 4.19 openshift/api fork replace, added sail-operator replace for aslakknutsen's dev branch (later switched to OSSM official in NE-2519 commit)
  • pkg/operator/operator.go: Added GatewayAPIWithoutOLM gate alongside existing 4.19 gates including PrivateHostedZoneAWS (sharedVPCEnabled), which was removed in 4.20
  • test/e2e/util_gatewayapi_test.go: Took incoming gateway condition checking and service status logging
  • go.mod / vendor/: Re-vendored with 4.19 dependency pins

Merge Order

  1. Merge openshift/api PR — FG as disabled, allows CI to start
  2. TODO: Backport noOLM E2E tests to origin release-4.19
  3. Merge this PR — Sail Library code lands, gate still OFF
  4. Merge [release-4.19] NE-2480: Promote GatewayAPIWithoutOLM feature gate to TechPreview api#2875 — FG promotion to TechPreview, allows CI soak
  5. Verify CI is green
  6. TODO: Merge CIO PR to remove release.openshift.io/feature-set annotation from Sail Library RBAC manifests
  7. Merge [release-4.19] WIP: NE-2480: Promote GatewayAPIWithoutOLM feature gate to Default api#2870 — FG promotion to Default GA, activates noOLM
  8. Verify CI is green

Verification

  • make builds successfully
  • No unresolved merge conflict markers in any commit
  • Full CI (blocked on openshift/api dependency)

🤖 Generated with Claude Code

Vendor the GatewayAPIWithoutOLM in the openshift/api repo to support
backporting the No OLM logic into the release-4.19 branch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@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 3, 2026
@openshift-ci-robot

openshift-ci-robot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

@gcs278: This pull request references NE-2286 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 either version "4.19." or "openshift-4.19.", but it targets "openshift-4.22" instead.

Details

In response to this:

Summary

Backport of the noOLM / Sail Library installation path (NE-2286, shipped in 4.22) to release-4.19. Same pattern as 4.21 (PR #1442) and 4.20 (PR #1459). The primary driver is OCPBUGS-86778, which blocks all OSSM z-stream upgrades via OLM on 4.19-4.21, preventing CVE fixes from shipping.

This PR is intended to merge with the GatewayAPIWithoutOLM feature gate disabled, making it a no-op on merge. The goal is to subsequently enable the gate by default (via openshift/api) to activate the Sail Library path and resolve the OLM issues.

Cherry-picked PRs

PR Title Why
#1354 NE-2471: Replace OLM-based Istio install with Sail Library Core change — adds istio_sail_installer.go, istio_olm.go refactor, migration.go, status.go, CRD manifests, Sail Library RBAC manifests
#1393 OCPBUGS-79667: Use feature-gate annotation for Sail Library RBAC Conditionally deploys Sail Library RBAC based on GatewayAPIWithoutOLM feature gate
#1402 OCPBUGS-79467: Change default log level from DEBUG to INFO Sail Library generates ~2,000 debug logs/hour; without this fix, enabling noOLM floods the logs
#1404 NE-2519: Move Sail Library to official release branch Moves from dev Sail Library branch to official OSSM 3.3.1 release

Versioning

This backport does not bump the Gateway API CRDs (remain at v1.3.0) or the Istio version (remains at v1.26.2). When the GatewayAPIWithoutOLM feature gate is enabled, the Sail Library will install Istio using the same v1.26.2 version that the OLM path currently uses.

Dependency Pinning Approach

Same approach as the 4.20 backport (PR #1459). The sail-operator (OSSM 3.3.1) requires k8s 0.34 and controller-runtime 0.22, but its pkg/install package only uses basic CRUD operations unchanged in older versions.

Module Pinned Version
k8s.io/api v0.32.2
k8s.io/apimachinery v0.32.2
k8s.io/client-go v0.32.1
k8s.io/apiextensions-apiserver v0.32.0
k8s.io/apiserver v0.32.0
k8s.io/component-base v0.32.0
k8s.io/kube-openapi v0.0.0-20250304...
sigs.k8s.io/controller-runtime v0.20.3
sigs.k8s.io/gateway-api v1.2.1
github.com/google/gnostic-models v0.6.9

Risk assessment: The sail-operator install package uses only stable controller-runtime interfaces (client.Client CRUD, pkg/log, pkg/scheme). No APIs from newer versions are used. The structured-merge-diff/v4 vs v6 incompatibility is avoided entirely.

Additional changes for 4.19

4.19 required additional changes beyond what 4.20 needed, because several status controller features that existed on 4.20 were not yet present on 4.19:

  • Added subscriptionCache (all-namespace OLM subscription watch)
  • Added CRD resource name constants and relatedObjectsCRDs set
  • Added GatewayAPIOperatorVersion config field
  • Added compareVersionNums function
  • Added GatewayClassIndexFieldName constant
  • Added ctx parameter to getOperatorState

These were part of the 4.19→4.20 base diff that the noOLM code depends on.

Conflicts resolved

  • pkg/operator/operator.go: Added GatewayAPIWithoutOLM gate alongside existing 4.19 gates including PrivateHostedZoneAWS (sharedVPCEnabled), which was removed in 4.20
  • pkg/operator/controller/status/controller.go: Added noOLM logic within existing GatewayAPIEnabled guard (4.19 doesn't have the GatewayAPIControllerEnabled guard added in 4.20). Added missing definitions from 4.19→4.20 diff.
  • test/e2e/util_gatewayapi_test.go: Resolved gateway condition checking conflict
  • go.mod / vendor/: Re-vendored with 4.19 dependency pins

Merge Order

  1. Merge openshift/api PR — FG as disabled, allows CI to start
  2. TODO: Backport noOLM E2E tests to origin release-4.19
  3. Merge this PR — Sail Library code lands, gate still OFF
  4. Merge [release-4.19] WIP: NE-2480: Promote GatewayAPIWithoutOLM feature gate to Default api#2870 — FG promotion to Default GA, activates noOLM
  5. Verify CI is green

Verification

  • make builds successfully
  • No unresolved merge conflict markers in any commit
  • Full CI (blocked on openshift/api dependency)

🤖 Generated with Claude Code

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 added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jun 3, 2026
@openshift-ci

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

@coderabbitai

coderabbitai Bot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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.

⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: d2b75a8b-eec8-4d7a-9ce5-ade56d23e9de

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

Use the checkbox below for a quick retry:

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

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

@openshift-ci

openshift-ci Bot commented Jun 3, 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 gcs278 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

Miciah and others added 8 commits June 2, 2026 21:43
Omit the namespace for the istios resource in relatedObjects as the istios
resource is cluster-scoped.

* pkg/operator/controller/status/controller.go (Reconcile): Remove the namespace
for istios.
Omit the namespace for the gateways resource in relatedObjects as Istio manages
gateways in all namespaces.

* pkg/operator/controller/status/controller.go (Reconcile): Remove the namespace
for gateways.
* pkg/operator/controller/status/controller.go (Reconcile): Pass ctx to
getOperatorState.
* pkg/operator/controller/status/controller.go (getOperatorState): Add a
parameter for ctx, and use it instead of context.TODO().
Check whether the gatewayclasses, gateways, and istios CRDs actually
exist before adding them to relatedObjects.

Watch customresourcedefinitions in the status controller so that it
updates relatedObjects as these CRDs are created.

Check the "GatewayAPIController" featuregate to determine whether to add
the gatewayclasses, gateways, istios, and subscriptions resources to
relatedObjects, in addition to checking the "GatewayAPI" featuregate.

Before this change, the operator could add istios to relatedObjects even
if the OSSM subscription failed to install.  By convention, an operator
should only add resources to relatedObjects if those resources exist.

This commit fixes OCPBUGS-54745.

https://issues.redhat.com/browse/OCPBUGS-54745

* pkg/operator/controller/status/controller.go
(gatewaysResourceName, gatewayclassesResourceName, istiosResourceName):
New consts for the CRD names.
(relatedObjectsCRDs): New var for a string set that contains
gatewaysResourceName, gatewayclassesResourceName, and
istiosResourceName.
(New): Check the GatewayAPIControllerEnabled field in the controller
config in addition to checking GatewayAPIEnabled to determine whether to
watch subscriptions and customresourcedefinitions.  Add a watch on
customresourcedefinitions, with a predicate for CRDs with names that are
in relatedObjectsCRDs.
(Config): Add GatewayAPIControllerEnabled.
(Reconcile): Check the GatewayAPIControllerEnabled field in the
controller config as well as the haveIstiosResource,
haveGatewayclassesResource, and haveGatewaysResource fields in the
operatorState object, and conditionally add the corresponding resources
to relatedObjects.
(operatorState): Add haveIstiosResource, haveGatewaysResource, and
haveGatewayclassesResource fields.
(getOperatorState): Check GatewayAPIControllerEnabled in addition to
GatewayAPIEnabled before checking for the OSSM subscription.  Set
haveGatewaysResource, haveGatewayclassesResource, and
haveIstiosResource.
* pkg/operator/operator.go (New): Specify GatewayAPIControllerEnabled in
the status controller config.
* test/e2e/operator_test.go (TestClusterOperatorStatusRelatedObjects):
Expect to see "gateways" and "gatewayclasses" in relatedObjects if the
"GatewayAPI" and "GatewayAPIController" featuregates are enabled.
Detect subscriptions that would prevent the Ingress Operator from
installing OSSM 3, and set the operator's degraded condition to true
when any of those subscriptions are present.

This is the implementation of NE-2066
Cherry-picked from: 8a40966
openshift#1354

Conflicts resolved:
- pkg/operator/operator.go: Added GatewayAPIWithoutOLM gate alongside
  existing 4.21 gates (GatewayAPI, GatewayAPIController, RouteExternalCertificate)
- Note: Go tidy will fail in this commit since Aslak's development branch pulls in
  K8S dependencies that are too new - a future commit in this backport
  will vendor the official release resolve go.mod
@gcs278 gcs278 force-pushed the backport-noOLM-4.19 branch from e7428df to 6b41825 Compare June 3, 2026 01:47
@gcs278 gcs278 changed the title NE-2286: Backport noOLM / Sail Library to release-4.19 [release-4.19] NE-2286: Backport noOLM / Sail Library to release-4.19 Jun 3, 2026
gcs278 and others added 7 commits June 3, 2026 16:57
Cherry-picked from: ed2eb36
openshift#1354

Conflicts resolved:
- pkg/operator/controller/status/controller.go: Took incoming noOLM logic
  (useOLM/useSailLibrary, conditional subscription listing) but wrapped in
  existing 4.19 GatewayAPIEnabled guard. Restored GatewayAPIControllerEnabled
  guard that was present in the original condition but dropped during
  cherry-pick.
Cherry-picked from: 9c4d792
openshift#1354

Conflicts resolved:
- test/e2e/gateway_api_test.go: Kept 4.21 gatewayAPIControllerEnabled guard,
  added gatewayAPIWithoutOLMEnabled conditionals inside it. Kept xcrdNames
  alongside new istioCRDNames.
- Removed references to testGatewayAPIInfrastructureAnnotations,
  testGatewayAPIInternalLoadBalancer, and testGatewayOpenshiftConditions
  which were added in separate PRs not present on release-4.21.
Cherry-picked from: 43c978a
openshift#1404

Conflicts resolved:
- go.mod: Switched sail-operator replace from aslakknutsen's development
  fork to the official openshift-service-mesh/sail-operator v0.0.0-20260327145107
  (OSSM 3.3.1). Added replace directives to pin k8s.io/api, apimachinery,
  apiextensions-apiserver, apiserver, client-go, component-base,
  kube-openapi, controller-runtime, gateway-api, and gnostic-models to
  their original 4.19 versions, preventing the sail-operator's transitive
  dependencies from bumping them.
- vendor/: Re-vendored from scratch with pinned dependencies.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gcs278

gcs278 commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

/test unit
/test images
/test verify
/test verify-deps

@gcs278

gcs278 commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

/test e2e-aws-operator

@openshift-ci

openshift-ci Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

@gcs278: 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/images 82ca5a5 link true /test images
ci/prow/e2e-aws-operator 82ca5a5 link true /test e2e-aws-operator
ci/prow/unit 82ca5a5 link true /test unit
ci/prow/verify 82ca5a5 link true /test verify
ci/prow/verify-deps 82ca5a5 link true /test verify-deps

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. 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.

4 participants