4.9 KiB
4.9 KiB
Wave 2 / Track 9.2 - Production Cutover (K8s Helm, Controlled Window)
This runbook executes Track 9.2 as an operations cutover, not a feature track.
Goal
Move the accepted Asterisk bridge flow from QA to production Helm deployment with:
- strict bridge auth (
beareronly), - one real softphone call validation,
- recording import + supervisor playback proof,
- formal GO/NO-GO evidence and rollback path.
Scope
Includes:
- production Helm upgrade in strict mode,
- post-cutover checks:
track9_preflight --check-sftp --require-strict-service-authasterisk_lab_smoke --require-recordingtrack9_check --require-recording
- evidence package collection.
Excludes:
- ARI/call-control,
- new voice features,
- business API contract changes.
Required inputs
Fill track9-cutover-sheet.template.md first.
Mandatory values:
KUBE_CONTEXTNAMESPACERELEASEGATEWAY_BASE_URLDATABASE_URL(PostgreSQL in production)IMAGE_TAGASTERISK_AMI_HOST,ASTERISK_AMI_USERNAME,ASTERISK_AMI_SECRETASTERISK_SFTP_HOST,ASTERISK_SFTP_USERNAME,ASTERISK_SFTP_PASSWORDQUEUE_IDforvoice_labAPP_TOKEN_SECRET
Phase 0 - Entry checks (T-1 day)
- Baseline reference is fixed:
- Confirm
voice_lab -> queue_idexists in target routing DB. - Confirm cluster can reach Asterisk VM:
- AMI
5038/tcp - SFTP
22/tcp
- AMI
- Confirm maintenance window and owners.
Phase 1 - Pre-cutover dry-run (T-4h to T-1h)
Run dry-run command (no deploy):
powershell -ExecutionPolicy Bypass -File scripts\track9_2_cutover.ps1 `
-KubeContext <KUBE_CONTEXT> `
-Namespace <NAMESPACE> `
-Release <RELEASE> `
-GatewayBaseUrl <GATEWAY_BASE_URL> `
-DatabaseUrl <DATABASE_URL> `
-ImageTag <IMAGE_TAG> `
-AmiHost <ASTERISK_AMI_HOST> `
-AmiUser <ASTERISK_AMI_USERNAME> `
-AmiSecret <ASTERISK_AMI_SECRET> `
-SftpHost <ASTERISK_SFTP_HOST> `
-SftpUser <ASTERISK_SFTP_USERNAME> `
-SftpPassword <ASTERISK_SFTP_PASSWORD> `
-QueueId <QUEUE_ID> `
-AppTokenSecret <APP_TOKEN_SECRET>
Expected:
helm lintPASShelm templatePASS- rendered manifest contains:
ALLOW_LEGACY_HEADER_AUTH=0ASTERISK_BRIDGE_AUTH_MODE=bearerASTERISK_BRIDGE_AUTH_FALLBACK_LEGACY=0VOICE_ADAPTER_TRUSTED_SERVICE_SUBJECTSwithsvc:asterisk-bridgeRECORDING_IMPORT_TRUSTED_SERVICE_SUBJECTSwithsvc:asterisk-bridgeRECORDING_IMPORT_ALLOW_ADMIN=0
Artifacts are saved under:
.artifacts/track9_2/<timestamp>/
Phase 2 - Controlled cutover execute (T0)
Run same command with -Execute:
powershell -ExecutionPolicy Bypass -File scripts\track9_2_cutover.ps1 `
-KubeContext <KUBE_CONTEXT> `
-Namespace <NAMESPACE> `
-Release <RELEASE> `
-GatewayBaseUrl <GATEWAY_BASE_URL> `
-DatabaseUrl <DATABASE_URL> `
-ImageTag <IMAGE_TAG> `
-AmiHost <ASTERISK_AMI_HOST> `
-AmiUser <ASTERISK_AMI_USERNAME> `
-AmiSecret <ASTERISK_AMI_SECRET> `
-SftpHost <ASTERISK_SFTP_HOST> `
-SftpUser <ASTERISK_SFTP_USERNAME> `
-SftpPassword <ASTERISK_SFTP_PASSWORD> `
-QueueId <QUEUE_ID> `
-AppTokenSecret <APP_TOKEN_SECRET> `
-Execute
If Helm reports conflicts on HPA-managed Deployment.spec.replicas, rerun with:
... -Execute -ForceUpgrade
Script actions:
- snapshot:
kubectl get pods -o widehelm history(before)
helm upgrade --installwith strict overlay- wait for the migration Job to complete
- rollout wait:
api-gatewayasterisk-bridge-servicevoice-adapter-servicerecording-service
- strict preflight + smoke + track9_check
- evidence package via
track9_collect_evidence - writes rollback hint from Helm history
Phase 3 - Live acceptance (mandatory)
During window, place one real call:
- softphone
1001 -> 7000
Then confirm:
call.startedfrom Asterisk source existscall.endedfor same call existsrecording.readyuploaded torecording-service- supervisor playback is
HTTP 200andaudio/*
Phase 4 - Evidence and GO/NO-GO
Use generated evidence folder from script and finalize:
track9-acceptance.mdplayback-proof.md- optional
playback-proof.json
GO only if all true:
- preflight PASS
- smoke PASS
- track9_check PASS
failed bridge events = 0- supervisor playback confirmed
Rollback policy
Rollback triggers:
- preflight FAIL
- track9_check FAIL
- no recording import after live call
- failed bridge events keep growing
Rollback command pattern:
helm -n <NAMESPACE> rollback <RELEASE> <PREVIOUS_REVISION>
kubectl -n <NAMESPACE> rollout status deploy/api-gateway
kubectl -n <NAMESPACE> rollout status deploy/asterisk-bridge-service
After rollback:
- rerun
track9_preflightin previous baseline, - log incident note + root cause item in cutover sheet.