Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
232 commits
Select commit Hold shift + click to select a range
ea0b1b1
feat: move GitLab from EKS to EC2 docker-compose
allamand Jun 26, 2026
32b0d90
feat: backport generic tasks from kind-crossplane to kind-kro-ack
allamand Jun 26, 2026
ac60d6c
feat: complete kind-kro-ack consolidation
allamand Jun 26, 2026
ec3d5f8
feat: create-config.sh reads CLUSTER_PROVIDER env var (default: kind-…
allamand Jun 26, 2026
19425f2
refactor: remove argocd:capability job from kind-kro-ack — Capabiliti…
allamand Jun 26, 2026
17263cb
fix: restore Kargo ECR pod-identity setup in deploy-kargo.sh (acciden…
allamand Jun 26, 2026
3cce2f8
fix: restore create-ray-models-bucket from deleted Taskfile.workshop.…
allamand Jun 26, 2026
4a223b4
fix: restore accidentally removed code from cherry-pick
allamand Jun 26, 2026
a3178d9
fix: add kind-kro-ack to root Taskfile includes
allamand Jun 26, 2026
9b0eaad
fix: increase RGD wait timeout 180s→300s and wait individually for be…
allamand Jun 26, 2026
7f9f22a
fix: add kind:kubeconfig task to ensure kubeconfig is present on re-runs
allamand Jun 26, 2026
2504593
fix: gitlab:init-ec2 rails runner fully idempotent on re-runs (user e…
allamand Jun 26, 2026
07711e8
fix: gitlab:init-ec2 use save(validate:false) — update! fails on comp…
allamand Jun 26, 2026
fbc1edb
fix: ensure user namespace exists before creating GitLab projects
allamand Jun 26, 2026
20f50ff
fix(kind-kro-ack): add ACK SecretsManager + ESO bootstrap to install
allamand Jun 26, 2026
2c9f119
fix(kind-kro-ack): fix hub:claim - remove unknown argocdCapability, a…
allamand Jun 26, 2026
a32e677
fix: gitlab:init-ec2 use Users::CreateService + Devise::Encryptor for…
allamand Jun 26, 2026
c524d7c
fix(kind-kro-ack): restore argocdCapability as RGD-managed EKS Capabi…
allamand Jun 26, 2026
2baa6d2
fix: gitlab:init-ec2 definitive - namespace via organization_id, unpr…
allamand Jun 26, 2026
82ce00a
fix: restore argoCdCapabilityRoleArn as optional field — KRO rejects …
allamand Jun 26, 2026
8f004b1
feat(kind-kro-ack): add kro:reset-crds task for breaking schema changes
allamand Jun 26, 2026
4b74a8e
fix(kind-kro-ack): derive subnet CIDRs from HUB_VPC_CIDR prefix
allamand Jun 26, 2026
7ebced7
fix(kind-kro-ack): skip hub:install-argocd when ArgoCD CRDs already e…
allamand Jun 26, 2026
fb883c9
fix: remove force push in seed loop - repos are fresh, no need for -f
allamand Jun 26, 2026
5efd66d
fix(kind-kro-ack): fix list-vpc-origins JMESPath query (VpcOriginList…
allamand Jun 26, 2026
d68ca87
fix(kind-kro-ack): fix hub:install-argocd status check (OR not AND)
allamand Jun 26, 2026
cff4f7e
fix: seed repos by cloning first (preserves README history from initi…
allamand Jun 26, 2026
e64a27a
fix(kind-kro-ack): seed peeks-hub/secrets early in hub:seed
allamand Jun 26, 2026
793a703
fix(kind-kro-ack): add ClusterSecretStore + eso-aws-credentials on bo…
allamand Jun 26, 2026
e5d1965
fix(kind-kro-ack): remove clusterSecretsSecret from RGD, seed-secrets…
allamand Jun 26, 2026
43c7038
fix: unprotect branch immediately before each seed push (GitLab re-ap…
allamand Jun 26, 2026
a0174be
refactor: move docker exec gitlab-rails unprotect to workshop/Taskfil…
allamand Jun 26, 2026
2fbc37a
chore: reference #757 in secrets-manager:seed-secrets (GitLab creds s…
allamand Jun 26, 2026
c8cafc0
fix: use initialize_with_readme:false — empty repos have no protected…
allamand Jun 26, 2026
f62a43e
fix(kind-kro-ack): guard kro:reset-crds against live instances
allamand Jun 26, 2026
4cf3704
fix: set default_branch_protection_defaults to allow all pushes (stop…
allamand Jun 26, 2026
522df80
fix(kro): remove readyWhen from clusterConfigSecret and hubSecretsExt…
allamand Jun 26, 2026
c3a3e03
fix(kind-kro-ack): refresh eso-aws-credentials in credentials:refresh
allamand Jun 26, 2026
6db7de9
fix: restore git push -f for seed — user1 owns repos, force push is c…
allamand Jun 26, 2026
2aad9a3
fix(kind-kro-ack): restore-secret before create/put in all seed tasks
allamand Jun 26, 2026
6c6b30e
fix(kind-kro-ack): remove double slash in addonsRepoBasepath (REPO_BA…
allamand Jun 27, 2026
d29320d
fix(kind-kro-ack): use HTTPS endpoint not ARN as ArgoCD cluster server
allamand Jun 27, 2026
37554e1
fix: add tolerations to eks-pod-identity-agent addon for EKS Auto Mod…
allamand Jun 27, 2026
c761d1d
fix(kind-kro-ack): remove hub:install-argocd from hub:seed
allamand Jun 27, 2026
027ad1c
fix(kind-kro-ack): align hub:seed-secret with crossplane - use ARN + …
allamand Jun 27, 2026
9335c0a
fix(kind-kro-ack): remove argocd:install from bootstrap - not needed
allamand Jun 27, 2026
3eb77a3
fix(kind-kro-ack): enforce bootstrap context after kind:kubeconfig to…
allamand Jun 27, 2026
80a21c7
revert: remove unnecessary pod-identity-agent tolerations (EKS Auto M…
allamand Jun 27, 2026
a7b5bd0
fix(kro): add argocd-capability-role as trusted principal in argocdRole
allamand Jun 27, 2026
f3204f5
fix: seed platform/backstage/templates into fleet-config so Backstage…
allamand Jun 28, 2026
9920cf0
fix: capture user1 PAT token after GitLab init and update git_token i…
allamand Jun 28, 2026
1fead6e
fix(kind-kro-ack): add phase1b-parallel with gitlab:init-ec2 before p…
allamand Jun 28, 2026
5d50a30
fix(kind-kro-ack): fix gitlab:init-ec2 cross-namespace delegation
allamand Jun 28, 2026
585e7a5
fix(kro): grant ArgoCD Capability Role direct access to KRO-provision…
Jun 28, 2026
38e9f3a
fix(kind-kro-ack): skip hub:seed-secret when ARN matches, fix hub:wai…
allamand Jun 28, 2026
ff037ce
feat(kind-kro-ack): port phase1b improvements from kind-crossplane
allamand Jun 28, 2026
de91907
feat(kind-kro-ack): add observability seeding in background during ph…
allamand Jun 28, 2026
44ae67b
fix(kind-kro-ack): move status check to correct position in hub:seed-…
allamand Jun 28, 2026
04dc7ad
fix(argo-workflows): use gitlab_domain_name as fallback for SSO issue…
Jun 28, 2026
d73dd60
fix(gitlab): add branch protection + auth config to OMNIBUS_CONFIG, g…
allamand Jun 28, 2026
a8907d5
fix(argo-workflows): pass gitlab_domain_name to chart for cloudfront SSO
Jun 28, 2026
d4780fe
fix(workshop): fix raise syntax in gitlab:init-ec2 (RuntimeError not …
allamand Jun 28, 2026
20c4271
fix(workshop): use abort instead of raise for nil user check
allamand Jun 28, 2026
d9ea18b
fix(keycloak,argo-workflows): use gitlab_domain_name fallback for hos…
Jun 28, 2026
e0c31c8
fix(workshop): remove nil guard (caused Ruby parse errors in heredoc)
allamand Jun 28, 2026
30fdec0
fix(workshop): remove duplicate if block in gitlab:init-ec2 ruby script
allamand Jun 28, 2026
beaaeea
fix(workshop): handle new GitLab CE ServiceResponse API in CreateService
allamand Jun 28, 2026
bb6c142
revert: remove gitlab.yaml chart change (docker-compose not k8s chart)
allamand Jun 28, 2026
8e6e8ea
feat(ray): add ray:setup and ray:prestage-models tasks
Jun 28, 2026
6b73f14
fix(argo-workflows): disable SSO auth-mode in cloudfront exposure mode
Jun 28, 2026
a3c9b39
fix(workshop): add organization_id to CreateService, clean orphaned n…
allamand Jun 28, 2026
bdf01bb
feat(ray): make image build non-blocking, add ray:wait-image task
Jun 28, 2026
9b251fc
fix(workshop): sleep after project create for Sidekiq protections, fi…
allamand Jun 28, 2026
497e1f4
feat(workshop): add workshop:install as single entry point
Jun 28, 2026
213c006
fix(workshop): unprotect branches via API before push (handles Sideki…
allamand Jun 28, 2026
348b93b
fix(workshop): create root-api PAT on-demand for API unprotect calls
allamand Jun 28, 2026
d35c7f7
fix(workshop): skip push if repo already has commits (idempotent init)
allamand Jun 28, 2026
4dee984
fix(jupyterhub): disable upstream chart ingress to avoid duplicate In…
allamand Jun 28, 2026
b9f98a9
fix: always set user1 password via Devise::Encryptor after creation (…
allamand Jun 29, 2026
56e5629
fix: same password fix in workshop/Taskfile.yaml gitlab:init-ec2
allamand Jun 29, 2026
41c1e91
fix(spokes): use deterministic CIDR based on cluster name instead of …
Jun 29, 2026
9e023a1
fix: pass GIT_PASSWORD/GIT_USERNAME as env vars to rails runner (avoi…
allamand Jun 29, 2026
6c3c130
refactor: remove gitlab:init-ec2 + gitlab:clone-repos from kind-cross…
allamand Jun 29, 2026
29c90ad
refactor: remove gitlab references from kind-crossplane + kind-kro-ac…
allamand Jun 29, 2026
53d1bd2
fix: unprotect branches after seed push (seed creates main which trig…
allamand Jun 29, 2026
a78d15c
docs: add README.md to cluster-providers/workshop/
allamand Jun 29, 2026
285981e
fix: run gitlab-ctl reconfigure after first boot to ensure workhorse/…
allamand Jun 29, 2026
65692bd
fix: call workshop:gitlab:init-ec2 from phase1b-parallel (correct tim…
allamand Jun 29, 2026
b49938c
fix: run gitlab:init-ec2 BEFORE provider:install (GitLab ready at boo…
allamand Jun 29, 2026
8bbd6d2
fix: auto-detect and fix broken GitLab internal/allowed — wipe+restar…
allamand Jun 29, 2026
4af3b52
fix: use set +e/set -e around docker compose down+up to prevent set -…
allamand Jun 29, 2026
aff99be
feat: add workshop:setup-env task to write ARGOCD_URL, BACKSTAGE_URL …
allamand Jun 29, 2026
dc3c05f
fix: add set +e to workshop:setup-env to prevent exit status 1
allamand Jun 29, 2026
69af5cd
fix: wrap push test in set +e to prevent exit 128 on rails runner fai…
allamand Jun 29, 2026
6900ef6
perf: run spoke-dev and spoke-prod enables in parallel (deps vs seque…
allamand Jun 29, 2026
5cfe37c
fix: always do docker compose down -v + up (unconditional, eliminates…
allamand Jun 29, 2026
fc0ccc7
fix: separate gitlab domain (CDK) from platform domain (ALB CloudFron…
allamand Jun 29, 2026
7cb392f
fix(kind-kro-ack): increase MAX_OUTOFSYNC=20 for initial hub:wait-for…
allamand Jun 29, 2026
782d98c
fix: hub:cloudfront and hub-distribution status checks — use OR logic…
allamand Jun 29, 2026
e4ba51c
fix: use YAML block scalar for status check to avoid single-quote esc…
allamand Jun 29, 2026
9f799fc
fix: only wipe GitLab on first run — skip down -v if fleet-config rep…
allamand Jun 29, 2026
991bebe
fix: remove down -v wipe logic — CDK starts GitLab fresh on new event…
allamand Jun 29, 2026
98c3457
fix(kro): propagate argoCdCapabilityRoleArn to child EksCluster in rg…
Jun 29, 2026
e6ad282
fix: guard update_columns with persisted? to surface CreateService er…
allamand Jun 29, 2026
c9a69b0
fix: avoid shell interpolation in ruby raise — use stderr.puts + exit 1
allamand Jun 29, 2026
391ad6d
fix: use STDERR constant instead of $stderr to avoid bash variable ex…
allamand Jun 29, 2026
9eddcb9
fix: GIT_PASSWORD reads from peeks-ide-password secret (available at …
allamand Jun 29, 2026
66706c8
fix: GIT_PASSWORD as single-line chained command (sh: block doesn't s…
allamand Jun 29, 2026
3c1d9bc
fix: GIT_PASSWORD reads from peeks-hub/secrets.git_token (seeded by C…
allamand Jun 29, 2026
704c474
fix: write cloudfront.cloudfrontDomain (not cloudfront.domain) in kin…
allamand Jun 29, 2026
8ced210
fix: unprotect fleet-config main before each spoke push attempt (re-p…
allamand Jun 29, 2026
5a70077
fix: flush Rails cache after ApplicationSetting save so all workers p…
allamand Jun 29, 2026
ca8bfdb
fix: use access_level 30 (Developer+) not 0 (No one) in default_branc…
allamand Jun 30, 2026
db3a0cc
fix: call cloudfront:hub-distribution in install:phase1-cloudfront (w…
allamand Jun 30, 2026
c1d0986
perf: skip gitlab:init-ec2 rails runner if user1 PAT + fleet-config a…
allamand Jun 30, 2026
7aa6314
ux: print progress message before gitlab-rails runner (takes ~60s wit…
allamand Jun 30, 2026
6d5b05f
perf: fast file-based status check for gitlab:init-ec2 — skip if repo…
allamand Jun 30, 2026
af5e42c
fix(install): add hub:create-mgmt-roles to hub:seed flow
allamand Jun 30, 2026
f2d58d7
refactor(kro-ack): align with crossplane Taskfile; remove AppExposure…
allamand Jun 30, 2026
31d78cf
fix: create-config.sh reads gitlabDomain from gitlab-cloudfront-domai…
allamand Jun 30, 2026
ae9286b
fix: add ignore_error to setup-env so && chaining doesn't break on so…
allamand Jun 30, 2026
774fe4d
fix: more robust pod age check in restart-identity-pods status — clea…
allamand Jun 30, 2026
ba9cbf1
fix: add hub:update-ingress-domain to patch cluster secrets with clou…
allamand Jun 30, 2026
8b299e3
fix: hub:update-ingress-domain updates Secrets Manager (not k8s annot…
allamand Jun 30, 2026
ae43d18
refactor: move cloudfront:setup-exposure before hub:seed in crossplan…
allamand Jun 30, 2026
d21e65e
refactor: align crossplane CloudFront with kro-ack — internal ALB + V…
allamand Jun 30, 2026
ec69c03
fix: capture user1 GitLab PAT after init and update peeks-hub/secrets…
allamand Jun 30, 2026
ff14bac
fix: keycloak create_client upserts (updates redirectUris if client e…
allamand Jun 30, 2026
f8f7423
fix: seed platform/backstage/templates into fleet-config + reduce git…
allamand Jun 30, 2026
d598a9f
fix: remove dollar sign from CLOUDFRONT_VPC_ID Taskfile template — wa…
allamand Jun 30, 2026
2f71a95
fix: deduplicate subnets by AZ when creating internal ALB to avoid In…
allamand Jun 30, 2026
a5f11f2
fix: use ALB DNS (not ARN) as DomainName in CloudFront distribution —…
allamand Jun 30, 2026
633510f
fix: Issue#11 add dynamodb+services.k8s.aws RBAC, Issue#12 trust peek…
allamand Jul 1, 2026
938551c
fix: add hub:sync-cloudfront-domain to ensure cloudfrontDomain writte…
allamand Jul 1, 2026
5bdd5de
fix: CLOUDFRONT_DOMAIN reads from private/cloudfront-domain file as f…
allamand Jul 1, 2026
4ee5381
ux: add timing markers to workshop:install (gitlab init, provider ins…
allamand Jul 1, 2026
4b6444f
fix: add debug output to fleet-config wait loop — show URL and last g…
allamand Jul 1, 2026
3e98a3d
fix: GIT_PASSWORD in kro-ack tasks reads from peeks-hub/secrets.git_t…
allamand Jul 1, 2026
60c8a89
fix: GIT_PASSWORD in kind-crossplane reads from peeks-hub/secrets.git…
allamand Jul 1, 2026
d8a8b54
fix: gitlab:init-ec2 status check also verifies git_token is a real P…
allamand Jul 1, 2026
e094491
fix: detect real GitLab PAT by glpat- prefix (not length) in gitlab:i…
allamand Jul 1, 2026
cdcf0aa
refactor: extract shared CloudFront/ALB/VPC-Origin logic into cluster…
allamand Jul 1, 2026
fd17b44
refactor: remove dead hub:ingress/hub:cloudfront/hub:sync-cloudfront-…
allamand Jul 1, 2026
5465101
fix: standardize ingress_name to HUB_CLUSTER_NAME-platform in both kr…
allamand Jul 1, 2026
8d6c10c
ux: add progress logging every 2min to spoke EKS cluster wait loop
allamand Jul 1, 2026
c26931c
perf: run spoke-dev and spoke-prod enables in parallel in kro-ack (de…
allamand Jul 1, 2026
9f7449f
fix: add hub:wait-for-providers step before spoke provisioning — ensu…
allamand Jul 1, 2026
7dfc7a0
fix: force-sync crossplane-base after 5min if providers not Healthy —…
allamand Jul 1, 2026
3e6379a
fix: remove line continuation in kubectl patch — YAML block scalar do…
allamand Jul 1, 2026
2250c5e
fix: use \n in printf single-quoted strings to avoid YAML parse error
allamand Jul 1, 2026
82536b8
fix: wait 60s after restarting pods for EKS Pod Identity agent to inj…
allamand Jul 1, 2026
20625b6
fix: crossplane:providers status check also verifies pod identity ass…
allamand Jul 1, 2026
198a684
fix: split HuggingFaceModel into platform-manifests-post (wave 8) — K…
allamand Jul 1, 2026
4e4837a
fix: also write exposure_mode=cloudfront when updating ingress_domain…
allamand Jul 1, 2026
60e0891
fix: add exposure_mode to kro-ack hub:seed metadata — needed by argo-…
allamand Jul 1, 2026
e49084c
fix: wait for EKS cluster ACTIVE before creating ALB — cluster may st…
allamand Jul 1, 2026
22370c4
fix: make ray:setup/wait-image/prestage-models optional in workshop:i…
allamand Jul 1, 2026
d2c0444
refactor: extract ray tasks to common/Taskfile.ray.yaml, include in k…
allamand Jul 1, 2026
f74cb19
refactor: remove inline ray tasks from kind-crossplane — now uses sha…
allamand Jul 1, 2026
edd211f
fix: rename ray tasks in common/Taskfile.ray.yaml from ray:xxx to xxx…
allamand Jul 1, 2026
ea250d7
fix: remove dangling 2>/dev/null line in hub:wait-for-providers causi…
allamand Jul 1, 2026
219308c
fix: hub:update-ingress-domain also writes admin_role_name, exposure_…
allamand Jul 1, 2026
3994caf
fix: hub:update-ingress-domain writes all required annotations (gitla…
allamand Jul 1, 2026
364ce73
fix: hub:seed writes correct ingress_domain_name from private/cloudfr…
allamand Jul 1, 2026
878062a
fix: write CLOUDFRONT_DOMAIN to platform.sh in setup-env — needed by …
allamand Jul 1, 2026
0b84150
fix: add hub:force-eso-refresh after hub:seed — ensures cluster secre…
allamand Jul 1, 2026
1d4fcaa
fix: increase Pod Identity injection wait from 60s to 90s to ensure L…
allamand Jul 1, 2026
9c066c8
fix: hub:wait-for-providers needs hub:kubeconfig call — was using boo…
allamand Jul 1, 2026
99dac90
fix(kind-kro-ack): gate spoke provisioning on Crossplane provider health
allamand Jul 1, 2026
6de85b7
fix: add ignore_error to hub:wait-for-providers — providers being unh…
allamand Jul 1, 2026
d7a5acb
fix(kro): implement ALB url-rewrite transforms via CEL map literal (#…
allamand Jul 1, 2026
d06468c
fix(spoke-access): use correct ArgoCD capability role name (lowercase)
allamand Jul 1, 2026
f25197b
feat(kind-kro-ack): provision both spokes via KRO (drop Crossplane de…
allamand Jul 1, 2026
65f03a5
fix(kind-kro-ack): make hub:wait-for-providers pipefail-safe
allamand Jul 1, 2026
8ca00bb
fix(kind-kro-ack): remove unnecessary hub-kubeconfig deletion in wait…
allamand Jul 1, 2026
9390841
fix(kro-ack,crossplane): gate apply-root-appset on ArgoCD CRDs being …
allamand Jul 2, 2026
6fdcc3c
fix(cloudfront): sync-domain before hub:seed in crossplane; drop clou…
allamand Jul 2, 2026
820c872
fix(kind-kro-ack): serialize spoke enablement + deep-merge kro-cluste…
allamand Jul 2, 2026
7268f8e
fix(cloudfront): resolve platform domain lazily at task-run time; dro…
allamand Jul 2, 2026
809f468
fix(ingress): platform IngressClassParams scheme=internal in cloudfro…
allamand Jul 2, 2026
0a71d67
fix(kind-kro-ack): add LBC + keycloak-config pod identity association…
allamand Jul 2, 2026
ef33bc2
fix(kro-ack): gate crossplane pod_identities to provider!=kro-ack; st…
allamand Jul 2, 2026
22e8e2f
fix(kro-ack): stamp provider=kro-ack on spoke cluster secrets to gate…
allamand Jul 2, 2026
6f8fb2c
feat(kro-ack): bootstrap Crossplane provider pod identities via ACK R…
allamand Jul 2, 2026
fe17f17
docs(steering): troubleshooting for CloudFront VPC-origin -> stale/re…
allamand Jul 2, 2026
ac26812
fix(cloudfront): create-alb selects+tags private subnets so LBC adopt…
allamand Jul 2, 2026
bb387b0
fix(kind-kro-ack): bootstrap hub Crossplane provider creds in the tas…
allamand Jul 3, 2026
0fe1a77
fix(kind-kro-ack): restore spokes:create-capabilities accidentally re…
allamand Jul 3, 2026
c5d3504
feat(crossplane): native EKS Capability MRs (provider-aws-eks v2.6.1)…
allamand Jul 3, 2026
ddef5d7
docs+fix(crossplane): document declarative EKS Capabilities; drop dea…
allamand Jul 3, 2026
51bb045
fix(kro-ack): make hub crossplane bootstrap create-only (drop fatal r…
allamand Jul 3, 2026
a21582d
fix(kro): grant hub kro/ack capability role ACK RBAC for kro-provisio…
allamand Jul 3, 2026
5a088e7
docs(troubleshooting): hub kro/ack capability RBAC gap + manual ACK-o…
allamand Jul 3, 2026
6cd7453
perf(kro-ack): enable spokes before Crossplane provider bring-up
allamand Jul 3, 2026
8e15fa1
fix(kro-spokes): provider-aware ArgoCD hub capability role name in cl…
allamand Jul 3, 2026
47ef237
fix(kro-eks): only trust <cluster>-argocd-capability-role when argocd…
allamand Jul 3, 2026
8148cb6
fix(clusters-kro): drop hasKey guard that broke on map[string]string …
allamand Jul 3, 2026
524ee27
fix(kro-ack): seed <hub>/config vpc as JSON object so devlake RDS pro…
allamand Jul 3, 2026
a85b363
fix(crossplane-spokes): use PascalCase ArgoCDCapabilityRole for spoke…
allamand Jul 3, 2026
9c5659a
fix(eks-capabilities-rbac): add ACK S3 API group to kro/ack ClusterRole
allamand Jul 4, 2026
87cdbda
fix(kro-ack): expand GITLAB_CF_DOMAIN in seed + use platform ingressC…
allamand Jul 4, 2026
04c5f83
fix(backstage/ingress/rbac): stop clobbering GitLab PAT; platform ing…
allamand Jul 6, 2026
0e4d0a5
fix(eks-capabilities-rbac): add pods/events, apps/deployments, workfl…
allamand Jul 6, 2026
70ee218
fix(spokes): platform IngressClass = OSS LBC everywhere (+ #2 provide…
allamand Jul 6, 2026
077ff8a
docs(fleet-secret): reword comment (workshop -> solution)
allamand Jul 6, 2026
97d4a03
fix(argocd/podidentity): auto-refresh ArgoCD gitlab repo-creds (#7) +…
allamand Jul 6, 2026
a881d53
fix(kubevela-cd/kargo): healthcheckPath, publishVersion bump, inline …
allamand Jul 6, 2026
6c12909
fix(rbac): add persistentvolumes/persistentvolumeclaims to kro Cluste…
Jul 6, 2026
bc4eeea
fix(kargo): inline stages, drop publishVersion, enable auto-promotion
Jul 6, 2026
0f1f637
fix(cluster-mgmt): allow spoke ACK roles + microservice PassRole; fix…
allamand Jul 7, 2026
ed5ebcf
refactor(exposure): introduce explicit `insecure` ingress flag
shapirov103 Jul 6, 2026
56dc82f
refactor(config): add `insecure` + `certificateArn` to the platform c…
shapirov103 Jul 6, 2026
aa3dd7d
refactor(workshop): consolidate workshop content into a top-level wor…
shapirov103 Jul 6, 2026
1eba80b
refactor(kind-crossplane): stop provisioning CloudFront; source domai…
shapirov103 Jul 7, 2026
c59f072
refactor(kind-kro-ack): stop provisioning CloudFront; delete shared C…
shapirov103 Jul 7, 2026
257e883
refactor(kind-kro-ack): stop provisioning CloudFront; source domain f…
shapirov103 Jul 7, 2026
38024f5
chore: stop tracking .local scratch dir (add to .gitignore)
shapirov103 Jul 7, 2026
862d19a
refactor(providers): remove GitLab-CE docker exec branch-unprotect
shapirov103 Jul 7, 2026
fcf2517
refactor(providers): spoke-agnostic install + clearer phase names
shapirov103 Jul 7, 2026
e7a8d9f
chore: fix stale post-sync log message (was 'phase1-parallel ... clou…
shapirov103 Jul 7, 2026
6470344
refactor(providers): delete GitLab-coupled spoke/overlay tasks (b)
shapirov103 Jul 7, 2026
9252075
feat(workshop): own spoke declaration + fleet overlay (b, consumer side)
shapirov103 Jul 7, 2026
23c2e4e
refactor(config,ray): drop cloudfront.* from schema; parameterize Ray…
shapirov103 Jul 7, 2026
12a2b4a
feat(workshop): consume platform as an artifact (OAP-style, condition…
shapirov103 Jul 7, 2026
7a16a9e
docs(kind-crossplane): replace stale CloudFront exposure section with…
shapirov103 Jul 7, 2026
a2d3fcc
refactor(providers): drop GitLab URL from platform finalize output
shapirov103 Jul 7, 2026
d552368
feat(workshop): both spokes (dev+prod) via Crossplane with crossplane…
shapirov103 Jul 7, 2026
ef50ac1
refactor(workshop): run standalone from workshop/; remove workshop fr…
shapirov103 Jul 7, 2026
9cdc362
refactor(workshop): move create-config.sh into workshop/ (out of repo…
shapirov103 Jul 7, 2026
2aac022
fix(workshop): create-config.sh writes repo-root config.local.yaml fr…
shapirov103 Jul 7, 2026
18712d0
fix(workshop): create-config.sh sets insecure:true for CloudFront mode
allamand Jul 7, 2026
b9ba236
Merge pull request #772 from aws-samples/refactor/decouple-workshop-f…
allamand Jul 7, 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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,9 @@ private/

# Local platform config (user-specific, not committed)
config.local.yaml

# Local scratch / chat session artifacts (never commit)
.local/

# Pinned platform artifact clone (OAP-style consumption)
.platform/
120 changes: 120 additions & 0 deletions .kiro/steering/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,86 @@ annotations:
For Kargo specifically this lives in
`gitops/overlays/environments/control-plane/kargo/values.yaml` under `api.ingress.annotations`.

### CloudFront platform URLs hang (curl 000): VPC origin points to a stale/recreated ALB

**Symptom**: In cloudfront exposure mode, every platform URL (`https://$CF/keycloak/...`,
`/backstage`, `/grafana`, `/argo-workflows`, ...) times out with curl **`000`** — not `404`,
not `5xx`. `idc:configure` loops forever on "Keycloak not ready" (the SAML descriptor never
returns 200). A **direct in-cluster** curl to the internal ALB DNS returns `200/302`, proving
the ALB, targets and LBC listener rules are healthy — only the **CloudFront → ALB** hop fails.

**Root cause**: The platform ALB (`<hub>-platform`) was **deleted and recreated** (new
ARN/DNS), but the CloudFront **VPC Origin is still bound to the OLD (deleted) ALB ARN**.
`hub-distribution` only acts when no `<hub>-platform` distribution exists yet, so on a re-run it
**skips** and never re-points the VPC origin → CloudFront keeps sending traffic to a dead ALB →
the connection hangs → `000`.

Who recreates the ALB: the **AWS Load Balancer Controller**. When the pre-created ALB's
*immutable* attributes don't match the `platform` IngressClassParams, the LBC can't modify them
in place, so it **deletes and recreates** the ALB. The classic trigger is a **scheme mismatch**:
`create-alb` builds the ALB `internal` (required for a CloudFront VPC-Origin backend), but if
`IngressClassParams.spec.scheme` is `internet-facing`, scheme is immutable → LBC delete+recreate
loop. Every recreation orphans the VPC origin. (CloudTrail shows `DeleteLoadBalancer` by
`<hub>-LBCPodIdentityRole` with userAgent `elbv2.k8s.aws/...`.)

**Diagnosis**:
```bash
HUB=peeks-hub # adjust to your resource prefix

# 1. Direct in-cluster hit to the internal ALB (bypasses CloudFront). 200/302 => ALB is fine,
# so the break is the CloudFront->ALB hop (stale VPC origin), NOT the ALB/targets/rules.
ALB_DNS=$(aws elbv2 describe-load-balancers --names "$HUB-platform" --query 'LoadBalancers[0].DNSName' --output text)
kubectl --context "$HUB" -n keycloak run curltest --rm -i --restart=Never --image=curlimages/curl --command -- \
curl -s -o /dev/null -w '%{http_code}\n' --max-time 10 "http://$ALB_DNS/keycloak/realms/master"

# 2. THE check: does the VPC origin's ARN match the CURRENT ALB ARN? (mismatch = stale = the bug)
ALB_ARN=$(aws elbv2 describe-load-balancers --names "$HUB-platform" --query 'LoadBalancers[0].LoadBalancerArn' --output text)
DIST=$(aws cloudfront list-distributions --query "DistributionList.Items[?Comment=='$HUB-platform'].Id" --output text)
VO=$(aws cloudfront get-distribution --id "$DIST" --query 'Distribution.DistributionConfig.Origins.Items[0].VpcOriginConfig.VpcOriginId' --output text)
echo "VPC origin ARN : $(aws cloudfront get-vpc-origin --id "$VO" --query 'VpcOrigin.VpcOriginEndpointConfig.Arn' --output text)"
echo "current ALB ARN: $ALB_ARN" # if these differ, CloudFront points at a dead ALB

# 3. Confirm the LBC is the one deleting/recreating the ALB (and when)
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=DeleteLoadBalancer \
--max-results 5 --query 'Events[].{Time:EventTime,User:Username}' --output table
```

**Fix**:
- **Stop the churn at the source**: ensure the `platform` IngressClassParams `scheme` is
`internal` in cloudfront mode so the LBC **adopts** the pre-created internal ALB instead of
delete-recreating it (`gitops/addons/registry/core.yaml` `ingress-class-alb.valuesObject.scheme`
+ `gitops/addons/charts/ingress-class-alb/templates/ingressclass.yaml`). After this, CloudTrail
should show **no recurring** `DeleteLoadBalancer` events and the ALB ARN stays stable.
- **If a stale VPC origin already exists**, re-point CloudFront at the current ALB: create a NEW
VPC origin for the current ALB ARN → update the distribution's origin to the new `VpcOriginId`
and current ALB DNS → wait for `Deployed` → delete the old VPC origin. Note a VPC origin
**cannot be updated in place while attached to a distribution** (`CannotUpdateEntityWhileInUse`),
so you must create-new / swap / delete-old rather than edit its ARN.

**Prevention (root cause) — implemented**:
- `IngressClassParams.spec.scheme = internal` in cloudfront mode so the LBC adopts the internal
ALB in place instead of delete-recreating it (scheme is immutable).
- `create-alb` selects PRIVATE subnets (by `kubernetes.io/role/internal-elb` tag, then by
`MapPublicIpOnLaunch==false`) and **tags them `kubernetes.io/role/internal-elb=1`**, so the LBC
discovers the same subnet set and does not `SetSubnets`/churn the ALB. See
`cluster-providers/common/Taskfile.cloudfront.yaml` (`create-alb`).

**Future hardening (NOT yet implemented) — `cloudfront:sync-vpc-origin` reconcile**:
If an ALB is ever recreated despite the above (re-runs, other immutable-attr drift), a reconcile
task would self-heal the stale origin. Proposed design (idempotent; no-op when the ARN already
matches, so cheap on healthy installs):
1. Guard on `EXPOSURE_MODE == cloudfront`; resolve current `<hub>-platform` ALB ARN + DNS; resolve
the distribution (`Comment == <hub>-platform`) and its origin `VpcOriginId` → that VPC origin's ARN.
2. If `VPC-origin ARN == current ALB ARN` → **no-op** (done).
3. Else drift → create-new / swap / delete-old (a VPC origin can't be edited in place while
attached): `create-vpc-origin` for the current ALB → poll `Deployed` → `update-distribution`
origin to the new `VpcOriginId` + current ALB DNS → poll `Deployed` → `delete-vpc-origin` (old)
→ re-authorize `CloudFront-VPCOrigins-Service-SG → <current ALB SG>:80`.
Wire into `install:phase1-cloudfront` (both providers) after `sync-domain`. Cost is one or two
CloudFront deploys (~5–15 min each) ONLY on drift; a no-op otherwise. Deliberately left
unimplemented for now — the prevention above should keep the ALB stable; add this only if churn
recurs.

## ACK (AWS Controllers for Kubernetes) Issues

### ACK "scheduled for deletion" loop
Expand Down Expand Up @@ -316,6 +396,46 @@ The `services.k8s.aws/force-reconcile` annotation does NOT always work (especial

**Fix**: Delete the CRD manually (`kubectl delete crd <name>.kro.run`), then sync to let KRO recreate it. **Warning**: This deletes all instances of that CRD — may trigger resource deletion in AWS. Only do this when safe.

### Hub kro/ack capability RBAC-denied on ACK resources (kro-provisioned spokes)
**Symptoms**: A spoke provisioned via the **KRO path** never gets its EKS cluster. The
`EksclusterWithVpc` instance on the hub shows a reconcile error like:
```
vpcs.ec2.services.k8s.aws "<spoke>-vpc" is forbidden: User
"arn:aws:sts::<acct>:assumed-role/<hub>-kro-capability-role/KRO" cannot get resource
"vpcs" in API group "ec2.services.k8s.aws" in the namespace "<spoke>"
```

**Root cause**: A kro-provisioned spoke's `EksclusterWithVpc` claim is reconciled by the
**hub's** kro capability (`<hub>-kro-capability-role/KRO`), which renders the ACK
VPC/subnet/EKS CRs. The hub's kro/ack capability roles are NOT cluster-admin (they get
`AmazonEKSClusterPolicy` / inline ACK policies, mirroring the kro-ack RGD). The
`eks-capabilities-rbac` ClusterRole that grants the ACK API groups only targeted
`enable_kro_manifests` (spokes); the hub uses `enable_kro_manifests_hub`, so the hub never
got the RBAC. The chart comment "redundant on the hub because the capability role has
ClusterAdminPolicy" is wrong — the hub kro/ack cap is not cluster-admin in either the
crossplane or kro-ack flow. This is a **shared latent gap**; it surfaces on whichever flow
first exercises a KRO-provisioned spoke (crossplane: `spoke-prod`).

**Fix (GitOps)**: `eks-capabilities-rbac-hub` registry entry (`gitops/addons/registry/platform.yaml`),
gated on `enable_kro_manifests_hub`, deploys the same `eks-capabilities-kro` ClusterRole+Binding
on the hub, bound to `<hub>-kro-capability-role/KRO` and `<hub>-ack-capability-role/ACK`.

**Applying to an already-running hub**: the hub's `addonsRepoRevision` tracks the branch, so a
hard-refresh of the `cluster-addons` ApplicationSet regenerates it and syncs
`eks-capabilities-rbac-hub-<hub>` automatically:
```bash
kubectl -n argocd annotate applicationset cluster-addons argocd.argoproj.io/refresh=hard --overwrite
```
(Or apply the rendered ClusterRole/Binding directly for an immediate unblock.)

**Manual recovery — KRO does NOT self-heal the stuck ACK object**: after the RBAC is fixed,
KRO will not reconcile *over* the ACK resource that was left half-created during the denied
window. Delete the stuck ACK object so KRO recreates it cleanly:
```bash
kubectl --context <hub> delete vpcs.ec2.services.k8s.aws <spoke>-vpc -n <spoke>
# KRO recreates it (now permitted) and the spoke provisioning resumes.
```

## Crossplane Issues

### NAT Gateway reference resolution race condition
Expand Down
14 changes: 8 additions & 6 deletions ITERATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,17 +162,19 @@ The root Taskfile delegates to providers but each provider implements tasks diff

---

### 10. Remove ArgoCD capability create/delete Job when Crossplane supports it
### 10. Remove ArgoCD capability create/delete Job when Crossplane supports it ✅ DONE

**Priority:** Low
**Labels:** enhancement, tech-debt
**Ref:** https://github.com/crossplane-contrib/provider-upjet-aws/pull/2015

The `create-capability.yaml` and `delete-capability.yaml` Jobs use AWS CLI to manage the EKS ArgoCD Capability because Crossplane's EKS provider doesn't support it yet. Once `provider-upjet-aws` adds `EKSCapability` support:
- Replace Jobs with Crossplane managed resources
- Remove `manifests/argocd/create-capability.yaml` and `delete-capability.yaml`
- Remove `argocd:capability` and `argocd:delete-capability` tasks
- Add capability to the PlatformCluster composition or as a separate claim
**Done** (provider-aws-eks v2.6.1 adds the `Capability` MR). The EKS Capabilities
(KRO/ACK/ArgoCD) are now created declaratively:
- Crossplane path: native `Capability` MRs in the `platform-cluster` Composition,
gated by `spec.capabilities.<type>.enabled` (hub + spokes).
- The imperative `create-capability.yaml` / `delete-capability.yaml` Jobs and the
`argocd:capability` / `argocd:delete-capability` / `spokes:create-capabilities`
tasks were removed; `hub:seed` waits for the Capability MRs to be Ready.

---

Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ helper:

```bash
# Idempotent: skips if a valid config.local.yaml already exists
./create-config.sh
workshop/create-config.sh

# Force overwrite
FORCE=true ./create-config.sh
FORCE=true workshop/create-config.sh

# Override the branch (e.g. when WORKSHOP_GIT_BRANCH points to a release tag)
REPO_REVISION=feature/cloudfront-on-agent-platform ./create-config.sh
REPO_REVISION=... workshop/create-config.sh
```

This is a standalone script (not a Taskfile task) because every task reads
Expand Down
6 changes: 6 additions & 0 deletions Taskfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ includes:
vars:
CONFIG_FILE: "{{.CONFIG_FILE}}"
optional: true
kind-kro-ack:
taskfile: ./cluster-providers/kind-kro-ack/Taskfile.yaml
dir: ./cluster-providers/kind-kro-ack
vars:
CONFIG_FILE: "{{.CONFIG_FILE}}"
optional: true

tasks:
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ spec:
enabled: true
path: /java-app
rewrite: true
healthcheckPath: /java-app/
functionalGate:
enabled: true
image: "httpd:alpine"
Expand Down
4 changes: 1 addition & 3 deletions applications/java/kargo/deploy-kargo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@ if ! aws iam get-role --role-name "$KARGO_ROLE" --region "$AWS_REGION" >/dev/nul
echo " ✓ IAM role $KARGO_ROLE created"
fi
KARGO_ROLE_ARN=$(aws iam get-role --role-name "$KARGO_ROLE" --query 'Role.Arn' --output text --region "$AWS_REGION")

if ! aws eks list-pod-identity-associations --cluster-name "$HUB_CLUSTER" --region "$AWS_REGION" \
--query "associations[?namespace=='kargo'&&serviceAccount=='kargo-controller']" --output text 2>/dev/null | grep -q .; then
--query "associations[?namespace=='kargo'&&serviceAccount=='kargo-controller']" --output text 2>/dev/null | grep -q .; then
aws eks create-pod-identity-association \
--cluster-name "$HUB_CLUSTER" --namespace kargo --service-account kargo-controller \
--role-arn "$KARGO_ROLE_ARN" --region "$AWS_REGION" >/dev/null
Expand All @@ -45,7 +44,6 @@ if ! aws eks list-pod-identity-associations --cluster-name "$HUB_CLUSTER" --regi
kubectl rollout status deployment -n kargo --timeout=60s 2>/dev/null || true
fi


# Deploy the project (creates namespace)
echo "Creating Kargo project..."
envsubst < project.yaml | kubectl apply -f -
Expand Down
12 changes: 11 additions & 1 deletion applications/java/kargo/project.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ metadata:
annotations:
argocd.argoproj.io/sync-wave: "-1"
---
# Auto-promotion enabled for both stages. This is required because Kargo v1.7.5
# has a webhook bug that blocks manually-created Promotion resources when stages
# use inline `uses:` steps (the webhook incorrectly reports "Stage defines no
# promotion steps"). The controller bypasses the webhook for auto-promotions,
# so enabling auto-promotion is the reliable path.
#
# Freight flows: Warehouse → dev (auto) → prod (auto, after dev verifies).
apiVersion: kargo.akuity.io/v1alpha1
kind: ProjectConfig
metadata:
Expand All @@ -14,4 +21,7 @@ spec:
promotionPolicies:
- stageSelector:
name: dev
autoPromotionEnabled: true # Enable auto-promotion for dev
autoPromotionEnabled: true
- stageSelector:
name: prod
autoPromotionEnabled: true
7 changes: 6 additions & 1 deletion applications/java/kargo/promotiontask.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# NOTE: This PromotionTask is kept for reference only. It is NOT referenced by
# the Stage resources (stages.yaml uses inline steps instead). Kargo v1.7.5's
# admission webhook incorrectly rejects Stages that only reference a task, and
# the yaml-update step cannot address annotation keys with dots. See stages.yaml
# for the working inline implementation.
apiVersion: kargo.akuity.io/v1alpha1
kind: PromotionTask
metadata:
Expand Down Expand Up @@ -32,7 +37,7 @@ spec:
updates:
- key: spec.components.0.properties.image
value: ${{ vars.image }}:${{ imageFrom(vars.image).Tag }}
- key: metadata.annotations.app\.oam\.dev/publishVersion
- key: metadata.annotations["app.oam.dev/publishVersion"]
value: ${{ imageFrom(vars.image).Tag }}
- uses: git-commit
config:
Expand Down
104 changes: 99 additions & 5 deletions applications/java/kargo/stages.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
# Kargo Stages for the Java app.
#
# Promotion steps are inlined (not referenced via PromotionTask) because
# Kargo v1.7.5 admission webhook rejects Stages that only carry a task
# reference ("Stage defines no promotion steps"). Inline steps work reliably
# with both auto-promotion (controller-initiated) and manual promotion.
#
# The publishVersion annotation update is intentionally omitted — Kargo v1.7.5
# yaml-update does not support keys containing dots (neither bracket notation
# nor dot-escaping works). The image field update alone is sufficient to trigger
# reconciliation for both kro (spec.image) and kubevela (spec.components.0.properties.image)
# paths. Both steps use continueOnError so the promotion succeeds regardless of
# which manifest format is present.
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: java-app-kargo
annotations:
kargo.akuity.io/color: green
kargo.akuity.io/auto-promotion: "false"
spec:
requestedFreight:
- origin:
Expand All @@ -15,9 +27,50 @@ spec:
direct: true
promotionTemplate:
spec:
vars:
- name: gitURL
value: ${GITLAB_URL}/${GIT_USERNAME}/java.git
- name: image
value: ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/peeks/java
steps:
- task:
name: update-image
- uses: git-clone
config:
repoURL: ${{ vars.gitURL }}
checkout:
- branch: main
path: ./src
- uses: yaml-update
as: update-image-kro
continueOnError: true
config:
path: ./src/deployment/${{ ctx.stage }}/application.yaml
updates:
- key: spec.image
value: ${{ vars.image }}:${{ imageFrom(vars.image).Tag }}
- uses: yaml-update
as: update-image-kubevela
continueOnError: true
config:
path: ./src/deployment/${{ ctx.stage }}/application.yaml
updates:
- key: spec.components.0.properties.image
value: ${{ vars.image }}:${{ imageFrom(vars.image).Tag }}
- uses: git-commit
config:
path: ./src
message: "Promote ${{ ctx.stage }} to ${{ imageFrom(vars.image).Tag }}"
author:
name: Kargo
email: kargo@akuity.io
- uses: git-push
config:
path: ./src
- uses: argocd-update
config:
apps:
- name: java-${{ ctx.stage }}-cd
sources:
- repoURL: ${{ vars.gitURL }}
---
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
Expand All @@ -36,6 +89,47 @@ spec:
- dev
promotionTemplate:
spec:
vars:
- name: gitURL
value: ${GITLAB_URL}/${GIT_USERNAME}/java.git
- name: image
value: ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/peeks/java
steps:
- task:
name: update-image
- uses: git-clone
config:
repoURL: ${{ vars.gitURL }}
checkout:
- branch: main
path: ./src
- uses: yaml-update
as: update-image-kro
continueOnError: true
config:
path: ./src/deployment/${{ ctx.stage }}/application.yaml
updates:
- key: spec.image
value: ${{ vars.image }}:${{ imageFrom(vars.image).Tag }}
- uses: yaml-update
as: update-image-kubevela
continueOnError: true
config:
path: ./src/deployment/${{ ctx.stage }}/application.yaml
updates:
- key: spec.components.0.properties.image
value: ${{ vars.image }}:${{ imageFrom(vars.image).Tag }}
- uses: git-commit
config:
path: ./src
message: "Promote ${{ ctx.stage }} to ${{ imageFrom(vars.image).Tag }}"
author:
name: Kargo
email: kargo@akuity.io
- uses: git-push
config:
path: ./src
- uses: argocd-update
config:
apps:
- name: java-${{ ctx.stage }}-cd
sources:
- repoURL: ${{ vars.gitURL }}
Loading