From ee35088dae8a32bccf0bb1f58c23eec8db49ae1f Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 25 Oct 2026 10:20:34 +0300 Subject: [PATCH] chore: remove obsolete Polygon YAML and document diagnosis --- DEPLOYMENT_DIAGNOSIS.md | 56 +++++++++++++++++++++++++++++ README.md | 1 + site/services/27_vc_vm_v2.yaml | 52 --------------------------- site/services/dev/27_vc_vm_v2.yaml | 52 --------------------------- site/services/prod/27_vc_vm_v2.yaml | 52 --------------------------- site/services/test/27_vc_vm_v2.yaml | 52 --------------------------- 6 files changed, 57 insertions(+), 208 deletions(-) create mode 100644 DEPLOYMENT_DIAGNOSIS.md delete mode 100644 site/services/27_vc_vm_v2.yaml delete mode 100644 site/services/dev/27_vc_vm_v2.yaml delete mode 100644 site/services/prod/27_vc_vm_v2.yaml delete mode 100644 site/services/test/27_vc_vm_v2.yaml diff --git a/DEPLOYMENT_DIAGNOSIS.md b/DEPLOYMENT_DIAGNOSIS.md new file mode 100644 index 0000000..85a8928 --- /dev/null +++ b/DEPLOYMENT_DIAGNOSIS.md @@ -0,0 +1,56 @@ +# Диагностика: create прошёл, адрес Polygon не открывается + +Дата инцидента: 25.10.2026 + +## Наблюдения + +- В интерфейсе создания показан ответ `201`; в строке также указано время завершения 08:25:13. +- Браузер для `https://polygon.pythonk8s.dev.nubes.ru/` сообщает `DNS_PROBE_FINISHED_NXDOMAIN`. +- `NXDOMAIN` означает, что DNS-имя не найдено. Браузер не дошёл до HTTP-запроса к Flask. +- Ответ `201` подтверждает ответ API на создание, но сам по себе не доказывает, что все стадии операции завершились успешно, под запущен и DNS-запись доступна. + +Стадии и `errorLog` операции не приложены, поэтому точная причина по имеющимся данным не установлена. + +## Проверенные риски + +### Домен сервиса Nubes Flask + +Источник схемы Flask — `/home/naeel/TF/tf_provider/generated//resources_yaml/89_flask.yaml`. +В `accessConfiguration.domain` короткое имя в одном октете предназначено для создания имени в служебной DNS-зоне. Для полного FQDN схема описывает проверку уже существующей A-записи, направленной на ingress. + +Проверенный пример для DEV: `domain = "flask-crud"` даёт `flask-crud.pythonk8s.dev.nubes.ru` (`/home/naeel/TF/tf_provider/stack/test/flask/facts.md`). Поэтому следует сверить фактически отправленное значение `domain` и адрес `state_out.connectionUrl`. Если в create отправили полный FQDN, но A-запись заранее не существует, DNS-стадия может не пройти. Это гипотеза до просмотра стадий операции. + +### Относительный путь к YAML в Polygon + +В [loader.py](site/config/loader.py) пути заданы относительно текущей рабочей директории: по умолчанию `services`, а в `POLYGON_STANDS` обычно `services/dev`, `services/test`, `services/prod`. Фактические каталоги находятся внутри `site/services/`. + +Инструкция Nubes Flask (`~/HowTo/howto-flask-nubes.md`) указывает запуск `python site/app.py` из корня репозитория. Если рабочая директория процесса действительно корень репозитория, загрузчик будет искать `/services`, а не `/site/services`; импорт конфигурации упадёт с `FileNotFoundError` до старта Flask и `/health`. Если платформа меняет рабочую директорию на `site`, этот путь работает. Фактический CWD деплоя и логи пода не проверены. + +Этот риск может объяснить неготовность приложения после создания, но сам по себе не создаёт `NXDOMAIN`: DNS-имя проверяется до соединения с Flask. + +### Healthcheck + +В [app.py](site/app.py) есть маршрут `/health`, возвращающий `OK`. Схема Nubes Flask разрешает пустой `healthPath`, при котором платформа проверяет доступность приложения по порту. Если в create указан непустой `healthPath`, нужно проверить, что это существующий маршрут и что под действительно слушает ожидаемый платформой порт. + +## Проверка гипотезы о старых YAML и задержке + +`config/loader.py` перечисляет YAML только в каталогах, заданных `POLYGON_STANDS`, либо в `services/` при отсутствии этой переменной. Каждый файл открывается и разбирается один раз при импорте `config.loader`; обработчики API затем используют загруженные словари из памяти. Резервные каталоги `resources_yaml.bak-*` из `tf_provider` Polygon не сканирует. + +Следовательно, старый YAML может оставить устаревший сервис или параметры в ответах API и способен помешать запуску, если файл невалиден или отсутствует ожидаемый каталог. Но в коде нет основания заключать, что чтение старых YAML вызвало заметную задержку, а тем более DNS `NXDOMAIN`. Время загрузки YAML отдельно не измерялось. + +**Исправление прежнего ответа:** оценки размера и времени чтения YAML, а также предположение о конкретном negative-cache TTL DNS ранее были приведены без измерений и не являются установленными фактами. То, что адрес позднее открылся, доказывает только, что в момент повторной проверки он разрешался и отвечал; почему это изменилось, без DNS-диагностики и журналов Nubes неизвестно. + +Локальные удаления YAML в Polygon не отправлялись в Gitea и не развёртывались, поэтому сами по себе не меняли работающий сервис. + +## Что проверить для точного диагноза + +1. В карточке инстанса: фактические `startupConfiguration.resourceRealm`, `accessConfiguration.domain`, `appConfiguration.gitPath`, `appConfiguration.healthPath` и `state_out.connectionUrl`. +2. У операции `create`: список `stages`, результат каждой стадии и `errorLog`, особенно стадии DNS и запуска приложения. +3. В логах пода: статус контейнера и traceback. Ошибка `Services directory not found: services` подтвердит проблему CWD/YAML-пути. +4. В DNS: существует ли A-запись для точного `state_out.connectionUrl` и указывает ли она на ingress выбранного resource realm. + +## Вывод + +Непосредственно `DNS_PROBE_FINISHED_NXDOMAIN` означает отсутствие разрешаемой DNS-записи для запрошенного имени. Наиболее важные проверки — сопоставить `domain` с `state_out.connectionUrl` и изучить DNS-стадию. Отдельно нужно проверить рабочую директорию процесса: текущий `loader.py` использует относительные пути и может не найти YAML при запуске из корня репозитория. + +`tf_provider` — источник истины для схемы Flask; его YAML в рамках этого анализа не менялись. \ No newline at end of file diff --git a/README.md b/README.md index 227b9c4..356bc9b 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ curl https://polygon.pythonk8s.dev.nubes.ru/dev/api/v1/svc/services | python3 -m ## Связанные документы +- [DEPLOYMENT_DIAGNOSIS.md](DEPLOYMENT_DIAGNOSIS.md) — разбор `201` при создании, NXDOMAIN и риска пути к YAML - [DOCS/polygon-plan.md](../DOCS/polygon-plan.md) — план реализации - [polygon-docs/sonnet-code-review-prompt.md](../polygon-docs/sonnet-code-review-prompt.md) — промпт code review - [polygon-docs/tf-provider-refs.md](../polygon-docs/tf-provider-refs.md) — ссылки на генератор YAML diff --git a/site/services/27_vc_vm_v2.yaml b/site/services/27_vc_vm_v2.yaml deleted file mode 100644 index 7ae978e..0000000 --- a/site/services/27_vc_vm_v2.yaml +++ /dev/null @@ -1,52 +0,0 @@ -name: vc_vm_v2 -service_id: 27 -service_display_name: VM в Cloud Director (vc_vmV2) -service_short_name: vc_vm_v2 -lifecycle: - suspendOnDestroyDefault: true - adoptExistingOnCreateDefault: false -operations: -- svcOperationId: 100 - operation: create - kind: instance - action: create -- svcOperationId: 101 - operation: delete - kind: instance - action: delete -- svcOperationId: 104 - operation: modify - kind: instance - action: modify -- svcOperationId: 102 - operation: resume - kind: instance - action: resume -- svcOperationId: 103 - operation: suspend - kind: instance - action: suspend -stateOut: {} -cfsParams: -- svcOperationCfsParamId: 301 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -- svcOperationCfsParamId: 302 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -cfsParamsByOp: - 100: - - 301 - 101: [] - 104: - - 302 - 102: [] - 103: [] -stateParams: - serverListJson: '[{}]' diff --git a/site/services/dev/27_vc_vm_v2.yaml b/site/services/dev/27_vc_vm_v2.yaml deleted file mode 100644 index 7ae978e..0000000 --- a/site/services/dev/27_vc_vm_v2.yaml +++ /dev/null @@ -1,52 +0,0 @@ -name: vc_vm_v2 -service_id: 27 -service_display_name: VM в Cloud Director (vc_vmV2) -service_short_name: vc_vm_v2 -lifecycle: - suspendOnDestroyDefault: true - adoptExistingOnCreateDefault: false -operations: -- svcOperationId: 100 - operation: create - kind: instance - action: create -- svcOperationId: 101 - operation: delete - kind: instance - action: delete -- svcOperationId: 104 - operation: modify - kind: instance - action: modify -- svcOperationId: 102 - operation: resume - kind: instance - action: resume -- svcOperationId: 103 - operation: suspend - kind: instance - action: suspend -stateOut: {} -cfsParams: -- svcOperationCfsParamId: 301 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -- svcOperationCfsParamId: 302 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -cfsParamsByOp: - 100: - - 301 - 101: [] - 104: - - 302 - 102: [] - 103: [] -stateParams: - serverListJson: '[{}]' diff --git a/site/services/prod/27_vc_vm_v2.yaml b/site/services/prod/27_vc_vm_v2.yaml deleted file mode 100644 index 7ae978e..0000000 --- a/site/services/prod/27_vc_vm_v2.yaml +++ /dev/null @@ -1,52 +0,0 @@ -name: vc_vm_v2 -service_id: 27 -service_display_name: VM в Cloud Director (vc_vmV2) -service_short_name: vc_vm_v2 -lifecycle: - suspendOnDestroyDefault: true - adoptExistingOnCreateDefault: false -operations: -- svcOperationId: 100 - operation: create - kind: instance - action: create -- svcOperationId: 101 - operation: delete - kind: instance - action: delete -- svcOperationId: 104 - operation: modify - kind: instance - action: modify -- svcOperationId: 102 - operation: resume - kind: instance - action: resume -- svcOperationId: 103 - operation: suspend - kind: instance - action: suspend -stateOut: {} -cfsParams: -- svcOperationCfsParamId: 301 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -- svcOperationCfsParamId: 302 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -cfsParamsByOp: - 100: - - 301 - 101: [] - 104: - - 302 - 102: [] - 103: [] -stateParams: - serverListJson: '[{}]' diff --git a/site/services/test/27_vc_vm_v2.yaml b/site/services/test/27_vc_vm_v2.yaml deleted file mode 100644 index 7ae978e..0000000 --- a/site/services/test/27_vc_vm_v2.yaml +++ /dev/null @@ -1,52 +0,0 @@ -name: vc_vm_v2 -service_id: 27 -service_display_name: VM в Cloud Director (vc_vmV2) -service_short_name: vc_vm_v2 -lifecycle: - suspendOnDestroyDefault: true - adoptExistingOnCreateDefault: false -operations: -- svcOperationId: 100 - operation: create - kind: instance - action: create -- svcOperationId: 101 - operation: delete - kind: instance - action: delete -- svcOperationId: 104 - operation: modify - kind: instance - action: modify -- svcOperationId: 102 - operation: resume - kind: instance - action: resume -- svcOperationId: 103 - operation: suspend - kind: instance - action: suspend -stateOut: {} -cfsParams: -- svcOperationCfsParamId: 301 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -- svcOperationCfsParamId: 302 - svcOperationCfsParam: serverListJson - dataType: json - isRequired: true - defaultValue: '[{}]' - isModifiable: true -cfsParamsByOp: - 100: - - 301 - 101: [] - 104: - - 302 - 102: [] - 103: [] -stateParams: - serverListJson: '[{}]'