From 5b890162a6a04e17f2531cdae1807855eb00a859 Mon Sep 17 00:00:00 2001 From: joshsiv-mulga Date: Mon, 11 May 2026 11:59:19 +1000 Subject: [PATCH] ci(e2e-ddil): export spinifex AWS creds for witness SDK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The witness EC2 client (harness/witness.go NewWitness) calls session.NewSession with no static credentials, so the AWS SDK falls through its default chain — env vars → shared profile → IAM role — and on the CI runner none of those exist. Result on the live cluster: "NoCredentialProviders: no valid providers in chain. Deprecated." launches every Scenario A/B/C attempt straight to t.Fatal at launchWitnesses. spx admin init writes [spinifex] aws_access_key_id / aws_secret_access_key to the operator's ~/.aws/credentials on node1 during bootstrap. Pull them over SSH and export as AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY so the SDK's env-var step resolves before it gets to the empty profile/IAM checks. Hard-fail the step if either field is missing — better than silently watching every scenario t.Fatal on the same line. --- .github/workflows/e2e-ddil.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/e2e-ddil.yml b/.github/workflows/e2e-ddil.yml index f32786d94..cfc6edddc 100644 --- a/.github/workflows/e2e-ddil.yml +++ b/.github/workflows/e2e-ddil.yml @@ -95,8 +95,24 @@ jobs: # tofu-cluster, wan_ip == cluster IP and the runner's outbound # IP is distinct — see e2e-ddil-test-harness.md §3 Scenario C. NODE_IPS=$(echo "$INVENTORY" | jq -r '[.nodes[].wan_ip] | join(",")') + PRIMARY_IP=$(echo "$INVENTORY" | jq -r '.nodes[0].wan_ip') echo "DDIL_NODES=${NODE_IPS}" + # Witness VMs talk to the cluster's AWS gateway via aws-sdk-go, + # which resolves credentials from the standard chain. spx admin + # init writes [spinifex] to ${SSH_USER}'s ~/.aws/credentials on + # node1 — pull them over SSH and export as the SDK's env-var + # entries so the harness can launch instances without depending + # on a cluster-bootstrapped profile being present on the runner. + CREDS=$(ssh -i "${SSH_KEY}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + "${SSH_USER}@${PRIMARY_IP}" 'cat ~/.aws/credentials') + AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk -F '= *' '/^aws_access_key_id/ {print $2; exit}') + AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk -F '= *' '/^aws_secret_access_key/ {print $2; exit}') + if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]; then + echo "::error::Failed to extract spinifex AWS credentials from ${PRIMARY_IP}" + exit 1 + fi + mkdir -p "${RUNNER_TEMP}/ddil-results" cd "${GITHUB_WORKSPACE}/spinifex" DDIL_NODES="${NODE_IPS}" \ @@ -104,6 +120,8 @@ jobs: DDIL_SSH_KEY="${SSH_KEY}" \ DDIL_QUARANTINED="${{ inputs.quarantined }}" \ AWS_REGION="${REGION}" \ + AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" \ + AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" \ go test -tags=e2e -timeout 45m -json \ ./tests/e2e/ddil/scenarios/... \ | tee "${RUNNER_TEMP}/ddil-results/results.json"