Files
ss-tools/scripts/full-flow-ready.py

41 lines
2.6 KiB
Python

#!/usr/bin/env python3
# #region FullFlow.Readiness [C:4] [TYPE Module] [SEMANTICS docker,readiness,authentication,evidence]
# @PURPOSE Probe real API readiness and password authentication without printing tokens.
# @PRE The isolated stack is running; credentials come only from the named fixture env file.
# @POST A nonzero exit identifies unavailable or unauthenticated services; successful probes list IDs.
import json
from pathlib import Path
import sys
import urllib.error
import urllib.request
import urllib.parse
values = dict(line.split('=', 1) for line in Path(sys.argv[1] if len(sys.argv) > 1 else '/tmp/ss-tools-full-flow.env').read_text().splitlines() if '=' in line)
password = values['FIXTURE_PASSWORD']
failures = []
for stage, port in [('DEV',18111), ('PREPROD',18112), ('PROD',18113)]:
base = f'http://127.0.0.1:{port}'
try:
urllib.request.urlopen(f'{base}/health', timeout=10).read()
request = urllib.request.Request(f'{base}/api/v1/security/login', data=json.dumps({'username':'admin','password':password,'provider':'db','refresh':True}).encode(), headers={'Content-Type':'application/json'})
token = json.load(urllib.request.urlopen(request,timeout=10))['access_token']
request = urllib.request.Request(f'{base}/api/v1/dashboard/', headers={'Authorization':f'Bearer {token}'})
dashboards = json.load(urllib.request.urlopen(request,timeout=10))['result']
fixture = next(d for d in dashboards if d['slug'] == 'sales')
print(f'{stage}: healthy, authenticated, sales dashboard {fixture["id"]}')
except Exception as error:
failures.append(stage)
print(f'{stage}: probe failed ({type(error).__name__}: {getattr(error, "reason", getattr(error, "code", "unexpected response"))})')
try:
urllib.request.urlopen('http://127.0.0.1:18103/api/ready', timeout=10).read()
request = urllib.request.Request('http://127.0.0.1:18103/api/auth/login', data=urllib.parse.urlencode({'username':'admin','password':password}).encode())
token = json.load(urllib.request.urlopen(request, timeout=10))['access_token']
request = urllib.request.Request('http://127.0.0.1:18103/api/auth/me', headers={'Authorization':f'Bearer {token}'})
user = json.load(urllib.request.urlopen(request, timeout=10))
print(f'ss-tools: ready, authenticated as {user["username"]}')
except Exception as error:
failures.append('ss-tools')
print(f'ss-tools: probe failed ({type(error).__name__}: {getattr(error, "reason", getattr(error, "code", "unexpected response"))})')
sys.exit(bool(failures))
# #endregion FullFlow.Readiness