41 lines
2.6 KiB
Python
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
|