Files
tf_provider/HISTORY/2026-10-01_release_subresource_password_output.md
T
Repinoid cc8f338969 docs(release): перезаливка 1.0.0/2.0.0/3.0.0 с выходом password у подресурсов
- старые x.0.0 удалены физически из реестра по команде владельца, затем залиты заново
  теми же номерами; sha256 всех трёх сверен с локальными сборками;
- VERSIONS.md: новые sha256 + пометка об удалении версий;
- HISTORY: зачем, что удалено, схема залитой сборки (password — новый выход у
  postgres_user/kafka_user/clickhouse_user/mongodb_user; у mariadb_user и pgadmin
  это прежние входные параметры), проверка стенда, состояние state.
2026-10-01 17:31:26 +03:00

5.6 KiB
Raw Blame History

2026-10-01 — Перезаливка 1.0.0 / 2.0.0 / 3.0.0 с выходом password у подресурсов-пользователей

Команда владельца: «делай. сначала удали старые .0 провайдеры чтобы не путаться» + подтверждение номеров: 1.0.0 / 2.0.0 / 3.0.0.

Зачем перезаливать

После релиза keep_on_destroy (см. HISTORY/2026-10-01_release_keep_on_destroy_subresources.md) в мастер пришла новая фича: подресурс-пользователь отдаёт пароль своим выходом (коммиты 58c519e — генератор/ядро, 066d6b4 — стенд, 1a049ef — архитектура).

Причина: пароль пользователя генерирует платформа и кладёт его в секрет Vault родительского инстанса, а vault_secrets родителя — Computed и обновляется только при его Read. Поэтому внутри одного apply после create_user пароль был недоступен: jsondecode(vault_secrets["users"])[...] → Invalid index. Из-за этого стенду требовались костыль try() или двухшаговый apply.

Шаг 0. Удаление старых версий (необратимо)

Сначала удалены физически старые версии (бакет un-versioned):

mc --config-dir /tmp/mc-cfg rm --recursive --force \
  prod-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/<ns>/nubes/<v>/
Namespace Версия Удалено объектов
nubes (prod) 1.0.0 5
nubes-test 3.0.0 5
nubes-dev 2.0.0 5

Не тронуты: 2.0.1, 2.0.21–2.0.24 (dev).

Шаг 1. Заливка новых сборок под теми же номерами

export MC_CONFIG_DIR=/tmp/mc-cfg
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 3.0.0
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev  2.0.0
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 1.0.0
Стенд Namespace Версия sha256 залитого == локальному
TEST nubes-test 3.0.0 ✅ e188a635064ec0fc…
DEV nubes-dev 2.0.0 ✅ ac8d99fb02487272…
PROD nubes 1.0.0 ✅ 0de9aa4537a74ecf…

API /versions: nubes → ['1.0.0'], nubes-test → ['3.0.0'], nubes-dev → ['2.0.0','2.0.1','2.0.21','2.0.22','2.0.23','2.0.24'].

Шаг 2. Проверка схемы залитой сборки (test 3.0.0)

terraform providers schema -json (62 ресурса):

Ресурс password в схеме Что это
nubes_postgres_user computed: true, sensitive: true новый выход (читается из Vault родителя)
nubes_kafka_user computed: true, sensitive: true новый выход
nubes_clickhouse_user computed: true, sensitive: true новый выход
nubes_mongodb_user computed: true, sensitive: true новый выход
nubes_postgres_database нет атрибута —
nubes_mariadb_user optional+computed+sensitive входной параметр (не тронут)
nubes_pgadmin required+sensitive входной параметр сервиса (не тронут)

Признак фичи вычисляется из данных спека (см. TOOLS/ARCHITECTURE.md): подресурс user + у сервиса есть vault-выходы + create_user принимает username

  • create_user НЕ принимает password. Имя сервиса в коде не проверяется.

Шаг 3. Стенд

TEST_STAND/CRUD/pg/outputs.tf:

output "pg_password" {
  value     = nubes_postgres_user.crud_user_0.password
  sensitive = true
}

Проверено после релиза: terraform init + validate → Success; plan → 3 to add, 0 to change, 0 to destroy, в плане password = (sensitive value). Ни try(), ни двух apply в pg/ больше не требуется.

Локальные кэши провайдера в pg/ и apps/ переинициализированы (при той же версии Terraform не перекачивает пакет: .terraform.lock.hcl фиксирует хэши — при несовпадении удалить lock и .terraform/providers, затем terraform init).

⚠️ Состояние стенда на момент релиза

TEST_STAND/CRUD/pg/terraform.tfstate — пуст (180 байт, resources: [], terraform state list пуст), бэкап — 10010 байт. В облаке инстанс pg4crud2 существовал в статусе deleted/isSuspended (проверка по API ранее). Исполнитель (агент) apply/destroy не запускал — только init/validate/plan/state-чтение.

Связанные документы

  • TOOLS/ARCHITECTURE.md → «Subresource-born secrets» — принцип и правило;
  • HISTORY/2026-10-01_release_keep_on_destroy_subresources.md — прошлая перезаливка;
  • HISTORY/2026-09-30_dev_registry_prune_versions.md — процедура удаления версий;
  • VERSIONS.md — таблица версий (обновлена).