9.7 KiB
Вопросы к Opus 4.8: Анализ генерационных скриптов и промежуточного кода
Контекст: Ты уже проанализировал ПРОВАЙДЕР (client.go, crud.go, gen_v2). Теперь нужен анализ СКРИПТОВ ГЕНЕРАЦИИ — как API-данные превращаются в YAML, Go-код и документацию. Режим: Plan (только чтение). Все пути относительно
/home/naeel/tf_provider/.
Вопрос 1: Bash-скрипты — полный аудит
Файлы:
devops/01_generate_yamls.sh— API → YAMLdevops/02_generate_resources_and_docs_v2.sh— YAML → Go + Docsdevops/03_build_and_upload_provider.sh— сборка + S3devops/04_build_and_publish_docs.sh— публикация документации
Задача: прочитай ВСЕ 4 скрипта полностью. Для каждого проверь:
-
Обработка ошибок:
- Что происходит при
set -e— на каком шаге скрипт упадёт? - Есть ли
trapдля очистки временных файлов? - Что если API вернул 500? Пустой ответ? Битый JSON?
- Что если
services_list.txtпустой?
- Что происходит при
-
Зависимости:
- Какие внешние инструменты нужны (go, python3, mc, gpg, mkdocs)?
- Проверяются ли они перед запуском?
- Что если инструмент отсутствует — понятная ли ошибка?
-
Идемпотентность:
- Можно ли перезапустить скрипт при обрыве?
- Чистит ли он предыдущий мусор перед генерацией?
- Что с параллельным запуском двух экземпляров?
-
User-Agent / DDoS-Guard:
01_generate_yamls.shвызывает pythonurllibдля получения имён сервисов (строка ~170). Есть ли там User-Agent?- Как Go-бинари (
service_spec_gen) получают токен? Через env?
-
Профили (test/prod/dev):
- Как скрипты определяют какой профиль использовать?
- Что если
--profileне указан? Есть ли защита от запуска без профиля? - Где хранятся сгенерированные артефакты для каждого профиля?
Вопрос 2: service_spec_gen — API → YAML (ключевой генератор)
Файл: universal_rebuild/tools/service_spec_gen/generate_service_spec.go
Мы уже добавили User-Agent, но проверь остальное:
-
HTTP-клиент:
- Есть ли retry при ошибках API (429, 503, network)?
- Какой таймаут?
http.Client{Timeout: 30s}— достаточно ли? - Используется ли
http.DefaultClientили свой?
-
Парсинг ответа API:
- Структуры
serviceInfo,serviceOperationInfo,operationInfo— все ли поля API маппятся? - Есть ли поля которые API возвращает, но генератор игнорирует (потеря данных)?
- Что если API вернёт неожиданный формат — будет
panicили ошибка?
- Структуры
-
Классификация операций (
classifyOperation):- Как определяется
kind(instance/subresource/action)? - Правило:
create/modify/delete/suspend/resume→ instance,create_*/modify_*/delete_*→ subresource, остальное → action. Все ли кейсы покрыты? - Что с новыми префиксами, которые могут появиться (например,
restart_*)?
- Как определяется
-
Сбор параметров:
- Поля
ParamSpec— все ли constraints из API сохраняются (maxLength,minLength,regex,uniqueScope,dependsOn)? normalizeDefault— правильно ли обрабатывает null/числа/строки?normalizeValueList— преобразует[]interface{}в[]string. Что если элемент не строка?
- Поля
-
Выходной YAML:
yaml.Marshal— сохраняет ли все поля корректно (omitempty, вложенные структуры)?- Имя файла:
{id}_{name}.yaml. Что если имя содержит спецсимволы?
Вопрос 3: gen_v2 — YAML → Go (уже проанализирован, но проверь детали)
Файл: universal_rebuild/tools/gen_v2/generate_resources_v2.go
Мы уже добавили validateSpec(). Проверь:
-
Обработка ошибок генерации:
format.Source— что при ошибке форматирования? Пишет битый код или паникует?writeInstanceResource/writeSubresource/writeActionResource— обрабатывают ли ошибкиtemplate.Execute?
-
Вычисление CreateOnly:
computeCreateOnly= параметр в create но не в modify → ForceNew. Что если modify-операция существует но не содержит этот параметр потому что он неизменяем? Это корректно?
-
Subresource identity:
- Если нет modify → все параметры ForceNew. Если есть modify → как определяется identity?
buildSubresourceForceNewCodes— правильная ли логика?
-
JSON-параметры:
data_type: json→IsJson=true+JsonNormalizeplan-modifier. Достаточно ли этого для всех JSON-типов (map, array, object)?
Вопрос 4: docs_template_gen_v2 — генерация документации
Файлы: universal_rebuild/tools/docs_template_gen_v2/main.go
-
Что именно генерируется?
- Какие страницы/файлы создаются?
- Формат выхода — Markdown для mkdocs?
- Все ли поля из YAML используются (MAN, params, outputs, lifecycle)?
-
Покрытие:
- Генерируется ли документация для subresource и action ресурсов?
- Есть ли index/overview страницы?
- Примеры (HCL examples) — откуда берутся?
-
Ошибки:
- Что при битом YAML? Пустых операциях?
- Флаг
-exclude clickhouse— почему хардкод?
Вопрос 5: service_ops_gen и service_params_gen — нужны ли они?
Файлы:
universal_rebuild/tools/service_ops_gen/generate_service_ops.gouniversal_rebuild/tools/service_params_gen/generate_service_params.go
Эти тулы выглядят как устаревшие (в коде написано APPEND-ONLY). service_spec_gen заменил их (генерирует унифицированный YAML вместо отдельных ops/params YAML).
- Используются ли они где-то в скриптах?
- Можно ли их удалить?
- Есть ли
gen/(v1) — он ещё нужен?
Вопрос 6: embed.go и resources_yaml
Файлы:
universal_rebuild/resources_yaml/embed.godevops/profiles/*/generated/resources_yaml/embed.go
embed.goиспользует//go:embed *.yaml— встраивает YAML в бинарник. Зачем?- Где в коде провайдера используется
resources_yaml.Files? - Почему
embed.goсоздаётся bash-скриптом, а не лежит в репо?
Вопрос 7: Профили и CI
Файлы:
devops/profiles/test/,prod/,dev/devops/ci/pipeline.yaml.github/workflows/
- Как CI-пайплайн связан с профилями?
- Есть ли автоматический прогон генерации в CI?
- Как происходит деплой — через operator в K8s или вручную?
devops/10_yaml_stability_run.sh— зачем несколько скриптов стабильности (10-13)?
Вопрос 8: Практическая проверка
Мы сегодня попробовали сгенерировать YAML для postgres (service_id=90) и обнаружили что API добавил 2 новые операции (backup, reconcile) которых нет в старом сгенерированном коде.
Задача: проверь ВСЕ сервисы из services_list.txt на наличие YAML в devops/profiles/test/generated/resources_yaml/. Какие сервисы есть в списке но отсутствуют в сгенерированных YAML? Какие YAML есть но сервис исключён из списка?
Формат ответа
На каждый вопрос: что прочитал → проблема → предложение → приоритет (P0/P1/P2).
Особое внимание:
- Bash-скриптам (01_generate_yamls.sh — самый критичный)
- HTTP-клиентам в Go-генераторах (UA, retry, таймауты)
- Целостности данных (не теряем ли поля API при генерации YAML)