chore(tools): страж хардкодов покрыл provider/ + id сервиса в именованную константу
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).
This commit is contained in:
@@ -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/."
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user