fix: MQTTAuth device lookup by Spec.DeviceID + PG15+ GRANT (v0.2.5)
- MQTTAuth: replaced Get(Name=deviceID) with List+filter by Spec.DeviceID (K8s object name != deviceID — caused deny for all devices) - EnsureTenantDB: added GRANT role TO CURRENT_USER before CREATE DATABASE OWNER (PG15+ requires SET ROLE privileges for target owner) - Image: naeel/iot-operator:v0.2.5 - E2E test passed: device create → MQTT publish → SQS → Postgres → REST API
This commit is contained in:
@@ -122,3 +122,18 @@
|
||||
- [x] doc/architecture/current-v0.2.3.md — актуальная архитектура (без Kafka/RabbitMQ)
|
||||
- [x] doc/api/endpoints-v0.2.3.md — все API эндпоинты с примерами запросов/ответов
|
||||
- [x] doc/run-and-test.md — как запустить и протестировать E2E
|
||||
|
||||
## 2026-04-12 — v0.2.5: баг-фиксы и E2E тест
|
||||
|
||||
### Найдены и исправлены баги:
|
||||
1. **MQTTAuth: Get по Name=deviceID** — заменено на List + фильтр по Spec.DeviceID
|
||||
2. **PG15+ GRANT**: добавлен `GRANT role TO CURRENT_USER` перед `CREATE DATABASE ... OWNER`
|
||||
|
||||
### E2E тест пройден:
|
||||
- Устройство создано через REST API (201)
|
||||
- MQTT CONNECT + PUBLISH через EMQX — OK
|
||||
- mqtt-bridge → SQS forwarding — OK
|
||||
- sqs-consumer → Postgres (tenant DB created + telemetry saved) — OK
|
||||
- REST API GET /telemetry — 2 записи с payload
|
||||
|
||||
### Docker Hub: `naeel/iot-operator:v0.2.5`
|
||||
|
||||
@@ -205,3 +205,35 @@ E2E тест: создать устройство → MQTT publish → пров
|
||||
|
||||
### Осталось
|
||||
- git commit + push
|
||||
|
||||
---
|
||||
|
||||
## Агент: GitHub Copilot (Claude Opus 4.6) — E2E тестирование и баг-фиксы
|
||||
|
||||
### Баг 1: MQTTAuth ищет IoTDevice по Name=deviceID
|
||||
|
||||
**Проблема**: `MQTTAuth` хэндлер вызывал `h.K8s.Get(client.ObjectKey{Name: deviceID})`, но имя K8s объекта IoTDevice (`e2e-test-device`) не равно `Spec.DeviceID` (`e2e-test-01`). Результат — `deny`.
|
||||
|
||||
**Диагностика**:
|
||||
1. Auth endpoint вернул `{"result":"deny"}` при прямом вызове curl
|
||||
2. Secret `iot-e2e-test-01` существует и пароль совпадает → проблема НЕ в пароле
|
||||
3. IoTDevice объект называется `e2e-test-device`, а MQTTAuth ищет по `Name: "e2e-test-01"` → NotFound → deny
|
||||
|
||||
**Фикс**: Заменил `Get` на `List` + фильтр по `Spec.DeviceID == deviceID`. Это O(n) по количеству устройств в namespace, но для MVP приемлемо. При необходимости можно добавить label-index.
|
||||
|
||||
### Баг 2: PG15+ требует GRANT перед CREATE DATABASE ... OWNER
|
||||
|
||||
**Проблема**: `EnsureTenantDB` делал `CREATE DATABASE tenant_sless OWNER tenant_sless`, но PG17 (PG15+) требует `SET ROLE` privileges для target owner. Ошибка: `pq: must be able to SET ROLE "tenant_sless" (42501)`.
|
||||
|
||||
**Фикс**: Добавил `GRANT {userName} TO CURRENT_USER` перед `CREATE DATABASE ... OWNER`.
|
||||
|
||||
### E2E тест v0.2.5 — полный пайплайн
|
||||
|
||||
1. `POST /v1/namespaces/sless/iot/devices` → 201, device created
|
||||
2. `GET /devices/e2e-test-device` → phase=Active, credentials получены
|
||||
3. `mosquitto_pub` → CONNACK(0), PUBLISH OK
|
||||
4. mqtt-bridge → `forwarded IoT telemetry to SQS`
|
||||
5. sqs-consumer → `created tenant DB` + `telemetry saved to Postgres`
|
||||
6. `GET /v1/namespaces/sless/iot/telemetry?device_id=e2e-test-01` → 2 записи с temperature/humidity
|
||||
|
||||
**Все компоненты работают end-to-end.**
|
||||
|
||||
Reference in New Issue
Block a user