Загрузка данных
ну в общем не помогло, как я ранее и писал, веб сокет подключение идет с connectonToken из negotiate
[INFO] 2026-10-13 19:41:09.247000 keycloak_clients.py Успешно получен access token
[INFO] 2026-10-13 19:41:09.456000 pytest_auth.py [AUTH] [OK] Получен x-user-id
[INFO] 2026-10-13 19:41:09.456000 pytest_auth.py [AUTH] Инициализация auth для dataset 'Real_73_tn3_39km_56'
[INFO] 2026-10-13 19:41:10.538000 lds_configurator_scenarios.py [SETUP] Получение ТУ 'ТН-3-Автотест-DATA-ABSENCE-FALSE' из Администрирования
[INFO] 2026-10-13 19:41:10.538000 lds_configurator_utils.py [LDS_CONFIGURATOR] Запрос списка ТУ в Администрировании - попытка 1 из 10
[INFO] 2026-10-13 19:41:11.435000 lds_configurator_utils.py [LDS_CONFIGURATOR] Поиск ТУ 'ТН-3-Автотест-DATA-ABSENCE-FALSE' по точному совпадению tuName в GetBasicInfoAdminResponse
[INFO] 2026-10-13 19:41:11.435000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: в ответе есть список ТУ
[INFO] 2026-10-13 19:41:11.435000 lds_configurator_utils.py [LDS_CONFIGURATOR] Валидация параметров ТУ 'ТН-3-Автотест-DATA-ABSENCE-FALSE' (tuId=3)
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: tuId и mnId заполнены
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: статус СОУ известен Администрированию
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_scenarios.py [SETUP] Найден целевой ТУ: tuId=3, tuName='ТН-3-Автотест-DATA-ABSENCE-FALSE', status=STOPPED (1) (СОУ выключена)
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_scenarios.py [SETUP] Список включённых ТУ на стенде: 0 шт. []
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_scenarios.py [SETUP] Холодный запуск СОУ (LaunchLdsRequest) для tuId=3
[INFO] 2026-10-13 19:41:11.436000 lds_configurator_utils.py [LDS_CONFIGURATOR] Команда /configurator/LaunchLds для tuId=3
[INFO] 2026-10-13 19:41:12.683000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: /configurator/LaunchLds завершился успешно (response.status_code=200)
[INFO] 2026-10-13 19:41:12.684000 lds_configurator_scenarios.py [SETUP] Ожидание включения СОУ в Администрировании
[INFO] 2026-10-13 19:41:12.684000 lds_configurator_utils.py [LDS_CONFIGURATOR] Ожидание статуса 'СОУ включена' в Администрировании (tuId=3, таймаут 120 с)
[INFO] 2026-10-13 19:41:12.832000 lds_configurator_scenarios.py [SETUP] Подтверждение наличия времени запуска (GetTusInformation)
[INFO] 2026-10-13 19:41:12.832000 lds_configurator_utils.py [LDS_CONFIGURATOR] Запрос GetTusInformation для tuId=3
[INFO] 2026-10-13 19:41:13.109000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: в ответе есть информация о запуске ТУ
[INFO] 2026-10-13 19:41:13.109000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка (GetTusInformation): Наличие времени запуска launchedAt: 2026-10-13 16:41:11.710835+00:00 для tuId=3
[INFO] 2026-10-13 19:41:13.110000 lds_configurator_scenarios.py [LDS_CONFIGURATOR] [SETUP] [OK] Запуск СОУ через Администрирование до старта имитатора. Успех!
[INFO] 2026-10-13 19:41:13.112000 subprocess_client.py [POPEN] выполняю команду: ssh [MASKED]@10.7.49.209 "dotnet /data/imitator/lds-flow-playground-csv-latest/TN.LDS.Flow.Playground.Application.dll --rules="/data/imitator/autotest_data/test_case_id_14_20261013T193745/rules.txt" --source="/data/imitator/autotest_data/test_case_id_14_20261013T193745/data" --sourceType="inflow" --sourceTagTypes="/data/imitator/autotest_data/test_case_id_14_20261013T193745/tags.txt" --startTime="20261013T193925" --stopTime="20261013T202825" --speed=1 --opcua="opc.tcp://VDC01-DISPLDS08.TN.TNGRP.RU:10521" --ns=2 --target="CHTNTEST4:""
[INFO] 2026-10-13 19:41:13.113000 imitator_manager.py [IMITATOR] [OK] Имитатор запущен успешно
[INFO] 2026-10-13 19:41:18.118000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "docker start lds-core-node1 lds-core-node2 lds-core-node3"
[INFO] 2026-10-13 19:41:22.206000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: docker start lds-core-node1 lds-core-node2 lds-core-node3
[INFO] 2026-10-13 19:41:22.207000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "docker inspect -f '{{.State.Status}}' lds-core-node1"
[INFO] 2026-10-13 19:41:22.765000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: docker inspect -f '{{.State.Status}}' lds-core-node1
[INFO] 2026-10-13 19:41:22.765000 docker_manager.py Статус контейнера: lds-core-node1 соответствует ожидаемому статусу: running
[INFO] 2026-10-13 19:41:22.765000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "docker inspect -f '{{.State.Status}}' lds-core-node2"
[INFO] 2026-10-13 19:41:23.271000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: docker inspect -f '{{.State.Status}}' lds-core-node2
[INFO] 2026-10-13 19:41:23.272000 docker_manager.py Статус контейнера: lds-core-node2 соответствует ожидаемому статусу: running
[INFO] 2026-10-13 19:41:23.272000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "docker inspect -f '{{.State.Status}}' lds-core-node3"
[INFO] 2026-10-13 19:41:23.751000 websocket_client.py [NEGOTIATE] POST /hubs/ldsClientHub/negotiate -> 200 (connectionId=C3Jv6sO89IXksZSORdbzzg, connectionToken=eJ2pKuzOfs8t0hurb1OUhQ)
[INFO] 2026-10-13 19:41:23.752000 websocket_client.py Попытка подключения по wss: wss://web-app.lds-test4.tn.tngrp.ru/lds-api-gateway/hubs/ldsClientHub/?token=...&xUserId=...&id=...
[INFO] 2026-10-13 19:41:23.803000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: docker inspect -f '{{.State.Status}}' lds-core-node3
[INFO] 2026-10-13 19:41:23.803000 docker_manager.py Статус контейнера: lds-core-node3 соответствует ожидаемому статусу: running
[INFO] 2026-10-13 19:41:23.804000 docker_manager.py [CONTAINERS] [OK] У всех контейнеров группы: lds-core Статус: running ожидаемый
[WARNING] 2026-10-13 19:41:24.061000 websocket_client.py WSS подключение не установлено (попытка 1, HTTP 404): server rejected WebSocket connection: HTTP 404. Повтор через 5.0 с, осталось 119 с
[INFO] 2026-10-13 19:41:29.360000 websocket_client.py [NEGOTIATE] POST /hubs/ldsClientHub/negotiate -> 200 (connectionId=LxFe6wIyT7TKr7xPZ8msEA, connectionToken=d7dgPhW2ygOaEHBvHmiigA)
[INFO] 2026-10-13 19:41:29.360000 websocket_client.py Попытка подключения по wss: wss://web-app.lds-test4.tn.tngrp.ru/lds-api-gateway/hubs/ldsClientHub/?token=...&xUserId=...&id=...
[WARNING] 2026-10-13 19:41:29.625000 websocket_client.py WSS подключение не установлено (попытка 2, HTTP 404): server rejected WebSocket connection: HTTP 404. Повтор через 5.0 с, осталось 113 с
[INFO] 2026-10-13 19:41:34.909000 websocket_client.py [NEGOTIATE] POST /hubs/ldsClientHub/negotiate -> 200 (connectionId=7Qt-E_r26iYPsDRMh_GURQ, connectionToken=JOdYINLFix21auMxk5Vuew)
[INFO] 2026-10-13 19:41:34.909000 websocket_client.py Попытка подключения по wss: wss://web-app.lds-test4.tn.tngrp.ru/lds-api-gateway/hubs/ldsClientHub/?token=...&xUserId=...&id=...
==================================== ERRORS ====================================
_ ERROR at setup of TestSuiteScenarios.test_lds_status_initialization[Real_73_tn3_39km_56] _
self = <clients.websocket_client.WebSocketClient object at 0x7f5037eadab0>
timeout = 120.0
async def _connect_loop(self, timeout: float = WS_Const.WS_CONNECT_TIMEOUT_SECONDS) -> None:
"""
Цикл подключения с повторными попытками до наступления stop_event
или истечения WS_CONNECT_TIMEOUT_SECONDS.
"""
deadline = time.monotonic() + timeout
attempt = 0
transient_errors = (ConnectionError, OSError, asyncio.TimeoutError, InvalidStatus)
while not self._stop_event.is_set():
attempt += 1
try:
connection_id = await self.negotiate()
self.ws_request = (
f"{self._ws_url}/?token={self._access_token}" f"&xUserId={self._x_user_id}&id={connection_id}"
)
logger.info(f"Попытка подключения по wss: {self._ws_url}/?token=...&xUserId=...&id=...")
> self._ws = await websockets.connect(
self.ws_request,
ping_interval=WS_Const.PING_INTERVAL,
ping_timeout=WS_Const.PING_TIMEOUT,
close_timeout=WS_Const.CLOSE_TIMEOUT,
)
clients/websocket_client.py:177:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.venv/lib/python3.10/site-packages/websockets/asyncio/client.py:543: in __await_impl__
await self.connection.handshake(
.venv/lib/python3.10/site-packages/websockets/asyncio/client.py:114: in handshake
raise self.protocol.handshake_exc
.venv/lib/python3.10/site-packages/websockets/client.py:325: in parse
self.process_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <websockets.client.ClientProtocol object at 0x7f503e5417e0>
response = Response(status_code=404, reason_phrase='Not Found', headers=Headers([('server', 'openresty/1.25.1.unknown'), ('date',...llow-methods', 'GET, DELETE, OPTIONS, POST, PUT')]), body=b'No Connection with that ID', _exception=InvalidStatus(...))
def process_response(self, response: Response) -> None:
"""
Check a handshake response.
Args:
request: WebSocket handshake response received from the server.
Raises:
InvalidHandshake: If the handshake response is invalid.
"""
if response.status_code != 101:
> raise InvalidStatus(response)
E websockets.exceptions.InvalidStatus: server rejected WebSocket connection: HTTP 404
.venv/lib/python3.10/site-packages/websockets/client.py:142: InvalidStatus
The above exception was the direct cause of the following exception:
request = <SubRequest 'ws_client' for <Coroutine test_lds_status_initialization[Real_73_tn3_39km_56]>>
kwargs = {}, func = <function ws_client at 0x7f503eba4280>
event_loop_fixture_id = '_session_event_loop'
setup = <function _wrap_asyncgen_fixture.<locals>._asyncgen_fixture_wrapper.<locals>.setup at 0x7f503e89a0e0>
setup_task = <Task finished name='Task-10' coro=<_wrap_asyncgen_fixture.<locals>._asyncgen_fixture_wrapper.<locals>.setup() done, d...9> exception=TimeoutError('WSS hub не готов за 120.0 с (попыток: 21): server rejected WebSocket connection: HTTP 404')>
@functools.wraps(fixture)
def _asyncgen_fixture_wrapper(request: FixtureRequest, **kwargs: Any):
func = _perhaps_rebind_fixture_func(fixture, request.instance)
event_loop_fixture_id = _get_event_loop_fixture_id_for_async_fixture(
request, func
)
event_loop = request.getfixturevalue(event_loop_fixture_id)
kwargs.pop(event_loop_fixture_id, None)
gen_obj = func(**_add_kwargs(func, kwargs, event_loop, request))
async def setup():
res = await gen_obj.__anext__() # type: ignore[union-attr]
return res
context = contextvars.copy_context()
setup_task = _create_task_in_context(event_loop, setup(), context)
> result = event_loop.run_until_complete(setup_task)
.venv/lib/python3.10/site-packages/pytest_asyncio/plugin.py:345:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.10/asyncio/base_events.py:649: in run_until_complete
return future.result()
.venv/lib/python3.10/site-packages/pytest_asyncio/plugin.py:340: in setup
res = await gen_obj.__anext__() # type: ignore[union-attr]
conftest.py:946: in ws_client
async with client:
clients/websocket_client.py:91: in __aenter__
await self._connect_loop()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <clients.websocket_client.WebSocketClient object at 0x7f5037eadab0>
timeout = 120.0
async def _connect_loop(self, timeout: float = WS_Const.WS_CONNECT_TIMEOUT_SECONDS) -> None:
"""
Цикл подключения с повторными попытками до наступления stop_event
или истечения WS_CONNECT_TIMEOUT_SECONDS.
"""
deadline = time.monotonic() + timeout
attempt = 0
transient_errors = (ConnectionError, OSError, asyncio.TimeoutError, InvalidStatus)
while not self._stop_event.is_set():
attempt += 1
try:
connection_id = await self.negotiate()
self.ws_request = (
f"{self._ws_url}/?token={self._access_token}" f"&xUserId={self._x_user_id}&id={connection_id}"
)
logger.info(f"Попытка подключения по wss: {self._ws_url}/?token=...&xUserId=...&id=...")
self._ws = await websockets.connect(
self.ws_request,
ping_interval=WS_Const.PING_INTERVAL,
ping_timeout=WS_Const.PING_TIMEOUT,
close_timeout=WS_Const.CLOSE_TIMEOUT,
)
# Handshake
await self._handshake()
# Запускаем приём и SignalR keepalive в фоне
self._recv_task = asyncio.create_task(self._recv_loop())
self._ping_task = asyncio.create_task(self._ping_loop())
logger.info("Websocket connected")
return
except transient_errors as exc:
remaining = deadline - time.monotonic()
if remaining <= 0:
> raise TimeoutError(
f"WSS hub не готов за {WS_Const.WS_CONNECT_TIMEOUT_SECONDS} с " f"(попыток: {attempt}): {exc}"
) from exc
E TimeoutError: WSS hub не готов за 120.0 с (попыток: 21): server rejected WebSocket connection: HTTP 404
clients/websocket_client.py:193: TimeoutError
------------------------------ Captured log setup ------------------------------
.....
[ERROR] 2026-10-13 19:43:24.916000 conftest.py [SETUP] [ERROR] LDS Configurator проверка после запуска ядра: WSS hub не готов за 120.0 с (попыток: 23): server rejected WebSocket connection: HTTP 404
[INFO] 2026-10-13 19:43:24.917000 conftest.py [TEARDOWN] LDS Configurator очистка после ошибки setup набора
[INFO] 2026-10-13 19:43:24.917000 lds_configurator_scenarios.py [TEARDOWN] Проверка статуса СОУ (tuId=3, «ТН-3-Автотест-DATA-ABSENCE-FALSE»)
[INFO] 2026-10-13 19:43:24.918000 lds_configurator_utils.py [LDS_CONFIGURATOR] Запрос списка ТУ в Администрировании - попытка 1 из 10
[INFO] 2026-10-13 19:43:25.224000 lds_configurator_scenarios.py [TEARDOWN] Остановка СОУ (StopLdsRequest) для tuId=3
[INFO] 2026-10-13 19:43:25.224000 lds_configurator_utils.py [LDS_CONFIGURATOR] Команда /configurator/StopLds для tuId=3
[INFO] 2026-10-13 19:43:26.390000 lds_configurator_utils.py [LDS_CONFIGURATOR] Проверка: /configurator/StopLds завершился успешно (response.status_code=200)
[INFO] 2026-10-13 19:43:26.390000 lds_configurator_scenarios.py [TEARDOWN] Ожидание выключения СОУ в Администрировании
[INFO] 2026-10-13 19:43:26.391000 lds_configurator_utils.py [LDS_CONFIGURATOR] Ожидание статуса 'СОУ выключена' в Администрировании (tuId=3, таймаут 120 с)
[INFO] 2026-10-13 19:43:26.535000 lds_configurator_scenarios.py [LDS_CONFIGURATOR] [TEARDOWN] [OK] Восстановление ТУ. Успех!
[INFO] 2026-10-13 19:43:26.536000 stand_setup_manager.py [TEARDOWN] [OK] OPC SSH-туннель закрыт
[INFO] 2026-10-13 19:43:26.537000 stand_setup_manager.py [TEARDOWN] [INFO] Запуск graceful termination имитатора
[INFO] 2026-10-13 19:43:26.537000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "pgrep -f Playground"
[INFO] 2026-10-13 19:43:27.032000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: pgrep -f Playground
[WARNING] 2026-10-13 19:43:27.033000 imitator_manager.py [IMITATOR] [WARNING] Имитатор не остановлен! PID: 2467698
[INFO] 2026-10-13 19:43:27.033000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "pkill -f Playground"
[INFO] 2026-10-13 19:43:27.507000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: pkill -f Playground
[INFO] 2026-10-13 19:43:27.507000 imitator_manager.py [IMITATOR] [OK] Имитатор остановлен успешно
[INFO] 2026-10-13 19:43:27.507000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "pgrep -f Playground"
[INFO] 2026-10-13 19:43:27.957000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: pgrep -f Playground
[INFO] 2026-10-13 19:43:27.957000 imitator_manager.py [IMITATOR] [OK] Имитатор остановлен успешно
[INFO] 2026-10-13 19:43:27.957000 stand_setup_manager.py [TEARDOWN] [OK] Имитатор остановлен
[INFO] 2026-10-13 19:43:27.958000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "rm -rf /data/imitator/autotest_data/test_case_id_14_20261013T193745"
[INFO] 2026-10-13 19:43:28.630000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: rm -rf /data/imitator/autotest_data/test_case_id_14_20261013T193745
[INFO] 2026-10-13 19:43:28.631000 subprocess_client.py [RUN] Выполняю команду: ssh [MASKED]@10.7.49.209 "if [ -d '/data/imitator/autotest_data/test_case_id_14_20261013T193745/data' ] && [ -f '/data/imitator/autotest_data/test_case_id_14_20261013T193745/rules.txt' ] && [ -f '
[INFO] 2026-10-13 19:43:29.060000 subprocess_client.py [RUN] [OK] Команда выполнена успешно: if [ -d '/data/imitator/autotest_data/test_case_id_14_20261013T193745/data' ] && [ -f '/data/imitator/autotest_data/test_case_id_14_20261013T193745/rules.txt' ] && [ -f '/data/imitator/autotest_data/t
[INFO] 2026-10-13 19:43:29.061000 imitator_data_uploader.py [DATA UPLOADER] [OK] Тестовые данные успешно удалены с удаленного сервера: 10.7.49.209
SKIPPED (Набор пропущен: ошибка подготовки инфраструктуры)
tests/test_smoke.py::TestSuiteScenarios::test_journal_info[Real_73_tn3_39km_56] SKIPPED
tests/test_smoke.py::TestSuiteScenarios::test_lds_status_initialization[Real_73_tn3_39km_56]
-------------------------------- live log setup --------------------------------