fix: resolve s3Uid name→UUID for uuid sub-params inside map-fixed

This commit is contained in:
“Naeel”
2026-07-19 10:45:22 +04:00
parent 0a027c2ebf
commit 65b78f2a78
9 changed files with 102 additions and 22 deletions
+68 -3
View File
@@ -1195,7 +1195,6 @@ func (c *UniversalClient) resolveRefSvcParamValues(ctx context.Context, opParams
newValue := value
if refSvcId, ok := refById[paramId]; ok {
if strings.TrimSpace(value) == "" {
// Опциональный ref-параметр не задан — оставляем пустым
newValue = ""
} else if !isUUIDLike(value) {
uid, err := c.findInstanceUidByDisplayNameRefSvc(ctx, refSvcId, value)
@@ -1207,10 +1206,11 @@ func (c *UniversalClient) resolveRefSvcParamValues(ctx context.Context, opParams
}
newValue = uid
} else {
// FIX(uuid-case): UUID-like value passed directly — normalise to lowercase.
// Аналогично refSvcId==12: нормализуем для API, регистр восстановится в state.
newValue = strings.ToLower(value)
}
} else if strings.TrimSpace(value) != "" {
// map-fixed: резолвим s3Uid-подобные uuid sub-params внутри JSON.
newValue = c.resolveS3UidInMapFixed(paramId, value, opParams)
}
resolved[paramId] = newValue
}
@@ -1218,6 +1218,71 @@ func (c *UniversalClient) resolveRefSvcParamValues(ctx context.Context, opParams
return resolved, nil
}
// resolveS3UidInMapFixed парсит JSON map-fixed-параметра, находит uuid sub-params
// с именем по паттерну s3.*uid и резолвит значения-не-UUID в UUID через S3 (сервис 12).
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 {
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
}
changed := false
for key, val := range obj {
if !s3uidKeys[key] {
continue
}
strVal, ok := val.(string)
if !ok || strVal == "" || isUUIDLike(strVal) {
continue
}
uid, err := c.findInstanceUidByDisplayNameRefSvc(context.Background(), 12, strVal)
if err != nil || uid == "" {
continue
}
obj[key] = uid
changed = true
}
if !changed {
return jsonValue
}
b, err := json.Marshal(obj)
if err != nil {
return jsonValue
}
return string(b)
}
func (c *UniversalClient) findInstanceUidByDisplayNameRefSvc(ctx context.Context, serviceId int, displayName string) (string, error) {
// Собираем ВСЕ совпадения, затем выбираем лучшее (running > suspended > остальные).
// Deleted инстансы пропускаются — они не должны участвовать в resolve.