Repository navigation
ADR-015: Disconnected Install: Complete Container Image Inventory and Resolution - #29
Conversation
Document Declare→Discover→Mirror→Resolve for Operator relatedImages and Helm values.yaml as the static image contract for air-gap installs. Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Address review feedback by naming owning repos, paths, and planned CI without implying those files live in rhdh-adr. Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
PR Summary by QodoADR: Define disconnected image inventories for Operator and Helm
AI Description
Diagram
High-Level Assessment
Files changed (1)
|
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
|
/agentic_review |
|
Code review by qodo was updated up to the latest commit 77baff9 |
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
gazarenkov
left a comment
There was a problem hiding this comment.
I think mirror configuration should be a first class citizen for RHDH Operator.
The best approach I see for the time being is:
- configure mirrors on operator level (using ConfigMap of known format)
- if configured make operator apply it
It is already applied for dynamic plugins (see https://redhat.atlassian.net/browse/RHIDP-15003) and we can pretty easily extend it for others, such as: plugin related sidecars or pod resources and even for backstage and postgre images as well.
This way our disconnected env related instruction would be as easy as:
- mirror images locally with oc-mirror oe skopeo etc. (we can consider some tool for forming list of images based on catalog, default-config manifests as well)
- create mirror configMap before start operator (or restart it)
This way mirroring will be applied dynamically, on reconciliation with no additional actions.
WDYT?
|
Hey @gazarenkov , You're absolutely right, mirror configuration should be a first-class citizen. I've revised the ADR to adopt your ConfigMap-based approach instead of extending spec.relatedImages. Here's what changed: The operator already does runtime mirror resolution for plugin packages via the The flow works like this: Users create the ConfigMap once with all their registry mappings (plugins + containers). The operator loads it at startup, then during each Backstage reconciliation, it applies those mirror mappings to both plugin OCI packages (already working) and container image references in Deployments/StatefulSets (new). The pods end up with already-resolved registry paths, no IDMS/ITMS needed. This keeps everything dynamic (ConfigMap changes apply on next reconciliation), works everywhere the operator runs (including Rosa HCP where IDMS/ITMS are blocked), and solves the optional feature problem users only mirror what they actually enable. cc: @rm3l |
Rename from "container-image-inventory" to "mirror-resolution" to reflect the actual decision: runtime mirror resolution via ConfigMap, not static inventory listing in CSV spec.relatedImages. Major changes based on team feedback: Decision: - Switch from spec.relatedImages to ConfigMap-based runtime resolution - Extend existing plugin mirror mechanism to container images - Manual-first documentation with scripts as optional automation Technical approach: - Apply mirror mappings during reconciliation (addToModel phase) - Reuse existing plugin-registry-mirror ConfigMap - One ConfigMap for plugins + containers Documentation deliverables: - Flip all air-gap docs from script-first to manual-first - Add Orchestrator air-gap for vanilla Kubernetes - Show transparent yq/skopeo commands, then link to scripts Rationale: - No CSV maintenance burden - Only mirror what you enable (OKP is 10+ GB, optional) - Works on platforms where IDMS/ITMS blocked (Rosa HCP) - Enterprise-friendly transparent manual steps Addresses feedback: - Gennady: Use ConfigMap-based resolution (like plugins) - Armel: Don't force mirroring of huge optional images Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
404d99f to
44d7821
Compare
|
/agentic_review |
…gMap) Revise based on review feedback from rm3l and gazarenkov: - Adopt spec.relatedImages + RELATED_IMAGE_* env vars as Layer 1 (standard RH operator pattern, enables oc-mirror + Conforma) - Retain ConfigMap mirror resolution as Layer 2 (runtime resolution for Rosa HCP, vanilla K8s) - Both layers are complementary, not competing - Add glossary for readers unfamiliar with OLM/air-gap terminology - Document two resolution paths: standard OpenShift vs ConfigMap - Reference OCPSTRAT-3755 for future optional image classification - Reference RHDHSUPP-417 for oc-mirror customer expectations - Include examples of other RH operators using spec.relatedImages - Fix: remove local file path reference - Fix: correct restart behavior claims (both mechanisms need restarts) - Fix: reword IDMS/ITMS format claim (inspired by, not compatible with) - Fix: remove Orchestrator vanilla K8s scope (OpenShift-only supported) Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
…ainers Align with RHDH Install Cabal decisions (Nov 2, 2026): Decision: - Use spec.relatedImages + RELATED_IMAGE_* env vars only - Drop ConfigMap mirror resolution for container images (reinvents IDMS, unnecessary given env var overrides work on all platforms including Rosa HCP and vanilla K8s) - Only 2 images to add: lightspeed-core and okp (RAG init container removed in RHDH 2.1) - OKP included by default despite 10+ GB size (monitor OCPSTRAT-3755 for future optional classification) Platform workflows: - OpenShift: oc-mirror + IDMS (standard) - Rosa HCP: oc-mirror + Subscription/ClusterExtension env var override - Vanilla K8s: extract from spec.relatedImages, mirror with own tooling, set RELATED_IMAGE_* env vars Script deprecation: - prepare-restricted-environment.sh deprecated in 2.2 - Removed from docs and repo in 2.3 - Optionally migrated to rhdh-core for internal E2E Orchestrator: - Leave current docs as-is - Plugin ConfigMap resolution is dev preview in 2.1 - OSL operator images are OSL's responsibility Downstream: - sync-midstream.sh needs staleness checks for 2 new entries - E2E tests need updates Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
- Clarify that OLM does not rewrite RELATED_IMAGE_* env vars; images are pulled transparently via IDMS/ITMS on the nodes - Show extracting the CSV from the bundle image before reading spec.relatedImages, drop `yq eval`, and keep related image names so users can map them to RELATED_IMAGE_* env vars - Acknowledge that excluding a single relatedImage via ImageSetConfiguration is not possible today; depends on OCPSTRAT-3755 - Note that prepare-restricted-environment.sh already sources images from spec.relatedImages and RELATED_IMAGE_* env vars, so no script change is needed - Reword the script deprecation claim to avoid overstating evidence Signed-off-by: Fortune-Ndlovu <fndlovu@redhat.com>
Rewrites the disconnected-install ADR so it covers every image the
operator can inject, not just RHDH and PostgreSQL.
- Renumber from 009 to 011 (009 and 010 are taken upstream).
- List all operator-deployable images in spec.relatedImages and give
each a RELATED_IMAGE_* env var: backstage, postgresql, lightspeed-core,
okp, sonataflow psql (reuses postgresql), ubi10-minimal, tekton git,
and plugin-installer.
- Define a generic {{ relatedImage "name" "fallback" }} template helper
so flavours and plugin-deps resolve images at render time. Rejected
post-render substitution because Tekton Task steps are not pod specs.
- Add plugin-installer now (inert until OPERATOR_DP_PROCESSING=true)
and document that oc-mirror cannot skip optional images until
OCPSTRAT-3755.
- Correct the OLM v1 override path: ClusterExtension.spec.config is a
bundle-schema-validated inline object, not config.env; RHDH exposes
no schema for RELATED_IMAGE_* today, so this is a tracked gap.
- Document downstream work (replaceUpstreamImages.sh, sync-midstream.sh),
Conforma/trusted-registry risks, contributor docs, and the script
lifecycle without a hard removal date.
- Address rm3l's review threads and remove the "as Armel noted" text.
|
/agentic_review |
- Refresh Lightspeed to 0.7.3 and OKP to 1.3.0-1793303796 to match rhdh-operator main/release-2.1 and rhdh-chart; replace the stale drift claim with the current sync state. - Replace the sha256 placeholder with the real Tekton git digest and pin ubi10-minimal to a tag instead of a bare reference. - Clarify that plugin-installer is runtime-inert but not mirroring-inert, since oc-mirror copies every relatedImages entry. - Scope the contract and CI guard to config/profile/rhdh/** and mark the bare config/profile/backstage.io profile as out of scope. - Note that downstream scripts live in the internal dist-git repo, not the public redhat-developer/rhdh GitHub repo. - Reject untagged related images in the CI guard. - Use the repo's "# ADR:" title convention.
- Renumber from 011 to 015 to avoid collision with open PR redhat-developer#15 - Make relatedImage FuncMap registration and env-var fallback explicit - Extend CI guard to Tekton defaults and Go-injected images - Correct Tekton trigger, release-2.1 pin, Helm path, and OLM v1 guidance
gazarenkov
left a comment
There was a problem hiding this comment.
I see it as a (obvious :) ) workaround to improve experience with OLM before new operator processing come to GA and we can benefit dynamic mechanism consistent with RHDH as a platform for dynamic plugins.
Every container image the operator can inject into a workload it creates must be listed in the CSV's
spec.relatedImagesand must be overridable through a matchingRELATED_IMAGE_*environment variable.This is the standard Red Hat operator pattern. It generalizes the existing
backstage/postgresqlsubstitution to every operator-chosen image.Images covered
backstageRELATED_IMAGE_backstage(existing)postgresqlRELATED_IMAGE_postgresql(existing)lightspeed-coreenabledByDefault: true)RELATED_IMAGE_lightspeed_coreokpintelligent-assistant-okpadd-on (opt-in)RELATED_IMAGE_okporchestrator(opt-in)RELATED_IMAGE_postgresqlubi10-minimalorchestrator(opt-in)RELATED_IMAGE_ubi_minimalorchestrator(opt-in)RELATED_IMAGE_tekton_gitplugin-installerOPERATOR_DP_PROCESSING=true(dev preview; GA gate)RELATED_IMAGE_plugin_installerFeature: https://redhat.atlassian.net/browse/RHDHPLAN-1887