From dd6dc2017b117db7632bc0a077109c730a3573b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 9 Jul 2026 00:57:18 +0400 Subject: [PATCH] docs: update debug findings 07-09 --- ...07-08_find_instance_by_display_name_bug.md | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/HISTORY/SONNET/2026-07-08_find_instance_by_display_name_bug.md b/HISTORY/SONNET/2026-07-08_find_instance_by_display_name_bug.md index 25e5a66..c5a75f6 100644 --- a/HISTORY/SONNET/2026-07-08_find_instance_by_display_name_bug.md +++ b/HISTORY/SONNET/2026-07-08_find_instance_by_display_name_bug.md @@ -1,10 +1,10 @@ -# 2026-07-08 — FindInstanceByDisplayName: анализ Opus +# 2026-07-08/09 — FindInstanceByDisplayName: анализ и дебаг ## Проблема `FindInstanceByDisplayName("NaeelOrg", 19)` возвращает nil → adopt не работает → план показывает `+ create`. -## Три кандидата (Opus) +## Три кандидата (Opus, 07-08) ### 🔴 #1: silent error swallow в GetInstanceStateRaw `client.go:~605` — `GetInstanceStateRaw` может возвращать ошибку, которая проглатывается `continue`. Ни search-путь, ни fallback не логируют ошибку. @@ -15,12 +15,44 @@ ### 🟡 #3: API возвращает другое имя поля Если API возвращает `display_name` вместо `displayName` — `item.DisplayName` = "", `EqualFold("", "NaeelOrg")` = false. -## Что делать (по приоритету) +## Дебаг (07-09) -1. **Добавить stderr-лог** на каждый `continue` в `FindInstanceByDisplayName` — покажет точную причину. -2. **Убрать `fields`** из search-запроса (строка ~574) — проверить кандидата #2. -3. **Включить `NUBES_DEBUG_HTTP=1`** — лог doRequest. +### Ошибка #1: `req.Close = true` — не причина +Правка `req.Close` только для GET не помогла (v5.0.65). План всё ещё `+ create`. -## Доп. баг +### Ошибка #2: три сборки под одной версией 5.0.66 +VM кеширует провайдер. `terraform init -upgrade` не перекачивает ту же версию. Исправлено: новый билд → новая версия. -Fallback использует `size=100`, search-путь — `pageSize=100`. Разные параметры пагинации. +### Ошибка #3: stderr не попадает в `terraform plan 2>&1` +Terraform запускает плагин как подпроцесс → stderr не ловится. Исправлено: запись в `/tmp/nubes_find_debug.log`. + +### Результат дебага (v5.0.67) + +Лог `/tmp/nubes_find_debug.log`: +``` +[FIND-DEBUG] ModifyPlan entered, client=true +[FIND-DEBUG] PlanExistingResourceDiagnostics entered: serviceId=19 name="NaeelOrg" adopt=true client=true +[FIND-DEBUG] search returned 1 results +[FIND-DEBUG] search item uid=3f0850f2-3506-4efd-b84b-7270b5027ab5 name="NaeelOrg" svcId=19 matchSvc=true matchName=true +``` + +**FindInstanceByDisplayName РАБОТАЕТ** — инстанс находится, GetInstanceStateRaw проходит. + +### Почему план `+ create` — это НОРМАЛЬНО + +Adopt происходит на **apply**, не на plan. Plan показывает `+ create` потому что ресурса нет в `terraform.tfstate`. + +На apply: `CreateResource()` → `FindInstanceByDisplayName` → найдёт → `adoptExistingInstanceOnCreate` → подхватит в state. + +## Дальше (завтра) + +1. `terraform apply` — adopt должен сработать +2. Убрать debug-логи, собрать чистую версию +3. Добавить vdc, nsxt, Штурвал + +## Уроки + +1. **Всегда новая версия на каждую сборку** — иначе VM не подхватывает. +2. **Писать debug в файл, не в stderr** — в плагинах Terraform stderr не виден. +3. **Не гадать** — сначала дебаг-лог, потом правка. +4. **Выполнять ТОЛЬКО по «делай»** — без разрешения ничего не трогать.