fix: resolve s3Uid name→UUID for uuid sub-params inside map-fixed
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user