diff --git a/HISTORY/2026-10-11-session-log.md b/HISTORY/2026-10-11-session-log.md index 37f7fe4..74b2e6a 100644 --- a/HISTORY/2026-10-11-session-log.md +++ b/HISTORY/2026-10-11-session-log.md @@ -177,3 +177,31 @@ jlib.k8s [correctReplicaActive] | Под(ы) не работают: 'containerk8 Осталось (не блокеры): end-to-end телеметрия (устройство → MQTT → SQS → per-tenant PG), домен EMQX `wss://exqx-iot/mqtt` для внешних устройств, Terraform на PROD. + +## 8. E2E-тест телеметрии — ✅ ПРОЙДЕН (2026-10-11) + +Проверен полный путь снаружи кластера: HTTP API → MQTT (`wss`) → EMQX → bridge → SQS → +consumer → per-tenant PostgreSQL → HTTP API. + +1. **Устройство через API** (`/tmp/e2e_api.py`, PyJWT HS256 `sub=`): + `POST /v1/namespaces/e2e-nubes/iot/devices {"name":"dev1","device_id":"d-01"}` → **201**, + выданы `mqtt_username=e2e-nubes_d-01`, `mqtt_password=347425f2…753e`, + `telemetry_topic=e2e-nubes/telemetry/d-01`. + ⚠ `GET …/devices/dev1` пароль НЕ возвращает (как и задокументировано ранее). +2. **Публикация через внешний MQTT** `wss://exqx-iot.containerk8s.dev.nubes.ru/mqtt` + (`/tmp/e2e_mqtt.py`; MQTT-over-WS написан вручную на stdlib — локально нет + paho/websockets): `HTTP/1.1 101 Switching Protocols` → **`CONNACK rc=0`** + (auth прошёл: bcrypt-хеш сверен EMQX напрямую с `iot_devices`) → `PUBLISH + e2e-nubes/telemetry/d-01 {"temp":21.5,…}`. + ACL: разрешён только свой топик — публикация в него не отклонена. +3. **Доставка**: лог iot-service — `iotpg: created tenant DB namespace=e2e-nubes + db=tenant_e2e_nubes`; в `iotdb` появилась строка `e2e-nubes/dev1 (d-01)`. +4. **Чтение**: `GET /v1/namespaces/e2e-nubes/iot/telemetry?device_id=d-01` → **200** + `{"count":1,"items":[{"id":1,"device_id":"d-01","payload":{"ts":1791737028, + "src":"e2e-manual","temp":21.5}}]}`; в PG `tenant_e2e_nubes.iot_telemetry` — + 1 строка, `payload` совпадает побайтово, `message_id=30cf2047a060…` (SHA256-дедуп). + +Следствия: внешний MQTT-домен EMQX годится для устройств; SQS-креды, PG-DSN, ACL и +дедуп работают. Тестовые артефакты: устройство `e2e-nubes/dev1`, БД `tenant_e2e_nubes`. + +Осталось (не блокеры): Terraform на PROD; чистка тестовых артефактов e2e (по команде).