╔══════════════════════════════════════════════════╗
║ SQS Operator Test Suite v2.0 ║
║ 2026-04-07 18:33:37 ║
╚══════════════════════════════════════════════════╝
Tenant: test001 AK: SQSAK-test001-ae4dc8
Endpoint: https://sqs.kube5s.ru/sqs/test001
QS test001:
══════════════════════════════════════════════════
PHASE 0 — Provisioning Timing (новый тенант с нуля)
══════════════════════════════════════════════════
Тенант: timing-ts CR: test-tenant-timing-ts
Очищаем если остался от прошлого прогона...
namespace "sless-fn-timing-ts" deleted
Создаём QueueService...
queueservice.sqs.kube5s.ru/test-tenant-timing-ts created
[18:33:43] Apply complete, watching phases...
[18:34:16] Phase appeared: (+33s от apply)
[18:35:22] Phase: (+99s от apply)
❌ FAIL[P01_Phase_Ready]: timeout/error: timeout:Failed
❌ FAIL[P02_API_Ready]: API не ответил за 280s
─── Timing Summary ───────────────────────
apply → CR exists: 33s
apply → Phase=Ready: 280s
apply → первый API ответ: 280s
──────────────────────────────────────────
Ресурсы нового тенанта (kubectl top):
[metrics-server недоступен]
Оператор:
[metrics-server недоступен]
Удаляем timing-тенант...
queueservice.sqs.kube5s.ru "test-tenant-timing-ts" deleted from sqs-operator-system namespace
══════════════════════════════════════════════════
PHASE 1 — Базовые операции (T01–T11)
══════════════════════════════════════════════════
--- T01 ListQueues
✅ PASS[T01]
--- T02 CreateQueue
✅ PASS[T02 (https://sqs.kube5s.ru:443/sqs/test001/test001/t-basic)]
--- T03 CreateQueue idempotent
✅ PASS[T03]
--- T04 GetQueueUrl
✅ PASS[T04]
--- T05 SendMessage
✅ PASS[T05 (id=0cb35a74-c270-454e-b32e-ba1c510db024)]
--- T06 ReceiveMessage
✅ PASS[T06 (body=hello-world)]
--- T07 DeleteMessage
✅ PASS[T07]
--- T08 ReceiveMessage == empty after delete
✅ PASS[T08]
--- T09 GetQueueAttributes
✅ PASS[T09]
--- T10 SetQueueAttributes
✅ PASS[T10]
--- T11 DeleteQueue
✅ PASS[T11]
══════════════════════════════════════════════════
PHASE 2 — Ошибочные параметры (E01–E09)
══════════════════════════════════════════════════
--- E01 CreateQueue invalid name
✅ PASS[E01]
--- E02 VisibilityTimeout > 43200
⚠️ WARN[E02]: accepted oversize timeout:
00000000-0000-0000-0000-000000000000
--- E03 ReceiveMessage non-existent
✅ PASS[E03]
--- E04 DeleteMessage invalid receipt
✅ PASS[E04]
--- E05 GetQueueUrl non-existent
✅ PASS[E05]
--- E06 DeleteMessage double-delete
✅ PASS[E06 (double-delete handled)]
--- E07 Wrong credentials (WONTFIX: ElasticMQ не верифицирует SigV4)
⏭️ SKIP[E07]: WONTFIX: изоляция через Keycloak в проде (не через SigV4)
--- E08 SendMessage empty body
✅ PASS[E08]
--- E09 SendMessage 300KB oversized
/home/naeel/terra/sless/sqs-operator/test_v2_suite.sh: line 392: /usr/bin/curl: Argument list too long
⚠️ WARN[E09]: oversized принято
══════════════════════════════════════════════════
PHASE 3 — Продвинутые фичи (A01–A09)
══════════════════════════════════════════════════
--- A01 VisibilityTimeout (5s return)
Взяли: 'purge1', ждём 6с...
❌ FAIL[A01]: не вернулось: 'purge2'
--- A02 ChangeMessageVisibility → 0
✅ PASS[A02]
--- A03 SendMessageBatch 10
✅ PASS[A03 (sent=10)]
--- A04 ReceiveMessageBatch MaxNumberOfMessages=10
✅ PASS[A04 (recv=10)]
--- A05 DeleteMessageBatch
✅ PASS[A05 (deleted=10)]
--- A06 Long polling 3s
⚠️ WARN[A06]: слишком быстро: 0s
--- A07 MessageAttributes
⚠️ WARN[A07]: атрибуты не вернулись
--- A08 PurgeQueue
✅ PASS[A08]
Сообщений после Purge: 0
--- A09 Dead Letter Queue
DLQ ARN: arn:aws:sqs:ru-msk-1:test001:t-dlq
✅ PASS[A09]
══════════════════════════════════════════════════
PHASE 4 — Multi-tenant изоляция (MT01–MT05)
══════════════════════════════════════════════════
--- MT01 Создаём QueueService test002
queueservice.sqs.kube5s.ru/test-tenant-002 created
Ждём Ready (до 120с)...
✅ PASS[MT01 (tenant002 Ready за 31s)]
✅ PASS[MT01b creds OK (AK2=SQSAK-test002-525921)]
--- MT02 Одинаковое имя → разные URL
T1: https://sqs.kube5s.ru:443/sqs/test001/test001/shared-q
T2: https://sqs.kube5s.ru:443/sqs/test002/test002/shared-q
✅ PASS[MT02]
--- MT03 Cross-tenant message isolation [WONTFIX/Keycloak]
✅ PASS[MT03 (tenant002 не прочитал сообщение tenant001)]
--- MT04 Операции tenant002 независимы
✅ PASS[MT04 (tenant002 работает независимо)]
--- MT05 Удаляем tenant002, ресурсы должны исчезнуть
queueservice.sqs.kube5s.ru "test-tenant-002" deleted from sqs-operator-system namespace
Ждём удаления namespace sless-fn-test002 (до 30с)...
⚠️ WARN[MT05]: namespace ещё существует: namespace/sless-fn-test002
══════════════════════════════════════════════════
PHASE 5 — Self-Healing (SH01–SH06)
══════════════════════════════════════════════════
Текущие ресурсы test001:
pod/sqs-test001-84d46d5dcf-nngrp
service/sqs-svc-test001
deployment.apps/sqs-test001
replicaset.apps/sqs-test001-84d46d5dcf
--- SH01 Delete Deployment → auto-recreate
deployment.apps "sqs-test001" deleted from sless-fn-test001 namespace
Ждём пересоздания pod...
✅ PASS[SH01 Deployment восстановлен за 48s]
--- SH02 Delete Service → auto-recreate (v0.1.5 fix)
service "sqs-svc-test001" deleted from sless-fn-test001 namespace
✅ PASS[SH02 Service восстановлен за 2s]
--- SH03 Delete ConfigMap → auto-recreate (v0.1.5 fix)
configmap "sqs-cfg-test001" deleted from sless-fn-test001 namespace
✅ PASS[SH03 ConfigMap восстановлен за 4s]
--- SH04 Delete Ingress → auto-recreate with auth-snippet
ingress.networking.k8s.io "sqs-ing-test001" deleted from sless-fn-test001 namespace
✅ PASS[SH04 Ingress восстановлен за 2s]
⚠️ WARN[SH04b]: auth-snippet отсутствует в Ingress (nginx-controller блокирует snippets?)
--- SH05 Удаляем Service+ConfigMap+Ingress одновременно
service "sqs-svc-test001" deleted from sless-fn-test001 namespace
Ждём восстановления всех трёх ресурсов...
✅ PASS[SH05 Все ресурсы восстановлены за 2s]
--- SH06 API доступен после self-healing
Ждём pod Ready после всех манипуляций...
pod/sqs-test001-84d46d5dcf-7b4s4 condition met
✅ PASS[SH06 SQS API доступен (Phase=)]
Self-Healing recovery times:
SH01 Deployment: 48s
SH02 Service: 2s
SH03 ConfigMap: 4s
SH04 Ingress: 2s
SH05 All-3: 2s
══════════════════════════════════════════════════
PHASE 6 — Ресурсы
══════════════════════════════════════════════════
--- R01 kubectl top: ElasticMQ pod (test001)
[metrics-server недоступен]
--- R02 kubectl top: Operator pod
[metrics-server недоступен]
--- R03 Limits/Requests ElasticMQ container
elasticmq {"limits":{"cpu":"500m","memory":"256Mi"},"requests":{"cpu":"10m","memory":"128Mi"}}
✅ PASS[R03]
--- R04 PVC usage
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
sqs-data-test001 Bound pvc-008275fa-cb0e-409c-977d-23d1f156ff86 512Mi RWO local-path 3h58m
✅ PASS[R04 PVC Bound]
--- R05 QueueService Spec
✅ PASS[R05]
══════════════════════════════════════════════════
PHASE 7 — Concurrent load (параллельные запросы)
══════════════════════════════════════════════════
--- CL01 10 параллельных SendMessage
0d47a9e731a0fb0f22fd2e896efd914e
655961ac-fda6-4d4a-beba-447f4f1a0aff
00000000-0000-0000-0000-000000000000
5961eae6bda74d3ee8b2febe6ab93fac
a4f17a7b-7b27-4225-a345-4fc312422794
00000000-0000-0000-0000-000000000000
0969ec5135d74643ca08fb852239500a
58707b2f-0f9f-4f10-92a2-1b061df71e3f
00000000-0000-0000-0000-000000000000
98ab682f9eee5bac6468b50121fd8437
f8e903a5-80e4-490b-bf13-ac19053cb8af
00000000-0000-0000-0000-000000000000
ad1f7b79b6f7dde21f9b4f03304f969c
35f6ad93-e201-4944-a3c3-b9b6facfcfbf
00000000-0000-0000-0000-000000000000
56ba32f49f0a5a89d0ba5d227a0eebc7
fb75e01d-7f96-4f49-8813-e16a020c16d8
00000000-0000-0000-0000-000000000000
2c18cb91c24e7d90a5a06f74038640b1
a333ec73-fc6a-466d-94bb-446b21f6caf0
00000000-0000-0000-0000-000000000000
9586b8866255703a8a33beee866b14e9
0408c416-a83e-41a4-b202-2bc5c3d3b65d
00000000-0000-0000-0000-000000000000
ac43a05d51587e6b367dce5cd588ed68
6fb7041e-0a3e-46cb-a5a2-9cfd5529e337
00000000-0000-0000-0000-000000000000
ec2927ca5e5e0cc652b49f5b4c5b88e9
cff757c8-fca1-4f14-92eb-3840a1cf26e4
00000000-0000-0000-0000-000000000000
Отправлено 10 за 1s, в очереди: 10
✅ PASS[CL01 (в очереди=10 /expected=10)]
--- CL02 5 параллельных ReceiveMessage
Получили сообщений за 1s: 5
✅ PASS[CL02 (recv=5/5)]
--- CL03 Race: Одновременный send+receive (RPS throughput)
✅ PASS[CL03 система живая после concurrent send/recv (3s)]
Throughput estimates (crude):
SendMessage RPS: ~10/s (1s для 10 req)
══════════════════════════════════════════════════
PHASE 8 — Стресс-марафон 30 минут
══════════════════════════════════════════════════
Старт: 18:41:08
Конец: 19:11:08
Паттерны: normal-send, batch-send, batch-receive, batch-delete, purge, error-injection, attrs
[01:00 | iter=298 ] send=298 recv=245 del=245 err_infra=0 err_sqs=42 | q: α=1 β=71 | restarts=0 phase=
[02:00 | iter=667 ] send=667 recv=560 del=560 err_infra=0 err_sqs=95 | q: α=0 β=45 | restarts=0 phase=
[03:00 | iter=1091] send=854 recv=717 del=717 err_infra=297 err_sqs=155 | q: α= β= | restarts=1 phase=
[04:00 | iter=1381] send=1083 recv=922 del=922 err_infra=373 err_sqs=197 | q: α=5 β=55 | restarts=1 phase=
[05:00 | iter=1736] send=1438 recv=1221 del=1221 err_infra=373 err_sqs=248 | q: α=0 β=28 | restarts=1 phase=
--- Resource snapshot [5min] ---
[metrics-server недоступен]
[06:00 | iter=2116] send=1818 recv=1545 del=1545 err_infra=373 err_sqs=302 | q: α=0 β=12 | restarts=1 phase=
[07:00 | iter=2522] send=2224 recv=1887 del=1887 err_infra=373 err_sqs=360 | q: α=5 β=12 | restarts=1 phase=
[08:00 | iter=2911] send=2613 recv=2219 del=2219 err_infra=373 err_sqs=415 | q: α=5 β=9 | restarts=1 phase=
[09:00 | iter=3321] send=3023 recv=2562 del=2562 err_infra=373 err_sqs=474 | q: α=0 β=12 | restarts=1 phase=
[10:00 | iter=3739] send=3441 recv=2917 del=2917 err_infra=373 err_sqs=534 | q: α=0 β=24 | restarts=1 phase=
--- Resource snapshot [10min] ---
[metrics-server недоступен]
[11:00 | iter=4159] send=3861 recv=3274 del=3274 err_infra=373 err_sqs=594 | q: α=1 β=42 | restarts=1 phase=
[12:00 | iter=4592] send=4294 recv=3637 del=3637 err_infra=373 err_sqs=656 | q: α=5 β=64 | restarts=1 phase=
[13:00 | iter=5020] send=4722 recv=4003 del=4003 err_infra=373 err_sqs=717 | q: α=0 β=18 | restarts=1 phase=
[14:00 | iter=5446] send=5148 recv=4362 del=4362 err_infra=373 err_sqs=778 | q: α=1 β=33 | restarts=1 phase=
[15:00 | iter=5873] send=5575 recv=4722 del=4722 err_infra=373 err_sqs=839 | q: α=0 β=46 | restarts=1 phase=
--- Resource snapshot [15min] ---
[metrics-server недоступен]
[16:00 | iter=6267] send=5969 recv=5056 del=5056 err_infra=373 err_sqs=895 | q: α=0 β=49 | restarts=1 phase=
[17:03 | iter=6692] send=6394 recv=5414 del=5414 err_infra=373 err_sqs=956 | q: α=5 β=64 | restarts=1 phase=
[18:03 | iter=7096] send=6798 recv=5759 del=5759 err_infra=373 err_sqs=1013 | q: α=1 β=65 | restarts=1 phase=
[19:03 | iter=7504] send=7206 recv=6103 del=6103 err_infra=373 err_sqs=1072 | q: α=0 β=2 | restarts=1 phase=
[20:03 | iter=7931] send=7633 recv=6463 del=6463 err_infra=373 err_sqs=1133 | q: α=0 β=21 | restarts=1 phase=
--- Resource snapshot [20min] ---
[metrics-server недоступен]
[21:03 | iter=8385] send=7931 recv=6717 del=6717 err_infra=569 err_sqs=1197 | q: α= β= | restarts=2 phase=
[22:03 | iter=8674] send=8072 recv=6969 del=6969 err_infra=753 err_sqs=1239 | q: α=0 β=53 | restarts=2 phase=
[23:03 | iter=9016] send=8414 recv=7254 del=7254 err_infra=753 err_sqs=1288 | q: α=0 β=11 | restarts=2 phase=
[24:03 | iter=9400] send=8798 recv=7578 del=7578 err_infra=753 err_sqs=1342 | q: α=0 β=0 | restarts=2 phase=
[25:03 | iter=9801] send=9199 recv=7919 del=7919 err_infra=753 err_sqs=1400 | q: α=1 β=0 | restarts=2 phase=
--- Resource snapshot [25min] ---
[metrics-server недоступен]
[26:03 | iter=10208] send=9606 recv=8259 del=8259 err_infra=753 err_sqs=1458 | q: α=0 β=3 | restarts=2 phase=
[27:03 | iter=10630] send=10028 recv=8618 del=8618 err_infra=753 err_sqs=1518 | q: α=0 β=21 | restarts=2 phase=
[28:03 | iter=11026] send=10424 recv=8957 del=8957 err_infra=753 err_sqs=1575 | q: α=0 β=20 | restarts=2 phase=
[29:03 | iter=11432] send=10830 recv=9294 del=9294 err_infra=753 err_sqs=1633 | q: α=5 β=22 | restarts=2 phase=
─── Marathon Summary ─────────────────────
Итераций: 11815
Sent: 11213
Received: 9618
Deleted: 9618
Infra errors:753
SQS errors: 1687 (намеренные)
──────────────────────────────────────────
Финальные ресурсы после марафона:
[metrics-server недоступен]
Operator:
[metrics-server недоступен]
ElasticMQ pod restarts за тест: 2
❌ FAIL[ST01]: Marathon: 753/11815 ошибок (6%)
⚠️ WARN[ST02]: Pod перезапускался 2 раз
══════════════════════════════════════════════════
ИТОГОВЫЙ ОТЧЁТ
══════════════════════════════════════════════════
Завершено: 2026-04-07 19:11:08
Длительность: 2251s (37min 31sec)
✅ PASS: 40
❌ FAIL: 4
⚠️ WARN: 7
⏭️ SKIP: 1
TOTAL: 52
Провалившиеся тесты:
- P01_Phase_Ready: timeout/error: timeout:Failed
- P02_API_Ready: API не ответил за 280s
- A01: не вернулось: 'purge2'
- ST01: Marathon: 753/11815 ошибок (6%)
Предупреждения:
- E02: accepted oversize timeout:
00000000-0000-0000-0000-000000000000
- E09: oversized принято
- A06: слишком быстро: 0s
- A07: атрибуты не вернулись
- MT05: namespace ещё существует: namespace/sless-fn-test002
- SH04b: auth-snippet отсутствует в Ingress (nginx-controller блокирует snippets?)
- ST02: Pod перезапускался 2 раз
╔══════════════════════════════════════════════════╗
║ ❌ ЕСТЬ ПРОВАЛЫ ║
╚══════════════════════════════════════════════════╝