Skip to content

NO-ISSUE: Synchronize From Upstream Repositories#1330

Open
openshift-bot wants to merge 7 commits into
openshift:mainfrom
openshift-bot:synchronize-upstream
Open

NO-ISSUE: Synchronize From Upstream Repositories#1330
openshift-bot wants to merge 7 commits into
openshift:mainfrom
openshift-bot:synchronize-upstream

Conversation

@openshift-bot

@openshift-bot openshift-bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

The staging/ and vendor/ directories have been synchronized from the upstream repositories, pulling in the following commits:

Date Commit Author Message
2026-06-18 07:31:04 operator-framework/operator-lifecycle-manager@97cb2b1 dependabot[bot] 🌱 Bump the k8s-dependencies group across 1 directory with 8 updates (#3850)
2026-06-18 13:37:45 operator-framework/operator-lifecycle-manager@2c667c3 Todd Short Apply cluster TLS security profile to packageserver serving options (#3849)
2026-06-23 07:05:56 operator-framework/operator-lifecycle-manager@35f77a9 dependabot[bot] Bump actions/checkout from 6 to 7 (#3855)
2026-06-23 07:08:39 operator-framework/operator-lifecycle-manager@7cdad36 dependabot[bot] 🌱 Bump github.com/onsi/ginkgo/v2 from 2.31.0 to 2.32.0 (#3856)
2026-06-23 07:11:16 operator-framework/operator-lifecycle-manager@d5481e0 dependabot[bot] 🌱 Bump github.com/prometheus/common from 0.68.1 to 0.69.0 (#3857)
2026-06-23 17:29:37 operator-framework/operator-lifecycle-manager@a2d2380 Chiman Jain Upgrade hashstructure and mapstructure to v2 (#3854)
2026-06-24 12:28:18 operator-framework/operator-lifecycle-manager@27ef382 dependabot[bot] 🌱 Bump github.com/containerd/containerd from 1.7.32 to 1.7.33 (#3858)

This pull request is expected to merge without any human intervention. If tests are failing here, changes must land upstream to fix any issues so that future downstreaming efforts succeed.

/assign @openshift/openshift-team-operator-runtime

Summary by CodeRabbit

  • New Features
    • Improved TLS handling for the package server by automatically adopting the cluster’s secure defaults when no custom TLS settings are provided.
  • Bug Fixes
    • Expanded permissions so the operator can read the cluster API server configuration needed for startup.
    • Updated several dependencies and CI actions to newer versions for better stability and compatibility.
  • Tests
    • Added coverage for cluster TLS fallback behavior across OpenShift and non-OpenShift environments.

@openshift-bot openshift-bot added approved Indicates a PR has been approved by an approver from all required OWNERS files. lgtm Indicates that a PR is ready to be merged. labels Jun 19, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@openshift-bot: This pull request explicitly references no jira issue.

Details

In response to this:

The staging/ and vendor/ directories have been synchronized from the upstream repositories, pulling in the following commits:

Date Commit Author Message
2026-06-18 07:31:04 operator-framework/operator-lifecycle-manager@97cb2b1 dependabot[bot] 🌱 Bump the k8s-dependencies group across 1 directory with 8 updates (#3850)
2026-06-18 13:37:45 operator-framework/operator-lifecycle-manager@2c667c3 Todd Short Apply cluster TLS security profile to packageserver serving options (#3849)

This pull request is expected to merge without any human intervention. If tests are failing here, changes must land upstream to fix any issues so that future downstreaming efforts succeed.

/assign @openshift/openshift-team-operator-runtime

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-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jun 19, 2026
@coderabbitai

coderabbitai Bot commented Jun 19, 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: 7739ceb7-00ff-435e-b11e-250f60276131

📥 Commits

Reviewing files that changed from the base of the PR and between 02b58a8 and 80043d4.

⛔ Files ignored due to path filters (53)
  • go.sum is excluded by !**/*.sum
  • staging/operator-lifecycle-manager/go.sum is excluded by !**/*.sum
  • 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/version/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.editorconfig is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.envrc is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.golangci.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/decode_hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.lock is excluded by !**/*.lock, !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.nix is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/join.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/join_go1_19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/mapstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/reflect_go1_19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/reflect_go1_20.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/hashstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/include.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/decode_hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/comparison/equal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/server/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/expfmt.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/text_create.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/text_parse.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/labelset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/metric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/time.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value_float.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value_histogram.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (16)
  • go.mod
  • pkg/manifests/csv.yaml
  • staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
  • staging/operator-lifecycle-manager/.github/workflows/go-verdiff.yaml
  • staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
  • staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
  • staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
  • staging/operator-lifecycle-manager/.github/workflows/unit.yml
  • staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml
  • staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
  • staging/operator-lifecycle-manager/go.mod
  • staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go
  • staging/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go
  • staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go
✅ Files skipped from review due to trivial changes (5)
  • staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
  • staging/operator-lifecycle-manager/.github/workflows/go-verdiff.yaml
  • staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
  • staging/operator-lifecycle-manager/.github/workflows/unit.yml
  • staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
🚧 Files skipped from review as they are similar to previous changes (11)
  • staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml
  • staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go
  • staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
  • staging/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go
  • pkg/manifests/csv.yaml
  • staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
  • staging/operator-lifecycle-manager/pkg/package-server/server/server.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go
  • staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go
  • staging/operator-lifecycle-manager/go.mod
  • go.mod

Walkthrough

PackageServer now applies the OpenShift cluster APIServer TLS profile at startup when no TLS minimum version is set. RBAC manifests grant APIServer read access, dependencies are refreshed, and several GitHub Actions workflows switch to checkout v7.

Changes

PackageServer TLS fallback and RBAC

Layer / File(s) Summary
RBAC for APIServer read access
pkg/manifests/csv.yaml, staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml, staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
Adds a get rule for config.openshift.io apiservers scoped to resourceNames: cluster.
PackageServer TLS fallback
staging/operator-lifecycle-manager/pkg/package-server/server/server.go
Builds the REST config before configuration, then applies the cluster APIServer TLS profile when serving TLS settings are unset, using new helper functions.
TLS fallback tests
staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go
Adds tests for non-OpenShift, Intermediate, Modern, precedence, and missing-CR paths in applyClusterTLSProfileWithClients.

Dependency and workflow updates

Layer / File(s) Summary
Dependency and import migration
go.mod, staging/operator-lifecycle-manager/go.mod, staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go, staging/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go, staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go
Updates Kubernetes, Ginkgo, Prometheus, and containerd versions, and switches mapstructure/hashstructure usage to the v2 packages.
Workflow checkout updates
staging/operator-lifecycle-manager/.github/workflows/*.yml, staging/operator-lifecycle-manager/.github/workflows/*.yaml
Updates checkout steps in multiple workflows from actions/checkout@v6 to actions/checkout@v7.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 14 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title matches the sync-from-upstream theme, but it is generic and does not describe the main change set clearly. Use a more specific title that names the primary update, such as the packageserver TLS profile or dependency/workflow sync.
✅ Passed checks (14 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 90.91% which is sufficient. The required threshold is 80.00%.
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 only added test file uses static Go test names; no Ginkgo titles or dynamic values were found in changed tests.
Test Structure And Quality ✅ Passed The added tests are isolated unit tests with clear assertions, no shared cluster resources, no waits/timeouts needed, and they match existing plain-testing patterns.
Microshift Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; the new test file uses plain testing.T, and no It/Describe/Context/When declarations were found.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; the new server_test.go uses stdlib testing only and shows no multi-node or SNO-unsafe assumptions.
Topology-Aware Scheduling Compatibility ✅ Passed Diff only adds APIServer RBAC and dep bumps; no new affinity, tolerations, replicas, or nodeSelector changes were introduced.
Ote Binary Stdout Contract ✅ Passed Changed process-level code adds only logrus warnings; no stdout writes or new main/TestMain/RunSpecs setup were introduced in the PR.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed Only a standard Go unit test was added; no Ginkgo e2e tests, IPv4 assumptions, or external connectivity requirements are present.
No-Weak-Crypto ✅ Passed No weak crypto added; targeted searches found no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB or secret/token comparisons in changed code.
Container-Privileges ✅ Passed Touched manifests only add RBAC for config.openshift.io apiservers; no privileged:true, hostPID/Network/IPC, SYS_ADMIN, root, or allowPrivilegeEscalation:true found.
No-Sensitive-Data-In-Logs ✅ Passed No logs expose secrets/PII/hostnames; the new TLS-profile info log only prints minTLSVersion and cipher suites, which aren’t sensitive.

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

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

🔧 Trivy (0.69.3)

Trivy execution failed: 2026-06-25T00:07:00Z FATAL Fatal error run error: fs scan error: scan error: scan failed: failed analysis: post analysis error: post analysis error: helm scan error: fs filter error: fs filter error: walk error range error: stat .golangci.yml: no such file or directory: range error: stat .golangci.yml: no such file or directory


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

@openshift-ci openshift-ci Bot requested review from dtfranz and oceanc80 June 19, 2026 00:03

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

🧹 Nitpick comments (1)
staging/operator-lifecycle-manager/pkg/package-server/server/server.go (1)

391-396: Use non-panicking TLS conversion functions for defensive robustness.

While libcrypto.TLSVersionToNameOrDie and CipherSuitesToNamesOrDie will panic on invalid input, the values passed to them come from olmapiserver.GetSecurityProfileConfig, which either returns hardcoded values from predefined profiles or reads from the OpenShift APIServer object (which has upstream validation). In practice, upstream validation prevents invalid TLSSecurityProfile objects from being stored, making a panic unlikely. However, for defensive programming, consider using the non-panicking variants (TLSVersionToName, CipherSuitesToNames) with proper error handling, or add explicit validation that the profile values are supported before conversion.

🤖 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 `@staging/operator-lifecycle-manager/pkg/package-server/server/server.go`
around lines 391 - 396, Replace the panicking versions of the TLS conversion
functions with their non-panicking equivalents for better defensive programming.
In the block where MinTLSVersion is set, replace the call to
libcrypto.TLSVersionToNameOrDie with libcrypto.TLSVersionToName and add proper
error handling for the returned error. Similarly, replace
libcrypto.CipherSuitesToNamesOrDie with libcrypto.CipherSuitesToNames in the
CipherSuites assignment and handle any returned error appropriately, such as
logging the error and returning it from the function or using a fallback value.
🤖 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.

Nitpick comments:
In `@staging/operator-lifecycle-manager/pkg/package-server/server/server.go`:
- Around line 391-396: Replace the panicking versions of the TLS conversion
functions with their non-panicking equivalents for better defensive programming.
In the block where MinTLSVersion is set, replace the call to
libcrypto.TLSVersionToNameOrDie with libcrypto.TLSVersionToName and add proper
error handling for the returned error. Similarly, replace
libcrypto.CipherSuitesToNamesOrDie with libcrypto.CipherSuitesToNames in the
CipherSuites assignment and handle any returned error appropriately, such as
logging the error and returning it from the function or using a fallback value.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 9bb5a6f0-3eb8-49c9-bf46-4e397c168c33

📥 Commits

Reviewing files that changed from the base of the PR and between 3222549 and 04d0e39.

⛔ Files ignored due to path filters (5)
  • go.sum is excluded by !**/*.sum
  • staging/operator-lifecycle-manager/go.sum is excluded by !**/*.sum
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/server/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (7)
  • go.mod
  • pkg/manifests/csv.yaml
  • staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml
  • staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
  • staging/operator-lifecycle-manager/go.mod
  • staging/operator-lifecycle-manager/pkg/package-server/server/server.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go

@tmshort

tmshort commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

/test okd-scos-images

@perdasilva

Copy link
Copy Markdown
Contributor

/retest

@tmshort

tmshort commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

/test e2e-upgrade

@tmshort

tmshort commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

/retest

5 similar comments
@perdasilva

Copy link
Copy Markdown
Contributor

/retest

@tmshort

tmshort commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

/retest

@tmshort

tmshort commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

/retest

@tmshort

tmshort commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

/retest

@tmshort

tmshort commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

/retest

@openshift-bot openshift-bot force-pushed the synchronize-upstream branch from 04d0e39 to 02b58a8 Compare June 24, 2026 00:04
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 24, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go`:
- Around line 28-35: The NewHashEqualitor function uses panic calls when
hashstructure.Hash errors occur (for both hashA and hashB hash computations),
which will crash the controller in production when reconciling subscriptions.
Replace both panic(err.Error()) calls with a non-panicking fallback behavior
such as returning false, so the equality check can gracefully handle hashing
failures without interrupting controller stability.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: c29888ed-d6fa-444c-80f7-cc174c3d6850

📥 Commits

Reviewing files that changed from the base of the PR and between 04d0e39 and 02b58a8.

⛔ Files ignored due to path filters (50)
  • go.sum is excluded by !**/*.sum
  • staging/operator-lifecycle-manager/go.sum is excluded by !**/*.sum
  • vendor/github.com/go-viper/mapstructure/v2/.editorconfig is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.envrc is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/.golangci.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/decode_hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.lock is excluded by !**/*.lock, !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.nix is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/devenv.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/join.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/internal/errors/join_go1_19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/mapstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/reflect_go1_19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-viper/mapstructure/v2/reflect_go1_20.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/hashstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/hashstructure/v2/include.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/decode_hooks.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mitchellh/mapstructure/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/comparison/equal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/server/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/expfmt.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/text_create.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/expfmt/text_parse.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/labels.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/labelset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/metric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/time.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value_float.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/prometheus/common/model/value_histogram.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (16)
  • go.mod
  • pkg/manifests/csv.yaml
  • staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
  • staging/operator-lifecycle-manager/.github/workflows/go-verdiff.yaml
  • staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
  • staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
  • staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
  • staging/operator-lifecycle-manager/.github/workflows/unit.yml
  • staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml
  • staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
  • staging/operator-lifecycle-manager/go.mod
  • staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go
  • staging/operator-lifecycle-manager/pkg/lib/codec/mapstructure.go
  • staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go
✅ Files skipped from review due to trivial changes (5)
  • pkg/manifests/csv.yaml
  • staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
  • staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
  • staging/operator-lifecycle-manager/.github/workflows/unit.yml
  • staging/operator-lifecycle-manager/.github/workflows/go-verdiff.yaml
🚧 Files skipped from review as they are similar to previous changes (4)
  • staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml
  • staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.clusterserviceversion.yaml
  • staging/operator-lifecycle-manager/pkg/package-server/server/server.go
  • staging/operator-lifecycle-manager/pkg/package-server/server/server_test.go

Comment on lines +28 to 35
hashA, err := hashstructure.Hash(a, hashstructure.FormatV2, nil)
if err != nil {
panic(err.Error())
}

hashB, err := hashstructure.Hash(b, nil)
hashB, err := hashstructure.Hash(b, hashstructure.FormatV2, nil)
if err != nil {
panic(err.Error())

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Non-test call sites of NewHashEqualitor:"
rg -nP --type go '\bNewHashEqualitor\s*\(' staging/operator-lifecycle-manager -g '!**/*_test.go'

echo
echo "Test-only call sites of NewHashEqualitor:"
rg -nP --type go '\bNewHashEqualitor\s*\(' staging/operator-lifecycle-manager -g '**/*_test.go'

echo
echo "Current panic usage in equal comparator:"
rg -nP --type go 'panic\s*\(' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

Repository: openshift/operator-framework-olm

Length of output: 693


🏁 Script executed:

# Examine the usage in state.go line 353
sed -n '340,370p' staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription/state.go

# Also check if there's any error handling around hashEqual calls
rg -A 5 -B 5 'hashEqual\s*\(' staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription/state.go

Repository: openshift/operator-framework-olm

Length of output: 1770


🏁 Script executed:

# Check what types are being hashed (conditions, which are typically simple structs)
# and verify the impact of hash failures
rg -B 10 'if hashEqual' staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription/state.go | head -40

# Also check if there are any recent issues or discussions about this
rg -A 3 'NewHashEqualitor' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

Repository: openshift/operator-framework-olm

Length of output: 1187


🏁 Script executed:

# Get the full NewHashEqualitor function implementation
sed -n '26,45p' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

# Check what hashstructure is and where it comes from
rg -B 2 'hashstructure\.Hash' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go | head -10

# Verify Conditions type to understand what's being hashed
rg 'Status\.Conditions' staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription/state.go | head -5

Repository: openshift/operator-framework-olm

Length of output: 892


🏁 Script executed:

# Check imports to see what hashstructure library is used
head -20 staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

# Look for any existing error handling patterns in this file
cat staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

# Check if there are any test cases showing when hashstructure.Hash might fail
rg 'hashstructure\.Hash' staging/operator-lifecycle-manager -A 2 -B 2

Repository: openshift/operator-framework-olm

Length of output: 2586


🏁 Script executed:

# Check if there are any comments or documentation about why panic was chosen
rg -B 5 -A 10 'panic' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

# Verify this is the only place where NewHashEqualitor is instantiated
rg 'var hashEqual' staging/operator-lifecycle-manager -r

Repository: openshift/operator-framework-olm

Length of output: 1191


🏁 Script executed:

# Check if there are any comments about why panic was chosen
sed -n '20,50p' staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go

# Verify this is the only place where NewHashEqualitor is instantiated
rg 'var hashEqual' staging/operator-lifecycle-manager

Repository: openshift/operator-framework-olm

Length of output: 913


Remove panics on hash failures in NewHashEqualitor.

This function is used in production code (pkg/controller/operators/catalog/subscription/state.go:353) within subscription reconciliation logic. Panics on hashstructure.Hash errors will crash the controller or interrupt reconciliation. Replace panic calls with a non-panicking fallback (e.g., return false) to preserve controller stability.

Suggested fix
 func NewHashEqualitor() EqualFunc {
 	return func(a, b interface{}) bool {
 		hashA, err := hashstructure.Hash(a, hashstructure.FormatV2, nil)
 		if err != nil {
-			panic(err.Error())
+			return false
 		}
 
 		hashB, err := hashstructure.Hash(b, hashstructure.FormatV2, nil)
 		if err != nil {
-			panic(err.Error())
+			return false
 		}
 
 		return hashA == hashB
 	}
 }
📝 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
hashA, err := hashstructure.Hash(a, hashstructure.FormatV2, nil)
if err != nil {
panic(err.Error())
}
hashB, err := hashstructure.Hash(b, nil)
hashB, err := hashstructure.Hash(b, hashstructure.FormatV2, nil)
if err != nil {
panic(err.Error())
func NewHashEqualitor() EqualFunc {
return func(a, b interface{}) bool {
hashA, err := hashstructure.Hash(a, hashstructure.FormatV2, nil)
if err != nil {
return false
}
hashB, err := hashstructure.Hash(b, hashstructure.FormatV2, nil)
if err != nil {
return false
}
return hashA == hashB
}
}
🤖 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 `@staging/operator-lifecycle-manager/pkg/lib/comparison/equal.go` around lines
28 - 35, The NewHashEqualitor function uses panic calls when hashstructure.Hash
errors occur (for both hashA and hashB hash computations), which will crash the
controller in production when reconciling subscriptions. Replace both
panic(err.Error()) calls with a non-panicking fallback behavior such as
returning false, so the equality check can gracefully handle hashing failures
without interrupting controller stability.

@tmshort

tmshort commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

/retest

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

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jun 24, 2026
dependabot Bot and others added 6 commits June 25, 2026 00:03
…#3850)

Bumps the k8s-dependencies group with 3 updates in the / directory: [k8s.io/api](https://github.com/kubernetes/api), [k8s.io/apiextensions-apiserver](https://github.com/kubernetes/apiextensions-apiserver) and [k8s.io/kube-aggregator](https://github.com/kubernetes/kube-aggregator).

Updates `k8s.io/api` from 0.36.1 to 0.36.2
- [Commits](kubernetes/api@v0.36.1...v0.36.2)

Updates `k8s.io/apiextensions-apiserver` from 0.36.1 to 0.36.2
- [Release notes](https://github.com/kubernetes/apiextensions-apiserver/releases)
- [Commits](kubernetes/apiextensions-apiserver@v0.36.1...v0.36.2)

Updates `k8s.io/apimachinery` from 0.36.1 to 0.36.2
- [Commits](kubernetes/apimachinery@v0.36.1...v0.36.2)

Updates `k8s.io/apiserver` from 0.36.1 to 0.36.2
- [Commits](kubernetes/apiserver@v0.36.1...v0.36.2)

Updates `k8s.io/client-go` from 0.36.1 to 0.36.2
- [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
- [Commits](kubernetes/client-go@v0.36.1...v0.36.2)

Updates `k8s.io/code-generator` from 0.36.1 to 0.36.2
- [Commits](kubernetes/code-generator@v0.36.1...v0.36.2)

Updates `k8s.io/component-base` from 0.36.1 to 0.36.2
- [Commits](kubernetes/component-base@v0.36.1...v0.36.2)

Updates `k8s.io/kube-aggregator` from 0.36.1 to 0.36.2
- [Commits](kubernetes/kube-aggregator@v0.36.1...v0.36.2)

---
updated-dependencies:
- dependency-name: k8s.io/api
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/apiextensions-apiserver
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/apimachinery
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/apiserver
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/client-go
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/code-generator
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/component-base
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
- dependency-name: k8s.io/kube-aggregator
  dependency-version: 0.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: k8s-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: 97cb2b13b52d6cbe6a90e135b9e1bcb2ab95dd1d
…#3849)

Read the OpenShift APIServer CR at startup to apply the cluster-wide TLS
security profile (min version and cipher suites) to the packageserver's
SecureServingOptions when --tls-min-version is not already set via flags.
Includes a 30s timeout on the API lookup and fails closed if the profile
cannot be applied. Adds RBAC to allow reading apiservers.config.openshift.io.

Signed-off-by: Todd Short <tshort@redhat.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: 2c667c31ade5ff0a05f009a8529b6d4104b577a7
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: 35f77a927765fd487b7abcad8c4d1b9e94b536c7
Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.31.0 to 2.32.0.
- [Release notes](https://github.com/onsi/ginkgo/releases)
- [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md)
- [Commits](onsi/ginkgo@v2.31.0...v2.32.0)

---
updated-dependencies:
- dependency-name: github.com/onsi/ginkgo/v2
  dependency-version: 2.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: 7cdad362a110fad4926917f2b6bee2a70ac5d3a1
Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.68.1 to 0.69.0.
- [Release notes](https://github.com/prometheus/common/releases)
- [Changelog](https://github.com/prometheus/common/blob/main/CHANGELOG.md)
- [Commits](prometheus/common@v0.68.1...v0.69.0)

---
updated-dependencies:
- dependency-name: github.com/prometheus/common
  dependency-version: 0.69.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: d5481e01953e2621548c826583d0b476dc5d0554
* chore: upgrade hashstructure and mapstructure to v2

Signed-off-by: Chiman Jain <chimanjain15@gmail.com>

* chore: run gofmt

Signed-off-by: Chiman Jain <chimanjain15@gmail.com>

* chore:tidy the mod file

Signed-off-by: Chiman Jain <chimanjain15@gmail.com>

---------

Signed-off-by: Chiman Jain <chimanjain15@gmail.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: a2d2380910b1bfb3fa588f3b8de12ca8f1b725dd
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.7.32 to 1.7.33.
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](containerd/containerd@v1.7.32...v1.7.33)

---
updated-dependencies:
- dependency-name: github.com/containerd/containerd
  dependency-version: 1.7.33
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Upstream-repository: operator-lifecycle-manager
Upstream-commit: 27ef3822af8f727c8dc5c6ad2fa85be859cee01e
@openshift-bot openshift-bot force-pushed the synchronize-upstream branch from 02b58a8 to 80043d4 Compare June 25, 2026 00:05
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 25, 2026
@perdasilva

Copy link
Copy Markdown
Contributor

/retest

@perdasilva

perdasilva commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

/verified by @perdasilva

1. RBAC: config.openshift.io/apiservers permission

Check Result
CSV contains new RBAC rule PASS - apiGroups: ["config.openshift.io"], resources: ["apiservers"], resourceNames: ["cluster"], verbs: ["get"] present in packageserver CSV

2. Fallback path activation (no --tls-min-version flag)

Check Result
Container args include --tls-min-version No - args are ["/bin/package-server", "-v=4", "--secure-port", "5443", "--global-namespace", "openshift-marketplace"]
Fallback code path triggered PASS - confirmed by log message on both pods

3. Cluster TLS profile applied correctly

The cluster APIServer CR has no explicit tlsSecurityProfile set, which defaults to Intermediate.

Both pods logged the profile application at startup:

Applying cluster TLS security profile:
  minVersion=VersionTLS12
  cipherSuites=[TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384
    TLS_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256]
Check Result
minVersion matches Intermediate profile (TLS 1.2) PASS
Cipher suites match Intermediate profile PASS
Both replicas applied the profile PASS

4. PackageServer health post-change

Check Result
Pods running PASS - 2/2 Running, 0 restarts
APIService v1.packages.operators.coreos.com PASS - Available: True (Passed)
PackageManifests served PASS - 513 manifests returned
Pod events PASS - Normal scheduling/pull/start only, no warnings or errors

5. Code-level observations

Aspect Detail
Fail-closed behavior If the APIServer CR is missing or unreadable, the function returns an error that halts startup
Non-OpenShift clusters IsAPIAvailable() check makes this a no-op on vanilla Kubernetes
Flag precedence Explicitly set --tls-min-version / --tls-cipher-suites flags are not overwritten
Timeout 30-second context timeout on the API lookup
Unit tests 5 test cases cover: non-OpenShift, Intermediate profile, Modern profile, flag precedence, missing CR

Negative Tests

CVO and package-server-manager were scaled to 0 to prevent reconciliation during testing.

Test N1: Modern profile — TLS 1.2 rejection

Set tlsSecurityProfile.type: Modern on the cluster APIServer CR, restarted packageserver pods.

Logs confirmed profile change:

Applying cluster TLS security profile:
  minVersion=VersionTLS13
  cipherSuites=[TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256]
Handshake Result
TLS 1.2 (--tls-max 1.2) REJECTEDtlsv1 alert protocol version (curl exit 35)
TLS 1.3 (--tlsv1.3) ACCEPTED — HTTP 200 ok

PASS — The packageserver correctly enforced TLS 1.3-only when the Modern profile was set.

Additional observation: an old pod that was not restarted still accepted TLS 1.2 (its Intermediate profile was loaded at boot). This confirms the profile is read once at startup, not dynamically.

Test N2: Bogus cipher — API-level validation

Attempted to set a Custom profile with ciphers: ["TLS_FAKE_CIPHER_256_BOGUS"].

Result: The APIServer CR rejected the patch with validation errors:

spec.tlsSecurityProfile.custom.ciphers: Invalid value: ["TLS_FAKE_CIPHER_256_BOGUS"]:
  no supported cipher suite found

PASS — Defense in depth: invalid cipher names cannot reach the packageserver because the OpenShift API validates the APIServer CR schema. The packageserver code's fail-closed behavior is a second layer; the first layer is API admission.

Test N3: Old profile — TLS 1.0/1.1 floor

Set tlsSecurityProfile.type: Old on the cluster APIServer CR, restarted packageserver pods.

Logs confirmed profile change:

Applying cluster TLS security profile:
  minVersion=VersionTLS10
  cipherSuites=[TLS_AES_128_GCM_SHA256 ... TLS_RSA_WITH_3DES_EDE_CBC_SHA]
  (21 cipher suites including legacy CBC and 3DES)
Handshake Result
TLS 1.0 (--tls-max 1.0) REJECTEDno protocols available (OpenSSL in UBI9 has compiled out TLS 1.0)
TLS 1.1 (--tls-max 1.1) REJECTEDno protocols available (same reason)
TLS 1.2 (--tls-max 1.2) ACCEPTED — HTTP 200 ok
TLS 1.3 (--tlsv1.3) ACCEPTED — HTTP 200 ok

PASS — The packageserver correctly applied the Old profile (VersionTLS10 + legacy ciphers), but the underlying Go crypto/OpenSSL runtime on RHEL9/UBI9 provides a safety floor by refusing TLS 1.0/1.1 at the library level. The profile was honoured as far as the runtime allows.


Verdict

All checks passed (positive and negative). The packageserver correctly reads and applies the cluster-wide TLS security profile at startup via the fallback path. Negative tests confirmed:

  1. Profile enforcement is real — Modern (TLS 1.3 only) actively rejected TLS 1.2 connections
  2. Invalid ciphers are blocked — OpenShift API validation prevents bogus cipher names from reaching the packageserver
  3. Runtime safety floor — Even with the Old profile (VersionTLS10), the Go/OpenSSL runtime on UBI9 refuses TLS 1.0/1.1 connections
  4. Profile is startup-only — Unrestarted pods retain their boot-time profile, confirming the code path is a one-shot read

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Jun 25, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@perdasilva: This PR has been marked as verified by @perdasilva.

Details

In response to this:

/verified by @perdasilva

1. RBAC: config.openshift.io/apiservers permission

Check Result
CSV contains new RBAC rule PASS - apiGroups: ["config.openshift.io"], resources: ["apiservers"], resourceNames: ["cluster"], verbs: ["get"] present in packageserver CSV

2. Fallback path activation (no --tls-min-version flag)

Check Result
Container args include --tls-min-version No - args are ["/bin/package-server", "-v=4", "--secure-port", "5443", "--global-namespace", "openshift-marketplace"]
Fallback code path triggered PASS - confirmed by log message on both pods

3. Cluster TLS profile applied correctly

The cluster APIServer CR has no explicit tlsSecurityProfile set, which defaults to Intermediate.

Both pods logged the profile application at startup:

Applying cluster TLS security profile:
 minVersion=VersionTLS12
 cipherSuites=[TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384
   TLS_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
   TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
   TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256]
Check Result
minVersion matches Intermediate profile (TLS 1.2) PASS
Cipher suites match Intermediate profile PASS
Both replicas applied the profile PASS

4. PackageServer health post-change

Check Result
Pods running PASS - 2/2 Running, 0 restarts
APIService v1.packages.operators.coreos.com PASS - Available: True (Passed)
PackageManifests served PASS - 513 manifests returned
Pod events PASS - Normal scheduling/pull/start only, no warnings or errors

5. Code-level observations

Aspect Detail
Fail-closed behavior If the APIServer CR is missing or unreadable, the function returns an error that halts startup
Non-OpenShift clusters IsAPIAvailable() check makes this a no-op on vanilla Kubernetes
Flag precedence Explicitly set --tls-min-version / --tls-cipher-suites flags are not overwritten
Timeout 30-second context timeout on the API lookup
Unit tests 5 test cases cover: non-OpenShift, Intermediate profile, Modern profile, flag precedence, missing CR

Negative Tests

CVO and package-server-manager were scaled to 0 to prevent reconciliation during testing.

Test N1: Modern profile — TLS 1.2 rejection

Set tlsSecurityProfile.type: Modern on the cluster APIServer CR, restarted packageserver pods.

Logs confirmed profile change:

Applying cluster TLS security profile:
 minVersion=VersionTLS13
 cipherSuites=[TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256]
Handshake Result
TLS 1.2 (--tls-max 1.2) REJECTEDtlsv1 alert protocol version (curl exit 35)
TLS 1.3 (--tlsv1.3) ACCEPTED — HTTP 200 ok

PASS — The packageserver correctly enforced TLS 1.3-only when the Modern profile was set.

Additional observation: an old pod that was not restarted still accepted TLS 1.2 (its Intermediate profile was loaded at boot). This confirms the profile is read once at startup, not dynamically.

Test N2: Bogus cipher — API-level validation

Attempted to set a Custom profile with ciphers: ["TLS_FAKE_CIPHER_256_BOGUS"].

Result: The APIServer CR rejected the patch with validation errors:

spec.tlsSecurityProfile.custom.ciphers: Invalid value: ["TLS_FAKE_CIPHER_256_BOGUS"]:
 no supported cipher suite found

PASS — Defense in depth: invalid cipher names cannot reach the packageserver because the OpenShift API validates the APIServer CR schema. The packageserver code's fail-closed behavior is a second layer; the first layer is API admission.

Test N3: Old profile — TLS 1.0/1.1 floor

Set tlsSecurityProfile.type: Old on the cluster APIServer CR, restarted packageserver pods.

Logs confirmed profile change:

Applying cluster TLS security profile:
 minVersion=VersionTLS10
 cipherSuites=[TLS_AES_128_GCM_SHA256 ... TLS_RSA_WITH_3DES_EDE_CBC_SHA]
 (21 cipher suites including legacy CBC and 3DES)
Handshake Result
TLS 1.0 (--tls-max 1.0) REJECTEDno protocols available (OpenSSL in UBI9 has compiled out TLS 1.0)
TLS 1.1 (--tls-max 1.1) REJECTEDno protocols available (same reason)
TLS 1.2 (--tls-max 1.2) ACCEPTED — HTTP 200 ok
TLS 1.3 (--tlsv1.3) ACCEPTED — HTTP 200 ok

PASS — The packageserver correctly applied the Old profile (VersionTLS10 + legacy ciphers), but the underlying Go crypto/OpenSSL runtime on RHEL9/UBI9 provides a safety floor by refusing TLS 1.0/1.1 at the library level. The profile was honoured as far as the runtime allows.

Cleanup

All changes were reverted after testing:

  • APIServer CR tlsSecurityProfile removed (back to implicit Intermediate)
  • package-server-manager scaled back to 1
  • CVO scaled back to 1
  • Packageserver pods restarted, APIService confirmed healthy

Verdict

All checks passed (positive and negative). The packageserver correctly reads and applies the cluster-wide TLS security profile at startup via the fallback path. Negative tests confirmed:

  1. Profile enforcement is real — Modern (TLS 1.3 only) actively rejected TLS 1.2 connections
  2. Invalid ciphers are blocked — OpenShift API validation prevents bogus cipher names from reaching the packageserver
  3. Runtime safety floor — Even with the Old profile (VersionTLS10), the Go/OpenSSL runtime on UBI9 refuses TLS 1.0/1.1 connections
  4. Profile is startup-only — Unrestarted pods retain their boot-time profile, confirming the code path is a one-shot read

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

Copy link
Copy Markdown

@perdasilva: This PR has been marked as verified by @perdasilva.

Details

In response to this:

/verified by @perdasilva

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.

@perdasilva

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jun 25, 2026
@tmshort

tmshort commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

/test e2e-gcp-olm

@openshift-ci

openshift-ci Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

@openshift-bot: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-gcp-olm 80043d4 link true /test e2e-gcp-olm

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.

@tmshort

tmshort commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

/retest

@rashmigottipati rashmigottipati left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

/verified by @rashmigottipati

@openshift-ci-robot

Copy link
Copy Markdown

@rashmigottipati: This PR has been marked as verified by @rashmigottipati.

Details

In response to this:

/verified by @rashmigottipati

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

@openshift-ci

openshift-ci Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

Approval requirements bypassed by manually added approval.

This pull-request has been approved by: openshift-bot, rashmigottipati

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

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. 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. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants