From c5a44990948a3bfaa0f6782b60cbbaa98cd6d72a Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 30 Sep 2026 20:33:09 +0300 Subject: [PATCH] =?UTF-8?q?chore(tools):=20=D1=81=D1=82=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=20=D1=85=D0=B0=D1=80=D0=B4=D0=BA=D0=BE=D0=B4=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D0=BB=20provider/=20+=20id=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check_hardcoded_service_ids.sh: - область расширена с TOOLS/ на TOOLS/ + provider/internal/ (кроме generated resources_gen/); - второй паттерн: литеральный ref-service id в ResolveRefSvcParamValue/DisplayName(ctx, N,...); - справка обновлена (убран удалённый serviceSpecificModifiers); - сервис-специфичные литералы пояснены как 'именованные константы'. org_ip_allocation_resource.go: ResolveRefSvcParamValue(ctx, 19, ...) -> svcIDVcOrg. Проверено: bash TOOLS/scripts/check_hardcoded_service_ids.sh -> OK (exit 0). --- TOOLS/scripts/check_hardcoded_service_ids.sh | 38 ++++++++++++++----- .../org_ip_allocation_resource.go | 10 ++++- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/TOOLS/scripts/check_hardcoded_service_ids.sh b/TOOLS/scripts/check_hardcoded_service_ids.sh index 12932c4..3c3ee88 100755 --- a/TOOLS/scripts/check_hardcoded_service_ids.sh +++ b/TOOLS/scripts/check_hardcoded_service_ids.sh @@ -3,27 +3,45 @@ set -euo pipefail # check_hardcoded_service_ids.sh — запрет сервис-специфичных хардкодов по числовому ID. # -# Ищет сравнения вида svc.ID == N / ServiceID == N / spec.ServiceID == N (N > 0) -# в Go-коде TOOLS/. Исключения должны жить ТОЛЬКО в именованных реестрах (данные): -# - TOOLS/yaml-generator/main.go (serviceSpecificModifiers) +# Ищет: +# 1) сравнения вида svc.ID == N / ServiceID == N / spec.ServiceID == N (N > 0) +# 2) литеральные ref-service id в вызовах резолва: +# ResolveRefSvcParamValue(ctx, 19, ...) / ResolveRefSvcParamDisplayName(ctx, 22, ...) +# +# Область: TOOLS/** и provider/internal/** (кроме сгенерированного resources_gen/**). +# Исключения должны жить в именованных реестрах/константах (данные), а не как магические числа. # - TOOLS/docs-generator/internal/writers/writers.go (serviceSpecificDocExamples) +# - provider/internal/resources_core/*.go (именованные svcID* константы) # # Выход: 0 — хардкодов нет; 1 — найдены. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" -matches="$(grep -rnE '\.(ServiceID|ID)[[:space:]]*==[[:space:]]*[1-9][0-9]*' "$ROOT_DIR/TOOLS" --include='*.go' || true)" +SCAN_DIRS=("$ROOT_DIR/TOOLS" "$ROOT_DIR/provider/internal") + +matches="" +for dir in "${SCAN_DIRS[@]}"; do + [[ -d "$dir" ]] || continue + # Сгенерированный код не сканируем — он не редактируется руками (см. ARCHITECTURE.md). + found="$(grep -rnE \ + -e '\.(ServiceID|ID)[[:space:]]*==[[:space:]]*[1-9][0-9]*' \ + -e '(ResolveRefSvcParamValue|ResolveRefSvcParamDisplayName)\([^,]+, *[1-9][0-9]*' \ + "$dir" --include='*.go' --exclude-dir=resources_gen || true)" + if [[ -n "$found" ]]; then + matches+="$found"$'\n' + fi +done if [[ -n "$matches" ]]; then - echo "HARDCODED SERVICE ID FOUND (service-specific logic must live in a registry):" >&2 - echo "$matches" >&2 + echo "HARDCODED SERVICE ID FOUND (service-specific logic must live in a named registry):" >&2 + printf '%s' "$matches" >&2 echo "" >&2 - echo "Вынеси исключение в один из реестров:" >&2 - echo " - TOOLS/yaml-generator/main.go (serviceSpecificModifiers)" >&2 + echo "Вынеси исключение в именованный реестр/константу:" >&2 echo " - TOOLS/docs-generator/internal/writers/writers.go (serviceSpecificDocExamples)" >&2 - echo "См. TOOLS/ARCHITECTURE.md, раздел «Реестр исключений»." >&2 + echo " - provider/internal/resources_core/*.go (именованные svcID* константы)" >&2 + echo "См. TOOLS/ARCHITECTURE.md, раздел «Exception Registry»." >&2 exit 1 fi -echo "OK: no hardcoded service IDs in TOOLS/." +echo "OK: no hardcoded service IDs in TOOLS/ and provider/internal/." diff --git a/provider/internal/resources_core/org_ip_allocation_resource.go b/provider/internal/resources_core/org_ip_allocation_resource.go index da5a11a..db93e69 100644 --- a/provider/internal/resources_core/org_ip_allocation_resource.go +++ b/provider/internal/resources_core/org_ip_allocation_resource.go @@ -21,6 +21,14 @@ var _ resource.Resource = &OrgIpAllocationResource{} var _ resource.ResourceWithConfigure = &OrgIpAllocationResource{} var _ resource.ResourceWithImportState = &OrgIpAllocationResource{} +// ===== Именованные ссылки на сервисы платформы (реестр данных, без магических чисел) ===== +// Проверяется стражем TOOLS/scripts/check_hardcoded_service_ids.sh. +const ( + // svcIDVcOrg — сервис 19 «vc_org»: организация Cloud Director. + // Организация создаётся вручную в ЛК, ресурс адресует её по имени/UUID. + svcIDVcOrg = 19 +) + // OrgIpAllocationResource управляет аллокацией внешних IP на СУЩЕСТВУЮЩЕЙ организации // (сервис 19, vc_org) через операцию modify с параметром vIPConfigure (id 662). // @@ -305,7 +313,7 @@ func (r *OrgIpAllocationResource) resolveOrganizationUID(ctx context.Context, or return "", fmt.Errorf("organization обязателен") } - resolved, err := r.client.ResolveRefSvcParamValue(ctx, 19, raw) + resolved, err := r.client.ResolveRefSvcParamValue(ctx, svcIDVcOrg, raw) if err != nil { return "", fmt.Errorf("не удалось определить организацию %q: %w", raw, err) }