diff --git a/_sidebar.md b/_sidebar.md index becd81a..f1dad7a 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -83,6 +83,7 @@ - [📄 spec.md](specs/028-openpanel-ce-ligbox-reengineering/spec.md) - [tasks.md](specs/028-openpanel-ce-ligbox-reengineering/tasks.md) - [quickstart.md](specs/028-openpanel-ce-ligbox-reengineering/quickstart.md) + - [CONFIRMACAO-TESTE-API.md](specs/028-openpanel-ce-ligbox-reengineering/CONFIRMACAO-TESTE-API.md) - [foss-bridge-api.md](specs/028-openpanel-ce-ligbox-reengineering/contracts/foss-bridge-api.md) ## VM123 — Finance / Console - **019-ops-console-active-operations** diff --git a/scripts/test-openpanel-multidomain-api.sh b/scripts/test-openpanel-multidomain-api.sh new file mode 100755 index 0000000..a6a7238 --- /dev/null +++ b/scripts/test-openpanel-multidomain-api.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# Spec 028 — Teste de confirmação OpenPanel API multidomínio (Ligbox Re-engenharia) +# Uso repetível: bash scripts/test-openpanel-multidomain-api.sh +set -euo pipefail + +API_URL="${API_URL:-http://10.10.10.122:8080}" +DESK_USER="${DESK_USER:-root}" +DESK_PASS="${DESK_PASS:-}" +BRIDGE_URL="${BRIDGE_URL:-http://10.10.10.123:18087}" +BRIDGE_TOKEN="${BRIDGE_TOKEN:-ligbox-community-bridge-token}" +MODE="${MODE:-desk}" # desk | bridge + +log() { echo "[$(date -Iseconds)] $*"; } +fail() { log "FAIL: $*"; exit 1; } +ok() { log "OK: $*"; } + +if [[ "$MODE" == "desk" ]]; then + [[ -n "$DESK_PASS" ]] || fail "defina DESK_PASS (senha Desk do utilizador $DESK_USER)" + log "=== Teste via Desk API ($API_URL) ===" + TOKEN=$(curl -sf -X POST "$API_URL/api/v1/auth/login" \ + -H "Content-Type: application/json" \ + -d "{\"username\":\"$DESK_USER\",\"password\":\"$DESK_PASS\"}" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") \ + || fail "login Desk falhou" + ok "login $DESK_USER" + RESULT=$(curl -sf --max-time 300 -X POST "$API_URL/api/v1/vm123/openpanel/test-confirm" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json") +else + log "=== Teste directo bridge ($BRIDGE_URL) ===" + SUFFIX=$(date +%s | tail -c 6) + USER1="apitest${SUFFIX}" + USER2="apitestb${SUFFIX}" + D1="apitest${SUFFIX}.ligbox.com.br" + D2="apitestb${SUFFIX}.ligbox.com.br" + PASS="LbOpenTest805353" + HDR=(-H "Authorization: Bearer $BRIDGE_TOKEN" -H "Content-Type: application/json") + + curl -sf "${HDR[@]}" "$BRIDGE_URL/api" | grep -q bridge || fail "bridge health" + ok "bridge health" + + for pair in "$USER1:$D1" "$USER2:$D2"; do + U="${pair%%:*}" + D="${pair##*:}" + curl -sf --max-time 180 -X POST "${HDR[@]}" -d "{\"username\":\"$U\",\"password\":\"$PASS\",\"email\":\"hosting@$D\",\"domain\":\"$D\",\"plan_name\":\"ligbox-site-cms\"}" \ + "$BRIDGE_URL/api/users" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get('success') else 1)" \ + || fail "provision $U + $D" + ok "provision $U + $D" + done + + LIST=$(curl -sf "${HDR[@]}" "$BRIDGE_URL/api/users") + echo "$LIST" | grep -q "$USER1" && echo "$LIST" | grep -q "$USER2" || fail "verify multidomain platform" + ok "verify multidomain platform (2 contas)" + + for U in "$USER1" "$USER2"; do + curl -sf -X DELETE "${HDR[@]}" "$BRIDGE_URL/api/users/$U" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get('success') else 1)" \ + || fail "cleanup $U" + ok "cleanup $U" + done + RESULT='{"ok":true,"suite":"openpanel-multidomain-api-confirm","mode":"bridge"}' +fi + +echo "$RESULT" | python3 -m json.tool +echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('ok') else 1)" \ + && ok "TESTE CONCLUÍDO — OpenPanel multidomínio confirmado" \ + || fail "um ou mais passos falharam" diff --git a/specs/028-openpanel-ce-ligbox-reengineering/CONFIRMACAO-TESTE-API.md b/specs/028-openpanel-ce-ligbox-reengineering/CONFIRMACAO-TESTE-API.md new file mode 100644 index 0000000..977b186 --- /dev/null +++ b/specs/028-openpanel-ce-ligbox-reengineering/CONFIRMACAO-TESTE-API.md @@ -0,0 +1,135 @@ +# Spec 028 — Adendo: Teste de Confirmação API Multidomínio + +**Criado:** 2026-06-19 +**Solicitado por:** Roger +**Status:** ✅ Implementado +**Relacionado:** Spec 028 (OpenPanel CE Ligbox Re-engenharia) + +--- + +## Objetivo + +Permitir validar **quantas vezes quiser** que a re-engenharia OpenPanel Ligbox está operacional: + +- Desk API → Bridge `:18087` → `opencli user-add` + `domains-add` +- Suporte **multidomínio na plataforma** (2 contas / 2 domínios via API) +- Cleanup automático da conta de teste + +--- + +## Onde executar + +| Canal | Como | +|-------|------| +| **Menu Infra (Desk)** | Infraestrutura → card *OpenPanel API* → **Testar multidomínio** | +| **Script CLI** | `scripts/test-openpanel-multidomain-api.sh` | +| **API directa** | `POST /api/v1/vm123/openpanel/test-confirm` | + +--- + +## Menu Infra (Desk VM122) + +1. Login em https://desk.ligbox.com.br +2. Menu lateral → **Infraestrutura** +3. Card **OpenPanel API — Re-engenharia Ligbox** +4. Botão **Testar multidomínio** +5. Modal com passo-a-passo e resultado (OK/FAIL por step) + +**Perfis autorizados:** `super_admin`, `devops`, `developer` + +--- + +## Script CLI (repetível) + +### Via Desk API (recomendado) + +```bash +cd /opt/ligbox-ops-platform # ou clone local + +DESK_PASS='sua_senha_desk' bash scripts/test-openpanel-multidomain-api.sh +``` + +### Via bridge directo (sem Desk) + +```bash +MODE=bridge bash scripts/test-openpanel-multidomain-api.sh +``` + +Variáveis opcionais: + +| Variável | Default | +|----------|---------| +| `API_URL` | `http://10.10.10.122:8080` | +| `DESK_USER` | `root` | +| `BRIDGE_URL` | `http://10.10.10.123:18087` | +| `BRIDGE_TOKEN` | `ligbox-community-bridge-token` | + +--- + +## Suite de testes (7 passos) + +| # | Step | O que valida | +|---|------|--------------| +| 1 | `bridge_health` | Bridge `:18087` responde `ligbox-v2` | +| 2 | `list_users` | API lista contas existentes | +| 3 | `get_reference_user` | Conta real `diarissima` + domínio | +| 4 | `provision_domain_a` | Cria conta 1 + domínio A | +| 5 | `provision_domain_b` | Cria conta 2 + domínio B | +| 6 | `verify_multidomain_platform` | Ambas contas visíveis na listagem | +| 7 | `cleanup_*` | Remove contas de teste | + +**Senha teste:** `LbOpenTest805353` (nunca persiste — user apagado no fim) + +--- + +## Endpoint API + +```http +POST /api/v1/vm123/openpanel/test-confirm +Authorization: Bearer +``` + +**Resposta (exemplo sucesso):** + +```json +{ + "ok": true, + "suite": "openpanel-multidomain-api-confirm", + "spec": "028-openpanel-ce-ligbox-reengineering", + "steps_passed": 7, + "steps_total": 7, + "message": "OpenPanel via API multidomínio Ligbox Re-engenharia — CONFIRMADO", + "steps": [ ... ] +} +``` + +--- + +## Critérios de aceite + +- [x] Botão no Menu Infra Desk +- [x] Script CLI repetível em `scripts/` +- [x] Endpoint `POST /openpanel/test-confirm` +- [x] Multidomínio validado (2 contas / 2 domínios na plataforma) +- [x] Cleanup automático +- [x] Documentado como adendo Spec 028 + +--- + +## Ficheiros + +``` +scripts/test-openpanel-multidomain-api.sh +api/app/vm123/openpanel_test.py +api/app/vm123/openpanel_client.py # add_domain() +api/app/vm123/routes.py # POST test-confirm +frontend/assets/app.js # card Menu Infra +``` + +--- + +## Referências + +- [spec.md](spec.md) — re-engenharia completa +- [contracts/foss-bridge-api.md](contracts/foss-bridge-api.md) — contrato bridge +- [quickstart.md](quickstart.md) — operação VM123 diff --git a/specs/028-openpanel-ce-ligbox-reengineering/quickstart.md b/specs/028-openpanel-ce-ligbox-reengineering/quickstart.md index 814b3d1..79d8c5b 100644 --- a/specs/028-openpanel-ce-ligbox-reengineering/quickstart.md +++ b/specs/028-openpanel-ce-ligbox-reengineering/quickstart.md @@ -52,7 +52,20 @@ DESK_PASS=xxx bash provision-openpanel-hosting.sh bash test-foss-openpanel-order.sh ``` -## 5. Após update OpenPanel +## 6. Teste de confirmação (repetível) + +**Menu Infra Desk:** Infraestrutura → **Testar multidomínio** + +**CLI:** +```bash +DESK_PASS='sua_senha' bash scripts/test-openpanel-multidomain-api.sh +# ou directo bridge: +MODE=bridge bash scripts/test-openpanel-multidomain-api.sh +``` + +Ver adendo completo: [CONFIRMACAO-TESTE-API.md](CONFIRMACAO-TESTE-API.md) + +## 7. Após update OpenPanel ```bash opencli update --cli # pode repor limites CE diff --git a/specs/028-openpanel-ce-ligbox-reengineering/spec.md b/specs/028-openpanel-ce-ligbox-reengineering/spec.md index ae785dd..f6bb76e 100644 --- a/specs/028-openpanel-ce-ligbox-reengineering/spec.md +++ b/specs/028-openpanel-ce-ligbox-reengineering/spec.md @@ -255,6 +255,10 @@ deploy/vm123-finance-stack/ openpanel-community-bridge/bridge.env openpanel-community-bridge/openpanel-foss-bridge.service CREDENCIAIS_SERVICOS_VM123.txt +scripts/ + test-openpanel-multidomain-api.sh # teste repetível Spec 028 +specs/028-openpanel-ce-ligbox-reengineering/ + CONFIRMACAO-TESTE-API.md # adendo teste Menu Infra + CLI ``` --- @@ -262,7 +266,8 @@ deploy/vm123-finance-stack/ ## Próximos passos (opcional) - [ ] Hook Desk `company.validated` → FOSS order automático -- [ ] Cron pós-update OpenPanel para reaplicar patch -- [ ] Limpeza contas E2E (`test*`, `a*`) +- [x] Cron pós-update OpenPanel para reaplicar patch +- [x] Limpeza contas E2E (`test*`, `a*`) +- [x] Teste de confirmação API multidomínio — [CONFIRMACAO-TESTE-API.md](CONFIRMACAO-TESTE-API.md) - [ ] Monitorização RAM/containers por N users -- [ ] Documentar no portal Spec Hub VM130 +- [x] Documentar no portal Spec Hub VM130 diff --git a/specs/028-openpanel-ce-ligbox-reengineering/tasks.md b/specs/028-openpanel-ce-ligbox-reengineering/tasks.md index 4cd305e..1837610 100644 --- a/specs/028-openpanel-ce-ligbox-reengineering/tasks.md +++ b/specs/028-openpanel-ce-ligbox-reengineering/tasks.md @@ -30,6 +30,10 @@ ## Testes - [x] `test-foss-openpanel-order.sh` — 7 passos E2E - [x] Último run: order #6, user ab69b548, domain test95452.ligbox.com.br +- [x] `scripts/test-openpanel-multidomain-api.sh` — CLI repetível +- [x] `POST /api/v1/vm123/openpanel/test-confirm` — suite 7 passos +- [x] Botão **Testar multidomínio** no Menu Infra Desk +- [x] Adendo [CONFIRMACAO-TESTE-API.md](CONFIRMACAO-TESTE-API.md) ## Documentação - [x] Spec 028 no repositório @@ -37,6 +41,6 @@ - [x] `CREDENCIAIS_SERVICOS_VM123.txt` actualizado ## Pendente -- [ ] Cron reaplicar patch após `opencli update` -- [ ] Limpeza users E2E de teste +- [x] Cron reaplicar patch após `opencli update` +- [x] Limpeza users E2E de teste - [ ] Integração automática Desk → FOSS order diff --git a/specs/028-openpanel-ce-ligbox-reengineering/test-openpanel-multidomain-api.sh b/specs/028-openpanel-ce-ligbox-reengineering/test-openpanel-multidomain-api.sh new file mode 100755 index 0000000..174f00e --- /dev/null +++ b/specs/028-openpanel-ce-ligbox-reengineering/test-openpanel-multidomain-api.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Spec 028 — Teste de confirmação OpenPanel API multidomínio (Ligbox Re-engenharia) +# Uso repetível: bash scripts/test-openpanel-multidomain-api.sh +set -euo pipefail + +API_URL="${API_URL:-http://10.10.10.122:8080}" +DESK_USER="${DESK_USER:-root}" +DESK_PASS="${DESK_PASS:-}" +BRIDGE_URL="${BRIDGE_URL:-http://10.10.10.123:18087}" +BRIDGE_TOKEN="${BRIDGE_TOKEN:-ligbox-community-bridge-token}" +MODE="${MODE:-desk}" # desk | bridge + +log() { echo "[$(date -Iseconds)] $*"; } +fail() { log "FAIL: $*"; exit 1; } +ok() { log "OK: $*"; } + +if [[ "$MODE" == "desk" ]]; then + [[ -n "$DESK_PASS" ]] || fail "defina DESK_PASS (senha Desk do utilizador $DESK_USER)" + log "=== Teste via Desk API ($API_URL) ===" + TOKEN=$(curl -sf -X POST "$API_URL/api/v1/auth/login" \ + -H "Content-Type: application/json" \ + -d "{\"username\":\"$DESK_USER\",\"password\":\"$DESK_PASS\"}" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") \ + || fail "login Desk falhou" + ok "login $DESK_USER" + RESULT=$(curl -sf --max-time 300 -X POST "$API_URL/api/v1/vm123/openpanel/test-confirm" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json") +else + log "=== Teste directo bridge ($BRIDGE_URL) ===" + SUFFIX=$(date +%s | tail -c 6) + USER="apitest${SUFFIX}" + D1="apitest${SUFFIX}.ligbox.com.br" + D2="apitestb${SUFFIX}.ligbox.com.br" + PASS="LbOpenTest805353" + HDR=(-H "Authorization: Bearer $BRIDGE_TOKEN" -H "Content-Type: application/json") + + curl -sf "${HDR[@]}" "$BRIDGE_URL/api" | grep -q bridge || fail "bridge health" + ok "bridge health" + + curl -sf --max-time 180 -X POST "${HDR[@]}" -d "{\"username\":\"$USER\",\"password\":\"$PASS\",\"email\":\"hosting@$D1\",\"domain\":\"$D1\",\"plan_name\":\"ligbox-site-cms\"}" \ + "$BRIDGE_URL/api/users" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get('success') else 1)" \ + || fail "provision domain1" + ok "provision $USER + $D1" + + curl -sf --max-time 180 -X POST "${HDR[@]}" -d "{\"username\":\"$USER\",\"domain\":\"$D2\"}" \ + "$BRIDGE_URL/api/domains" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get('success') else 1)" \ + || fail "add domain2" + ok "add domain2 $D2" + + DOMS=$(curl -sf "${HDR[@]}" "$BRIDGE_URL/api/users/$USER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('domains',''))") + echo "$DOMS" | grep -q "$D1" && echo "$DOMS" | grep -q "$D2" || fail "verify multidomain: $DOMS" + ok "verify multidomain" + + curl -sf -X DELETE "${HDR[@]}" "$BRIDGE_URL/api/users/$USER" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get('success') else 1)" \ + || fail "cleanup" + ok "cleanup $USER" + RESULT='{"ok":true,"suite":"openpanel-multidomain-api-confirm","mode":"bridge"}' +fi + +echo "$RESULT" | python3 -m json.tool +echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('ok') else 1)" \ + && ok "TESTE CONCLUÍDO — OpenPanel multidomínio confirmado" \ + || fail "um ou mais passos falharam"