Загрузка данных
лдс конф утилс
from constants.test_constants import LdsConfiguratorConstants as LdsCfgConst
from models.basic_info_model import BasicInfoReply, BasicTUInfo
allure.attach(message, name="ALERT", attachment_type=allure.attachment_type.TEXT)
async def get_basic_info(ws_client: WebSocketClient, parser: WsMessageParser) -> BasicInfoReply:
"""
Выполняет getBasicInfoRequest и парсит ответ BasicInfoContent.
"""
payload = await t_utils.connect_and_get_msg(ws_client, LdsCfgConst.GET_BASIC_INFO_REQUEST, [])
return parser.parse_basic_info_msg(payload)
def is_tu_in_basic_info(tus: Optional[list[BasicTUInfo]], tu_id: int, tu_name: str) -> bool:
"""True, если в basicInfo.tus есть запись с указанными tuId и tuName."""
return any(tu.tuId == tu_id and tu.tuName == tu_name for tu in (tus or []))
def check_sou_status_sync(
sou_status: SouAdminStatus,
is_in_basic_info: bool,
is_on_main_page: bool,
tu_id: int,
tu_name: str,
) -> None:
"""
Сверяет статус СОУ в Администрировании и на ЭФ Состояние МТ по двум DTO BasicInfo и MainPageInfoContent.
"""
with _step(
f"Сверка статуса СОУ: Администрирование vs Состояние МТ "
f"(tuId={tu_id}, '{tu_name}')"
):
expected_enabled = sou_status == SouAdminStatus.RUNNING
with _step("Проверка согласованности статусов Администрирования и Состояния МТ"):
if is_in_basic_info == expected_enabled and is_on_main_page == expected_enabled:
return
admin_text = SouAdminStatus.report_text_by_value(sou_status.value)
basic_text = "СОУ запущена" if is_in_basic_info else "СОУ не запущена"
page_text = "СОУ запущена" if is_on_main_page else "СОУ не запущена"
fail(
f"Рассинхронизация для ТУ '{tu_name}' (tuId={tu_id}): "
f"Администрирование - {admin_text} ({sou_status.value}); "
f"Состояние МТ в BasicInfo - {basic_text}; "
f"Состояние МТ в MainPageInfoContent - {page_text}. "
f"Статусы в разных подписках не совпадают.",
pytrace=False,
)
async def poll_basic_info_tu_presence(
ws_client: WebSocketClient,
parser: WsMessageParser,
tu_id: int,
tu_name: str,
expect_present: bool,
total_wait_seconds: float = LdsCfgConst.POLL_TIMEOUT_SECONDS,
poll_interval_seconds: float = LdsCfgConst.POLL_INTERVAL_SECONDS,
) -> bool:
"""
Long-poll getBasicInfoRequest: ожидание появления или исчезновения ТУ в basicInfo.tus.
"""
action = "появления" if expect_present else "исчезновения"
with _step(
f"Ожидание {action} ТУ в BasicInfo "
f"(tuId={tu_id}, tuName='{tu_name}', таймаут {int(total_wait_seconds)} с)"
):
deadline = asyncio.get_running_loop().time() + total_wait_seconds
while asyncio.get_running_loop().time() < deadline:
reply = await get_basic_info(ws_client, parser)
tus = reply.replyContent.basicInfo.tus if reply.replyContent else None
found = is_tu_in_basic_info(tus, tu_id, tu_name)
if expect_present and found:
return True
if not expect_present and not found:
return True
await asyncio.sleep(poll_interval_seconds)
if _infra_mode:
logger.warning(
"[LDS_CONFIGURATOR] Таймаут ожидания %s ТУ tuId=%s в BasicInfo за %s с",
action,
tu_id,
int(total_wait_seconds),
)
return False
тест конст
GET_BASIC_INFO_ADMIN_REQUEST: str = "GetBasicInfoAdminRequest"
GET_BASIC_INFO_REQUEST: str = "getBasicInfoRequest"
лдс конф сценарий
async def lds_configurator_verify_after_core(
ws_client: WebSocketClient,
cfg: BaseSuiteConfig,
) -> None:
"""
Проверка готовности стенда после запуска lds-core.
1. Актуальный статус СОУ из Администрирования.
2. Ожидание согласованного состояния ТУ на Состоянии МТ в BasicInfo, до 120 с.
3. Ожидание согласованного состояния ТУ на Состоянии МТ в MainPageInfoContent, до 120 с.
4. Сверка статуса СОУ: Администрирование vs Состояние МТ.
"""
tu_id = cfg.configurator_tu_id
tu_name = cfg.admin_tu_name
logger.info("[SETUP] Получение актуального статуса СОУ для tuId=%s", tu_id)
admin_reply = await lds_utils.get_basic_info_admin_with_retry(ws_client, parser)
sou_status = lds_utils.get_admin_tu_status(admin_reply, tu_id)
if sou_status is None:
fail(
f"ТУ tuId={tu_id} ('{tu_name}') не найден в GetBasicInfoAdminResponse",
pytrace=False,
)
expect_enabled = sou_status == SouAdminStatus.RUNNING
action = "появления" if expect_enabled else "отсутствия"
logger.info(
"[SETUP] Ожидание %s ТУ в BasicInfo (таймаут %s с)",
action,
int(LdsCfgConst.POLL_TIMEOUT_SECONDS),
)
basic_info_poll_ok = await lds_utils.poll_basic_info_tu_presence(
ws_client, parser, tu_id, tu_name, expect_present=expect_enabled
)
if not basic_info_poll_ok:
if expect_enabled:
fail(
"СОУ не отображается на Состоянии МТ в BasicInfo: ТУ не появилась за 2 минуты после запуска core",
pytrace=False,
)
fail(
"СОУ отображается на Состоянии МТ в BasicInfo при статусе 'выключена' в Администрировании",
pytrace=False,
)
logger.info(
"[SETUP] Ожидание %s ТУ в Состоянии МТ (таймаут %s с)",
action,
int(LdsCfgConst.POLL_TIMEOUT_SECONDS),
)
main_page_poll_ok = await lds_utils.poll_main_page_tu_presence(
ws_client, tu_id, expect_present=expect_enabled
)
if not main_page_poll_ok:
if expect_enabled:
fail(
"СОУ не отображается в Состоянии МТ: ТУ не появилась за 2 минуты после запуска core",
pytrace=False,
)
fail(
"СОУ отображается в Состоянии МТ при статусе 'выключена' в Администрировании",
pytrace=False,
)
logger.info("[SETUP] Сверка статуса СОУ: Администрирование vs BasicInfo vs Состояние МТ")
lds_utils.check_sou_status_sync(sou_status, expect_enabled, expect_enabled, tu_id, tu_name)