Spec 028: adendo teste confirmação API multidomínio OpenPanel.
Script CLI repetível, documentação CONFIRMACAO-TESTE-API e endpoint Desk test-confirm.
This commit is contained in:
parent
b8fc44554e
commit
a8e3732bda
7 changed files with 294 additions and 6 deletions
|
|
@ -83,6 +83,7 @@
|
||||||
- [📄 spec.md](specs/028-openpanel-ce-ligbox-reengineering/spec.md)
|
- [📄 spec.md](specs/028-openpanel-ce-ligbox-reengineering/spec.md)
|
||||||
- [tasks.md](specs/028-openpanel-ce-ligbox-reengineering/tasks.md)
|
- [tasks.md](specs/028-openpanel-ce-ligbox-reengineering/tasks.md)
|
||||||
- [quickstart.md](specs/028-openpanel-ce-ligbox-reengineering/quickstart.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)
|
- [foss-bridge-api.md](specs/028-openpanel-ce-ligbox-reengineering/contracts/foss-bridge-api.md)
|
||||||
## VM123 — Finance / Console
|
## VM123 — Finance / Console
|
||||||
- **019-ops-console-active-operations**
|
- **019-ops-console-active-operations**
|
||||||
|
|
|
||||||
66
scripts/test-openpanel-multidomain-api.sh
Executable file
66
scripts/test-openpanel-multidomain-api.sh
Executable file
|
|
@ -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"
|
||||||
|
|
@ -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 <desk_token>
|
||||||
|
```
|
||||||
|
|
||||||
|
**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
|
||||||
|
|
@ -52,7 +52,20 @@ DESK_PASS=xxx bash provision-openpanel-hosting.sh
|
||||||
bash test-foss-openpanel-order.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
|
```bash
|
||||||
opencli update --cli # pode repor limites CE
|
opencli update --cli # pode repor limites CE
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,10 @@ deploy/vm123-finance-stack/
|
||||||
openpanel-community-bridge/bridge.env
|
openpanel-community-bridge/bridge.env
|
||||||
openpanel-community-bridge/openpanel-foss-bridge.service
|
openpanel-community-bridge/openpanel-foss-bridge.service
|
||||||
CREDENCIAIS_SERVICOS_VM123.txt
|
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)
|
## Próximos passos (opcional)
|
||||||
|
|
||||||
- [ ] Hook Desk `company.validated` → FOSS order automático
|
- [ ] Hook Desk `company.validated` → FOSS order automático
|
||||||
- [ ] Cron pós-update OpenPanel para reaplicar patch
|
- [x] Cron pós-update OpenPanel para reaplicar patch
|
||||||
- [ ] Limpeza contas E2E (`test*`, `a*`)
|
- [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
|
- [ ] Monitorização RAM/containers por N users
|
||||||
- [ ] Documentar no portal Spec Hub VM130
|
- [x] Documentar no portal Spec Hub VM130
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,10 @@
|
||||||
## Testes
|
## Testes
|
||||||
- [x] `test-foss-openpanel-order.sh` — 7 passos E2E
|
- [x] `test-foss-openpanel-order.sh` — 7 passos E2E
|
||||||
- [x] Último run: order #6, user ab69b548, domain test95452.ligbox.com.br
|
- [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
|
## Documentação
|
||||||
- [x] Spec 028 no repositório
|
- [x] Spec 028 no repositório
|
||||||
|
|
@ -37,6 +41,6 @@
|
||||||
- [x] `CREDENCIAIS_SERVICOS_VM123.txt` actualizado
|
- [x] `CREDENCIAIS_SERVICOS_VM123.txt` actualizado
|
||||||
|
|
||||||
## Pendente
|
## Pendente
|
||||||
- [ ] Cron reaplicar patch após `opencli update`
|
- [x] Cron reaplicar patch após `opencli update`
|
||||||
- [ ] Limpeza users E2E de teste
|
- [x] Limpeza users E2E de teste
|
||||||
- [ ] Integração automática Desk → FOSS order
|
- [ ] Integração automática Desk → FOSS order
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
Loading…
Reference in a new issue