From 56ebab38f707e6e57c3656c80ea63a0f3e3d036f Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 30 Sep 2026 21:55:07 +0300 Subject: [PATCH] =?UTF-8?q?feat(tools):=20=D1=81=D1=82=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=20=D0=B8=D0=BC=D1=91=D0=BD=20=D0=B0=D1=82=D1=80=D0=B8=D0=B1?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D0=B2=20=D1=81=D1=85=D0=B5=D0=BC=D1=8B=20+?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=20=D0=B2=2003=20(fail-fast=20?= =?UTF-8?q?=D0=B4=D0=BE=20=D0=B7=D0=B0=D0=BB=D0=B8=D0=B2=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Инцидент 2026-09-30 показал: невалидное имя атрибута (s3-inst) проходило генерацию, сборку и заливку, а ломалось только у пользователя (Terraform отвергает схему целиком). - TOOLS/scripts/check_schema_names.sh: проверяет все tfsdk:"..." в сгенерированном Go на [a-z0-9_]; exit 1 при нарушении, с подсказкой про helpers.ToSnake. - 03_build_and_upload_provider.sh: вызов стража после 02 (до сборки и заливки). - ARCHITECTURE.md: страж добавлен в список enforced-скриптов. - HISTORY: пункт 'не закрыто' заменён на 'закрыто' с проверками. Проверено: dev/test/prod -> OK; искусственный пример (tfsdk:"s3-inst") -> exit 1. --- HISTORY/2026-09-30_dev_release_2_0_1.md | 7 +-- TOOLS/ARCHITECTURE.md | 4 ++ TOOLS/scripts/03_build_and_upload_provider.sh | 6 +++ TOOLS/scripts/check_schema_names.sh | 46 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100755 TOOLS/scripts/check_schema_names.sh diff --git a/HISTORY/2026-09-30_dev_release_2_0_1.md b/HISTORY/2026-09-30_dev_release_2_0_1.md index b77cf8e..7a8aa0c 100644 --- a/HISTORY/2026-09-30_dev_release_2_0_1.md +++ b/HISTORY/2026-09-30_dev_release_2_0_1.md @@ -68,7 +68,8 @@ linux-артефакта: `d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f5 **Верификация.** `DEV_STAND/FPipeGmail`: провайдер `2.0.1` (после сброса lock) → `terraform validate` — **Success**. -**Не закрыто (предложение).** В пайплайне нет проверки схемы: `02`/сборка/заливка проходят при -невалидных именах атрибутов, дефект обнаруживается только при обращении Terraform к провайдеру. -Стоит добавить шаг валидации схемы в `03` (или fail-fast в генераторе по `[a-z0-9_]`). +**Закрыто.** Добавлен страж `TOOLS/scripts/check_schema_names.sh`: проверяет все +`tfsdk:"..."` в сгенерированном Go на `[a-z0-9_]` и включён в `03` (перед сборкой и заливкой). +Проверено: `dev`/`test`/`prod` — OK; на искусственном примере (`tfsdk:"s3-inst"`) страж +падает с exit 1. Теперь невалидная схема не может уехать в реестр. diff --git a/TOOLS/ARCHITECTURE.md b/TOOLS/ARCHITECTURE.md index ef0ea13..622657f 100644 --- a/TOOLS/ARCHITECTURE.md +++ b/TOOLS/ARCHITECTURE.md @@ -306,6 +306,10 @@ Enforced by scripts (run before build/commit): - `TOOLS/scripts/check_generated_drift.sh ` — generated Go vs provider copy. - `TOOLS/scripts/check_hardcoded_service_ids.sh` — forbids `svc.ID == N` / `ServiceID == N` outside the registries. +- `TOOLS/scripts/check_schema_names.sh ` — every `tfsdk:"..."` + attribute name must match `[a-z0-9_]`. Terraform rejects the WHOLE provider schema on an + invalid name (incident 2026-09-30: API codes `s3-inst` / `s3-ref-root`), so this guard + runs inside `03_build_and_upload_provider.sh` BEFORE build/upload. Build rule: `provider/internal/resources_gen` and `provider/resources_yaml` are ephemeral by design and never a build source. Canonical build is diff --git a/TOOLS/scripts/03_build_and_upload_provider.sh b/TOOLS/scripts/03_build_and_upload_provider.sh index 8863069..c4b9818 100755 --- a/TOOLS/scripts/03_build_and_upload_provider.sh +++ b/TOOLS/scripts/03_build_and_upload_provider.sh @@ -41,6 +41,12 @@ fi "${ROOT_DIR}/TOOLS/scripts/01_generate_yamls.sh" --profile "$PROFILE_DIR" "${ROOT_DIR}/TOOLS/scripts/02_generate_resources_and_docs_v2.sh" --profile "$PROFILE_DIR" +# Fail-fast: имена атрибутов Terraform-схемы обязаны быть [a-z0-9_]. Иначе провайдер +# не отдаст схему целиком и любой plan/apply у пользователей упадёт (инцидент 2026-09-30: +# коды API `s3-inst` / `s3-ref-root`). Проверяем ДО сборки и заливки. +STAND_NAME="$(basename "$PROFILE_DIR")" +"${ROOT_DIR}/TOOLS/scripts/check_schema_names.sh" "${ROOT_DIR}/generated/${STAND_NAME}/go" + resolve_root_path() { local path_value="$1" if [[ -z "$path_value" ]]; then diff --git a/TOOLS/scripts/check_schema_names.sh b/TOOLS/scripts/check_schema_names.sh new file mode 100755 index 0000000..c266111 --- /dev/null +++ b/TOOLS/scripts/check_schema_names.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +# check_schema_names.sh — защита от невалидных имён атрибутов Terraform-схемы. +# +# Terraform допускает в именах атрибутов только [a-z0-9_]. Нарушение приводит к тому, +# что провайдер НЕ может отдать схему целиком ("Invalid Attribute/Block Name") и падают +# plan/apply/validate у всех пользователей. +# Инцидент 2026-09-30: коды API `s3-inst` / `s3-ref-root` в тестовом сервисе 1_dummy. +# +# Проверяет все `tfsdk:"..."` в сгенерированном Go. +# +# Usage: +# ./TOOLS/scripts/check_schema_names.sh generated/dev/go +# ./TOOLS/scripts/check_schema_names.sh provider/internal/resources_gen + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" + +TARGET="${1:-}" +if [[ -z "$TARGET" ]]; then + echo "Usage: $0 " >&2 + exit 2 +fi +[[ "$TARGET" = /* ]] || TARGET="${ROOT_DIR}/${TARGET}" + +if [[ ! -d "$TARGET" ]]; then + echo "Error: directory not found: $TARGET" >&2 + exit 2 +fi + +bad="$(grep -rho 'tfsdk:"[^"]*"' "$TARGET" --include='*.go' \ + | sed 's/^tfsdk:"//; s/"$//' \ + | grep -vE '^[a-z0-9_]+$' \ + | sort -u || true)" + +if [[ -n "$bad" ]]; then + echo "INVALID TERRAFORM ATTRIBUTE NAMES (only [a-z0-9_] allowed):" >&2 + echo "$bad" | sed 's/^/ /' >&2 + echo "" >&2 + echo "Terraform отвергает схему провайдера ЦЕЛИКОМ — пользователи не смогут сделать plan/apply." >&2 + echo "Нормализуйте имена в генераторе: TOOLS/resource-generator/internal/helpers/helpers.go (ToSnake/sanitizeAttrName)." >&2 + exit 1 +fi + +echo "OK: all tfsdk attribute names valid in ${TARGET}"