Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
a0c26cc
feat(airgap): add ImageSetConfiguration for disconnected mirroring
butler54 Jul 21, 2026
89297a6
fix(airgap): use fast-4.21 channel (4.21.24 not in stable yet)
butler54 Jul 21, 2026
e4281f5
fix(airgap): ACM default channel, kyverno as additionalImages
butler54 Jul 21, 2026
c59eae0
feat(20a-01): add VP Helm OCI charts + missing images to ImageSetConf…
butler54 Jul 22, 2026
182028d
feat(airgap): configure disconnected deployment values
butler54 Jul 22, 2026
ef8cec0
feat(airgap): add bootstrap secrets for SSH key injection
butler54 Jul 22, 2026
b5522d2
fix(airgap): use SCP-style SSH URL format for patterns-operator
butler54 Jul 22, 2026
cd605be
fix(airgap): switch to HTTP git transport for patterns-operator
butler54 Jul 22, 2026
0b75b17
feat(airgap): add community-operators catalog for patterns-operator
butler54 Jul 22, 2026
9e92acc
feat(airgap): add post-install bootstrap script and Makefile targets
butler54 Jul 22, 2026
118dbf4
feat(airgap): add airgap-mirror Makefile target for oc-mirror
butler54 Jul 22, 2026
8679784
fix(airgap): oc-mirror uses XDG_RUNTIME_DIR auth, not CLI flag
butler54 Jul 22, 2026
eac0cf7
fix(airgap): make skopeo optional in post-install bootstrap
butler54 Jul 22, 2026
b91d3f4
fix(airgap): correct patternsOperator catalog source
butler54 Jul 22, 2026
f571717
feat(airgap): comprehensive disconnected deployment overhaul
butler54 Jul 22, 2026
1635f2c
feat(airgap): add ArgoCD Helm OCI registry auth to bootstrap
butler54 Jul 22, 2026
ec30866
fix(airgap): switch from OCI to traditional HTTP Helm repo
butler54 Jul 22, 2026
a3accfd
fix(airgap): restore OCI helmRepoUrl now that Quay repos are public
butler54 Jul 23, 2026
2cb34ac
docs(airgap): add comprehensive disconnected deployment guide
butler54 Jul 23, 2026
8ddc3aa
fix(airgap): move singleArgoCD to global scope
butler54 Jul 23, 2026
f7c9169
fix(airgap): add Vault UBI image to mirroring config
butler54 Jul 23, 2026
1d1a6c6
feat: add argocd-login Makefile target
butler54 Jul 23, 2026
9ebf235
feat: add argocd-install target to extract CLI from cluster
butler54 Jul 23, 2026
5507bb0
fix: show errors in argocd-install instead of hiding them
butler54 Jul 23, 2026
1d75e79
fix: use component=server label for ArgoCD deployment lookup
butler54 Jul 23, 2026
4f0b665
fix: drop --grpc-web from argocd login
butler54 Jul 23, 2026
ae3c8a5
fix: use argocd --core mode (bypasses route/gRPC issues)
butler54 Jul 23, 2026
6f6fd86
fix: argocd login --core takes no --namespace flag
butler54 Jul 23, 2026
53eba66
fix: set kubectl context namespace to ArgoCD ns for --core mode
butler54 Jul 23, 2026
ba28219
fix(airgap): move kyverno chart to validatedpatterns OCI path
butler54 Jul 23, 2026
0eb67b0
fix(airgap): move intel-device-plugins to certified catalog section
butler54 Jul 23, 2026
42652c7
feat(20c-01): replace PCCS/QGS with DCAP operator CR (D-02, D-03, D-04)
butler54 Jul 23, 2026
b7343ce
feat(20c-01): add DCAP operator subscription and imageset-config entr…
butler54 Jul 23, 2026
ab0331a
feat(20c-03): add collect-dcap-collateral.sh and Makefile targets (D-…
butler54 Jul 23, 2026
e329c6a
feat(20c-03): add tdxCollateral to vault template and trustee overrid…
butler54 Jul 23, 2026
571de86
fix(20c): nodeSelector must be array of strings, not map
butler54 Jul 23, 2026
43a05cb
fix(trustee): target bare repo git branch instead of OCI chart
butler54 Jul 23, 2026
5e94cec
fix(trustee): add path: . for git-based chart source
butler54 Jul 23, 2026
0ad4997
feat(airgap): add fix-patterns-operator-images.sh for Quay OCI-only mode
butler54 Jul 24, 2026
f5cfd5d
feat(airgap): add rebuild-patterns-operator-bundle.sh
butler54 Jul 24, 2026
ab79508
feat(airgap): add deploy-pattern-without-operator.sh
butler54 Jul 24, 2026
794a68c
fix(airgap): add global.multiSourceRepoUrl for child app chart resolu…
butler54 Jul 24, 2026
38713fe
fix(eso): use internal vault service URL for ClusterSecretStore
butler54 Jul 25, 2026
5b021d2
fix(eso): add NetworkPolicy for vault port 8200 egress
butler54 Jul 25, 2026
fd5ef85
fix(eso): use vault route URL with apps prefix
butler54 Jul 25, 2026
26461c5
fix: stop stripping apps. prefix from hubClusterDomain
butler54 Jul 25, 2026
dc99a7f
fix: align collect-dcap-collateral.sh with pcsclient.py CLI
butler54 Jul 25, 2026
4cdd5bb
feat: embed kyverno chart v3.7.2 into pattern repo
Jul 25, 2026
0767de6
Merge remote-tracking branch 'jumphost/dev/airgap-testing' into dev/a…
butler54 Jul 25, 2026
3476100
fix(kyverno): set image registry to Quay mirror for airgap
Jul 25, 2026
4804f5d
fix(kyverno): correct image registry path (remove extra nesting)
Jul 25, 2026
716cd26
fix(kyverno): set image registry in chart values.yaml
Jul 25, 2026
c2a5d01
Merge remote-tracking branch 'jumphost/dev/airgap-testing' into dev/a…
butler54 Jul 25, 2026
c802167
fix(airgap): parameterize workload images and point to Quay mirror
butler54 Jul 25, 2026
03f80da
feat: inject private registry CA into CoCo initdata
butler54 Jul 25, 2026
8b758f9
fix: rewrite firmware refvals extraction for new veritas format
butler54 Jul 25, 2026
349e29b
fix(acm): override MCE subscription source for mirrored catalog
butler54 Jul 25, 2026
ca65589
fix(acm): add multicluster-engine to mirrored catalog
butler54 Jul 25, 2026
c48ce57
fix(sync): add sync-wave 10 to GPU subscription
butler54 Jul 25, 2026
721609a
fix(airgap): workaround VP operator hybrid manifest format
butler54 Jul 26, 2026
17ad116
fix(airgap): remove non-existent OSC :latest tag refs from imageset
butler54 Jul 26, 2026
054269a
fix(airgap): remove Helm OCI auth (causes 401 on public Quay repos)
butler54 Jul 26, 2026
a3da3ab
fix(airgap): add Intel operator images to step 6b mirror workaround
butler54 Jul 26, 2026
79c9121
fix(airgap): disable GPU operator — NVIDIA bundle mirror issue
butler54 Jul 26, 2026
953b0a5
fix(airgap): apply oc-mirror IDMS/ITMS in step 3b
butler54 Jul 26, 2026
177a440
fix(airgap): add all signature-failed images to step 6b fixup list
butler54 Jul 26, 2026
72791a6
fix(intel-dcap): add privileged SCC for QGS DaemonSet
butler54 Jul 26, 2026
da7d9ac
fix(intel-dcap): grant SCC to intel-tdx-dcap SA, not default
butler54 Jul 26, 2026
c72d2b3
feat: add pck-register Makefile target for Intel PCK cert registration
butler54 Jul 26, 2026
8711704
fix(sync): move ALL subscriptions to wave 10
butler54 Jul 26, 2026
2d2e272
fix(sync): keep ESO + LVM at wave 0 — vault depends on them
butler54 Jul 26, 2026
ae40b9f
fix(sync): keep CNV at wave 0 — provides hostpath provisioner for vau…
butler54 Jul 26, 2026
3d72cb0
fix(sync): increase vault hook deadline to 1800s (30 min)
butler54 Jul 26, 2026
d04b032
fix: remove serviceAccountName override that duplicates admin SA
butler54 Jul 26, 2026
bb6fc94
fix: grant imperative-sa full admin via clusterRoleYaml override
butler54 Jul 26, 2026
be44ef9
fix(airgap): add community-operator-pipeline-prod to ITMS
butler54 Jul 26, 2026
f5f1bcc
refactor(airgap): split VP hybrid images to mirror-registry, certifie…
butler54 Jul 26, 2026
f29927b
fix(kbs-access-curl): run init and main containers as privileged
butler54 Jul 27, 2026
7d21daf
fix(kbs-access-curl): write to /tmp then cp to shared volume
butler54 Jul 27, 2026
9121817
fix(kbs-access-curl): mount emptyDir at /tmp/shared for kata-cc compa…
butler54 Jul 27, 2026
60cd464
fix(kbs-access-curl): dedicated SA with privileged SCC for kata-cc em…
butler54 Jul 27, 2026
1420b3a
feat: AMD SEV-SNP VCEK offline provisioning scripts
butler54 Jul 28, 2026
c9ba33c
feat: install Intel DCAP operator in intel-dcap-operator-system names…
butler54 Jul 28, 2026
5eb6ff4
feat(23-01): add offline verify harness and DER fixture generator
butler54 Aug 6, 2026
e0bcd37
feat(23-01): add live APAC-lab verify harness
butler54 Aug 6, 2026
ab6001f
feat(24-02): D-05 catalogSource migration — 2-line global overlay, im…
butler54 Aug 10, 2026
137553b
feat(24-02): update DEL-1 checks for 2-line global overlay (D-05/D-04)
butler54 Aug 10, 2026
c56b469
feat(24-03): D-01 quarantine 3 hack scripts to scripts/deprecated/ (g…
butler54 Aug 10, 2026
abb96fe
fix(24.1): add base64: true to vcek.der field in SNP generator
butler54 Aug 10, 2026
cf61579
feat(airgap): add imageset-config-4.22.yaml, rename to minor-version …
butler54 Aug 10, 2026
67711ff
feat(25.2): pivot to mirror-registry as sole oc-mirror target
butler54 Aug 10, 2026
f81e38c
fix: update catalogSource to v4-22 (oc-mirror generates v4.22 now)
Aug 11, 2026
49c773d
fix: update all CatalogSource references from v4-21 to v4-22
Aug 11, 2026
892b459
refactor: use clustergroup 0.9.58 global.catalogSource default
Aug 11, 2026
881416c
fix(airgap): multiSourceRepoUrl → mirror-registry, not Quay
Aug 11, 2026
e6ffe95
revert: multiSourceRepoUrl stays Quay — VP OCI charts not in mirror-r…
Aug 11, 2026
ff7f88f
fix(airgap): mirror-registry as chart source; oc-mirror-driven Catalo…
Aug 11, 2026
9118da1
fix(airgap): kyverno image registry — mirror-registry not Quay
Aug 11, 2026
08a59c0
fix(airgap): pin kyverno image tags to v1.13.4 (mirrored version)
Aug 11, 2026
358dc6e
fix(airgap): correct kyverno image tag paths for v1.13.4 pin
Aug 11, 2026
20a78df
fix(airgap): workload image refs — mirror-registry not Quay, latest n…
Aug 11, 2026
7ef2ed6
fix(airgap): kyverno v1.17.2 mirrored — remove tag pin, keep registry…
Aug 11, 2026
a9abe57
fix(airgap): update mirror config gaps found in Phase 25 deploy run
Aug 11, 2026
902a6c5
fix(airgap): add NFD operand image to additionalImages (tag preservat…
Aug 11, 2026
8c41a7d
fix(airgap): helmRepoUrl → mirror-registry (VP OCI charts in mirror-r…
butler54 Aug 11, 2026
9972115
fix(airgap): apply ALL oc-mirror cluster-resources (IDMS, ITMS, Catal…
butler54 Aug 11, 2026
251ba60
fix(airgap): NeverContactSource on IDMS — prevent internet fallback o…
butler54 Aug 11, 2026
ed8c8be
fix(airgap): remove community-operator-pipeline-prod from manual ITMS
butler54 Aug 12, 2026
3020d01
fix(storage): switch storageProvider from hpp to lvm
butler54 Aug 12, 2026
59b5707
fix(airgap): (( applied++ )) exits under set -e when applied=0
butler54 Aug 12, 2026
11ae716
fix(airgap): add kyverno-cli and ensure vault to imageset-config
butler54 Aug 12, 2026
80c0628
feat: load-bootstrap pre-creates target namespaces
butler54 Aug 12, 2026
0c19f32
fix: load-bootstrap reads correct values-secret file (pattern-specific)
butler54 Aug 12, 2026
f0f6b42
fix: normalise NeverContactSource on all IDMS/ITMS in airgap-post-ins…
butler54 Aug 12, 2026
87967d3
fix(baremetal): set QGS socket_port=0 via MachineConfig drop-in
butler54 Aug 12, 2026
615f379
fix(dcap): use -p E5 and apply jq QeIdentity fixup in collect-dcap-co…
butler54 Aug 12, 2026
ab35fe8
fix(dcap): add qveidentity variants to jq fixup and fix verification
butler54 Aug 12, 2026
b788afd
fix(dcap): delete raw file before fetch to avoid interactive overwrit…
butler54 Aug 12, 2026
df8265e
fix(airgap): pin workload images to mirror registry digests
butler54 Aug 12, 2026
c3e4009
fix(bootstrap): patch ArgoCD labels after load_bootstrap_secrets
butler54 Aug 12, 2026
74f587a
Revert "fix(bootstrap): patch ArgoCD labels after load_bootstrap_secr…
butler54 Aug 12, 2026
963990c
fix: use printf not echo when writing mirror-registry-password file
butler54 Aug 13, 2026
c67a7a1
fix(coco): use Recreate strategy for all kata confidential deployments
butler54 Aug 13, 2026
6fe0b73
fix: cache-registry-ca must use mirror-registry CA not quay-ca-chain
butler54 Aug 13, 2026
0d3eedb
cleanup: remove dead PCCS code and quay.apac-tech-lab verify refs
butler54 Aug 13, 2026
b186b8a
docs(airgap): add permanent deploy runbook with Phase 0 pre-requisites
butler54 Aug 13, 2026
80b0436
feat(26): add CNV guest image additionalImages to imageset-config-4.2…
butler54 Aug 13, 2026
931deb6
fix(airgap): add :latest tags to CNV guest images in imageset-config
butler54 Aug 13, 2026
6a0f429
feat(26): add kubevirtconfidential chart — HyperConverged CR + SELinu…
butler54 Aug 13, 2026
d7cfb80
feat(26): add compile-selinux-policy Makefile target
butler54 Aug 13, 2026
c3f0912
feat(26): add kubevirtconfidential ArgoCD Application to values-barem…
butler54 Aug 13, 2026
ca04980
feat(26): embed compiled kubevirt-qgs SELinux policy .pp
butler54 Aug 13, 2026
3ccb4f8
fix(26): enable kubevirtconfidential chart (global.kubevirt.confident…
butler54 Aug 13, 2026
61f23b1
fix(26): switch SELinux policy to CIL format (RHCOS lacks pp HLL conv…
butler54 Aug 13, 2026
56aa536
fix(26): compile SELinux .te → CIL on node via oneshot service
butler54 Aug 13, 2026
7055468
feat(26): enable DataImportCron — guest images present in mirror regi…
butler54 Aug 13, 2026
8984a2b
feat(26): raise node maxPods to 500 via KubeletConfig
butler54 Aug 13, 2026
210e858
feat(26): PostSync Job to create rhel9-guest ImageStream for DataImpo…
butler54 Aug 13, 2026
65f1602
fix(storage): set volumeBindingMode=Immediate on LVMCluster for SNO
butler54 Aug 13, 2026
01cbe70
fix(storage): volumeBindingMode under storageClassOptions (correct LV…
butler54 Aug 13, 2026
98969c5
feat(storage): PostSync Job to set lvms-vg1 as default StorageClass
butler54 Aug 13, 2026
37e597e
feat(27): add kubevirtvm chart — simplest RHEL9 baseline VM
butler54 Aug 13, 2026
ec9e76c
feat(27): wire kubevirtvm ArgoCD Application (wave 35, kubevirt-vms)
butler54 Aug 13, 2026
7d9b7b8
fix(27): remove namespace.yaml from kubevirtvm chart — VP parent mana…
butler54 Aug 13, 2026
814d7ef
feat(28): add rhel9-tdx TDX VM variant to kubevirtvm chart
butler54 Aug 13, 2026
933883f
feat(28): enable TDX VM variant in values-baremetal.yaml
butler54 Aug 13, 2026
cdb8978
fix(28): fix HCO jsonpatch — create developerConfiguration object not…
butler54 Aug 14, 2026
3282264
fix(28): secureBoot=true + remove smm=false for rhel9-tdx VM
butler54 Aug 14, 2026
639051e
fix(28): jsonpatch — 3-op append for WorkloadEncryptionTDX featureGate
butler54 Aug 14, 2026
81b90cd
revert(28): restore original featureGates append jsonpatch
butler54 Aug 14, 2026
94f65d7
fix(28): enable SMM explicitly for rhel9-tdx — required by SecureBoot…
butler54 Aug 14, 2026
0cb7a24
fix(28): revert smm/secureBoot + add TDX OVMF MachineConfig for no-se…
butler54 Aug 14, 2026
6ff59f8
fix(28): place TDX OVMF descriptor in /usr/share/qemu/firmware/ not /…
butler54 Aug 14, 2026
0dbc4c7
fix(28): overlay /etc/qemu/firmware onto /usr/share/qemu/firmware at …
butler54 Aug 14, 2026
874cd03
fix(28): set ovmfPath=/usr/share/edk2/ovmf via jsonpatch + remove OVM…
butler54 Aug 14, 2026
e56f218
cleanup(29-01): restore upstream URLs in values-global.yaml
butler54 Aug 14, 2026
69e2fd0
cleanup(29-01): remove lab overrides and airgap sources from values-b…
butler54 Aug 14, 2026
17b010e
cleanup(29-01): reset kyverno registry to upstream default, move airg…
butler54 Aug 14, 2026
5f5e385
cleanup(29-01): rename quay artifacts to mirror-registry
butler54 Aug 14, 2026
fafe1e3
docs(29-01): add experimental READMEs for kubevirt charts
butler54 Aug 14, 2026
e98d964
cleanup(29-01): delete deprecated scripts
butler54 Aug 14, 2026
3957496
cleanup(29-01): abstract lab references in airgap docs and configs
butler54 Aug 14, 2026
6cbf507
cleanup(29-01): fix remaining lab IP and quay artifact references fou…
butler54 Aug 14, 2026
8bdb636
feat(29): switch trustee to OCI Helm chart v0.10.0
butler54 Aug 17, 2026
6f4806b
fix: resolve PR lint failures — schema and vendored chart exclusion
butler54 Aug 17, 2026
54742dc
refactor: move vendored kyverno chart to charts/vendor/
butler54 Aug 17, 2026
c2c66f4
fix: add clusterGroup to values-baremetal-airgap for schema validation
butler54 Aug 17, 2026
5d8eadd
fix: exclude airgap overlay from ClusterGroup schema validation
butler54 Aug 17, 2026
473b3a9
fix: restore clusterGroupName to azure (upstream CI default)
butler54 Aug 17, 2026
4ae688f
docs: update README for v8.0 release
butler54 Aug 17, 2026
4325ccc
fix: address PR #105 review comments
butler54 Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/superlinter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ jobs:
VALIDATE_SHELL_SHFMT: false
VALIDATE_YAML: false
VALIDATE_YAML_PRETTIER: false
# Exclude vendored upstream charts from linting
FILTER_REGEX_EXCLUDE: "charts/vendor/.*"
# VALIDATE_DOCKERFILE_HADOLINT: false
# VALIDATE_MARKDOWN: false
# VALIDATE_NATURAL_LANGUAGE: false
Expand Down
177 changes: 177 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,71 @@ cache-keys: ## Download Red Hat signing keys from official sources to ~/.coco-pa
@echo "Done. Verify fingerprints at https://access.redhat.com/security/team/key/"


.PHONY: cache-registry-ca
cache-registry-ca: ## Copy mirror-registry CA cert to ~/.coco-pattern/ for use by load-secrets
@mkdir -p ~/.coco-pattern
@if [ -f ~/.coco-pattern/quay-ca-cert.pem ]; then \
mv ~/.coco-pattern/quay-ca-cert.pem ~/.coco-pattern/mirror-registry-ca-cert.pem; \
echo " Migrated quay-ca-cert.pem -> mirror-registry-ca-cert.pem"; \
fi
@if [ -f ~/mirror-registry-certs/ca.crt ]; then \
cp ~/mirror-registry-certs/ca.crt ~/.coco-pattern/mirror-registry-ca-cert.pem; \
echo " Cached mirror-registry CA at ~/.coco-pattern/mirror-registry-ca-cert.pem"; \
else \
echo "ERROR: ~/mirror-registry-certs/ca.crt not found."; \
echo " Ensure the mirror registry was initialised and its certs are at ~/mirror-registry-certs/"; \
exit 1; \
fi

.PHONY: load-bootstrap
load-bootstrap: ## Load ArgoCD bootstrap secrets (DEL-2) — run after cluster exists but before Vault is up
@echo "Loading ArgoCD OCI Helm registry bootstrap secret..."
@if ! ./pattern.sh ansible-playbook rhvp.cluster_utils.load_bootstrap_secrets --list-tasks >/dev/null 2>&1; then \
echo "ERROR: load_bootstrap_secrets playbook not found in utility container."; \
echo " Bump utility-container tag in imageset-config and re-mirror."; \
exit 1; \
fi
@echo "Pre-creating bootstrap secret target namespaces (avoids race with patterns-operator)..."
@python3 -c "\
import yaml, os, pathlib; \
pattern = yaml.safe_load(open('values-global.yaml'))['global']['pattern']; \
search = [pathlib.Path(p) for p in [ \
os.environ.get('VALUES_SECRET', ''), \
os.path.expanduser(f'~/values-secret-{pattern}.yaml'), \
os.path.expanduser('~/values-secret.yaml'), \
'values-secret.yaml', \
] if p]; \
f = next((p for p in search if p.is_file()), None); \
data = yaml.safe_load(f.read_text()) if f else {}; \
[print(ns) for s in data.get('bootstrap_secrets',[]) for ns in s.get('targetNamespaces',[])] \
" 2>/dev/null | \
sort -u | xargs -I{} sh -c 'oc create namespace {} --dry-run=client -o yaml | oc apply -f - 2>/dev/null; true'
./pattern.sh ansible-playbook rhvp.cluster_utils.load_bootstrap_secrets

.PHONY: gen-mirror-helm-secret
gen-mirror-helm-secret: ## Generate mirror-registry Helm OCI password file from mirror-registry init output
@mkdir -p ~/.coco-pattern
@echo "Enter the mirror-registry password (from ~/mirror-registry-init.txt or ~/mirror-registry-output/init.json):"
@read -r MRPASS; printf '%s' "$$MRPASS" > ~/.coco-pattern/mirror-registry-password; chmod 600 ~/.coco-pattern/mirror-registry-password
@echo " Saved to ~/.coco-pattern/mirror-registry-password"

.PHONY: pck-register
pck-register: ## Register PCK certificates with Intel PCS (requires INTEL_PCS_API_KEY)
@if [ -z "$(INTEL_PCS_API_KEY)" ]; then \
echo "ERROR: Set INTEL_PCS_API_KEY environment variable"; \
echo " Usage: make pck-register INTEL_PCS_API_KEY=<key>"; \
exit 1; \
fi
@PCS_TOOL="$(HOME)/confidential-computing.tee.dcap/tools/PcsClientTool/pcsclient.py"; \
if [ ! -f "$$PCS_TOOL" ]; then \
echo "ERROR: PCS Client Tool not found at $$PCS_TOOL"; \
echo " Clone: git clone https://github.com/intel/confidential-computing.tee.dcap ~/confidential-computing.tee.dcap"; \
exit 1; \
fi; \
cd "$$(dirname $$PCS_TOOL)" && python3 pcsclient.py -t register -k "$(INTEL_PCS_API_KEY)"

##@ Reference Value Collection

.PHONY: collect-firmware-refvals
collect-firmware-refvals: ## Collect firmware reference values (bare metal, default)
@scripts/collect-firmware-refvals.sh
Expand All @@ -26,6 +90,106 @@ collect-firmware-refvals: ## Collect firmware reference values (bare metal, defa
collect-azure-refvals: ## Collect PCR reference values (Azure)
@scripts/collect-firmware-refvals.sh --platform azure

.PHONY: collect-dcap-collateral
collect-dcap-collateral: ## Collect TDX DCAP collateral from Intel PCS (API key via OS keyring)
@scripts/collect-dcap-collateral.sh

.PHONY: dcap-offline-provision
dcap-offline-provision: ## Full DCAP offline provisioning workflow (collect collateral + load secrets)
$(MAKE) collect-dcap-collateral
$(MAKE) load-secrets

##@ AMD SEV-SNP VCEK Provisioning

.PHONY: snp-collect-vcek-urls
snp-collect-vcek-urls: ## Collect VCEK URLs from AMD SNP nodes (requires KUBECONFIG)
@scripts/collect-snp-vcek-urls.sh

.PHONY: snp-download-vcek
snp-download-vcek: ## Download VCEK certs from AMD KDS (requires internet)
@scripts/download-snp-vcek.sh

.PHONY: snp-gen-overrides
snp-gen-overrides: ## Generate SNP VCEK values override from cached certs (local only)
@scripts/gen-snp-vcek-overrides.sh

.PHONY: snp-offline-provision
snp-offline-provision: snp-collect-vcek-urls snp-download-vcek snp-gen-overrides ## Full SNP VCEK offline provisioning

##@ Disconnected Deployment
MIRROR_REGISTRY ?= quay.example.com:443/mirror
IMAGESET_CONFIG ?= airgap/imageset-config.yaml
OC_MIRROR_WORKSPACE ?= file://$(HOME)/oc-mirror-workspace

.PHONY: airgap-mirror
airgap-mirror: ## Mirror content to disconnected registry (requires MIRROR_REGISTRY)
oc-mirror -c $(IMAGESET_CONFIG) \
--workspace $(OC_MIRROR_WORKSPACE) \
--dest-tls-verify=false \
docker://$(MIRROR_REGISTRY) --v2

.PHONY: airgap-post-install
airgap-post-install: ## Post-install bootstrap (after airgap-mirror + labctl apply-mirror-resources)
@scripts/airgap-post-install.sh

.PHONY: airgap-deploy-pattern
airgap-deploy-pattern: ## Deploy Pattern CR directly (skip pattern.sh, use values-global.yaml config)
@scripts/airgap-post-install.sh --deploy-pattern

.PHONY: airgap-fix-manifests
airgap-fix-manifests: ## Fix oc-mirror manifest list failures with fallback mirroring
@scripts/airgap-post-install.sh --fix-manifest-lists

.PHONY: airgap-sync-repos
airgap-sync-repos: ## Push working copy changes to bare HTTP repos and restart git server
@scripts/airgap-post-install.sh --sync-repos-only

ARGOCD_CLI_DIR ?= $(HOME)/.local/bin

.PHONY: argocd-install
argocd-install: ## Download argocd CLI from the cluster's ArgoCD image into ~/.local/bin
@mkdir -p $(ARGOCD_CLI_DIR)
@ARGOCD_NS=$$(oc get argocd -A -o jsonpath='{.items[0].metadata.namespace}') || \
{ echo "ERROR: No ArgoCD instance found. Is KUBECONFIG set and the pattern deployed?"; exit 1; }; \
ARGOCD_IMG=$$(oc get deployment -n $$ARGOCD_NS -l app.kubernetes.io/component=server,app.kubernetes.io/part-of=argocd \
-o jsonpath='{.items[0].spec.template.spec.containers[0].image}') || \
{ echo "ERROR: Could not find ArgoCD server deployment in $$ARGOCD_NS"; exit 1; }; \
echo "Extracting argocd CLI from $$ARGOCD_IMG ..."; \
POD_NAME="argocd-cli-extract-$$$$"; \
oc run "$$POD_NAME" -n $$ARGOCD_NS --image="$$ARGOCD_IMG" \
--restart=Never --command -- sleep 300; \
echo "Waiting for extract pod..."; \
oc wait --for=condition=Ready pod/"$$POD_NAME" -n $$ARGOCD_NS --timeout=120s; \
oc cp "$$ARGOCD_NS/$$POD_NAME:/usr/local/bin/argocd" "$(ARGOCD_CLI_DIR)/argocd"; \
chmod +x "$(ARGOCD_CLI_DIR)/argocd"; \
oc delete pod "$$POD_NAME" -n $$ARGOCD_NS --force --grace-period=0 2>/dev/null; \
echo "Installed: $(ARGOCD_CLI_DIR)/argocd"; \
$(ARGOCD_CLI_DIR)/argocd version --client | head -1

.PHONY: argocd-login
argocd-login: ## Extract ArgoCD credentials from cluster and log in with argocd CLI
@ARGOCD_NS=$$(oc get argocd -A -o jsonpath='{.items[0].metadata.namespace}' 2>/dev/null) && \
ARGOCD_NAME=$$(oc get argocd -n $$ARGOCD_NS -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) && \
ARGOCD_ROUTE=$$(oc get route $${ARGOCD_NAME}-server -n $$ARGOCD_NS -o jsonpath='{.spec.host}' 2>/dev/null) && \
ARGOCD_PASS=$$(oc get secret $${ARGOCD_NAME}-cluster -n $$ARGOCD_NS -o jsonpath='{.data.admin\.password}' 2>/dev/null | base64 -d) && \
echo "ArgoCD URL: https://$$ARGOCD_ROUTE" && \
echo "Username: admin" && \
echo "Password: $$ARGOCD_PASS" && \
echo "" && \
if command -v argocd >/dev/null 2>&1; then \
oc config set-context --current --namespace=$$ARGOCD_NS && \
argocd login --core && \
echo "" && \
echo "Logged in (core mode, namespace $$ARGOCD_NS)." && \
echo "Usage: argocd app list"; \
else \
echo "argocd CLI not installed. To install:" && \
echo " curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64" && \
echo " chmod +x /usr/local/bin/argocd" && \
echo "" && \
echo "Or use the web UI at: https://$$ARGOCD_ROUTE"; \
fi

##@ Hardware Detection
.PHONY: detect-hardware
detect-hardware: ## Detect hardware profile from cluster nodes (requires KUBECONFIG or oc login)
Expand Down Expand Up @@ -59,3 +223,16 @@ detect-hardware: ## Detect hardware profile from cluster nodes (requires KUBECON
fi && \
echo "" && \
echo "To apply: edit values-global.yaml and set global.hardware.profile to the recommended value."

##@ Chart Management
KYVERNO_VERSION ?= 3.7.2
KYVERNO_REPO ?= https://kyverno.github.io/kyverno/

.PHONY: update-kyverno-chart
update-kyverno-chart: ## Pull and embed upstream Kyverno Helm chart (requires internet)
@echo "Pulling kyverno chart v$(KYVERNO_VERSION)..."
@rm -rf charts/vendor/kyverno
@helm pull kyverno --repo $(KYVERNO_REPO) --version $(KYVERNO_VERSION) --untar -d charts/vendor/
@find charts/vendor/kyverno -name "README.md" -o -name "README.md.gotmpl" | xargs rm -f
@echo "Embedded charts/vendor/kyverno (v$(KYVERNO_VERSION))"
@echo "Next: commit, push, and sync ArgoCD"
54 changes: 35 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,40 +26,59 @@ The topology is controlled by the `main.clusterGroupName` field in `values-globa

Azure deployments use peer-pods, which provision confidential VMs (`Standard_DCas_v5` family) directly on the Azure hypervisor. Bare metal deployments use layered images and hardware TEE features directly.

## Current version (5.*)
## Current version (8.*)

Breaking change from v4. Uses GA releases of the CoCo stack with Kyverno-based initdata injection.
Breaking change from v5. Upgrades to OSC 1.13 / Trustee 1.2, adds full airgap (disconnected) deployment support, and introduces experimental KubeVirt TDX VM workloads.

- **5.0** — Kyverno-based `cc_init_data` injection (replaces MutatingAdmissionPolicy), OSC 1.12 / Trustee 1.1 GA, external chart repositories, self-signed certificates via cert-manager, multi-cluster support via ACM. Requires OCP 4.19.28+.
- **5.1** — Bare metal support for Intel TDX and AMD SEV-SNP via NFD auto-detection. Currently tested on SNO (Single Node OpenShift) configurations only.
- **5.2** — NVIDIA H100 confidential GPU support for bare metal (`baremetal-gpu` clusterGroup). Adds GPU Operator, IOMMU configuration, CC Manager, and sample CUDA workload.
- **5.3** — DRY refactor of trustee and kyverno overrides, Kyverno CRD label fix, pattern infrastructure update.
- **5.4** — Firmware reference values workflow for bare metal attestation via veritas. Adds `collect-firmware-refvals.sh`, RVPS integration, and hardened attestation policy (trustee-chart v0.5.0).
- **5.5** — Trustee-chart v0.7.0 (td_attributes.debug path fix). Unified reference value collection for Azure and bare metal via veritas container.
- **5.6** — Documentation update, sandboxed-policies v0.2.0 (Azure-conditional peer-pods).
- **8.0** — OSC 1.13 / Trustee 1.2 upgrade. KBS TOML rewrite, RVPS format alignment, operator CSV pins, trustee-chart v0.10.0. Airgap deployment support: single mirror-registry architecture, `oc-mirror` v2, `airgap-post-install.sh` bootstrap, `DEPLOY-RUNBOOK.md` operational guide. Requires OCP 4.22+.

**Key changes from v5:**
- **Operator upgrade:** OSC 1.12 → 1.13, Trustee 1.1 → 1.2. Breaking API changes in KBS configuration and RVPS reference value format.
- **Airgap support:** Full disconnected deployment on bare metal via a single mirror-registry. Includes `oc-mirror` imageset configs, `airgap-post-install.sh` for bootstrap (CatalogSources, IDMS/ITMS, NeverContactSource policy normalisation, ArgoCD CA injection, git HTTP server), and a step-by-step operational runbook at `airgap/DEPLOY-RUNBOOK.md`.
- **Chart architecture:** trustee-chart moved to OCI Helm artifact (`quay.io/validatedpatterns/trustee:0.10.0`). Kyverno chart vendored under `charts/vendor/`. External charts (sandboxed-containers, sandboxed-policies) remain OCI.
- **TDX MachineConfig:** QGS socket port `socket_port=0` now deployed via MachineConfig drop-in (replaces manual `sed` workaround).
- **DCAP collateral:** `collect-dcap-collateral.sh` uses `pcsclient.py fetch -p E5` with `jq` fixup for QeIdentity (Red Hat OSC 1.13 disconnected TDX procedure).
- **Experimental:** KubeVirt TDX confidential VMs (`charts/all/kubevirtconfidential/`, `charts/all/kubevirtvm/`). Disabled by default. Requires Intel TDX hardware and KubeVirt post-v1.8.4 for full QGS attestation. See chart READMEs for details.

### Previous versions

| Version | Trustee | OSC | Min OCP | Notes |
|---------|---------|-----|---------|-------|
| **5.*** | 1.1 (GA) | 1.12 | 4.19.28+ | Kyverno initdata injection, multi-cluster, bare metal, GPU |
| **4.*** | 1.1 (GA) | 1.12 | 4.19.28+ | First GA release; MutatingAdmissionPolicy-based initdata |
| **3.*** | 0.4.* (Tech Preview) | 1.10.* | 4.16+ | |
| **2.*** | 0.3.* (Tech Preview) | 1.9.* | 4.16+ | |
| **1.0.0** | 0.2.0 (Tech Preview) | 1.8.1 | 4.16+ | |

### Airgap (disconnected) deployment

For air-gapped bare metal environments, see [`airgap/DEPLOY-RUNBOOK.md`](airgap/DEPLOY-RUNBOOK.md) for the full operational procedure. The runbook covers:
- Phase 0: One-time jump host setup (mirror registry, git HTTP server, CA certificates)
- Phase A–B: Mirror wipe and `oc-mirror` v2 re-mirror
- Phase C: Agent-based OCP install
- Phase D: Pattern bootstrap (`airgap-post-install.sh`)
- Phase E: Intel DCAP collateral and TDX attestation
- Phase F: Verification and pass/fail checklist

**Prerequisites for airgap:**
- A jump host with internet access (for `oc-mirror`) and network access to the target cluster
- `docker.io/library/registry:2` container running as the mirror registry (setup documented in Phase 0)
- `scripts/git-http-server.py` serving pattern repos over smart HTTP (required by the patterns-operator's go-git client)
- All operator images, OCI Helm charts, and workload images mirrored via `airgap/imageset-config-4.22.yaml`

## Setup

### Prerequisites

**Azure deployments:**

- OpenShift 4.19.28+ cluster on Azure (self-managed via `openshift-install` or ARO)
- OpenShift 4.22+ cluster on Azure (self-managed via `openshift-install` or ARO)
- Azure `Standard_DCas_v5` VM quota in your target region (these are confidential computing VMs and are not available in all regions). See the note below for more details.
- Azure DNS hosting the cluster's DNS zone

**Bare metal deployments:**

- OpenShift 4.19.28+ cluster on bare metal with Intel TDX or AMD SEV-SNP hardware
- OpenShift 4.22+ cluster on bare metal with Intel TDX or AMD SEV-SNP hardware
- BIOS/firmware configured to enable TDX or SEV-SNP
- Available block devices for LVMS storage (auto-discovered)
- For Intel TDX: an Intel PCS API key from [api.portal.trustedservices.intel.com](https://api.portal.trustedservices.intel.com/)
Expand All @@ -74,12 +93,12 @@ Breaking change from v4. Uses GA releases of the CoCo stack with Kyverno-based i

These scripts generate the cryptographic material and attestation reference values needed by Trustee. Run them once before your first deployment.

1. `bash scripts/gen-secrets.sh` — generates KBS key pairs, PCCS certificates/tokens (for bare metal), and copies `values-secret.yaml.template` to `~/values-secret-coco-pattern.yaml`
1. `bash scripts/gen-secrets.sh` — generates KBS key pairs, sealed-secrets signing keys, and copies `values-secret.yaml.template` to `~/values-secret-coco-pattern.yaml`
2. Collect attestation reference values (requires `podman`, `yq`, `jq`, and `~/pull-secret.json`):
- **Azure:** `make collect-azure-refvals` — pulls PCR measurements from the dm-verity image via veritas. Saves to `~/.coco-pattern/measurements.json`.
- **Bare metal:** `make collect-firmware-refvals` — computes firmware measurements from OCP release artifacts via veritas. Saves to `~/.coco-pattern/firmware-reference-values.json`. For bare metal, also uncomment the `firmwareReferenceValues` section in `~/values-secret-coco-pattern.yaml`.
- See [docs/firmware-reference-values.md](docs/firmware-reference-values.md) for detailed workflow and options.
3. Review and customise `~/values-secret-coco-pattern.yaml` — this file is loaded into Vault and provides secrets to the pattern. For bare metal, uncomment the PCCS secrets section and provide your Intel PCS API key.
3. Review and customise `~/values-secret-coco-pattern.yaml` — this file is loaded into Vault and provides secrets to the pattern.

> **Note:** `gen-secrets.sh` will not overwrite existing secrets. Delete `~/.coco-pattern/` if you need to regenerate.

Expand All @@ -95,7 +114,7 @@ These scripts generate the cryptographic material and attestation reference valu
1. Set `main.clusterGroupName: trusted-hub` in `values-global.yaml`
2. Deploy the hub cluster: `./pattern.sh make install`
3. Wait for ACM (`MultiClusterHub`) to reach `Running` state on the hub
4. Provision a second OpenShift 4.19.28+ cluster on Azure for the spoke
4. Provision a second OpenShift 4.22+ cluster on Azure for the spoke
5. Import the spoke into ACM with label `clusterGroup=azure-spoke`
(see [importing a cluster](https://validatedpatterns.io/learn/importing-a-cluster/))
6. ACM will automatically deploy the `azure-spoke` clusterGroup applications (sandboxed containers, workloads) to the imported cluster
Expand All @@ -107,8 +126,7 @@ These scripts generate the cryptographic material and attestation reference valu
- Run `make detect-hardware` after NFD is deployed to detect your hardware profile automatically
- Options: `intel-tdx`, `amd-snp`, `intel-tdx-gpu`, `amd-snp-gpu`
3. Run `bash scripts/gen-secrets.sh` to generate KBS keys and PCCS secrets
4. For Intel TDX: uncomment the PCCS secrets in `~/values-secret-coco-pattern.yaml` and provide your Intel PCS API key
5. `./pattern.sh make install`
4. `./pattern.sh make install`
6. Wait for the cluster to reboot nodes (MachineConfig updates for TDX/SEV-SNP kernel parameters and vsock)

> **Note:** Bare metal support is currently tested on SNO (Single Node OpenShift) configurations. Multi-node bare metal clusters are expected to work but have not been validated yet.
Expand All @@ -120,9 +138,7 @@ The system auto-detects your hardware:
- **RuntimeClass** `kata-cc` is created automatically pointing to the correct handler (`kata-tdx` or `kata-snp`)
- Both `kata-tdx` and `kata-snp` RuntimeClasses are deployed; only the one matching your hardware has schedulable nodes
- MachineConfigs are deployed for both `master` and `worker` roles (safe on SNO where only master exists)
- PCCS and QGS services deploy unconditionally; DaemonSets only schedule on Intel nodes via NFD labels

Optional: pin PCCS to a specific node with `bash scripts/get-pccs-node.sh` and set `baremetal.pccs.nodeSelector` in the baremetal chart values.
- DCAP QGS (Quote Generation Service) deploys on Intel nodes via NFD labels; offline collateral mode (no PCCS server required)

For GPU-enabled deployments (`intel-tdx-gpu` or `amd-snp-gpu` profiles):

Expand Down
Loading
Loading