Skip to content

ESO-566: Allow overriding operand container args outside the ExternalSecretsConfig API - #174

Merged
openshift-merge-bot[bot] merged 2 commits into
openshift:mainfrom
bharath-b-rh:main
Aug 13, 2026
Merged

ESO-566: Allow overriding operand container args outside the ExternalSecretsConfig API#174
openshift-merge-bot[bot] merged 2 commits into
openshift:mainfrom
bharath-b-rh:main

Conversation

@bharath-b-rh

@bharath-b-rh bharath-b-rh commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add a temporary operator env-var escape hatch to override operand container args via comma-separated --key=value flags:
    • OPERAND_EXTERNAL_SECRETS_ARGS
    • OPERAND_WEBHOOK_ARGS
    • OPERAND_CERT_CONTROLLER_ARGS
    • OPERAND_BITWARDEN_SDK_SERVER_ARGS
  • Merge semantics rebuild desired args from operator defaults, then override matching flag keys / append new ones. Positional base tokens are preserved. Invalid (non---) overrides are rejected as UserConfigurationError and surface as ExternalSecretsConfig Degraded.
  • Marked for removal in v1.4.0 (backport to 1.1/1.2; v1.3.0 advancedOverrides is the migration path).

E2E / test helpers

  • Unit coverage for parse/merge/apply and getDeploymentObject wiring.
  • E2E feature Feature:OverrideOperandArgs sets env through OLM Subscription.spec.config.env (typed OLM APIs), waits until the Ready manager pod has the env, then verifies operand Deployments (including Degraded + recovery).
  • Shared setOperatorManagerEnv / unsetOperatorManagerEnv helpers are reusable for other manager env vars (OPERATOR_LOG_LEVEL, METRICS_*, etc.).

Test plan

  • Unit: go test ./pkg/controller/external_secrets/ -count=1
  • Deploy operator image that includes this change
  • E2E: make test-e2e E2E_GINKGO_LABEL_FILTER="Feature:OverrideOperandArgs"
  • Confirm invalid args mark ESC Degraded with a clear message, and correcting env recovers to Ready
  • Confirm clearing env restores default operand args

Related to #154

Summary by CodeRabbit

  • New Features

    • Added support for overriding controller, webhook, certificate controller, and Bitwarden SDK server container arguments through environment variables.
    • Overrides preserve positional arguments and support adding or replacing flags.
  • Bug Fixes

    • Invalid argument overrides are rejected with clear configuration errors, while corrected settings restore normal deployment behavior.
  • Documentation

    • Documented end-to-end testing and filtering for operand argument overrides.
  • Tests

    • Added comprehensive unit and end-to-end coverage for valid, invalid, and restored argument configurations.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

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

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

This repository is configured in: LGTM mode

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Aug 7, 2026
@openshift-ci-robot

openshift-ci-robot commented Aug 7, 2026

Copy link
Copy Markdown

@bharath-b-rh: This pull request references ESO-566 which is a valid jira issue.

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

Details

In response to this:

Summary

  • Add a temporary operator env-var escape hatch to override operand container args via comma-separated --key=value flags:
  • OPERAND_EXTERNAL_SECRETS_ARGS
  • OPERAND_WEBHOOK_ARGS
  • OPERAND_CERT_CONTROLLER_ARGS
  • OPERAND_BITWARDEN_SDK_SERVER_ARGS
  • Merge semantics rebuild desired args from operator defaults, then override matching flag keys / append new ones. Positional base tokens are preserved. Invalid (non---) overrides are rejected as UserConfigurationError and surface as ExternalSecretsConfig Degraded.
  • Marked for removal in v1.4.0 (backported to 1.1/1.2; v1.3.0 advancedOverrides is the migration path).

E2E / test helpers

  • Unit coverage for parse/merge/apply and getDeploymentObject wiring.
  • E2E feature Feature:OverrideOperandArgs sets env through OLM Subscription.spec.config.env (typed OLM APIs), waits until the Ready manager pod has the env, then verifies operand Deployments (including Degraded + recovery).
  • Shared setOperatorManagerEnv / unsetOperatorManagerEnv helpers are reusable for other manager env vars (OPERATOR_LOG_LEVEL, METRICS_*, etc.).

Test plan

  • Unit: go test ./pkg/controller/external_secrets/ -count=1
  • Deploy operator image that includes this change
  • E2E: make test-e2e E2E_GINKGO_LABEL_FILTER="Feature:OverrideOperandArgs"
  • Confirm invalid args mark ESC Degraded with a clear message, and correcting env recovers to Ready
  • Confirm clearing env restores default operand args

Related to #154

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci

openshift-ci Bot commented Aug 7, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bharath-b-rh

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

The pull request process is described 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

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Aug 7, 2026
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 06367264-6b0d-40c4-b7d6-1c57ce2974ca

📥 Commits

Reviewing files that changed from the base of the PR and between 14e4d2f and 37d0942.

📒 Files selected for processing (2)
  • pkg/controller/external_secrets/deployments.go
  • pkg/controller/external_secrets/deployments_test.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • pkg/controller/external_secrets/deployments.go
  • pkg/controller/external_secrets/deployments_test.go

Walkthrough

The operator now supports environment-based argument overrides for four operand Deployments. It parses and merges -- flags, reports invalid configuration, and adds unit and end-to-end coverage. Module dependencies and E2E OLM client setup were also updated.

Changes

Operand argument overrides

Layer / File(s) Summary
Deployment override flow
pkg/controller/external_secrets/constants.go, pkg/controller/external_secrets/deployments.go
The operator defines override environment variables and applies validated, merged arguments to controller, webhook, cert-controller, and Bitwarden Deployments.
Unit validation
pkg/controller/external_secrets/deployments_test.go
Tests cover parsing, merging, validation errors, container application, deployment generation, and state preservation.
End-to-end configuration flow
test/e2e/helpers_test.go, test/e2e/operand_args_test.go, test/e2e/e2e_suite_test.go, test/e2e/trusted_ca_bundle_test.go, test/e2e/README.md
E2E helpers update manager configuration and verify rollout, operand arguments, degraded status, recovery, cleanup, and OLM scheme registration.
Module dependency refresh
go.mod, cmd/external-secrets-operator/go.mod, test/go.mod, tools/go.mod
Kubernetes, OpenAPI, CEL, gnostic, GenProto, Logrus, and related indirect dependencies were updated or removed.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant E2ESuite
  participant ManagerEnvironment
  participant DeploymentGenerator
  participant OperandDeployment
  participant ExternalSecretsConfig
  E2ESuite->>ManagerEnvironment: Set OPERAND_*_ARGS
  ManagerEnvironment->>DeploymentGenerator: Apply manager environment
  DeploymentGenerator->>OperandDeployment: Generate updated arguments
  E2ESuite->>OperandDeployment: Verify arguments and readiness
  E2ESuite->>ExternalSecretsConfig: Check Ready or Degraded condition
Loading

Possibly related PRs

Suggested reviewers: trilokgeer, siddhibhor-56


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 4 warnings)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error Invalid operand args are embedded with %q in errors; reconciliation logs the full error and writes it to ESC status, so a malformed value can expose a password, token, or API key. Do not include raw argument text in validation errors. Report only the env-var name and a redacted flag key or generic invalid-format message before logging or writing status.
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning The suite has many bare API assertions without diagnostic messages, and AfterAll restores only the Bitwarden provider while setup can add a cluster ESC network policy. Add contextual messages to every cluster assertion. Snapshot and restore the full ExternalSecretsConfig (or remove the added network policy) and clean test-created namespace/secret resources in cleanup.
Microshift Test Compatibility ⚠️ Warning The new Platform:Generic suite has no MicroShift skip protection and uses OLM ClusterServiceVersion/Subscription APIs via setOperatorManagerEnv; operators.coreos.com is unavailable on MicroShift. Add [apigroup:operators.coreos.com] or [Skipped:MicroShift] to the Describe, or guard it with IsMicroShiftCluster and g.Skip(). Verify with a MicroShift E2E job.
Ipv6 And Disconnected Network Test Compatibility ⚠️ Warning The new suite calls ensureBitwardenOperandReady, which creates a reachability pod using hardcoded docker.io/curlimages/curl:latest; disconnected CI may need public registry access. IPv6 and disconnected network compatibility notice: run /payload-job periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv6; mirror the curl image or skip disconnected runs.
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: environment-based overrides for operand container arguments outside the ExternalSecretsConfig API.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed The added E2E suite uses only fixed Describe and It strings; no titles contain pod names, namespaces, timestamps, UUIDs, nodes, IPs, or generated values.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The new OverrideOperandArgs suite checks Deployment args, configuration status, and pod readiness; searches found no node-count, topology, affinity, failover, rescheduling, or multi-endpoint assump...
Topology-Aware Scheduling Compatibility ✅ Passed The PR adds only operand argument overrides and E2E helpers; no replicas, affinity, topology spread, node selectors, tolerations, or PDB constraints were added, and deployment assets are unchanged.
Ote Binary Stdout Contract ✅ Passed Changed suite setup only registers the OLM scheme; its startup message uses GinkgoWriter, and no changed process-level code writes to stdout or configures logging to stdout.
No-Weak-Crypto ✅ Passed The patch adds no MD5, SHA1, DES, RC4, Blowfish, or ECB use, custom crypto, or secret comparisons; comparisons only handle CLI args and E2E configuration.
Container-Privileges ✅ Passed The PR adds no privilege-related manifest changes; operand generation enforces no escalation, drops ALL capabilities, and runs non-root, while hostNetwork is false and no enabled host or SYS_ADMIN...
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

Error: build linters: unable to load custom analyzer "kubeapilinter": bin/kube-api-linter.so, plugin: not implemented
The command is terminated due to an error: build linters: unable to load custom analyzer "kubeapilinter": bin/kube-api-linter.so, plugin: not implemented


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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (3)
pkg/controller/external_secrets/deployments.go (1)

843-872: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider returning a clone for the empty-override path.

mergeContainerArgs returns base directly when overrides is empty, but returns a clone otherwise. The inconsistent aliasing is harmless today because the caller assigns the result back to the same field. A clone in both paths removes the aliasing surprise for future callers.

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

In `@pkg/controller/external_secrets/deployments.go` around lines 843 - 872,
Update mergeContainerArgs so it returns a clone of base when overrides is empty,
matching the cloned result used for non-empty overrides and avoiding direct
slice aliasing.
test/e2e/helpers_test.go (1)

438-464: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Sort the appended env var names to keep the merge deterministic.

The loop at Line 457 iterates a Go map, so the append order of new env vars varies between calls. Each call to setOperatorManagerEnv with the same four OPERAND_*_ARGS values can therefore produce a different Env slice order. That order change is a spec diff, so it triggers an extra operator rollout and lengthens the wait in waitForOperatorManagerEnv.

Also, Line 452 duplicates the assignment on Line 455 and can be removed.

♻️ Proposed fix for deterministic ordering
 	for _, env := range existing {
 		if _, drop := remove[env.Name]; drop {
 			continue
 		}
 		if val, ok := set[env.Name]; ok {
 			env.Value = val
 			env.ValueFrom = nil
-			seen[env.Name] = true
 		}
 		out = append(out, env)
 		seen[env.Name] = true
 	}
-	for name, val := range set {
-		if seen[name] {
-			continue
-		}
-		out = append(out, corev1.EnvVar{Name: name, Value: val})
-	}
+	names := make([]string, 0, len(set))
+	for name := range set {
+		if !seen[name] {
+			names = append(names, name)
+		}
+	}
+	sort.Strings(names)
+	for _, name := range names {
+		out = append(out, corev1.EnvVar{Name: name, Value: set[name]})
+	}
 	return out

Add "sort" to the imports.

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

In `@test/e2e/helpers_test.go` around lines 438 - 464, Update mergeEnvVars to sort
the keys from set before appending new corev1.EnvVar entries, preserving
deterministic Env slice ordering across calls; add the required sort import.
Remove the redundant seen[env.Name] assignment inside the set-update branch,
keeping the assignment after the branch.
test/e2e/operand_args_test.go (1)

190-224: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Confirm the coupling between the positional-override spec and the recovery spec.

The spec at Line 190 leaves OPERAND_WEBHOOK_ARGS="webhook,--port=10251" set. The spec at Line 208 depends on that Degraded state. The Ordered decorator preserves the order, but a label filter or --focus that selects only the recovery spec makes its first assertion at Line 211 fail. Consider moving the invalid-args setup into the recovery spec itself so the spec is self-contained.

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

In `@test/e2e/operand_args_test.go` around lines 190 - 224, Make the recovery spec
“should recover from Degraded when invalid OPERAND_*_ARGS are corrected”
self-contained by applying the invalid webhook positional override within that
spec before asserting Degraded. Do not rely on the preceding positional-override
spec or execution order; retain the existing correction, readiness wait, and
valid-override verification flow.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmd/external-secrets-operator/go.mod`:
- Around line 32-48: Upgrade github.com/google/cel-go from v0.27.0 to v0.29.0 in
both dependency graphs, regenerate dependent artifacts, and preserve checksum
validation without changes. Update affected entries in
cmd/external-secrets-operator/go.mod lines 32-48, 80, and 89-90; go.mod lines
28-43; test/go.mod lines 12-14, 36-52, and 73; and tools/go.mod lines 90-103,
129-130, 215, 260, and 270-271. Document the license review for
github.com/operator-framework/api v0.42.0 and ensure releases generate SBOMs,
provenance attestations, and signed artifacts.

In `@test/e2e/helpers_test.go`:
- Around line 348-360: Update the CSV listing error handling in findOperatorCSV
to also tolerate Kubernetes API no-match errors by checking
meta.IsNoMatchError(err) alongside k8serrors.IsNotFound(err). Add the required
api/meta import, while preserving propagation of all other list errors so
non-OLM clusters can fall back to the Deployment path.

In `@test/e2e/operand_args_test.go`:
- Around line 94-95: Update the suite cleanup around ensureBitwardenOperandReady
so the Bitwarden plugin enabled during BeforeAll is disabled and its Deployment
is removed in AfterAll, restoring the shared ExternalSecretsConfig for later
suites. Ensure the cleanup covers the setup at the referenced provisioning block
and the related setup lines 104-115, while preserving existing operator
environment-variable cleanup.

In `@test/e2e/README.md`:
- Line 140: Move the OverrideOperandArgs row out of the e2e_test.go table in the
README, then add a separate operand_args_test.go heading and table containing
that row, matching the structure used for trusted_ca_bundle_test.go.

---

Nitpick comments:
In `@pkg/controller/external_secrets/deployments.go`:
- Around line 843-872: Update mergeContainerArgs so it returns a clone of base
when overrides is empty, matching the cloned result used for non-empty overrides
and avoiding direct slice aliasing.

In `@test/e2e/helpers_test.go`:
- Around line 438-464: Update mergeEnvVars to sort the keys from set before
appending new corev1.EnvVar entries, preserving deterministic Env slice ordering
across calls; add the required sort import. Remove the redundant seen[env.Name]
assignment inside the set-update branch, keeping the assignment after the
branch.

In `@test/e2e/operand_args_test.go`:
- Around line 190-224: Make the recovery spec “should recover from Degraded when
invalid OPERAND_*_ARGS are corrected” self-contained by applying the invalid
webhook positional override within that spec before asserting Degraded. Do not
rely on the preceding positional-override spec or execution order; retain the
existing correction, readiness wait, and valid-override verification flow.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 8eab44f7-e466-46c5-a438-584b33fdf6ca

📥 Commits

Reviewing files that changed from the base of the PR and between 65f39bd and efc09ba.

⛔ Files ignored due to path filters (202)
  • cmd/external-secrets-operator/go.sum is excluded by !**/*.sum
  • go.sum is excluded by !**/*.sum
  • go.work is excluded by !**/*.work
  • go.work.sum is excluded by !**/*.sum
  • test/go.sum is excluded by !**/*.sum
  • tools/go.sum is excluded by !**/*.sum
  • 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/**
  • vendor/github.com/go-openapi/jsonreference/.editorconfig is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/NOTICE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/jsonreference/reference.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/.codecov.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/.mockery.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/convert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/convert_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/format.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/sizeof.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/type_constraints.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/path.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/go.work is excluded by !**/*.work, !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/go.work.sum is excluded by !**/*.sum, !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname/name_provider.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/concat.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/loading.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/yaml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/initialism_index.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/name_lexem.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/name_mangler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/pools.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/split.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/string_bytes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils/net.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/collection_formats.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/yaml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/BUILD.bazel is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/env.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/folding.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/library.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/optimizer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/program.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/templates/authoring.tmpl is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/cel/validator.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/checker/checker.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/checker/env.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/checker/scopes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/ast/ast.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/debug/debug.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/env/BUILD.bazel is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/env/env.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/BUILD.bazel is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/bool.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/bytes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/double.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/duration.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/int.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/json_value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/null.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/object.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/pb/type.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/string.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/timestamp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/common/types/uint.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/bindings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/comprehensions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/extension_option_factory.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/formatting_v2.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/native.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/ext/regex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/interpreter/attribute_patterns.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/interpreter/attributes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/interpreter/interpretable.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/interpreter/interpreter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/interpreter/planner.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/cel-go/parser/helper.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/gnostic-models/extensions/extension.proto is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.proto is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/gnostic-models/openapiv3/annotations.proto is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/intern.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/license.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/buffer/pool.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/bytestostr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/lexer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jwriter/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/raw.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/unknown_fields.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/lib/release/release.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/lib/version/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/lib/version/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/lib/version/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/operator-framework/api/pkg/operators/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/installplan_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/subscription_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/sirupsen/logrus/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/appveyor.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/entry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/logger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/logrus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/terminal_check_bsd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/terminal_check_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/terminal_check_wasi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/terminal_check_wasip1.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/sirupsen/logrus/text_formatter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/camel.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/helper.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/kebab.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/stoewer/go-strcase/snake.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (12)
  • cmd/external-secrets-operator/go.mod
  • go.mod
  • pkg/controller/external_secrets/constants.go
  • pkg/controller/external_secrets/deployments.go
  • pkg/controller/external_secrets/deployments_test.go
  • test/e2e/README.md
  • test/e2e/e2e_suite_test.go
  • test/e2e/helpers_test.go
  • test/e2e/operand_args_test.go
  • test/e2e/trusted_ca_bundle_test.go
  • test/go.mod
  • tools/go.mod

Comment thread cmd/external-secrets-operator/go.mod
Comment thread test/e2e/helpers_test.go
Comment thread test/e2e/operand_args_test.go
Comment thread test/e2e/README.md Outdated
… typed OLM e2e helpers

Signed-off-by: Bharath B <bhb@redhat.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@pkg/controller/external_secrets/deployments.go`:
- Around line 852-857: Update the custom argument validation in the surrounding
mergeContainerArgs logic to reject tokens whose parsed flag key from argFlagKey
is exactly "--", including "--=value", before appending the override. Preserve
the existing UserConfigurationError path and add a test covering the invalid
"--=value" input and resulting ExternalSecretsConfig degradation.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 9eec041a-409d-4dbe-ab37-aca17b701ec3

📥 Commits

Reviewing files that changed from the base of the PR and between 131ecea and 14e4d2f.

⛔ Files ignored due to path filters (1)
  • tools/go.sum is excluded by !**/*.sum
📒 Files selected for processing (3)
  • pkg/controller/external_secrets/deployments.go
  • pkg/controller/external_secrets/deployments_test.go
  • test/e2e/operand_args_test.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • test/e2e/operand_args_test.go
  • pkg/controller/external_secrets/deployments_test.go

Comment thread pkg/controller/external_secrets/deployments.go
…SecretsConfig API

Signed-off-by: Bharath B <bhb@redhat.com>
@mytreya-rh

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Aug 13, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-operator-coverage

@bharath-b-rh

Copy link
Copy Markdown
Contributor Author

adding below labels based on the CI results
/label docs-approved
/label px-approved
/label qe-approved

@openshift-ci openshift-ci Bot added docs-approved Signifies that Docs has signed off on this PR px-approved Signifies that Product Support has signed off on this PR qe-approved Signifies that QE has signed off on this PR labels Aug 13, 2026
@openshift-ci

openshift-ci Bot commented Aug 13, 2026

Copy link
Copy Markdown

@bharath-b-rh: all tests passed!

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.

@openshift-merge-bot
openshift-merge-bot Bot merged commit ee83c2e into openshift:main Aug 13, 2026
10 checks passed
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 5.37634% with 88 lines in your changes missing coverage. Please review.
✅ Project coverage is 45.00%. Comparing base (65f39bd) to head (37d0942).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
pkg/controller/external_secrets/deployments.go 5.37% 84 Missing and 4 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #174      +/-   ##
==========================================
- Coverage   46.26%   45.00%   -1.27%     
==========================================
  Files          31       31              
  Lines        5464     5557      +93     
==========================================
- Hits         2528     2501      -27     
- Misses       2628     2739     +111     
- Partials      308      317       +9     
Flag Coverage Δ
e2e 45.00% <5.37%> (-1.27%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. docs-approved Signifies that Docs has signed off on this PR jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. px-approved Signifies that Product Support has signed off on this PR qe-approved Signifies that QE has signed off on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants