@intentius/chant-lexicon-terraform 0.124.52 → 0.124.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -10
- package/dist/__fixtures__/pr-loop/estate.component.d.ts +7 -0
- package/dist/__fixtures__/pr-loop/estate.component.d.ts.map +1 -0
- package/dist/__fixtures__/pr-loop/estate.component.js +7 -0
- package/dist/__fixtures__/report/generate.d.ts +26 -0
- package/dist/__fixtures__/report/generate.d.ts.map +1 -0
- package/dist/__fixtures__/report/generate.js +58 -0
- package/dist/applied-state.d.ts +27 -0
- package/dist/applied-state.d.ts.map +1 -0
- package/dist/applied-state.js +44 -0
- package/dist/backend-config.d.ts +53 -0
- package/dist/backend-config.d.ts.map +1 -0
- package/dist/backend-config.js +136 -0
- package/dist/behaviour/kinds.d.ts.map +1 -1
- package/dist/behaviour/kinds.js +4 -0
- package/dist/behaviour/predict.d.ts.map +1 -1
- package/dist/behaviour/predict.js +6 -2
- package/dist/behaviour/reference-catalog.d.ts +16 -5
- package/dist/behaviour/reference-catalog.d.ts.map +1 -1
- package/dist/behaviour/reference-catalog.js +16 -5
- package/dist/behaviour/request.d.ts.map +1 -1
- package/dist/behaviour/request.js +3 -2
- package/dist/changed-roots.d.ts +6 -4
- package/dist/changed-roots.d.ts.map +1 -1
- package/dist/changed-roots.js +14 -18
- package/dist/ci-setup.d.ts +11 -0
- package/dist/ci-setup.d.ts.map +1 -0
- package/dist/ci-setup.js +41 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +4 -3
- package/dist/components/capability-plugin.d.ts +105 -9
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/capability-plugin.js +357 -36
- package/dist/components/compose-group.d.ts +145 -0
- package/dist/components/compose-group.d.ts.map +1 -0
- package/dist/components/compose-group.js +407 -0
- package/dist/components/placeholder-preview.d.ts +78 -0
- package/dist/components/placeholder-preview.d.ts.map +1 -0
- package/dist/components/placeholder-preview.js +254 -0
- package/dist/components/release-inputs.d.ts +29 -0
- package/dist/components/release-inputs.d.ts.map +1 -0
- package/dist/components/release-inputs.js +57 -0
- package/dist/components/trace-facts.d.ts +16 -0
- package/dist/components/trace-facts.d.ts.map +1 -0
- package/dist/components/trace-facts.js +19 -0
- package/dist/compose/apply-events.d.ts +46 -0
- package/dist/compose/apply-events.d.ts.map +1 -0
- package/dist/compose/apply-events.js +77 -0
- package/dist/compose/estate.d.ts +194 -0
- package/dist/compose/estate.d.ts.map +1 -0
- package/dist/compose/estate.js +363 -0
- package/dist/compose/hcl.d.ts +99 -0
- package/dist/compose/hcl.d.ts.map +1 -0
- package/dist/compose/hcl.js +302 -0
- package/dist/compose/module-address.d.ts +24 -0
- package/dist/compose/module-address.d.ts.map +1 -0
- package/dist/compose/module-address.js +43 -0
- package/dist/compose/root.d.ts +127 -0
- package/dist/compose/root.d.ts.map +1 -0
- package/dist/compose/root.js +586 -0
- package/dist/compose/run.d.ts +183 -0
- package/dist/compose/run.d.ts.map +1 -0
- package/dist/compose/run.js +447 -0
- package/dist/compose/slice.d.ts +102 -0
- package/dist/compose/slice.d.ts.map +1 -0
- package/dist/compose/slice.js +249 -0
- package/dist/compose/state-address.d.ts +28 -0
- package/dist/compose/state-address.d.ts.map +1 -0
- package/dist/compose/state-address.js +154 -0
- package/dist/compose/state-merge.d.ts +52 -0
- package/dist/compose/state-merge.d.ts.map +1 -0
- package/dist/compose/state-merge.js +135 -0
- package/dist/compose.d.ts +179 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +482 -0
- package/dist/composites/terraform-apply-op.d.ts.map +1 -1
- package/dist/composites/terraform-apply-op.js +7 -3
- package/dist/cone.d.ts +53 -0
- package/dist/cone.d.ts.map +1 -0
- package/dist/cone.js +119 -0
- package/dist/config.d.ts +59 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -9
- package/dist/cost-hold.d.ts +27 -0
- package/dist/cost-hold.d.ts.map +1 -0
- package/dist/cost-hold.js +21 -0
- package/dist/describe-resources.d.ts +74 -12
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/describe-resources.js +374 -66
- package/dist/drift-read.d.ts +33 -0
- package/dist/drift-read.d.ts.map +1 -0
- package/dist/drift-read.js +243 -0
- package/dist/drift-record.d.ts +147 -0
- package/dist/drift-record.d.ts.map +1 -0
- package/dist/drift-record.js +383 -0
- package/dist/drift-rows.d.ts +61 -0
- package/dist/drift-rows.d.ts.map +1 -0
- package/dist/drift-rows.js +108 -0
- package/dist/exit-codes.d.ts +55 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +48 -0
- package/dist/hcl/edges.d.ts.map +1 -1
- package/dist/hcl/edges.js +24 -1
- package/dist/hcl/files.d.ts +61 -0
- package/dist/hcl/files.d.ts.map +1 -0
- package/dist/hcl/files.js +221 -0
- package/dist/hcl/instances.d.ts +82 -0
- package/dist/hcl/instances.d.ts.map +1 -0
- package/dist/hcl/instances.js +390 -0
- package/dist/hcl/parse.d.ts +81 -9
- package/dist/hcl/parse.d.ts.map +1 -1
- package/dist/hcl/parse.js +114 -16
- package/dist/hcl/roots.d.ts.map +1 -1
- package/dist/hcl/roots.js +5 -0
- package/dist/hcl/suppressions.d.ts.map +1 -1
- package/dist/hcl/suppressions.js +8 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -2
- package/dist/integrity.json +8 -5
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/audit-catalog.js +27 -3
- package/dist/lint/audit-lineage.d.ts +14 -2
- package/dist/lint/audit-lineage.d.ts.map +1 -1
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/post-synth/index.js +4 -0
- package/dist/lint/post-synth/record-store.d.ts +54 -0
- package/dist/lint/post-synth/record-store.d.ts.map +1 -0
- package/dist/lint/post-synth/record-store.js +104 -0
- package/dist/lint/post-synth/tf001.d.ts +2 -2
- package/dist/lint/post-synth/tf001.js +2 -2
- package/dist/lint/post-synth/tf024.d.ts +35 -11
- package/dist/lint/post-synth/tf024.d.ts.map +1 -1
- package/dist/lint/post-synth/tf024.js +92 -20
- package/dist/lint/post-synth/tf046.d.ts +64 -0
- package/dist/lint/post-synth/tf046.d.ts.map +1 -0
- package/dist/lint/post-synth/tf046.js +175 -0
- package/dist/lint/post-synth/tf047.d.ts +36 -0
- package/dist/lint/post-synth/tf047.d.ts.map +1 -0
- package/dist/lint/post-synth/tf047.js +94 -0
- package/dist/live-plan-reasons.d.ts +21 -0
- package/dist/live-plan-reasons.d.ts.map +1 -0
- package/dist/live-plan-reasons.js +47 -0
- package/dist/lock-rows.d.ts +36 -0
- package/dist/lock-rows.d.ts.map +1 -0
- package/dist/lock-rows.js +60 -0
- package/dist/lock-timeout.d.ts +22 -0
- package/dist/lock-timeout.d.ts.map +1 -0
- package/dist/lock-timeout.js +32 -0
- package/dist/lsp/option-keys.d.ts.map +1 -1
- package/dist/lsp/option-keys.js +2 -0
- package/dist/manifest.json +1 -1
- package/dist/module-catalog/index.d.ts +69 -0
- package/dist/module-catalog/index.d.ts.map +1 -0
- package/dist/module-catalog/index.js +110 -0
- package/dist/module-catalog/refresh-cli.d.ts +4 -0
- package/dist/module-catalog/refresh-cli.d.ts.map +1 -0
- package/dist/module-catalog/refresh-cli.js +64 -0
- package/dist/module-catalog/static-tier.d.ts +6 -0
- package/dist/module-catalog/static-tier.d.ts.map +1 -0
- package/dist/module-catalog/static-tier.js +1650 -0
- package/dist/module-catalog/types.d.ts +65 -0
- package/dist/module-catalog/types.d.ts.map +1 -0
- package/dist/module-catalog/types.js +33 -0
- package/dist/okf/index.md +3 -1
- package/dist/okf/rules/TF024.md +2 -2
- package/dist/okf/rules/TF046.md +11 -0
- package/dist/okf/rules/TF047.md +11 -0
- package/dist/op/activities/index.d.ts +6 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +5 -1
- package/dist/op/activities/live-detect.d.ts +4 -3
- package/dist/op/activities/live-detect.d.ts.map +1 -1
- package/dist/op/activities/live-detect.js +57 -32
- package/dist/op/activities/pin-rollout.d.ts +2 -0
- package/dist/op/activities/pin-rollout.d.ts.map +1 -1
- package/dist/op/activities/pin-rollout.js +1 -0
- package/dist/op/activities/terraform.d.ts +182 -5
- package/dist/op/activities/terraform.d.ts.map +1 -1
- package/dist/op/activities/terraform.js +224 -24
- package/dist/op/activity-contracts.d.ts +27 -0
- package/dist/op/activity-contracts.d.ts.map +1 -1
- package/dist/op/activity-contracts.js +19 -1
- package/dist/op/builders.d.ts +7 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -0
- package/dist/pin/consumers.d.ts +35 -0
- package/dist/pin/consumers.d.ts.map +1 -0
- package/dist/pin/consumers.js +70 -0
- package/dist/pin/edit.d.ts.map +1 -1
- package/dist/pin/edit.js +35 -0
- package/dist/pin/rollout.d.ts +2 -0
- package/dist/pin/rollout.d.ts.map +1 -1
- package/dist/pin/rollout.js +14 -11
- package/dist/plan-shape.d.ts +30 -0
- package/dist/plan-shape.d.ts.map +1 -0
- package/dist/plan-shape.js +125 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +37 -18
- package/dist/registry/address.d.ts +63 -0
- package/dist/registry/address.d.ts.map +1 -0
- package/dist/registry/address.js +65 -0
- package/dist/registry/catalog-read.d.ts +14 -0
- package/dist/registry/catalog-read.d.ts.map +1 -0
- package/dist/registry/catalog-read.js +58 -0
- package/dist/registry/deprecated.d.ts +37 -0
- package/dist/registry/deprecated.d.ts.map +1 -0
- package/dist/registry/deprecated.js +43 -0
- package/dist/registry/docs.d.ts +96 -0
- package/dist/registry/docs.d.ts.map +1 -0
- package/dist/registry/docs.js +210 -0
- package/dist/registry/edge/edge.d.ts +46 -0
- package/dist/registry/edge/edge.d.ts.map +1 -0
- package/dist/registry/edge/edge.js +194 -0
- package/dist/registry/edge/index.d.ts +11 -0
- package/dist/registry/edge/index.d.ts.map +1 -0
- package/dist/registry/edge/index.js +10 -0
- package/dist/registry/edge/lambda-edge.d.ts +76 -0
- package/dist/registry/edge/lambda-edge.d.ts.map +1 -0
- package/dist/registry/edge/lambda-edge.js +95 -0
- package/dist/registry/edge/sigv4-web.d.ts +33 -0
- package/dist/registry/edge/sigv4-web.d.ts.map +1 -0
- package/dist/registry/edge/sigv4-web.js +56 -0
- package/dist/registry/edge/token-source.d.ts +73 -0
- package/dist/registry/edge/token-source.d.ts.map +1 -0
- package/dist/registry/edge/token-source.js +115 -0
- package/dist/registry/edge/worker.d.ts +45 -0
- package/dist/registry/edge/worker.d.ts.map +1 -0
- package/dist/registry/edge/worker.js +26 -0
- package/dist/registry/handler.d.ts +25 -0
- package/dist/registry/handler.d.ts.map +1 -0
- package/dist/registry/handler.js +75 -0
- package/dist/registry/headers-file.d.ts +21 -0
- package/dist/registry/headers-file.d.ts.map +1 -0
- package/dist/registry/headers-file.js +57 -0
- package/dist/registry/index.d.ts +31 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +30 -0
- package/dist/registry/mirror-paths.d.ts +9 -0
- package/dist/registry/mirror-paths.d.ts.map +1 -0
- package/dist/registry/mirror-paths.js +8 -0
- package/dist/registry/mirror.d.ts +130 -0
- package/dist/registry/mirror.d.ts.map +1 -0
- package/dist/registry/mirror.js +319 -0
- package/dist/registry/proxies.d.ts +73 -0
- package/dist/registry/proxies.d.ts.map +1 -0
- package/dist/registry/proxies.js +111 -0
- package/dist/registry/reader.d.ts +57 -0
- package/dist/registry/reader.d.ts.map +1 -0
- package/dist/registry/reader.js +198 -0
- package/dist/registry/semver.d.ts +16 -0
- package/dist/registry/semver.d.ts.map +1 -0
- package/dist/registry/semver.js +24 -0
- package/dist/registry/serve.d.ts +24 -0
- package/dist/registry/serve.d.ts.map +1 -0
- package/dist/registry/serve.js +64 -0
- package/dist/registry/source-forms.d.ts +79 -0
- package/dist/registry/source-forms.d.ts.map +1 -0
- package/dist/registry/source-forms.js +202 -0
- package/dist/registry/targets/artifactory.d.ts +28 -0
- package/dist/registry/targets/artifactory.d.ts.map +1 -0
- package/dist/registry/targets/artifactory.js +206 -0
- package/dist/registry/targets/fake-artifactory.d.ts +30 -0
- package/dist/registry/targets/fake-artifactory.d.ts.map +1 -0
- package/dist/registry/targets/fake-artifactory.js +142 -0
- package/dist/registry/targets/fake-gitlab.d.ts +39 -0
- package/dist/registry/targets/fake-gitlab.d.ts.map +1 -0
- package/dist/registry/targets/fake-gitlab.js +136 -0
- package/dist/registry/targets/fake-hcp.d.ts +50 -0
- package/dist/registry/targets/fake-hcp.d.ts.map +1 -0
- package/dist/registry/targets/fake-hcp.js +202 -0
- package/dist/registry/targets/fake-http.d.ts +31 -0
- package/dist/registry/targets/fake-http.d.ts.map +1 -0
- package/dist/registry/targets/fake-http.js +87 -0
- package/dist/registry/targets/fake-nexus.d.ts +27 -0
- package/dist/registry/targets/fake-nexus.d.ts.map +1 -0
- package/dist/registry/targets/fake-nexus.js +137 -0
- package/dist/registry/targets/gitlab.d.ts +53 -0
- package/dist/registry/targets/gitlab.d.ts.map +1 -0
- package/dist/registry/targets/gitlab.js +187 -0
- package/dist/registry/targets/hcp.d.ts +29 -0
- package/dist/registry/targets/hcp.d.ts.map +1 -0
- package/dist/registry/targets/hcp.js +310 -0
- package/dist/registry/targets/hosted.d.ts +62 -0
- package/dist/registry/targets/hosted.d.ts.map +1 -0
- package/dist/registry/targets/hosted.js +74 -0
- package/dist/registry/targets/index.d.ts +18 -0
- package/dist/registry/targets/index.d.ts.map +1 -0
- package/dist/registry/targets/index.js +17 -0
- package/dist/registry/targets/module-target.d.ts +68 -0
- package/dist/registry/targets/module-target.d.ts.map +1 -0
- package/dist/registry/targets/module-target.js +63 -0
- package/dist/registry/targets/nexus.d.ts +43 -0
- package/dist/registry/targets/nexus.d.ts.map +1 -0
- package/dist/registry/targets/nexus.js +250 -0
- package/dist/registry/targets/zip.d.ts +55 -0
- package/dist/registry/targets/zip.d.ts.map +1 -0
- package/dist/registry/targets/zip.js +278 -0
- package/dist/registry/writer.d.ts +101 -0
- package/dist/registry/writer.d.ts.map +1 -0
- package/dist/registry/writer.js +109 -0
- package/dist/report.d.ts +15 -6
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +28 -55
- package/dist/rules/record-store.ts +122 -0
- package/dist/rules/tf001.ts +2 -2
- package/dist/rules/tf024.ts +105 -22
- package/dist/rules/tf046.ts +204 -0
- package/dist/rules/tf047.ts +114 -0
- package/dist/skills/chant-terraform.md +1 -1
- package/dist/state/azure-blob.d.ts +9 -0
- package/dist/state/azure-blob.d.ts.map +1 -0
- package/dist/state/azure-blob.js +8 -0
- package/dist/state/backend.d.ts +158 -0
- package/dist/state/backend.d.ts.map +1 -0
- package/dist/state/backend.js +406 -0
- package/dist/state/exec.d.ts +39 -0
- package/dist/state/exec.d.ts.map +1 -0
- package/dist/state/exec.js +80 -0
- package/dist/state/gcs.d.ts +8 -0
- package/dist/state/gcs.d.ts.map +1 -0
- package/dist/state/gcs.js +7 -0
- package/dist/state/index.d.ts +15 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +14 -0
- package/dist/state/locks.d.ts +105 -0
- package/dist/state/locks.d.ts.map +1 -0
- package/dist/state/locks.js +130 -0
- package/dist/state/object-store.d.ts +8 -0
- package/dist/state/object-store.d.ts.map +1 -0
- package/dist/state/object-store.js +7 -0
- package/dist/state/root-states.d.ts +131 -0
- package/dist/state/root-states.d.ts.map +1 -0
- package/dist/state/root-states.js +241 -0
- package/dist/state/s3.d.ts +21 -0
- package/dist/state/s3.d.ts.map +1 -0
- package/dist/state/s3.js +19 -0
- package/dist/state/store.d.ts +51 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +185 -0
- package/dist/state-ops.d.ts +255 -0
- package/dist/state-ops.d.ts.map +1 -0
- package/dist/state-ops.js +305 -0
- package/dist/state-reads.d.ts +57 -0
- package/dist/state-reads.d.ts.map +1 -0
- package/dist/state-reads.js +104 -0
- package/dist/terragrunt/affected.d.ts.map +1 -1
- package/dist/terragrunt/affected.js +2 -1
- package/dist/used-sources.d.ts +54 -0
- package/dist/used-sources.d.ts.map +1 -0
- package/dist/used-sources.js +157 -0
- package/package.json +24 -4
- package/src/__fixtures__/ACCEPTANCE.md +69 -7
- package/src/__fixtures__/compose/apply-failed-in-app.jsonl +12 -0
- package/src/__fixtures__/compose/state-app.json +66 -0
- package/src/__fixtures__/compose/state-edge.json +40 -0
- package/src/__fixtures__/compose/state-net.json +58 -0
- package/src/__fixtures__/compose/three-app.plan.json +184 -0
- package/src/__fixtures__/compose/three-composed.plan.json +509 -0
- package/src/__fixtures__/compose/three-edge.plan.json +144 -0
- package/src/__fixtures__/compose/three-net.plan.json +174 -0
- package/src/__fixtures__/compose/unknown-composed.plan.json +228 -0
- package/src/__fixtures__/compose/working-after-apply.json +145 -0
- package/src/__fixtures__/config-blocks/app/main.tf +61 -0
- package/src/__fixtures__/config-blocks/app/modules/network/main.tf +4 -0
- package/src/__fixtures__/config-blocks/app-json/main.tf.json +39 -0
- package/src/__fixtures__/config-files/shadow/main.tf +3 -0
- package/src/__fixtures__/config-files/shadow/main.tofu +3 -0
- package/src/__fixtures__/config-files/shadow/other.tf +3 -0
- package/src/__fixtures__/config-files/tf/main.tf +11 -0
- package/src/__fixtures__/config-files/tf-json/main.tf.json +18 -0
- package/src/__fixtures__/config-files/tofu/main.tofu +11 -0
- package/src/__fixtures__/config-files/tofu-json/main.tofu.json +18 -0
- package/src/__fixtures__/config-files/tofu-only/main.tofu +3 -0
- package/src/__fixtures__/drift-record/README.md +16 -0
- package/src/__fixtures__/drift-record/live-plan-sections.json +27 -0
- package/src/__fixtures__/drift-rows/live-root-plan.json +70 -0
- package/src/__fixtures__/drift-rows/refresh-plan.json +61 -0
- package/src/__fixtures__/instance-forms/app/main.tf +110 -0
- package/src/__fixtures__/instance-forms/app/modules/svc/main.tf +3 -0
- package/src/__fixtures__/instance-vars/app/main.tf +52 -0
- package/src/__fixtures__/instance-vars/app/modules/app/main.tf +12 -0
- package/src/__fixtures__/instance-vars/app/modules/edge/main.tf +3 -0
- package/src/__fixtures__/instance-vars/app/terraform.tfvars +1 -0
- package/src/__fixtures__/live-module-keyed/live-graph.json +259 -0
- package/src/__fixtures__/live-module-keyed/live-plan.json +87 -0
- package/src/__fixtures__/live-module-keyed/root/estate.chdf.hcl +1 -0
- package/src/__fixtures__/live-module-keyed/root/main.tf +21 -0
- package/src/__fixtures__/live-module-keyed/root/modules/app/main.tf +17 -0
- package/src/__fixtures__/live-module-keyed/root/modules/edge/main.tf +7 -0
- package/src/__fixtures__/live-module-keyed/root/versions.tf +30 -0
- package/src/__fixtures__/live-module-keyed/show-state.json +146 -0
- package/src/__fixtures__/pr-loop/README.md +50 -0
- package/src/__fixtures__/pr-loop/chant.config.json +13 -0
- package/src/__fixtures__/pr-loop/estate.component.ts +10 -0
- package/src/__fixtures__/pr-loop/roots/a/main.tf +11 -0
- package/src/__fixtures__/pr-loop/roots/app/main.tf +19 -0
- package/src/__fixtures__/pr-loop/roots/b/main.tf +7 -0
- package/src/__fixtures__/pr-loop/roots/dns/main.tf +3 -0
- package/src/__fixtures__/pr-loop/roots/net/main.tf +7 -0
- package/src/__fixtures__/report/applied.show.json +51 -0
- package/src/__fixtures__/report/generate.ts +63 -0
- package/src/__fixtures__/report/plan.show.json +200 -0
- package/src/__fixtures__/report/tf-apply/change-set.json +170 -0
- package/src/__fixtures__/report/tf-apply/report.json +338 -0
- package/src/__fixtures__/report/tf-plan/change-set.json +170 -0
- package/src/__fixtures__/report/tf-plan/report.json +320 -0
- package/src/__fixtures__/three-cloud-azure.graph.json +290 -0
- package/src/__fixtures__/used-sources/root/extra.tofu +1 -0
- package/src/__fixtures__/used-sources/root/main.tf +31 -0
- package/src/__fixtures__/used-sources/root/modules/net/main.tf +14 -0
- package/src/__fixtures__/used-sources/root/modules/net/versions.tf.json +7 -0
- package/src/__fixtures__/used-sources/unit/terragrunt.hcl +3 -0
- package/src/applied-state.ts +52 -0
- package/src/backend-config.test.ts +105 -0
- package/src/backend-config.ts +133 -0
- package/src/behaviour/kinds.ts +4 -0
- package/src/behaviour/predict.ts +5 -2
- package/src/behaviour/reference-catalog.plugin.test.ts +65 -0
- package/src/behaviour/reference-catalog.ts +16 -5
- package/src/behaviour/request.ts +3 -2
- package/src/change-set-instances.test.ts +98 -0
- package/src/changed-roots.ts +14 -16
- package/src/ci-setup.ts +42 -0
- package/src/commands.ts +4 -3
- package/src/components/capability-plugin.test.ts +198 -19
- package/src/components/capability-plugin.ts +383 -35
- package/src/components/change-set-graph.e2e.test.ts +11 -5
- package/src/components/compose-group.test.ts +486 -0
- package/src/components/compose-group.ts +489 -0
- package/src/components/demo-composed-roots.e2e.test.ts +440 -0
- package/src/components/member-outputs.test.ts +76 -0
- package/src/components/placeholder-preview.test.ts +147 -0
- package/src/components/placeholder-preview.ts +257 -0
- package/src/components/pr-loop-compose.tofu.e2e.test.ts +363 -0
- package/src/components/pr-loop.tofu.test.ts +113 -57
- package/src/components/release-inputs.ts +69 -0
- package/src/components/trace-facts.test.ts +21 -0
- package/src/components/trace-facts.ts +27 -0
- package/src/compose/apply-events.test.ts +62 -0
- package/src/compose/apply-events.ts +100 -0
- package/src/compose/estate.choudoufu.e2e.test.ts +112 -0
- package/src/compose/estate.test.ts +421 -0
- package/src/compose/estate.ts +443 -0
- package/src/compose/hcl.ts +311 -0
- package/src/compose/module-address.ts +49 -0
- package/src/compose/root.test.ts +416 -0
- package/src/compose/root.ts +592 -0
- package/src/compose/run.test.ts +440 -0
- package/src/compose/run.tofu.test.ts +176 -0
- package/src/compose/run.ts +527 -0
- package/src/compose/slice.test.ts +184 -0
- package/src/compose/slice.ts +290 -0
- package/src/compose/state-address.ts +157 -0
- package/src/compose/state-merge.test.ts +131 -0
- package/src/compose/state-merge.ts +148 -0
- package/src/compose.test.ts +248 -0
- package/src/compose.ts +627 -0
- package/src/composites/terraform-apply-op.test.ts +9 -0
- package/src/composites/terraform-apply-op.ts +7 -3
- package/src/cone.ts +138 -0
- package/src/config-file-listers.test.ts +265 -0
- package/src/config.ts +44 -9
- package/src/cost-hold.ts +29 -0
- package/src/describe-resources.engine-facts.test.ts +411 -0
- package/src/describe-resources.live-module-keyed.test.ts +290 -0
- package/src/describe-resources.ts +416 -70
- package/src/drift-read.ts +284 -0
- package/src/drift-record.test.ts +223 -0
- package/src/drift-record.ts +455 -0
- package/src/drift-rows.test.ts +135 -0
- package/src/drift-rows.ts +137 -0
- package/src/exit-codes.test.ts +23 -0
- package/src/exit-codes.ts +59 -0
- package/src/hcl/config-blocks.test.ts +174 -0
- package/src/hcl/edges.ts +21 -1
- package/src/hcl/files.ts +234 -0
- package/src/hcl/instance-forms.test.ts +94 -0
- package/src/hcl/instances.test.ts +137 -0
- package/src/hcl/instances.ts +422 -0
- package/src/hcl/parse.test.ts +139 -1
- package/src/hcl/parse.ts +149 -16
- package/src/hcl/roots.ts +6 -0
- package/src/hcl/suppressions.ts +8 -2
- package/src/index.ts +79 -0
- package/src/lint/audit-catalog.ts +29 -3
- package/src/lint/audit-lineage.ts +14 -2
- package/src/lint/post-synth/fixtures/TF024/live-with-record-store/main.tf +18 -0
- package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/estate.chdf.hcl +1 -0
- package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/main.tf +10 -0
- package/src/lint/post-synth/fixtures/TF046/azurerm-no-resource-group/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF046/backend-config-only/main.tf +14 -0
- package/src/lint/post-synth/fixtures/TF046/derived-s3/backend.tf +7 -0
- package/src/lint/post-synth/fixtures/TF046/derived-s3/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF046/explicit-local/main.tf +16 -0
- package/src/lint/post-synth/fixtures/TF046/explicit-s3-beside-local-backend/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF046/implied-local/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF046/sidecar-implied/estate.chdf.hcl +1 -0
- package/src/lint/post-synth/fixtures/TF046/sidecar-implied/main.tf +5 -0
- package/src/lint/post-synth/fixtures/TF047/clear/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/refused/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/unknown-module/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/unknown-version/main.tf +12 -0
- package/src/lint/post-synth/index.ts +4 -0
- package/src/lint/post-synth/record-store.ts +122 -0
- package/src/lint/post-synth/tf001.ts +2 -2
- package/src/lint/post-synth/tf024.test.ts +26 -5
- package/src/lint/post-synth/tf024.ts +105 -22
- package/src/lint/post-synth/tf046.test.ts +137 -0
- package/src/lint/post-synth/tf046.ts +204 -0
- package/src/lint/post-synth/tf047.test.ts +56 -0
- package/src/lint/post-synth/tf047.ts +114 -0
- package/src/live-plan-reasons.ts +54 -0
- package/src/lock-rows.test.ts +70 -0
- package/src/lock-rows.ts +82 -0
- package/src/lock-timeout.ts +34 -0
- package/src/lsp/completions.test.ts +1 -1
- package/src/lsp/option-keys.ts +2 -0
- package/src/module-catalog/index.test.ts +93 -0
- package/src/module-catalog/index.ts +159 -0
- package/src/module-catalog/refresh-cli.ts +68 -0
- package/src/module-catalog/static-tier.ts +1659 -0
- package/src/module-catalog/types.ts +88 -0
- package/src/op/activities/choudoufu-plan-set-op.test.ts +111 -0
- package/src/op/activities/index.ts +9 -0
- package/src/op/activities/live-detect.ts +55 -26
- package/src/op/activities/pin-rollout.ts +3 -0
- package/src/op/activities/registry.test.ts +2 -1
- package/src/op/activities/terraform.test.ts +55 -0
- package/src/op/activities/terraform.ts +312 -27
- package/src/op/activity-contracts.test.ts +1 -0
- package/src/op/activity-contracts.ts +24 -1
- package/src/op/builders.ts +14 -0
- package/src/op-wave-step.test.ts +109 -0
- package/src/pin/__fixtures__/consumers/live/dev/main.tf +4 -0
- package/src/pin/__fixtures__/consumers/live/prod/main.tf +21 -0
- package/src/pin/__fixtures__/consumers/units/vpc/terragrunt.hcl +7 -0
- package/src/pin/bundle.test.ts +2 -0
- package/src/pin/consumers.test.ts +57 -0
- package/src/pin/consumers.ts +95 -0
- package/src/pin/edit.ts +30 -0
- package/src/pin/rollout.ts +16 -11
- package/src/plan-shape.test.ts +148 -0
- package/src/plan-shape.ts +128 -0
- package/src/plugin.ts +39 -19
- package/src/registry/__fixtures__/docs/documented/.terraform-docs.yml +3 -0
- package/src/registry/__fixtures__/docs/documented/README.md +1 -0
- package/src/registry/__fixtures__/docs/documented/main.tf +8 -0
- package/src/registry/__fixtures__/docs/json/main.tf.json +14 -0
- package/src/registry/__fixtures__/docs/vpc/README.md +3 -0
- package/src/registry/__fixtures__/docs/vpc/examples/complete/main.tf +5 -0
- package/src/registry/__fixtures__/docs/vpc/examples/simple/README.md +1 -0
- package/src/registry/__fixtures__/docs/vpc/examples/simple/main.tf +4 -0
- package/src/registry/__fixtures__/docs/vpc/main.tf +14 -0
- package/src/registry/__fixtures__/docs/vpc/outputs.tf +9 -0
- package/src/registry/__fixtures__/docs/vpc/variables.tf +16 -0
- package/src/registry/__fixtures__/proxied-root/main.tf +12 -0
- package/src/registry/address.ts +100 -0
- package/src/registry/catalog-read.ts +56 -0
- package/src/registry/deprecated.test.ts +139 -0
- package/src/registry/deprecated.ts +76 -0
- package/src/registry/docs.test.ts +140 -0
- package/src/registry/docs.ts +299 -0
- package/src/registry/edge/bundle.test.ts +50 -0
- package/src/registry/edge/edge.test.ts +176 -0
- package/src/registry/edge/edge.ts +211 -0
- package/src/registry/edge/index.ts +10 -0
- package/src/registry/edge/lambda-edge.ts +127 -0
- package/src/registry/edge/sigv4-web.ts +79 -0
- package/src/registry/edge/token-source.test.ts +258 -0
- package/src/registry/edge/token-source.ts +169 -0
- package/src/registry/edge/worker.ts +61 -0
- package/src/registry/handler.ts +89 -0
- package/src/registry/headers-file.ts +61 -0
- package/src/registry/index.ts +31 -0
- package/src/registry/mirror-paths.ts +10 -0
- package/src/registry/mirror.test.ts +198 -0
- package/src/registry/mirror.ts +395 -0
- package/src/registry/proxies.test.ts +153 -0
- package/src/registry/proxies.ts +132 -0
- package/src/registry/reader.ts +225 -0
- package/src/registry/registry.test.ts +262 -0
- package/src/registry/semver.ts +34 -0
- package/src/registry/serve.ts +82 -0
- package/src/registry/source-forms.test.ts +87 -0
- package/src/registry/source-forms.ts +216 -0
- package/src/registry/targets/artifactory.test.ts +248 -0
- package/src/registry/targets/artifactory.ts +257 -0
- package/src/registry/targets/fake-artifactory.ts +158 -0
- package/src/registry/targets/fake-gitlab.ts +161 -0
- package/src/registry/targets/fake-hcp.ts +233 -0
- package/src/registry/targets/fake-http.ts +97 -0
- package/src/registry/targets/fake-nexus.ts +152 -0
- package/src/registry/targets/gitlab.test.ts +208 -0
- package/src/registry/targets/gitlab.ts +223 -0
- package/src/registry/targets/hcp.test.ts +230 -0
- package/src/registry/targets/hcp.ts +360 -0
- package/src/registry/targets/hosted.ts +117 -0
- package/src/registry/targets/index.ts +17 -0
- package/src/registry/targets/module-target.ts +131 -0
- package/src/registry/targets/nexus.test.ts +220 -0
- package/src/registry/targets/nexus.ts +314 -0
- package/src/registry/targets/zip.test.ts +65 -0
- package/src/registry/targets/zip.ts +287 -0
- package/src/registry/writer.ts +155 -0
- package/src/report.test.ts +82 -1
- package/src/report.ts +31 -54
- package/src/signal-only-root.test.ts +72 -0
- package/src/skills/chant-terraform.md +1 -1
- package/src/state/azure-blob.ts +8 -0
- package/src/state/backend-verdict.test.ts +187 -0
- package/src/state/backend.test.ts +127 -0
- package/src/state/backend.ts +488 -0
- package/src/state/exec.ts +111 -0
- package/src/state/gcs.ts +7 -0
- package/src/state/index.ts +15 -0
- package/src/state/locks.test.ts +84 -0
- package/src/state/locks.ts +201 -0
- package/src/state/object-store.ts +7 -0
- package/src/state/root-states-floci.e2e.test.ts +66 -0
- package/src/state/root-states.test.ts +462 -0
- package/src/state/root-states.ts +309 -0
- package/src/state/s3.ts +21 -0
- package/src/state/store.ts +225 -0
- package/src/state-ops.test.ts +182 -0
- package/src/state-ops.ts +462 -0
- package/src/state-reads.ts +116 -0
- package/src/terragrunt/affected.ts +2 -1
- package/src/used-sources.test.ts +75 -0
- package/src/used-sources.ts +204 -0
- package/src/workspace-kinds.test.ts +4 -17
- package/workspace-kinds.json +1 -24
- package/dist/workspace-member.d.ts +0 -30
- package/dist/workspace-member.d.ts.map +0 -1
- package/dist/workspace-member.js +0 -91
- package/schemas/pulumi.schema.json +0 -34
- package/src/testdata/pulumi-member/Pulumi.yaml +0 -2
- package/src/testdata/pulumi-member/stack-export.json +0 -53
- package/src/testdata/pulumi-unexported/Pulumi.yaml +0 -2
- package/src/workspace-member.test.ts +0 -89
- package/src/workspace-member.ts +0 -126
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terraform lexicon's drift read (behold#995): `LexiconPlugin.readDrift`,
|
|
3
|
+
* which `chant lifecycle drift` calls, and which `chant workspace drift` runs
|
|
4
|
+
* in a `terraform` or `choudoufu` member's reader project. It runs the
|
|
5
|
+
* engine's own reads, one root at a time, and hands each document to the
|
|
6
|
+
* drift-record adapters in `./drift-record.ts` (#4451), so the records say
|
|
7
|
+
* exactly what those adapters say.
|
|
8
|
+
*
|
|
9
|
+
* | root | `--read` | reads | adapter |
|
|
10
|
+
* |---|---|---|---|
|
|
11
|
+
* | stock | `state` (default) | `show -json` over state | `terraformStateDriftRecords` |
|
|
12
|
+
* | stock | `plan` | `plan -input=false -lock=false -out=<tmp>`, `show -json` | `terraformPlanDriftRecords` |
|
|
13
|
+
* | live | `ownership` (default) | `choudoufu live-plan -json`, `live-ls -json` | `choudoufuLiveDriftRecords` |
|
|
14
|
+
* | live | `plan` | live-plan, then the same plan read | `choudoufuLivePlusPlanDriftRecords` |
|
|
15
|
+
* | live | `--resource <addr>` | `choudoufu live-plan -resource=<addr>` | its own stream, decoded by `decodeDriftLines` |
|
|
16
|
+
*
|
|
17
|
+
* Nothing is written in the root. `init` is never run, as on the plan read
|
|
18
|
+
* (`terraformPlanRead`): a root that was never initialised reads
|
|
19
|
+
* not-observed with the init line in the detail. A plan read that fails
|
|
20
|
+
* falls back one depth (the plan to state, live+plan to ownership) and the
|
|
21
|
+
* records carry `fellBackFrom`. A live-ls that fails is left out: it only
|
|
22
|
+
* adds what the estate holds and nothing declares.
|
|
23
|
+
*
|
|
24
|
+
* Each root's records go out as one stream: a `drift-start` whose `expected`
|
|
25
|
+
* is every address the read answered, the records, and a `drift-settle`.
|
|
26
|
+
* `node` stays null; `chant workspace drift` places each record on the
|
|
27
|
+
* member's graph. A pulumi member (`pulumiMember`) is refused: its drift is
|
|
28
|
+
* the pulumi lexicon's (chant#4453).
|
|
29
|
+
*/
|
|
30
|
+
import { type ReadDriftOptions, type ReadDriftResult } from "@intentius/chant/drift-record";
|
|
31
|
+
/** `LexiconPlugin.readDrift` for the terraform lexicon. */
|
|
32
|
+
export declare function readTerraformDrift(options: ReadDriftOptions): Promise<ReadDriftResult>;
|
|
33
|
+
//# sourceMappingURL=drift-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-read.d.ts","sourceRoot":"","sources":["../src/drift-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAUL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAkMvC,2DAA2D;AAC3D,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4C5F"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terraform lexicon's drift read (behold#995): `LexiconPlugin.readDrift`,
|
|
3
|
+
* which `chant lifecycle drift` calls, and which `chant workspace drift` runs
|
|
4
|
+
* in a `terraform` or `choudoufu` member's reader project. It runs the
|
|
5
|
+
* engine's own reads, one root at a time, and hands each document to the
|
|
6
|
+
* drift-record adapters in `./drift-record.ts` (#4451), so the records say
|
|
7
|
+
* exactly what those adapters say.
|
|
8
|
+
*
|
|
9
|
+
* | root | `--read` | reads | adapter |
|
|
10
|
+
* |---|---|---|---|
|
|
11
|
+
* | stock | `state` (default) | `show -json` over state | `terraformStateDriftRecords` |
|
|
12
|
+
* | stock | `plan` | `plan -input=false -lock=false -out=<tmp>`, `show -json` | `terraformPlanDriftRecords` |
|
|
13
|
+
* | live | `ownership` (default) | `choudoufu live-plan -json`, `live-ls -json` | `choudoufuLiveDriftRecords` |
|
|
14
|
+
* | live | `plan` | live-plan, then the same plan read | `choudoufuLivePlusPlanDriftRecords` |
|
|
15
|
+
* | live | `--resource <addr>` | `choudoufu live-plan -resource=<addr>` | its own stream, decoded by `decodeDriftLines` |
|
|
16
|
+
*
|
|
17
|
+
* Nothing is written in the root. `init` is never run, as on the plan read
|
|
18
|
+
* (`terraformPlanRead`): a root that was never initialised reads
|
|
19
|
+
* not-observed with the init line in the detail. A plan read that fails
|
|
20
|
+
* falls back one depth (the plan to state, live+plan to ownership) and the
|
|
21
|
+
* records carry `fellBackFrom`. A live-ls that fails is left out: it only
|
|
22
|
+
* adds what the estate holds and nothing declares.
|
|
23
|
+
*
|
|
24
|
+
* Each root's records go out as one stream: a `drift-start` whose `expected`
|
|
25
|
+
* is every address the read answered, the records, and a `drift-settle`.
|
|
26
|
+
* `node` stays null; `chant workspace drift` places each record on the
|
|
27
|
+
* member's graph. A pulumi member (`pulumiMember`) is refused: its drift is
|
|
28
|
+
* the pulumi lexicon's (chant#4453).
|
|
29
|
+
*/
|
|
30
|
+
import { spawn } from "node:child_process";
|
|
31
|
+
import { resolve } from "node:path";
|
|
32
|
+
import { decodeDriftLines, driftRecord, driftRecordLine, driftSettle, driftStart, } from "@intentius/chant/drift-record";
|
|
33
|
+
import { ownRoots } from "./config.js";
|
|
34
|
+
import { declaredOf } from "./describe-resources.js";
|
|
35
|
+
import { choudoufuLivePlusPlanDriftRecords, choudoufuLiveDriftRecords, terraformPlanDriftRecords, terraformStateDriftRecords, } from "./drift-record.js";
|
|
36
|
+
import { RESOURCE_TYPE } from "./hcl/parse.js";
|
|
37
|
+
import { renderTerraformRoots } from "./hcl/roots.js";
|
|
38
|
+
import { readsAsCredentials } from "./live-plan-reasons.js";
|
|
39
|
+
import { detectLiveEstate } from "./op/activities/live-detect.js";
|
|
40
|
+
import { choudoufuLiveLs, choudoufuLivePlanDocument, rootIsInitialised, terraformBinary, terraformEnvironment, terraformInitLine, terraformPlanRead, terraformShow, } from "./op/activities/terraform.js";
|
|
41
|
+
const firstLine = (err) => (err instanceof Error ? err.message : String(err)).split("\n")[0];
|
|
42
|
+
/** The reads a root answers, the first its default. */
|
|
43
|
+
const ROOT_READS = { stock: ["state", "plan"], live: ["ownership", "plan"] };
|
|
44
|
+
/** One root's records as a stream: start, records, settle. */
|
|
45
|
+
function asStream(ctx, read, records, extra = {}) {
|
|
46
|
+
const start = driftStart({
|
|
47
|
+
member: ctx.options.member,
|
|
48
|
+
engine: ctx.engine,
|
|
49
|
+
read,
|
|
50
|
+
...extra,
|
|
51
|
+
at: ctx.options.observedAt,
|
|
52
|
+
expected: records.map((r) => r.address),
|
|
53
|
+
evidence: { tool: ctx.engine },
|
|
54
|
+
});
|
|
55
|
+
const settled = driftSettle(start, records, ctx.options.observedAt);
|
|
56
|
+
return [start, ...settled.records.map(driftRecordLine), settled.line];
|
|
57
|
+
}
|
|
58
|
+
/** Every declared address not-observed, for a read that could not run at all. */
|
|
59
|
+
function unobservedAll(ctx, read, err, command) {
|
|
60
|
+
const detail = firstLine(err);
|
|
61
|
+
return ctx.declared.map((address) => driftRecord({
|
|
62
|
+
member: ctx.options.member,
|
|
63
|
+
engine: ctx.engine,
|
|
64
|
+
address,
|
|
65
|
+
node: null,
|
|
66
|
+
observedAt: ctx.options.observedAt,
|
|
67
|
+
read,
|
|
68
|
+
status: "not-observed",
|
|
69
|
+
unobserved: { reason: readsAsCredentials(detail) ? "no-credentials" : "read-failed", detail },
|
|
70
|
+
evidence: { tool: ctx.engine, command },
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
/** A stock root's state read. Never runs init. */
|
|
74
|
+
async function stateRecords(ctx, fellBackFrom) {
|
|
75
|
+
const base = { member: ctx.options.member, observedAt: ctx.options.observedAt, engine: ctx.engine, declared: ctx.declared, ...(fellBackFrom ? { fellBackFrom } : {}) };
|
|
76
|
+
const env = { ...process.env, ...terraformEnvironment(ctx.root) };
|
|
77
|
+
if (!rootIsInitialised(ctx.dir, env)) {
|
|
78
|
+
const line = terraformInitLine({
|
|
79
|
+
binary: ctx.binary,
|
|
80
|
+
dir: ctx.dir,
|
|
81
|
+
...(ctx.root.backendConfig ? { backendConfig: ctx.root.backendConfig } : {}),
|
|
82
|
+
...(ctx.root.backendConfigFiles ? { backendConfigFiles: ctx.root.backendConfigFiles } : {}),
|
|
83
|
+
});
|
|
84
|
+
return terraformStateDriftRecords({ ...base, failed: { reason: "read-failed", detail: `${ctx.dir} has never been initialised: run \`${line}\` first; chant never runs init on a read` } });
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const shown = await terraformShow(ctx.where);
|
|
88
|
+
return terraformStateDriftRecords({ ...base, state: shown.json });
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const detail = firstLine(err);
|
|
92
|
+
return terraformStateDriftRecords({ ...base, failed: { reason: readsAsCredentials(detail) ? "no-credentials" : "read-failed", detail } });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function stockRoot(ctx, read) {
|
|
96
|
+
if (read === "state")
|
|
97
|
+
return asStream(ctx, "state", await stateRecords(ctx));
|
|
98
|
+
try {
|
|
99
|
+
const plan = await terraformPlanRead(ctx.where);
|
|
100
|
+
return asStream(ctx, "plan", terraformPlanDriftRecords({ member: ctx.options.member, observedAt: ctx.options.observedAt, engine: ctx.engine, plan: plan.json }));
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
// One depth down: what the last apply recorded, said as such.
|
|
104
|
+
process.stderr.write(`terraform.roots.${ctx.name}: the plan read failed (${firstLine(err)}), so the state read answered\n`);
|
|
105
|
+
return asStream(ctx, "state", await stateRecords(ctx, "plan"), { fellBackFrom: "plan" });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function liveOwnership(ctx, fellBackFrom) {
|
|
109
|
+
let livePlan;
|
|
110
|
+
try {
|
|
111
|
+
livePlan = (await choudoufuLivePlanDocument(ctx.where)).json;
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return { records: unobservedAll(ctx, "ownership", err, "choudoufu live-plan -json") };
|
|
115
|
+
}
|
|
116
|
+
let liveLs;
|
|
117
|
+
try {
|
|
118
|
+
liveLs = (await choudoufuLiveLs({ ...ctx.where, consistent: true })).json;
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
process.stderr.write(`terraform.roots.${ctx.name}: live-ls failed (${firstLine(err)}); what the estate holds and nothing declares is left out\n`);
|
|
122
|
+
}
|
|
123
|
+
const base = { member: ctx.options.member, observedAt: ctx.options.observedAt, livePlan, ...(liveLs !== undefined ? { liveLs } : {}), ...(fellBackFrom ? { fellBackFrom } : {}) };
|
|
124
|
+
return { records: choudoufuLiveDriftRecords(base), livePlan, liveLs };
|
|
125
|
+
}
|
|
126
|
+
async function liveRoot(ctx, read) {
|
|
127
|
+
if (read === "ownership")
|
|
128
|
+
return asStream(ctx, "ownership", (await liveOwnership(ctx)).records);
|
|
129
|
+
const owned = await liveOwnership(ctx);
|
|
130
|
+
if (owned.livePlan === undefined)
|
|
131
|
+
return asStream(ctx, "ownership", owned.records, { fellBackFrom: "live+plan" });
|
|
132
|
+
try {
|
|
133
|
+
const plan = await terraformPlanRead(ctx.where);
|
|
134
|
+
const records = choudoufuLivePlusPlanDriftRecords({
|
|
135
|
+
member: ctx.options.member,
|
|
136
|
+
observedAt: ctx.options.observedAt,
|
|
137
|
+
livePlan: owned.livePlan,
|
|
138
|
+
plan: plan.json,
|
|
139
|
+
...(owned.liveLs !== undefined ? { liveLs: owned.liveLs } : {}),
|
|
140
|
+
});
|
|
141
|
+
return asStream(ctx, "plan", records);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
process.stderr.write(`terraform.roots.${ctx.name}: the plan read failed (${firstLine(err)}), so live-plan alone answered\n`);
|
|
145
|
+
const fell = choudoufuLiveDriftRecords({
|
|
146
|
+
member: ctx.options.member,
|
|
147
|
+
observedAt: ctx.options.observedAt,
|
|
148
|
+
livePlan: owned.livePlan,
|
|
149
|
+
...(owned.liveLs !== undefined ? { liveLs: owned.liveLs } : {}),
|
|
150
|
+
fellBackFrom: "live+plan",
|
|
151
|
+
});
|
|
152
|
+
return asStream(ctx, "ownership", fell, { fellBackFrom: "live+plan" });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** `choudoufu live-plan -resource=<addr>`'s own stream (choudoufu#2245), decoded, with the workspace member's name on every line. */
|
|
156
|
+
async function liveResource(ctx, address) {
|
|
157
|
+
// `-estate` only for a root that names its estate in chant.config and not in its HCL: choudoufu refuses the flag beside a declaration.
|
|
158
|
+
const estateFlag = ctx.root.estate !== undefined && detectLiveEstate(ctx.dir) === undefined ? [`-estate=${ctx.root.estate}`] : [];
|
|
159
|
+
const argv = ["live-plan", ...estateFlag, `-resource=${address}`];
|
|
160
|
+
const command = `${ctx.binary} ${argv.join(" ")}`;
|
|
161
|
+
const ran = await new Promise((done) => {
|
|
162
|
+
const child = spawn(ctx.binary, argv, { cwd: ctx.dir, env: { ...process.env, ...terraformEnvironment(ctx.root) }, stdio: ["ignore", "pipe", "pipe"] });
|
|
163
|
+
let stdout = "";
|
|
164
|
+
let stderr = "";
|
|
165
|
+
child.stdout.on("data", (d) => (stdout += String(d)));
|
|
166
|
+
child.stderr.on("data", (d) => (stderr += String(d)));
|
|
167
|
+
child.on("error", (error) => done({ code: null, stdout, stderr, error }));
|
|
168
|
+
child.on("close", (code) => done({ code, stdout, stderr }));
|
|
169
|
+
});
|
|
170
|
+
if (ran.stderr.trim())
|
|
171
|
+
process.stderr.write(ran.stderr.endsWith("\n") ? ran.stderr : `${ran.stderr}\n`);
|
|
172
|
+
// 2 is live-plan's "changes present" under -detailed-exitcode; the stream is what answers.
|
|
173
|
+
if (ran.error === undefined && (ran.code === 0 || ran.code === 2) && ran.stdout.trim()) {
|
|
174
|
+
try {
|
|
175
|
+
return decodeDriftLines(ran.stdout).map((line) => ({ ...line, member: ctx.options.member }));
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return asStream(ctx, "plan", [unobservedOne(ctx, address, `${command} printed a line that is not drift: ${firstLine(err)}`, command)], { resource: address });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const why = ran.error?.message ?? (ran.stderr.trim().split("\n").pop() || `exit ${ran.code}`);
|
|
182
|
+
return asStream(ctx, "plan", [unobservedOne(ctx, address, `${command} failed: ${why}`, command)], { resource: address });
|
|
183
|
+
}
|
|
184
|
+
function unobservedOne(ctx, address, detail, command) {
|
|
185
|
+
return driftRecord({
|
|
186
|
+
member: ctx.options.member,
|
|
187
|
+
engine: "choudoufu",
|
|
188
|
+
address,
|
|
189
|
+
node: null,
|
|
190
|
+
observedAt: ctx.options.observedAt,
|
|
191
|
+
read: "plan",
|
|
192
|
+
status: "not-observed",
|
|
193
|
+
unobserved: { reason: readsAsCredentials(detail) ? "no-credentials" : "read-failed", detail },
|
|
194
|
+
evidence: { tool: "choudoufu", command },
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/** `LexiconPlugin.readDrift` for the terraform lexicon. */
|
|
198
|
+
export async function readTerraformDrift(options) {
|
|
199
|
+
const namespace = options.config.terraform;
|
|
200
|
+
// A `signalOnly` root (#4484) is not this project's to read.
|
|
201
|
+
const roots = Object.entries(ownRoots(namespace?.roots));
|
|
202
|
+
if (roots.length === 0)
|
|
203
|
+
return { refused: { code: "no-drift-read", message: "terraform.roots declares no root of its own" } };
|
|
204
|
+
const binary = terraformBinary(namespace);
|
|
205
|
+
const live = (root, dir) => binary === "choudoufu" && (detectLiveEstate(dir) !== undefined || root.estate !== undefined);
|
|
206
|
+
const contexts = [];
|
|
207
|
+
for (const [name, root] of roots) {
|
|
208
|
+
const dir = resolve(options.projectRoot, root.dir);
|
|
209
|
+
const rendered = await renderTerraformRoots({
|
|
210
|
+
projectRoot: options.projectRoot,
|
|
211
|
+
roots: { [name]: root },
|
|
212
|
+
binary: namespace?.binary,
|
|
213
|
+
callModuleType: namespace?.callModuleType,
|
|
214
|
+
moduleRoot: namespace?.moduleRoot,
|
|
215
|
+
});
|
|
216
|
+
const declared = [...rendered.entities.entries()]
|
|
217
|
+
.map(([key, entity]) => declaredOf(key, entity))
|
|
218
|
+
.filter((d) => d.type === RESOURCE_TYPE)
|
|
219
|
+
.map((d) => d.address);
|
|
220
|
+
const isLive = live(root, dir);
|
|
221
|
+
contexts.push({ options, name, root, binary, dir, engine: isLive ? "choudoufu" : binary === "tofu" ? "tofu" : "terraform", declared: [...new Set(declared)].sort(), where: { root: name, cwd: options.projectRoot }, live: isLive });
|
|
222
|
+
}
|
|
223
|
+
for (const ctx of contexts) {
|
|
224
|
+
const reads = ROOT_READS[ctx.live ? "live" : "stock"];
|
|
225
|
+
if (options.read !== undefined && !reads.includes(options.read)) {
|
|
226
|
+
return { refused: { code: "read-unsupported", message: `terraform.roots.${ctx.name} is a ${ctx.live ? "live (choudoufu)" : "stock"} root, which answers ${reads.join(" or ")}, not ${options.read}` } };
|
|
227
|
+
}
|
|
228
|
+
if (options.resource !== undefined && !ctx.live) {
|
|
229
|
+
return { refused: { code: "resource-unsupported", message: `terraform.roots.${ctx.name} is a stock root; one resource is read through choudoufu live-plan -resource, on a live root` } };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const lines = [];
|
|
233
|
+
for (const ctx of contexts) {
|
|
234
|
+
const read = options.read ?? ROOT_READS[ctx.live ? "live" : "stock"][0];
|
|
235
|
+
if (options.resource !== undefined)
|
|
236
|
+
lines.push(...(await liveResource(ctx, options.resource)));
|
|
237
|
+
else if (ctx.live)
|
|
238
|
+
lines.push(...(await liveRoot(ctx, read)));
|
|
239
|
+
else
|
|
240
|
+
lines.push(...(await stockRoot(ctx, read)));
|
|
241
|
+
}
|
|
242
|
+
return { lines };
|
|
243
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift-record adapters for the terraform family (#4451): a stock root's
|
|
3
|
+
* state read and plan, and a choudoufu live root's `live-plan -json`,
|
|
4
|
+
* `live-ls -json` and plan, each into `@intentius/chant/drift-record`
|
|
5
|
+
* records.
|
|
6
|
+
*
|
|
7
|
+
* | source | read | status |
|
|
8
|
+
* |---|---|---|
|
|
9
|
+
* | `show -json` over state | `state` | in state: recorded. Declared and not in state: pending |
|
|
10
|
+
* | `show -json` of a saved plan | `plan` | no `resource_drift` row: in-sync. Drift update: drifted with paths. Drift delete: missing. Create with no prior row: pending. Delete with no drift: undeclared |
|
|
11
|
+
* | `live-plan -json` | `ownership` | `bound[]`: in-sync, owned by its `source`. `unowned[]` and `adoptable[]`: unclaimed. `ABSENT`: pending. Any other omission: not-observed. `foreign[]`: undeclared, foreign. `controller_held[]`: runtime |
|
|
12
|
+
* | `live-ls -json` | `ownership` | `declared: false`: undeclared. A gap no live-plan row answers: not-observed |
|
|
13
|
+
* | live-plan and a plan together | `plan` | bound with a planned update or replace: drifted with paths, the live-plan ownership kept |
|
|
14
|
+
*
|
|
15
|
+
* A state read never says in-sync or drifted: `driftRecord` refuses it.
|
|
16
|
+
*
|
|
17
|
+
* An omission keeps its token in `evidence.engineCode`, and so does the
|
|
18
|
+
* `UNOWNED` omission that has no `unowned[]` row: chant reads it as
|
|
19
|
+
* not-observed (`read-failed`), not as unclaimed, since nothing in the
|
|
20
|
+
* document says what holds the identity.
|
|
21
|
+
*
|
|
22
|
+
* ## Values
|
|
23
|
+
*
|
|
24
|
+
* Attribute values come from `./plan-observation.ts`, which already replaced
|
|
25
|
+
* every value the planner flagged, or that equals a flagged string, with
|
|
26
|
+
* `(sensitive)`. Here a `(sensitive)` side makes the attribute `sensitive:
|
|
27
|
+
* true` with neither value, and the record constructor's key-name pass runs
|
|
28
|
+
* after. `before` is what was expected and `after` what the read found, so
|
|
29
|
+
* a stock root's drift row reads state then refreshed object, and a live
|
|
30
|
+
* root's planned update reads declared then live (the plan's after, then
|
|
31
|
+
* its before).
|
|
32
|
+
*
|
|
33
|
+
* ## The import graph
|
|
34
|
+
*
|
|
35
|
+
* Like `./change-set.ts`, this imports chant's `drift-record` subpath, the
|
|
36
|
+
* plan projection and the omission table, never the lexicon's entry point
|
|
37
|
+
* or `./describe-resources.ts`, so it bundles without TypeScript, node's
|
|
38
|
+
* process modules or the lint rules (#3421).
|
|
39
|
+
*/
|
|
40
|
+
import { type DriftAdapterBase, type DriftRecord } from "@intentius/chant/drift-record";
|
|
41
|
+
export interface TerraformStateDriftInput extends DriftAdapterBase {
|
|
42
|
+
engine?: "terraform" | "tofu";
|
|
43
|
+
/** `terraform show -json` over the root's state, parsed. Absent when the read failed. */
|
|
44
|
+
state?: unknown;
|
|
45
|
+
/**
|
|
46
|
+
* The root's declared resource blocks, by terraform address
|
|
47
|
+
* (`module.cdn.null_resource.edge`). A block with no instance in state is
|
|
48
|
+
* pending. Omit to report only what state holds.
|
|
49
|
+
*/
|
|
50
|
+
declared?: readonly string[];
|
|
51
|
+
/** The read failed: every declared block is not-observed with this reason. */
|
|
52
|
+
failed?: {
|
|
53
|
+
reason: "read-failed" | "no-credentials" | "no-binding";
|
|
54
|
+
detail?: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A stock root's records from its state: every managed instance in state is
|
|
59
|
+
* recorded, every declared block with no instance there is pending, and a
|
|
60
|
+
* failed read makes every declared block not-observed. Never in-sync or
|
|
61
|
+
* drifted: state says what the last apply recorded, not what the account
|
|
62
|
+
* holds.
|
|
63
|
+
*/
|
|
64
|
+
export declare function terraformStateDriftRecords(input: TerraformStateDriftInput): DriftRecord[];
|
|
65
|
+
export interface TerraformPlanDriftInput extends DriftAdapterBase {
|
|
66
|
+
engine?: "terraform" | "tofu";
|
|
67
|
+
/** `terraform show -json <planfile>`, parsed. */
|
|
68
|
+
plan: unknown;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A stock root's records from a saved plan's `show -json`, one per managed
|
|
72
|
+
* instance the plan names. A `resource_drift[]` row decides: update is
|
|
73
|
+
* drifted with its paths (before is state, after the refreshed object),
|
|
74
|
+
* delete is missing. With no drift row, a create with no prior-state row is
|
|
75
|
+
* pending, a delete or forget the configuration no longer declares is
|
|
76
|
+
* undeclared, and anything else is in-sync, since a planned change from
|
|
77
|
+
* configuration is the change set's to show and not drift.
|
|
78
|
+
*/
|
|
79
|
+
export declare function terraformPlanDriftRecords(input: TerraformPlanDriftInput): DriftRecord[];
|
|
80
|
+
export interface ChoudoufuLivePlanDriftInput extends DriftAdapterBase {
|
|
81
|
+
/** `choudoufu live-plan -json`, parsed. */
|
|
82
|
+
livePlan: unknown;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A live root's records from `live-plan -json`, read `ownership`, one per
|
|
86
|
+
* address the document names.
|
|
87
|
+
*
|
|
88
|
+
* - `bound[]`: in-sync, `owned` by the row's `source`, the marker on the
|
|
89
|
+
* object exactly when the source is `marker`.
|
|
90
|
+
* - `unowned[]`: unclaimed, `adoptable` when the row carries the adopting
|
|
91
|
+
* tag values and `foreign` otherwise, with the estate it does carry. It
|
|
92
|
+
* answers before the paired `UNOWNED` omission.
|
|
93
|
+
* - `adoptable[]`: unclaimed, `adoptable`, the paired omission's token kept.
|
|
94
|
+
* - an `ABSENT` omission: pending.
|
|
95
|
+
* - any other omission, `UNOWNED` with no row included: not-observed with
|
|
96
|
+
* the reason `LIVE_PLAN_OMISSION_REASONS` gives (`VERIFIED_NOT_IMPORTABLE`
|
|
97
|
+
* read-failed, `OUT_OF_SCOPE` filtered), a credentials failure named as
|
|
98
|
+
* such.
|
|
99
|
+
* - `foreign[]`: undeclared, `foreign`, addressed by its identity.
|
|
100
|
+
* - `controller_held[]`: runtime, `foreign`, held by its controller,
|
|
101
|
+
* addressed by the marker's address when it has one and its identity
|
|
102
|
+
* otherwise.
|
|
103
|
+
*/
|
|
104
|
+
export declare function choudoufuLivePlanDriftRecords(input: ChoudoufuLivePlanDriftInput): DriftRecord[];
|
|
105
|
+
export interface ChoudoufuLiveLsDriftInput extends DriftAdapterBase {
|
|
106
|
+
/** `choudoufu live-ls -json`, parsed. */
|
|
107
|
+
liveLs: unknown;
|
|
108
|
+
/**
|
|
109
|
+
* Addresses another read already answered (the live-plan records'), so a
|
|
110
|
+
* gap on one of them is not reported: the gap says the listing cannot
|
|
111
|
+
* reach the instance, and live-plan did.
|
|
112
|
+
*/
|
|
113
|
+
answered?: Iterable<string>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A live root's records from `live-ls -json`, read `ownership`. An item with
|
|
117
|
+
* `declared: false` is undeclared, addressed by its marker's address or else
|
|
118
|
+
* its identity: `owned` when its marker names this estate, held by the
|
|
119
|
+
* controller (runtime) when it has `held_by`, `foreign` when it names
|
|
120
|
+
* another estate. A declared item is live-plan's to answer and is left out.
|
|
121
|
+
* A gap is not-observed `unsupported-kind` with its rung as the token,
|
|
122
|
+
* unless `answered` holds its address.
|
|
123
|
+
*/
|
|
124
|
+
export declare function choudoufuLiveLsDriftRecords(input: ChoudoufuLiveLsDriftInput): DriftRecord[];
|
|
125
|
+
/** live-plan's records, then live-ls's undeclared items and the gaps live-plan did not answer. */
|
|
126
|
+
export declare function choudoufuLiveDriftRecords(input: DriftAdapterBase & {
|
|
127
|
+
livePlan: unknown;
|
|
128
|
+
liveLs?: unknown;
|
|
129
|
+
}): DriftRecord[];
|
|
130
|
+
export interface ChoudoufuLivePlusPlanDriftInput extends DriftAdapterBase {
|
|
131
|
+
/** `choudoufu live-plan -json`, parsed. */
|
|
132
|
+
livePlan: unknown;
|
|
133
|
+
/** `choudoufu show -json <planfile>` of the same root, parsed. */
|
|
134
|
+
plan: unknown;
|
|
135
|
+
/** `choudoufu live-ls -json`, parsed, when it was read too. */
|
|
136
|
+
liveLs?: unknown;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* A live root at the plan depth. Every bound instance is read `plan`: a
|
|
140
|
+
* planned update or replace is drifted with the plan's paths, since a live
|
|
141
|
+
* root's prior state is the account itself, and anything else is in-sync.
|
|
142
|
+
* Its ownership facet is live-plan's. Every other address keeps its
|
|
143
|
+
* live-plan or live-ls record, read `ownership`, because the plan does not
|
|
144
|
+
* say who holds it.
|
|
145
|
+
*/
|
|
146
|
+
export declare function choudoufuLivePlusPlanDriftRecords(input: ChoudoufuLivePlusPlanDriftInput): DriftRecord[];
|
|
147
|
+
//# sourceMappingURL=drift-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-record.d.ts","sourceRoot":"","sources":["../src/drift-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAGL,KAAK,gBAAgB,EAKrB,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AAiEvC,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAC9B,yFAAyF;IACzF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,8EAA8E;IAC9E,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,GAAG,WAAW,EAAE,CA0BzF;AAID,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAC9B,iDAAiD;IACjD,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,uBAAuB,GAAG,WAAW,EAAE,CA0BvF;AAMD,MAAM,WAAW,2BAA4B,SAAQ,gBAAgB;IACnE,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,2BAA2B,GAAG,WAAW,EAAE,CA2F/F;AAID,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,yBAAyB,GAAG,WAAW,EAAE,CAmD3F;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,WAAW,EAAE,CAM1H;AAID,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,IAAI,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,+BAA+B,GAAG,WAAW,EAAE,CAqBvG"}
|