104 lines
3.6 KiB
Bash
Executable File
104 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -uo pipefail
|
|
|
|
# Plan-13 local production-like smoke:
|
|
# TLS self-signed + mock OIDC IdP + oauth2-proxy + nginx auth_request + CP API.
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
|
COMPOSE="$ROOT/docker-compose.control-panel.local.yml"
|
|
TLS_DIR="$ROOT/tmp/control-panel-local/tls"
|
|
BASE="https://localhost:18443"
|
|
|
|
mkdir -p "$TLS_DIR"
|
|
if [[ ! -f "$TLS_DIR/tls.crt" || ! -f "$TLS_DIR/tls.key" ]]; then
|
|
openssl req -x509 -newkey rsa:2048 -nodes \
|
|
-keyout "$TLS_DIR/tls.key" \
|
|
-out "$TLS_DIR/tls.crt" \
|
|
-subj "/CN=localhost" \
|
|
-days 1 >/dev/null 2>&1
|
|
fi
|
|
|
|
cleanup() {
|
|
docker compose -f "$COMPOSE" down --remove-orphans >/dev/null 2>&1 || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
fail() {
|
|
echo "$1"
|
|
docker compose -f "$COMPOSE" logs --tail=120 control-panel-api control-panel-ui oauth2-proxy idp || true
|
|
exit 1
|
|
}
|
|
|
|
docker compose -f "$COMPOSE" up -d --build >/tmp/casan-cp-local-smoke-up.log 2>&1 || {
|
|
cat /tmp/casan-cp-local-smoke-up.log
|
|
exit 1
|
|
}
|
|
|
|
for _ in $(seq 1 60); do
|
|
if curl -k -s -I "$BASE/" >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
JAR="$(mktemp)"
|
|
trap 'rm -f "$JAR"; cleanup' EXIT
|
|
|
|
curl -k -s -L -c "$JAR" -b "$JAR" "$BASE/" -o /tmp/casan-cp-local-index.html -w "%{http_code}" > /tmp/casan-cp-local-index.code
|
|
INDEX_CODE="$(cat /tmp/casan-cp-local-index.code)"
|
|
if [[ "$INDEX_CODE" != "200" ]] || ! grep -q "CASAN Ops Console" /tmp/casan-cp-local-index.html; then
|
|
echo "CP_LOCAL_SMOKE_FAIL ui_http=$INDEX_CODE"
|
|
tail -100 /tmp/casan-cp-local-index.html
|
|
fail "CP_LOCAL_SMOKE_FAIL ui_unexpected"
|
|
fi
|
|
|
|
for _ in $(seq 1 30); do
|
|
curl -k -s -L -c "$JAR" -b "$JAR" "$BASE/api/v1/settings" -o /tmp/casan-cp-local-settings.json -w "%{http_code}" > /tmp/casan-cp-local-settings.code
|
|
SETTINGS_CODE="$(cat /tmp/casan-cp-local-settings.code)"
|
|
[[ "$SETTINGS_CODE" == "200" ]] && break
|
|
sleep 1
|
|
done
|
|
SETTINGS_CODE="$(cat /tmp/casan-cp-local-settings.code)"
|
|
if [[ "$SETTINGS_CODE" != "200" ]]; then
|
|
echo "CP_LOCAL_SMOKE_FAIL settings_http=$SETTINGS_CODE"
|
|
cat /tmp/casan-cp-local-settings.json
|
|
fail "CP_LOCAL_SMOKE_FAIL settings_unexpected"
|
|
fi
|
|
|
|
for _ in $(seq 1 30); do
|
|
curl -k -s -L -c "$JAR" -b "$JAR" "$BASE/api/v1/command" -o /tmp/casan-cp-local-command.json -w "%{http_code}" > /tmp/casan-cp-local-command.code
|
|
COMMAND_CODE="$(cat /tmp/casan-cp-local-command.code)"
|
|
[[ "$COMMAND_CODE" == "200" ]] && break
|
|
sleep 1
|
|
done
|
|
COMMAND_CODE="$(cat /tmp/casan-cp-local-command.code)"
|
|
if [[ "$COMMAND_CODE" != "200" ]]; then
|
|
echo "CP_LOCAL_SMOKE_FAIL command_http=$COMMAND_CODE"
|
|
cat /tmp/casan-cp-local-command.json
|
|
fail "CP_LOCAL_SMOKE_FAIL command_unexpected"
|
|
fi
|
|
|
|
python3 - <<'PY'
|
|
import json
|
|
data = json.load(open('/tmp/casan-cp-local-settings.json'))
|
|
actor = data.get('data', {}).get('actor', {})
|
|
assert actor.get('actor') == 'oidc-ops', actor
|
|
assert actor.get('role') == 'org-admin', actor
|
|
assert data.get('success') is True
|
|
command = json.load(open('/tmp/casan-cp-local-command.json'))
|
|
widgets = command.get('data', {}).get('widgets', {})
|
|
assert command.get('success') is True
|
|
assert len(widgets) == 9, widgets.keys()
|
|
assert 'chat_loop' in widgets, widgets.keys()
|
|
for widget in widgets.values():
|
|
envelope = widget.get('envelope', {})
|
|
assert {'source', 'artifact_path', 'commit', 'run_at', 'verified', 'status'} <= set(envelope), envelope
|
|
print('CP_LOCAL_SMOKE_PASS https_oidc=true actor=oidc-ops role=org-admin')
|
|
PY
|
|
|
|
CASAN_CP_BASE_URL="$BASE" \
|
|
CASAN_CP_ALLOW_INSECURE=1 \
|
|
CASAN_CP_COOKIE_JAR="$JAR" \
|
|
bash "$ROOT/packages/casan-control-panel/scripts/managed-prod-smoke.sh" >/tmp/casan-cp-local-managed-smoke.out
|
|
cat /tmp/casan-cp-local-managed-smoke.out
|