Skip to content

Add install-trustee-operator step to azure-ipi-coco test#79996

Open
tbuskey wants to merge 19 commits into
openshift:mainfrom
tbuskey:install-trustee-260602
Open

Add install-trustee-operator step to azure-ipi-coco test#79996
tbuskey wants to merge 19 commits into
openshift:mainfrom
tbuskey:install-trustee-260602

Conversation

@tbuskey
Copy link
Copy Markdown
Contributor

@tbuskey tbuskey commented Jun 2, 2026

Summary

This PR integrates the install-trustee-operator step into the CoCo test workflow for the sandboxed-containers-operator.

Changes

  • Add install-trustee-operator step to sandboxed-containers-operator-pre chain
  • Enable TRUSTEE_INSTALL=true for azure-ipi-coco test
  • Add TRUSTEE_CATALOG_SOURCE_IMAGE and TRUSTEE_CATALOG_SOURCE_NAME environment variables
  • Import OSC debugging wrapper scripts for CI troubleshooting

Details

The install-trustee-operator step:

  • Installs the trustee operator using OLM
  • Deploys trustee operands (KBS, Attestation Service)
  • Verifies connectivity using kbs-client
  • Updates osc-config ConfigMap with TRUSTEE_URL and INITDATA
  • Works with network restrictions (uses pre-rendered manifests)

Testing

The step will be tested via rehearsal on the azure-ipi-coco job.

🤖 Generated with Claude Code

Summary by CodeRabbit

This PR updates OpenShift CI configuration in the openshift/release repository to add an automated trustee-operator installation step into the Sandboxed Containers Operator CI workflow and enables it for the azure-ipi-coco test job.

What changed (practical terms)

  • Adds a new ci-operator step (sandboxed-containers-operator-install-trustee-operator) that, when TRUSTEE_INSTALL=true, installs the Trustee operator via OLM (CatalogSource/Subscription/InstallPlan/CSV), deploys trustee operands (KBS, Attestation Service), derives the Trustee KBS URL, generates INITDATA (TLS certs, KBS URLs, image security policy), patches the cluster osc-config ConfigMap with TRUSTEE_URL/INITDATA, and verifies connectivity using a kbs-client pod. The step uses pre-rendered manifests with runtime substitution so it can run under network-restricted CI.
  • Inserts the new step into the sandboxed-containers-operator-pre chain so trustee installation runs before metadata recording and downstream tests.
  • Enables TRUSTEE_INSTALL for the azure-ipi-coco job and adds TRUSTEE_CATALOG_SOURCE_IMAGE and TRUSTEE_CATALOG_SOURCE_NAME environment variables in the downstream-candidate job config, so the job will provision the trustee operator during rehearsal/CI runs.
  • Adds OWNERS and metadata for the new step (approvers/reviewers: ldoktor, tbuskey, vvoronko, wainersm).
  • Includes robust wait/retry/failure diagnostics and captures KBS attestation logs as CI artifacts for troubleshooting.

Files/locations changed

  • Added step implementation and metadata:
    • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh (installer + verification logic)
    • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml (step ref, env docs, resource requests)
    • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.metadata.json
    • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/OWNERS
  • Updated pre-chain to include the step:
    • ci-operator/step-registry/sandboxed-containers-operator/pre/sandboxed-containers-operator-pre-chain.yaml
  • Updated downstream-candidate job config to enable trustee for coco test:
    • ci-operator/config/openshift/sandboxed-containers-operator/openshift-sandboxed-containers-operator-devel__downstream-candidate.yaml (azure-ipi-coco env: TRUSTEE_INSTALL: "true", TRUSTEE_CATALOG_SOURCE_IMAGE, TRUSTEE_CATALOG_SOURCE_NAME, TRUSTEE_URL placeholder)

Impact

  • The azure-ipi-coco CI job will now provision the Trustee operator and operands as part of pre-test setup, produce INITDATA for Confidential Containers, and run an attestation/connectivity verification. This enables end-to-end trustee/KBS validation in CI while remaining compatible with network-restricted execution.

tbuskey and others added 9 commits June 2, 2026 13:03
…dation

Critical fixes for kbs-client connectivity test:

1. **Update kbs-client image**: v0.17.0 → v0.19.0
   - Newer version with updated KBS protocol support
   - Fixes compatibility issues with current KBS

2. **Auto-discover latest tag with skopeo**:
   - NEW: get_kbs_client_tag() function
   - Checks KBS_CLIENT_TAG env var first (for overrides)
   - Uses skopeo to find latest v.X.Y.Z tag automatically
   - Falls back to v0.19.0 if skopeo fails
   - Command: skopeo list-tags docker://quay.io/confidential-containers/kbs-client

3. **Environment variable support**:
   - NEW: KBS_CLIENT_TAG env var in ref.yaml
   - Allows pinning specific version in CI config
   - Empty (default) = auto-discover latest
   - Set to specific tag = use that version

4. **Fix resource validation logic**:
   - REMOVED: 404 treated as success (was incorrect)
   - NOW: Must actually retrieve a resource to pass
   - Test resource: default/cosign-keys/key-0 (exists from KbsConfig)
   - Only succeeds if kbs-client exit code is 0 (resource retrieved)

5. **Better error detection**:
   - 404: Resource not found - KbsConfig secret publishing issue
   - 401: Unauthorized - Attestation failure
   - Timeout: KBS service unreachable
   - SSL/TLS: Wrong URL protocol

Previous behavior:
- Hardcoded v0.17.0 (outdated)
- Got 401 Unauthorized but treated as success
- Never actually retrieved a resource
- False positive on connectivity

New behavior:
- Auto-discovers latest kbs-client version
- Must successfully retrieve cosign-keys/key-0 resource
- Fails if 404, 401, timeout, or any error
- Proves KBS connectivity AND attestation work
- Allows version override via KBS_CLIENT_TAG env var

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove INITDATA content from logs (security)
- Focus on failures, not success/progress messages
- Keep version logging (trustee image, kbs-client tag)
- Keep attestation patterns (POST attest, GET resource)
- Reduce TEE platform warnings to single line (WARN:)
- Remove duplicate/verbose progress updates
The RCA (Resource-Centric Authorization) protocol flow includes:
1. GET resource → 401 (no token) - triggers attestation
2. POST /auth + POST /attest - get token via attestation
3. GET resource → 200 (with token) - success

kbs-client emits WARN messages during this normal flow:
- 'No TEE platform detected. Sample Attester will be used.'
- 'Authenticating with KBS failed. Perform a new RCAR handshake'
- 'Attestation Token not found'

These are expected protocol messages, not errors.

Changes:
- Separate stdout (resource data) from stderr (warnings)
- On success: show resource size and first line only
- On failure: show full stderr and stdout for debugging
- Add comments explaining RCA protocol flow
- Update attestation patterns to show full flow including 401

This eliminates confusing WARN messages that made successful
operations appear to have failed.
When operator deployment fails to appear, check:
- CatalogSource status and pod
- Subscription status and conditions
- InstallPlan existence
- CSV existence

This will help diagnose why OLM isn't creating the operator deployment.
Instead of just checking for deployment, poll through each OLM stage:
1. CatalogSource READY (60s timeout)
2. Subscription has InstallPlan reference (60s)
3. InstallPlan Complete (60s)
4. CSV Succeeded (60s)
5. Deployment Available (60s)

Each stage polls every 5s (12 attempts).
Total max wait: 5 minutes (was 150s before).

Shows exactly which stage fails with appropriate error output.
Changes:
- Add Secret kbsres1 with key1=cmVzMXZhbDEK for testing
- Add kbsres1 to KbsConfig kbsSecretResources
- Test kbsres1/key1 instead of cosign-keys/key-0 for better validation
- Show full oc exec command in logs
- Display retrieved resource value in logs

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Issue: stringData auto-base64-encodes values, causing double-encoding:
- stringData: cmVzMXZhbDEK → stored as Y21Wek1YWmhiREVL
- KBS returns: Y21Wek1YWmhiREVL (wrong)

Fix: Use data field to store pre-encoded value directly:
- data: cmVzMXZhbDEK → stored as cmVzMXZhbDEK
- KBS returns: cmVzMXZhbDEK (correct, base64 of "res1val1")

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…election

Changes:
- Add TRUSTEE_CATALOG_SOURCE_NAME (default: redhat-operators)
- Add TRUSTEE_CATALOG_SOURCE_IMAGE (default: empty)
- Only create CatalogSource if TRUSTEE_CATALOG_SOURCE_IMAGE is set
- Check if CatalogSource exists before creating to avoid overwrites
- Skip CatalogSource readiness wait when using existing catalog
- Update Subscription to use configurable catalog source name
- Deprecate TRUSTEE_IMAGE_REPO/TAG (only used with custom image)

Usage patterns:
1. Default (redhat-operators): Set nothing, uses existing catalog
2. Custom catalog (brew-catalog): Set TRUSTEE_CATALOG_SOURCE_NAME only
3. New custom catalog: Set both NAME and IMAGE to create new catalog

Benefits:
- Simpler than OSC (no auto-discovery of latest image tags)
- Supports existing catalogs without modification
- Allows custom catalogs when needed
- Prevents overwriting existing catalog sources

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changes:
- Add map_trustee_to_kbs_client_version() function
- Extract trustee version from CSV name (e.g., trustee-operator.v1.1.0)
- Map trustee versions to compatible kbs-client versions:
  - trustee 1.1.x → kbs-client v0.17.0
  - trustee 1.11.x → kbs-client v0.19.0
- Export TRUSTEE_CSV_NAME from wait_for_operator for use in mapping
- Update get_kbs_client_tag() to use version mapping before auto-discovery

Version selection priority:
1. KBS_CLIENT_TAG env var (explicit override)
2. Version mapping from trustee CSV (semantic versioning)
3. Auto-discovery (latest semver tag from registry)
4. Fallback: v0.17.0

This ensures kbs-client compatibility with the installed trustee version.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 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

Adds a CI step, wiring, and a new installer script that conditionally deploys the Trustee operator and operands, discovers endpoints, generates encoded INITDATA, patches cluster config, and verifies connectivity via a temporary kbs-client pod.

Changes

Trustee Operator Installation Workflow

Layer / File(s) Summary
CI step registration and wiring
ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml, ci-operator/step-registry/sandboxed-containers-operator/pre/sandboxed-containers-operator-pre-chain.yaml, ci-operator/config/openshift/sandboxed-containers-operator/openshift-sandboxed-containers-operator-devel__downstream-candidate.yaml, ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/OWNERS, ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.metadata.json
Registers the new step with resources and documented env, inserts the step into the pre-chain, adds TRUSTEE_* env vars to the azure-ipi-coco job, and populates OWNERS and metadata for the step.
Script initialization and helpers
ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh (lines 1-79)
Set defaults (SHARED_DIR, KUBECONFIG), respect TRUSTEE_INSTALL early-exit, create scratch dir, install EXIT trap, provide retry helper, and detect cluster domain.
Operator manifests and install
same script (lines 81-429)
Conditionally emit CatalogSource, generate operator manifests (Namespace, ImageDigest/ImageTag mirror sets, OperatorGroup, Subscription), apply them, and wait through OLM phases to export TRUSTEE_CSV_NAME.
Operands installation and readiness
same script (lines 190-464)
Render and apply operand YAML (Secrets, KbsConfig, Route, TrusteeConfig) with domain substitution and wait for operand deployments (excluding controller-manager) to become Available, emitting diagnostics on timeout.
Service discovery and initialization data
same script (lines 466-695)
Discover TLS cert material, resolve Trustee/KBS URL (Route → LB → ClusterIP), write TRUSTEE_URL/host/port to ${SHARED_DIR}, generate initdata.toml (embed cert and policy via jq or Python fallback), encode to INITDATA, and patch osc-config ConfigMap.
kbs-client selection and connectivity verification
same script (lines 696-922)
Select kbs-client tag (override → CSV mapping → registry discovery → fallback), create a temporary kbs-client pod, run kbs-client get-resource against Trustee KBS, collect and summarize KBS logs, and fail on verification errors.
Main orchestration
same script (lines 924-934)
Execute full sequence: derive cluster domain, install/wait operator, install/wait operands, resolve URL, create INITDATA, patch ConfigMap, and verify connectivity.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested labels

lgtm, rehearsals-ack

Suggested reviewers

  • hector-vido

Important

Pre-merge checks failed

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

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error Script logs sensitive data: KBS secret values (line 845), TLS certificates (line 499), base64-encoded INITDATA with URLs/certs (lines 678, 681), and service error output (lines 855-861). Remove echo ">>> Resource value: ${resource_value}" and echo "${cert_data}" statements; avoid logging retrieved secrets, certificates, or encoded configs; consider redacting error outputs.
Docstring Coverage ⚠️ Warning Docstring coverage is 7.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (13 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title accurately describes the main change: adding an install-trustee-operator step to the azure-ipi-coco test workflow.
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 PR contains no Ginkgo test files. Changes are to CI configuration (YAML), Bash scripts, and metadata files only—the check for stable test names does not apply.
Test Structure And Quality ✅ Passed PR contains only CI infrastructure configuration files (YAML) and Bash scripts, with no Ginkgo test code. The check for Ginkgo test quality is not applicable.
Microshift Test Compatibility ✅ Passed PR adds only CI configuration files and bash scripts, not Ginkgo e2e tests. The MicroShift Test Compatibility check is not applicable to non-test files.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No Ginkgo e2e tests are added in this PR. It modifies only CI infrastructure (YAML configs, bash scripts, metadata). The check does not apply to non-test code.
Topology-Aware Scheduling Compatibility ✅ Passed Script generates OLM manifests (CatalogSource, Subscription, Secrets, KbsConfig) with no topology-problematic constraints like anti-affinity, node selectors, or topology spread constraints.
Ote Binary Stdout Contract ✅ Passed PR contains only YAML configuration, Bash scripts, and metadata files. No Go test code, binaries, or OTE binary processes present that could violate the stdout contract.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No Ginkgo e2e tests are added in this PR. Changes consist only of CI operator infrastructure (Bash scripts, YAML configs, metadata). The custom check does not apply.
No-Weak-Crypto ✅ Passed No weak algorithms (MD5, SHA1, DES, RC4), custom crypto, or insecure secret comparisons found. Uses SHA256, standard TLS, and safe Kubernetes status checks only.
Container-Privileges ✅ Passed No privileged container settings found. The test Pod uses secure defaults: allowPrivilegeEscalation: false, runAsNonRoot: true, DROP ALL capabilities, and RuntimeDefault seccomp.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 2, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-ci openshift-ci Bot requested review from hector-vido and ldoktor June 2, 2026 18:05
- Add install-trustee-operator step to sandboxed-containers-operator-pre chain
- Enable TRUSTEE_INSTALL=true for azure-ipi-coco test
- Add TRUSTEE_CATALOG_SOURCE_IMAGE and TRUSTEE_CATALOG_SOURCE_NAME env vars

This integrates the trustee operator installation step into the CoCo test
workflow, allowing automated deployment and testing of confidential containers
with KBS (Key Broker Service) support.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@tbuskey tbuskey force-pushed the install-trustee-260602 branch from 4b0a0e1 to 3b4bf64 Compare June 2, 2026 18:07
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: job(s): periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-coco either don't exist or were not found to be affected, and cannot be rehearsed

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Jun 2, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: tbuskey

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

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jun 2, 2026
Copy link
Copy Markdown
Contributor

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

🤖 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 @.claude/scripts/analyze-prowjob.sh:
- Around line 24-25: The cached checkout logic ignores PROWJOB_ANALYZER_BRANCH
so a preexisting CACHE_DIR can end up on the wrong branch; update the script to
either key the cache by branch (e.g., incorporate ${BRANCH} into CACHE_DIR) or,
before running dig.py, ensure the repo in CACHE_DIR is on the requested branch
by running a fetch and explicit checkout/reset to origin/${BRANCH} (git fetch
origin && git checkout -B "${BRANCH}" "origin/${BRANCH}" || git reset --hard
"origin/${BRANCH}"). Apply the same change to the other checkout blocks
referenced (around lines 47-69 and 84-95) so every cached use honors BRANCH.
- Around line 159-162: The script currently treats no positional arguments the
same as --help and exits 0; change the logic so missing required PROW_JOB_URL
causes a non-zero exit: call show_usage (preferably printing to stderr) and exit
with a failure code (e.g., exit 1) when no args are provided, but continue to
treat --help or -h as success and exit 0; update the if/branch that currently
checks [[ $# -eq 0 || "$1" == "--help" || "$1" == "-h" ]] to distinguish the
empty-args case from the help flags and reference show_usage and PROW_JOB_URL in
your change.

In @.claude/scripts/monitor-rehearsal.sh:
- Around line 61-79: Replace the current grep+awk approach and the "|| echo"
swallow with a fail-fast, single JSON query: call gh pr checks ${PR_NUM} --repo
openshift/release --json name,state,url (or link) and exit if the gh command
returns non-zero; then filter the returned JSON to find exactly one check whose
"name" equals ${JOB_NAME} (or apply the explicit matching rule) and set
job_status from the check's "state" field and PROW_URL from the check's
"url"/"link" field; apply this change in both the final-status branch (where
final_status is derived) and the polling branch (where
status_line/job_status/PROW_URL are set) so network/auth errors surface
immediately and columns are not relied on.

In @.claude/scripts/prow-fetch.sh:
- Around line 121-126: The pr_checks function is currently swallowing failures
from the gh command by piping its stderr to /dev/null and using | grep ... ||
true; change it so gh pr checks failures are propagated while still treating
grep "no matches" as non-fatal: run gh pr checks "${pr}" --repo
openshift/release and check its exit status first (or enable pipefail),
capturing its stdout into a variable (e.g., checks_output) without discarding
stderr, return/exit if gh fails, then run grep "${pattern}" against that
captured output and ignore only grep’s non-zero exit for no matches; update the
pr_checks function accordingly so gh errors surface but missing pattern does not
fail the script.
- Around line 79-88: In fetch_url(), the curl invocation uses curl_opts=(-sS)
which doesn't fail on HTTP 4xx/5xx; update the curl options in the fetch_url
function (the curl_opts array) to include -f (e.g., curl_opts=(-sS -f)) so that
HTTP errors cause curl to exit non-zero; preserve the existing
PROW_FETCH_HEADERS handling and logging (log_info "Fetching: ${url}") and ensure
callers of fetch_url will observe failure return codes.

In @.claude/scripts/trigger-rehearsal.sh:
- Line 1: Replace the incorrect commented shebang "#\!/bin/bash" at the top of
.claude/scripts/trigger-rehearsal.sh with a valid bash shebang (start the file
with "#!/bin/bash") so the script executes under Bash when invoked directly;
ensure the corrected line is the very first line of the file and has no leading
whitespace or comment characters.

In
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh`:
- Around line 297-301: The current pipeline swallows real oc apply failures by
piping get_trustee_catalog_source_manifest into oc apply -f - || true; instead
capture the manifest output from get_trustee_catalog_source_manifest
(referencing that function) into a variable or temp file, check if it is
non-empty (i.e. a manifest was emitted using TRUSTEE_CATALOG_SOURCE_NAME and
TRUSTEE_CATALOG_SOURCE_IMAGE substitutions), and only then run oc apply -f -
without "|| true" so failures fail the step and surface immediately; if the
manifest is empty, skip the apply path gracefully.
- Around line 693-715: The KBS client pod manifest returned by
get_kbs_client_manifest currently omits readOnlyRootFilesystem, resource
requests/limits, and leaves a service account token automounted; update the Pod
spec (in get_kbs_client_manifest) to set automountServiceAccountToken: false on
the Pod, add container securityContext.readOnlyRootFilesystem: true (in the
kbs-client container), keep allowPrivilegeEscalation: false and runAsNonRoot:
true, and add resource requests and limits (cpu and memory) for the kbs-client
container to satisfy the repo manifest requirements.
- Around line 88-90: When detecting an existing CatalogSource named by
TRUSTEE_CATALOG_SOURCE_NAME (the branch around the oc get check), also fetch its
spec.image and compare it to TRUSTEE_CATALOG_SOURCE_IMAGE; if the images differ,
fail fast with a non-zero exit and a clear error message describing the name and
both image values so we don't silently point subscriptions to the wrong catalog.
Update the existing conditional that currently returns 0 to perform the image
comparison (using oc to read spec.image for the CatalogSource) and only skip
creation when they match; otherwise exit with an error asking for a distinct
TRUSTEE_CATALOG_SOURCE_NAME or to update TRUSTEE_CATALOG_SOURCE_IMAGE.

In
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml`:
- Around line 66-67: The "NO NETWORK ACCESS REQUIRED" statement is incorrect
because the step invokes skopeo list-tags and pulls
quay.io/confidential-containers/kbs-client:${tag}, so either update the claim to
indicate external network access is required or change the step to use a
configurable/mirrored image and avoid remote tag lookups; specifically modify
the logic that calls skopeo list-tags and the hardcoded
quay.io/confidential-containers/kbs-client:${tag} reference to instead read an
injected variable (e.g., KBS_CLIENT_IMAGE or IMAGE_REGISTRY+IMAGE_NAME+TAG) and
skip skopeo when restrict_network_access is true, or document the requirement to
have the image mirrored locally.
- Around line 32-45: The three advertised step inputs TRUSTEE_IMAGE_REPO,
TRUSTEE_IMAGE_TAG, and TRUSTEE_CHARTS_REF are unused and must either be removed
from the step spec or actually consumed; choose one fix: (A) Remove the three
entries from the step inputs in
sandboxed-containers-operator-install-trustee-operator-ref.yaml to avoid
exposing dead knobs, or (B) implement consumption by plumb­ing those env vars
into the companion install-trustee-operator command/script and use them where
the trustee catalog image and chart ref are built/queried (e.g., in the code
paths that construct the trustee catalog source image name and the charts git
ref); ensure variable names TRUSTEE_IMAGE_REPO, TRUSTEE_IMAGE_TAG, and
TRUSTEE_CHARTS_REF are read from the environment and override defaults when
present.
🪄 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 YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: ac30892a-d2fb-40f9-b4ee-857c8cdb5821

📥 Commits

Reviewing files that changed from the base of the PR and between d5f6a1a and 4b0a0e1.

📒 Files selected for processing (8)
  • .claude/scripts/analyze-prowjob.sh
  • .claude/scripts/monitor-rehearsal.sh
  • .claude/scripts/prow-fetch.sh
  • .claude/scripts/trigger-rehearsal.sh
  • ci-operator/config/openshift/sandboxed-containers-operator/openshift-sandboxed-containers-operator-devel__downstream-candidate.yaml
  • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh
  • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml
  • ci-operator/step-registry/sandboxed-containers-operator/pre/sandboxed-containers-operator-pre-chain.yaml

Comment thread .claude/scripts/analyze-prowjob.sh Outdated
Comment on lines +24 to +25
CACHE_DIR="${PROWJOB_ANALYZER_CACHE:-${HOME}/.cache/prowjob-analyzer}"
BRANCH="${PROWJOB_ANALYZER_BRANCH:-devel}"
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Honor PROWJOB_ANALYZER_BRANCH for cached checkouts.

Once ${CACHE_DIR} already exists, the requested branch is ignored until the 24-hour refresh, and git pull origin "${BRANCH}" then pulls that remote branch into whatever local branch is currently checked out. That can leave this wrapper running the wrong analyzer revision or a mixed checkout. Either key the cache by branch or explicitly fetch/switch/reset to the requested branch before invoking dig.py.

Suggested fix
-CACHE_DIR="${PROWJOB_ANALYZER_CACHE:-${HOME}/.cache/prowjob-analyzer}"
+CACHE_ROOT="${PROWJOB_ANALYZER_CACHE:-${HOME}/.cache/prowjob-analyzer}"
+CACHE_DIR="${CACHE_ROOT}/${BRANCH}"
 BRANCH="${PROWJOB_ANALYZER_BRANCH:-devel}"
 function update_analyzer() {
     pushd "${CACHE_DIR}" > /dev/null
 
-    if git pull origin "${BRANCH}" >&2; then
+    if git fetch origin "${BRANCH}" >&2 \
+        && git checkout -B "${BRANCH}" "origin/${BRANCH}" >&2; then
         date +%s > "${CACHE_DIR}/.last_update"
         log_info "Prowjob-analyzer updated successfully"
     else

Also applies to: 47-69, 84-95

🤖 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 @.claude/scripts/analyze-prowjob.sh around lines 24 - 25, The cached checkout
logic ignores PROWJOB_ANALYZER_BRANCH so a preexisting CACHE_DIR can end up on
the wrong branch; update the script to either key the cache by branch (e.g.,
incorporate ${BRANCH} into CACHE_DIR) or, before running dig.py, ensure the repo
in CACHE_DIR is on the requested branch by running a fetch and explicit
checkout/reset to origin/${BRANCH} (git fetch origin && git checkout -B
"${BRANCH}" "origin/${BRANCH}" || git reset --hard "origin/${BRANCH}"). Apply
the same change to the other checkout blocks referenced (around lines 47-69 and
84-95) so every cached use honors BRANCH.

Comment thread .claude/scripts/analyze-prowjob.sh Outdated
Comment on lines +159 to +162
# Handle --help
if [[ $# -eq 0 || "$1" == "--help" || "$1" == "-h" ]]; then
show_usage
exit 0
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Return a failure code when the required URL is missing.

PROW_JOB_URL is documented as required, but the empty-args path exits 0. That turns a caller bug into a false success for any automation wrapping this helper. Keep --help/-h as success, and exit non-zero when no positional args are provided.

Suggested fix
 function main() {
-    # Handle --help
-    if [[ $# -eq 0 || "$1" == "--help" || "$1" == "-h" ]]; then
+    if [[ $# -eq 0 ]]; then
+        show_usage
+        exit 1
+    fi
+
+    # Handle --help
+    if [[ "$1" == "--help" || "$1" == "-h" ]]; then
         show_usage
         exit 0
     fi
📝 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
# Handle --help
if [[ $# -eq 0 || "$1" == "--help" || "$1" == "-h" ]]; then
show_usage
exit 0
if [[ $# -eq 0 ]]; then
show_usage
exit 1
fi
# Handle --help
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
show_usage
exit 0
fi
🤖 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 @.claude/scripts/analyze-prowjob.sh around lines 159 - 162, The script
currently treats no positional arguments the same as --help and exits 0; change
the logic so missing required PROW_JOB_URL causes a non-zero exit: call
show_usage (preferably printing to stderr) and exit with a failure code (e.g.,
exit 1) when no args are provided, but continue to treat --help or -h as success
and exit 0; update the if/branch that currently checks [[ $# -eq 0 || "$1" ==
"--help" || "$1" == "-h" ]] to distinguish the empty-args case from the help
flags and reference show_usage and PROW_JOB_URL in your change.

Comment thread .claude/scripts/monitor-rehearsal.sh Outdated
Comment on lines +61 to +79
final_status=$(gh pr checks ${PR_NUM} --repo openshift/release 2>&1 | grep "${JOB_NAME}" || echo "Status unavailable")
echo "Final Status: ${final_status}"
echo ""
echo "Monitoring ended. Check Prow URL for full details."
exit 0
fi

# Check job status
status_line=$(gh pr checks ${PR_NUM} --repo openshift/release 2>&1 | grep "${JOB_NAME}" || echo "")

if [ -n "${status_line}" ]; then
job_status=$(echo "${status_line}" | awk '{print $2}')
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
elapsed_mins=$(( (current_time - (END_TIME - (DURATION_HOURS * 3600))) / 60 ))

# Extract Prow URL if not already set
if [ -z "${PROW_URL}" ] && [ "${job_status}" != "pending" ]; then
PROW_URL=$(echo "${status_line}" | awk '{print $4}')
fi
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether the target PR currently produces multiple matching rows
# or whether gh failures are being masked.
set -euo pipefail

PR_NUM="${1:?PR number required}"
JOB_NAME="${2:?short job name required}"

echo "=== raw gh pr checks output ==="
gh pr checks "${PR_NUM}" --repo openshift/release

echo
echo "=== rows matched by current grep ==="
gh pr checks "${PR_NUM}" --repo openshift/release | grep -n -- "${JOB_NAME}" || true

Repository: openshift/release

Length of output: 102


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant portions of the script (around the referenced lines)
sed -n '1,140p' .claude/scripts/monitor-rehearsal.sh | nl -ba

Repository: openshift/release

Length of output: 104


🌐 Web query:

gh pr checks output columns NAME STATUS URL awk $4

💡 Result:

The gh pr checks command in the GitHub CLI outputs CI status for a pull request as line-based, plain-text by default [1][2]. In its default text mode, the output is structured into columns typically containing the status, the name of the check, and other associated metadata (such as duration or links) [1][3]. When using awk to parse this output, $4 refers to the fourth column of text [4]. Depending on your specific CLI version and terminal configuration, the columns may vary, but they generally follow this layout: 1. Status (e.g., ✓, X, or a state label like "pass" or "fail") 2. Name of the check 3. Duration/Timestamp or other metadata 4. Additional information, such as a URL or a secondary status description [1][3] To work with this data programmatically, it is highly recommended to use the --json flag instead of parsing plain text [2]. This ensures stable, machine-readable output [2]. You can specify the desired fields using the --json flag and filter or format the results using --jq [1][2]. Example of using JSON for better reliability: gh pr checks --json name,state,link --jq '.[] | [.name,.state,.link] | @tsv' This approach avoids the fragility of column-based parsing with awk, as the output structure of the text-based table is subject to change across CLI versions [2].

Citations:


🏁 Script executed:

#!/bin/bash
# Show the exact code around the referenced lines, with line numbers (no nl dependency)
awk 'NR>=45 && NR<=100 {printf "%5d\t%s\n", NR, $0}' .claude/scripts/monitor-rehearsal.sh

Repository: openshift/release

Length of output: 2784


🏁 Script executed:

#!/bin/bash
wc -l .claude/scripts/monitor-rehearsal.sh

Repository: openshift/release

Length of output: 102


🏁 Script executed:

#!/bin/bash
# Show the argument parsing + any JOB_NAME documentation and how PROW_URL is later used
awk 'NR<=140 {printf "%5d\t%s\n", NR, $0}' .claude/scripts/monitor-rehearsal.sh

Repository: openshift/release

Length of output: 7072


🏁 Script executed:

#!/bin/bash
# Show the remainder to see if grep/awk parsing is used elsewhere, and how JOB_NAME is defined
awk 'NR>140 {printf "%5d\t%s\n", NR, $0}' .claude/scripts/monitor-rehearsal.sh

Repository: openshift/release

Length of output: 1934


🌐 Web query:

gh pr checks default text output columns example status check name url columns

💡 Result:

The GitHub CLI command gh pr checks does not natively support configurable columns for its default table output [1]. Users cannot specify which columns to display or hide using a flag like --columns [1]. However, you can achieve custom output by using the --json flag to retrieve specific fields and formatting them with the --template flag [2][1]. Default behavior: The command outputs a standard table showing the status of CI checks for a pull request. While the CLI does not provide a command to alter this specific table layout, users often use Go templates to mimic custom columns [1]. Customizing output (example): To display only specific information, such as the status and the link for each check, you can use the following command structure: gh pr checks --json state,link --template '{{tablerow "STATE" "URL"}}{{range.}}{{tablerow.state.link}}{{end}}' Available JSON fields: When using the --json flag, you can access the following fields to build your custom output [2][3]: - bucket - completedAt - description - event - link - name - startedAt - state - workflow Important limitation: The --json and --template options are not compatible with the --watch flag [1]. If you need to monitor checks until completion, you must use the standard table output without customization [1].

Citations:


Make gh pr checks fail-fast and parse a single deterministic check (avoid grep + fixed-column awk).

In .claude/scripts/monitor-rehearsal.sh (around lines 61-79), the script swallows any non-zero gh pr checks output via || echo ..., so real auth/network/rate-limit failures become indistinguishable from “no check yet” and monitoring keeps polling. Also, grep "${JOB_NAME}" can match multiple checks, and then awk '{print $2}' / awk '{print $4}' assumes a stable column layout, so job_status/PROW_URL can be taken from the wrong row.

Capture gh pr checks once and exit on non-zero, then use gh pr checks --json name,state,link ... to select exactly one matching check (by exact name, or an explicit matching rule) and derive status/URL from the JSON fields (apply in both the final-status and polling paths).

🧰 Tools
🪛 Shellcheck (0.11.0)

[info] 61-61: Double quote to prevent globbing and word splitting.

(SC2086)


[info] 69-69: Double quote to prevent globbing and word splitting.

(SC2086)

🤖 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 @.claude/scripts/monitor-rehearsal.sh around lines 61 - 79, Replace the
current grep+awk approach and the "|| echo" swallow with a fail-fast, single
JSON query: call gh pr checks ${PR_NUM} --repo openshift/release --json
name,state,url (or link) and exit if the gh command returns non-zero; then
filter the returned JSON to find exactly one check whose "name" equals
${JOB_NAME} (or apply the explicit matching rule) and set job_status from the
check's "state" field and PROW_URL from the check's "url"/"link" field; apply
this change in both the final-status branch (where final_status is derived) and
the polling branch (where status_line/job_status/PROW_URL are set) so
network/auth errors surface immediately and columns are not relied on.

Comment thread .claude/scripts/prow-fetch.sh Outdated
Comment on lines +79 to +88
function fetch_url() {
local url="$1"
local curl_opts=(-sS)

if [[ "${PROW_FETCH_HEADERS:-0}" == "1" ]]; then
curl_opts+=(-i)
fi

log_info "Fetching: ${url}"
curl "${curl_opts[@]}" "${url}"
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Does curl exit with a non-zero status for HTTP 404/500 responses by default, and what changes when using -f or --fail-with-body?

💡 Result:

By default, curl exits with status 0 even if the HTTP response code is 404 or 500; curl does not treat HTTP response codes as transfer failures unless you enable the “fail on HTTP errors” options. This is stated in the curl docs: “By default, curl does not consider HTTP response codes to indicate failure.” [1] When you use -f or --fail, curl will fail and exit non-zero (error 22) for HTTP responses with codes 400 or greater, and it will not output the response body. [1] When you use --fail-with-body, curl also exits non-zero (error 22) for HTTP response codes 400 or greater, but it differs from --fail by still outputting the response body (useful for debugging/parsing error responses). [1] Practical summary: - Default (no -f/--fail-with-body): 404/500 typically still exit 0; only transport errors (e.g., network) cause non-zero.[1] - -f/--fail: 404/500 cause exit code 22 and suppress the body.[1] - --fail-with-body: 404/500 cause exit code 22 but keep the body.[1]

Citations:


Fail HTTP errors in fetch_url()

curl -sS does not treat HTTP 404/500 as failures by default, so callers can continue as if the fetch succeeded (e.g., parsing an HTML error page as an artifact). Add -f to make HTTP 4xx/5xx exit non-zero.

Suggested fix
 function fetch_url() {
     local url="$1"
-    local curl_opts=(-sS)
+    local curl_opts=(-fsS)

     if [[ "${PROW_FETCH_HEADERS:-0}" == "1" ]]; then
         curl_opts+=(-i)
     fi
📝 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
function fetch_url() {
local url="$1"
local curl_opts=(-sS)
if [[ "${PROW_FETCH_HEADERS:-0}" == "1" ]]; then
curl_opts+=(-i)
fi
log_info "Fetching: ${url}"
curl "${curl_opts[@]}" "${url}"
function fetch_url() {
local url="$1"
local curl_opts=(-fsS)
if [[ "${PROW_FETCH_HEADERS:-0}" == "1" ]]; then
curl_opts+=(-i)
fi
log_info "Fetching: ${url}"
curl "${curl_opts[@]}" "${url}"
🤖 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 @.claude/scripts/prow-fetch.sh around lines 79 - 88, In fetch_url(), the curl
invocation uses curl_opts=(-sS) which doesn't fail on HTTP 4xx/5xx; update the
curl options in the fetch_url function (the curl_opts array) to include -f
(e.g., curl_opts=(-sS -f)) so that HTTP errors cause curl to exit non-zero;
preserve the existing PROW_FETCH_HEADERS handling and logging (log_info
"Fetching: ${url}") and ensure callers of fetch_url will observe failure return
codes.

Comment thread .claude/scripts/prow-fetch.sh Outdated
Comment on lines +121 to +126
function pr_checks() {
local pr="$1"
local pattern="${2:-rehearse}"

log_info "Getting PR checks for #${pr}"
gh pr checks "${pr}" --repo openshift/release 2>/dev/null | grep "${pattern}" || true
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

What exit status does gh pr checksreturn on authentication or request failures, and willcmd | grep ... || truemask that failure underset -o pipefail?

💡 Result:

The GitHub CLI command gh pr checks follows standard conventions for exit codes, generally returning 1 for generic failures [1][2][3]. Specifically, it returns an exit code of 4 when authentication is required [2][3]. Other documented exit codes for this command include 2 if the command is cancelled and 8 if there are pending checks [4][1][2][3]. Note that if no checks are found, the command may return exit code 16 [5]. Regarding your shell pipeline cmd | grep ... || true under set -o pipefail: Yes, appending || true will effectively mask the failure of the entire pipeline [6][7]. When set -o pipefail is enabled, a pipeline returns the exit status of the last command in the pipeline that failed, or 0 if all commands succeeded [6][8][7]. By placing || true at the end of the pipeline, you force the entire expression to return 0, regardless of whether cmd or grep encountered an error [6][7]. While this successfully prevents the script from exiting (if you also have set -e enabled), it also prevents you from detecting if cmd failed due to a genuine error, such as an authentication failure or a request error [6][7]. If you need to verify the success of the first command while ignoring grep's non-zero exit (which is common when grep finds no matches), it is better to handle the exit codes explicitly using the ${PIPESTATUS[@]} array in Bash [6][8].

Citations:


Don’t swallow gh pr checks failures as “no matches”

In .claude/scripts/prow-fetch.sh (lines 121-126), gh pr checks ... | grep "${pattern}" || true forces a zero exit even when gh pr checks fails (e.g., auth/network/permission errors—gh commonly exits non-zero). Since errors are also sent to /dev/null, the script can succeed with no output when GitHub lookup failed. Only the grep “no matches” case should be ignored.

Suggested fix
 function pr_checks() {
     local pr="$1"
     local pattern="${2:-rehearse}"
+    local checks
 
     log_info "Getting PR checks for #${pr}"
-    gh pr checks "${pr}" --repo openshift/release 2>/dev/null | grep "${pattern}" || true
+    if ! checks=$(gh pr checks "${pr}" --repo openshift/release 2>/dev/null); then
+        log_error "gh pr checks failed for PR #${pr}"
+        return 1
+    fi
+
+    grep "${pattern}" <<< "${checks}" || true
 }
📝 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
function pr_checks() {
local pr="$1"
local pattern="${2:-rehearse}"
log_info "Getting PR checks for #${pr}"
gh pr checks "${pr}" --repo openshift/release 2>/dev/null | grep "${pattern}" || true
function pr_checks() {
local pr="$1"
local pattern="${2:-rehearse}"
local checks
log_info "Getting PR checks for #${pr}"
if ! checks=$(gh pr checks "${pr}" --repo openshift/release 2>/dev/null); then
log_error "gh pr checks failed for PR #${pr}"
return 1
fi
grep "${pattern}" <<< "${checks}" || true
}
🤖 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 @.claude/scripts/prow-fetch.sh around lines 121 - 126, The pr_checks function
is currently swallowing failures from the gh command by piping its stderr to
/dev/null and using | grep ... || true; change it so gh pr checks failures are
propagated while still treating grep "no matches" as non-fatal: run gh pr checks
"${pr}" --repo openshift/release and check its exit status first (or enable
pipefail), capturing its stdout into a variable (e.g., checks_output) without
discarding stderr, return/exit if gh fails, then run grep "${pattern}" against
that captured output and ignore only grep’s non-zero exit for no matches; update
the pr_checks function accordingly so gh errors surface but missing pattern does
not fail the script.

Comment on lines +88 to +90
if oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" &>/dev/null; then
echo ">>> CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists, skipping creation"
return 0
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail fast when the requested trustee catalog name already exists with a different image.

With the new azure-ipi-coco wiring, TRUSTEE_CATALOG_SOURCE_NAME=brew-catalog already exists for the OSC catalog, so this branch skips creation and silently ignores TRUSTEE_CATALOG_SOURCE_IMAGE. The subscription then points at the wrong catalog source. Compare the existing spec.image and error out on mismatch, or require a distinct Trustee catalog name.

Suggested fix
   if oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" &>/dev/null; then
-    echo ">>> CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists, skipping creation"
-    return 0
+    local existing_image=""
+    existing_image=$(oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" -o jsonpath='{.spec.image}' 2>/dev/null || true)
+    if [[ -n "${TRUSTEE_CATALOG_SOURCE_IMAGE}" && -n "${existing_image}" && "${existing_image}" != "${TRUSTEE_CATALOG_SOURCE_IMAGE}" ]]; then
+      echo ">>> ERROR: CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists with image ${existing_image}, expected ${TRUSTEE_CATALOG_SOURCE_IMAGE}" >&2
+      return 1
+    fi
+    echo ">>> CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists, reusing it"
+    return 0
   fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" &>/dev/null; then
echo ">>> CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists, skipping creation"
return 0
if oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" &>/dev/null; then
local existing_image=""
existing_image=$(oc get catalogsource -n openshift-marketplace "${TRUSTEE_CATALOG_SOURCE_NAME}" -o jsonpath='{.spec.image}' 2>/dev/null || true)
if [[ -n "${TRUSTEE_CATALOG_SOURCE_IMAGE}" && -n "${existing_image}" && "${existing_image}" != "${TRUSTEE_CATALOG_SOURCE_IMAGE}" ]]; then
echo ">>> ERROR: CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists with image ${existing_image}, expected ${TRUSTEE_CATALOG_SOURCE_IMAGE}" >&2
return 1
fi
echo ">>> CatalogSource ${TRUSTEE_CATALOG_SOURCE_NAME} already exists, reusing it"
return 0
fi
🤖 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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh`
around lines 88 - 90, When detecting an existing CatalogSource named by
TRUSTEE_CATALOG_SOURCE_NAME (the branch around the oc get check), also fetch its
spec.image and compare it to TRUSTEE_CATALOG_SOURCE_IMAGE; if the images differ,
fail fast with a non-zero exit and a clear error message describing the name and
both image values so we don't silently point subscriptions to the wrong catalog.
Update the existing conditional that currently returns 0 to perform the image
comparison (using oc to read spec.image for the CatalogSource) and only skip
creation when they match; otherwise exit with an error asking for a distinct
TRUSTEE_CATALOG_SOURCE_NAME or to update TRUSTEE_CATALOG_SOURCE_IMAGE.

Comment on lines +297 to +301
# Apply CatalogSource if needed (only if TRUSTEE_CATALOG_SOURCE_IMAGE is set and catalog doesn't exist)
get_trustee_catalog_source_manifest | \
sed "s@TRUSTEE_CATALOG_SOURCE_NAME_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_NAME}@g" | \
sed "s@TRUSTEE_CATALOG_SOURCE_IMAGE_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_IMAGE}@g" | \
oc apply -f - || true
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don’t swallow CatalogSource apply failures.

oc apply -f - || true turns real creation errors into later OLM timeouts, which makes this step much harder to debug. It’s better to skip oc apply only when no manifest was emitted and let actual apply failures stop the step.

Suggested fix
-  get_trustee_catalog_source_manifest | \
-    sed "s@TRUSTEE_CATALOG_SOURCE_NAME_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_NAME}`@g`" | \
-    sed "s@TRUSTEE_CATALOG_SOURCE_IMAGE_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_IMAGE}`@g`" | \
-    oc apply -f - || true
+  local catalog_manifest=""
+  catalog_manifest="$(
+    get_trustee_catalog_source_manifest | \
+      sed "s@TRUSTEE_CATALOG_SOURCE_NAME_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_NAME}`@g`" | \
+      sed "s@TRUSTEE_CATALOG_SOURCE_IMAGE_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_IMAGE}`@g`"
+  )"
+  if [[ -n "${catalog_manifest//[[:space:]]/}" ]]; then
+    printf '%s\n' "${catalog_manifest}" | oc apply -f -
+  fi
📝 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
# Apply CatalogSource if needed (only if TRUSTEE_CATALOG_SOURCE_IMAGE is set and catalog doesn't exist)
get_trustee_catalog_source_manifest | \
sed "s@TRUSTEE_CATALOG_SOURCE_NAME_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_NAME}@g" | \
sed "s@TRUSTEE_CATALOG_SOURCE_IMAGE_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_IMAGE}@g" | \
oc apply -f - || true
# Apply CatalogSource if needed (only if TRUSTEE_CATALOG_SOURCE_IMAGE is set and catalog doesn't exist)
local catalog_manifest=""
catalog_manifest="$(
get_trustee_catalog_source_manifest | \
sed "s@TRUSTEE_CATALOG_SOURCE_NAME_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_NAME}`@g`" | \
sed "s@TRUSTEE_CATALOG_SOURCE_IMAGE_PLACEHOLDER@${TRUSTEE_CATALOG_SOURCE_IMAGE}`@g`"
)"
if [[ -n "${catalog_manifest//[[:space:]]/}" ]]; then
printf '%s\n' "${catalog_manifest}" | oc apply -f -
fi
🤖 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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh`
around lines 297 - 301, The current pipeline swallows real oc apply failures by
piping get_trustee_catalog_source_manifest into oc apply -f - || true; instead
capture the manifest output from get_trustee_catalog_source_manifest
(referencing that function) into a variable or temp file, check if it is
non-empty (i.e. a manifest was emitted using TRUSTEE_CATALOG_SOURCE_NAME and
TRUSTEE_CATALOG_SOURCE_IMAGE substitutions), and only then run oc apply -f -
without "|| true" so failures fail the step and surface immediately; if the
manifest is empty, skip the apply path gracefully.

Comment on lines +693 to +715
function get_kbs_client_manifest() {
cat << 'MANIFEST_EOF'
---
apiVersion: v1
kind: Pod
metadata:
name: KBS_CLIENT_POD_PLACEHOLDER
namespace: KBS_CLIENT_NAMESPACE_PLACEHOLDER
spec:
containers:
- name: kbs-client
image: KBS_CLIENT_IMAGE_PLACEHOLDER
command: ["sleep", "infinity"]
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
capabilities:
drop:
- ALL
restartPolicy: Never
MANIFEST_EOF
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.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Harden the temporary kbs-client pod manifest.

This pod still gets a service-account token by default and it omits readOnlyRootFilesystem plus any resource requests/limits. For a one-shot verification pod, that’s unnecessary exposure and it also misses the repo’s manifest requirements.

Suggested fix
 spec:
+  automountServiceAccountToken: false
   containers:
   - name: kbs-client
     image: KBS_CLIENT_IMAGE_PLACEHOLDER
     command: ["sleep", "infinity"]
     securityContext:
       allowPrivilegeEscalation: false
       runAsNonRoot: true
+      readOnlyRootFilesystem: true
       seccompProfile:
         type: RuntimeDefault
       capabilities:
         drop:
         - ALL
+    resources:
+      requests:
+        cpu: 10m
+        memory: 64Mi
+      limits:
+        cpu: 100m
+        memory: 256Mi
   restartPolicy: Never

As per coding guidelines: securityContext: runAsNonRoot, readOnlyRootFilesystem, allowPrivilegeEscalation: false, Resource limits (cpu, memory) on every container, and automountServiceAccountToken: false unless needed.

📝 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
function get_kbs_client_manifest() {
cat << 'MANIFEST_EOF'
---
apiVersion: v1
kind: Pod
metadata:
name: KBS_CLIENT_POD_PLACEHOLDER
namespace: KBS_CLIENT_NAMESPACE_PLACEHOLDER
spec:
containers:
- name: kbs-client
image: KBS_CLIENT_IMAGE_PLACEHOLDER
command: ["sleep", "infinity"]
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
capabilities:
drop:
- ALL
restartPolicy: Never
MANIFEST_EOF
function get_kbs_client_manifest() {
cat << 'MANIFEST_EOF'
---
apiVersion: v1
kind: Pod
metadata:
name: KBS_CLIENT_POD_PLACEHOLDER
namespace: KBS_CLIENT_NAMESPACE_PLACEHOLDER
spec:
automountServiceAccountToken: false
containers:
- name: kbs-client
image: KBS_CLIENT_IMAGE_PLACEHOLDER
command: ["sleep", "infinity"]
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
readOnlyRootFilesystem: true
seccompProfile:
type: RuntimeDefault
capabilities:
drop:
- ALL
resources:
requests:
cpu: 10m
memory: 64Mi
limits:
cpu: 100m
memory: 256Mi
restartPolicy: Never
MANIFEST_EOF
🤖 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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-commands.sh`
around lines 693 - 715, The KBS client pod manifest returned by
get_kbs_client_manifest currently omits readOnlyRootFilesystem, resource
requests/limits, and leaves a service account token automounted; update the Pod
spec (in get_kbs_client_manifest) to set automountServiceAccountToken: false on
the Pod, add container securityContext.readOnlyRootFilesystem: true (in the
kbs-client container), keep allowPrivilegeEscalation: false and runAsNonRoot:
true, and add resource requests and limits (cpu and memory) for the kbs-client
container to satisfy the repo manifest requirements.

Comment on lines +32 to +45
- name: TRUSTEE_IMAGE_REPO
default: "quay.io/redhat-user-workloads/ose-osc-tenant/trustee-test-fbc"
documentation: |-
(DEPRECATED - only used when TRUSTEE_CATALOG_SOURCE_IMAGE is set)
The container image repository for the trustee operator catalog
- name: TRUSTEE_IMAGE_TAG
default: "1.1.0-1776506656"
documentation: |-
(DEPRECATED - only used when TRUSTEE_CATALOG_SOURCE_IMAGE is set)
The container image tag for the trustee operator catalog
- name: TRUSTEE_CHARTS_REF
default: "main"
documentation: |-
The git ref (branch/tag/commit) to use from the confidential-devhub/charts repository
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Remove or implement the dead step inputs.

TRUSTEE_IMAGE_REPO, TRUSTEE_IMAGE_TAG, and TRUSTEE_CHARTS_REF are advertised here, but the companion commands script never consumes any of them. Right now callers can set three public knobs and get no behavior change, which is a config-contract break.

🤖 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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml`
around lines 32 - 45, The three advertised step inputs TRUSTEE_IMAGE_REPO,
TRUSTEE_IMAGE_TAG, and TRUSTEE_CHARTS_REF are unused and must either be removed
from the step spec or actually consumed; choose one fix: (A) Remove the three
entries from the step inputs in
sandboxed-containers-operator-install-trustee-operator-ref.yaml to avoid
exposing dead knobs, or (B) implement consumption by plumb­ing those env vars
into the companion install-trustee-operator command/script and use them where
the trustee catalog image and chart ref are built/queried (e.g., in the code
paths that construct the trustee catalog source image name and the charts git
ref); ensure variable names TRUSTEE_IMAGE_REPO, TRUSTEE_IMAGE_TAG, and
TRUSTEE_CHARTS_REF are read from the environment and override defaults when
present.

Comment on lines +66 to +67
NO NETWORK ACCESS REQUIRED: This step uses pre-rendered manifests with runtime variable
substitution via sed, eliminating the need for helm or git. Works with restrict_network_access: true.
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The “no network access required” claim is too strong.

The script still does a skopeo list-tags against Quay and launches a pod from quay.io/confidential-containers/kbs-client:${tag}. That means this step is not actually self-contained for restricted-network jobs unless those external pulls are already mirrored elsewhere.

🤖 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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.yaml`
around lines 66 - 67, The "NO NETWORK ACCESS REQUIRED" statement is incorrect
because the step invokes skopeo list-tags and pulls
quay.io/confidential-containers/kbs-client:${tag}, so either update the claim to
indicate external network access is required or change the step to use a
configurable/mirrored image and avoid remote tag lookups; specifically modify
the logic that calls skopeo list-tags and the hardcoded
quay.io/confidential-containers/kbs-client:${tag} reference to instead read an
injected variable (e.g., KBS_CLIENT_IMAGE or IMAGE_REGISTRY+IMAGE_NAME+TAG) and
skip skopeo when restrict_network_access is true, or document the requirement to
have the image mirrored locally.

tbuskey and others added 3 commits June 2, 2026 14:41
- Add missing OWNERS file for step-registry-metadata check
- Fix shellcheck SC2155 warnings by declaring and assigning variables separately

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@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
`@ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.metadata.json`:
- Line 17: There is an extraneous backslash character "\" immediately after the
closing brace "}" in the JSON metadata, which breaks JSON syntax; remove that
trailing backslash so the file ends with a single "}" (no trailing escape
character) to restore valid JSON structure.
🪄 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 YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: e6bfc52e-3b14-4541-87c4-a22c2a2db804

📥 Commits

Reviewing files that changed from the base of the PR and between 6cd07ca and ae1b7b8.

📒 Files selected for processing (1)
  • ci-operator/step-registry/sandboxed-containers-operator/install-trustee-operator/sandboxed-containers-operator-install-trustee-operator-ref.metadata.json

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 2, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: job(s): periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-coco either don't exist or were not found to be affected, and cannot be rehearsed

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 2, 2026

/test generated-config

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 2, 2026

/pj-rehearse list

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 3, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 3, 2026

/pj-rehearse list

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 3, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: job(s): periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco either don't exist or were not found to be affected, and cannot be rehearsed

1 similar comment
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: job(s): periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco either don't exist or were not found to be affected, and cannot be rehearsed

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

Add TRUSTEE_INSTALL=true and trustee catalog env vars to:
- azure-ipi-coco (all candidate versions)
- aro-ipi-coco (all candidate versions)
- aws-ipi-coco (already done, this completes the set)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

Enable TRUSTEE_INSTALL for all CoCo jobs (aws-ipi-coco, azure-ipi-coco,
aro-ipi-coco) across candidate versions 4.17-4.21.

Fixed: Used Python YAML library which reformatted all quotes. Now using
surgical line insertion to preserve exact formatting.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: pj-rehearse could not automatically process this event because the request waited in queue for longer than 5 minutes. Use /pj-rehearse to trigger rehearsals manually.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@openshift-ci[bot]: your /pj-rehearse request was not processed because the request waited in queue for longer than 5 minutes. Please retry in a few minutes.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Jun 4, 2026

@tbuskey: 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/rehearse/periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco 582bbd9 link unknown /pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco

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.

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse list

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco

The determinize-ci-operator tool alphabetically sorted TRUSTEE_*
environment variables in all candidate configs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: job(s): periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco either don't exist or were not found to be affected, and cannot be rehearsed

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse list

@tbuskey
Copy link
Copy Markdown
Contributor Author

tbuskey commented Jun 4, 2026

/pj-rehearse periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aws-ipi-coco

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

1 similar comment
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

@tbuskey: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

Changed from brew-catalog to trustee-catalog in all candidate configs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@openshift-merge-bot
Copy link
Copy Markdown
Contributor

[REHEARSALNOTIFIER]
@tbuskey: the pj-rehearse plugin accommodates running rehearsal tests for the changes in this PR. Expand 'Interacting with pj-rehearse' for usage details. The following rehearsable tests have been affected by this change:

Test name Repo Type Reason
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-azure-ipi-kata N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-azure-ipi-kata N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-release-aro-ipi-coco N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-release-aws-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-release-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-aws-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-release-aws-ipi-coco N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-release-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-azure-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-azure-ipi-kata N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-kata N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-aws-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-aro-ipi-peerpods N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-azure-ipi-kata N/A periodic Registry content changed
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aws-ipi-peerpods N/A periodic Registry content changed

A total of 31 jobs have been affected by this change. The above listing is non-exhaustive and limited to 25 jobs.

A full list of affected jobs can be found here
The following jobs are not rehearsable without the network-access-rehearsals-ok, and approved labels present on this PR. This is due to the restrict_network_access field being set to false. The network-access-rehearsals-ok label can be added by any openshift org member other than the PR's author by commenting: /pj-rehearse network-access-allowed:

Test name
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate-azure-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate419-azure-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-azure-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate417-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-azure-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate421-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-azure-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate420-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-aro-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-aws-ipi-coco
periodic-ci-openshift-sandboxed-containers-operator-devel-downstream-candidate418-azure-ipi-coco
Interacting with pj-rehearse

Comment: /pj-rehearse to run up to 5 rehearsals
Comment: /pj-rehearse skip to opt-out of rehearsals
Comment: /pj-rehearse {test-name}, with each test separated by a space, to run one or more specific rehearsals
Comment: /pj-rehearse more to run up to 10 rehearsals
Comment: /pj-rehearse max to run up to 25 rehearsals
Comment: /pj-rehearse auto-ack to run up to 5 rehearsals, and add the rehearsals-ack label on success
Comment: /pj-rehearse list to get an up-to-date list of affected jobs
Comment: /pj-rehearse abort to abort all active rehearsals
Comment: /pj-rehearse network-access-allowed to allow rehearsals of tests that have the restrict_network_access field set to false. This must be executed by an openshift org member who is not the PR author

Once you are satisfied with the results of the rehearsals, comment: /pj-rehearse ack to unblock merge. When the rehearsals-ack label is present on your PR, merge will no longer be blocked by rehearsals.
If you would like the rehearsals-ack label removed, comment: /pj-rehearse reject to re-block merging.

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant