Skip to content

Commit 439e3d5

Browse files
committed
test(snp): pin KMS provider id in smoke
1 parent f189110 commit 439e3d5

1 file changed

Lines changed: 34 additions & 3 deletions

File tree

test-scripts/snp-e2e-smoke.sh

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ APP_HOST_PORT="${DSTACK_SNP_SMOKE_APP_HOST_PORT:-15543}"
7171
STRICT_APP_HOST_PORT="${DSTACK_SNP_SMOKE_STRICT_APP_HOST_PORT:-15544}"
7272
VMM_PORT="${DSTACK_SNP_SMOKE_VMM_PORT:-18082}"
7373
VMM_URL="${DSTACK_SNP_SMOKE_VMM_URL:-http://127.0.0.1:$VMM_PORT}"
74+
HOST_API_PORT="${DSTACK_SNP_SMOKE_HOST_API_PORT:-11100}"
7475
ALLOW_OUT_OF_DATE_TCB="${DSTACK_SNP_SMOKE_ALLOW_OUT_OF_DATE_TCB:-0}"
7576
RUN_STRICT_TCB_PROBE="${DSTACK_SNP_SMOKE_STRICT_TCB_PROBE:-1}"
7677
ALLOW_OLD_QEMU="${DSTACK_SNP_SMOKE_ALLOW_OLD_QEMU:-0}"
@@ -84,6 +85,7 @@ need() {
8485

8586
need curl
8687
need jq
88+
need openssl
8789
need python3
8890
need sudo
8991

@@ -325,7 +327,7 @@ auto_start = true
325327
[host_api]
326328
ident = "dstack SNP smoke VMM"
327329
address = "vsock:0xffffffff"
328-
port = 10000
330+
port = $HOST_API_PORT
329331
330332
[key_provider]
331333
enabled = true
@@ -448,17 +450,46 @@ wait_for_kms_metrics() {
448450
done
449451
}
450452

453+
kms_key_provider_id() {
454+
local kms_port="$1"
455+
local label="${2:-$kms_port}"
456+
local meta_file="$ART/kms-$label-meta.json"
457+
local ca_file="$ART/kms-$label-ca.pem"
458+
for i in $(seq 1 60); do
459+
if curl -kfsS "https://127.0.0.1:$kms_port/prpc/KMS.GetMeta?json" -o "$meta_file"; then
460+
jq -r '.ca_cert // .caCert // empty' "$meta_file" >"$ca_file"
461+
if [[ -s "$ca_file" ]] && grep -q "BEGIN CERTIFICATE" "$ca_file"; then
462+
# dstack-util treats KMS provider ID as the root CA
463+
# SubjectPublicKeyInfo DER bytes (x509_parser public_key().raw).
464+
openssl x509 -in "$ca_file" -pubkey -noout \
465+
| openssl pkey -pubin -outform DER \
466+
| od -An -tx1 -v \
467+
| tr -d ' \n'
468+
echo
469+
return 0
470+
fi
471+
fi
472+
sleep 2
473+
if [[ $((i % 10)) -eq 0 ]]; then echo "waiting for $label KMS GetMeta ca_cert..." >&2; fi
474+
done
475+
echo "failed to derive KMS key_provider_id from https://127.0.0.1:$kms_port/prpc/KMS.GetMeta" >&2
476+
exit 1
477+
}
478+
451479
deploy_app() {
452480
local name="$1"
453481
local kms_port="$2"
454482
local app_port="$3"
483+
local key_provider_id
484+
key_provider_id=$(kms_key_provider_id "$kms_port" "$name")
485+
echo "$name key_provider_id=$key_provider_id" >&2
455486
cat >"$BASE/$name-compose.yaml" <<'YAML'
456487
services:
457488
smoke:
458489
image: debian:bookworm-slim
459490
command: sh -c 'echo SNP_APP_CONTAINER_STARTED; sleep 300'
460491
YAML
461-
python3 "$REPO/vmm/src/vmm-cli.py" --url "$VMM_URL" compose --docker-compose "$BASE/$name-compose.yaml" --name "$name" --kms --public-logs --public-sysinfo --no-instance-id --output "$BASE/$name.app-compose.json" | tee "$ART/$name-compose-create.txt" >&2
492+
python3 "$REPO/vmm/src/vmm-cli.py" --url "$VMM_URL" compose --docker-compose "$BASE/$name-compose.yaml" --name "$name" --kms --key-provider-id "$key_provider_id" --public-logs --public-sysinfo --no-instance-id --output "$BASE/$name.app-compose.json" | tee "$ART/$name-compose-create.txt" >&2
462493
jq --arg init_script "$DNS_INIT_SCRIPT" '.storage_fs="ext4" | .init_script=$init_script' "$BASE/$name.app-compose.json" >"$BASE/$name.app-compose.json.tmp"
463494
mv "$BASE/$name.app-compose.json.tmp" "$BASE/$name.app-compose.json"
464495
python3 "$REPO/vmm/src/vmm-cli.py" --url "$VMM_URL" deploy --name "$name" --compose "$BASE/$name.app-compose.json" --image "$IMAGE_NAME" --kms-url "https://10.0.2.2:$kms_port" --port "tcp:127.0.0.1:$app_port:8000" --vcpu 2 --memory 4096 --disk 20G | tee "$ART/$name-deploy.txt" >&2
@@ -504,7 +535,7 @@ echo "APP_VM_ID=$APP_VM_ID"
504535
for i in $(seq 1 240); do
505536
logs=$(python3 "$REPO/vmm/src/vmm-cli.py" --url "$VMM_URL" logs "$APP_VM_ID" -n 160 2>/dev/null || true)
506537
if echo "$logs" | grep -Eq "SNP_APP_CONTAINER_STARTED|Container dstack-smoke-1 Started"; then echo "$logs" | tee "$ART/app-ready-log.txt"; echo "APP ready after ${i}s"; break; fi
507-
if echo "$logs" | grep -q "Failed to get app key\|amd sev-snp key release\|measurement mismatch\|App not allowed\|KMS self authorization failed\|KDS collateral unavailable\|HTTP status client error"; then echo "$logs" | tee "$ART/app-failure-log.txt"; exit 2; fi
538+
if echo "$logs" | grep -q "Failed to get app key\|Failed to verify app\|Invalid mr_config\|amd sev-snp key release\|measurement mismatch\|App not allowed\|KMS self authorization failed\|KDS collateral unavailable\|HTTP status client error"; then echo "$logs" | tee "$ART/app-failure-log.txt"; exit 2; fi
508539
sleep 2
509540
if [[ $((i % 30)) -eq 0 ]]; then echo "waiting for APP..."; echo "$logs" | tail -60; fi
510541
if [[ $i -eq 240 ]]; then echo "APP did not become ready"; echo "$logs" | tee "$ART/app-timeout-log.txt"; exit 1; fi

0 commit comments

Comments
 (0)