Skip to content

SANDBOX-1843 | feature: bundle operator with OLM and OperatorSDK#120

Open
MikelAlejoBR wants to merge 13 commits into
codeready-toolchain:masterfrom
MikelAlejoBR:SANDBOX-1843-feature-olm-operator-sdk
Open

SANDBOX-1843 | feature: bundle operator with OLM and OperatorSDK#120
MikelAlejoBR wants to merge 13 commits into
codeready-toolchain:masterfrom
MikelAlejoBR:SANDBOX-1843-feature-olm-operator-sdk

Conversation

@MikelAlejoBR
Copy link
Copy Markdown

@MikelAlejoBR MikelAlejoBR commented May 14, 2026

In order to be able to install and deploy the operator in OpenShift, we need to bundle it with OLM and OperatorSDK.

Assisted-by: Cursor with Opus 4.6

Jira ticket

[SANDBOX-1843]

Summary by CodeRabbit

  • New Features

    • OLM bundle/catalog generation and publish workflows added, plus CD pipeline automation for staging/alpha releases
    • Scorecard validation integrated into CI with non-blocking failure reporting
  • Chores

    • Makefile targets for bundle/catalog build, tool downloads, and image publishing
    • Git ignore updated for generated bundle/catalog outputs
  • Documentation

    • Added OLM deployment design and decision proposal documents
  • RBAC

    • RBAC manifests updated for clearer namespaced vs cluster-scoped roles

In order to be able to install and deploy the operator in OpenShift, we
need to bundle it with OLM and OperatorSDK.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 14, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Tightens the Claw CRD: spec.mcpServers[*].transport is now an enum (streamable-http|sse) and a validation rule requires url be present when transport is set.

Changes

CRD MCP transport validation

Layer / File(s) Summary
CRD transport enum and CEL validation
config/crd/bases/claw.sandbox.redhat.com_claws.yaml
Adds an enum limiting spec.mcpServers[*].transport to streamable-http or sse, and an x-kubernetes-validations rule that permits transport only when the corresponding spec.mcpServers[*].url is set.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested labels

feature, ci, documentation, test

Suggested reviewers

  • xcoulon
  • alexeykazakov
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: bundling the operator with OLM and OperatorSDK. It is specific, concise, and directly relevant to the substantial additions in this PR.
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.

✏️ 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

Review ran into problems

🔥 Problems

Linked repositories: Couldn't analyze codeready-toolchain/claw-operator - clone failed: Clone operation failed: fatal: unable to access 'https://github.com/codeready-toolchain/claw-operator.git/': Empty reply from server

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

❤️ Share

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

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation feature New feature or request test Work that adds, fixes, or maintains automated tests or coverage (unit, integration, e2e, flakiness) ci Add or update CI/CD configuration labels May 14, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Caution

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

⚠️ Outside diff range comments (1)
bundle/manifests/claw.sandbox.redhat.com_claws.yaml (1)

1-414: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Refresh this generated CRD; it is out of sync with current generation.

CI is already failing because make bundle produces diffs under bundle/ (including schema additions not present here). Commit the regenerated bundle/manifests output so bundle validation and consistency checks are deterministic.

As per coding guidelines, Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

🤖 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 `@bundle/manifests/claw.sandbox.redhat.com_claws.yaml` around lines 1 - 414,
The generated CRD bundle under bundle/manifests (resource name
claws.claw.sandbox.redhat.com, version v1alpha1) is stale and must be
regenerated to match the controller's current API generation; run the project’s
bundle generation (e.g., make bundle or the controller-gen command used by the
repo) to refresh bundle/manifests, replace the outdated
bundle/manifests/claw.sandbox.redhat.com_claws.yaml with the regenerated output,
and commit the updated file so CI no longer sees diffs between source APIs and
the bundle.
🧹 Nitpick comments (4)
.github/workflows/cd.yml (1)

52-59: 💤 Low value

Implicit dependency on bin/operator-sdk from the prior Make step.

bin/operator-sdk only exists because the Publish staging bundle and catalog step transitively invokes the operator-sdk Make target. If that ordering is ever changed (or the scorecard step is split into its own job), this will silently break. Consider invoking make operator-sdk (or using $(LOCALBIN)/operator-sdk explicitly) before the scorecard step.

🤖 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 @.github/workflows/cd.yml around lines 52 - 59, The scorecard step relies
implicitly on bin/operator-sdk created by the earlier Make invocation; make this
explicit by ensuring operator-sdk is installed before running scorecard — e.g.,
add a pre-run command to invoke the Make target `make operator-sdk` or call the
built binary via `$(LOCALBIN)/operator-sdk` (or otherwise ensure
`bin/operator-sdk` is created) prior to executing `bin/operator-sdk scorecard`,
so the step no longer depends on ordering of the prior `Publish staging bundle
and catalog` step.
Makefile (3)

318-327: ⚡ Quick win

Bundle is validated before the CSV patches are applied.

operator-sdk bundle validate ./bundle runs at line 327, but generate-cd-release-manifests (lines 371‑376) and publish-current-bundle (lines 390‑393) then rewrite createdAt, relatedImages, replaces and olm.skipRange in the same CSV. Any breakage introduced by those sed substitutions (malformed YAML, indentation, bad version strings) ships to Quay unvalidated. Consider re-running $(OPERATOR_SDK) bundle validate ./bundle at the end of generate-cd-release-manifests and publish-current-bundle.

🤖 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 `@Makefile` around lines 318 - 327, The bundle target currently runs
operator-sdk bundle validate before subsequent targets modify the CSV; update
the Makefile so that after the CSV rewrites in the generate-cd-release-manifests
and publish-current-bundle targets you re-run $(OPERATOR_SDK) bundle validate
./bundle to catch any malformed YAML/indentation/version issues introduced by
the sed substitutions; locate the generate-cd-release-manifests and
publish-current-bundle targets (they perform edits to createdAt, relatedImages,
replaces and olm.skipRange) and append a final validation step that fails the
target on validation errors.

361-365: ⚖️ Poor tradeoff

Catalog index.yaml is generated by string interpolation instead of opm.

opm natively supports composing a file-based catalog (opm init, opm render, opm generate dockerfile) and will produce a schema-valid index.yaml instead of one assembled with printf. The current approach is hard to extend (e.g., adding more channels or multiple entries) and silently produces invalid catalogs if any of the interpolated values contain YAML metacharacters. Same concern applies at line 398.

🤖 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 `@Makefile` around lines 361 - 365, The Makefile currently writes
catalog/claw-operator/index.yaml via a printf interpolation which can produce
invalid YAML; replace the printf block with proper opm commands so OPM builds a
schema-valid index: use $(OPM) init (or opm init --directory ...) to create the
catalog directory/package and then use the appropriate opm add/opm render
sequence (e.g., render the bundle to bundle.yaml and add it to the index with
opm add or opm render --output index) so that index.yaml is generated by opm
rather than by printf; apply the same replacement for the other printf-based
index generation later in the Makefile (the second occurrence referenced in the
review).

325-327: 🏗️ Heavy lift

Replace sed pipeline with structured YAML tool (yq) or enable operator-sdk's relatedImages auto-population.

The sed -i pattern with embedded \n is not portable to macOS (BSD sed) and will fail or inject literal \n characters. The multi-line insertion is also brittle—it assumes exact indentation and a single ^ version: line, with no fallback if operator-sdk changes the generated CSV layout.

Additionally, operator-sdk v1.42.0 already supports auto-populating relatedImages directly from deployment manifests via the --use-image-digests flag (or by reading RELATED_IMAGE_* environment variables in manager.yaml), eliminating the need for manual sed patching. The web search confirms this feature auto-discovers images from Kustomize-built manifests and resolves their digests, populating spec.relatedImages automatically.

Recommended approach: Either:

  1. Use yq (already a common tool in the toolchain repos) for structured YAML edits instead of sed, or
  2. Enable operator-sdk's native auto-population and remove the sed block for relatedImages entirely.

This affects lines 26–27, 71–77, and 91–94 (all sed-based patching).

🤖 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 `@Makefile` around lines 325 - 327, The Makefile uses brittle sed edits to
mutate $(BUNDLE_CSV) (replacing createdAt and injecting relatedImages block)
which is non-portable and error-prone; replace those sed pipelines by either (A)
performing structured YAML edits with yq on the CSV file to set createdAt and
insert/specify spec.relatedImages (referencing the same $(BUNDLE_CSV) target and
the createdAt and relatedImages fields), or (B) remove the sed patching entirely
and invoke $(OPERATOR_SDK) bundle validate with operator-sdk's auto-population
(e.g., enable the --use-image-digests/RELATED_IMAGE_* mechanism) so that
relatedImages are produced automatically from manager/deployment manifests;
update the Makefile targets that currently call sed (the lines touching
createdAt, relatedImages insertion, and subsequent sed-based patches) to use the
chosen approach and ensure portability across macOS/Linux.
🤖 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 @.github/workflows/cd.yml:
- Around line 43-50: The workflow step "Create Kind cluster for scorecard"
currently downloads kind from the `latest` URL; modify the `curl` command in
that step (id: kind, name: Create Kind cluster for scorecard) to download a
pinned kind release (e.g., replace the `latest` URL with a specific version tag
like v0.X.Y) and, following the Makefile convention used for
`operator-sdk`/`opm`, add checksum verification of the downloaded binary before
`chmod`/`mv` to ensure reproducible and tamper-resistant installs; keep the
subsequent `chmod +x`, `sudo mv ./kind /usr/local/bin/kind`, and `kind create
cluster --name scorecard` lines unchanged.

In `@bundle/manifests/claw-operator.clusterserviceversion.yaml`:
- Around line 76-217: The clusterPermissions block is granting cluster-scoped
rights to many namespaced resources; remove all namespaced resources (e.g.,
configmaps, persistentvolumeclaims, secrets, serviceaccounts, pods, pods/exec,
services, deployments, networkpolicies, routes, route/custom-host, and the
namespaced CRs clawdevicepairingrequests and claws and their status/finalizers)
from clusterPermissions and add them under the namespaced permissions block
instead; keep only truly cluster-scoped APIs in clusterPermissions (e.g.,
clusterroles, tokenreviews, subjectaccessreviews) and keep serviceAccountName
as-is so the operator retains its cluster-level needs while least-privilege
rules for namespaced resources live under permissions.
- Around line 247-252: The CSV currently hardcodes non-reproducible local
"latest" image references (PROXY_IMAGE value "claw-proxy:latest" and the
top-level image "claw-operator:latest"); replace these with your release/OLM
image replace tokens or immutable FQINs used by your patching flow (e.g., the
RELATED_IMAGE_* or release injection tokens your pipeline expects) so
PROXY_IMAGE and the CSV image field reference the same replaceable/immutable
image identifiers rather than local ":latest" tags.

In `@bundle/manifests/claw.sandbox.redhat.com_claws.yaml`:
- Around line 308-313: The CRD schema currently allows any string for the
transport field; update the OpenAPI schema for the transport property to enforce
allowed values by adding an enum with "streamable-http" and "sse" (while keeping
type: string) so invalid specs are rejected at validation time; locate the
transport property in the manifest's schema (the transport field described in
the CRD) and add the enum array under that property.

In `@Makefile`:
- Around line 350-376: The current generation of CD_PREVIOUS_VERSION and the sed
that injects "replaces: claw-operator.v$(CD_PREVIOUS_VERSION)" in
generate-cd-release-manifests is unsafe on non-linear histories and first-run
cases; remove the insertion of replaces in the CSV and rely on skipRange, or
alternatively compute the last published bundle version from the published
catalog and use that instead. Concretely, update the
generate-cd-release-manifests target to stop adding the replaces line (remove or
change the sed line that matches '^  version: \(.*\)' which currently inserts
"replaces: claw-operator.v$(CD_PREVIOUS_VERSION)\n  version: \1"), or replace
that sed with logic that queries the published catalog (e.g., opm render
$(CATALOG_REPO):latest and extract the highest claw-operator.v* entry) and set
CD_PREVIOUS_VERSION from that before patching the CSV.
- Around line 474-482: The download-tool Makefile macro uses curl without
-f/--fail so HTTP errors are saved as files; update the curl invocation inside
the download-tool macro (the line with curl -sSLo) to include -f and add retry
options (e.g., --retry with a small count and --retry-connrefused or similar) so
curl exits non-zero on HTTP errors and will retry transient failures before
chmod and ln are run.

---

Outside diff comments:
In `@bundle/manifests/claw.sandbox.redhat.com_claws.yaml`:
- Around line 1-414: The generated CRD bundle under bundle/manifests (resource
name claws.claw.sandbox.redhat.com, version v1alpha1) is stale and must be
regenerated to match the controller's current API generation; run the project’s
bundle generation (e.g., make bundle or the controller-gen command used by the
repo) to refresh bundle/manifests, replace the outdated
bundle/manifests/claw.sandbox.redhat.com_claws.yaml with the regenerated output,
and commit the updated file so CI no longer sees diffs between source APIs and
the bundle.

---

Nitpick comments:
In @.github/workflows/cd.yml:
- Around line 52-59: The scorecard step relies implicitly on bin/operator-sdk
created by the earlier Make invocation; make this explicit by ensuring
operator-sdk is installed before running scorecard — e.g., add a pre-run command
to invoke the Make target `make operator-sdk` or call the built binary via
`$(LOCALBIN)/operator-sdk` (or otherwise ensure `bin/operator-sdk` is created)
prior to executing `bin/operator-sdk scorecard`, so the step no longer depends
on ordering of the prior `Publish staging bundle and catalog` step.

In `@Makefile`:
- Around line 318-327: The bundle target currently runs operator-sdk bundle
validate before subsequent targets modify the CSV; update the Makefile so that
after the CSV rewrites in the generate-cd-release-manifests and
publish-current-bundle targets you re-run $(OPERATOR_SDK) bundle validate
./bundle to catch any malformed YAML/indentation/version issues introduced by
the sed substitutions; locate the generate-cd-release-manifests and
publish-current-bundle targets (they perform edits to createdAt, relatedImages,
replaces and olm.skipRange) and append a final validation step that fails the
target on validation errors.
- Around line 361-365: The Makefile currently writes
catalog/claw-operator/index.yaml via a printf interpolation which can produce
invalid YAML; replace the printf block with proper opm commands so OPM builds a
schema-valid index: use $(OPM) init (or opm init --directory ...) to create the
catalog directory/package and then use the appropriate opm add/opm render
sequence (e.g., render the bundle to bundle.yaml and add it to the index with
opm add or opm render --output index) so that index.yaml is generated by opm
rather than by printf; apply the same replacement for the other printf-based
index generation later in the Makefile (the second occurrence referenced in the
review).
- Around line 325-327: The Makefile uses brittle sed edits to mutate
$(BUNDLE_CSV) (replacing createdAt and injecting relatedImages block) which is
non-portable and error-prone; replace those sed pipelines by either (A)
performing structured YAML edits with yq on the CSV file to set createdAt and
insert/specify spec.relatedImages (referencing the same $(BUNDLE_CSV) target and
the createdAt and relatedImages fields), or (B) remove the sed patching entirely
and invoke $(OPERATOR_SDK) bundle validate with operator-sdk's auto-population
(e.g., enable the --use-image-digests/RELATED_IMAGE_* mechanism) so that
relatedImages are produced automatically from manager/deployment manifests;
update the Makefile targets that currently call sed (the lines touching
createdAt, relatedImages insertion, and subsequent sed-based patches) to use the
chosen approach and ensure portability across macOS/Linux.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 190ed8b0-2110-49e4-a190-044b03394721

📥 Commits

Reviewing files that changed from the base of the PR and between 8bb1ffb and e0d4f8c.

📒 Files selected for processing (18)
  • .github/workflows/cd.yml
  • .github/workflows/lint-bundle.yml
  • .gitignore
  • Makefile
  • bundle.Dockerfile
  • bundle/manifests/claw-operator-controller-manager-metrics-service_v1_service.yaml
  • bundle/manifests/claw-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
  • bundle/manifests/claw.sandbox.redhat.com_clawdevicepairingrequests.yaml
  • bundle/manifests/claw.sandbox.redhat.com_claws.yaml
  • bundle/metadata/annotations.yaml
  • bundle/tests/scorecard/config.yaml
  • config/manifests/bases/claw-operator.clusterserviceversion.yaml
  • config/manifests/kustomization.yaml
  • config/samples/claw_v1alpha1_clawdevicepairingrequest.yaml
  • config/samples/kustomization.yaml
  • docs/proposals/olm-deployment-design.md
  • docs/proposals/olm-deployment-questions.md
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: E2E Tests
  • GitHub Check: Unit Tests
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • config/manifests/kustomization.yaml
  • bundle/metadata/annotations.yaml
  • bundle/manifests/claw-operator-controller-manager-metrics-service_v1_service.yaml
  • docs/proposals/olm-deployment-questions.md
  • bundle.Dockerfile
  • config/samples/claw_v1alpha1_clawdevicepairingrequest.yaml
  • config/samples/kustomization.yaml
  • config/manifests/bases/claw-operator.clusterserviceversion.yaml
  • bundle/tests/scorecard/config.yaml
  • bundle/manifests/claw-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml
  • docs/proposals/olm-deployment-design.md
  • bundle/manifests/claw.sandbox.redhat.com_clawdevicepairingrequests.yaml
  • bundle/manifests/claw.sandbox.redhat.com_claws.yaml
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
  • Makefile
🪛 checkmake (0.3.2)
Makefile

[warning] 319-319: Target body for "bundle" exceeds allowed length of 5 lines (8).

(maxbodylength)


[warning] 358-358: Target body for "push-to-quay-staging" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 368-368: Target body for "generate-cd-release-manifests" exceeds allowed length of 5 lines (8).

(maxbodylength)


[warning] 387-387: Target body for "publish-current-bundle" exceeds allowed length of 5 lines (13).

(maxbodylength)


[warning] 465-465: Required target "clean" is missing from the Makefile.

(minphony)

🪛 GitHub Actions: Lint Bundle / 0_Bundle Validation.txt
bundle/manifests/claw.sandbox.redhat.com_claws.yaml

[error] 327-411: CI step 'git diff --exit-code bundle/' failed (exit code 1) because there are differences under 'bundle/'. Diff shows newly added schema fields 'webFetch' and 'webSearch' in the Claw manifest.

🪛 GitHub Actions: Lint Bundle / Bundle Validation
bundle/manifests/claw.sandbox.redhat.com_claws.yaml

[error] 1-1: Process completed with exit code 1 during step 'git diff --exit-code bundle/'. A diff was detected in bundle/ (manifest changes applied), causing the exit-code failure.

🪛 LanguageTool
docs/proposals/olm-deployment-design.md

[uncategorized] ~183-~183: The official name of this software platform is spelled with a capital “H”.
Context: ...s) 2. Add GitHub Actions CD workflow (.github/workflows/cd.yml`): - Trigger: push ...

(GITHUB)


[uncategorized] ~196-~196: The official name of this software platform is spelled with a capital “H”.
Context: ...er is always publishable. 1. Add a new .github/workflows/lint-bundle.yml workflow (tr...

(GITHUB)

🪛 markdownlint-cli2 (0.22.1)
docs/proposals/olm-deployment-design.md

[warning] 60-60: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🪛 Trivy (0.69.3)
bundle.Dockerfile

[error] 1-1: Image user should not be 'root'

Specify at least 1 USER command in Dockerfile with non-root user as argument

Rule: DS-0002

Learn more

(IaC/Dockerfile)

🔀 Multi-repo context codeready-toolchain/api, codeready-toolchain/toolchain-common, codeready-toolchain/host-operator, codeready-toolchain/toolchain-e2e

[::codeready-toolchain/api::]

  • operator-sdk CSV generation markers present in multiple API types (e.g., api/v1alpha1/spacebindingrequest_types.go, usertier_types.go, usersignup_types.go). These indicate this repo already integrates with operator-sdk CSV generation workflows and may need consistent CSV/CRD metadata alignment with the new claw-operator bundle.

[::codeready-toolchain/toolchain-common::]

  • README.adoc documents Go 1.24 requirement (README.adoc). No direct bundle/operator references found.

[::codeready-toolchain/host-operator::]

  • Makefile manifests targets referencing bundle & CD flow:
    • make/manifests.mk: defines push-to-quay-staging target and uses operator-sdk to generate bundle and validate:
      • lines referencing: operator-sdk generate kustomize manifests ..., operator-sdk generate bundle ..., operator-sdk bundle validate ./bundle
    • make/clean.mk removes bundle/ directory (rm -rf bundle/).
    • .gitignore contains bundle/ ignored.
      These indicate host-operator already has CI/Make targets and conventions for generating/publishing OLM bundles that should align with claw-operator's new Makefile/CI additions.

[::codeready-toolchain/toolchain-e2e::]

  • Required tools doc lists operator-sdk v1.42.0 and opm v1.59.0 (required_tools.adoc) — matches versions added in claw-operator Makefile (OPERATOR_SDK_VERSION ?= v1.42.0, OPM_VERSION ?= v1.59.0).
  • e2e test harness/instructions reference operator-sdk test local and operator deployment flows (multicluster_setup.adoc, test/e2e/...).
    This repo's tests and dev workflows rely on operator-sdk/opm and bundle artifacts; changes in claw-operator bundle/CSV generation could affect e2e workflows or CI if bundle layout/validation rules differ.

Overall assessment:

  • Multiple repos already use/operator-sdk-based bundle generation and expect bundle/ directory and specific operator-sdk/opm versions. The claw-operator PR adds Makefile targets, bundle/ manifest/CSV/CRD files, and GH Actions that should be compatible with these existing conventions/versions. Reviewers should verify CSV/CRD schema, versions, and relatedImages placeholders are consistent with org-wide operator-sdk usage and that Makefile targets (naming, push-to-quay-staging) do not conflict with existing host-operator/tooling conventions.
🔇 Additional comments (14)
bundle/manifests/claw-operator-controller-manager-metrics-service_v1_service.yaml (1)

1-21: LGTM!

bundle/manifests/claw-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (1)

1-11: LGTM!

docs/proposals/olm-deployment-questions.md (1)

1-171: LGTM!

.gitignore (1)

31-36: LGTM!

docs/proposals/olm-deployment-design.md (1)

1-234: LGTM!

bundle/metadata/annotations.yaml (1)

1-16: LGTM!

bundle/manifests/claw.sandbox.redhat.com_clawdevicepairingrequests.yaml (1)

1-190: LGTM!

config/samples/claw_v1alpha1_clawdevicepairingrequest.yaml (1)

1-10: LGTM!

config/samples/kustomization.yaml (1)

5-5: LGTM!

config/manifests/bases/claw-operator.clusterserviceversion.yaml (1)

1-71: LGTM!

config/manifests/kustomization.yaml (1)

6-6: LGTM!

bundle/tests/scorecard/config.yaml (1)

1-70: LGTM!

bundle.Dockerfile (1)

1-21: LGTM!

.github/workflows/lint-bundle.yml (1)

1-31: LGTM!

Comment thread .github/workflows/cd.yml Outdated
Comment thread bundle/manifests/claw-operator.clusterserviceversion.yaml Outdated
Comment thread bundle/manifests/claw-operator.clusterserviceversion.yaml Outdated
Comment thread bundle/manifests/claw.sandbox.redhat.com_claws.yaml
Comment thread Makefile
Comment thread Makefile
Pinning the Kind version will make the CD pipeline reproducible.

Assisted-by: Cursor with Opus 4.6
There is no need to have permissions granted via cluster permissions for
many of the resources. Moving the ones that do not require those broad
permissions to the "permissions" hardens security.

Assited-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@internal/controller/claw_device_pairing_request_controller.go`:
- Around line 62-66: The RBAC annotations for ClawDevicePairingRequestReconciler
are incorrectly scoped to namespace=system while the controller
(SetupWithManager and Reconcile) watches/operates across namespaces and acts on
pods in instance.Namespace; to fix, either remove the namespace=system attribute
from the kubebuilder:rbac lines so the generated ClusterRole grants permissions
cluster-wide (or use no namespace qualifier for namespaced resources), or
restrict the controller to the system namespace by configuring SetupWithManager
to only watch that namespace (so Reconcile/pod access will always target
system); update the kubebuilder:rbac annotations or SetupWithManager accordingly
and ensure the Reconcile logic (ClawDevicePairingRequestReconciler.Reconcile)
aligns with the chosen scope.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 21411e62-534c-467b-9198-e8f081df5f9c

📥 Commits

Reviewing files that changed from the base of the PR and between e0d4f8c and 3d7e03d.

📒 Files selected for processing (8)
  • .github/workflows/cd.yml
  • Makefile
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
  • config/rbac/kustomization.yaml
  • config/rbac/manager_role_binding.yaml
  • config/rbac/role.yaml
  • internal/controller/claw_device_pairing_request_controller.go
  • internal/controller/claw_resource_controller.go
✅ Files skipped from review due to trivial changes (3)
  • config/rbac/manager_role_binding.yaml
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
  • internal/controller/claw_resource_controller.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/cd.yml
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Unit Tests
  • GitHub Check: E2E Tests
🧰 Additional context used
📓 Path-based instructions (3)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • config/rbac/kustomization.yaml
  • config/rbac/role.yaml
  • internal/controller/claw_device_pairing_request_controller.go
  • Makefile
internal/controller/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Set owner references on all created resources via controllerutil.SetControllerReference

Files:

  • internal/controller/claw_device_pairing_request_controller.go
**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Include license header on all Go source files using template from hack/boilerplate.go.txt

Files:

  • internal/controller/claw_device_pairing_request_controller.go
🪛 checkmake (0.3.2)
Makefile

[warning] 83-83: Target body for "setup-test-e2e" exceeds allowed length of 5 lines (10).

(maxbodylength)


[warning] 315-315: Target body for "bundle" exceeds allowed length of 5 lines (8).

(maxbodylength)


[warning] 354-354: Target body for "push-to-quay-staging" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 364-364: Target body for "generate-cd-release-manifests" exceeds allowed length of 5 lines (8).

(maxbodylength)


[warning] 383-383: Target body for "publish-current-bundle" exceeds allowed length of 5 lines (13).

(maxbodylength)


[warning] 468-468: Required target "clean" is missing from the Makefile.

(minphony)

🔀 Multi-repo context codeready-toolchain/api, codeready-toolchain/host-operator, codeready-toolchain/toolchain-e2e, codeready-toolchain/toolchain-common

[::codeready-toolchain/api::]

  • Many API types include operator-sdk CSV generation markers (e.g., api/v1alpha1/*_types.go contain "+operator-sdk:gen-csv" comments), indicating this repo already uses operator-sdk CSV/CRD generation workflows. Example matches: api/v1alpha1/masteruserrecord_types.go, usersignup_types.go, usertier_types.go (rg output lines).

[::codeready-toolchain/host-operator::]

  • Makefile targets and scripts already implement bundle/CD flows and use operator-sdk/opm:
    • make/manifests.mk calls operator-sdk generate kustomize manifests and operator-sdk generate bundle and runs operator-sdk bundle validate ./bundle (make/manifests.mk:46,50-51).
    • There is an existing push-to-quay-staging target (make/manifests.mk:16,18).
    • bundle/ is ignored and cleaned (make/clean.mk removes bundle/; .gitignore contains bundle/) — same conventions as this PR.

[::codeready-toolchain/toolchain-e2e::]

  • CI/dev docs specify required tool versions that match this PR:
    • required_tools.adoc lists operator-sdk 1.42.0 and opm v1.59.0 (required_tools.adoc:4,10), matching OPERATOR_SDK_VERSION and OPM_VERSION added in the PR.
  • operator-sdk is used in e2e test commands (multicluster_setup.adoc).

[::codeready-toolchain/toolchain-common::]

  • No matches found for operator-sdk/opm/bundle-related symbols in the search output.

Conclusion: The org already has established operator-sdk/opm bundle generation and CI conventions (host-operator, toolchain-e2e, api). The PR's Makefile targets, tool versions, and bundle layout align with existing repos and may reuse existing CD conventions (push-to-quay-staging, bundle validation). Recommend reviewers focus on ensuring CSV/CRD metadata consistency with api repo conventions and that Makefile target names/behavior are compatible with host-operator expectations.

🔇 Additional comments (11)
config/rbac/role.yaml (2)

19-23: LGTM!

Also applies to: 121-131


7-17: ⚡ Quick win

The clusterroles permission is actually required by the operator.

The operator reads and applies ClusterRole manifests as part of the device-pairing component (embedded at manifests/claw-device-pairing/clusterrole.yaml). These objects are processed in the main reconciliation loop and deployed to the cluster via server-side apply (client.Apply), which requires create, update, and patch permissions. The kubebuilder RBAC marker at line 376 accurately reflects this usage.

			> Likely an incorrect or invalid review comment.
config/rbac/kustomization.yaml (1)

10-10: LGTM!

Makefile (8)

371-371: replaces: derived from HEAD~1 is still unsafe — duplicate of prior review.

The prior review's concern about CD_PREVIOUS_VERSION being derived from git rev-list --count HEAD~1 / git rev-parse --short HEAD~1 still applies here. Additionally, GitHub Actions' default actions/checkout uses a shallow fetch (depth=1), so git rev-list --count HEAD will return 1 regardless of actual history, producing 0.0.0-commit-<sha> as the previous version. Since skipRange (line 372) is already the authoritative upgrade mechanism, dropping the injected replaces: line (or deriving it from opm render $(CATALOG_REPO):latest) avoids dangling references.


478-484: curl still missing -f — duplicate of prior review.

The download-tool macro still uses curl -sSLo, so an HTTP 4xx/5xx response body would be written to disk as the "binary", then chmod +x succeeds and the next operator-sdk/opm/kind invocation fails with a confusing parse/exec error. Adding -f --retry 3 makes failures explicit and self-recoverable.


4-17: LGTM!


83-83: LGTM!


186-194: LGTM!


310-335: LGTM!


337-360: LGTM!


374-396: LGTM!

Comment thread internal/controller/claw_device_pairing_request_controller.go Outdated
Instead of relying on the "latest" tag, we should be using versioning to
build the operators, so that they are easily pullable.

Assisted-by: Cursor with OPus 4.6
Jira ticket: SANDBOX-1843
Instead of using a free form string for the MCP servers' transport, it's
better to restrict it at the CRD level to avoid silent invalid
configurations.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
The "skipRange" directive already takes care of specifying the version
range for the bundles to be upgraded.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (2)
Makefile (2)

480-487: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Make tool downloads fail on HTTP errors.

curl -sSLo will save a 404/5xx body as the "binary", then chmod and the symlink still succeed. The next operator-sdk/opm invocation fails later with a much less obvious exec error. Add --fail and a small retry policy here.

Suggested fix
 define download-tool
 @[ -f "$(1)-$(2)" ] || { \
 set -e; \
 echo "Downloading $(1) $(2)"; \
-curl -sSLo $(1)-$(2) $(3); \
+curl -fsSL --retry 3 -o $(1)-$(2) $(3); \
 chmod +x $(1)-$(2); \
 }; \
 ln -sf $(1)-$(2) $(1)
 endef
🤖 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 `@Makefile` around lines 480 - 487, The download-tool Makefile macro currently
uses curl in the download command which will write HTTP error pages as files and
still succeed, causing downstream exec failures; update the download step inside
the download-tool definition to use curl --fail and add a small retry policy
(e.g., loop with a few attempts, short sleep between attempts, and fail after
max attempts) so non-2xx responses cause curl to exit nonzero and downloads are
retried before creating the chmod +x and ln -sf for the tool; target the
download-tool macro and the curl invocation in that macro when making the
change.

352-355: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't derive CSV replaces from HEAD~1.

This still assumes the previous Git commit is the previous published bundle. That fails on first release, shallow clones, and non-linear release history, so OLM can get an upgrade edge to a CSV that does not exist. Since the catalog entry already carries skipRange, the safest fix is to stop injecting replaces here unless it comes from the published catalog.

Suggested fix
-GIT_PREVIOUS_SHORT_SHA = $(shell git rev-parse --short HEAD~1)
 CD_VERSION = 0.0.$(GIT_COMMIT_COUNT)-commit-$(GIT_SHORT_SHA)
-CD_PREVIOUS_VERSION = 0.0.$(shell expr $(GIT_COMMIT_COUNT) - 1)-commit-$(GIT_PREVIOUS_SHORT_SHA)
@@
-	sed -i 's|^  version: \(.*\)|  replaces: claw-operator.v$(CD_PREVIOUS_VERSION)\n  version: \1|' $(BUNDLE_CSV)
 	sed -i '/^    createdAt:/a\    olm.skipRange: ">=0.0.0 <$(CD_VERSION)"' $(BUNDLE_CSV)

Also applies to: 374-374

🤖 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 `@Makefile` around lines 352 - 355, The Makefile currently derives a "previous"
commit and CD_PREVIOUS_VERSION via GIT_PREVIOUS_SHORT_SHA and HEAD~1 (variables
GIT_PREVIOUS_SHORT_SHA and CD_PREVIOUS_VERSION), which causes invalid CSV
`replaces` in non-linear/shallow/first-release cases; remove or stop populating
GIT_PREVIOUS_SHORT_SHA and CD_PREVIOUS_VERSION (and any logic that injects
`replaces` from them) and instead only set `replaces` when the previous bundle
is known from the published catalog (i.e., source the value from the
catalog/published metadata rather than computing it from HEAD~1), leaving
CD_VERSION and GIT_SHORT_SHA/GIT_COMMIT_COUNT intact.
🤖 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 `@api/v1alpha1/claw_types.go`:
- Around line 246-250: The Transport field (Transport McpTransport) must be
rejected unless URL is set: add validation on the resource type that declares
Transport (in claw_types.go) by implementing webhook validation methods
(ValidateCreate and ValidateUpdate) that check if spec.Transport is non-empty
while spec.URL (or the URL field name used in this struct) is empty and return a
clear error; keep existing +optional tag but ensure the validation prevents
Transport from being provided for command/stdio-only servers. Ensure error
messages reference the Transport field name to help users fix the spec.

In `@Makefile`:
- Around line 190-193: The Makefile rule generate-bundle-overlay currently
splits the bundle image with cut -d: -f1/-f2 which splits on the first colon and
misparses images like localhost:5000/claw-operator:dev; change the split to use
the last ':' when deriving newName and newTag (e.g. compute name and tag from
$(1) by extracting the suffix after the final colon and the prefix before it
using a shell expression like sed/awk or parameter expansion) and pass those
safe values into the printf so newName/newTag are correct.

---

Duplicate comments:
In `@Makefile`:
- Around line 480-487: The download-tool Makefile macro currently uses curl in
the download command which will write HTTP error pages as files and still
succeed, causing downstream exec failures; update the download step inside the
download-tool definition to use curl --fail and add a small retry policy (e.g.,
loop with a few attempts, short sleep between attempts, and fail after max
attempts) so non-2xx responses cause curl to exit nonzero and downloads are
retried before creating the chmod +x and ln -sf for the tool; target the
download-tool macro and the curl invocation in that macro when making the
change.
- Around line 352-355: The Makefile currently derives a "previous" commit and
CD_PREVIOUS_VERSION via GIT_PREVIOUS_SHORT_SHA and HEAD~1 (variables
GIT_PREVIOUS_SHORT_SHA and CD_PREVIOUS_VERSION), which causes invalid CSV
`replaces` in non-linear/shallow/first-release cases; remove or stop populating
GIT_PREVIOUS_SHORT_SHA and CD_PREVIOUS_VERSION (and any logic that injects
`replaces` from them) and instead only set `replaces` when the previous bundle
is known from the published catalog (i.e., source the value from the
catalog/published metadata rather than computing it from HEAD~1), leaving
CD_VERSION and GIT_SHORT_SHA/GIT_COMMIT_COUNT intact.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: f96ec722-a70c-49c7-90fa-c2929ef1bcbd

📥 Commits

Reviewing files that changed from the base of the PR and between 3d7e03d and 6aae9d0.

📒 Files selected for processing (7)
  • Makefile
  • api/v1alpha1/claw_types.go
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
  • config/crd/bases/claw.sandbox.redhat.com_claws.yaml
  • internal/controller/claw_mcp.go
  • internal/controller/claw_mcp_test.go
  • internal/controller/claw_proxy_test.go
✅ Files skipped from review due to trivial changes (1)
  • internal/controller/claw_proxy_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • bundle/manifests/claw-operator.clusterserviceversion.yaml
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: E2E Tests
  • GitHub Check: Unit Tests
🧰 Additional context used
📓 Path-based instructions (5)
api/v1alpha1/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

After modifying API types in api/v1alpha1/, always run both make manifests (regenerate CRD YAML) and make generate (regenerate zz_generated.deepcopy.go)

Files:

  • api/v1alpha1/claw_types.go
**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Include license header on all Go source files using template from hack/boilerplate.go.txt

Files:

  • api/v1alpha1/claw_types.go
  • internal/controller/claw_mcp.go
  • internal/controller/claw_mcp_test.go
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • api/v1alpha1/claw_types.go
  • internal/controller/claw_mcp.go
  • internal/controller/claw_mcp_test.go
  • config/crd/bases/claw.sandbox.redhat.com_claws.yaml
  • Makefile
internal/controller/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Set owner references on all created resources via controllerutil.SetControllerReference

Files:

  • internal/controller/claw_mcp.go
  • internal/controller/claw_mcp_test.go
**/*_test.go

📄 CodeRabbit inference engine (CLAUDE.md)

**/*_test.go: Use require for fatal setup errors and assert for value comparisons in tests
Write tests using t.Run() subtests, t.Cleanup(), and table-driven test patterns
Use the waitFor(t, timeout, interval, condition, message) helper for async assertions with 10s timeout and 250ms poll interval

Files:

  • internal/controller/claw_mcp_test.go
🪛 checkmake (0.3.2)
Makefile

[warning] 83-83: Target body for "setup-test-e2e" exceeds allowed length of 5 lines (10).

(maxbodylength)


[warning] 315-315: Target body for "bundle" exceeds allowed length of 5 lines (11).

(maxbodylength)


[warning] 357-357: Target body for "push-to-quay-staging" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 367-367: Target body for "generate-cd-release-manifests" exceeds allowed length of 5 lines (8).

(maxbodylength)


[warning] 386-386: Target body for "publish-current-bundle" exceeds allowed length of 5 lines (13).

(maxbodylength)


[warning] 471-471: Required target "clean" is missing from the Makefile.

(minphony)

🔀 Multi-repo context codeready-toolchain/api, codeready-toolchain/host-operator, codeready-toolchain/toolchain-e2e, codeready-toolchain/toolchain-common

[::codeready-toolchain/api::]

  • Many API types include operator-sdk CSV generation markers, indicating existing org-wide CSV/bundle workflows that should stay consistent with this PR's bundle layout and CSV metadata. Examples: api/v1alpha1/*_types.go (see idler_types.go, proxyplugin_types.go, usersignup_types.go, masteruserrecord_types.go). (rg output lines)

[::codeready-toolchain/host-operator::]

  • Makefile targets and bundle/CD flow present and match the PR's introduced targets and operator-sdk usage:
    • push-to-quay-staging target and publish-current-bundle semantics: make/manifests.mk:16,18,53-57
    • operator-sdk bundle generation and validation usage: make/manifests.mk:46,50-51
    • README references push-to-quay-staging usage. (see make/manifests.mk, README.adoc lines)

[::codeready-toolchain/toolchain-e2e::]

  • Tests and CI expect operator-sdk v1.42.0 and call bundle publish targets:
    • required_tools.adoc lists operator-sdk 1.42.0 (required_tools.adoc:4)
    • CI scripts invoke make publish-current-bundle/publish-current-bundles-for-e2e (scripts/ci/manage-host-operator.sh, scripts/ci/manage-member-operator.sh, make/test.mk)
    • operator-sdk test/local is used in multicluster_setup.adoc. These confirm the PR's OPERATOR_SDK_VERSION and OPM_VERSION align with existing e2e expectations.

[::codeready-toolchain/toolchain-common::]

  • No matches for operator-sdk/opm/bundle-related symbols found in quick search (no immediate cross-repo impact found).

Summary/implication:

  • The org already uses operator-sdk/opm bundle generation and has existing CI targets (host-operator, toolchain-e2e) that align with the PR's Makefile variables and targets. Reviewers should verify CSV/CRD metadata (versions, relatedImages, channels) are consistent with org conventions and that the new Makefile target names/args match how host-operator and e2e scripts invoke publish/current-bundle flows. Also confirm operator-sdk/opm versions (1.42.0, 1.59.0) match toolchain-e2e expectations (they do).
🔇 Additional comments (3)
config/crd/bases/claw.sandbox.redhat.com_claws.yaml (1)

312-314: LGTM!

internal/controller/claw_mcp.go (1)

138-138: LGTM!

internal/controller/claw_mcp_test.go (1)

69-69: LGTM!

Also applies to: 118-118, 297-297, 377-377, 965-965

Comment thread api/v1alpha1/claw_types.go
Comment thread Makefile Outdated
curl was saving errors pages as binaries instead of failing on HTTP
errors.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Comment thread Makefile
The RBAC permissions were being too restrictive in the sense that the
operator would not be able to see individual namespaces' resources when
reconciling.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
@coderabbitai coderabbitai Bot added refactoring Refactor code and removed documentation Improvements or additions to documentation feature New feature or request test Work that adds, fixes, or maintains automated tests or coverage (unit, integration, e2e, flakiness) ci Add or update CI/CD configuration labels May 14, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@Makefile`:
- Around line 477-485: The download-tool Makefile macro currently marks
downloaded artifacts executable and symlinks them without integrity checks;
update download-tool to accept a SHA256 checksum parameter, compute and verify
the downloaded file's checksum (e.g., using sha256sum -c or echo "<checksum> 
$(1)-$(2)" | sha256sum -c -) before running chmod +x and ln -sf, and fail the
recipe if checksum verification fails; update callers that invoke download-tool
for operator-sdk v1.42.0, opm v1.59.0, and kind v0.31.0 to pass the
corresponding published SHA256 sums.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: a2a4e21c-27fc-4c6b-a2a1-006b655b8fde

📥 Commits

Reviewing files that changed from the base of the PR and between 6aae9d0 and 431131d.

📒 Files selected for processing (2)
  • Makefile
  • config/rbac/role.yaml
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: E2E Tests
  • GitHub Check: Unit Tests
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • config/rbac/role.yaml
  • Makefile
🪛 checkmake (0.3.2)
Makefile

[warning] 83-83: Target body for "setup-test-e2e" exceeds allowed length of 5 lines (10).

(maxbodylength)


[warning] 315-315: Target body for "bundle" exceeds allowed length of 5 lines (11).

(maxbodylength)


[warning] 355-355: Target body for "push-to-quay-staging" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 365-365: Target body for "generate-cd-release-manifests" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 383-383: Target body for "publish-current-bundle" exceeds allowed length of 5 lines (13).

(maxbodylength)


[warning] 468-468: Required target "clean" is missing from the Makefile.

(minphony)

🔀 Multi-repo context codeready-toolchain/api, codeready-toolchain/host-operator, codeready-toolchain/toolchain-e2e, codeready-toolchain/toolchain-common

[::codeready-toolchain/api::]

  • Many API types include operator-sdk CSV generation markers, indicating existing org-wide CSV/bundle workflows that should stay consistent with this PR's bundle layout and CSV metadata. Examples: api/v1alpha1/*_types.go (see idler_types.go, proxyplugin_types.go, usersignup_types.go, masteruserrecord_types.go). (rg output lines)

[::codeready-toolchain/host-operator::]

  • Makefile targets and bundle/CD flow present and match the PR's introduced targets and operator-sdk usage:
    • push-to-quay-staging target and publish-current-bundle semantics: make/manifests.mk:16,18,53-57
    • operator-sdk bundle generation and validation usage: make/manifests.mk:46,50-51
    • README references push-to-quay-staging usage. (see make/manifests.mk, README.adoc lines)

[::codeready-toolchain/toolchain-e2e::]

  • Tests and CI expect operator-sdk v1.42.0 and call bundle publish targets:
    • required_tools.adoc lists operator-sdk 1.42.0 (required_tools.adoc:4)
    • CI scripts invoke make publish-current-bundle/publish-current-bundles-for-e2e (scripts/ci/manage-host-operator.sh, scripts/ci/manage-member-operator.sh, make/test.mk)
    • operator-sdk test/local is used in multicluster_setup.adoc. These confirm the PR's OPERATOR_SDK_VERSION and OPM_VERSION align with existing e2e expectations.

[::codeready-toolchain/toolchain-common::]

  • No matches for operator-sdk/opm/bundle-related symbols found in quick search (no immediate cross-repo impact found).

Summary/implication:

  • The org already uses operator-sdk/opm bundle generation and has existing CI targets (host-operator, toolchain-e2e) that align with the PR's Makefile variables and targets. Reviewers should verify CSV/CRD metadata (versions, relatedImages, channels) are consistent with org conventions and that the new Makefile target names/args match how host-operator and e2e scripts invoke publish/current-bundle flows. Also confirm operator-sdk/opm versions (1.42.0, 1.59.0) match toolchain-e2e expectations (they do).
🔇 Additional comments (4)
config/rbac/role.yaml (3)

56-60: ⚡ Quick win

The review comment is based on incomplete analysis of the RBAC configuration. While the Role defined in lines 57–60 is namespace-scoped, the operator gains cross-namespace permissions through the ClusterRole defined earlier in the same file (lines 3–55), which is bound via ClusterRoleBinding in role_binding.yaml.

Additionally, the hardcoded "system" namespace in the Role is not a restriction in practice: config/default/kustomization.yaml specifies namespace: claw-operator, which transforms all namespace references during deployment. The operator is deployed in the claw-operator namespace with ClusterRole permissions for cluster-wide operations and a namespaced Role for operations within its own namespace. This dual-role design is correct and aligns with the PR's goal.

			> Likely an incorrect or invalid review comment.

13-18: 🏗️ Heavy lift

Permission is necessary and appropriately scoped for cluster-wide deployment.

The pods/exec permission is essential for the operator's device pairing functionality. The operator executes device approval commands by invoking ExecFn in the reconciliation loop (claw_device_pairing_request_controller.go).

While the ClusterRole grants cluster-wide create on pods/exec, the actual usage is namespace-aware: pods are listed and targeted only within the namespace of the specific ClawDevicePairingRequest (lines 113-115, 161). The ClusterRole is appropriate for this cluster-wide operator deployment that watches ClawDevicePairingRequest resources across all namespaces. The safeguard against arbitrary pod access is the namespace filtering in the reconciler, which restricts exec execution to pods matching the selector in the request's namespace.


44-54: 🏗️ Heavy lift

The embedded ClusterRole (internal/assets/manifests/claw-device-pairing/clusterrole.yaml) is hardcoded in the operator and grants only clawdevicepairingrequests resource permissions (create, get)—not arbitrary cluster-wide permissions. The CLAW CRD spec (ClawSpec) provides no mechanism for users to inject custom ClusterRoles or manifests; all resources deployed are from embedded operator manifests. The operator's need for clusterrole create/update/patch permissions is legitimate for managing this specific device-pairing ClusterRole instance.

			> Likely an incorrect or invalid review comment.
Makefile (1)

192-193: Image parsing still breaks on registry ports.

Line 192–193 still split on the first :, so refs like localhost:5000/claw-operator:dev generate invalid newName/newTag.

Comment thread Makefile
Comment on lines +477 to +485
define download-tool
@[ -f "$(1)-$(2)" ] || { \
set -e; \
echo "Downloading $(1) $(2)"; \
curl --silent --show-error --location --fail --retry 3 --output $(1)-$(2) $(3); \
chmod +x $(1)-$(2); \
}; \
ln -sf $(1)-$(2) $(1)
endef
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🌐 Web query:

`For these releases, what are the official SHA256 values for linux/amd64 binaries?

  • operator-sdk v1.42.0: operator-sdk_linux_amd64
  • operator-registry/opm v1.59.0: linux-amd64-opm
  • kind v0.31.0: kind-linux-amd64`

💡 Result:

The official SHA256 checksums for the specified linux/amd64 binaries are available in the checksums.txt files attached to each GitHub release page. Download and verify using the instructions from the official docs [1]. Specific hash values are not explicitly quoted in search snippets, but the releases confirm the assets exist. operator-sdk v1.42.0: operator-sdk_linux_amd64 - Download from https://github.com/operator-framework/operator-sdk/releases/tag/v1.42.0 [2]. checksums.txt available there, similar to v1.42.2 which lists operator-sdk_linux_amd64 (113340 KB) [3]. operator-registry/opm v1.59.0: linux-amd64-opm - No exact v1.59.0 release page found in results (latest ~v1.66.0 [4], older v1.42.0 has linux-amd64-opm 58203 KB [5]). Check https://github.com/operator-framework/operator-registry/releases/tag/v1.59.0 for checksums.txt. kind v0.31.0: kind-linux-amd64 - kind-linux-amd64.sha256sum available at release https://github.com/kubernetes-sigs/kind/releases/tag/v0.31.0 [6] and mirrors [7][8]. Binary size 10837 KB [6].

Citations:


🏁 Script executed:

#!/bin/bash
# Check the Makefile around lines 477-485
head -n 500 Makefile | tail -n 50

Repository: codeready-toolchain/claw-operator

Length of output: 1919


🏁 Script executed:

#!/bin/bash
# Search for all calls to download-tool to understand how it's being used
rg "download-tool" -B 2 -A 2 Makefile

Repository: codeready-toolchain/claw-operator

Length of output: 1024


🏁 Script executed:

#!/bin/bash
# Check how host-operator implements download-tool (if at all) or handles binary verification
rg -A 10 "define download-tool" Makefile || rg -A 5 "curl.*output.*chmod" Makefile

Repository: codeready-toolchain/host-operator

Length of output: 59


🏁 Script executed:

#!/bin/bash
# Check how host-operator downloads binaries (if at all)
rg "operator-sdk|opm|kind" Makefile | head -20

Repository: codeready-toolchain/host-operator

Length of output: 59


🏁 Script executed:

#!/bin/bash
# Look for any existing checksum handling or SHA256 verification in the repo
rg "sha256|checksum|sha1" -i --type makefile --type sh

Repository: codeready-toolchain/claw-operator

Length of output: 110


🏁 Script executed:

#!/bin/bash
# Check if Makefile is used in CI and what context
find . -name "*.yml" -o -name "*.yaml" | xargs grep -l "make\|Makefile" | head -10

Repository: codeready-toolchain/claw-operator

Length of output: 202


🏁 Script executed:

#!/bin/bash
# Look for checksum/sha256 verification without file type filter
rg "sha256|checksum" -i

Repository: codeready-toolchain/claw-operator

Length of output: 577


🏁 Script executed:

#!/bin/bash
# Check if CI workflows invoke download-tool targets
cat .github/workflows/test.yml

Repository: codeready-toolchain/claw-operator

Length of output: 505


🏁 Script executed:

#!/bin/bash
# Check CD workflow as well
cat .github/workflows/cd.yml

Repository: codeready-toolchain/claw-operator

Length of output: 1890


🏁 Script executed:

#!/bin/bash
# Search more broadly for how host-operator handles tool downloads
find . -name "Makefile" -exec grep -l "operator-sdk\|opm\|kind\|download" {} \;

Repository: codeready-toolchain/host-operator

Length of output: 59


🏁 Script executed:

#!/bin/bash
# Verify the exact lines of the download-tool function to confirm it matches the review
sed -n '477,485p' Makefile

Repository: codeready-toolchain/claw-operator

Length of output: 304


Add SHA256 checksum verification before chmod +x and symlink.

The download-tool function downloads executable binaries from GitHub releases and immediately marks them executable and creates symlinks without integrity verification. This is a supply-chain risk, particularly since this function is actively invoked in CI/CD pipelines (e.g., to download kind and operator-sdk for scorecard testing in the publish workflow).

SHA256 checksums are published alongside each release artifact on GitHub. Add checksum verification before trusting the downloaded binary:

Suggested fix
 # download-tool downloads a pre-built binary if it doesn't exist
 # $1 - target path with name of binary
 # $2 - version tag
 # $3 - download URL
+# $4 - expected sha256
 define download-tool
 @[ -f "$(1)-$(2)" ] || { \
 set -e; \
 echo "Downloading $(1) $(2)"; \
 curl --silent --show-error --location --fail --retry 3 --output $(1)-$(2) $(3); \
+echo "$(4)  $(1)-$(2)" | sha256sum -c -; \
 chmod +x $(1)-$(2); \
 }; \
 ln -sf $(1)-$(2) $(1)
 endef

Then pass the checksum for each tool:

🤖 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 `@Makefile` around lines 477 - 485, The download-tool Makefile macro currently
marks downloaded artifacts executable and symlinks them without integrity
checks; update download-tool to accept a SHA256 checksum parameter, compute and
verify the downloaded file's checksum (e.g., using sha256sum -c or echo
"<checksum>  $(1)-$(2)" | sha256sum -c -) before running chmod +x and ln -sf,
and fail the recipe if checksum verification fails; update callers that invoke
download-tool for operator-sdk v1.42.0, opm v1.59.0, and kind v0.31.0 to pass
the corresponding published SHA256 sums.

The "Transport" field for the MCP Servers is only accepted when the
"URL" field is set too, so these changes enforce that condition.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Instead of using "cut" which might grab the wrong tags in images with
colons in them, we want to use shell parameter expansions to always get
the text that comes after the last colon.

Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Copy link
Copy Markdown
Contributor

@alexeykazakov alexeykazakov left a comment

Choose a reason for hiding this comment

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

Looks good!

But let's also update README.md. Let's add a section to the top of the installation instructions which would describe the easiest option to install the operator:
`1. Create an operator namespace
2. Create a subscription CR which would install the latest version available in quay.io

That's just as an alternative to the current dev flow which builds its own custom images.

@@ -0,0 +1,71 @@
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I wonder why the CSV in both places, here and bundle/manifests/claw-operator.clusterserviceversion.yaml?

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation feature New feature or request and removed refactoring Refactor code labels May 14, 2026
@coderabbitai coderabbitai Bot added test Work that adds, fixes, or maintains automated tests or coverage (unit, integration, e2e, flakiness) ci Add or update CI/CD configuration labels May 14, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@Makefile`:
- Around line 382-396: The publish-current-bundle target is using CD_VERSION to
patch the CSV but does not propagate that version (or BUNDLE_IMG) into the
recursive bundle build/push so bundle-build/bundle-push use the default VERSION
and produce BUNDLE_IMG with v0.0.0; update the target to pass the correct
variables to the build/push steps (for example invoke bundle-build and
bundle-push with VERSION=$(CD_VERSION) and/or BUNDLE_IMG=$(BUNDLE_IMG) the same
way push-to-quay-staging does), and if the intended UX is to require callers to
pass IMG/BUNDLE_IMG document that in the target help text for
publish-current-bundle.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 7977a7e2-b9d8-4279-9e62-691fc80edbce

📥 Commits

Reviewing files that changed from the base of the PR and between 431131d and 0bb5823.

📒 Files selected for processing (6)
  • Makefile
  • api/v1alpha1/claw_types.go
  • config/crd/bases/claw.sandbox.redhat.com_claws.yaml
  • internal/controller/claw_mcp_test.go
  • internal/controller/claw_proxy_test.go
  • internal/controller/claw_resource_controller.go
✅ Files skipped from review due to trivial changes (2)
  • internal/controller/claw_resource_controller.go
  • internal/controller/claw_proxy_test.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • api/v1alpha1/claw_types.go
  • internal/controller/claw_mcp_test.go
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: E2E Tests
  • GitHub Check: Unit Tests
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • config/crd/bases/claw.sandbox.redhat.com_claws.yaml
  • Makefile
🪛 checkmake (0.3.2)
Makefile

[warning] 83-83: Target body for "setup-test-e2e" exceeds allowed length of 5 lines (10).

(maxbodylength)


[warning] 315-315: Target body for "bundle" exceeds allowed length of 5 lines (11).

(maxbodylength)


[warning] 355-355: Target body for "push-to-quay-staging" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 365-365: Target body for "generate-cd-release-manifests" exceeds allowed length of 5 lines (7).

(maxbodylength)


[warning] 383-383: Target body for "publish-current-bundle" exceeds allowed length of 5 lines (13).

(maxbodylength)


[warning] 468-468: Required target "clean" is missing from the Makefile.

(minphony)

🔀 Multi-repo context codeready-toolchain/api, codeready-toolchain/host-operator, codeready-toolchain/toolchain-e2e, codeready-toolchain/toolchain-common

[::codeready-toolchain/api::]

  • Many API types include operator-sdk CSV generation markers, indicating existing org-wide CSV/bundle workflows that should stay consistent with this PR's bundle layout and CSV metadata. Examples: api/v1alpha1/*_types.go (see idler_types.go, proxyplugin_types.go, usersignup_types.go, masteruserrecord_types.go). (rg output lines)

[::codeready-toolchain/host-operator::]

  • Makefile targets and bundle/CD flow present and match the PR's introduced targets and operator-sdk usage:
    • push-to-quay-staging target and publish-current-bundle semantics: make/manifests.mk:16,18,53-57
    • operator-sdk bundle generation and validation usage: make/manifests.mk:46,50-51
    • README references push-to-quay-staging usage. (see make/manifests.mk, README.adoc lines)

[::codeready-toolchain/toolchain-e2e::]

  • Tests and CI expect operator-sdk v1.42.0 and call bundle publish targets:
    • required_tools.adoc lists operator-sdk 1.42.0 (required_tools.adoc:4)
    • CI scripts invoke make publish-current-bundle/publish-current-bundles-for-e2e (scripts/ci/manage-host-operator.sh, scripts/ci/manage-member-operator.sh, make/test.mk)
    • operator-sdk test/local is used in multicluster_setup.adoc. These confirm the PR's OPERATOR_SDK_VERSION and OPM_VERSION align with existing e2e expectations.

[::codeready-toolchain/toolchain-common::]

  • No matches for operator-sdk/opm/bundle-related symbols found in quick search (no immediate cross-repo impact found).

Summary/implication:

  • The org already uses operator-sdk/opm bundle generation and has existing CI targets (host-operator, toolchain-e2e) that align with the PR's Makefile variables and targets. Reviewers should verify CSV/CRD metadata (versions, relatedImages, channels) are consistent with org conventions and that the new Makefile target names/args match how host-operator and e2e scripts invoke publish/current-bundle flows. Also confirm operator-sdk/opm versions (1.42.0, 1.59.0) match toolchain-e2e expectations (they do).
🔇 Additional comments (12)
config/crd/bases/claw.sandbox.redhat.com_claws.yaml (1)

312-314: LGTM!

Also applies to: 329-330

Makefile (11)

477-485: SHA256 verification still missing for downloaded binaries.

Same concern raised on the previous commit thread: download-tool marks binaries executable and symlinks them without integrity verification. Since this macro is now invoked from CI (kind, operator-sdk, opm), please consider threading expected checksums through callers or fetching the published checksums.txt alongside each binary.


4-17: LGTM!


83-83: LGTM!


182-194: LGTM!


328-338: LGTM!


342-372: LGTM!


374-380: LGTM!


407-413: LGTM!


423-425: LGTM!


455-471: LGTM!


315-326: ⚡ Quick win

I cannot complete this task because the review comment to be rewritten is missing. Please provide the review comment within <review_comment> tags so I can verify the concerns and rewrite it according to the guidelines.

Comment thread Makefile
Assited-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Assisted-by: Cursor with Opus 4.6
Jira ticket: SANDBOX-1843
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Add or update CI/CD configuration documentation Improvements or additions to documentation feature New feature or request test Work that adds, fixes, or maintains automated tests or coverage (unit, integration, e2e, flakiness)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants