From dd61b1b08d0ee17f6fbbca515a2ceee68bf78267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 19 Jul 2026 11:37:52 +0400 Subject: [PATCH] fix: s3Uid resolve by JSON key pattern (no DataDescriptor dependency) --- TEST_STAND/LUCEE/{lucee.tf => lucee.tf0} | 0 TEST_STAND/LUCEE/main.tf | 2 +- TEST_STAND/LUCEE/nubes_postgres_lucee.tf | 4 +-- TOOLS/ARCHITECTURE.md | 8 +++--- TOOLS/config/dev/profile.env | 2 +- TOOLS/config/prod/profile.env | 2 +- TOOLS/config/test/profile.env | 2 +- provider/internal/core/client.go | 36 ++++-------------------- 8 files changed, 16 insertions(+), 40 deletions(-) rename TEST_STAND/LUCEE/{lucee.tf => lucee.tf0} (100%) diff --git a/TEST_STAND/LUCEE/lucee.tf b/TEST_STAND/LUCEE/lucee.tf0 similarity index 100% rename from TEST_STAND/LUCEE/lucee.tf rename to TEST_STAND/LUCEE/lucee.tf0 diff --git a/TEST_STAND/LUCEE/main.tf b/TEST_STAND/LUCEE/main.tf index f8c0ed7..191f5d7 100644 --- a/TEST_STAND/LUCEE/main.tf +++ b/TEST_STAND/LUCEE/main.tf @@ -2,7 +2,7 @@ terraform { required_providers { nubes = { source = "registry.kube5s.ru/nubes-test/nubes" - version = "5.1.7" + version = "5.1.8" } } } diff --git a/TEST_STAND/LUCEE/nubes_postgres_lucee.tf b/TEST_STAND/LUCEE/nubes_postgres_lucee.tf index 2bd619a..3c0b46b 100644 --- a/TEST_STAND/LUCEE/nubes_postgres_lucee.tf +++ b/TEST_STAND/LUCEE/nubes_postgres_lucee.tf @@ -1,5 +1,5 @@ resource "nubes_postgres" "npg_lucee" { - resource_name = "pglucee01" + resource_name = "pglucee001" startup_configuration = { resource_realm = var.realm @@ -33,7 +33,7 @@ resource "nubes_postgres" "npg_lucee" { backup_configuration = { s3_uid = var.s3_name - # s3_uid = var.s3_uid + # s3_uid = var.s3_user_uid retain = 14 schedule = "0 0 * * *" } diff --git a/TOOLS/ARCHITECTURE.md b/TOOLS/ARCHITECTURE.md index 238c1ea..ded1d37 100644 --- a/TOOLS/ARCHITECTURE.md +++ b/TOOLS/ARCHITECTURE.md @@ -126,10 +126,10 @@ Each operation has a kind: `dataDescriptor` для `map-fixed`-параметра, а значение отсутствует или равно `"{}"`, строится JSON из дефолтов sub-параметров (`{"type":"off","durationCA":"175200",...}`). Это гарантирует что API получит все обязательные sub-поля с их значениями по умолчанию. -- **s3Uid-резолв в map-fixed** (`resolveRefSvcParamValues`): для map-fixed-параметров - с `DataDescriptor`, содержащих uuid sub-params с именем по паттерну `s3.*uid`, - значения-не-UUID резолвятся в UUID через S3 (сервис 12). Позволяет использовать - displayName вместо UUID для S3-ссылок во всех сервисах (Postgres, MariaDB, Clickhouse). +- **s3Uid-резолв в map-fixed** (`resolveS3UidInMapFixed`): для map-fixed-параметров + парсится JSON, ищутся ключи по паттерну `s3.*uid` (case-insensitive), значения-не-UUID + резолвятся в UUID через S3 (сервис 12). Не зависит от DataDescriptor API. + Соглашение об именах: любой sub-param с `s3`+`uid` в имени → S3 (12). - **modify всегда через WithDefaults** (`RunInstanceOperationUniversalWithDefaults`): modify-операции запрашивают `cfsParams` у API и отправляют все параметры, включая новые, с дефолтами из API. diff --git a/TOOLS/config/dev/profile.env b/TOOLS/config/dev/profile.env index 29f7385..8356f13 100644 --- a/TOOLS/config/dev/profile.env +++ b/TOOLS/config/dev/profile.env @@ -4,7 +4,7 @@ TOKEN_FILE="secrets/dev.token" # Release versions # Version -VERSION="3.1.6" +VERSION="3.1.7" # Registry/S3 settings REGISTRY_HOST="registry.kube5s.ru" diff --git a/TOOLS/config/prod/profile.env b/TOOLS/config/prod/profile.env index f9b7bc0..6bd8018 100644 --- a/TOOLS/config/prod/profile.env +++ b/TOOLS/config/prod/profile.env @@ -4,7 +4,7 @@ TOKEN_FILE="secrets/prod.token" # Release versions # Version -VERSION="2.1.5" +VERSION="2.1.6" # Registry/S3 settings REGISTRY_HOST="registry.kube5s.ru" diff --git a/TOOLS/config/test/profile.env b/TOOLS/config/test/profile.env index 0023328..90f1bb0 100644 --- a/TOOLS/config/test/profile.env +++ b/TOOLS/config/test/profile.env @@ -3,7 +3,7 @@ NUBES_API_ENDPOINT="https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" TOKEN_FILE="secrets/test.token" # Version -VERSION="5.1.8" +VERSION="5.1.9" # Docs generation — ONLY from docs_gen// (never from docs/) DOCS_GEN_DIR="provider/docs_gen/test" diff --git a/provider/internal/core/client.go b/provider/internal/core/client.go index e3e6c48..8bcd44d 100644 --- a/provider/internal/core/client.go +++ b/provider/internal/core/client.go @@ -1218,39 +1218,14 @@ func (c *UniversalClient) resolveRefSvcParamValues(ctx context.Context, opParams return resolved, nil } -// resolveS3UidInMapFixed парсит JSON map-fixed-параметра, находит uuid sub-params -// с именем по паттерну s3.*uid и резолвит значения-не-UUID в UUID через S3 (сервис 12). +// resolveS3UidInMapFixed парсит JSON map-fixed-параметра, находит ключи +// по паттерну s3.*uid (case-insensitive) и резолвит значения-не-UUID +// в UUID через S3 (сервис 12). Соглашение об именах: s3Uid, s3_uid, S3Uid → S3. func (c *UniversalClient) resolveS3UidInMapFixed(paramId int, jsonValue string, opParams []universalCfsParam) string { - // Найти DataDescriptor для этого параметра - var dd map[string]universalSubParam - for _, p := range opParams { - if p.SvcOperationCfsParamId == paramId && len(p.DataDescriptor) > 0 { - dd = p.DataDescriptor - break - } - } - if len(dd) == 0 { + if jsonValue == "" || jsonValue == "{}" { return jsonValue } - // Найти uuid sub-params с s3.*uid в имени - s3uidKeys := make(map[string]bool) - re := strings.ToLower - for key, sub := range dd { - lowKey := re(key) - lowSub := re(sub.SvcOperationCfsSubparam) - if (strings.Contains(lowKey, "s3") && strings.Contains(lowKey, "uid")) || - (strings.Contains(lowSub, "s3") && strings.Contains(lowSub, "uid")) { - if strings.Contains(re(sub.DataType), "uuid") { - s3uidKeys[key] = true - } - } - } - if len(s3uidKeys) == 0 { - return jsonValue - } - - // Парсим JSON var obj map[string]interface{} if err := json.Unmarshal([]byte(jsonValue), &obj); err != nil { return jsonValue @@ -1258,7 +1233,8 @@ func (c *UniversalClient) resolveS3UidInMapFixed(paramId int, jsonValue string, changed := false for key, val := range obj { - if !s3uidKeys[key] { + lowKey := strings.ToLower(key) + if !strings.Contains(lowKey, "s3") || !strings.Contains(lowKey, "uid") { continue } strVal, ok := val.(string)