Skip to content

[WIP] NE-2471: Replace OLM-based Istio install with Sail Library#1358

Closed
rikatz wants to merge 6 commits intoopenshift:masterfrom
rikatz:gwapi-without-olm
Closed

[WIP] NE-2471: Replace OLM-based Istio install with Sail Library#1358
rikatz wants to merge 6 commits intoopenshift:masterfrom
rikatz:gwapi-without-olm

Conversation

@rikatz
Copy link
Copy Markdown
Member

@rikatz rikatz commented Feb 12, 2026

This is a WIP/draft of https://github.com/openshift/cluster-ingress-operator/pull/1354/files to continue Grant's work while he's away.

The code will be merged from https://github.com/openshift/cluster-ingress-operator/pull/1354/files but this PR will be used for tests, rebases, etc

Please do not merge

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Feb 12, 2026
@openshift-ci-robot
Copy link
Copy Markdown
Contributor

openshift-ci-robot commented Feb 12, 2026

@rikatz: This pull request references NE-2471 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 "4.22.0" version, but no target version was set.

Details

In response to this:

This is a WIP/draft of https://github.com/openshift/cluster-ingress-operator/pull/1354/files to continue Grant's work while he's away.

The code will be merged from https://github.com/openshift/cluster-ingress-operator/pull/1354/files but this PR will be used for tests, rebases, etc

Please do not merge

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 Feb 12, 2026
@openshift-ci openshift-ci bot requested review from jcmoraisjr and miheer February 12, 2026 13:03
- list
- watch
- update
- "*"
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I am still a bit concerned with this permission. It means CIO can now do anything including creating any clusterrole and any clusterrole binding. This seems way too much, tho previously there was create and update already.

- "*"

- apiGroups:
- networking.x-k8s.io
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think we must remove this before GA. We want Pilot to filter out x-k8s.io (this is supported already on Istio 1.29, which will be OSSM 3.3) so I prefer we do not have any x-k8s.io API supported (but inference pool)

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.

Look at install.LibraryRBACRules()

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Feb 20, 2026

[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 rikatz 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
Copy link
Copy Markdown

coderabbitai bot commented Feb 23, 2026

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

Walkthrough

This change set integrates Sail Operator as an alternative installation method for Istio alongside the existing OLM-based path. The Istio version constant is updated to v1.27.5. Numerous dependencies are bumped, including sail-operator, openshift/api, and ecosystem modules. RBAC permissions are expanded to support additional Kubernetes and Istio-related resources. The gatewayclass controller is enhanced with Sail library integration logic, including new condition types, CRD management, and migration handling from OSSM to Sail. The operator wiring is updated to conditionally initialize the Sail library when the non-OLM path is enabled via environment variable. Test utilities and test cases are extended to cover the new installation paths and patch tracking.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 70.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically refers to the main objective of replacing OLM-based Istio installation with Sail Library, which is the primary focus of this changeset.
Description check ✅ Passed The description adequately explains that this is a work-in-progress/draft of PR 1354 intended for testing and rebasing, which is related to the changeset objective of integrating Sail Library.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown

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

♻️ Duplicate comments (2)
manifests/00-cluster-role.yaml (2)

84-92: ⚠️ Potential issue | 🟠 Major

Wildcard verbs on RBAC resources enable privilege escalation — scope down before GA.

Granting * verbs on clusterroles, clusterrolebindings, roles, and rolebindings allows the operator to create arbitrary RBAC bindings, effectively escalating to cluster-admin. This was previously flagged and remains unaddressed.

Consider scoping to the specific roles/bindings the Helm installer needs to manage (e.g., using resourceNames or limiting verbs to get, list, watch, create, update, patch). At minimum, bind and escalate should not be granted via wildcard.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 84 - 92, Current ClusterRole
grants wildcard verbs ("*") on RBAC resources clusterroles, clusterrolebindings,
roles, and rolebindings which enables privilege escalation; replace the "*"
verbs with a minimal set (e.g., get, list, watch, create, update, patch) scoped
only to the specific RBAC objects the installer must manage and use
resourceNames where possible to restrict which role/rolebinding names can be
created/modified; explicitly remove bind and escalate from allowed verbs and
ensure any creation of clusterrole/clusterrolebinding is restricted or omitted
unless strictly required.

290-315: ⚠️ Potential issue | 🟠 Major

Wildcard resources and verbs on Istio and Gateway API groups are overly broad.

Three rules grant resources: "*" with verbs: "*" across Istio API groups, gateway.networking.k8s.io, and gateway.networking.x-k8s.io. This gives the operator unrestricted access to every current and future resource in these API groups.

For the Istio groups (lines 290-301), enumerate the specific resources the Helm installer manages. For Gateway API (lines 303-308), the previous version of this ClusterRole listed specific resources (gatewayclasses, gateways, httproutes, grpcroutes) — prefer that approach.

The gateway.networking.x-k8s.io wildcard (lines 310-315) was also previously flagged for removal before GA.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 290 - 315, Replace the
overly-broad wildcard rules: for the apiGroups block containing
authentication.istio.io, config.istio.io, extensions.istio.io,
networking.istio.io, rbac.istio.io, security.istio.io, telemetry.istio.io,
remove resources: "*" and verbs: "*" and instead list only the explicit Istio
resources the Helm installer manages (e.g., VirtualService, DestinationRule,
Gateway, EnvoyFilter, Sidecar, PeerAuthentication, RequestAuthentication,
AuthorizationPolicy, etc. — enumerate exact plural resource names your installer
uses). For the apiGroup gateway.networking.k8s.io, replace resources: "*" /
verbs: "*" with the explicit Gateway API resources previously used
(gatewayclasses, gateways, httproutes, grpcroutes, etc.) and specific verbs
required; and remove or drop the entire apiGroup gateway.networking.x-k8s.io
rule (or narrow it to exact resources if still needed) to avoid granting
future/unintended access.
🧹 Nitpick comments (10)
manifests/00-cluster-role.yaml (1)

261-268: Webhook configuration management permissions — ensure necessity and add a comment.

Wildcard access to mutatingwebhookconfigurations and validatingwebhookconfigurations is a sensitive permission (flagged by both Trivy KSV-0114 and Checkov CKV_K8S_155). This allows the operator to intercept or modify admission control for any resource in the cluster.

If this is required for Helm-based Istio installation (installing Istio's webhooks), the comment on line 261 should be expanded to explain which specific webhooks are managed. Consider scoping with resourceNames if the webhook names are known.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 261 - 268, The ClusterRole
grants wildcard verbs on mutatingwebhookconfigurations and
validatingwebhookconfigurations which is sensitive; update the role to either
scope permissions with resourceNames for the specific Istio webhook names or
restrict verbs (avoid "*"), and expand the existing comment that currently reads
"Required for Istio installation via Helm" to list the exact webhook
configuration names managed (e.g., istio-sidecar-injector,
istiod-validating-webhook) and justify why broad access is needed; modify the
rules referring to apiGroups, resources: mutatingwebhookconfigurations and
validatingwebhookconfigurations, and verbs accordingly to implement the scoping.
pkg/operator/controller/gatewayclass/istio_sail_installer_test.go (1)

13-13: Unused field cancelFn.

cancelFn is declared but never assigned or called anywhere in this file.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer_test.go` at line
13, The test file declares an unused variable cancelFn which should be removed
or actually used; locate the declaration of cancelFn in
istio_sail_installer_test.go and either delete the unused cancelFn field or wire
it up to the test context teardown (assign it when creating the context and call
it in the test cleanup), ensuring there are no remaining unused variable
warnings for cancelFn.
pkg/operator/controller/gatewayclass/controller_test.go (2)

138-149: Several old test cases don't initialize expectPatched / expectedStatusPatched, relying on cmpopts.EquateEmpty().

This works correctly because EquateEmpty() treats nil and empty slices as equal. However, for consistency and readability, you might consider explicitly initializing these fields to []client.Object{} in the test cases that don't use the Sail path (lines 151–278), matching how expectCreate, expectUpdate, and expectDelete are explicitly set.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller_test.go` around lines 138 -
149, Test cases in the gatewayclass controller tests leave expectPatched and
expectedStatusPatched nil in many cases (relying on cmpopts.EquateEmpty());
update those test entries to explicitly set expectPatched and
expectedStatusPatched to empty slices ([]client.Object{}) where no
patches/status patches are expected so they match the style used for
expectCreate/expectUpdate/expectDelete and improve readability; locate the test
table (tests []struct{...}) and each case in the block that does not use the
Sail path and add expectPatched: []client.Object{} and expectedStatusPatched:
[]client.Object{} to the case literals.

430-436: Track the TODO for missing test coverage.

The TODO lists several important test scenarios (error on Istio removal, upgrade/downgrade, partial removal, full removal). Since this is a WIP PR, consider creating a tracking issue for these before merging.

Would you like me to open an issue to track the remaining test scenarios listed in this TODO?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller_test.go` around lines 430 -
436, The TODO in pkg/operator/controller/gatewayclass/controller_test.go lists
missing test scenarios that must be tracked before merging; create a tracking
issue documenting each bullet (error on Istio removal, upgrade/downgrade/update,
GatewayClass removal when others exist (should not call Uninstall), and full
removal), reference the controller_test.go TODO, include acceptance criteria for
each test, link to the PR number, and add the issue ID or link in the TODO
comment (or replace the TODO with a one‑line reference to the new issue) so
reviewers can verify coverage planning.
pkg/operator/controller/gatewayclass/istio_sail_installer.go (3)

132-148: buildInstallerOptions returns an error but never produces one.

The function signature returns (install.Options, error) but every code path returns nil error. This forces all callers to handle a phantom error. If this is placeholder for future validation, consider a // TODO comment; otherwise, simplify the signature.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines
132 - 148, The function buildInstallerOptions currently has a redundant error
return: it declares (install.Options, error) but never returns a non-nil error;
update it to a simple single-return signature to remove the phantom error by
changing func buildInstallerOptions(enableInferenceExtension bool, istioVersion
string) (install.Options, error) to func
buildInstallerOptions(enableInferenceExtension bool, istioVersion string)
install.Options and remove the nil error return, then update all callers of
buildInstallerOptions to stop expecting an error; if you intend to validate in
future instead keep the existing signature but add a clear TODO comment inside
buildInstallerOptions explaining why error is reserved.

99-130: ensureIstio applies options fire-and-forget then reads status that may reflect a prior reconciliation.

sailInstaller.Apply(opts) is asynchronous (per the interface, it does not return an error), and sailInstaller.Status() is called immediately after. This means the conditions written to the GatewayClass may reflect the previous reconciliation's status, not the result of the current Apply. This is acceptable for an eventually-consistent model — a subsequent Sail notification will trigger another reconcile — but it would be helpful to document this expectation explicitly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines 99
- 130, The current ensureIstio function calls sailInstaller.Apply(opts) which is
asynchronous and then immediately reads sailInstaller.Status(), so the status
may reflect a prior reconciliation; update the code to document this behavior by
adding a clear comment in ensureIstio explaining that sailInstaller.Apply is
fire-and-forget, sailInstaller.Status() may be stale, and the controller relies
on subsequent Sail notifications to requeue and reconcile (i.e., the
eventual-consistency model), and optionally add a TODO noting that if
synchronous confirmation is required the Apply/Status pattern must be replaced
with a blocking check or explicit wait; reference ensureIstio,
sailInstaller.Apply, sailInstaller.Status, mapStatusToConditions and the
GatewayClass status update in the comment.

48-62: Label parsing assumes subscription name never contains a dot.

strings.SplitN(after, ".", 2) splits on the first ., which means a subscription name containing a dot would be incorrectly parsed (the dot would be treated as the separator between name and namespace). While OLM subscription names rarely contain dots, this is fragile. Consider splitting from the right (last dot) instead, since namespaces cannot contain dots but names theoretically could.

Alternative using last-dot split
-			nameNamespace := strings.SplitN(after, ".", 2)
-			if len(nameNamespace) != 2 {
-				logOverwrite.Info("ignoring invalid OLM label", "label", label)
-				continue
-			}
-			foundLabel = label
-			subscriptionName, subscriptionNamespace = nameNamespace[0], nameNamespace[1]
+			lastDot := strings.LastIndex(after, ".")
+			if lastDot < 1 || lastDot >= len(after)-1 {
+				logOverwrite.Info("ignoring invalid OLM label", "label", label)
+				continue
+			}
+			foundLabel = label
+			subscriptionName = after[:lastDot]
+			subscriptionNamespace = after[lastDot+1:]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines 48
- 62, The label parsing currently uses strings.SplitN(after, ".", 2) which
splits on the first dot and can mis-parse subscription names that contain dots;
update the logic in the loop that inspects labels (the block setting foundLabel,
subscriptionName, subscriptionNamespace and using variable after) to split on
the last dot instead (e.g., find lastIndex := strings.LastIndex(after, ".") and
use substrings before/after that index) so the namespace is taken as the suffix
after the final dot and subscriptionName includes any earlier dots; preserve the
validation (ignore if no dot found), keep setting foundLabel, subscriptionName,
subscriptionNamespace and the break semantics.
pkg/operator/controller/gatewayclass/controller.go (2)

447-472: Deletion: gatewayClassList includes the class being deleted — verify < 2 threshold is intentional.

Line 459 uses len(gatewayClassList.Items) < 2 to determine whether to uninstall. Since the class being deleted is still present in the cache (it has a non-zero DeletionTimestamp but hasn't been removed yet), this correctly means "this is the only remaining class." This logic is correct but subtle — a brief comment would help future readers understand why < 2 and not < 1 or == 0.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller.go` around lines 447 - 472,
The existing deletion check is correct but unclear: add a short inline comment
near the block that inspects gatewayclass.DeletionTimestamp, gatewayClassList
and the condition `len(gatewayClassList.Items) < 2` to explain that the cached
list still includes the object being deleted (hence "< 2" means "only this class
remains"), so uninstall should run when the count is less than 2; reference the
variables `gatewayclass`, `gatewayClassList`, and the `DeletionTimestamp` check
as the place to add the comment (and keep the rest of the logic including
finalizer removal via `controllerutil.RemoveFinalizer` unchanged).

356-430: reconcileWithOLM patches metadata and status using the same sourceGatewayClass base after the first patch has already mutated the server-side object.

Lines 373 and 379 both use client.MergeFrom(sourceGatewayClass) to compute their diffs. After the metadata patch at line 373 succeeds, the server-side object's resourceVersion has advanced, but sourceGatewayClass still holds the stale version. The status subresource patch at line 379 constructs its merge-patch diff against this stale base.

This works today because MergeFrom generates a JSON merge patch that doesn't include resourceVersion, and the status subresource endpoint only applies status fields. However, if the server or a future apiserver version enforces optimistic concurrency on the status subresource, this could start failing. Consider refreshing the object from the cache between the two patches, or reordering so the status patch is computed from a fresh base.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller.go` around lines 356 - 430,
reconcileWithOLM currently computes both metadata and status patches using the
same stale sourceGatewayClass (used in client.MergeFrom), which can cause
optimistic-concurrency failures; to fix, after successfully patching metadata
with client.Patch(gatewayclass, client.MergeFrom(sourceGatewayClass)) refresh
the base (e.g., re-get sourceGatewayClass from the cache or deepcopy from
server) and then compute the status patch against that fresh base before calling
r.client.Status().Patch(ctx, gatewayclass, client.MergeFrom(...)); update the
code paths around gatewayclass/sourceGatewayClass and the two Patch calls so the
Status().Patch uses a MergeFrom of an up-to-date object (refer to
reconcileWithOLM, sourceGatewayClass, gatewayclass, r.client.Patch and
r.client.Status().Patch).
pkg/operator/operator.go (1)

320-349: Sail Library initialization and wiring looks correct overall.

The gating via gatewayAPIWithoutOLMEnabled, error handling for install.New, and wiring of SailOperatorReconciler into the config are all reasonable. One concern:

If install.New succeeds but installer.Start(ctx) panics or returns a nil channel, line 344 will store a nil NotifyCh. The downstream code in controller.go (line 185) does check config.SailOperatorReconciler.NotifyCh != nil before setting up the watch, so this is safe, but it means the Sail notification path silently degrades. Consider adding a log warning or validation if notifyCh is nil after Start.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/operator.go` around lines 320 - 349, After successfully calling
install.New, protect against installer.Start(ctx) returning nil or panicking by
wrapping the Start call in a recover block and validating the returned channel;
if notifyCh is nil (or Start panics), log a warning and avoid wiring a nil
NotifyCh into gatewayclassControllerConfig.SailOperatorReconciler so the silent
degradation is visible. Update the code around installer.Start(ctx) (the
install.New, installer.Start(ctx), and
gatewayclassControllerConfig.SailOperatorReconciler assignments) to recover from
panic, check notifyCh != nil, and emit a clear warning message when Start fails
or returns nil.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@go.mod`:
- Around line 224-226: The go.mod currently uses a replace directive pointing to
the personal fork github.com/aslakknutsen/sail-operator; update the replace to
reference the upstream module (github.com/istio-ecosystem/sail-operator) or an
approved org fork and the intended pseudo-version instead, removing or changing
the replace line so it no longer references the personal fork; locate the
replace entry in go.mod (the line beginning with "replace
github.com/istio-ecosystem/sail-operator =>
github.com/aslakknutsen/sail-operator") and swap it to the upstream module or
remove the replace if the upstream version can be used directly.
- Line 76: The go.mod entry for github.com/containerd/containerd is pinned to
v1.7.27 and must be upgraded to v1.7.29 or later to address confirmed HIGH CVEs;
update the dependency entry for github.com/containerd/containerd to v1.7.29+ (or
a fixed 2.x release), run go get github.com/containerd/containerd@v1.7.29 (or
the chosen fixed version) and then go mod tidy to ensure the indirect upgrade is
reflected, then run the test suite and a full CI build to confirm no
regressions; additionally, audit the istio reference (istio.io/istio) mentioned
in the review and track upstream security fixes if that commit-based version is
pulled transitively.

In `@pkg/operator/controller/gatewayclass/controller.go`:
- Around line 516-533: The select branch reading from s.NotifyCh in
SailOperatorSource.Start (function Start) can spin if NotifyCh is closed; change
the receive to a comma-ok check so you detect closure and exit the goroutine
instead of continuously firing RequestsFunc: replace the bare case <-s.NotifyCh:
with a receive that captures the ok boolean (e.g., v, ok := <-s.NotifyCh) and if
ok is false return from the goroutine, otherwise call RequestsFunc(ctx, empty)
and enqueue requests into queue; ensure you reference Start, SailOperatorSource,
NotifyCh, RequestsFunc and queue when making the change.
- Around line 249-257: The handler enqueueRequestForSubscriptionChange calls
r.config.SailOperatorReconciler.Installer.Enqueue() without nil checks; add a
defensive nil-guard: verify r.config != nil, r.config.SailOperatorReconciler !=
nil and r.config.SailOperatorReconciler.Installer != nil before invoking
Installer.Enqueue(), and if any are nil either log/ignore the call (so the
handler returns r.allManagedGatewayClasses(ctx, obj) safely) to avoid a panic
during early/partial initialization.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer_test.go`:
- Around line 10-20: Add the missing Enqueue method to fakeSailInstaller so the
compile-time assertion passes: implement Enqueue with the exact signature
declared on SailLibraryInstaller and have it perform the fake installer's
enqueue behavior (e.g., push a notification on notifyCh or otherwise trigger
reconciliation) without changing existing Start/Apply/Uninstall/Status methods;
ensure the receiver is *fakeSailInstaller and the method name and signature
exactly match the interface.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 29-33: The current defensive check in overwriteOLMManagedCRDFunc
returns true when ctx or crd is nil which risks overwriting OLM-managed CRDs;
change the behavior to log an error/warning (use r.logger or context logger) and
return false to avoid overwriting when ctx==nil or crd==nil, keeping the rest of
the function unchanged so the safe default is "do not overwrite" for these error
conditions; ensure you reference overwriteOLMManagedCRDFunc, ctx and crd when
making the change.

In `@pkg/operator/controller/gatewayclass/migration.go`:
- Around line 83-103: Add a brief inline comment in istioRevisionExists
explaining why r.client.Get is used instead of r.cache.Get: note that the
controller only watches/indexes sailv1.Istio (not sailv1.IstioRevision) so
IstioRevision is not present in the informer's cache and must be fetched
directly via r.client.Get; reference the IstioRevision type and the r.cache.Get
usage elsewhere to clarify the difference for future readers.

In `@pkg/operator/controller/names.go`:
- Around line 82-84: Fix the typo in the comment above the
SailLibraryOwnerConfigMap constant: change "fot" to "for" in the comment that
describes SailLibraryOwnerConfigMap so it reads "for Sail Library installations"
(reference symbol: SailLibraryOwnerConfigMap).

---

Duplicate comments:
In `@manifests/00-cluster-role.yaml`:
- Around line 84-92: Current ClusterRole grants wildcard verbs ("*") on RBAC
resources clusterroles, clusterrolebindings, roles, and rolebindings which
enables privilege escalation; replace the "*" verbs with a minimal set (e.g.,
get, list, watch, create, update, patch) scoped only to the specific RBAC
objects the installer must manage and use resourceNames where possible to
restrict which role/rolebinding names can be created/modified; explicitly remove
bind and escalate from allowed verbs and ensure any creation of
clusterrole/clusterrolebinding is restricted or omitted unless strictly
required.
- Around line 290-315: Replace the overly-broad wildcard rules: for the
apiGroups block containing authentication.istio.io, config.istio.io,
extensions.istio.io, networking.istio.io, rbac.istio.io, security.istio.io,
telemetry.istio.io, remove resources: "*" and verbs: "*" and instead list only
the explicit Istio resources the Helm installer manages (e.g., VirtualService,
DestinationRule, Gateway, EnvoyFilter, Sidecar, PeerAuthentication,
RequestAuthentication, AuthorizationPolicy, etc. — enumerate exact plural
resource names your installer uses). For the apiGroup gateway.networking.k8s.io,
replace resources: "*" / verbs: "*" with the explicit Gateway API resources
previously used (gatewayclasses, gateways, httproutes, grpcroutes, etc.) and
specific verbs required; and remove or drop the entire apiGroup
gateway.networking.x-k8s.io rule (or narrow it to exact resources if still
needed) to avoid granting future/unintended access.

---

Nitpick comments:
In `@manifests/00-cluster-role.yaml`:
- Around line 261-268: The ClusterRole grants wildcard verbs on
mutatingwebhookconfigurations and validatingwebhookconfigurations which is
sensitive; update the role to either scope permissions with resourceNames for
the specific Istio webhook names or restrict verbs (avoid "*"), and expand the
existing comment that currently reads "Required for Istio installation via Helm"
to list the exact webhook configuration names managed (e.g.,
istio-sidecar-injector, istiod-validating-webhook) and justify why broad access
is needed; modify the rules referring to apiGroups, resources:
mutatingwebhookconfigurations and validatingwebhookconfigurations, and verbs
accordingly to implement the scoping.

In `@pkg/operator/controller/gatewayclass/controller_test.go`:
- Around line 138-149: Test cases in the gatewayclass controller tests leave
expectPatched and expectedStatusPatched nil in many cases (relying on
cmpopts.EquateEmpty()); update those test entries to explicitly set
expectPatched and expectedStatusPatched to empty slices ([]client.Object{})
where no patches/status patches are expected so they match the style used for
expectCreate/expectUpdate/expectDelete and improve readability; locate the test
table (tests []struct{...}) and each case in the block that does not use the
Sail path and add expectPatched: []client.Object{} and expectedStatusPatched:
[]client.Object{} to the case literals.
- Around line 430-436: The TODO in
pkg/operator/controller/gatewayclass/controller_test.go lists missing test
scenarios that must be tracked before merging; create a tracking issue
documenting each bullet (error on Istio removal, upgrade/downgrade/update,
GatewayClass removal when others exist (should not call Uninstall), and full
removal), reference the controller_test.go TODO, include acceptance criteria for
each test, link to the PR number, and add the issue ID or link in the TODO
comment (or replace the TODO with a one‑line reference to the new issue) so
reviewers can verify coverage planning.

In `@pkg/operator/controller/gatewayclass/controller.go`:
- Around line 447-472: The existing deletion check is correct but unclear: add a
short inline comment near the block that inspects
gatewayclass.DeletionTimestamp, gatewayClassList and the condition
`len(gatewayClassList.Items) < 2` to explain that the cached list still includes
the object being deleted (hence "< 2" means "only this class remains"), so
uninstall should run when the count is less than 2; reference the variables
`gatewayclass`, `gatewayClassList`, and the `DeletionTimestamp` check as the
place to add the comment (and keep the rest of the logic including finalizer
removal via `controllerutil.RemoveFinalizer` unchanged).
- Around line 356-430: reconcileWithOLM currently computes both metadata and
status patches using the same stale sourceGatewayClass (used in
client.MergeFrom), which can cause optimistic-concurrency failures; to fix,
after successfully patching metadata with client.Patch(gatewayclass,
client.MergeFrom(sourceGatewayClass)) refresh the base (e.g., re-get
sourceGatewayClass from the cache or deepcopy from server) and then compute the
status patch against that fresh base before calling r.client.Status().Patch(ctx,
gatewayclass, client.MergeFrom(...)); update the code paths around
gatewayclass/sourceGatewayClass and the two Patch calls so the Status().Patch
uses a MergeFrom of an up-to-date object (refer to reconcileWithOLM,
sourceGatewayClass, gatewayclass, r.client.Patch and r.client.Status().Patch).

In `@pkg/operator/controller/gatewayclass/istio_sail_installer_test.go`:
- Line 13: The test file declares an unused variable cancelFn which should be
removed or actually used; locate the declaration of cancelFn in
istio_sail_installer_test.go and either delete the unused cancelFn field or wire
it up to the test context teardown (assign it when creating the context and call
it in the test cleanup), ensuring there are no remaining unused variable
warnings for cancelFn.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 132-148: The function buildInstallerOptions currently has a
redundant error return: it declares (install.Options, error) but never returns a
non-nil error; update it to a simple single-return signature to remove the
phantom error by changing func buildInstallerOptions(enableInferenceExtension
bool, istioVersion string) (install.Options, error) to func
buildInstallerOptions(enableInferenceExtension bool, istioVersion string)
install.Options and remove the nil error return, then update all callers of
buildInstallerOptions to stop expecting an error; if you intend to validate in
future instead keep the existing signature but add a clear TODO comment inside
buildInstallerOptions explaining why error is reserved.
- Around line 99-130: The current ensureIstio function calls
sailInstaller.Apply(opts) which is asynchronous and then immediately reads
sailInstaller.Status(), so the status may reflect a prior reconciliation; update
the code to document this behavior by adding a clear comment in ensureIstio
explaining that sailInstaller.Apply is fire-and-forget, sailInstaller.Status()
may be stale, and the controller relies on subsequent Sail notifications to
requeue and reconcile (i.e., the eventual-consistency model), and optionally add
a TODO noting that if synchronous confirmation is required the Apply/Status
pattern must be replaced with a blocking check or explicit wait; reference
ensureIstio, sailInstaller.Apply, sailInstaller.Status, mapStatusToConditions
and the GatewayClass status update in the comment.
- Around line 48-62: The label parsing currently uses strings.SplitN(after, ".",
2) which splits on the first dot and can mis-parse subscription names that
contain dots; update the logic in the loop that inspects labels (the block
setting foundLabel, subscriptionName, subscriptionNamespace and using variable
after) to split on the last dot instead (e.g., find lastIndex :=
strings.LastIndex(after, ".") and use substrings before/after that index) so the
namespace is taken as the suffix after the final dot and subscriptionName
includes any earlier dots; preserve the validation (ignore if no dot found),
keep setting foundLabel, subscriptionName, subscriptionNamespace and the break
semantics.

In `@pkg/operator/operator.go`:
- Around line 320-349: After successfully calling install.New, protect against
installer.Start(ctx) returning nil or panicking by wrapping the Start call in a
recover block and validating the returned channel; if notifyCh is nil (or Start
panics), log a warning and avoid wiring a nil NotifyCh into
gatewayclassControllerConfig.SailOperatorReconciler so the silent degradation is
visible. Update the code around installer.Start(ctx) (the install.New,
installer.Start(ctx), and gatewayclassControllerConfig.SailOperatorReconciler
assignments) to recover from panic, check notifyCh != nil, and emit a clear
warning message when Start fails or returns nil.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between abfb6fa and ecd5433.

⛔ Files ignored due to path filters (288)
  • go.sum is excluded by !**/*.sum
  • vendor/cloud.google.com/go/compute/metadata/CHANGES.md is excluded by !**/vendor/**, !vendor/**
  • vendor/cloud.google.com/go/compute/metadata/metadata.go is excluded by !**/vendor/**, !vendor/**
  • vendor/cloud.google.com/go/compute/metadata/retry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.deepsource.toml is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/CODE_OF_CONDUCT.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/FUNDING.json is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/merge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/mergo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/constants.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/csi_entry_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/csi_param_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/escape_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/event_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/ground_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/osc_string_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser_actions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/states.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/utilities.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/ansi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/api.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/utilities.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/COPYING is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/decode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/deprecated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/encode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/internal/tz.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/lex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/meta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/parse.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/type_fields.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/type_toml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/heredoc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/appveyor.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/cryptorandomstringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/randomstringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/stringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/wordutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/collection.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/constraints.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/crypto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/date.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/dict.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/functions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/numeric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/reflect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/regex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/semver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/url.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/case.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/delete.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/delete_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/expr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/insert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/insert_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/part.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/placeholder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/row.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/select.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/select_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/squirrel.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/squirrel_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/statement.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/update.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/update_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/where.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_os.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_zip.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/gettext.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/locale.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/encoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/message.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/formula.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/table.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/comment.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/line_reader.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/message.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/re.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/tr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca_grpc.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/NOTICE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/archive/compression/compression.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/archive/compression/compression_fuzzer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/adaptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/content.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/errdefs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/errdefs/grpc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/adaptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/parser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/quote.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/scanner.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/annotations.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/diffid.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/handlers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/image.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/importexport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/mediatypes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/labels/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/labels/validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/pkg/randutil/randutil.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/remotes/handlers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/remotes/resolver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/resolve.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/.gitattributes is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/compare.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo_other.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/database.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_darwin.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_freebsd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platform_compat_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms_other.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/VERSION is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_go120.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_go121.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/join.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/lookup_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/mkdir_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/open_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/openat2_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/openat_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/procfs_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/vfs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/envoyproxy/protoc-gen-validate/validate/BUILD is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/merge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/decoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/path.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/pathaction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/LICENSE.MIT is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error_1_13.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error_backward.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/join_unwrap_1_20.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/join_unwrap_backward.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/parse_panic.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/stackframe.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/column.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/db.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_mysql.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_oracle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_postgres.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_snowflake.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_sqlite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_sqlserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/gorp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/index.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/lockerror.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/logging.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/nulltypes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/select.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/table.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/table_bindings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/test_all.sh is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/transaction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.cliff.toml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/NOTICE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/pointer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/.cliff.toml is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (12)
  • cmd/ingress-operator/start.go
  • go.mod
  • manifests/00-cluster-role.yaml
  • pkg/operator/controller/gatewayclass/controller.go
  • pkg/operator/controller/gatewayclass/controller_test.go
  • pkg/operator/controller/gatewayclass/istio_olm.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go
  • pkg/operator/controller/gatewayclass/migration.go
  • pkg/operator/controller/names.go
  • pkg/operator/controller/test/util/fake.go
  • pkg/operator/operator.go

Comment on lines +224 to +226

// Use the sail_library_2 branch from aslakknutsen's fork for Sail Library integration
replace github.com/istio-ecosystem/sail-operator => github.com/aslakknutsen/sail-operator v0.0.0-20260223154431-ffebc5493a7f
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

Personal fork must be replaced before merge.

The replace directive points to github.com/aslakknutsen/sail-operator, a personal fork. This is acceptable for WIP/testing but must be switched to the upstream github.com/istio-ecosystem/sail-operator (or an official org fork) before this PR can be merged.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 224 - 226, The go.mod currently uses a replace directive
pointing to the personal fork github.com/aslakknutsen/sail-operator; update the
replace to reference the upstream module
(github.com/istio-ecosystem/sail-operator) or an approved org fork and the
intended pseudo-version instead, removing or changing the replace line so it no
longer references the personal fork; locate the replace entry in go.mod (the
line beginning with "replace github.com/istio-ecosystem/sail-operator =>
github.com/aslakknutsen/sail-operator") and swap it to the upstream module or
remove the replace if the upstream version can be used directly.

Copy link
Copy Markdown

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

♻️ Duplicate comments (1)
go.mod (1)

224-226: ⚠️ Potential issue | 🟠 Major

Personal fork must be replaced before merge.

github.com/aslakknutsen/sail-operator is still in the replace directive. This issue was raised in the previous review and remains unresolved — only the pseudo-version has changed.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 224 - 226, The replace directive still points to a
personal fork "github.com/aslakknutsen/sail-operator" in the go.mod replace
line; update the replace to point to the official upstream module (or remove the
replace entirely if the upstream tag/version is available) so the project does
not depend on a personal fork. Locate the replace directive mentioning
github.com/istio-ecosystem/sail-operator and change the target from
github.com/aslakknutsen/sail-operator v0.0.0-... to the official module/version
(or delete the replace) and run go mod tidy to ensure module graph and sums are
updated.
🧹 Nitpick comments (2)
pkg/operator/controller/gatewayclass/istio_sail_installer_test.go (1)

12-17: cancelFn field is declared but never used.

The cancelFn func() field is never assigned or referenced in any method of fakeSailInstaller. If it's intended for future use (e.g., canceling a fake background task started in Start), add a comment; otherwise, remove it to avoid confusion.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer_test.go` around
lines 12 - 17, The fakeSailInstaller struct declares a cancelFn func() field
that is never assigned or used; either remove the cancelFn field from
fakeSailInstaller or, if intended for future cancellation of a background task
started by Start, add a clarifying comment and wire it into Start/Stop (assign
the cancel function when launching the goroutine and call it in Stop/Close).
Update references around fakeSailInstaller, Start, and any test setup to reflect
the removal or proper use of cancelFn.
pkg/operator/controller/gatewayclass/istio_sail_installer.go (1)

157-168: status.Error is silently dropped when status.Installed == true.

If the Sail library sets both Installed: true and a non-nil Error (e.g., a partial upgrade failure), the else if branch is never reached, the error is lost, and the ControllerInstalled condition reports ConditionTrue with no indication of the error.

♻️ Consider surfacing the error in the message even when installed
 if status.Installed {
     installed.Status = metav1.ConditionTrue
     installed.Reason = "Installed"
-    installed.Message = fmt.Sprintf("istiod %s installed", status.Version)
+    if status.Error != nil {
+        installed.Message = fmt.Sprintf("istiod %s installed (with warning: %v)", status.Version, status.Error)
+    } else {
+        installed.Message = fmt.Sprintf("istiod %s installed", status.Version)
+    }
 } else if status.Error != nil {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines
157 - 168, The current logic drops status.Error when status.Installed is true;
update the handling in the block that sets installed (the variables
installed.Status, installed.Reason, installed.Message) so that when
status.Installed == true you still check status.Error and append or include its
text in installed.Message (e.g., keep the "istiod <version> installed" text but
add the error details if status.Error != nil), ensuring the ControllerInstalled
condition reports the installation plus any leftover error information; modify
the code that sets installed.Message to combine status.Version and
status.Error.Error() when error is non-nil.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@go.mod`:
- Line 204: The OSV scanner flags several HIGH CVEs for the indirect dependency
istio.io/istio v0.0.0-20260208024451-a30ad73344d7 which are false positives;
verify that the pseudo-version commit a30ad73344d7 maps to an Istio release ≥
1.13.1 (or other releases that contain fixes for GHSA-7774-7vr3-cc8j,
GHSA-856q-xv3c-7f2f, GHSA-hqxw-mm44-gc4r, GHSA-qcvw-82hh-gq38,
GHSA-xwx5-5c9g-x68x) and then add suppress/ignore entries for that
pseudo-version/these CVE IDs in the OSV scanner configuration (or CI vuln-scan
allowlist) so the alerts are silenced, and add a note to monitor upstream
istio.io/istio for future dependency changes that could reintroduce real
exposures.

In `@pkg/operator/controller/gatewayclass/controller.go`:
- Around line 449-482: The deletion handling block for gatewayclass (checking
gatewayclass.DeletionTimestamp) can fall through and call
controllerutil.AddFinalizer when the object is already being deleted and no
finalizer was present; modify the logic in the reconcile function so that after
the deletion branch finishes you always return (reconcile.Result{}, nil or
existing err) — i.e., after listing GatewayClassList, running Uninstall, and
attempting controllerutil.RemoveFinalizer(gatewayclass, sailLibraryFinalizer),
ensure you unconditionally return from the reconcile when DeletionTimestamp is
set (even if RemoveFinalizer returned false) so controllerutil.AddFinalizer
cannot be executed on a deleting object.

---

Duplicate comments:
In `@go.mod`:
- Around line 224-226: The replace directive still points to a personal fork
"github.com/aslakknutsen/sail-operator" in the go.mod replace line; update the
replace to point to the official upstream module (or remove the replace entirely
if the upstream tag/version is available) so the project does not depend on a
personal fork. Locate the replace directive mentioning
github.com/istio-ecosystem/sail-operator and change the target from
github.com/aslakknutsen/sail-operator v0.0.0-... to the official module/version
(or delete the replace) and run go mod tidy to ensure module graph and sums are
updated.

---

Nitpick comments:
In `@pkg/operator/controller/gatewayclass/istio_sail_installer_test.go`:
- Around line 12-17: The fakeSailInstaller struct declares a cancelFn func()
field that is never assigned or used; either remove the cancelFn field from
fakeSailInstaller or, if intended for future cancellation of a background task
started by Start, add a clarifying comment and wire it into Start/Stop (assign
the cancel function when launching the goroutine and call it in Stop/Close).
Update references around fakeSailInstaller, Start, and any test setup to reflect
the removal or proper use of cancelFn.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 157-168: The current logic drops status.Error when
status.Installed is true; update the handling in the block that sets installed
(the variables installed.Status, installed.Reason, installed.Message) so that
when status.Installed == true you still check status.Error and append or include
its text in installed.Message (e.g., keep the "istiod <version> installed" text
but add the error details if status.Error != nil), ensuring the
ControllerInstalled condition reports the installation plus any leftover error
information; modify the code that sets installed.Message to combine
status.Version and status.Error.Error() when error is non-nil.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between ecd5433 and 998c806.

⛔ Files ignored due to path filters (2)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/containerd/containerd/archive/compression/compression.go is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (5)
  • go.mod
  • pkg/operator/controller/gatewayclass/controller.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go
  • pkg/operator/controller/names.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/operator/controller/names.go

@rikatz
Copy link
Copy Markdown
Member Author

rikatz commented Feb 23, 2026

@coderabbitai analyze the output of ci/prow/verify jobs and provide a solution

Copy link
Copy Markdown

@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

♻️ Duplicate comments (1)
go.mod (1)

224-226: Personal fork replace directive still present.

github.com/aslakknutsen/sail-operator is a personal fork and must be replaced with the upstream github.com/istio-ecosystem/sail-operator (or an approved org fork) before this PR is merged. The pseudo-version has been updated to a newer commit but the fork itself remains.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 224 - 226, The go.mod contains a replace directive
pointing to the personal fork github.com/aslakknutsen/sail-operator; update that
replace so it references the official upstream module
(github.com/istio-ecosystem/sail-operator) or an approved org fork instead of
the personal fork, and set the pseudo-version to the intended commit/tag for
that upstream module; locate the replace line referencing
github.com/aslakknutsen/sail-operator and change the module path and version
accordingly before merging.
🧹 Nitpick comments (4)
pkg/operator/controller/gatewayclass/istio_sail_installer.go (2)

27-28: Stale/incorrect function doc comment.

The comment names the function SubscriptionExists and describes it as "a predicate function", but the actual function is overwriteOLMManagedCRDFunc and it's a CRD overwrite decision callback, not a predicate.

♻️ Suggested fix
-// SubscriptionExists is used as a predicate function to allow the library to
-// query CIO if a subscription exists before taking an action over a CRD
+// overwriteOLMManagedCRDFunc is the OverwriteOLMManagedCRD callback passed to the
+// Sail installer. It returns true if the operator should take ownership of the CRD,
+// or false if an active OLM subscription/install-plan is still managing it.
 func (r *reconciler) overwriteOLMManagedCRDFunc(ctx context.Context, crd *apiextensionsv1.CustomResourceDefinition) bool {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines 27
- 28, The top-of-file comment is stale: it references a different function name
and describes a predicate whereas the actual function is
overwriteOLMManagedCRDFunc which implements the CRD overwrite/OLM-managed
decision callback; update the comment to describe overwriteOLMManagedCRDFunc's
purpose (deciding whether to overwrite OLM-managed CRDs during installation),
its inputs/behavior, and that it is used as a CRD overwrite decision callback so
readers can locate and understand the function.

132-148: Hardcoded DefaultOperandNamespace bypasses r.config.OperandNamespace.

buildInstallerOptions uses controller.DefaultOperandNamespace directly instead of r.config.OperandNamespace. The same issue affects Uninstall in reconcileWithSailLibrary (controller.go line 462). If OperandNamespace is configured to a non-default value, the Sail install and uninstall would target different namespaces, leading to orphaned resources.

♻️ Suggested fix for buildInstallerOptions
-func (r *reconciler) buildInstallerOptions(enableInferenceExtension bool, istioVersion string) (install.Options, error) {
+func (r *reconciler) buildInstallerOptions(enableInferenceExtension bool, istioVersion string) (install.Options, error) { //nolint:unparam
 	values := install.GatewayAPIDefaults()
 	openshiftOverrides := openshiftValues(enableInferenceExtension)
 	values = install.MergeValues(values, openshiftOverrides)

 	return install.Options{
-		Namespace:      controller.DefaultOperandNamespace,
+		Namespace:      r.config.OperandNamespace,
 		Revision:       controller.IstioName("").Name,

Apply the matching fix in reconcileWithSailLibrary (controller.go):

-		if err := r.config.SailOperatorReconciler.Installer.Uninstall(ctx, operatorcontroller.DefaultOperandNamespace, operatorcontroller.IstioName("").Name); err != nil {
+		if err := r.config.SailOperatorReconciler.Installer.Uninstall(ctx, r.config.OperandNamespace, operatorcontroller.IstioName("").Name); err != nil {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines
132 - 148, The installer options currently hardcode
controller.DefaultOperandNamespace; change buildInstallerOptions to use
r.config.OperandNamespace (falling back to controller.DefaultOperandNamespace if
r.config.OperandNamespace is empty) so installs target the configured namespace,
and make the identical change where Uninstall is called in
reconcileWithSailLibrary so uninstall also uses r.config.OperandNamespace (with
the same fallback). Update references in buildInstallerOptions and the Uninstall
invocation to use r.config.OperandNamespace instead of
controller.DefaultOperandNamespace to avoid mismatched install/uninstall
namespaces.
pkg/operator/controller/gatewayclass/controller.go (2)

133-137: No Subscription predicate in the non-OLM path — every cluster Subscription event triggers reconciliation.

The OLM path (lines 126–131) gates on isServiceMeshSubscription; the non-OLM else branch watches all operatorsv1alpha1.Subscription objects with no filter, causing a GatewayClass reconciliation for every unrelated subscription event cluster-wide. Adding the same (or equivalent) OSSM-subscription name filter would reduce noise without affecting migration detection.

♻️ Suggested fix
 	} else {
+		isServiceMeshSubscription := predicate.NewPredicateFuncs(func(o client.Object) bool {
+			return o.GetName() == operatorcontroller.ServiceMeshOperatorSubscriptionName().Name
+		})
 		if err = c.Watch(source.Kind[client.Object](operatorCache, &operatorsv1alpha1.Subscription{},
-			reconciler.enqueueRequestForSubscriptionChange())); err != nil {
+			reconciler.enqueueRequestForSubscriptionChange(), isServiceMeshSubscription)); err != nil {
 			return nil, err
 		}
 	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller.go` around lines 133 - 137,
The non-OLM watch currently calls
c.Watch(source.Kind[client.Object](operatorCache,
&operatorsv1alpha1.Subscription{},
reconciler.enqueueRequestForSubscriptionChange())) with no predicate, so every
Subscription event triggers GatewayClass reconciliation; update that watch to
include the same filter used in the OLM path (e.g., add the
isServiceMeshSubscription predicate or an equivalent predicate that filters by
the OSSM subscription name) so only relevant operatorsv1alpha1.Subscription
objects enqueue via reconciler.enqueueRequestForSubscriptionChange(); modify the
c.Watch invocation to accept the predicate (or predicate list) alongside
source.Kind[client.Object] to limit events.

252-253: Misleading comment — inverted path description.

The comment says "If this is OLM…" but enqueueRequestForSubscriptionChange is only wired when GatewayAPIWithoutOLMEnabled is true (the non-OLM path). The intent appears to be tracking OLM subscription state during migration from OSSM to Sail.

♻️ Suggested fix
-		// If this is OLM and we detect the change of subscriptions, we must
-		// enforce that Sail Installer also enqueues a new reconciliation
+		// In Sail/non-OLM mode, subscription changes may indicate OSSM migration
+		// progress; notify the Sail Installer so it can reconcile accordingly.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller.go` around lines 252 - 253,
The comment above the wiring of enqueueRequestForSubscriptionChange is
misleading: it states "If this is OLM…" but the handler is only attached when
GatewayAPIWithoutOLMEnabled is true (the non-OLM path). Update the comment near
enqueueRequestForSubscriptionChange to accurately state that this branch is for
the non-OLM (GatewayAPIWithoutOLMEnabled) path and that the handler is used to
track OLM subscription state during migration from OSSM to Sail, so readers
understand the inverted condition and intent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 69-91: Fix the two inline comment typos in the
istio_sail_installer logic: update the comment above installPlanList (near the
r.cache.List call and variable installPlanList) changing "effectivelly" to
"effectively", and update the comment in the subscription-not-found branch (near
subscription variable, r.cache.Get call and the logOverwrite handling) changing
"overwriten" to "overwritten".

---

Duplicate comments:
In `@go.mod`:
- Around line 224-226: The go.mod contains a replace directive pointing to the
personal fork github.com/aslakknutsen/sail-operator; update that replace so it
references the official upstream module
(github.com/istio-ecosystem/sail-operator) or an approved org fork instead of
the personal fork, and set the pseudo-version to the intended commit/tag for
that upstream module; locate the replace line referencing
github.com/aslakknutsen/sail-operator and change the module path and version
accordingly before merging.

---

Nitpick comments:
In `@pkg/operator/controller/gatewayclass/controller.go`:
- Around line 133-137: The non-OLM watch currently calls
c.Watch(source.Kind[client.Object](operatorCache,
&operatorsv1alpha1.Subscription{},
reconciler.enqueueRequestForSubscriptionChange())) with no predicate, so every
Subscription event triggers GatewayClass reconciliation; update that watch to
include the same filter used in the OLM path (e.g., add the
isServiceMeshSubscription predicate or an equivalent predicate that filters by
the OSSM subscription name) so only relevant operatorsv1alpha1.Subscription
objects enqueue via reconciler.enqueueRequestForSubscriptionChange(); modify the
c.Watch invocation to accept the predicate (or predicate list) alongside
source.Kind[client.Object] to limit events.
- Around line 252-253: The comment above the wiring of
enqueueRequestForSubscriptionChange is misleading: it states "If this is OLM…"
but the handler is only attached when GatewayAPIWithoutOLMEnabled is true (the
non-OLM path). Update the comment near enqueueRequestForSubscriptionChange to
accurately state that this branch is for the non-OLM
(GatewayAPIWithoutOLMEnabled) path and that the handler is used to track OLM
subscription state during migration from OSSM to Sail, so readers understand the
inverted condition and intent.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 27-28: The top-of-file comment is stale: it references a different
function name and describes a predicate whereas the actual function is
overwriteOLMManagedCRDFunc which implements the CRD overwrite/OLM-managed
decision callback; update the comment to describe overwriteOLMManagedCRDFunc's
purpose (deciding whether to overwrite OLM-managed CRDs during installation),
its inputs/behavior, and that it is used as a CRD overwrite decision callback so
readers can locate and understand the function.
- Around line 132-148: The installer options currently hardcode
controller.DefaultOperandNamespace; change buildInstallerOptions to use
r.config.OperandNamespace (falling back to controller.DefaultOperandNamespace if
r.config.OperandNamespace is empty) so installs target the configured namespace,
and make the identical change where Uninstall is called in
reconcileWithSailLibrary so uninstall also uses r.config.OperandNamespace (with
the same fallback). Update references in buildInstallerOptions and the Uninstall
invocation to use r.config.OperandNamespace instead of
controller.DefaultOperandNamespace to avoid mismatched install/uninstall
namespaces.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between 998c806 and c9c2859.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (4)
  • go.mod
  • pkg/operator/controller/gatewayclass/controller.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 23, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@rikatz: I'll analyze the CI/Prow verify job failures for you.


🏁 Script executed:

#!/bin/bash

# Get the status checks for this PR
echo "=== PR Check Runs ==="
gh pr checks 1358 --repo openshift/cluster-ingress-operator

echo -e "\n=== Failed Check Details ==="
# Get detailed information about failed checks
gh pr checks 1358 --repo openshift/cluster-ingress-operator --json name,conclusion,detailsUrl --jq '.[] | select(.conclusion == "failure" or .conclusion == "FAILURE") | "Name: \(.name)\nConclusion: \(.conclusion)\nURL: \(.detailsUrl)\n---"'

echo -e "\n=== All Verify Jobs ==="
# Look specifically for verify jobs
gh pr checks 1358 --repo openshift/cluster-ingress-operator --json name,conclusion,detailsUrl --jq '.[] | select(.name | contains("verify")) | "Name: \(.name)\nConclusion: \(.conclusion)\nURL: \(.detailsUrl)\n---"'

Length of output: 5800


🏁 Script executed:

#!/bin/bash

echo "=== Fetching ci/prow/verify logs ==="
curl -sL "https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results/pr-logs/pull/openshift_cluster-ingress-operator/1358/pull-ci-openshift-cluster-ingress-operator-master-verify/2026021370046976000/build-log.txt" | tail -100

echo -e "\n\n=== Fetching ci/prow/verify-deps logs ==="
curl -sL "https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results/pr-logs/pull/openshift_cluster-ingress-operator/1358/pull-ci-openshift-cluster-ingress-operator-master-verify-deps/2026021372563558400/build-log.txt" | tail -100

Length of output: 12661


@rikatz: I've analyzed both CI failures. Here are the issues and solutions:

🔴 Issue 1: ci/prow/verify - CRD Inconsistency

Problem: The CRD manifest manifests/00-custom-resource-definition.yaml is out of sync with the vendored version from github.com/openshift/api. You updated the openshift/api dependency in go.mod to a 2026 version, but didn't regenerate the CRD manifests.

Solution:

# Update the CRD manifests from vendor
make update-deps

# Or if that doesn't work, try:
make update

This will sync manifests/00-custom-resource-definition.yaml with the latest CRD definitions from the vendored openshift/api.


🔴 Issue 2: ci/prow/verify-deps - Vim Swap File in Vendor

Problem: There's a vim swap file .swp in the vendor directory at vendor/github.com/santhosh-tekuri/jsonschema/v6/.swp. This is a temporary file that should not be committed.

Solution:

# Remove the swap file
rm vendor/github.com/santhosh-tekuri/jsonschema/v6/.swp

# Re-vendor to ensure consistency
go mod tidy
go mod vendor

# Verify no untracked or ignored files in vendor
git status --porcelain --ignored | grep vendor/

📋 Complete Fix Steps

Run these commands in order:

# 1. Remove the swap file
rm vendor/github.com/santhosh-tekuri/jsonschema/v6/.swp

# 2. Clean up dependencies
go mod tidy
go mod vendor

# 3. Update CRD manifests
make update-deps

# 4. Stage all changes
git add .

# 5. Commit
git commit -m "Fix verify checks: update CRD manifests and clean vendor"

# 6. Push
git push

After pushing, the verify jobs should pass. Let me know if you encounter any issues!

Copy link
Copy Markdown

@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

Caution

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

⚠️ Outside diff range comments (1)
manifests/00-custom-resource-definition.yaml (1)

1997-2111: ⚠️ Potential issue | 🟡 Minor

Clarify TLS 1.3 cipher listing vs “not configurable” note.

You state TLS 1.3 cipher suites are not configurable, but the profile-equivalence examples still list TLS 1.3 cipher names. Consider adding a short clarification so readers don’t interpret those lists as user-configurable.

📝 Suggested clarification
-                      TLS 1.3 cipher suites (e.g. TLS_AES_128_GCM_SHA256) are not configurable
-                      and are always enabled when TLS 1.3 is negotiated.
+                      TLS 1.3 cipher suites (e.g. TLS_AES_128_GCM_SHA256) are not configurable
+                      and are always enabled when TLS 1.3 is negotiated.
+                      TLS 1.3 cipher names shown in the profile examples below are listed
+                      for completeness only and cannot be modified via this field.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-custom-resource-definition.yaml` around lines 1997 - 2111, The
doc claims "TLS 1.3 cipher suites ... are not configurable" but still lists TLS
1.3 ciphers in the profile examples (see the ciphers property description and
the profile blocks intermediate, modern, old); add a short clarifying sentence
to those places (or immediately after the sentence about TLS 1.3 in the ciphers
description) stating that TLS 1.3 cipher names shown in the example are
illustrative of the resulting profile and cannot be set by the user (they are
always negotiated by the TLS implementation), so readers don’t assume those
entries are user-configurable.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go`:
- Around line 64-67: The current check returns true when foundLabel or
subscriptionName or subscriptionNamespace is empty, which can cause overwriting
OLM-managed CRDs; change the behavior so that if any of foundLabel,
subscriptionName, or subscriptionNamespace is missing, log a clear
non-actionable message via logOverwrite.Info or logOverwrite.Debug and return
false (skip overwrite) instead of true, so ownership isn't assumed—update the
conditional in istio_sail_installer.go that references foundLabel,
subscriptionName, subscriptionNamespace and the logOverwrite.Info call
accordingly to treat missing labels/namespaces as "not owned" and avoid
clobbering OLM-managed resources.

---

Outside diff comments:
In `@manifests/00-custom-resource-definition.yaml`:
- Around line 1997-2111: The doc claims "TLS 1.3 cipher suites ... are not
configurable" but still lists TLS 1.3 ciphers in the profile examples (see the
ciphers property description and the profile blocks intermediate, modern, old);
add a short clarifying sentence to those places (or immediately after the
sentence about TLS 1.3 in the ciphers description) stating that TLS 1.3 cipher
names shown in the example are illustrative of the resulting profile and cannot
be set by the user (they are always negotiated by the TLS implementation), so
readers don’t assume those entries are user-configurable.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between c9c2859 and b2beb96.

📒 Files selected for processing (2)
  • manifests/00-custom-resource-definition.yaml
  • pkg/operator/controller/gatewayclass/istio_sail_installer.go

Comment on lines +64 to +67
if foundLabel == "" || subscriptionName == "" || subscriptionNamespace == "" {
logOverwrite.Info("no subscription label found")
return true
}
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 23, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Avoid overwriting OLM-managed CRDs when subscription label is missing.

Once olm.managed=true is detected, returning true on missing/invalid subscription labels can clobber an OLM-managed CRD. Safer default is to skip overwrite unless you can positively confirm ownership.

🔧 Suggested fix
 if foundLabel == "" || subscriptionName == "" || subscriptionNamespace == "" {
-	logOverwrite.Info("no subscription label found")
-	return true
+	logOverwrite.Info("no valid subscription label found; skipping overwrite")
+	return false
 }
📝 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 foundLabel == "" || subscriptionName == "" || subscriptionNamespace == "" {
logOverwrite.Info("no subscription label found")
return true
}
if foundLabel == "" || subscriptionName == "" || subscriptionNamespace == "" {
logOverwrite.Info("no valid subscription label found; skipping overwrite")
return false
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/istio_sail_installer.go` around lines 64
- 67, The current check returns true when foundLabel or subscriptionName or
subscriptionNamespace is empty, which can cause overwriting OLM-managed CRDs;
change the behavior so that if any of foundLabel, subscriptionName, or
subscriptionNamespace is missing, log a clear non-actionable message via
logOverwrite.Info or logOverwrite.Debug and return false (skip overwrite)
instead of true, so ownership isn't assumed—update the conditional in
istio_sail_installer.go that references foundLabel, subscriptionName,
subscriptionNamespace and the logOverwrite.Info call accordingly to treat
missing labels/namespaces as "not owned" and avoid clobbering OLM-managed
resources.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

this is wrong, we actually want to override the CRD if there is no subscription or if no label is found

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@rikatz, thank you for the clarification! You're absolutely right - I misunderstood the intent. The function should allow overwriting CRDs that are marked as olm.managed=true but lack a valid subscription label, since those are effectively orphaned resources. The current logic correctly treats missing or invalid subscription labels as a signal that it's safe to take ownership of the CRD.

I appreciate the correction! 🐰


📝 Learnings were identified and not saved (knowledge base disabled). Enable

gcs278 and others added 6 commits February 24, 2026 19:02
Bump Kubernetes packages to 0.35.0 and controller-runtime to 0.22.4,
required by the sail-operator library which will be used to replace
OLM-based Istio installation:

go get k8s.io/api@v0.35.0
go get k8s.io/apiextensions-apiserver@v0.35.0
go get k8s.io/apimachinery@v0.35.0
go get k8s.io/apiserver@v0.35.0
go get k8s.io/client-go@v0.35.0
go get sigs.k8s.io/controller-runtime@v0.22.4

The Kubernetes 0.35.0 dependencies require Go 1.25.0, which caused
go.mod to be automatically updated from go 1.24.0 to go 1.25.0

Update build toolchain to match the new go.mod version:
- `Dockerfile`: golang:1.24 to golang:1.25
- `.ci-operator.yaml`: rhel-9-release-golang-1.24-openshift-4.22 to
  rhel-9-release-golang-1.25-openshift-4.22
Bump openshift/api to add the new GatewayAPIWithoutOLM feature gate.
This feature gate controls whether to use the Sail Library for direct
Helm-based installation of Istio.
Add support for installing Istio without OLM using the Sail Operator
library, which uses Helm directly. This simplifies the Gateway API
installation flow by eliminating the need for Subscription/InstallPlan
management and Istio CR lifecycle.

Key changes:
- Use install.NewInstaller() with PresetGatewayAPI to deploy Istio
- Pass GatewayClass as ownerReference for Helm release garbage collection
- Add RBAC cluster roles required by the Sail Library

The Sail Library embeds Istio Helm charts and provides a one-shot
installer API, making the installation idempotent and self-contained
without requiring external operator dependencies.
Add migration logic to handle the upgrade from OLM-based
Istio installation (4.21) to Helm-based installation via
Sail Library (4.22).

Migration approach:
 - Delete the old Istio CR created by sail-operator
 - Wait for Sail Operator to clean up IstioRevision and Helm resources
 - Continue with Sail Library install only when migration is complete
Copy link
Copy Markdown

@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

Caution

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

⚠️ Outside diff range comments (1)
go.mod (1)

21-219: ⚠️ Potential issue | 🟡 Minor

Pin consistency verified, but review sail-operator replace directive version mismatch.

The dependency pins are properly reflected in go.sum. However, note that the sail-operator replace directive (line 226) uses a different version than the require statement: the require specifies v0.0.0-20260212113734-df7c3ff58926 while the replace points to v0.0.0-20260223154431-ffebc5493a7f. Confirm this intentional discrepancy is expected and aligns with your build strategy.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 21 - 219, The go.mod has a version mismatch for
github.com/istio-ecosystem/sail-operator between the require entry
(v0.0.0-20260212113734-df7c3ff58926) and the replace directive
(v0.0.0-20260223154431-ffebc5493a7f); update one so both match (either change
the replace to v0.0.0-20260212113734-df7c3ff58926 or bump the require to
v0.0.0-20260223154431-ffebc5493a7f) in the sail-operator entries, then run go
mod tidy/go mod download to refresh go.sum and verify builds.
♻️ Duplicate comments (4)
go.mod (2)

225-226: Replace directive still points to a personal fork.

This should be switched back to the upstream org before merge.

#!/bin/bash
# Locate the sail-operator replace directive
rg -n "replace github.com/istio-ecosystem/sail-operator" go.mod
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 225 - 226, The go.mod replace directive currently points
to a personal fork "github.com/aslakknutsen/sail-operator
v0.0.0-20260223154431-ffebc5493a7f"; update that replace to reference the
upstream org module "github.com/istio-ecosystem/sail-operator" (or remove the
replace if upstream tag/version is available) so the project no longer depends
on a personal fork; locate the line containing the exact replace string "replace
github.com/istio-ecosystem/sail-operator =>
github.com/aslakknutsen/sail-operator" and change it to the upstream
module/version or remove the replace entry.

204-204: Re-check OSV scanner findings for the Istio pseudo-version.

The previous review flagged high CVEs that may be false positives for this commit-based version. Please confirm the commit maps to a fixed release (or add an allowlist/suppression if confirmed).

Istio commit a30ad73344d7 release branch or tag, and whether v0.0.0-20260208024451-a30ad73344d7 includes fixes for GHSA-7774-7vr3-cc8j, GHSA-856q-xv3c-7f2f, GHSA-hqxw-mm44-gc4r, GHSA-qcvw-82hh-gq38, GHSA-xwx5-5c9g-x68x
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` at line 204, The go.mod entry "istio.io/istio
v0.0.0-20260208024451-a30ad73344d7 // indirect" should be re-verified against
the OSV scanner findings: locate the module line and confirm that commit
a30ad73344d7 corresponds to an Istio release or branch/tag that contains fixes
for GHSA-7774-7vr3-cc8j, GHSA-856q-xv3c-7f2f, GHSA-hqxw-mm44-gc4r,
GHSA-qcvw-82hh-gq38, and GHSA-xwx5-5c9g-x68x; if it does, replace the
pseudo-version with the canonical release tag or update go.mod accordingly,
otherwise add a documented allowlist/suppression entry in the vulnerability
scanner config referencing the same module string and commit hash and include a
brief justification and link to the upstream commit/PR that shows the fix.
manifests/00-cluster-role.yaml (2)

290-315: ⚠️ Potential issue | 🟠 Major

Wildcard on full Istio/Gateway API groups should be tightened before GA.

Please limit to the specific resources/verbs required and plan to drop gateway.networking.x-k8s.io once filtering lands.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 290 - 315, The ClusterRole
currently grants wildcards for full Istio and Gateway API groups (apiGroups:
authentication.istio.io, config.istio.io, extensions.istio.io,
networking.istio.io, rbac.istio.io, security.istio.io, telemetry.istio.io and
gateway.networking.k8s.io / gateway.networking.x-k8s.io) which is too
permissive; replace the "*" resources/verbs with only the explicit resources and
verbs actually needed (e.g., list/get/watch/patch/update on specific resource
kinds the controller touches) for the Istio groups and for
gateway.networking.k8s.io, and plan to remove the gateway.networking.x-k8s.io
entry once filtering lands; update the ClusterRole entries for those apiGroups
to enumerate exact resources and verbs and add a short comment noting removal of
gateway.networking.x-k8s.io in a future change.

84-92: ⚠️ Potential issue | 🟠 Major

Wildcard access to RBAC resources is highly privileged.

This enables broad privilege escalation. Please scope verbs/resources to the minimum required or split into tightly scoped roles.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 84 - 92, The RBAC rule currently
grants wildcard verbs ("*") on high-privilege resources clusterroles,
clusterrolebindings, roles, and rolebindings; replace the wildcard with the
minimal required verb set (e.g., get, list, watch, create, update, patch, delete
only as needed) or split this single rule into multiple narrowly-scoped
Role/ClusterRole entries that each target only the specific resource(s) and
verbs required; update the entry that references resources clusterroles,
clusterrolebindings, roles, and rolebindings to enumerate explicit verbs and/or
separate into distinct roles to avoid blanket privileges.
🧹 Nitpick comments (1)
pkg/operator/controller/gatewayclass/controller_test.go (1)

484-490: Avoid leaking goroutines from Start(context.Background()).
If Start blocks on ctx.Done(), this can leave goroutines running across tests. Prefer a cancellable context with cleanup.

♻️ Suggested fix
-			if tc.fakeHelmInstaller != nil {
-				reconciler.config.GatewayAPIWithoutOLMEnabled = true
-				reconciler.config.SailOperatorReconciler = &SailOperatorReconciler{
-					Installer: tc.fakeHelmInstaller,
-					NotifyCh:  tc.fakeHelmInstaller.Start(context.Background()),
-				}
-			}
+			if tc.fakeHelmInstaller != nil {
+				reconciler.config.GatewayAPIWithoutOLMEnabled = true
+				ctx, cancel := context.WithCancel(context.Background())
+				t.Cleanup(cancel)
+				reconciler.config.SailOperatorReconciler = &SailOperatorReconciler{
+					Installer: tc.fakeHelmInstaller,
+					NotifyCh:  tc.fakeHelmInstaller.Start(ctx),
+				}
+			}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller_test.go` around lines 484 -
490, The test is leaking goroutines by calling
fakeHelmInstaller.Start(context.Background()) directly; change it to create a
cancellable context (e.g., ctx, cancel :=
context.WithCancel(context.Background())), pass ctx to
fakeHelmInstaller.Start(ctx) and register cancel with test cleanup (e.g.,
t.Cleanup(cancel)) so that any goroutine started by Start can be stopped; update
the assignment to reconciler.config.SailOperatorReconciler.NotifyCh to use the
cancellable context and ensure Start is invoked only once when constructing the
SailOperatorReconciler/Installer.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@manifests/00-cluster-role.yaml`:
- Around line 261-268: The ClusterRole currently grants wildcard webhook control
(apiGroups: admissionregistration.k8s.io, resources:
mutatingwebhookconfigurations and validatingwebhookconfigurations, verbs: "*"),
which is high risk; update the role to restrict scope by adding resourceNames
with the specific webhook names you need and replace verbs:"*" with the minimal
set required (e.g., get, list, watch, create, update as appropriate) and remove
any unnecessary verbs; locate the block referencing admissionregistration.k8s.io
and mutatingwebhookconfigurations/validatingwebhookconfigurations and add
resourceNames: ["your-mutating-webhook-name","your-validating-webhook-name"] and
tighten verbs accordingly.

In `@pkg/operator/controller/gatewayclass/controller.go`:
- Around line 169-175: The comment above the isIstioCRD predicate is incorrect:
it states "On OLM" but this branch runs when GatewayAPIWithoutOLMEnabled is true
(i.e., the non‑OLM path). Update the comment surrounding
predicate.NewPredicateFuncs (and any nearby comments referencing
Subscriptions/InstallPlans/CRDs) to correctly reflect that this is the non‑OLM
branch (GatewayAPIWithoutOLMEnabled) and describe the required behavior (enqueue
installer and reconcile all managed classes) so the comment matches the actual
condition GatewayAPIWithoutOLMEnabled and the predicate isIstioCRD.

In `@pkg/operator/operator.go`:
- Around line 143-153: The code currently enables non‑OLM mode solely from the
GATEWAY_HELM env var (gatewayAPIWithoutOLMEnabled) which bypasses the cluster
feature gate; update the logic in operator.go to require both the cluster
feature gate and the env flag (i.e., AND them) by checking the existing
featureGates/feature flag (features.FeatureGateGatewayAPIWithoutOLM via
featureGates.Enabled(...)) and then only setting gatewayAPIWithoutOLMEnabled =
true when that feature gate is enabled AND
strconv.ParseBool(os.LookupEnv("GATEWAY_HELM")) yields true (treat missing env
as false or use env only as explicit override in dev), so references:
gatewayAPIWithoutOLMEnabled, gatewayAPIWithoutOLMEnabledBool, featureGates, and
features.FeatureGateGatewayAPIWithoutOLM.

---

Outside diff comments:
In `@go.mod`:
- Around line 21-219: The go.mod has a version mismatch for
github.com/istio-ecosystem/sail-operator between the require entry
(v0.0.0-20260212113734-df7c3ff58926) and the replace directive
(v0.0.0-20260223154431-ffebc5493a7f); update one so both match (either change
the replace to v0.0.0-20260212113734-df7c3ff58926 or bump the require to
v0.0.0-20260223154431-ffebc5493a7f) in the sail-operator entries, then run go
mod tidy/go mod download to refresh go.sum and verify builds.

---

Duplicate comments:
In `@go.mod`:
- Around line 225-226: The go.mod replace directive currently points to a
personal fork "github.com/aslakknutsen/sail-operator
v0.0.0-20260223154431-ffebc5493a7f"; update that replace to reference the
upstream org module "github.com/istio-ecosystem/sail-operator" (or remove the
replace if upstream tag/version is available) so the project no longer depends
on a personal fork; locate the line containing the exact replace string "replace
github.com/istio-ecosystem/sail-operator =>
github.com/aslakknutsen/sail-operator" and change it to the upstream
module/version or remove the replace entry.
- Line 204: The go.mod entry "istio.io/istio v0.0.0-20260208024451-a30ad73344d7
// indirect" should be re-verified against the OSV scanner findings: locate the
module line and confirm that commit a30ad73344d7 corresponds to an Istio release
or branch/tag that contains fixes for GHSA-7774-7vr3-cc8j, GHSA-856q-xv3c-7f2f,
GHSA-hqxw-mm44-gc4r, GHSA-qcvw-82hh-gq38, and GHSA-xwx5-5c9g-x68x; if it does,
replace the pseudo-version with the canonical release tag or update go.mod
accordingly, otherwise add a documented allowlist/suppression entry in the
vulnerability scanner config referencing the same module string and commit hash
and include a brief justification and link to the upstream commit/PR that shows
the fix.

In `@manifests/00-cluster-role.yaml`:
- Around line 290-315: The ClusterRole currently grants wildcards for full Istio
and Gateway API groups (apiGroups: authentication.istio.io, config.istio.io,
extensions.istio.io, networking.istio.io, rbac.istio.io, security.istio.io,
telemetry.istio.io and gateway.networking.k8s.io / gateway.networking.x-k8s.io)
which is too permissive; replace the "*" resources/verbs with only the explicit
resources and verbs actually needed (e.g., list/get/watch/patch/update on
specific resource kinds the controller touches) for the Istio groups and for
gateway.networking.k8s.io, and plan to remove the gateway.networking.x-k8s.io
entry once filtering lands; update the ClusterRole entries for those apiGroups
to enumerate exact resources and verbs and add a short comment noting removal of
gateway.networking.x-k8s.io in a future change.
- Around line 84-92: The RBAC rule currently grants wildcard verbs ("*") on
high-privilege resources clusterroles, clusterrolebindings, roles, and
rolebindings; replace the wildcard with the minimal required verb set (e.g.,
get, list, watch, create, update, patch, delete only as needed) or split this
single rule into multiple narrowly-scoped Role/ClusterRole entries that each
target only the specific resource(s) and verbs required; update the entry that
references resources clusterroles, clusterrolebindings, roles, and rolebindings
to enumerate explicit verbs and/or separate into distinct roles to avoid blanket
privileges.

---

Nitpick comments:
In `@pkg/operator/controller/gatewayclass/controller_test.go`:
- Around line 484-490: The test is leaking goroutines by calling
fakeHelmInstaller.Start(context.Background()) directly; change it to create a
cancellable context (e.g., ctx, cancel :=
context.WithCancel(context.Background())), pass ctx to
fakeHelmInstaller.Start(ctx) and register cancel with test cleanup (e.g.,
t.Cleanup(cancel)) so that any goroutine started by Start can be stopped; update
the assignment to reconciler.config.SailOperatorReconciler.NotifyCh to use the
cancellable context and ensure Start is invoked only once when constructing the
SailOperatorReconciler/Installer.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between b2beb96 and 83859a8.

⛔ Files ignored due to path filters (280)
  • go.sum is excluded by !**/*.sum
  • vendor/cloud.google.com/go/compute/metadata/CHANGES.md is excluded by !**/vendor/**, !vendor/**
  • vendor/cloud.google.com/go/compute/metadata/metadata.go is excluded by !**/vendor/**, !vendor/**
  • vendor/cloud.google.com/go/compute/metadata/retry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.deepsource.toml is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/CODE_OF_CONDUCT.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/FUNDING.json is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/merge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/dario.cat/mergo/mergo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/constants.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/csi_entry_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/csi_param_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/escape_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/event_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/ground_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/osc_string_state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/parser_actions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/states.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/utilities.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/ansi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/api.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/utilities.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/COPYING is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/decode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/deprecated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/encode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/internal/tz.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/lex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/meta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/parse.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/type_fields.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/BurntSushi/toml/type_toml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/MakeNowJust/heredoc/heredoc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/appveyor.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/cryptorandomstringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/randomstringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/stringutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/goutils/wordutils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/collection.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/constraints.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/crypto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/date.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/dict.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/functions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/numeric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/reflect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/regex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/semver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/sprig/v3/url.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/case.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/delete.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/delete_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/expr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/insert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/insert_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/part.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/placeholder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/row.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/select.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/select_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/squirrel.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/squirrel_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/statement.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/update.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/update_ctx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/squirrel/where.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_os.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/fs_zip.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/gettext.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/locale.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/encoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/message.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/mo/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/formula.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/plural/table.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/comment.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/line_reader.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/message.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/re.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/po/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/tr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/chai2010/gettext-go/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca_grpc.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/NOTICE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/archive/compression/compression.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/archive/compression/compression_fuzzer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/adaptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/content.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/content/helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/errdefs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/errdefs/grpc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/adaptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/parser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/quote.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/filters/scanner.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/annotations.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/diffid.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/handlers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/image.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/importexport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/images/mediatypes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/labels/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/labels/validate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/pkg/randutil/randutil.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/remotes/handlers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/containerd/remotes/resolver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/errdefs/resolve.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/log/context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/.gitattributes is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/compare.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/cpuinfo_other.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/database.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_darwin.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_freebsd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/defaults_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platform_compat_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms_other.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/containerd/platforms/platforms_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/VERSION is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_go120.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_go121.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/join.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/lookup_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/mkdir_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/open_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/openat2_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/openat_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/procfs_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/cyphar/filepath-securejoin/vfs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/envoyproxy/protoc-gen-validate/validate/BUILD is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/merge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/evanphx/json-patch/patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/decoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/path.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/exponent-io/jsonpath/pathaction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/LICENSE.MIT is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error_1_13.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/error_backward.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/join_unwrap_1_20.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/join_unwrap_backward.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/parse_panic.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-errors/errors/stackframe.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/column.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/db.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_mysql.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_oracle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_postgres.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_snowflake.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_sqlite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/dialect_sqlserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/gorp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/index.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/lockerror.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/logging.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/nulltypes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/select.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/table.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/table_bindings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/test_all.sh is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-gorp/gorp/v3/transaction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.cliff.toml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonpointer/.golangci.yml is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (12)
  • cmd/ingress-operator/start.go
  • go.mod
  • manifests/00-cluster-role.yaml
  • manifests/00-custom-resource-definition.yaml
  • pkg/operator/controller/gatewayclass/controller.go
  • pkg/operator/controller/gatewayclass/controller_test.go
  • pkg/operator/controller/gatewayclass/istio_olm.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer.go
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go
  • pkg/operator/controller/gatewayclass/migration.go
  • pkg/operator/controller/test/util/fake.go
  • pkg/operator/operator.go
🚧 Files skipped from review as they are similar to previous changes (3)
  • cmd/ingress-operator/start.go
  • manifests/00-custom-resource-definition.yaml
  • pkg/operator/controller/gatewayclass/istio_sail_installer_test.go

Comment on lines +261 to +268
# Required for Istio installation via Helm
- apiGroups:
- admissionregistration.k8s.io
resources:
- mutatingwebhookconfigurations
- validatingwebhookconfigurations
verbs:
- "*"
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

Full webhook configuration control is high risk.

If possible, scope to specific webhook names and limit verbs to the minimum required.

🧰 Tools
🪛 Trivy (0.69.1)

[error] 262-268: Manage webhookconfigurations

ClusterRole 'openshift-ingress-operator' should not have access to resources ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] for verbs ["create", "update", "patch", "delete", "deletecollection", "impersonate", "*"]

Rule: KSV-0114

Learn more

(IaC/Kubernetes)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@manifests/00-cluster-role.yaml` around lines 261 - 268, The ClusterRole
currently grants wildcard webhook control (apiGroups:
admissionregistration.k8s.io, resources: mutatingwebhookconfigurations and
validatingwebhookconfigurations, verbs: "*"), which is high risk; update the
role to restrict scope by adding resourceNames with the specific webhook names
you need and replace verbs:"*" with the minimal set required (e.g., get, list,
watch, create, update as appropriate) and remove any unnecessary verbs; locate
the block referencing admissionregistration.k8s.io and
mutatingwebhookconfigurations/validatingwebhookconfigurations and add
resourceNames: ["your-mutating-webhook-name","your-validating-webhook-name"] and
tighten verbs accordingly.

Comment on lines +169 to +175
// On OLM we need to watch Subscriptions, InstallPlans and CRDs differently.
// Any change on any subscription, installplan (if ours) or CRD (if Istio or GIE) must:
// - Trigger a new installer enqueue (part of enqueueRequestForSubscriptionChange)
// - Trigger a reconciliation for ALL (and not SOME) classes we manage to add status
isIstioCRD := predicate.NewPredicateFuncs(func(o client.Object) bool {
return strings.Contains(o.GetName(), "istio.io")
})
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 | 🟡 Minor

Fix misleading comment about the non‑OLM branch.

The branch runs when GatewayAPIWithoutOLMEnabled is true, so the comment currently says the opposite.

📝 Suggested edit
-		// On OLM we need to watch Subscriptions, InstallPlans and CRDs differently.
+		// On non-OLM installs we need to watch Subscriptions, InstallPlans and CRDs differently.
📝 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
// On OLM we need to watch Subscriptions, InstallPlans and CRDs differently.
// Any change on any subscription, installplan (if ours) or CRD (if Istio or GIE) must:
// - Trigger a new installer enqueue (part of enqueueRequestForSubscriptionChange)
// - Trigger a reconciliation for ALL (and not SOME) classes we manage to add status
isIstioCRD := predicate.NewPredicateFuncs(func(o client.Object) bool {
return strings.Contains(o.GetName(), "istio.io")
})
// On non-OLM installs we need to watch Subscriptions, InstallPlans and CRDs differently.
// Any change on any subscription, installplan (if ours) or CRD (if Istio or GIE) must:
// - Trigger a new installer enqueue (part of enqueueRequestForSubscriptionChange)
// - Trigger a reconciliation for ALL (and not SOME) classes we manage to add status
isIstioCRD := predicate.NewPredicateFuncs(func(o client.Object) bool {
return strings.Contains(o.GetName(), "istio.io")
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/controller/gatewayclass/controller.go` around lines 169 - 175,
The comment above the isIstioCRD predicate is incorrect: it states "On OLM" but
this branch runs when GatewayAPIWithoutOLMEnabled is true (i.e., the non‑OLM
path). Update the comment surrounding predicate.NewPredicateFuncs (and any
nearby comments referencing Subscriptions/InstallPlans/CRDs) to correctly
reflect that this is the non‑OLM branch (GatewayAPIWithoutOLMEnabled) and
describe the required behavior (enqueue installer and reconcile all managed
classes) so the comment matches the actual condition GatewayAPIWithoutOLMEnabled
and the predicate isIstioCRD.

Comment on lines +143 to +153
//gatewayAPIWithoutOLMEnabled := featureGates.Enabled(features.FeatureGateGatewayAPIWithoutOLM)

gatewayAPIWithoutOLMEnabledBool, ok := os.LookupEnv("GATEWAY_HELM")
if !ok {
gatewayAPIWithoutOLMEnabledBool = "false"
}

gatewayAPIWithoutOLMEnabled, err := strconv.ParseBool(gatewayAPIWithoutOLMEnabledBool)
if err != nil {
return nil, err
}
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

Keep the feature gate as a prerequisite for non‑OLM mode.

Relying solely on GATEWAY_HELM bypasses the cluster feature gate and can enable the path unintentionally. Consider AND‑ing the env flag with the feature gate (or keeping the gate as the default and using the env flag only as an explicit override in dev).

💡 Suggested change
-	gatewayAPIWithoutOLMEnabledBool, ok := os.LookupEnv("GATEWAY_HELM")
-	if !ok {
-		gatewayAPIWithoutOLMEnabledBool = "false"
-	}
-
-	gatewayAPIWithoutOLMEnabled, err := strconv.ParseBool(gatewayAPIWithoutOLMEnabledBool)
-	if err != nil {
-		return nil, err
-	}
+	gatewayAPIWithoutOLMEnabled := featureGates.Enabled(features.FeatureGateGatewayAPIWithoutOLM)
+	if v, ok := os.LookupEnv("GATEWAY_HELM"); ok {
+		parsed, err := strconv.ParseBool(v)
+		if err != nil {
+			return nil, fmt.Errorf("invalid GATEWAY_HELM: %w", err)
+		}
+		gatewayAPIWithoutOLMEnabled = gatewayAPIWithoutOLMEnabled && parsed
+	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/operator/operator.go` around lines 143 - 153, The code currently enables
non‑OLM mode solely from the GATEWAY_HELM env var (gatewayAPIWithoutOLMEnabled)
which bypasses the cluster feature gate; update the logic in operator.go to
require both the cluster feature gate and the env flag (i.e., AND them) by
checking the existing featureGates/feature flag
(features.FeatureGateGatewayAPIWithoutOLM via featureGates.Enabled(...)) and
then only setting gatewayAPIWithoutOLMEnabled = true when that feature gate is
enabled AND strconv.ParseBool(os.LookupEnv("GATEWAY_HELM")) yields true (treat
missing env as false or use env only as explicit override in dev), so
references: gatewayAPIWithoutOLMEnabled, gatewayAPIWithoutOLMEnabledBool,
featureGates, and features.FeatureGateGatewayAPIWithoutOLM.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Feb 25, 2026

@rikatz: 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/hypershift-e2e-aks 83859a8 link true /test hypershift-e2e-aks
ci/prow/e2e-vsphere-static-metallb-operator-gwapi 83859a8 link false /test e2e-vsphere-static-metallb-operator-gwapi
ci/prow/e2e-aws-ovn-serial-1of2 83859a8 link true /test e2e-aws-ovn-serial-1of2
ci/prow/e2e-aws-ovn-hypershift-conformance 83859a8 link true /test e2e-aws-ovn-hypershift-conformance
ci/prow/e2e-azure-operator 83859a8 link true /test e2e-azure-operator
ci/prow/e2e-gcp-operator 83859a8 link true /test e2e-gcp-operator
ci/prow/e2e-aws-operator 83859a8 link true /test e2e-aws-operator
ci/prow/e2e-hypershift 83859a8 link true /test e2e-hypershift
ci/prow/e2e-aws-ovn 83859a8 link true /test e2e-aws-ovn
ci/prow/e2e-aws-ovn-serial-2of2 83859a8 link true /test e2e-aws-ovn-serial-2of2
ci/prow/verify-deps 83859a8 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.

@rikatz rikatz marked this pull request as draft February 25, 2026 13:42
@rikatz
Copy link
Copy Markdown
Member Author

rikatz commented Feb 25, 2026

converted this to draft, to keep it open just so @gcs278 can incorporate the changes

@rikatz
Copy link
Copy Markdown
Member Author

rikatz commented Mar 2, 2026

/close
closing as Grant is already on top of it on the original PR

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 2, 2026
@openshift-merge-robot
Copy link
Copy Markdown
Contributor

PR needs rebase.

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.

@openshift-ci openshift-ci bot closed this Mar 2, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Mar 2, 2026

@rikatz: Closed this PR.

Details

In response to this:

/close
closing as Grant is already on top of it on the original PR

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.

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. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants