Skip to content

MTV-2947 | Add an cli download image#2882

Merged
yaacov merged 1 commit intokubev2v:mainfrom
yaacov:cli-download-service
Sep 22, 2025
Merged

MTV-2947 | Add an cli download image#2882
yaacov merged 1 commit intokubev2v:mainfrom
yaacov:cli-download-service

Conversation

@yaacov
Copy link
Copy Markdown
Member

@yaacov yaacov commented Sep 18, 2025

Ref:
https://issues.redhat.com/browse/MTV-2947

Issue:
Add an option to download MTV CLI and MCP tools

Fix:

  • Add a feature gate to install a CLI downloader pod ( true by default )
  • Add a CLI downloader pod
  • Add service + route to downloader
  • Add console CLI downloader CR
  • Update CI to build and install the CLI downloader image

Screenshots:
Download:
Command-Line-Tools-·-Red-Hat-OpenShift-09-18-2025_06_55_PM

Clip:
https://github.com/user-attachments/assets/b790ccc3-251a-4eb6-b75d-4638ad845364

Summary by CodeRabbit

  • New Features
    • Built-in CLI download service for kubectl-mtv (including MCP servers) exposed via OpenShift Console downloads and a routed download service.
  • Configuration
    • Feature flag to enable/disable CLI downloads; new settings to specify CLI download image and CPU/memory requests/limits.
  • RBAC
    • Granted console CLI download and route permissions for operator integration.
  • Chores
    • Added CLI download container image, artifact-fetch script, and extended build/push workflows.
  • Documentation
    • Updated sample image references to kubev2v equivalents.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Sep 18, 2025

Warning

Rate limit exceeded

@yaacov has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 1 minutes and 0 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 2c61b39 and 1fc386e.

⛔ Files ignored due to path filters (7)
  • build/forklift-cli-download/README.md is excluded by !**/*.md
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-mcp-servers-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-windows-amd64.zip is excluded by !**/*.zip, !**/*.zip
📒 Files selected for processing (22)
  • Makefile (5 hunks)
  • build/forklift-cli-download/Containerfile (1 hunks)
  • build/forklift-cli-download/Containerfile-downstream (1 hunks)
  • build/forklift-cli-download/download-latest-release.sh (1 hunks)
  • build/forklift-operator-bundle/Containerfile (1 hunks)
  • build/forklift-operator-bundle/Containerfile-downstream (1 hunks)
  • hack/validate_forklift_controller_crd.py (2 hunks)
  • operator/.downstream_manifests (10 hunks)
  • operator/.kustomized_manifests (10 hunks)
  • operator/.upstream_manifests (10 hunks)
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (2 hunks)
  • operator/config/manager/manager.yaml (1 hunks)
  • operator/config/rbac/role.yaml (1 hunks)
  • operator/export-vars-downstream.sh (2 hunks)
  • operator/export-vars-upstream.sh (1 hunks)
  • operator/roles/forkliftcontroller/defaults/main.yml (2 hunks)
  • operator/roles/forkliftcontroller/tasks/main.yml (3 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/route-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1 hunks)

Walkthrough

Adds a CLI download service: new forklift-cli-download image and artifacts, Makefile build/push targets and build-arg, download script, operator wiring (env var, RBAC), CRD additions for CLI download configuration and feature flag, Ansible templates/tasks for Service/Deployment/Route and ConsoleCLIDownloads, plus image export and CRD validation updates.

Changes

Cohort / File(s) Summary
Build Orchestration (Makefile)
Makefile
Add CLI_DOWNLOAD_IMAGE variable; add build-cli-download-image and push-cli-download-image targets; pass --build-arg CLI_DOWNLOAD_IMAGE=$(CLI_DOWNLOAD_IMAGE) to build-operator-bundle-image; include new targets in build-all-images/push-all-images.
CLI Download Image Files
build/forklift-cli-download/Containerfile, build/forklift-cli-download/Containerfile-downstream
New Containerfile and downstream variant to create an nginx-based static artifact server image (port 8080) with metadata and build args.
Artifact Fetch Script
build/forklift-cli-download/download-latest-release.sh
New script fetching latest kubectl-mtv release tag and downloading multiple platform artifacts into artifacts/.
Operator Bundle Build Args
build/forklift-operator-bundle/Containerfile, .../Containerfile-downstream
Add ARG CLI_DOWNLOAD_IMAGE=... in builder stages so the operator bundle build can reference the CLI download image.
CRD & Manifests (upstream/downstream/kustomized)
operator/.upstream_manifests, operator/.downstream_manifests, operator/.kustomized_manifests, operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
Add feature_cli_download and CLI download fields (cli_download_image_fqin, container requests/limits) to ForkliftController CRD/spec; update many example image FQINs to kubev2v prefixes; add console RBAC entries.
Operator Deployment & RBAC
operator/config/manager/manager.yaml, operator/config/rbac/role.yaml
Inject CLI_DOWNLOAD_IMAGE env var into forklift-operator container; add consoleclidownloads and routes permissions to manager-role.
Image Export Scripts
operator/export-vars-upstream.sh, operator/export-vars-downstream.sh
Add CLI_DOWNLOAD_IMAGE entries and downstream replacement mapping so CLI download image is exported/rewritten like other images.
Ansible Role Defaults & Tasks
operator/roles/forkliftcontroller/defaults/main.yml, operator/roles/forkliftcontroller/tasks/main.yml
Add feature_cli_download: true default and CLI image/names/limits/requests/state keys; tasks gated by feature flag to create or cleanup Service/Deployment/Route and ConsoleCLIDownload resources.
CLI Download Templates
operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2, .../deployment-cli-download.yml.j2, .../route-cli-download.yml.j2, .../console-cli-download-kubectl-mtv.yml.j2, .../console-cli-download-mcp.yml.j2
New Jinja2 templates for Service, Deployment, Route and two ConsoleCLIDownload resources referencing artifact URLs.
Validation Script Tweak
hack/validate_forklift_controller_crd.py
Centralize exclusion of derived/calculated variables via a new excluded_fields set to avoid comparing non-CRD variables in CRD validation.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Admin
  participant Operator as Forklift Operator
  participant K8s as Kubernetes API
  participant Console as OpenShift Console
  participant CDN as CLI Download Pod (nginx)

  Admin->>Operator: Apply ForkliftController (feature_cli_download="true")
  Operator->>K8s: Create Service, Deployment, Route (cli-download)
  Operator->>K8s: Create ConsoleCLIDownload resources
  K8s-->>Operator: Resources Ready

  Note over CDN: nginx serves static kubectl-mtv & MCP artifacts on :8080

  Console->>K8s: Read ConsoleCLIDownload metadata (links)
  Console-->>Admin: Render download links
  Admin->>Console: Click download link
  Console->>K8s: Route to Service
  K8s->>CDN: Proxy request
  CDN-->>Admin: Return artifact
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • mrnold
  • Hazanel
  • solenoci
  • mnecas

Poem

Hoppity hop, I cached a tarball bright,
Nginx hums softly through the midnight light.
Flags set true, routes tied neat and round,
Console links show downloads all around.
Tiny rabbit grins — kubectl takes flight! 🥕🐇

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "MTV-2947
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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.

@yaacov yaacov force-pushed the cli-download-service branch 3 times, most recently from 6cce422 to 2d199cc Compare September 18, 2025 11:42
@sonarqubecloud
Copy link
Copy Markdown

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Sep 18, 2025

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 8.27%. Comparing base (f1fe5d0) to head (1fc386e).
⚠️ Report is 870 commits behind head on main.
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@            Coverage Diff            @@
##             main   #2882      +/-   ##
=========================================
- Coverage   15.45%   8.27%   -7.19%     
=========================================
  Files         112     381     +269     
  Lines       23377   52684   +29307     
=========================================
+ Hits         3613    4359     +746     
- Misses      19479   47980   +28501     
- Partials      285     345      +60     
Flag Coverage Δ
unittests 8.27% <ø> (-7.19%) ⬇️

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

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

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

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: 30

Caution

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

⚠️ Outside diff range comments (1)
hack/validate_forklift_controller_crd.py (1)

67-76: Guard against non‑mapping defaults and keep behavior deterministic.

safe_load may return None or non‑dict; protect before .keys().

-        with open(defaults_file, 'r') as f:
-            defaults_data = yaml.safe_load(f)
-        
-        # Add variables from defaults that should correspond to CRD properties
-        defaults_variables = set(defaults_data.keys())
+        with open(defaults_file, 'r') as f:
+            defaults_data = yaml.safe_load(f) or {}
+        if not isinstance(defaults_data, dict):
+            defaults_data = {}
+        # Add variables from defaults that should correspond to CRD properties
+        defaults_variables = set(defaults_data.keys())
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5ee5585 and 2d199cc.

⛔ Files ignored due to path filters (6)
  • build/forklift-cli-download/README.md is excluded by !**/*.md
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-windows-amd64.zip is excluded by !**/*.zip, !**/*.zip
📒 Files selected for processing (22)
  • Makefile (5 hunks)
  • build/forklift-cli-download/Containerfile (1 hunks)
  • build/forklift-cli-download/Containerfile-downstream (1 hunks)
  • build/forklift-cli-download/download-latest-release.sh (1 hunks)
  • build/forklift-operator-bundle/Containerfile (1 hunks)
  • build/forklift-operator-bundle/Containerfile-downstream (1 hunks)
  • hack/validate_forklift_controller_crd.py (2 hunks)
  • operator/.downstream_manifests (10 hunks)
  • operator/.kustomized_manifests (10 hunks)
  • operator/.upstream_manifests (10 hunks)
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (2 hunks)
  • operator/config/manager/manager.yaml (1 hunks)
  • operator/config/rbac/role.yaml (1 hunks)
  • operator/export-vars-downstream.sh (2 hunks)
  • operator/export-vars-upstream.sh (1 hunks)
  • operator/roles/forkliftcontroller/defaults/main.yml (2 hunks)
  • operator/roles/forkliftcontroller/tasks/main.yml (3 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/route-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1 hunks)
🧰 Additional context used
🧠 Learnings (8)
📚 Learning: 2025-09-01T16:33:01.755Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/.downstream_manifests:172-213
Timestamp: 2025-09-01T16:33:01.755Z
Learning: The ForkliftController operator is architecturally designed to accept only string values for all configuration fields, including feature gates that would typically be booleans. This is why the CRD schema uses string types with enum constraints (like "true"/"false") rather than actual boolean types.

Applied to files:

  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
📚 Learning: 2025-09-16T12:04:39.609Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:1253-1270
Timestamp: 2025-09-16T12:04:39.609Z
Learning: The files operator/.kustomized_manifests and operator/.upstream_manifests are also auto-generated manifests in the Forklift project, similar to operator/.downstream_manifests.

Applied to files:

  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/.upstream_manifests
📚 Learning: 2025-09-16T12:04:53.070Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:4344-4361
Timestamp: 2025-09-16T12:04:53.070Z
Learning: The file `operator/.downstream_manifests` in the Forklift project is auto-generated and should not be edited directly. Any formatting issues or changes need to be addressed in the source templates or generation logic that creates this file.

Applied to files:

  • operator/.downstream_manifests
  • operator/.upstream_manifests
📚 Learning: 2025-09-16T12:04:39.609Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:1253-1270
Timestamp: 2025-09-16T12:04:39.609Z
Learning: The file operator/.downstream_manifests is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.downstream_manifests
📚 Learning: 2025-09-16T12:06:30.507Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/config/crd/bases/forklift.konveyor.io_migrations.yaml:547-565
Timestamp: 2025-09-16T12:06:30.507Z
Learning: The file operator/config/crd/bases/forklift.konveyor.io_migrations.yaml is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/.upstream_manifests
📚 Learning: 2025-09-02T17:01:19.057Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml:84-88
Timestamp: 2025-09-02T17:01:19.057Z
Learning: The maintainer yaacov prefers to keep field names as-is when documenting existing ForkliftController CRD fields in documentation PRs, rather than making consistency improvements that would require operator code changes. Field name standardization should be handled in separate PRs focused on operator changes.

Applied to files:

  • operator/.kustomized_manifests
📚 Learning: 2025-09-03T04:08:05.745Z
Learnt from: yaacov
PR: kubev2v/forklift#2694
File: operator/.downstream_manifests:2523-2534
Timestamp: 2025-09-03T04:08:05.745Z
Learning: For Forklift Plan CRD docs, maintainer prefers documenting existing runtime keys/behavior verbatim (e.g., TargetLabels uses "app", convertor pods use "forklift.app") and avoiding normalization changes in documentation-only PRs.

Applied to files:

  • operator/.kustomized_manifests
📚 Learning: 2025-09-17T03:50:40.352Z
Learnt from: mansam
PR: kubev2v/forklift#2855
File: operator/roles/forkliftcontroller/defaults/main.yml:144-144
Timestamp: 2025-09-17T03:50:40.352Z
Learning: In operator/roles/forkliftcontroller/defaults/main.yml, hooks_container_requests_memory (for hooks containers) and ova_container_requests_memory (for OVA provider server containers) are separate components with different memory requirements and should not be changed together.

Applied to files:

  • operator/roles/forkliftcontroller/defaults/main.yml
🪛 Checkov (3.2.334)
operator/roles/forkliftcontroller/tasks/main.yml

[low] 241-270: Ensure block is handling task errors properly

(CKV2_ANSIBLE_3)

⏰ 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). (3)
  • GitHub Check: Red Hat Konflux / forklift-operator-dev-preview-on-pull-request
  • GitHub Check: Red Hat Konflux / forklift-operator-bundle-dev-preview-on-pull-request
  • GitHub Check: build
🔇 Additional comments (25)
build/forklift-cli-download/Containerfile-downstream (1)

1-4: Static nginx setup looks good.

Base image, artifacts path, port, and foreground CMD align with the Service at 8080.

operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1)

10-20: Ensure selector labels match the Deployment.

Selector uses app and service labels; verify the Deployment template sets both identically, or the Service will not target pods. You can drop sessionAffinity: None (default) if you want less noise.

build/forklift-cli-download/download-latest-release.sh (1)

24-35: Prefer curl over wget for consistency and fewer build deps.

Also surface errors when a download fails.
[ suggest_recommended_refactor ]

-    echo "Downloading $filename..."
-    if wget -q --show-progress -O "${ARTIFACTS_DIR}/${filename}" "${BASE_URL}/${source_name}"; then
-        echo "✓ $filename"
-    else
-        echo "✗ Failed: $filename"
-    fi
+    echo "Downloading $filename..."
+    if curl -fSL -o "${ARTIFACTS_DIR}/${filename}" "${BASE_URL}/${source_name}"; then
+      echo "✓ $filename"
+    else
+      echo "✗ Failed: $filename" >&2
+      return 1
+    fi
operator/roles/forkliftcontroller/defaults/main.yml (2)

102-112: Image/env wiring looks consistent; keep it env‑driven.

Good use of RELATED_IMAGE fallback and modest resource requests/limits.


12-12: Revisit default enablement of DEV PREVIEW feature_cli_download

feature_cli_download is true by default (operator/roles/forkliftcontroller/defaults/main.yml:12) while the CLI artifacts are marked "DEV PREVIEW" (operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2, console-cli-download-mcp.yml.j2); when enabled the role sets cli_download_state to present and creates the CLI service/deployment (operator/roles/forkliftcontroller/tasks/main.yml). Default to false or gate via release channel/ENV to avoid surprising upgrades. Do product requirements mandate this be enabled by default in all environments?

operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1)

12-14: Make download link absolute using the Route host

File: operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 Lines: 12-14

  • Replace relative href with the Route host:
-    - href: "/kubectl-mtv-mcp-servers-linux-amd64.tar.gz"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-mcp-servers-linux-amd64.tar.gz"
  • Do we also need arm64 MCP servers? If not available, add a TODO or include the arm64 artifact.
operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1)

12-22: Use absolute Route URLs; capture the Route host into cli_download_route_host first

ConsoleCLIDownload currently uses leading "/" links (these point to the Console host). I found no cli_download_route_host variable or task that registers the Route host — add a task (after creating the Route in operator/roles/forkliftcontroller/tasks/main.yml) to set cli_download_route_host from the Route's host, then update the template links to use that host:

-    - href: "/kubectl-mtv-linux-amd64.tar.gz"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-linux-amd64.tar.gz"
-    - href: "/kubectl-mtv-linux-arm64.tar.gz"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-linux-arm64.tar.gz"
-    - href: "/kubectl-mtv-darwin-amd64.tar.gz"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-darwin-amd64.tar.gz"
-    - href: "/kubectl-mtv-darwin-arm64.tar.gz"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-darwin-arm64.tar.gz"
-    - href: "/kubectl-mtv-windows-amd64.zip"
+    - href: "https://{{ cli_download_route_host }}/kubectl-mtv-windows-amd64.zip"

operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 — update links; operator/roles/forkliftcontroller/tasks/main.yml — add task to capture Route host.

operator/.upstream_manifests (3)

61-63: api_image_fqin schema tightened — LGTM

Example updated to kubev2v and explicit type: string. Matches other image fields.


269-269: Image example repo switches to quay.io/kubev2v — LGTM

Examples align with current registry naming.

Also applies to: 289-289, 293-293, 297-297, 301-301, 305-305, 325-325, 345-345, 353-353, 387-387


63-82: New CLI download config fields (limits/requests + image) — wiring and OpenShift gating verified

  • Controller/Ansible consumes the new vars and has sane defaults: see operator/roles/forkliftcontroller/defaults/main.yml and operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (image + limits/requests used).
  • Fields are exposed in the CRD (operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml).
  • Creation of Route/ConsoleCLIDownload is OpenShift‑only: tasks use when: feature_cli_download|bool and not k8s_cluster|bool and console templates are console.openshift.io/v1 — see operator/roles/forkliftcontroller/tasks/main.yml and operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-*.yml.j2.
build/forklift-cli-download/Containerfile (1)

2-2: Ensure artifacts are present at build time.

Build will fail if build/forklift-cli-download/artifacts is missing. Confirm CI runs the download-latest-release.sh (or equivalent) before building.

Makefile (3)

89-89: Expose CLI_DOWNLOAD_IMAGE default — LGTM

Consistent with other image defaults and enables override.


378-379: Include CLI image in build-all — ordering is correct

Built before the bundle, so the bundle ARG resolves to the freshly built tag.


392-394: Include CLI image in push-all — LGTM

Pushing the CLI image before the bundle/index is the right order.

operator/roles/forkliftcontroller/tasks/main.yml (1)

9-13: Feature flag state for CLI download — LGTM

Sets cli_download_state only when enabled; downstream tasks are gated accordingly.

operator/.kustomized_manifests (4)

61-61: Image example updates to quay.io/kubev2v — LGTM.

Consistent with current image publishing locations.

Also applies to: 117-117, 269-269, 289-289, 293-293, 297-297, 301-301, 305-305, 325-325, 345-345, 353-353, 387-387


63-82: CLI download CRD fields wired; CI coverage still required

Verified: templates reference the new fields (operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 uses cli_download_image_fqin and cli_download_container_*; service/route/console templates exist in operator/roles/forkliftcontroller/templates/cli-download), defaults are set in operator/roles/forkliftcontroller/defaults/main.yml, CRD contains the new fields (operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml), and feature_cli_download gates tasks in operator/roles/forkliftcontroller/tasks/main.yml.

Action: add/update CI tests to validate CRD -> rendered manifests or reconciliation exercise these spec keys (manifest generation/reconcile checks).


6308-6311: Gate ConsoleCLIDownload RBAC on non‑OCP clusters

RBAC for ConsoleCLIDownload (operator/.kustomized_manifests lines 6308–6311) is appropriate for OpenShift; ensure any tasks/roles that create ConsoleCLIDownload resources are skipped when the console.openshift.io API is absent (pure Kubernetes). Verification couldn't be completed: the searched paths (roles/, playbooks/) were not present in the sandbox (rg output: "roles/: No such file or directory"). If the role/playbook exists elsewhere, run from the repo root and paste results:

rg -nC3 -e 'ConsoleCLIDownload|route\.openshift\.io|console\.openshift\.io' -S || true
rg -nC3 -e '\bk8s_cluster\b|\bfeature_cli_download\b' -S || true

179-184: No action required — operator already defaults feature_cli_download to true.

operator/roles/forkliftcontroller/defaults/main.yml sets feature_cli_download: true and tasks reference it (operator/roles/forkliftcontroller/tasks/main.yml); adding the field to samples/CSV is optional for explicitness.

operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (3)

187-204: CLI download resource knobs added — defaults present and units match.

Defaults set to cli_download_container_limits_cpu=100m, cli_download_container_limits_memory=128Mi, cli_download_container_requests_cpu=50m, cli_download_container_requests_memory=64Mi; templates reference the same variables.


74-77: Feature gate schema OK — Ansible already converts the string to bool.

CRD string enum matches project convention; tasks use feature_cli_download|bool (see operator/roles/forkliftcontroller/tasks/main.yml), so "false" won't be treated as truthy.


96-100: cli_download_image_fqin wiring verified – the CRD defines spec.cli_download_image_fqin, manager.yaml and both export-vars scripts expose CLI_DOWNLOAD_IMAGE, and the Ansible templates use the merged cli_download_image_fqin variable (from spec or env) for the image.

operator/.downstream_manifests (3)

61-63: Image example updates to quay.io/kubev2v — LGTM.

Consistent branding and examples across CRD fields look good.

Also applies to: 117-118, 269-270, 289-290, 293-294, 297-298, 301-302, 305-306, 325-326, 345-346, 353-354, 385-387


179-184: Gating for CLI download already implemented — no change required.

The role tasks gate creation and cleanup: operator/roles/forkliftcontroller/tasks/main.yml contains "when: feature_cli_download|bool and not k8s_cluster|bool" (setup) and "when: not feature_cli_download|bool" (cleanup). CLI templates live under operator/roles/forkliftcontroller/templates/cli-download (route-cli-download.yml.j2, console-cli-download-*.yml.j2). Defaults set feature_cli_download in operator/roles/forkliftcontroller/defaults/main.yml.


63-82: CRD keys consumed and defaults present — no action required.

  • CRD defines the fields: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (cli_download_container_* and cli_download_image_fqin present).
  • Defaults exist in operator/roles/forkliftcontroller/defaults/main.yml (cli_download_container_limits_cpu: "100m", cli_download_container_limits_memory: "128Mi", cli_download_container_requests_cpu: "50m", cli_download_container_requests_memory: "64Mi"; cli_download_image_fqin resolved from env).
  • Template uses them at operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (image and resources mapped).

Optional: add lightweight regex validation in the generator (not the auto-generated manifests), e.g. ^\d+m$ for CPU and ^\d+(Mi|Gi)$ for memory.

Comment thread build/forklift-cli-download/Containerfile
Comment thread build/forklift-cli-download/Containerfile
Comment thread build/forklift-cli-download/Containerfile-downstream
Comment thread build/forklift-cli-download/download-latest-release.sh
Comment thread build/forklift-cli-download/download-latest-release.sh
@yaacov yaacov force-pushed the cli-download-service branch 5 times, most recently from f8f3e23 to 8d8b4fc Compare September 18, 2025 15:36
Copy link
Copy Markdown
Member

@mnecas mnecas left a comment

Choose a reason for hiding this comment

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

generally LGTM, could you please show where will this show in the UI if it will show there?
And want review also from @solenoci

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: 5

♻️ Duplicate comments (20)
build/forklift-operator-bundle/Containerfile (1)

15-15: ARG added but redundant with export-vars; remove or make it effective.

envsubst already receives CLI_DOWNLOAD_IMAGE from export-vars-${STREAM}.sh (see Lines 24–27). As-is, this ARG won’t influence the generated bundle. Either drop it, or promote to ENV before the envsubst step if you want build-arg overrides to apply.

Option A — remove:

-ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"

Option B — make it take effect:

 ARG UI_PLUGIN_IMAGE="quay.io/kubev2v/forklift-console-plugin:latest"
-ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"
+ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"
+ENV CLI_DOWNLOAD_IMAGE="${CLI_DOWNLOAD_IMAGE}"
hack/validate_forklift_controller_crd.py (1)

91-173: Hoist and dedupe exclusion set; remove overlap with ansible_builtin.

excluded_fields repeats entries (e.g., app_namespace, forklift_resources, ui_plugin_console_name) and overlaps with ansible_builtin. Centralize as a module-level constant and reference it here.

One possible refactor:

@@
-import os
 import sys
 import yaml
 import argparse
 import re
 from pathlib import Path
+from typing import FrozenSet
@@
-    # Filter out Ansible built-in variables, internal variables, and false positives
+    # Filter out Ansible built-in variables, internal variables, and false positives
     ansible_builtin = {
@@
-    # Also filter out the calculated/derived variables that shouldn't be in CRD
-    # (apply the same exclusions that were applied to defaults)
-    excluded_fields = {
-        'app_name',
-        'app_namespace', 
-        'forklift_operator_version',
-        'forklift_resources',
-        # Service and component names
-        'controller_configmap_name',
-        'controller_service_name',
-        'controller_deployment_name',
-        'controller_container_name',
-        'ovirt_osmap_configmap_name',
-        'vsphere_osmap_configmap_name', 
-        'virt_customize_configmap_name',
-        'profiler_volume_path',
-        # Inventory service fields
-        'inventory_volume_path',
-        'inventory_container_name',
-        'inventory_service_name',
-        'inventory_route_name',
-        'inventory_route_timeout',
-        'inventory_tls_secret_name',
-        'inventory_issuer_name',
-        'inventory_certificate_name',
-        # Services configuration
-        'services_service_name',
-        'services_route_name',
-        'services_tls_secret_name', 
-        'services_issuer_name',
-        'services_certificate_name',
-        # Validation service configuration
-        'validation_configmap_name',
-        'validation_service_name',
-        'validation_deployment_name',
-        'validation_container_name',
-        'validation_extra_volume_name',
-        'validation_extra_volume_mountpath',
-        'validation_tls_secret_name',
-        'validation_issuer_name',
-        'validation_certificate_name',
-        'validation_state',
-        # UI Plugin configuration
-        'ui_plugin_console_name',
-        'ui_plugin_display_name',
-        'ui_plugin_service_name',
-        'ui_plugin_deployment_name',
-        'ui_plugin_container_name',
-        'ui_plugin_state',
-        # API service configuration
-        'api_service_name',
-        'api_deployment_name',
-        'api_container_name',
-        'api_tls_secret_name',
-        'api_issuer_name', 
-        'api_certificate_name',
-        # CLI Download service configuration (calculated/derived values)
-        'cli_download_container_name',
-        'cli_download_deployment_name', 
-        'cli_download_route_name',
-        'cli_download_service_name',
-        'cli_download_state',
-        # Populator configuration
-        'populator_controller_deployment_name',
-        'populator_controller_container_name',
-        # VDDK configuration
-        'vddk_build_config_name',
-        'vddk_image_stream_name',
-        # Metrics configuration
-        'metric_service_name',
-        'metric_servicemonitor_name',
-        'metric_interval',
-        'metric_port_name',
-        'metrics_rule_name',
-        # Additional internal variables that should not be CRD properties  
-        'app_namespace',
-        'forklift_resources',
-        'ui_plugin_console_name',
-        'ui_plugin_service_name', 
-        'validation_service_name',
-    }
-    
-    return variables - ansible_builtin - excluded_fields
+    return variables - ansible_builtin - EXCLUDED_CRD_FIELDS

Add near the top (module scope):

# Calculated/derived/internal variables that must not be CRD properties
EXCLUDED_CRD_FIELDS: FrozenSet[str] = frozenset({
    'app_name',
    'app_namespace',
    'forklift_operator_version',
    'forklift_resources',
    # Service and component names
    'controller_configmap_name',
    'controller_service_name',
    'controller_deployment_name',
    'controller_container_name',
    'ovirt_osmap_configmap_name',
    'vsphere_osmap_configmap_name',
    'virt_customize_configmap_name',
    'profiler_volume_path',
    # Inventory service fields
    'inventory_volume_path',
    'inventory_container_name',
    'inventory_service_name',
    'inventory_route_name',
    'inventory_route_timeout',
    'inventory_tls_secret_name',
    'inventory_issuer_name',
    'inventory_certificate_name',
    # Services configuration
    'services_service_name',
    'services_route_name',
    'services_tls_secret_name',
    'services_issuer_name',
    'services_certificate_name',
    # Validation service configuration
    'validation_configmap_name',
    'validation_service_name',
    'validation_deployment_name',
    'validation_container_name',
    'validation_extra_volume_name',
    'validation_extra_volume_mountpath',
    'validation_tls_secret_name',
    'validation_issuer_name',
    'validation_certificate_name',
    # UI Plugin configuration
    'ui_plugin_console_name',
    'ui_plugin_display_name',
    'ui_plugin_service_name',
    'ui_plugin_deployment_name',
    'ui_plugin_container_name',
    'ui_plugin_state',
    # API service configuration
    'api_service_name',
    'api_deployment_name',
    'api_container_name',
    'api_tls_secret_name',
    'api_issuer_name',
    'api_certificate_name',
    # CLI Download service configuration (calculated/derived values)
    'cli_download_container_name',
    'cli_download_deployment_name',
    'cli_download_route_name',
    'cli_download_service_name',
    'cli_download_state',
    # Populator configuration
    'populator_controller_deployment_name',
    'populator_controller_container_name',
    # VDDK configuration
    'vddk_build_config_name',
    'vddk_image_stream_name',
    # Metrics configuration
    'metric_service_name',
    'metric_servicemonitor_name',
    'metric_interval',
    'metric_port_name',
    'metrics_rule_name',
})
operator/.kustomized_manifests (1)

6466-6467: CLI_DOWNLOAD_IMAGE env wired into Deployment — LGTM.

Matches repo automation for image vars/relatedImages noted earlier.

operator/export-vars-downstream.sh (1)

25-26: Ack: placeholder digest — rely on pipeline to replace

Zero SHA digest is fine given your automation; just ensure no zero-digest refs remain in generated artifacts before publishing.

Run to confirm no placeholders leak:

#!/bin/bash
rg -nP 'sha256:0{64}' || true
operator/export-vars-upstream.sh (1)

25-26: Upstream image entry added — verify manifest substitution

Entry looks good; confirm your generation step resolves ${CLI_DOWNLOAD_IMAGE} and surfaces it in relatedImages.

Quick check:

#!/bin/bash
rg -n 'CLI_DOWNLOAD_IMAGE|forklift-cli-download' operator/.upstream_manifests operator/.kustomized_manifests || true
operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1)

21-29: Add readiness/liveness probes for nginx

Improves rollout safety and self-heal without changing behavior.

       containers:
         - name: "{{ cli_download_container_name }}"
           image: "{{ cli_download_image_fqin }}"
           ports:
             - containerPort: 8080
               protocol: TCP
           imagePullPolicy: "{{ image_pull_policy }}"
+          readinessProbe:
+            httpGet:
+              path: "{{ cli_download_health_path | default('/') }}"
+              port: 8080
+            initialDelaySeconds: 3
+            periodSeconds: 10
+            failureThreshold: 3
+          livenessProbe:
+            httpGet:
+              path: "{{ cli_download_health_path | default('/') }}"
+              port: 8080
+            initialDelaySeconds: 10
+            periodSeconds: 20
+            failureThreshold: 3
build/forklift-cli-download/download-latest-release.sh (2)

1-1: Enable strict bash mode

Fail fast and catch errors early.

-#!/bin/bash
+#!/bin/bash
+set -Eeuo pipefail

13-16: Fix misleading error message

Message says “using fallback” but exits. Make it accurate.

-if [ -z "$TAG" ]; then
-    echo "Could not determine latest tag, using fallback..."
-    exit 1
-fi
+if [ -z "$TAG" ]; then
+  echo "ERROR: Could not determine latest tag." >&2
+  exit 1
+fi
operator/.upstream_manifests (2)

6817-6840: Add CLI_DOWNLOAD_IMAGE to CSV relatedImages for disconnected mirroring

Without it, OLM can’t mirror the new image. Apply via generator.

   relatedImages:
   - image: ${OPERATOR_IMAGE}
     name: forklift-operator
@@
   - image: ${VSPHERE_XCOPY_VOLUME_POPULATOR_IMAGE}
     name: vsphere_xcopy_volume_populator
+  - image: ${CLI_DOWNLOAD_IMAGE}
+    name: cli_download

6311-6317: RBAC: scope verbs for consoleclidownloads (avoid '*')

Limit to required verbs and split from consoleplugins. Apply via generator.

-  - consoleplugins
-  - consoleclidownloads
-  verbs:
-  - '*'
+  - consoleplugins
+  verbs:
+  - '*'
+- apiGroups:
+  - console.openshift.io
+  resources:
+  - consoleclidownloads
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (1)

83-83: Avoid :latest in examples — use versioned tags (or digests).

Replace example FQINs using :latest with pinned tags like quay.io/kubev2v/:vX.Y.Z to promote reproducibility.

- example: "quay.io/kubev2v/forklift-controller:latest"
+ example: "quay.io/kubev2v/forklift-controller:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-virt-v2v:latest"
+ example: "quay.io/kubev2v/forklift-virt-v2v:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-api:latest"
+ example: "quay.io/kubev2v/forklift-api:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-cli-download:latest"
+ example: "quay.io/kubev2v/forklift-cli-download:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-ui-plugin:latest"
+ example: "quay.io/kubev2v/forklift-ui-plugin:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-validation:latest"
+ example: "quay.io/kubev2v/forklift-validation:vX.Y.Z"
- example: "quay.io/kubev2v/populator-controller:latest"
+ example: "quay.io/kubev2v/populator-controller:vX.Y.Z"
- example: "quay.io/kubev2v/ovirt-populator:latest"
+ example: "quay.io/kubev2v/ovirt-populator:vX.Y.Z"
- example: "quay.io/kubev2v/openstack-populator:latest"
+ example: "quay.io/kubev2v/openstack-populator:vX.Y.Z"
- example: "quay.io/kubev2v/vsphere-populator:latest"
+ example: "quay.io/kubev2v/vsphere-populator:vX.Y.Z"
- example: "quay.io/kubev2v/ova-provider-server:latest"
+ example: "quay.io/kubev2v/ova-provider-server:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-must-gather:latest"
+ example: "quay.io/kubev2v/forklift-must-gather:vX.Y.Z"

Also applies to: 87-87, 95-95, 99-99, 103-103, 107-107, 111-111, 115-115, 119-119, 123-123, 127-127, 131-131

operator/.downstream_manifests (1)

6466-6467: Deployment: CLI_DOWNLOAD_IMAGE env wired — looks good.

CSV relatedImages/RELATED_IMAGE_* are handled by automation in this repo; no manual addition needed.

Makefile (2)

308-309: Confirm bundle consumption of CLI_DOWNLOAD_IMAGE (or document automation).

If the bundle Containerfiles don’t actually use this ARG and your pipeline substitutes via envsubst/images.conf, that’s fine—just confirm. Otherwise it’s dead ARG.

Run:

#!/bin/bash
# Show where the ARG is declared vs. used inside bundle build context
fd -a 'Containerfile*' build/forklift-operator-bundle | while read f; do
  echo "== $f"
  rg -n 'ARG\s+CLI_DOWNLOAD_IMAGE' "$f" || true
  rg -n '\bCLI_DOWNLOAD_IMAGE\b' "$f" || true
done

361-367: Mark new targets as phony (follow-up ok).

Add .PHONY for consistency with future cleanup PR.

+.PHONY: build-cli-download-image push-cli-download-image
 build-cli-download-image: check_container_runtime
build/forklift-operator-bundle/Containerfile-downstream (1)

32-33: All-zero digest placeholder — ensure pipeline replacement or drop default.

If automation replaces this, OK; otherwise remove the default or surface as ENV to avoid silent drift.

Please confirm your release job replaces sha256:000…000 here and in export scripts.

operator/roles/forkliftcontroller/tasks/main.yml (3)

293-301: Verify cleanup removes ConsoleCLIDownloads when feature disabled.

Ensure forklift_resources includes ConsoleCLIDownload or add explicit removal.

#!/bin/bash
# Show forklift_resources and confirm ConsoleCLIDownload included
rg -n '^forklift_resources:' -C3 operator/roles/forkliftcontroller/defaults --hidden || true
# Grep labels in ConsoleCLIDownload templates to match cleanup selector
rg -n 'service:\s*\{\{\s*cli_download_service_name\s*\}\}' operator/roles/forkliftcontroller/templates/cli-download -C2 || true

249-252: Use merge patch for Deployment apply (consistency, fewer flips).

Add merge_type: "merge" like the controller Deployment.

     - name: "Setup CLI download deployment"
       k8s:
         state: "{{ cli_download_state }}"
         definition: "{{ lookup('template', 'cli-download/deployment-cli-download.yml.j2') }}"
+        merge_type: "merge"

259-268: Gate ConsoleCLIDownload on API presence to avoid rare drifts.

Run only if 'console.openshift.io' exists.

     - name: "Setup ConsoleCLIDownload for kubectl-mtv"
       k8s:
         state: "{{ cli_download_state }}"
         definition: "{{ lookup('template', 'cli-download/console-cli-download-kubectl-mtv.yml.j2') }}"
+      when: "'console.openshift.io' in api_groups"

     - name: "Setup ConsoleCLIDownload for kubectl-mtv MCP"
       k8s:
         state: "{{ cli_download_state }}"
         definition: "{{ lookup('template', 'cli-download/console-cli-download-mcp.yml.j2') }}"
+      when: "'console.openshift.io' in api_groups"
operator/config/rbac/role.yaml (2)

42-47: Tighten verbs for console resources (avoid '*').

Limit to get,list,watch,create,update,patch,delete.

   resources:
     - consoleplugins
     - consoleclidownloads
-  verbs:
-  - '*'
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete

49-53: Also restrict verbs on routes.

Same principle—avoid wildcard.

-  resources:
-    - routes
-  verbs:
-    - '*'
+  resources:
+    - routes
+  verbs:
+    - get
+    - list
+    - watch
+    - create
+    - update
+    - patch
+    - delete
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2d199cc and 8d8b4fc.

⛔ Files ignored due to path filters (6)
  • build/forklift-cli-download/README.md is excluded by !**/*.md
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-windows-amd64.zip is excluded by !**/*.zip, !**/*.zip
📒 Files selected for processing (22)
  • Makefile (5 hunks)
  • build/forklift-cli-download/Containerfile (1 hunks)
  • build/forklift-cli-download/Containerfile-downstream (1 hunks)
  • build/forklift-cli-download/download-latest-release.sh (1 hunks)
  • build/forklift-operator-bundle/Containerfile (1 hunks)
  • build/forklift-operator-bundle/Containerfile-downstream (1 hunks)
  • hack/validate_forklift_controller_crd.py (2 hunks)
  • operator/.downstream_manifests (10 hunks)
  • operator/.kustomized_manifests (10 hunks)
  • operator/.upstream_manifests (10 hunks)
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (2 hunks)
  • operator/config/manager/manager.yaml (1 hunks)
  • operator/config/rbac/role.yaml (1 hunks)
  • operator/export-vars-downstream.sh (2 hunks)
  • operator/export-vars-upstream.sh (1 hunks)
  • operator/roles/forkliftcontroller/defaults/main.yml (2 hunks)
  • operator/roles/forkliftcontroller/tasks/main.yml (3 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/route-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1 hunks)
🔥 Files not summarized due to errors (1)
  • Makefile: Error: Server error: no LLM provider could handle the message
🧰 Additional context used
🧠 Learnings (30)
📓 Common learnings
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.110Z
Learning: Forklift repo: the forklift-cli-download image is part of the standard pipeline — Makefile defines build-cli-download-image/push-cli-download-image and includes them in build-all-images/push-all-images; export-vars {upstream,downstream} also define CLI_DOWNLOAD_IMAGE with downstream replacement to mtv-cli-download-rhel9.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.109Z
Learning: Forklift repo Makefile contains build-cli-download-image and push-cli-download-image targets and includes them in build-all-images/push-all-images; the CLI download image is part of the standard image pipeline.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/export-vars-upstream.sh:25-26
Timestamp: 2025-09-18T13:44:23.321Z
Learning: The yaacov/forklift project has automation that handles the substitution of CLI_DOWNLOAD_IMAGE placeholders (${CLI_DOWNLOAD_IMAGE}) in manifests during the build/release process, similar to how they handle placeholder sha256 digests.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.upstream_manifests:179-184
Timestamp: 2025-09-18T13:48:36.012Z
Learning: Repo preference (kubev2v/forklift): Do not surface individual feature_* flags in sample CRs or CSV init piecemeal. When adding a new feature flag (e.g., feature_cli_download in operator/.upstream_manifests), bundle updates to expose all feature_* flags together in a dedicated follow-up PR rather than updating only the new flag.
📚 Learning: 2025-09-18T14:21:10.110Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.110Z
Learning: Forklift repo: the forklift-cli-download image is part of the standard pipeline — Makefile defines build-cli-download-image/push-cli-download-image and includes them in build-all-images/push-all-images; export-vars {upstream,downstream} also define CLI_DOWNLOAD_IMAGE with downstream replacement to mtv-cli-download-rhel9.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • build/forklift-cli-download/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/config/manager/manager.yaml
  • operator/roles/forkliftcontroller/defaults/main.yml
  • build/forklift-cli-download/download-latest-release.sh
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.kustomized_manifests
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/export-vars-upstream.sh
  • build/forklift-operator-bundle/Containerfile
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T13:44:23.321Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/export-vars-upstream.sh:25-26
Timestamp: 2025-09-18T13:44:23.321Z
Learning: The yaacov/forklift project has automation that handles the substitution of CLI_DOWNLOAD_IMAGE placeholders (${CLI_DOWNLOAD_IMAGE}) in manifests during the build/release process, similar to how they handle placeholder sha256 digests.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/rbac/role.yaml
  • operator/export-vars-downstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/config/manager/manager.yaml
  • operator/roles/forkliftcontroller/defaults/main.yml
  • build/forklift-cli-download/download-latest-release.sh
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • build/forklift-operator-bundle/Containerfile
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T14:21:10.109Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.109Z
Learning: Forklift repo Makefile contains build-cli-download-image and push-cli-download-image targets and includes them in build-all-images/push-all-images; the CLI download image is part of the standard image pipeline.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • build/forklift-cli-download/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/config/manager/manager.yaml
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • build/forklift-operator-bundle/Containerfile
📚 Learning: 2025-08-19T10:02:47.617Z
Learnt from: yaacov
PR: kubev2v/forklift#2561
File: Makefile:0-0
Timestamp: 2025-08-19T10:02:47.617Z
Learning: User yaacov prefers to defer security hardening improvements like checksum verification to follow-up PRs rather than expanding the scope of cleanup-focused PRs.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/rbac/role.yaml
  • operator/export-vars-downstream.sh
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T13:45:03.983Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/config/rbac/role.yaml:42-47
Timestamp: 2025-09-18T13:45:03.983Z
Learning: In the yaacov/forklift project, comprehensive fixes (like RBAC permission cleanup) are preferred to be done in dedicated PRs rather than mixed with feature additions, to ensure consistency across the codebase.

Applied to files:

  • Makefile
  • operator/config/rbac/role.yaml
  • build/forklift-cli-download/Containerfile-downstream
  • operator/roles/forkliftcontroller/tasks/main.yml
📚 Learning: 2025-08-18T13:45:08.364Z
Learnt from: yaacov
PR: kubev2v/forklift#2540
File: pkg/controller/plan/adapter/vsphere/builder.go:694-699
Timestamp: 2025-08-18T13:45:08.364Z
Learning: The user yaacov prefers not to change existing behavior within the scope of a current PR when additional validation or safety checks are identified, and instead prefers to create follow-up issues to address such improvements separately.

Applied to files:

  • Makefile
  • operator/config/rbac/role.yaml
  • build/forklift-cli-download/Containerfile-downstream
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T14:14:19.484Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/config/manager/manager.yaml:49-50
Timestamp: 2025-09-18T14:14:19.484Z
Learning: In the yaacov/forklift project, RELATED_IMAGE_* environment variables and CSV relatedImages entries are generated automatically by the build automation. Manual addition of RELATED_IMAGE_* env vars in operator/config/manager/manager.yaml is not needed when the base image env var (like CLI_DOWNLOAD_IMAGE) is already present.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/config/manager/manager.yaml
  • operator/roles/forkliftcontroller/defaults/main.yml
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • build/forklift-operator-bundle/Containerfile
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T13:04:20.561Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-operator-bundle/Containerfile-downstream:32-33
Timestamp: 2025-09-18T13:04:20.561Z
Learning: The yaacov/forklift project uses placeholder sha256 digests (all zeros) in Containerfiles and export scripts, which are automatically replaced by their build automation during the release process.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-18T12:49:31.913Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/Containerfile:1-4
Timestamp: 2025-09-18T12:49:31.913Z
Learning: The yaacov/forklift project has automation that requires the UBI nginx base image to use the tag format `registry.access.redhat.com/ubi9/nginx-126:1-1756959223` rather than digest pinning in their Containerfiles.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • build/forklift-cli-download/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-02T17:01:19.057Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml:84-88
Timestamp: 2025-09-02T17:01:19.057Z
Learning: The maintainer yaacov prefers to keep field names as-is when documenting existing ForkliftController CRD fields in documentation PRs, rather than making consistency improvements that would require operator code changes. Field name standardization should be handled in separate PRs focused on operator changes.

Applied to files:

  • operator/config/rbac/role.yaml
  • build/forklift-cli-download/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/config/manager/manager.yaml
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.kustomized_manifests
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/export-vars-upstream.sh
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-18T12:50:21.059Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2:21-36
Timestamp: 2025-09-18T12:50:21.059Z
Learning: In the forklift project, yaacov prefers to rely on cluster-level default security context settings rather than explicitly defining securityContext in individual Kubernetes deployment manifests. This allows for centralized security policy management.

Applied to files:

  • operator/config/rbac/role.yaml
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
📚 Learning: 2025-08-13T03:31:49.934Z
Learnt from: yaacov
PR: kubev2v/forklift#2464
File: Makefile:138-147
Timestamp: 2025-08-13T03:31:49.934Z
Learning: In the kubev2v/forklift project, PRs should maintain focused scope and avoid mixing concerns. For example, adding a new environment variable should not be combined with larger refactoring efforts in the same PR, even if both changes affect the same file.

Applied to files:

  • operator/config/rbac/role.yaml
  • operator/.kustomized_manifests
📚 Learning: 2025-09-01T16:34:51.909Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml:233-236
Timestamp: 2025-09-01T16:34:51.909Z
Learning: The maintainer yaacov prefers to keep PRs focused on their intended scope and handle different types of changes (like typo fixes vs documentation updates) in separate issues/PRs. When documenting existing APIs, the documentation should accurately reflect the current implementation state, even if it contains typos that will be fixed later.

Applied to files:

  • operator/config/rbac/role.yaml
  • operator/roles/forkliftcontroller/tasks/main.yml
📚 Learning: 2025-09-18T12:48:54.433Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/Containerfile-downstream:10-23
Timestamp: 2025-09-18T12:48:54.433Z
Learning: The forklift project uses "Apache License 2.0" as their standard license string format across all builds, rather than the SPDX identifier "Apache-2.0", for consistency reasons.

Applied to files:

  • build/forklift-cli-download/Containerfile-downstream
📚 Learning: 2025-09-18T12:50:33.640Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2:24-24
Timestamp: 2025-09-18T12:50:33.640Z
Learning: The forklift project has automation that requires tag-based image references rather than digest-pinned references in their deployment templates.

Applied to files:

  • build/forklift-cli-download/Containerfile
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
📚 Learning: 2025-09-18T13:48:36.012Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.upstream_manifests:179-184
Timestamp: 2025-09-18T13:48:36.012Z
Learning: Repo preference (kubev2v/forklift): Do not surface individual feature_* flags in sample CRs or CSV init piecemeal. When adding a new feature flag (e.g., feature_cli_download in operator/.upstream_manifests), bundle updates to expose all feature_* flags together in a dedicated follow-up PR rather than updating only the new flag.

Applied to files:

  • operator/config/manager/manager.yaml
  • operator/roles/forkliftcontroller/defaults/main.yml
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.kustomized_manifests
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/export-vars-upstream.sh
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-17T03:50:40.352Z
Learnt from: mansam
PR: kubev2v/forklift#2855
File: operator/roles/forkliftcontroller/defaults/main.yml:144-144
Timestamp: 2025-09-17T03:50:40.352Z
Learning: In operator/roles/forkliftcontroller/defaults/main.yml, hooks_container_requests_memory (for hooks containers) and ova_container_requests_memory (for OVA provider server containers) are separate components with different memory requirements and should not be changed together.

Applied to files:

  • operator/roles/forkliftcontroller/defaults/main.yml
📚 Learning: 2025-09-18T12:47:53.805Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/download-latest-release.sh:5-18
Timestamp: 2025-09-18T12:47:53.805Z
Learning: In shell scripts for this project, prefer wget over curl as wget is installed by default while curl may not be available.

Applied to files:

  • build/forklift-cli-download/download-latest-release.sh
📚 Learning: 2025-08-26T11:37:16.255Z
Learnt from: yaacov
PR: kubev2v/forklift#2633
File: operator/roles/forkliftcontroller/templates/controller/deployment-controller.yml.j2:60-63
Timestamp: 2025-08-26T11:37:16.255Z
Learning: In the forklift project's Jinja2 templates (like operator/roles/forkliftcontroller/templates/controller/deployment-controller.yml.j2), template variables for environment values are typically not quoted when they represent single words or predictable values, maintaining consistency with the existing codebase style.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
📚 Learning: 2025-09-17T07:04:22.398Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: pkg/controller/plan/util/utils.go:127-138
Timestamp: 2025-09-17T07:04:22.398Z
Learning: The maintainer yaacov strongly prefers to avoid mixing different types of improvements (like security enhancements) with feature implementations in the same PR, even for small optional changes like replacing math/rand with crypto/rand.

Applied to files:

  • operator/roles/forkliftcontroller/tasks/main.yml
📚 Learning: 2025-08-18T13:44:07.771Z
Learnt from: yaacov
PR: kubev2v/forklift#2540
File: pkg/controller/plan/adapter/vsphere/builder.go:909-916
Timestamp: 2025-08-18T13:44:07.771Z
Learning: When yaacov requests to defer an improvement to a follow-up issue, create a GitHub issue using the gh CLI with proper title, description, and assignment to yaacov.

Applied to files:

  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-16T12:04:39.609Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:1253-1270
Timestamp: 2025-09-16T12:04:39.609Z
Learning: The files operator/.kustomized_manifests and operator/.upstream_manifests are also auto-generated manifests in the Forklift project, similar to operator/.downstream_manifests.

Applied to files:

  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-16T12:06:30.507Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/config/crd/bases/forklift.konveyor.io_migrations.yaml:547-565
Timestamp: 2025-09-16T12:06:30.507Z
Learning: The file operator/config/crd/bases/forklift.konveyor.io_migrations.yaml is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.kustomized_manifests
  • operator/.upstream_manifests
📚 Learning: 2025-09-03T04:08:05.745Z
Learnt from: yaacov
PR: kubev2v/forklift#2694
File: operator/.downstream_manifests:2523-2534
Timestamp: 2025-09-03T04:08:05.745Z
Learning: For Forklift Plan CRD docs, maintainer prefers documenting existing runtime keys/behavior verbatim (e.g., TargetLabels uses "app", convertor pods use "forklift.app") and avoiding normalization changes in documentation-only PRs.

Applied to files:

  • operator/.kustomized_manifests
📚 Learning: 2025-09-01T16:33:01.755Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/.downstream_manifests:172-213
Timestamp: 2025-09-01T16:33:01.755Z
Learning: The ForkliftController operator is architecturally designed to accept only string values for all configuration fields, including feature gates that would typically be booleans. This is why the CRD schema uses string types with enum constraints (like "true"/"false") rather than actual boolean types.

Applied to files:

  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
📚 Learning: 2025-09-16T12:04:53.070Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:4344-4361
Timestamp: 2025-09-16T12:04:53.070Z
Learning: The file `operator/.downstream_manifests` in the Forklift project is auto-generated and should not be edited directly. Any formatting issues or changes need to be addressed in the source templates or generation logic that creates this file.

Applied to files:

  • operator/export-vars-upstream.sh
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-16T12:05:52.685Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.upstream_manifests:1253-1270
Timestamp: 2025-09-16T12:05:52.685Z
Learning: The file operator/.upstream_manifests is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.upstream_manifests
📚 Learning: 2025-09-16T12:04:39.609Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:1253-1270
Timestamp: 2025-09-16T12:04:39.609Z
Learning: The file operator/.downstream_manifests is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.upstream_manifests
📚 Learning: 2025-09-17T03:54:23.225Z
Learnt from: mansam
PR: kubev2v/forklift#2855
File: operator/.downstream_manifests:6102-6107
Timestamp: 2025-09-17T03:54:23.225Z
Learning: Current OVA server route handling in pkg/controller/provider/ova-setup.go is create-only (no watch/reconcile). RBAC may remain limited to create for route.openshift.io Routes until reconciliation is implemented.

Applied to files:

  • operator/.downstream_manifests
🪛 Checkov (3.2.334)
operator/roles/forkliftcontroller/tasks/main.yml

[low] 241-270: Ensure block is handling task errors properly

(CKV2_ANSIBLE_3)

⏰ 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). (3)
  • GitHub Check: Red Hat Konflux / forklift-operator-dev-preview-on-pull-request
  • GitHub Check: Red Hat Konflux / forklift-operator-bundle-dev-preview-on-pull-request
  • GitHub Check: build
🔇 Additional comments (24)
operator/.kustomized_manifests (2)

63-82: Approve — feature_cli_download defaults are wired and resource defaults present.

feature_cli_download is set to true in operator/roles/forkliftcontroller/defaults/main.yml and cli_download_image_fqin plus the container requests/limits are defined there and referenced by the operator's tasks/templates; no changes required.


61-63: Image example FQINs migrated to quay.io/kubev2v — LGTM; scan for stragglers.

Change set looks consistent across examples. Quick check for any remaining forklift images under the old org.

Also applies to: 115-118, 268-270, 287-290, 291-294, 295-298, 299-302, 303-306, 323-326, 343-346, 351-354, 384-387

operator/export-vars-downstream.sh (1)

44-44: Downstream replacement key looks correct

replacements[CLI_DOWNLOAD_IMAGE]=mtv-cli-download-rhel9 aligns with your image naming. No further action.

build/forklift-cli-download/Containerfile-downstream (1)

1-23: LGTM: minimal, consistent downstream image

Base, COPY path, port, and labels align with the rest of the repo.

operator/roles/forkliftcontroller/defaults/main.yml (2)

12-12: Feature gate default ON looks right

Matches PR objective to enable CLI download by default.


102-112: CLI download defaults look sane

Image sourcing and resource requests/limits are reasonable for nginx static server.

operator/.upstream_manifests (4)

6466-6467: Approve: CLI_DOWNLOAD_IMAGE present and propagated

Makefile builds/pushes CLI_DOWNLOAD_IMAGE; operator/export-vars-upstream.sh and -downstream.sh set images[CLI_DOWNLOAD_IMAGE] (downstream replacement mtv-cli-download-rhel9); roles/defaults and operator/config/manager/manager.yaml consume it — CSV relatedImages auto-generation should pick this up. No further changes required.


61-63: Verify quay.io/kubev2v images are published and export-vars/templates map correctly

CRD examples and Makefile defaults reference quay.io/kubev2v, while operator/export-vars-upstream.sh and export-vars-downstream.sh are pinned to quay.io/redhat-user-workloads@sha256 and downstream replacements map to mtv-*. Confirm CI publishes the kubev2v images or update export-vars/templates to point to the intended digests/names.

Check: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml, Makefile, operator/export-vars-upstream.sh, operator/export-vars-downstream.sh.


64-82: CRD: CLI downloader resources/image fields are consumed

Templates and defaults use these keys to set the cli-download container image and resource requests/limits.

Locations:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 — image and resources (lines 24, 31–35)
  • operator/roles/forkliftcontroller/defaults/main.yml — defaults/env lookup (lines 102, 107–110)
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml — CRD entries (lines 96, 188, 192, 196, 200)

179-184: feature_cli_download flag added — gating verified

Service/Deployment/Route and ConsoleCLIDownload are created when feature_cli_download=true (and not k8s_cluster) and removed when false.

  • Creation gated in operator/roles/forkliftcontroller/tasks/main.yml: "Set CLI download feature state" (sets cli_download_state when feature_cli_download|bool) and a resource block guarded by when: feature_cli_download|bool and not k8s_cluster|bool (creates service, deployment, route, ConsoleCLIDownload templates).
  • Cleanup guarded in operator/roles/forkliftcontroller/tasks/main.yml: when: not feature_cli_download|bool -> include_tasks: cleanup.yml over forklift_resources.
  • Templates exist at operator/roles/forkliftcontroller/templates/cli-download/ (service-cli-download.yml.j2, deployment-cli-download.yml.j2, route-cli-download.yml.j2, console-cli-download-*.yml.j2).
  • Default and CRD updated: feature_cli_download: true in operator/roles/forkliftcontroller/defaults/main.yml and field present in operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml.
operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (4)

91-91: VDDK example already pinned — good.

Keeping a versioned tag here is appropriate.


187-204: Verified — resource keys propagate and RBAC present. The deployment template operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 references cli_download_container_limits_cpu, cli_download_container_limits_memory, cli_download_container_requests_cpu and cli_download_container_requests_memory; operator/config/rbac/role.yaml includes consoleclidownloads and route.openshift.io (routes).


96-99: Approve — cli_download_image_fqin addition is correctly wired.
Manager env var, role default, export-vars (upstream & downstream), and Makefile build/push targets for CLI_DOWNLOAD_IMAGE are present and consistent.


74-77: Feature gate addition looks correct — wiring verified; do not expose a single feature_ flag*

defaults/main.yml defines feature_cli_download: true and operator/roles/forkliftcontroller/tasks/main.yml honors it (uses feature_cli_download|bool). operator/.upstream_manifests, operator/.kustomized_manifests, and operator/.downstream_manifests currently expose only feature_cli_download — per repo policy, remove this single-flag exposure from the sample CRs/CSV and bundle all feature_* flags in a dedicated follow-up PR.
operator/roles/forkliftcontroller/defaults/main.yml; operator/roles/forkliftcontroller/tasks/main.yml; operator/.upstream_manifests, operator/.kustomized_manifests, operator/.downstream_manifests.

operator/.downstream_manifests (4)

6311-6322: RBAC: manager-role now includes consoleclidownloads and routes — resolves Route/CLIDownload creation risks.

Scope/verbs are consistent with existing manager-role patterns.


61-63: CRD examples: image org switched to quay.io/kubev2v — consistent across components.

No issues.

Also applies to: 117-117, 269-269, 289-289, 293-293, 297-297, 301-301, 305-305, 325-325, 345-345, 353-353, 385-385


179-184: Feature gate: feature_cli_download — verified

Default is true in operator/roles/forkliftcontroller/defaults/main.yml; role tasks gate setup/cleanup in operator/roles/forkliftcontroller/tasks/main.yml; CRD field present at operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml.


63-82: CRD: CLI download fields added — wired into defaults, templates, and CRD.
Found references in operator/roles/forkliftcontroller/defaults/main.yml (cli_download_* defaults), operator/roles/forkliftcontroller/templates/cli-download/* (deployment, service, route, ConsoleCLIDownload templates), and operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (CRD schema).

Makefile (1)

89-89: LGTM: CLI download image is fully wired into build/push and aggregated targets.

Variable, dedicated targets, and inclusion in build-all/push-all look correct.

Also applies to: 361-367, 378-378, 392-392

operator/config/manager/manager.yaml (1)

49-50: LGTM: CLI_DOWNLOAD_IMAGE env is correctly exposed to the operator.

Matches the image plumbing elsewhere.

operator/roles/forkliftcontroller/templates/cli-download/route-cli-download.yml.j2 (1)

1-18: LGTM: Route with explicit targetPort and edge TLS.

Explicit targetPort avoids ambiguity; config is sane.

operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1)

1-21: LGTM: Service exposes 8080 with matching selector.

Straightforward and consistent with Route.

operator/roles/forkliftcontroller/tasks/main.yml (1)

241-268: LGTM: CLI download deploy flow gated on OpenShift and feature flag.

Blocks and templates look consistent.

build/forklift-cli-download/Containerfile (1)

1-17: LGTM: Minimal nginx image for static CLI artifacts.

COPY path, port, and run command align with templates.

Comment thread hack/validate_forklift_controller_crd.py
Comment thread operator/.kustomized_manifests
Comment thread operator/.upstream_manifests
@yaacov
Copy link
Copy Markdown
Member Author

yaacov commented Sep 18, 2025

@mnecas added to the description in the top:

Screencast.From.2025-09-18.18-55-33.mp4

@yaacov yaacov force-pushed the cli-download-service branch 2 times, most recently from 4483a4f to 2c61b39 Compare September 18, 2025 18:47
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: 5

Caution

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

⚠️ Outside diff range comments (1)
operator/.upstream_manifests (1)

6817-6840: Add CLI_DOWNLOAD_IMAGE to CSV relatedImages (disconnected mirroring)

Without this, OLM cannot mirror the new image on disconnected clusters. Apply via generator.

   relatedImages:
   - image: ${OPERATOR_IMAGE}
     name: forklift-operator
@@
   - image: ${VSPHERE_XCOPY_VOLUME_POPULATOR_IMAGE}
     name: vsphere_xcopy_volume_populator
+  - image: ${CLI_DOWNLOAD_IMAGE}
+    name: cli_download
♻️ Duplicate comments (16)
build/forklift-operator-bundle/Containerfile-downstream (1)

32-33: Placeholder digest acknowledged; automation updates it.

No change needed here given your pipeline replaces the all-zero sha and injects values from images.conf.

operator/config/rbac/role.yaml (1)

45-47: RBAC additions align with new resources.

Allowing consoleclidownloads and routes matches the new templates; tightening verbs can land in the planned follow-up.

Also applies to: 48-53

hack/validate_forklift_controller_crd.py (1)

91-173: Global exclusion set is fine for now; matches feature scope.

This keeps CLI download internals out of CRD checks; OK given script’s temporary role.

build/forklift-operator-bundle/Containerfile (1)

15-15: ARG likely unused; remove or promote to ENV before envsubst.

envsubst sources export-vars-${STREAM}.sh; ARG won’t flow unless exported.

Apply one of:

-ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"
+# ARG not needed; value comes from export-vars-${STREAM}.sh

or

 ARG UI_PLUGIN_IMAGE="quay.io/kubev2v/forklift-console-plugin:latest"
-ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"
+ARG CLI_DOWNLOAD_IMAGE="quay.io/kubev2v/forklift-cli-download:latest"
+ENV CLI_DOWNLOAD_IMAGE="${CLI_DOWNLOAD_IMAGE}"
operator/roles/forkliftcontroller/tasks/main.yml (2)

293-301: Verify cleanup also removes ConsoleCLIDownload resources

Ensure ConsoleCLIDownload is included in forklift_resources and templates carry label service: {{ cli_download_service_name }} so cleanup finds them.

#!/bin/bash
# Expect: ConsoleCLIDownload present in forklift_resources and labeled with the service name.
rg -nP '^\s*forklift_resources:' -C3 operator/roles/forkliftcontroller/defaults || true
rg -n 'kind:\s*ConsoleCLIDownload|service:\s*\{\{\s*cli_download_service_name\s*\}\}' -C2 operator/roles/forkliftcontroller/templates/cli-download || true

241-268: Gate ConsoleCLIDownload by API presence and use merge patch for Deployment

To match controller behavior and avoid failures on clusters without Console API:

  • Add merge_type: "merge" to the CLI deployment task.
  • Guard ConsoleCLIDownload tasks with a console.openshift.io API check.
   - name: "Setup CLI download deployment"
     k8s:
       state: "{{ cli_download_state }}"
       definition: "{{ lookup('template', 'cli-download/deployment-cli-download.yml.j2') }}"
+      merge_type: "merge"

   - name: "Setup ConsoleCLIDownload for kubectl-mtv"
     k8s:
       state: "{{ cli_download_state }}"
       definition: "{{ lookup('template', 'cli-download/console-cli-download-kubectl-mtv.yml.j2') }}"
+    when: "'console.openshift.io' in api_groups"

   - name: "Setup ConsoleCLIDownload for kubectl-mtv MCP"
     k8s:
       state: "{{ cli_download_state }}"
       definition: "{{ lookup('template', 'cli-download/console-cli-download-mcp.yml.j2') }}"
+    when: "'console.openshift.io' in api_groups"

Optionally wrap the two ConsoleCLIDownload tasks in a block/rescue to log and continue if creation fails (RBAC/drift).

Makefile (1)

361-367: Mark new targets phony (follow-up OK)

Add .PHONY for build/push CLI download targets; can be handled in a sweep PR for consistency with other targets.

+.PHONY: build-cli-download-image push-cli-download-image
 build-cli-download-image: check_container_runtime
 	$(eval CLI_DOWNLOAD_IMAGE=$(REGISTRY)/$(REGISTRY_ORG)/forklift-cli-download:$(REGISTRY_TAG))
 	$(CONTAINER_CMD) build -t $(CLI_DOWNLOAD_IMAGE) -f build/forklift-cli-download/Containerfile .
 
 push-cli-download-image: build-cli-download-image
 	$(CONTAINER_CMD) push $(CLI_DOWNLOAD_IMAGE)
operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1)

21-36: Add readiness/liveness probes for nginx

Probes improve rollout health and self-healing without changing behavior.

       containers:
         - name: "{{ cli_download_container_name }}"
           image: "{{ cli_download_image_fqin }}"
           ports:
             - containerPort: 8080
               protocol: TCP
           imagePullPolicy: "{{ image_pull_policy }}"
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 8080
+            initialDelaySeconds: 3
+            periodSeconds: 10
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 8080
+            initialDelaySeconds: 10
+            periodSeconds: 20
           resources:
             limits:
               cpu: "{{ cli_download_container_limits_cpu }}"
               memory: "{{ cli_download_container_limits_memory }}"
             requests:
               cpu: "{{ cli_download_container_requests_cpu }}"
               memory: "{{ cli_download_container_requests_memory }}"
build/forklift-cli-download/download-latest-release.sh (1)

1-6: Enable strict mode and make REPO overridable (default to kubev2v).

Prevents silent failures and avoids hardcoding a personal repo.

Apply:

 #!/bin/bash
+set -Eeuo pipefail
+
-REPO="yaacov/kubectl-mtv"
+REPO="${REPO:-kubev2v/kubectl-mtv}"
 ARTIFACTS_DIR="$(dirname "$0")/artifacts"
 mkdir -p "${ARTIFACTS_DIR}"

 # Get the latest release tag from GitHub API
 echo "Getting latest release tag..."
 TAG=$(wget -qO- "https://api.github.com/repos/${REPO}/releases/latest" | grep "tag_name" | cut -d '"' -f 4)

Also applies to: 9-11

operator/.upstream_manifests (2)

179-184: feature_cli_download flag — LGTM; exposure deferred

Flag shape matches other feature_* fields. Per repo preference, surfacing in samples/CSV init can be handled in a follow-up PR covering all flags.

I can open a tracking issue “Expose all feature_* flags in samples and CSV init” and assign it to yaacov if you want.


6311-6317: RBAC: replace wildcards for consoleclidownloads and routes (follow-up OK)

Use explicit verbs instead of '*'. Apply via generator; safe to defer as agreed.

-  - consoleplugins
-  - consoleclidownloads
-  verbs:
-  - '*'
+  - consoleplugins
+  verbs:
+  - '*'
+- apiGroups:
+  - console.openshift.io
+  resources:
+  - consoleclidownloads
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
@@
-  - routes
-  verbs:
-  - '*'
+  - routes
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete

Also applies to: 6318-6322

operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (1)

83-83: Avoid :latest in examples — use pinned, versioned tags.

Follow the existing guidance; prefer concrete versioned tags in examples to discourage floating tags. Keep vddk:7.0.3 as-is.

- example: "quay.io/kubev2v/forklift-controller:latest"
+ example: "quay.io/kubev2v/forklift-controller:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-virt-v2v:latest"
+ example: "quay.io/kubev2v/forklift-virt-v2v:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-api:latest"
+ example: "quay.io/kubev2v/forklift-api:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-cli-download:latest"
+ example: "quay.io/kubev2v/forklift-cli-download:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-ui-plugin:latest"
+ example: "quay.io/kubev2v/forklift-ui-plugin:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-validation:latest"
+ example: "quay.io/kubev2v/forklift-validation:vX.Y.Z"
- example: "quay.io/kubev2v/populator-controller:latest"
+ example: "quay.io/kubev2v/populator-controller:vX.Y.Z"
- example: "quay.io/kubev2v/ovirt-populator:latest"
+ example: "quay.io/kubev2v/ovirt-populator:vX.Y.Z"
- example: "quay.io/kubev2v/openstack-populator:latest"
+ example: "quay.io/kubev2v/openstack-populator:vX.Y.Z"
- example: "quay.io/kubev2v/vsphere-populator:latest"
+ example: "quay.io/kubev2v/vsphere-populator:vX.Y.Z"
- example: "quay.io/kubev2v/ova-provider-server:latest"
+ example: "quay.io/kubev2v/ova-provider-server:vX.Y.Z"
- example: "quay.io/kubev2v/forklift-must-gather:latest"
+ example: "quay.io/kubev2v/forklift-must-gather:vX.Y.Z"

Also applies to: 87-87, 95-95, 96-99, 103-103, 107-107, 111-111, 115-115, 119-119, 123-123, 127-127, 131-131

operator/.downstream_manifests (2)

6314-6317: RBAC: add ConsoleCLIDownload permissions to manager-role — resolves earlier gap.

This unblocks creation/management of consoleclidownloads by the operator.


6466-6467: Manager env: CLI_DOWNLOAD_IMAGE wired — aligned with project automation.

Base image env var added; RELATED_IMAGE_* and CSV relatedImages are auto-generated from this per repo automation.

operator/.kustomized_manifests (2)

6466-6467: Operator wired CLI_DOWNLOAD_IMAGE env — LGTM

Matches the image pipeline/automation that substitutes ${CLI_DOWNLOAD_IMAGE}; no manual RELATED_IMAGE_* needed.


6314-6317: Tighten RBAC for consoleclidownloads and routes (replace wildcard verbs; split rules)

Principle of least privilege. Keep consoleplugins as-is if needed, but scope consoleclidownloads and routes to CRUD + get/list/watch.

Apply this diff:

- - apiGroups:
-   - console.openshift.io
-   resources:
-   - consoleplugins
-   - consoleclidownloads
-   verbs:
-   - '*'
+ - apiGroups:
+   - console.openshift.io
+   resources:
+   - consoleplugins
+   verbs:
+   - '*'
+ - apiGroups:
+   - console.openshift.io
+   resources:
+   - consoleclidownloads
+   verbs:
+   - get
+   - list
+   - watch
+   - create
+   - update
+   - patch
+   - delete
- - apiGroups:
-   - route.openshift.io
-   resources:
-   - routes
-   verbs:
-   - '*'
+ - apiGroups:
+   - route.openshift.io
+   resources:
+   - routes
+   verbs:
+   - get
+   - list
+   - watch
+   - create
+   - update
+   - patch
+   - delete

Also applies to: 6318-6322

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8d8b4fc and 2c61b39.

⛔ Files ignored due to path filters (7)
  • build/forklift-cli-download/README.md is excluded by !**/*.md
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-darwin-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-linux-arm64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-mcp-servers-linux-amd64.tar.gz is excluded by !**/*.gz, !**/*.gz
  • build/forklift-cli-download/artifacts/kubectl-mtv-windows-amd64.zip is excluded by !**/*.zip, !**/*.zip
📒 Files selected for processing (22)
  • Makefile (5 hunks)
  • build/forklift-cli-download/Containerfile (1 hunks)
  • build/forklift-cli-download/Containerfile-downstream (1 hunks)
  • build/forklift-cli-download/download-latest-release.sh (1 hunks)
  • build/forklift-operator-bundle/Containerfile (1 hunks)
  • build/forklift-operator-bundle/Containerfile-downstream (1 hunks)
  • hack/validate_forklift_controller_crd.py (2 hunks)
  • operator/.downstream_manifests (10 hunks)
  • operator/.kustomized_manifests (10 hunks)
  • operator/.upstream_manifests (10 hunks)
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml (2 hunks)
  • operator/config/manager/manager.yaml (1 hunks)
  • operator/config/rbac/role.yaml (1 hunks)
  • operator/export-vars-downstream.sh (2 hunks)
  • operator/export-vars-upstream.sh (1 hunks)
  • operator/roles/forkliftcontroller/defaults/main.yml (2 hunks)
  • operator/roles/forkliftcontroller/tasks/main.yml (3 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/route-cli-download.yml.j2 (1 hunks)
  • operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1 hunks)
🧰 Additional context used
🧠 Learnings (30)
📓 Common learnings
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.110Z
Learning: Forklift repo: the forklift-cli-download image is part of the standard pipeline — Makefile defines build-cli-download-image/push-cli-download-image and includes them in build-all-images/push-all-images; export-vars {upstream,downstream} also define CLI_DOWNLOAD_IMAGE with downstream replacement to mtv-cli-download-rhel9.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/export-vars-upstream.sh:25-26
Timestamp: 2025-09-18T13:44:23.321Z
Learning: The yaacov/forklift project has automation that handles the substitution of CLI_DOWNLOAD_IMAGE placeholders (${CLI_DOWNLOAD_IMAGE}) in manifests during the build/release process, similar to how they handle placeholder sha256 digests.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.109Z
Learning: Forklift repo Makefile contains build-cli-download-image and push-cli-download-image targets and includes them in build-all-images/push-all-images; the CLI download image is part of the standard image pipeline.
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.upstream_manifests:179-184
Timestamp: 2025-09-18T13:48:36.012Z
Learning: Repo preference (kubev2v/forklift): Do not surface individual feature_* flags in sample CRs or CSV init piecemeal. When adding a new feature flag (e.g., feature_cli_download in operator/.upstream_manifests), bundle updates to expose all feature_* flags together in a dedicated follow-up PR rather than updating only the new flag.
📚 Learning: 2025-09-18T14:21:10.110Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.110Z
Learning: Forklift repo: the forklift-cli-download image is part of the standard pipeline — Makefile defines build-cli-download-image/push-cli-download-image and includes them in build-all-images/push-all-images; export-vars {upstream,downstream} also define CLI_DOWNLOAD_IMAGE with downstream replacement to mtv-cli-download-rhel9.

Applied to files:

  • build/forklift-operator-bundle/Containerfile
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • Makefile
  • build/forklift-cli-download/Containerfile-downstream
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/manager/manager.yaml
  • build/forklift-cli-download/download-latest-release.sh
  • operator/export-vars-downstream.sh
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/roles/forkliftcontroller/defaults/main.yml
📚 Learning: 2025-09-18T14:21:10.109Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.kustomized_manifests:6454-6455
Timestamp: 2025-09-18T14:21:10.109Z
Learning: Forklift repo Makefile contains build-cli-download-image and push-cli-download-image targets and includes them in build-all-images/push-all-images; the CLI download image is part of the standard image pipeline.

Applied to files:

  • build/forklift-operator-bundle/Containerfile
  • Makefile
  • build/forklift-cli-download/Containerfile-downstream
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/manager/manager.yaml
  • operator/export-vars-downstream.sh
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-18T13:44:23.321Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/export-vars-upstream.sh:25-26
Timestamp: 2025-09-18T13:44:23.321Z
Learning: The yaacov/forklift project has automation that handles the substitution of CLI_DOWNLOAD_IMAGE placeholders (${CLI_DOWNLOAD_IMAGE}) in manifests during the build/release process, similar to how they handle placeholder sha256 digests.

Applied to files:

  • build/forklift-operator-bundle/Containerfile
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • Makefile
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/manager/manager.yaml
  • build/forklift-cli-download/download-latest-release.sh
  • operator/export-vars-downstream.sh
  • operator/roles/forkliftcontroller/tasks/main.yml
  • hack/validate_forklift_controller_crd.py
  • operator/.upstream_manifests
  • operator/config/rbac/role.yaml
  • operator/.downstream_manifests
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • build/forklift-cli-download/Containerfile
  • operator/roles/forkliftcontroller/defaults/main.yml
📚 Learning: 2025-09-18T14:14:19.484Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/config/manager/manager.yaml:49-50
Timestamp: 2025-09-18T14:14:19.484Z
Learning: In the yaacov/forklift project, RELATED_IMAGE_* environment variables and CSV relatedImages entries are generated automatically by the build automation. Manual addition of RELATED_IMAGE_* env vars in operator/config/manager/manager.yaml is not needed when the base image env var (like CLI_DOWNLOAD_IMAGE) is already present.

Applied to files:

  • build/forklift-operator-bundle/Containerfile
  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/config/manager/manager.yaml
  • operator/export-vars-downstream.sh
  • operator/.upstream_manifests
  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • operator/roles/forkliftcontroller/defaults/main.yml
📚 Learning: 2025-08-26T11:37:16.255Z
Learnt from: yaacov
PR: kubev2v/forklift#2633
File: operator/roles/forkliftcontroller/templates/controller/deployment-controller.yml.j2:60-63
Timestamp: 2025-08-26T11:37:16.255Z
Learning: In the forklift project's Jinja2 templates (like operator/roles/forkliftcontroller/templates/controller/deployment-controller.yml.j2), template variables for environment values are typically not quoted when they represent single words or predictable values, maintaining consistency with the existing codebase style.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
📚 Learning: 2025-09-18T12:50:33.640Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2:24-24
Timestamp: 2025-09-18T12:50:33.640Z
Learning: The forklift project has automation that requires tag-based image references rather than digest-pinned references in their deployment templates.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • build/forklift-cli-download/Containerfile
📚 Learning: 2025-09-18T12:49:31.913Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/Containerfile:1-4
Timestamp: 2025-09-18T12:49:31.913Z
Learning: The yaacov/forklift project has automation that requires the UBI nginx base image to use the tag format `registry.access.redhat.com/ubi9/nginx-126:1-1756959223` rather than digest pinning in their Containerfiles.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • Makefile
  • build/forklift-cli-download/Containerfile-downstream
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/export-vars-upstream.sh
  • build/forklift-cli-download/Containerfile
📚 Learning: 2025-09-18T12:50:21.059Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2:21-36
Timestamp: 2025-09-18T12:50:21.059Z
Learning: In the forklift project, yaacov prefers to rely on cluster-level default security context settings rather than explicitly defining securityContext in individual Kubernetes deployment manifests. This allows for centralized security policy management.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • operator/config/rbac/role.yaml
📚 Learning: 2025-08-19T10:02:47.617Z
Learnt from: yaacov
PR: kubev2v/forklift#2561
File: Makefile:0-0
Timestamp: 2025-08-19T10:02:47.617Z
Learning: User yaacov prefers to defer security hardening improvements like checksum verification to follow-up PRs rather than expanding the scope of cleanup-focused PRs.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/roles/forkliftcontroller/tasks/main.yml
  • hack/validate_forklift_controller_crd.py
  • operator/.upstream_manifests
  • operator/config/rbac/role.yaml
  • operator/.downstream_manifests
📚 Learning: 2025-08-18T13:45:08.364Z
Learnt from: yaacov
PR: kubev2v/forklift#2540
File: pkg/controller/plan/adapter/vsphere/builder.go:694-699
Timestamp: 2025-08-18T13:45:08.364Z
Learning: The user yaacov prefers not to change existing behavior within the scope of a current PR when additional validation or safety checks are identified, and instead prefers to create follow-up issues to address such improvements separately.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • Makefile
  • build/forklift-cli-download/Containerfile-downstream
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2
  • operator/roles/forkliftcontroller/tasks/main.yml
  • hack/validate_forklift_controller_crd.py
  • operator/.upstream_manifests
  • operator/config/rbac/role.yaml
  • operator/.downstream_manifests
📚 Learning: 2025-09-02T17:01:19.057Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml:84-88
Timestamp: 2025-09-02T17:01:19.057Z
Learning: The maintainer yaacov prefers to keep field names as-is when documenting existing ForkliftController CRD fields in documentation PRs, rather than making consistency improvements that would require operator code changes. Field name standardization should be handled in separate PRs focused on operator changes.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2
  • build/forklift-cli-download/Containerfile-downstream
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2
  • operator/config/manager/manager.yaml
  • operator/export-vars-downstream.sh
  • operator/roles/forkliftcontroller/tasks/main.yml
  • hack/validate_forklift_controller_crd.py
  • operator/.upstream_manifests
  • operator/config/rbac/role.yaml
  • operator/.downstream_manifests
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-18T13:45:03.983Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/config/rbac/role.yaml:42-47
Timestamp: 2025-09-18T13:45:03.983Z
Learning: In the yaacov/forklift project, comprehensive fixes (like RBAC permission cleanup) are preferred to be done in dedicated PRs rather than mixed with feature additions, to ensure consistency across the codebase.

Applied to files:

  • Makefile
  • build/forklift-cli-download/Containerfile-downstream
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/config/rbac/role.yaml
📚 Learning: 2025-09-18T13:04:20.561Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-operator-bundle/Containerfile-downstream:32-33
Timestamp: 2025-09-18T13:04:20.561Z
Learning: The yaacov/forklift project uses placeholder sha256 digests (all zeros) in Containerfiles and export scripts, which are automatically replaced by their build automation during the release process.

Applied to files:

  • Makefile
  • build/forklift-operator-bundle/Containerfile-downstream
  • operator/export-vars-downstream.sh
  • operator/export-vars-upstream.sh
  • build/forklift-cli-download/Containerfile
📚 Learning: 2025-09-18T12:48:54.433Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/Containerfile-downstream:10-23
Timestamp: 2025-09-18T12:48:54.433Z
Learning: The forklift project uses "Apache License 2.0" as their standard license string format across all builds, rather than the SPDX identifier "Apache-2.0", for consistency reasons.

Applied to files:

  • build/forklift-cli-download/Containerfile-downstream
📚 Learning: 2025-09-18T16:01:02.701Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2:12-13
Timestamp: 2025-09-18T16:01:02.701Z
Learning: In Forklift templates using Route host lookup, it's acceptable to have "bad route" fallback URLs when Route status is empty during initial deployment - the complexity of safe lookup chains isn't required for CLI download functionality.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2
  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2
📚 Learning: 2025-09-18T13:48:36.012Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: operator/.upstream_manifests:179-184
Timestamp: 2025-09-18T13:48:36.012Z
Learning: Repo preference (kubev2v/forklift): Do not surface individual feature_* flags in sample CRs or CSV init piecemeal. When adding a new feature flag (e.g., feature_cli_download in operator/.upstream_manifests), bundle updates to expose all feature_* flags together in a dedicated follow-up PR rather than updating only the new flag.

Applied to files:

  • operator/config/manager/manager.yaml
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
  • operator/roles/forkliftcontroller/defaults/main.yml
📚 Learning: 2025-09-18T12:47:53.805Z
Learnt from: yaacov
PR: kubev2v/forklift#2882
File: build/forklift-cli-download/download-latest-release.sh:5-18
Timestamp: 2025-09-18T12:47:53.805Z
Learning: In shell scripts for this project, prefer wget over curl as wget is installed by default while curl may not be available.

Applied to files:

  • build/forklift-cli-download/download-latest-release.sh
📚 Learning: 2025-09-01T16:33:01.755Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/.downstream_manifests:172-213
Timestamp: 2025-09-01T16:33:01.755Z
Learning: The ForkliftController operator is architecturally designed to accept only string values for all configuration fields, including feature gates that would typically be booleans. This is why the CRD schema uses string types with enum constraints (like "true"/"false") rather than actual boolean types.

Applied to files:

  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml
📚 Learning: 2025-09-01T16:34:51.909Z
Learnt from: yaacov
PR: kubev2v/forklift#2690
File: operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml:233-236
Timestamp: 2025-09-01T16:34:51.909Z
Learning: The maintainer yaacov prefers to keep PRs focused on their intended scope and handle different types of changes (like typo fixes vs documentation updates) in separate issues/PRs. When documenting existing APIs, the documentation should accurately reflect the current implementation state, even if it contains typos that will be fixed later.

Applied to files:

  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/config/rbac/role.yaml
📚 Learning: 2025-09-17T07:04:22.398Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: pkg/controller/plan/util/utils.go:127-138
Timestamp: 2025-09-17T07:04:22.398Z
Learning: The maintainer yaacov strongly prefers to avoid mixing different types of improvements (like security enhancements) with feature implementations in the same PR, even for small optional changes like replacing math/rand with crypto/rand.

Applied to files:

  • operator/roles/forkliftcontroller/tasks/main.yml
📚 Learning: 2025-08-18T13:44:07.771Z
Learnt from: yaacov
PR: kubev2v/forklift#2540
File: pkg/controller/plan/adapter/vsphere/builder.go:909-916
Timestamp: 2025-08-18T13:44:07.771Z
Learning: When yaacov requests to defer an improvement to a follow-up issue, create a GitHub issue using the gh CLI with proper title, description, and assignment to yaacov.

Applied to files:

  • operator/roles/forkliftcontroller/tasks/main.yml
  • operator/.upstream_manifests
  • operator/.downstream_manifests
📚 Learning: 2025-09-16T12:06:30.507Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/config/crd/bases/forklift.konveyor.io_migrations.yaml:547-565
Timestamp: 2025-09-16T12:06:30.507Z
Learning: The file operator/config/crd/bases/forklift.konveyor.io_migrations.yaml is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • hack/validate_forklift_controller_crd.py
  • operator/.upstream_manifests
📚 Learning: 2025-09-16T12:04:39.609Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:1253-1270
Timestamp: 2025-09-16T12:04:39.609Z
Learning: The files operator/.kustomized_manifests and operator/.upstream_manifests are also auto-generated manifests in the Forklift project, similar to operator/.downstream_manifests.

Applied to files:

  • operator/.upstream_manifests
  • operator/.downstream_manifests
  • operator/.kustomized_manifests
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-16T12:04:53.070Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.downstream_manifests:4344-4361
Timestamp: 2025-09-16T12:04:53.070Z
Learning: The file `operator/.downstream_manifests` in the Forklift project is auto-generated and should not be edited directly. Any formatting issues or changes need to be addressed in the source templates or generation logic that creates this file.

Applied to files:

  • operator/.upstream_manifests
  • operator/export-vars-upstream.sh
📚 Learning: 2025-09-16T12:05:52.685Z
Learnt from: yaacov
PR: kubev2v/forklift#2812
File: operator/.upstream_manifests:1253-1270
Timestamp: 2025-09-16T12:05:52.685Z
Learning: The file operator/.upstream_manifests is auto-generated and cannot be directly modified. Any formatting fixes need to be applied to the source templates or generation process that creates this file.

Applied to files:

  • operator/.upstream_manifests
📚 Learning: 2025-08-13T03:31:49.934Z
Learnt from: yaacov
PR: kubev2v/forklift#2464
File: Makefile:138-147
Timestamp: 2025-08-13T03:31:49.934Z
Learning: In the kubev2v/forklift project, PRs should maintain focused scope and avoid mixing concerns. For example, adding a new environment variable should not be combined with larger refactoring efforts in the same PR, even if both changes affect the same file.

Applied to files:

  • operator/config/rbac/role.yaml
📚 Learning: 2025-09-17T03:54:23.225Z
Learnt from: mansam
PR: kubev2v/forklift#2855
File: operator/.downstream_manifests:6102-6107
Timestamp: 2025-09-17T03:54:23.225Z
Learning: Current OVA server route handling in pkg/controller/provider/ova-setup.go is create-only (no watch/reconcile). RBAC may remain limited to create for route.openshift.io Routes until reconciliation is implemented.

Applied to files:

  • operator/.downstream_manifests
📚 Learning: 2025-08-26T11:36:02.177Z
Learnt from: yaacov
PR: kubev2v/forklift#2633
File: operator/roles/forkliftcontroller/tasks/main.yml:33-45
Timestamp: 2025-08-26T11:36:02.177Z
Learning: In the forklift project, the pattern `when: "'route.openshift.io' in api_groups"` is used consistently throughout the codebase without additional error handling. Maintain this consistency rather than adding error handling to individual instances.

Applied to files:

  • operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2
📚 Learning: 2025-09-17T03:50:40.352Z
Learnt from: mansam
PR: kubev2v/forklift#2855
File: operator/roles/forkliftcontroller/defaults/main.yml:144-144
Timestamp: 2025-09-17T03:50:40.352Z
Learning: In operator/roles/forkliftcontroller/defaults/main.yml, hooks_container_requests_memory (for hooks containers) and ova_container_requests_memory (for OVA provider server containers) are separate components with different memory requirements and should not be changed together.

Applied to files:

  • operator/roles/forkliftcontroller/defaults/main.yml
🪛 Checkov (3.2.334)
operator/roles/forkliftcontroller/tasks/main.yml

[low] 241-270: Ensure block is handling task errors properly

(CKV2_ANSIBLE_3)

⏰ 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: Red Hat Konflux / forklift-operator-dev-preview-on-pull-request
  • GitHub Check: Red Hat Konflux / forklift-operator-bundle-dev-preview-on-pull-request
🔇 Additional comments (26)
operator/roles/forkliftcontroller/templates/cli-download/service-cli-download.yml.j2 (1)

11-18: Service looks good and matches deployment selectors.

Port naming (8080-tcp) is consistent; pairs with the Route after switching Route to use the name.

operator/config/manager/manager.yaml (1)

49-50: Wiring looks correct; no extra RELATED_IMAGE needed.

Defaults set cli_download_image_fqin = lookup('env','CLI_DOWNLOAD_IMAGE') or RELATED_IMAGE_CLI_DOWNLOAD (operator/roles/forkliftcontroller/defaults/main.yml:102) and the cli-download deployment uses that variable for the image (operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2:24). Keeping CLI_DOWNLOAD_IMAGE in manager.yaml is sufficient.

operator/roles/forkliftcontroller/tasks/main.yml (1)

9-12: LGTM — feature flag wiring

Setting cli_download_state via feature_cli_download is correct and consistent with other features.

operator/export-vars-downstream.sh (1)

25-26: LGTM — downstream image and replacement mapping added

images[CLI_DOWNLOAD_IMAGE] and replacements[CLI_DOWNLOAD_IMAGE] look correct and align with the pipeline.

Also applies to: 44-45

build/forklift-cli-download/Containerfile (1)

1-17: LGTM — minimal nginx-based artifact server

Image, copy path, port, and labels look good for the download service.

Makefile (3)

89-90: LGTM — component image variable added

CLI_DOWNLOAD_IMAGE default fits existing pattern.


308-309: LGTM — passing CLI_DOWNLOAD_IMAGE to bundle build

Arg propagation is consistent with other images.


378-379: LGTM — included in batch build/push targets

Adding CLI download image to build-all-images/push-all-images is correct.

Also applies to: 392-393

build/forklift-cli-download/Containerfile-downstream (1)

1-24: LGTM — downstream Containerfile

Base image, ARGs, labels, and exposure align with the downstream flow.

operator/export-vars-upstream.sh (1)

25-26: LGTM — upstream image entry added

CLI_DOWNLOAD_IMAGE export follows existing substitution logic.

operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-mcp.yml.j2 (1)

1-14: LGTM — ConsoleCLIDownload (MCP) template

Cluster-scoped resource with route-based URL looks good.

operator/roles/forkliftcontroller/templates/cli-download/console-cli-download-kubectl-mtv.yml.j2 (1)

4-5: ConsoleCLIDownload scope fix looks good.

No namespace present on a cluster-scoped resource.

operator/roles/forkliftcontroller/defaults/main.yml (2)

102-111: CLI download defaults look consistent with existing patterns.

Image sourcing and resource requests/limits are reasonable.


12-12: CLI download tasks gating verified — no action required.

operator/roles/forkliftcontroller/tasks/main.yml sets cli_download_state='present' when feature_cli_download|bool (line 11); the Service/Deployment/Route/ConsoleCLIDownload tasks use {{ cli_download_state }} (≈lines 244–266); cleanup runs when feature_cli_download is false (≈line 293). Tasks are additionally gated by not k8s_cluster.

build/forklift-cli-download/download-latest-release.sh (1)

44-44: Verify MCP servers asset naming (tag vs. no-tag).

Could not confirm — GitHub API returned no release assets for kubev2v/kubectl-mtv when queried from the sandbox. Confirm whether the real release asset name includes ${TAG} and update build/forklift-cli-download/download-latest-release.sh (line 44) to use the correct filename or to programmatically resolve the asset name from the release assets.

operator/.upstream_manifests (3)

63-82: CLI download CRD fields — LGTM

Fields and examples align with existing patterns (string types, resource hints). No blockers.


61-63: Image example fqins switched to kubev2v — LGTM

Consistent updates across fields; no schema drift.

Also applies to: 117-117, 269-269, 289-305, 325-325, 345-345, 353-353, 386-386


6466-6467: Operator env CLI_DOWNLOAD_IMAGE — wired OK; CSV relatedImages missing

  • Env present: operator/.upstream_manifests (lines 6466–6467) and operator/config/manager/manager.yaml (lines 49–50).
  • CSV relatedImages (operator/.downstream_manifests ≈ line 6811) lists OPERATOR_IMAGE and CONTROLLER_IMAGE but does not include CLI_DOWNLOAD_IMAGE.
  • build/Makefile not found in repo; confirm CI/build injects RELATED_IMAGE_CLI_DOWNLOAD into the CSV relatedImages or add an explicit relatedImages entry for the CLI download.
operator/.downstream_manifests (5)

115-118: Example image updated (controller) — OK.

Just an example string; consistent with other image fields.


179-184: New feature flag feature_cli_download — matches repo conventions.

Enum "true"/"false" and default noted in description. Also not surfaced in sample CR (preferred).

Please confirm the operator defaults set this to "true" by default in roles/defaults and that toggling it gates creation of the CLI resources.


269-269: Bulk example image updates — consistent across CRD docs.

All example FQINs point to quay.io/kubev2v/*:latest like neighboring fields. No action.

Also applies to: 289-289, 293-293, 297-297, 301-301, 305-305, 325-325, 345-345, 353-353, 386-386


61-82: LGTM — CLI download knobs and operator wiring verified.

feature_cli_download is set in operator/roles/forkliftcontroller/defaults/main.yml; tasks are gated on feature_cli_download in operator/roles/forkliftcontroller/tasks/main.yml; templates reference cli_download_image_fqin (operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2); Makefile/export-vars expose CLI_DOWNLOAD_IMAGE.


6318-6323: RBAC: narrow cluster-scope Route verbs (recommended — verify before tightening)

Works as-is. Optional: replace verbs: ["get","list","create","update","patch"] instead of "*". Ansible creates Routes in operator/roles/forkliftcontroller/tasks/main.yml (templates controller/route-inventory.yml.j2, api/route-services.yml.j2) using k8s state: present; repo learning: pkg/controller/provider/ova-setup.go currently only creates routes (no watch/reconcile). Verify other controllers/watchers before removing watch or further tightening.

operator/.kustomized_manifests (3)

179-184: Feature gate added: feature_cli_download — exposure policy OK

Enum matches existing feature_* fields. Not surfaced piecemeal in sample CR/CSV here, which aligns with the repo preference to batch all flags later. No action.


61-63: Image example references switched to quay.io/kubev2v — LGTM

Examples now use kubev2v-prefixed images consistently across CRD fields.

Also applies to: 115-118, 269-270, 289-290, 293-294, 297-298, 301-302, 305-306, 325-326, 345-346, 353-354, 385-387


63-82: CRD: CLI download fields wired — defaults & feature gate verified

  • operator/roles/forkliftcontroller/defaults/main.yml defines feature_cli_download: true and sets cli_download_image_fqin, cli_download_container_name, cli_download_container_limits_cpu/memory, cli_download_container_requests_cpu/memory.
  • operator/roles/forkliftcontroller/templates/cli-download/deployment-cli-download.yml.j2 consumes the image and resource vars.
  • operator/roles/forkliftcontroller/tasks/main.yml gates creation with when: feature_cli_download|bool (and variants like when: feature_cli_download|bool and not k8s_cluster|bool).
  • operator/config/crd/bases/forklift.konveyor.io_forkliftcontrollers.yaml exposes the CRD fields.

Comment thread build/forklift-cli-download/download-latest-release.sh
Signed-off-by: yaacov <kobi.zamir@gmail.com>
@yaacov yaacov force-pushed the cli-download-service branch from 73f2782 to 1fc386e Compare September 18, 2025 19:13
Copy link
Copy Markdown
Collaborator

@solenoci solenoci left a comment

Choose a reason for hiding this comment

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

LGTM

Comment thread build/forklift-cli-download/Containerfile-downstream
@yaacov yaacov merged commit 0047dbc into kubev2v:main Sep 22, 2025
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants