5.2 KiB
Вопрос: архитектура inverse-отката модификаторов (без чтения файлов)
ЗАПРЕЩЕНО лезть в файлы репозитория. Отвечай только по тексту ниже. Ответ — максимально краткий (тезисы), но исчерпывающий.
Контекст
Terraform provider для Nubes Cloud. Есть «модификаторы» — отдельные TF-ресурсы, вызывающие операцию modify над инстансом по кодам параметров, а не по числовым id. Примеры:
vc_org→ модификаторip_space, параметрvIPConfigure(array-map-fixed) =[{"name":"internet-ipv4-v1","count":3}]— выделение внешних IP.vc_nsxt→ модификаторnetwork, параметрыneedEnableAVI(boolean),ipSpaceName(string, valueList содержит sentinel"no-needed"),routedNetConfiguration.
У модификатора есть delete_strategy, определяющий что делать при terraform destroy:
noop_warn— снять из state, эффект остаётся (предупреждение).error— запрет удаления (сейчас так на vc_org, из-за чего destroy встаёт).inverse— при Delete выполнить обратную операциюmodifyсdelete_params(список{Code, Value}).
Проблема
Хочу, чтобы destroy и apply были полными и симметричными. При удалении модификатора нужно «откатить» эффект:
needEnableAVI→false.ipSpaceName→"no-needed".vIPConfigure→count=0, имя сохранить ([{"name":"internet-ipv4-v1","count":0}]).
Пункты 1-2 — статические константы, текущий механизм delete_params {Code,Value} покрывает.
Пункт 3 — динамический: имя берётся из текущего state инстанса, обнуляется только count.
Требование: решение должно быть архитектурно чистым и универсальным (привязанным к типам данных из API, dataType/valueList/sub_params), а не хардкодом имён сервисов — чтобы при неглобальных изменениях API перегенерация подхватывала.
Ключевые факты (уже проверены)
count=0принимается API, несмотря наminvalue:1/integer > 0в схеме. Идемпотентно.ipSpaceNamesentinel «выключен» ="no-needed"(есть вvalueList).needEnableAVI— boolean: обратное ="false".- Типы из API:
needEnableAVI=boolean;ipSpaceName=string(+valueList);vIPConfigure=array-map-fixed(sub_params:name=string,count=integer).
Вопросы (нужны краткие ответы)
-
Как правильно расширить модель delete_params, чтобы поддержать и статичные обратные значения (
false,no-needed), и динамические преобразования (count→0)? Оцени вариант «типизированные правила:Mode∈ {static, zero_count, …}, где static=текущий Value, zero_count=обнулить integer-полеcount` в каждом элементе array-map-fixed, взятом из live state. -
Универсальнее ли выводить обратные значения ИЗ ТИПА ПАРАМЕТРА (boolean→"false", string+valueList→первый/помеченный sentinel, array-map-fixed→нулевой count в integer-полях), чем задавать их в реестре исключений? Где баланс: что держать в реестре (данные), что выводить из типа (логика)?
-
Нужен ли отдельный маркер «какое поле array-map-fixed обнулять» (сейчас это
count), или достаточно общего правила «обнулить все integer-поля sub_params»? Риски обоих. -
Правильный порядок destroy при зависимостях:
edge_net(SNAT off + ALB off) →org_ips(count=0) →nsxt→vdc. Как Terraform сам выведет порядок изdepends_on, и где инверсия/откат может конфликтовать с порядком удаления дочерних инстансов? -
Есть ли подводные камни в самом
inverse-delete (если дети ещё живы, откатcount=0на орге может не пройти)? Нужен ли двухфазный подход или достаточно полагаться на порядок?
Формат ответа: пункты пронумерованы под мои вопросы, 1-3 предложения на пункт. Без лишнего.