fix(generator): нормализация имён атрибутов (fail-safe для кодов с дефисами)
Инцидент: в 1_dummy (API dev) появились коды s3-inst / s3-ref-root. ToSnake не убирал дефисы -> в схему уходило tfsdk:"s3-inst" -> Terraform отвергает такие имена и НЕ загружает схему провайдера целиком (plan/apply падали). - helpers.go: ToSnake завершается sanitizeAttrName ([a-z0-9_] допустимы, остальное -> _). Код для API не меняется: json:"s3-inst" в генерате сохранён. - Проверено: в generated/dev/go нет tfsdk-имён с недопустимыми символами; go build OK; go test ./internal/... -short PASS. - DEV_STAND/FPipeGmail: провайдер 2.0.23 -> 2.0.1; после сброса lock/кэша terraform validate -> Success. - HISTORY: описан инцидент, причина (данные API изменились после утра), фикс и особенность: перезапись артефакта под тем же номером требует сброса lock (init -upgrade хеш не пересчитывает). dev 2.0.1 перезалит (sha256 linux d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f515bc725e407).
This commit is contained in:
@@ -43,7 +43,29 @@ func ToSnake(s string) string {
|
||||
}
|
||||
out = append(out, rune(strings.ToLower(string(r))[0]))
|
||||
}
|
||||
return string(out)
|
||||
return sanitizeAttrName(string(out))
|
||||
}
|
||||
|
||||
// sanitizeAttrName приводит имя атрибута к допустимому в Terraform виду:
|
||||
// разрешены только [a-z0-9_], всё остальное (в т.ч. '-', '.') заменяется на '_'.
|
||||
//
|
||||
// Зачем: API может отдавать коды с дефисами (например `s3-inst`, `s3-ref-root`).
|
||||
// Terraform отвергает такие имена атрибутов целиком ("Invalid Attribute/Block Name"),
|
||||
// из-за чего провайдер не может отдать схему и падает любой plan/apply.
|
||||
func sanitizeAttrName(s string) string {
|
||||
var b strings.Builder
|
||||
b.Grow(len(s))
|
||||
for _, r := range s {
|
||||
switch {
|
||||
case r >= 'a' && r <= 'z', r >= '0' && r <= '9', r == '_':
|
||||
b.WriteRune(r)
|
||||
case r >= 'A' && r <= 'Z':
|
||||
b.WriteRune(r + ('a' - 'A'))
|
||||
default:
|
||||
b.WriteRune('_')
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
|
||||
// ParamType возвращает Go-тип для параметра (types.Bool/Int64/String).
|
||||
|
||||
Reference in New Issue
Block a user