Fix VDC flow and FullPipe example

This commit is contained in:
Repinoid
2026-09-21 13:02:25 +03:00
parent 7d446977a5
commit 1ec6a0fedc
8 changed files with 196 additions and 59 deletions
+2 -42
View File
@@ -272,15 +272,10 @@ func (c *UniversalClient) CreateGenericInstanceUniversalV6(ctx context.Context,
opDetailsResp, _, err := c.doRequest(ctx, "GET", fmt.Sprintf("/instanceOperations/%s?fields=cfsParams", opUid), nil)
var opDetails universalOpResponse
hasOpDetails := false
if err != nil {
if hasUnresolvedParams(params) {
return "", fmt.Errorf("не удалось получить детали операции: %w", err)
}
} else if jsonErr := json.Unmarshal(opDetailsResp, &opDetails); jsonErr != nil {
if hasUnresolvedParams(params) {
if err == nil {
if jsonErr := json.Unmarshal(opDetailsResp, &opDetails); jsonErr != nil {
return "", fmt.Errorf("не удалось разобрать детали операции: %w", jsonErr)
}
} else {
hasOpDetails = true
params, err = c.resolveRefSvcParamValues(ctx, opDetails.InstanceOperation.CfsParams, params)
if err != nil {
@@ -1359,41 +1354,6 @@ func isUUIDLike(value string) bool {
return true
}
// hasUnresolvedParams возвращает true, если хотя бы одно значение параметров похоже на
// неразрешённое имя вместо UUID. Значения map-fixed/json/array, числа и булевы пропускаются.
func hasUnresolvedParams(params map[int]string) bool {
for _, val := range params {
trimmed := strings.TrimSpace(val)
if trimmed == "" || trimmed == "{}" || trimmed == "[]" {
continue
}
if strings.HasPrefix(trimmed, "{") || strings.HasPrefix(trimmed, "[") {
// json/map-fixed/array не являются именами одиночных инстансов
continue
}
if trimmed == "true" || trimmed == "false" {
continue
}
isNum := true
for _, r := range trimmed {
if r < '0' || r > '9' {
isNum = false
break
}
}
if isNum {
continue
}
if isUUIDLike(trimmed) {
continue
}
// Обнаружена не-числовая строка, не JSON и не UUID (потенциальное имя).
// Если GET ?fields=cfsParams упал, такое имя невозможно разрешить в UUID.
return true
}
return false
}
func isHexDigit(r rune) bool {
return (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F')
}