@quadnix/octo 0.0.30 → 0.2.0
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/LICENSE +661 -0
- package/README.md +117 -8
- package/dist/app.type.d.ts +277 -19
- package/dist/app.type.js +80 -9
- package/dist/app.type.js.map +1 -1
- package/dist/decorators/action.decorator.d.ts +10 -6
- package/dist/decorators/action.decorator.js +19 -6
- package/dist/decorators/action.decorator.js.map +1 -1
- package/dist/decorators/anchor.decorator.d.ts +12 -5
- package/dist/decorators/anchor.decorator.js +12 -5
- package/dist/decorators/anchor.decorator.js.map +1 -1
- package/dist/decorators/enable-hook.decorator.d.ts +1 -1
- package/dist/decorators/enable-hook.decorator.js +1 -1
- package/dist/decorators/factory.decorator.d.ts +18 -34
- package/dist/decorators/factory.decorator.js +18 -34
- package/dist/decorators/factory.decorator.js.map +1 -1
- package/dist/decorators/model.decorator.d.ts +4 -6
- package/dist/decorators/model.decorator.js +2 -7
- package/dist/decorators/model.decorator.js.map +1 -1
- package/dist/decorators/module.decorator.d.ts +16 -10
- package/dist/decorators/module.decorator.js +16 -10
- package/dist/decorators/module.decorator.js.map +1 -1
- package/dist/decorators/on-event.decorator.d.ts +7 -2
- package/dist/decorators/on-event.decorator.js +5 -0
- package/dist/decorators/on-event.decorator.js.map +1 -1
- package/dist/decorators/resource.decorator.d.ts +50 -1
- package/dist/decorators/resource.decorator.js +38 -1
- package/dist/decorators/resource.decorator.js.map +1 -1
- package/dist/decorators/validate.decorator.d.ts +15 -1
- package/dist/decorators/validate.decorator.js +15 -1
- package/dist/decorators/validate.decorator.js.map +1 -1
- package/dist/errors/container.error.d.ts +18 -0
- package/dist/errors/container.error.js +18 -0
- package/dist/errors/container.error.js.map +1 -1
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/module.error.d.ts +6 -0
- package/dist/errors/module.error.js +6 -0
- package/dist/errors/module.error.js.map +1 -1
- package/dist/errors/node.error.d.ts +56 -0
- package/dist/errors/node.error.js +56 -0
- package/dist/errors/node.error.js.map +1 -1
- package/dist/errors/schema.error.d.ts +14 -1
- package/dist/errors/schema.error.js +11 -1
- package/dist/errors/schema.error.js.map +1 -1
- package/dist/errors/terraform.error.d.ts +20 -0
- package/dist/errors/terraform.error.js +24 -0
- package/dist/errors/terraform.error.js.map +1 -0
- package/dist/errors/transaction.error.d.ts +93 -2
- package/dist/errors/transaction.error.js +83 -0
- package/dist/errors/transaction.error.js.map +1 -1
- package/dist/events/action.event.d.ts +8 -4
- package/dist/events/action.event.js +2 -4
- package/dist/events/action.event.js.map +1 -1
- package/dist/events/command.event.d.ts +43 -0
- package/dist/events/command.event.js +33 -0
- package/dist/events/command.event.js.map +1 -0
- package/dist/events/event.model.d.ts +26 -8
- package/dist/events/event.model.js +15 -7
- package/dist/events/event.model.js.map +1 -1
- package/dist/events/hook/commit.hook.event.d.ts +1 -7
- package/dist/events/hook/commit.hook.event.js +0 -6
- package/dist/events/hook/commit.hook.event.js.map +1 -1
- package/dist/events/hook/hook.event.d.ts +1 -3
- package/dist/events/hook/hook.event.js +0 -2
- package/dist/events/hook/hook.event.js.map +1 -1
- package/dist/events/hook/model.hook.event.d.ts +1 -7
- package/dist/events/hook/model.hook.event.js +0 -6
- package/dist/events/hook/model.hook.event.js.map +1 -1
- package/dist/events/hook/resource.hook.event.d.ts +1 -7
- package/dist/events/hook/resource.hook.event.js +0 -6
- package/dist/events/hook/resource.hook.event.js.map +1 -1
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/mode-result.event.d.ts +57 -0
- package/dist/events/mode-result.event.js +24 -0
- package/dist/events/mode-result.event.js.map +1 -0
- package/dist/events/mode.event.d.ts +61 -0
- package/dist/events/mode.event.js +32 -0
- package/dist/events/mode.event.js.map +1 -0
- package/dist/events/module.event.d.ts +7 -5
- package/dist/events/module.event.js +3 -4
- package/dist/events/module.event.js.map +1 -1
- package/dist/events/registration.event.d.ts +19 -15
- package/dist/events/registration.event.js +18 -14
- package/dist/events/registration.event.js.map +1 -1
- package/dist/events/serialization.event.d.ts +16 -13
- package/dist/events/serialization.event.js +15 -12
- package/dist/events/serialization.event.js.map +1 -1
- package/dist/events/state.event.d.ts +102 -0
- package/dist/events/state.event.js +69 -0
- package/dist/events/state.event.js.map +1 -0
- package/dist/events/terraform.event.d.ts +78 -0
- package/dist/events/terraform.event.js +55 -0
- package/dist/events/terraform.event.js.map +1 -0
- package/dist/events/transaction.event.d.ts +3 -40
- package/dist/events/transaction.event.js +1 -29
- package/dist/events/transaction.event.js.map +1 -1
- package/dist/functions/container/container.d.ts +54 -13
- package/dist/functions/container/container.js +64 -19
- package/dist/functions/container/container.js.map +1 -1
- package/dist/functions/container/test-container.d.ts +43 -29
- package/dist/functions/container/test-container.js +71 -43
- package/dist/functions/container/test-container.js.map +1 -1
- package/dist/functions/dependency/dependency.d.ts +84 -23
- package/dist/functions/dependency/dependency.js +84 -14
- package/dist/functions/dependency/dependency.js.map +1 -1
- package/dist/functions/diff/aggregate-resource-actions.d.ts +19 -0
- package/dist/functions/diff/aggregate-resource-actions.js +41 -0
- package/dist/functions/diff/aggregate-resource-actions.js.map +1 -0
- package/dist/functions/diff/diff-metadata.d.ts +21 -3
- package/dist/functions/diff/diff-metadata.js +18 -0
- package/dist/functions/diff/diff-metadata.js.map +1 -1
- package/dist/functions/diff/diff.d.ts +68 -7
- package/dist/functions/diff/diff.js +44 -3
- package/dist/functions/diff/diff.js.map +1 -1
- package/dist/functions/hook/commit.hook.d.ts +16 -1
- package/dist/functions/hook/commit.hook.js +21 -6
- package/dist/functions/hook/commit.hook.js.map +1 -1
- package/dist/functions/hook/model-action.hook.d.ts +16 -1
- package/dist/functions/hook/model-action.hook.js +21 -6
- package/dist/functions/hook/model-action.hook.js.map +1 -1
- package/dist/functions/hook/resource-action.hook.d.ts +16 -1
- package/dist/functions/hook/resource-action.hook.js +21 -6
- package/dist/functions/hook/resource-action.hook.js.map +1 -1
- package/dist/functions/node/node-action.abstract.d.ts +23 -2
- package/dist/functions/node/node-action.abstract.js +22 -8
- package/dist/functions/node/node-action.abstract.js.map +1 -1
- package/dist/functions/node/node.abstract.d.ts +56 -5
- package/dist/functions/node/node.abstract.js +106 -22
- package/dist/functions/node/node.abstract.js.map +1 -1
- package/dist/functions/node/node.interface.d.ts +3 -1
- package/dist/functions/schema/schema.d.ts +7 -0
- package/dist/functions/schema/schema.js +10 -1
- package/dist/functions/schema/schema.js.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/index.type.d.ts +5 -0
- package/dist/index.type.js +2 -0
- package/dist/index.type.js.map +1 -0
- package/dist/main.d.ts +245 -14
- package/dist/main.js +377 -72
- package/dist/main.js.map +1 -1
- package/dist/models/account/account.model.d.ts +43 -7
- package/dist/models/account/account.model.js +56 -8
- package/dist/models/account/account.model.js.map +1 -1
- package/dist/models/account/account.schema.d.ts +13 -1
- package/dist/models/account/account.schema.js +12 -0
- package/dist/models/account/account.schema.js.map +1 -1
- package/dist/models/app/app.model.d.ts +13 -8
- package/dist/models/app/app.model.js +17 -32
- package/dist/models/app/app.model.js.map +1 -1
- package/dist/models/app/app.schema.d.ts +6 -0
- package/dist/models/app/app.schema.js +6 -0
- package/dist/models/app/app.schema.js.map +1 -1
- package/dist/models/deployment/deployment.model.d.ts +13 -1
- package/dist/models/deployment/deployment.model.js +16 -4
- package/dist/models/deployment/deployment.model.js.map +1 -1
- package/dist/models/deployment/deployment.schema.d.ts +6 -0
- package/dist/models/deployment/deployment.schema.js +6 -0
- package/dist/models/deployment/deployment.schema.js.map +1 -1
- package/dist/models/environment/environment.model.d.ts +15 -3
- package/dist/models/environment/environment.model.js +22 -10
- package/dist/models/environment/environment.model.js.map +1 -1
- package/dist/models/environment/environment.schema.d.ts +2 -0
- package/dist/models/environment/environment.schema.js +2 -0
- package/dist/models/environment/environment.schema.js.map +1 -1
- package/dist/models/execution/execution.model.d.ts +21 -3
- package/dist/models/execution/execution.model.js +47 -29
- package/dist/models/execution/execution.model.js.map +1 -1
- package/dist/models/execution/execution.schema.d.ts +11 -0
- package/dist/models/execution/execution.schema.js +11 -0
- package/dist/models/execution/execution.schema.js.map +1 -1
- package/dist/models/filesystem/filesystem.model.d.ts +27 -1
- package/dist/models/filesystem/filesystem.model.js +30 -4
- package/dist/models/filesystem/filesystem.model.js.map +1 -1
- package/dist/models/filesystem/filesystem.schema.d.ts +5 -0
- package/dist/models/filesystem/filesystem.schema.js +5 -0
- package/dist/models/filesystem/filesystem.schema.js.map +1 -1
- package/dist/models/image/image.model.d.ts +19 -5
- package/dist/models/image/image.model.js +25 -11
- package/dist/models/image/image.model.js.map +1 -1
- package/dist/models/image/image.schema.d.ts +8 -0
- package/dist/models/image/image.schema.js +8 -0
- package/dist/models/image/image.schema.js.map +1 -1
- package/dist/models/model-action.interface.d.ts +17 -4
- package/dist/models/model.abstract.d.ts +96 -1
- package/dist/models/model.abstract.js +107 -8
- package/dist/models/model.abstract.js.map +1 -1
- package/dist/models/model.interface.d.ts +3 -0
- package/dist/models/pipeline/pipeline.model.d.ts +14 -2
- package/dist/models/pipeline/pipeline.model.js +19 -7
- package/dist/models/pipeline/pipeline.model.js.map +1 -1
- package/dist/models/pipeline/pipeline.schema.d.ts +8 -0
- package/dist/models/pipeline/pipeline.schema.js +8 -0
- package/dist/models/pipeline/pipeline.schema.js.map +1 -1
- package/dist/models/region/region.model.d.ts +16 -1
- package/dist/models/region/region.model.js +19 -4
- package/dist/models/region/region.model.js.map +1 -1
- package/dist/models/region/region.schema.d.ts +6 -0
- package/dist/models/region/region.schema.js +6 -0
- package/dist/models/region/region.schema.js.map +1 -1
- package/dist/models/server/server.model.d.ts +15 -3
- package/dist/models/server/server.model.js +18 -6
- package/dist/models/server/server.model.js.map +1 -1
- package/dist/models/server/server.schema.d.ts +3 -1
- package/dist/models/server/server.schema.js +3 -1
- package/dist/models/server/server.schema.js.map +1 -1
- package/dist/models/service/service.model.d.ts +37 -6
- package/dist/models/service/service.model.js +65 -11
- package/dist/models/service/service.model.js.map +1 -1
- package/dist/models/service/service.schema.d.ts +48 -1
- package/dist/models/service/service.schema.js +56 -1
- package/dist/models/service/service.schema.js.map +1 -1
- package/dist/models/subnet/subnet.model.d.ts +27 -3
- package/dist/models/subnet/subnet.model.js +40 -16
- package/dist/models/subnet/subnet.model.js.map +1 -1
- package/dist/models/subnet/subnet.schema.d.ts +9 -0
- package/dist/models/subnet/subnet.schema.js +9 -0
- package/dist/models/subnet/subnet.schema.js.map +1 -1
- package/dist/modes/apply-transaction.d.ts +23 -0
- package/dist/modes/apply-transaction.js +25 -0
- package/dist/modes/apply-transaction.js.map +1 -0
- package/dist/modes/commit.mode.d.ts +54 -0
- package/dist/modes/commit.mode.js +235 -0
- package/dist/modes/commit.mode.js.map +1 -0
- package/dist/modes/generate.mode.d.ts +30 -0
- package/dist/modes/generate.mode.js +50 -0
- package/dist/modes/generate.mode.js.map +1 -0
- package/dist/modes/run-action.mode.d.ts +30 -0
- package/dist/modes/run-action.mode.js +140 -0
- package/dist/modes/run-action.mode.js.map +1 -0
- package/dist/modes/validate.mode.d.ts +186 -0
- package/dist/modes/validate.mode.js +558 -0
- package/dist/modes/validate.mode.js.map +1 -0
- package/dist/modules/module.abstract.d.ts +51 -0
- package/dist/modules/module.abstract.js +36 -0
- package/dist/modules/module.abstract.js.map +1 -1
- package/dist/modules/module.container.d.ts +43 -1
- package/dist/modules/module.container.js +77 -5
- package/dist/modules/module.container.js.map +1 -1
- package/dist/modules/test-module.container.d.ts +139 -25
- package/dist/modules/test-module.container.js +383 -199
- package/dist/modules/test-module.container.js.map +1 -1
- package/dist/overlays/anchor.abstract.d.ts +32 -1
- package/dist/overlays/anchor.abstract.js +42 -11
- package/dist/overlays/anchor.abstract.js.map +1 -1
- package/dist/overlays/anchor.schema.d.ts +21 -0
- package/dist/overlays/anchor.schema.js +21 -0
- package/dist/overlays/anchor.schema.js.map +1 -1
- package/dist/overlays/overlay-data.repository.d.ts +18 -0
- package/dist/overlays/overlay-data.repository.js +18 -0
- package/dist/overlays/overlay-data.repository.js.map +1 -1
- package/dist/overlays/overlay.abstract.d.ts +56 -1
- package/dist/overlays/overlay.abstract.js +79 -20
- package/dist/overlays/overlay.abstract.js.map +1 -1
- package/dist/overlays/overlay.schema.d.ts +20 -0
- package/dist/overlays/overlay.schema.js +20 -0
- package/dist/overlays/overlay.schema.js.map +1 -1
- package/dist/resources/resource-action.interface.d.ts +29 -3
- package/dist/resources/resource-data.repository.d.ts +63 -1
- package/dist/resources/resource-data.repository.js +94 -4
- package/dist/resources/resource-data.repository.js.map +1 -1
- package/dist/resources/resource.abstract.d.ts +163 -6
- package/dist/resources/resource.abstract.js +223 -59
- package/dist/resources/resource.abstract.js.map +1 -1
- package/dist/resources/resource.interface.d.ts +0 -2
- package/dist/resources/resource.schema.d.ts +39 -1
- package/dist/resources/resource.schema.js +38 -0
- package/dist/resources/resource.schema.js.map +1 -1
- package/dist/resources/terraform-resource.abstract.d.ts +44 -0
- package/dist/resources/terraform-resource.abstract.js +45 -0
- package/dist/resources/terraform-resource.abstract.js.map +1 -0
- package/dist/services/event/event.service.d.ts +32 -5
- package/dist/services/event/event.service.js +58 -16
- package/dist/services/event/event.service.js.map +1 -1
- package/dist/services/input/input.service.d.ts +82 -5
- package/dist/services/input/input.service.js +143 -12
- package/dist/services/input/input.service.js.map +1 -1
- package/dist/services/schema-translation/schema-translation.service.d.ts +9 -0
- package/dist/services/schema-translation/schema-translation.service.js +9 -0
- package/dist/services/schema-translation/schema-translation.service.js.map +1 -1
- package/dist/services/serialization/model/model-serialization.service.d.ts +25 -3
- package/dist/services/serialization/model/model-serialization.service.js +113 -62
- package/dist/services/serialization/model/model-serialization.service.js.map +1 -1
- package/dist/services/serialization/resource/resource-serialization.service.d.ts +36 -6
- package/dist/services/serialization/resource/resource-serialization.service.js +77 -28
- package/dist/services/serialization/resource/resource-serialization.service.js.map +1 -1
- package/dist/services/state-management/local.state-provider.d.ts +67 -4
- package/dist/services/state-management/local.state-provider.js +168 -41
- package/dist/services/state-management/local.state-provider.js.map +1 -1
- package/dist/services/state-management/remote.state-provider.d.ts +216 -0
- package/dist/services/state-management/remote.state-provider.js +645 -0
- package/dist/services/state-management/remote.state-provider.js.map +1 -0
- package/dist/services/state-management/state-management.service.d.ts +195 -17
- package/dist/services/state-management/state-management.service.js +259 -10
- package/dist/services/state-management/state-management.service.js.map +1 -1
- package/dist/services/state-management/state-provider.interface.d.ts +98 -3
- package/dist/services/state-management/state-provider.interface.js +14 -1
- package/dist/services/state-management/state-provider.interface.js.map +1 -1
- package/dist/services/state-management/terraform-state.service.d.ts +99 -0
- package/dist/services/state-management/terraform-state.service.js +197 -0
- package/dist/services/state-management/terraform-state.service.js.map +1 -0
- package/dist/services/state-management/test.state-provider.d.ts +42 -4
- package/dist/services/state-management/test.state-provider.js +77 -25
- package/dist/services/state-management/test.state-provider.js.map +1 -1
- package/dist/services/terraform/terraform.service.d.ts +480 -0
- package/dist/services/terraform/terraform.service.js +1082 -0
- package/dist/services/terraform/terraform.service.js.map +1 -0
- package/dist/services/terraform/terraform.type.d.ts +387 -0
- package/dist/services/terraform/terraform.type.js +579 -0
- package/dist/services/terraform/terraform.type.js.map +1 -0
- package/dist/services/transaction/transaction.service.d.ts +110 -10
- package/dist/services/transaction/transaction.service.js +570 -251
- package/dist/services/transaction/transaction.service.js.map +1 -1
- package/dist/services/validation/validation.service.d.ts +15 -3
- package/dist/services/validation/validation.service.js +12 -0
- package/dist/services/validation/validation.service.js.map +1 -1
- package/dist/utilities/array/array.utility.d.ts +3 -0
- package/dist/utilities/array/array.utility.js +3 -0
- package/dist/utilities/array/array.utility.js.map +1 -1
- package/dist/{functions → utilities}/diff/diff.utility.d.ts +19 -3
- package/dist/{functions → utilities}/diff/diff.utility.js +57 -41
- package/dist/utilities/diff/diff.utility.js.map +1 -0
- package/dist/utilities/file/file.utility.d.ts +16 -2
- package/dist/utilities/file/file.utility.js +23 -61
- package/dist/utilities/file/file.utility.js.map +1 -1
- package/dist/utilities/hcl/hcl.utility.d.ts +128 -0
- package/dist/utilities/hcl/hcl.utility.js +402 -0
- package/dist/utilities/hcl/hcl.utility.js.map +1 -0
- package/dist/utilities/http/http.utility.d.ts +57 -0
- package/dist/utilities/http/http.utility.js +98 -0
- package/dist/utilities/http/http.utility.js.map +1 -0
- package/dist/utilities/node/node.utility.d.ts +3 -0
- package/dist/utilities/node/node.utility.js +3 -0
- package/dist/utilities/node/node.utility.js.map +1 -1
- package/dist/utilities/object/object.utility.d.ts +12 -0
- package/dist/utilities/object/object.utility.js +12 -0
- package/dist/utilities/object/object.utility.js.map +1 -1
- package/dist/utilities/project/project.utility.d.ts +28 -0
- package/dist/utilities/project/project.utility.js +35 -0
- package/dist/utilities/project/project.utility.js.map +1 -0
- package/dist/utilities/string/string.utility.d.ts +41 -0
- package/dist/utilities/string/string.utility.js +65 -0
- package/dist/utilities/string/string.utility.js.map +1 -0
- package/dist/utilities/terraform/terraform.utility.d.ts +276 -0
- package/dist/utilities/terraform/terraform.utility.js +623 -0
- package/dist/utilities/terraform/terraform.utility.js.map +1 -0
- package/dist/utilities/test-helpers/test-classes.d.ts +36 -30
- package/dist/utilities/test-helpers/test-classes.js +38 -39
- package/dist/utilities/test-helpers/test-classes.js.map +1 -1
- package/dist/utilities/test-helpers/test-models.d.ts +8 -1
- package/dist/utilities/test-helpers/test-models.js +37 -12
- package/dist/utilities/test-helpers/test-models.js.map +1 -1
- package/dist/utilities/test-helpers/test-modes.d.ts +315 -0
- package/dist/utilities/test-helpers/test-modes.js +486 -0
- package/dist/utilities/test-helpers/test-modes.js.map +1 -0
- package/dist/utilities/test-helpers/test-modules.d.ts +47 -0
- package/dist/utilities/test-helpers/test-modules.js +85 -0
- package/dist/utilities/test-helpers/test-modules.js.map +1 -0
- package/dist/utilities/test-helpers/test-overlays.d.ts +20 -2
- package/dist/utilities/test-helpers/test-overlays.js +56 -6
- package/dist/utilities/test-helpers/test-overlays.js.map +1 -1
- package/dist/utilities/test-helpers/test-resources.d.ts +23 -3
- package/dist/utilities/test-helpers/test-resources.js +83 -23
- package/dist/utilities/test-helpers/test-resources.js.map +1 -1
- package/dist/utilities/validation/validation.utility.d.ts +24 -0
- package/dist/utilities/validation/validation.utility.js +24 -0
- package/dist/utilities/validation/validation.utility.js.map +1 -1
- package/package.json +12 -6
- package/dist/functions/diff/diff.utility.js.map +0 -1
- package/dist/services/capture/capture.service.d.ts +0 -19
- package/dist/services/capture/capture.service.js +0 -43
- package/dist/services/capture/capture.service.js.map +0 -1
- package/dist/services/state-management/local-encryption.state-provider.d.ts +0 -20
- package/dist/services/state-management/local-encryption.state-provider.js +0 -90
- package/dist/services/state-management/local-encryption.state-provider.js.map +0 -1
- package/dist/utilities/cidr/cidr.utility.d.ts +0 -10
- package/dist/utilities/cidr/cidr.utility.js +0 -51
- package/dist/utilities/cidr/cidr.utility.js.map +0 -1
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { mkdtemp, readFile, readdir, realpath, rm, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
|
+
import { Factory } from '../../decorators/factory.decorator.js';
|
|
13
|
+
import { TerraformCommandError } from '../../errors/index.js';
|
|
14
|
+
import { TerraformCommandFinishedEvent, TerraformCommandStartedEvent, TerraformProcessExitedEvent, TerraformProcessOutputEvent, TerraformProcessStartedEvent, } from '../../events/index.js';
|
|
15
|
+
import { Container } from '../../functions/container/container.js';
|
|
16
|
+
import { EventService } from '../../services/event/event.service.js';
|
|
17
|
+
import { TerraformStateService } from '../../services/state-management/terraform-state.service.js';
|
|
18
|
+
import { PROJECT_ROOT_VARIABLE_NAME } from '../../services/terraform/terraform.type.js';
|
|
19
|
+
const DEFAULT_STATE_CHECK_IN_INTERVAL_IN_MS = 10 * 1000;
|
|
20
|
+
const DEFAULT_TIMEOUT_IN_MS = 60 * 60 * 1000; // 60 minutes.
|
|
21
|
+
const TERRAGRUNT_LOG_FORMAT =
|
|
22
|
+
// eslint-disable-next-line spellcheck/spell-checker
|
|
23
|
+
"%level(case=upper,width=6) %prefix(path=short-relative,prefix='[',suffix='] ')%tf-path(suffix=': ')%msg(path=relative)";
|
|
24
|
+
const TERRAFORM_STATE_FILE_NAME = 'terraform.tfstate';
|
|
25
|
+
/**
|
|
26
|
+
* The commands that change infrastructure, and so are left unbounded unless the caller asks for a
|
|
27
|
+
* bound. Everything else only reads, where a timeout costs nothing and catches a hang.
|
|
28
|
+
*/
|
|
29
|
+
const MUTATING_COMMANDS = new Set(['apply', 'destroy']);
|
|
30
|
+
/**
|
|
31
|
+
* How much of a process's stderr is kept for the error a failure throws. Everything it wrote goes out
|
|
32
|
+
* as it is written, in {@link TerraformProcessOutputEvent}.
|
|
33
|
+
*/
|
|
34
|
+
const STDERR_TAIL_LENGTH = 64 * 1024;
|
|
35
|
+
/**
|
|
36
|
+
* Octo's single interface to the terraform and terragrunt binaries.
|
|
37
|
+
*
|
|
38
|
+
* {@link Octo.generate} writes module folders; this runs them, and turns their output back into the
|
|
39
|
+
* shapes the other modes expect - `plan(dir, { json: true })` feeds {@link Octo.validate}, and
|
|
40
|
+
* `output(dir, { json: true })` feeds {@link Octo.commit}. Routing every invocation through one class
|
|
41
|
+
* is what keeps flags, timeouts, and event emission consistent.
|
|
42
|
+
*
|
|
43
|
+
* Resolve it from the {@link Container} so that a run's terraform events reach the same listeners as
|
|
44
|
+
* everything else.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const terraform = await Container.getInstance().get(TerraformUtility);
|
|
49
|
+
* const { errors, plans } = await terraform.plan('./infrastructure', { json: true });
|
|
50
|
+
* const report = await octo.validate(app, { errors, plans });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @group Utilities/Terraform
|
|
54
|
+
*/
|
|
55
|
+
export class TerraformUtility {
|
|
56
|
+
/**
|
|
57
|
+
* The id of the last process any instance started, so ids never repeat within one octo process.
|
|
58
|
+
*/
|
|
59
|
+
static { this.lastProcessId = 0; }
|
|
60
|
+
/**
|
|
61
|
+
* @param options Overrides for the binaries invoked, the per-command timeout, and the state
|
|
62
|
+
* check-in interval. `terragruntBinary` defaults to `terragrunt`.
|
|
63
|
+
*
|
|
64
|
+
* `timeoutInMs` defaults to 60 minutes for the commands that only read - `plan`, `output`, `show`.
|
|
65
|
+
* `apply` and `destroy` run unbounded unless it is given: a timeout there turns a slow apply into
|
|
66
|
+
* one killed part way through a mutation, and how long a stack legitimately takes is a fact about
|
|
67
|
+
* that stack rather than something a default can know. What bounds them instead is the caller -
|
|
68
|
+
* a CI job's own timeout, or a person at a terminal.
|
|
69
|
+
*
|
|
70
|
+
* `stateCheckInIntervalInMs` is how often terraform state is checked into the state provider while
|
|
71
|
+
* a command runs, 10 seconds by default. Terraform rewrites it as each resource completes.
|
|
72
|
+
*/
|
|
73
|
+
constructor(options = {}) {
|
|
74
|
+
this.requestedTimeoutInMs = options.timeoutInMs;
|
|
75
|
+
this.options = {
|
|
76
|
+
stateCheckInIntervalInMs: options.stateCheckInIntervalInMs ?? DEFAULT_STATE_CHECK_IN_INTERVAL_IN_MS,
|
|
77
|
+
terraformBinary: options.terraformBinary,
|
|
78
|
+
terragruntBinary: options.terragruntBinary ?? 'terragrunt',
|
|
79
|
+
timeoutInMs: options.timeoutInMs ?? DEFAULT_TIMEOUT_IN_MS,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Runs `terragrunt run --all -- apply` over every generated module folder.
|
|
84
|
+
*
|
|
85
|
+
* **This changes real infrastructure**, and runs with `-auto-approve`. Use
|
|
86
|
+
* {@link TerraformUtility.findPlannedDestroys} beforehand if a destroy needs confirming.
|
|
87
|
+
*
|
|
88
|
+
* @param terragruntDir The directory octo generated the module folders into.
|
|
89
|
+
*/
|
|
90
|
+
async apply(terragruntDir) {
|
|
91
|
+
return this.runAll(terragruntDir, 'apply', ['-input=false', '-auto-approve', ...this.consumeArgs()]);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Runs `terragrunt run --all -- destroy` over every generated module folder.
|
|
95
|
+
*
|
|
96
|
+
* **This tears down real infrastructure**, and runs with `-auto-approve`.
|
|
97
|
+
*/
|
|
98
|
+
async destroy(terragruntDir) {
|
|
99
|
+
return this.runAll(terragruntDir, 'destroy', ['-input=false', '-auto-approve', ...this.consumeArgs()]);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Every address a set of plans will destroy, across all folders. A recreate (`create` + `delete`)
|
|
103
|
+
* counts, since the old object is still destroyed.
|
|
104
|
+
*
|
|
105
|
+
* Lets a caller refuse to apply until the destroys have been shown, which {@link apply} cannot do on
|
|
106
|
+
* its own because it runs with `-auto-approve`.
|
|
107
|
+
*/
|
|
108
|
+
findPlannedDestroys(plans) {
|
|
109
|
+
const destroys = [];
|
|
110
|
+
for (const [moduleId, plan] of plans.entries()) {
|
|
111
|
+
for (const resourceChange of plan.resource_changes ?? []) {
|
|
112
|
+
const tfActions = resourceChange.change?.actions ?? [];
|
|
113
|
+
if (resourceChange.mode !== 'data' && tfActions.includes('delete')) {
|
|
114
|
+
destroys.push({ address: resourceChange.address, moduleId, tfActions });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return destroys;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Returns the immediate sub-directories of `terragruntDir` that look like generated module
|
|
122
|
+
* folders (they contain a `terragrunt.hcl`). Each folder name is the octo `moduleId`.
|
|
123
|
+
*/
|
|
124
|
+
async listModuleFolders(terragruntDir) {
|
|
125
|
+
let entries;
|
|
126
|
+
try {
|
|
127
|
+
entries = await readdir(terragruntDir, { withFileTypes: true });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// A generate that produced no resources never creates the directory — that is "no module
|
|
131
|
+
// folders", not an error.
|
|
132
|
+
if (error.code === 'ENOENT') {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
const moduleIds = [];
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
if (!entry.isDirectory()) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const folderEntries = await readdir(join(terragruntDir, entry.name));
|
|
143
|
+
if (folderEntries.includes('terragrunt.hcl')) {
|
|
144
|
+
moduleIds.push(entry.name);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return moduleIds.sort();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @internal
|
|
151
|
+
*/
|
|
152
|
+
async output(terragruntDir, options = {}) {
|
|
153
|
+
if (!options.json) {
|
|
154
|
+
return this.runAll(terragruntDir, 'output', this.consumeArgs());
|
|
155
|
+
}
|
|
156
|
+
const composedArgs = this.consumeArgs();
|
|
157
|
+
const realTerragruntDir = await this.resolveRealPath(terragruntDir);
|
|
158
|
+
return this.withTerraformState(realTerragruntDir, async (moduleIds) => this.emitAround('output', terragruntDir, async () => {
|
|
159
|
+
const outputs = new Map();
|
|
160
|
+
for (const moduleId of moduleIds) {
|
|
161
|
+
const moduleOutputs = await this.readOutputs(join(realTerragruntDir, moduleId), composedArgs);
|
|
162
|
+
if (moduleOutputs !== undefined) {
|
|
163
|
+
outputs.set(moduleId, moduleOutputs);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return outputs;
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
async plan(terragruntDir, options = {}) {
|
|
173
|
+
if (!options.json) {
|
|
174
|
+
return this.runAll(terragruntDir, 'plan', ['-input=false', ...this.consumeArgs()]);
|
|
175
|
+
}
|
|
176
|
+
const composedArgs = this.consumeArgs();
|
|
177
|
+
const realTerragruntDir = await this.resolveRealPath(terragruntDir);
|
|
178
|
+
return this.withTerraformState(realTerragruntDir, async (moduleIds) => this.emitAround('plan', terragruntDir, async () => {
|
|
179
|
+
const errors = new Map();
|
|
180
|
+
const plans = new Map();
|
|
181
|
+
for (const moduleId of moduleIds) {
|
|
182
|
+
const result = await this.readPlan(join(realTerragruntDir, moduleId), composedArgs);
|
|
183
|
+
if ('plan' in result) {
|
|
184
|
+
plans.set(moduleId, result.plan);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
errors.set(moduleId, result.error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return { errors, plans };
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* To append extra CLI arguments to the *next* command only. Returns `this`, so it chains.
|
|
195
|
+
*/
|
|
196
|
+
setArgsOnce(args) {
|
|
197
|
+
this.onceArgs = args;
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Runs `terragrunt run --all -- validate` over every generated module folder, checking the generated
|
|
202
|
+
* HCL is well-formed. Unrelated to {@link Octo.validate}, which compares plans against intent.
|
|
203
|
+
*/
|
|
204
|
+
async validate(terragruntDir) {
|
|
205
|
+
return this.runAll(terragruntDir, 'validate', this.consumeArgs());
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Runs `file` with `args`, handing each chunk it writes to `onChunk` as it arrives. Keeps its whole
|
|
209
|
+
* stdout only when `keepStdout` asks for it, and the last {@link STDERR_TAIL_LENGTH} characters of its
|
|
210
|
+
* stderr, so a process writing for an hour holds no more memory than one writing for a second.
|
|
211
|
+
*/
|
|
212
|
+
spawnAsync(file, args, options, onChunk) {
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
214
|
+
let stderr = '';
|
|
215
|
+
let stdout = '';
|
|
216
|
+
const child = spawn(file, args, {
|
|
217
|
+
cwd: options.cwd,
|
|
218
|
+
env: options.env,
|
|
219
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
220
|
+
timeout: options.timeout,
|
|
221
|
+
});
|
|
222
|
+
// Decode as text, so a character split across two chunks arrives whole.
|
|
223
|
+
child.stdout.setEncoding('utf8');
|
|
224
|
+
child.stderr.setEncoding('utf8');
|
|
225
|
+
child.stdout.on('data', (chunk) => {
|
|
226
|
+
if (options.keepStdout) {
|
|
227
|
+
stdout += chunk;
|
|
228
|
+
}
|
|
229
|
+
onChunk(chunk, 'stdout');
|
|
230
|
+
});
|
|
231
|
+
child.stderr.on('data', (chunk) => {
|
|
232
|
+
stderr = (stderr + chunk).slice(-STDERR_TAIL_LENGTH);
|
|
233
|
+
onChunk(chunk, 'stderr');
|
|
234
|
+
});
|
|
235
|
+
child.on('error', (error) => reject(Object.assign(error, { stderr, stdout })));
|
|
236
|
+
child.on('close', (code, signal) => {
|
|
237
|
+
if (code === 0) {
|
|
238
|
+
resolve({ stderr, stdout });
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
const reason = signal ? `killed by ${signal}` : `exit ${code}`;
|
|
242
|
+
reject(Object.assign(new Error(`Command failed (${reason})`), { code: code ?? undefined, stderr, stdout }));
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* The environment a terragrunt command runs with, carrying the terraform binary override.
|
|
249
|
+
*/
|
|
250
|
+
buildEnv() {
|
|
251
|
+
const env = { ...process.env };
|
|
252
|
+
env.TG_PROVIDER_CACHE ??= '1'; // Enable Terragrunt shared provider cache by default.
|
|
253
|
+
// Lay out Terragrunt's log lines without a time of their own.
|
|
254
|
+
delete env.TG_LOG_FORMAT;
|
|
255
|
+
env.TG_LOG_CUSTOM_FORMAT = TERRAGRUNT_LOG_FORMAT;
|
|
256
|
+
// Resolves the paths a generated folder names relative to the project root. Terragrunt runs
|
|
257
|
+
// terraform from a copy of the folder, so terraform cannot work the root out for itself.
|
|
258
|
+
env[`TF_VAR_${PROJECT_ROOT_VARIABLE_NAME}`] ??= process.cwd();
|
|
259
|
+
if (this.options.terraformBinary) {
|
|
260
|
+
env.TG_TF_PATH = this.options.terraformBinary;
|
|
261
|
+
}
|
|
262
|
+
return env;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Takes the arguments set by {@link TerraformUtility.setArgsOnce}, clearing them.
|
|
266
|
+
*/
|
|
267
|
+
consumeArgs() {
|
|
268
|
+
const args = this.onceArgs ?? [];
|
|
269
|
+
this.onceArgs = undefined;
|
|
270
|
+
return args;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Renders why one folder could not be planned.
|
|
274
|
+
*
|
|
275
|
+
* Terragrunt writes its diagnostics to stderr, which carries the `Error:` block, so that comes
|
|
276
|
+
* first. The wrapped {@link TerraformCommandError} message is the fallback for failures that
|
|
277
|
+
* produce no stderr, such as a malformed `show -json` payload failing at `JSON.parse`.
|
|
278
|
+
*/
|
|
279
|
+
describePlanFailure(error) {
|
|
280
|
+
const e = error;
|
|
281
|
+
return e.stderr?.trim() || e.message?.trim() || String(error);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Publishes the same started/finished pair {@link runAll} does, around a body that drives
|
|
285
|
+
* terragrunt folder by folder instead.
|
|
286
|
+
*
|
|
287
|
+
* The JSON-mode `plan` and `output` take that per-folder path, and it is the slowest step of a
|
|
288
|
+
* `validate` - a full plan runs for tens of seconds - so the log must not fall silent through it.
|
|
289
|
+
*/
|
|
290
|
+
async emitAround(command, terragruntDir, body) {
|
|
291
|
+
const eventService = EventService.getInstance();
|
|
292
|
+
const startedAt = Date.now();
|
|
293
|
+
eventService.emit(new TerraformCommandStartedEvent(command, { command, dir: terragruntDir }));
|
|
294
|
+
try {
|
|
295
|
+
const result = await body();
|
|
296
|
+
eventService.emit(new TerraformCommandFinishedEvent(command, {
|
|
297
|
+
command,
|
|
298
|
+
dir: terragruntDir,
|
|
299
|
+
durationInMs: Date.now() - startedAt,
|
|
300
|
+
exitCode: 0,
|
|
301
|
+
}));
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
eventService.emit(new TerraformCommandFinishedEvent(command, {
|
|
306
|
+
command,
|
|
307
|
+
dir: terragruntDir,
|
|
308
|
+
durationInMs: Date.now() - startedAt,
|
|
309
|
+
exitCode: error?.exitCode ?? -1,
|
|
310
|
+
}));
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* The `terragrunt run --all` invocation itself, wrapped in its started/finished pair.
|
|
316
|
+
*/
|
|
317
|
+
async invokeRunAll(terragruntDir, command, commandArgs) {
|
|
318
|
+
const args = [
|
|
319
|
+
'--non-interactive',
|
|
320
|
+
'--no-color',
|
|
321
|
+
'--working-dir',
|
|
322
|
+
terragruntDir,
|
|
323
|
+
'run',
|
|
324
|
+
'--all',
|
|
325
|
+
'--',
|
|
326
|
+
command,
|
|
327
|
+
...commandArgs,
|
|
328
|
+
];
|
|
329
|
+
const eventService = EventService.getInstance();
|
|
330
|
+
const startedAt = Date.now();
|
|
331
|
+
eventService.emit(new TerraformCommandStartedEvent(command, { command, dir: terragruntDir }));
|
|
332
|
+
let exitCode = 0;
|
|
333
|
+
try {
|
|
334
|
+
await this.runProcess(this.options.terragruntBinary, args, {
|
|
335
|
+
command,
|
|
336
|
+
dir: terragruntDir,
|
|
337
|
+
timeout: MUTATING_COMMANDS.has(command) ? this.requestedTimeoutInMs : this.options.timeoutInMs,
|
|
338
|
+
});
|
|
339
|
+
return { args, exitCode };
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
exitCode = error.exitCode ?? -1;
|
|
343
|
+
throw error;
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
eventService.emit(new TerraformCommandFinishedEvent(command, {
|
|
347
|
+
command,
|
|
348
|
+
dir: terragruntDir,
|
|
349
|
+
durationInMs: Date.now() - startedAt,
|
|
350
|
+
exitCode,
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Moves the terraform state of every move the last generate recorded out of its old module folder
|
|
356
|
+
* into its new one, with `terraform state mv`, and copies the moved resources' outputs along, since
|
|
357
|
+
* folders depending on the new one read them there. An address the old folder's state does not hold,
|
|
358
|
+
* or the new one's already holds, is skipped, which is what a move already made leaves behind.
|
|
359
|
+
* Records in `originalStates` what each state file held before its first move, `undefined` where none
|
|
360
|
+
* existed.
|
|
361
|
+
*/
|
|
362
|
+
async moveStates(terragruntDir, moduleIds, originalStates) {
|
|
363
|
+
const terraformStateService = await Container.getInstance().get(TerraformStateService);
|
|
364
|
+
const moves = await terraformStateService.getRecordedMoves();
|
|
365
|
+
const readAddresses = async (stateFilePath) => {
|
|
366
|
+
try {
|
|
367
|
+
const state = JSON.parse(await readFile(stateFilePath, 'utf-8'));
|
|
368
|
+
return new Set((state.resources ?? []).filter((r) => r.mode === 'managed').map((r) => `${r.type}.${r.name}`));
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
return new Set();
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
let tempDir;
|
|
375
|
+
try {
|
|
376
|
+
for (const { addresses, fromModuleId, moduleId, outputs } of moves) {
|
|
377
|
+
if (!moduleIds.includes(fromModuleId) || !moduleIds.includes(moduleId)) {
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
// Find the addresses still to move.
|
|
381
|
+
const fromStateFilePath = resolve(terragruntDir, fromModuleId, TERRAFORM_STATE_FILE_NAME);
|
|
382
|
+
const toStateFilePath = resolve(terragruntDir, moduleId, TERRAFORM_STATE_FILE_NAME);
|
|
383
|
+
const [fromAddresses, toAddresses] = await Promise.all([
|
|
384
|
+
readAddresses(fromStateFilePath),
|
|
385
|
+
readAddresses(toStateFilePath),
|
|
386
|
+
]);
|
|
387
|
+
const movableAddresses = addresses.filter(({ from, to }) => fromAddresses.has(from) && !toAddresses.has(to));
|
|
388
|
+
if (movableAddresses.length === 0) {
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
// Keep what both state files held before their first move.
|
|
392
|
+
for (const stateFilePath of [fromStateFilePath, toStateFilePath]) {
|
|
393
|
+
if (!originalStates.has(stateFilePath)) {
|
|
394
|
+
originalStates.set(stateFilePath, existsSync(stateFilePath) ? await readFile(stateFilePath) : undefined);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Move each address, writing terraform's backups outside the module folders.
|
|
398
|
+
tempDir ??= await mkdtemp(join(tmpdir(), 'octo-tfstate-'));
|
|
399
|
+
for (const { from, to } of movableAddresses) {
|
|
400
|
+
await this.runIn(tempDir, this.options.terraformBinary ?? 'terraform', [
|
|
401
|
+
'state',
|
|
402
|
+
'mv',
|
|
403
|
+
'-lock=false',
|
|
404
|
+
`-state=${fromStateFilePath}`,
|
|
405
|
+
`-state-out=${toStateFilePath}`,
|
|
406
|
+
`-backup=${join(tempDir, `${fromModuleId}-${from}.backup`)}`,
|
|
407
|
+
`-backup-out=${join(tempDir, `${moduleId}-${to}.backup`)}`,
|
|
408
|
+
from,
|
|
409
|
+
to,
|
|
410
|
+
]);
|
|
411
|
+
}
|
|
412
|
+
// Copy the outputs the moved resources published.
|
|
413
|
+
const fromState = JSON.parse(await readFile(fromStateFilePath, 'utf-8'));
|
|
414
|
+
const toState = JSON.parse(await readFile(toStateFilePath, 'utf-8'));
|
|
415
|
+
toState.outputs ??= {};
|
|
416
|
+
for (const { from, to } of outputs) {
|
|
417
|
+
if (fromState.outputs?.[from] !== undefined && toState.outputs[to] === undefined) {
|
|
418
|
+
toState.outputs[to] = fromState.outputs[from];
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
toState.serial++;
|
|
422
|
+
await writeFile(toStateFilePath, JSON.stringify(toState, null, 2));
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
if (tempDir) {
|
|
427
|
+
await rm(tempDir, { force: true, recursive: true });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Runs `terragrunt output -json` in one module folder.
|
|
433
|
+
*
|
|
434
|
+
* A folder whose output fails is reported as `undefined`, not thrown — one bad module folder must not
|
|
435
|
+
* abort every other folder's result.
|
|
436
|
+
*/
|
|
437
|
+
async readOutputs(moduleDir, composedArgs) {
|
|
438
|
+
try {
|
|
439
|
+
const { stdout } = await this.run(moduleDir, ['output', '-json', ...composedArgs]);
|
|
440
|
+
return JSON.parse(stdout);
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
return undefined;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Runs `terragrunt plan -out=<planFile>` followed by `terragrunt show -json <planFile>` in one module folder.
|
|
448
|
+
*
|
|
449
|
+
* The plan file is written to an absolute temp path, never inside a terragrunt
|
|
450
|
+
* cache — terragrunt picks a different cache sub-directory per invocation, so a relative plan file
|
|
451
|
+
* written by one command cannot be found by the next.
|
|
452
|
+
*
|
|
453
|
+
* A folder whose plan/show/parse fails is reported as an `error`, not thrown — one bad module folder must not
|
|
454
|
+
* abort every other folder's result. The failure is carried so `validate` can report it verbatim.
|
|
455
|
+
*/
|
|
456
|
+
async readPlan(moduleDir, composedArgs) {
|
|
457
|
+
const tempDir = await mkdtemp(join(tmpdir(), 'octo-tfplan-'));
|
|
458
|
+
const planFile = join(tempDir, 'octo.tfplan');
|
|
459
|
+
try {
|
|
460
|
+
await this.run(moduleDir, ['plan', `-out=${planFile}`, '-input=false', ...composedArgs]);
|
|
461
|
+
const { stdout } = await this.run(moduleDir, ['show', '-json', planFile]);
|
|
462
|
+
return { plan: JSON.parse(stdout) };
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
return { error: this.describePlanFailure(error) };
|
|
466
|
+
}
|
|
467
|
+
finally {
|
|
468
|
+
await rm(tempDir, { force: true, recursive: true });
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* The directory with every symbolic link on its path resolved, or the directory as given when it does
|
|
473
|
+
* not exist. Terragrunt drops `dependency` blocks when its working directory is reached through a
|
|
474
|
+
* symbolic link, as macOS's temporary directory is.
|
|
475
|
+
*/
|
|
476
|
+
async resolveRealPath(dir) {
|
|
477
|
+
try {
|
|
478
|
+
return await realpath(dir);
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
if (error.code === 'ENOENT') {
|
|
482
|
+
return dir;
|
|
483
|
+
}
|
|
484
|
+
throw error;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Writes back what each state file held before {@link TerraformUtility.moveStates}, deleting one that
|
|
489
|
+
* did not exist.
|
|
490
|
+
*/
|
|
491
|
+
async restoreStates(originalStates) {
|
|
492
|
+
for (const [stateFilePath, data] of originalStates.entries()) {
|
|
493
|
+
if (data === undefined) {
|
|
494
|
+
await rm(stateFilePath, { force: true });
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
await writeFile(stateFilePath, data);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Runs one terragrunt command in a single module folder (`cwd` = that folder).
|
|
503
|
+
*/
|
|
504
|
+
async run(moduleDir, args) {
|
|
505
|
+
return this.runIn(moduleDir, this.options.terragruntBinary, args);
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Runs `terragrunt run --all -- <command>` across every module folder under `terragruntDir`, with
|
|
509
|
+
* the terraform state of every folder checked out around it.
|
|
510
|
+
*/
|
|
511
|
+
async runAll(terragruntDir, command, commandArgs) {
|
|
512
|
+
const realTerragruntDir = await this.resolveRealPath(terragruntDir);
|
|
513
|
+
return this.withTerraformState(realTerragruntDir, () => this.invokeRunAll(realTerragruntDir, command, commandArgs), { keepMoves: MUTATING_COMMANDS.has(command) });
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Runs `binary` with `args` in `dir`. Its stdout is returned only when it is asked for JSON, which is
|
|
517
|
+
* the output octo reads; every other process's output goes out only as events.
|
|
518
|
+
*/
|
|
519
|
+
async runIn(dir, binary, args) {
|
|
520
|
+
return this.runProcess(binary, args, { command: args[0], cwd: dir, dir, timeout: this.options.timeoutInMs });
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Runs one process. Every terraform and terragrunt process octo starts goes through here, and goes out
|
|
524
|
+
* as events: a {@link TerraformProcessStartedEvent}, a {@link TerraformProcessOutputEvent} for each
|
|
525
|
+
* chunk it writes, and a {@link TerraformProcessExitedEvent}, all named after `command`.
|
|
526
|
+
*
|
|
527
|
+
* @throws {@link TerraformCommandError} When the process cannot start or exits non-zero.
|
|
528
|
+
*/
|
|
529
|
+
async runProcess(binary, args, { command, cwd, dir, timeout }) {
|
|
530
|
+
const eventService = EventService.getInstance();
|
|
531
|
+
const processId = ++TerraformUtility.lastProcessId;
|
|
532
|
+
eventService.emit(new TerraformProcessStartedEvent(command, { args, binary, dir, processId }));
|
|
533
|
+
let exitCode = 0;
|
|
534
|
+
try {
|
|
535
|
+
const { stdout } = await this.spawnAsync(binary, args, { cwd, env: this.buildEnv(), keepStdout: args.includes('-json'), timeout }, (text, stream) => eventService.emit(new TerraformProcessOutputEvent(command, { processId, stream, text })));
|
|
536
|
+
return { stdout };
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
const commandError = this.toTerraformCommandError(binary, args, dir, error);
|
|
540
|
+
exitCode = commandError.exitCode;
|
|
541
|
+
throw commandError;
|
|
542
|
+
}
|
|
543
|
+
finally {
|
|
544
|
+
eventService.emit(new TerraformProcessExitedEvent(command, { exitCode, processId }));
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Wraps whatever a failed spawn threw into a {@link TerraformCommandError}.
|
|
549
|
+
*/
|
|
550
|
+
toTerraformCommandError(binary, args, dir, error) {
|
|
551
|
+
const e = error;
|
|
552
|
+
const exitCode = typeof e.code === 'number' ? e.code : -1;
|
|
553
|
+
const message = `Failed to run "${binary} ${args.join(' ')}" in "${dir}" (exit ${exitCode}): ${e.stderr || e.message || String(error)}`;
|
|
554
|
+
return new TerraformCommandError(message, args, exitCode, e.stdout ?? '', e.stderr ?? '');
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Checks every module folder's terraform state out of Octo's state provider, moves the state of every
|
|
558
|
+
* resource generate moved between folders, runs `body`, and checks the state back in.
|
|
559
|
+
*
|
|
560
|
+
* Only a command that changes infrastructure (`keepMoves`) checks the moves in. Any other runs on them
|
|
561
|
+
* and puts back what the state files held before, so a move nobody applied never reaches the provider.
|
|
562
|
+
*
|
|
563
|
+
* The check-in runs on the way out of a failure as much as a success, because what terraform has
|
|
564
|
+
* already built is real whether or not the command that built it returned cleanly. A timer checks
|
|
565
|
+
* in through the command as well, bounding what a killed runner loses.
|
|
566
|
+
*
|
|
567
|
+
* A failed command keeps its own error when the check-in after it fails too; the check-in's error
|
|
568
|
+
* is printed on stderr. The folder's state is ahead of the provider's then, and the next run keeps
|
|
569
|
+
* it and checks it in.
|
|
570
|
+
*/
|
|
571
|
+
async withTerraformState(terragruntDir, body, { keepMoves = false } = {}) {
|
|
572
|
+
const terraformStateService = await Container.getInstance().get(TerraformStateService);
|
|
573
|
+
const moduleIds = await this.listModuleFolders(terragruntDir);
|
|
574
|
+
const originalStates = new Map();
|
|
575
|
+
await terraformStateService.checkOut(terragruntDir, moduleIds);
|
|
576
|
+
const checkIn = async () => {
|
|
577
|
+
terraformStateService.stopPeriodicCheckIn();
|
|
578
|
+
if (!keepMoves) {
|
|
579
|
+
await this.restoreStates(originalStates);
|
|
580
|
+
}
|
|
581
|
+
await terraformStateService.checkIn(terragruntDir, moduleIds);
|
|
582
|
+
};
|
|
583
|
+
let result;
|
|
584
|
+
try {
|
|
585
|
+
await this.moveStates(terragruntDir, moduleIds, originalStates);
|
|
586
|
+
if (keepMoves || originalStates.size === 0) {
|
|
587
|
+
terraformStateService.startPeriodicCheckIn(terragruntDir, moduleIds, this.options.stateCheckInIntervalInMs);
|
|
588
|
+
}
|
|
589
|
+
result = await body(moduleIds);
|
|
590
|
+
}
|
|
591
|
+
catch (error) {
|
|
592
|
+
// Keep the error of the command, which is the one the user has to act on.
|
|
593
|
+
await checkIn().catch((checkInError) => {
|
|
594
|
+
process.stderr.write(`Failed to check terraform state in: ${checkInError?.message ?? String(checkInError)}\n`);
|
|
595
|
+
});
|
|
596
|
+
throw error;
|
|
597
|
+
}
|
|
598
|
+
await checkIn();
|
|
599
|
+
return result;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* @internal
|
|
604
|
+
*/
|
|
605
|
+
let TerraformUtilityFactory = class TerraformUtilityFactory {
|
|
606
|
+
/**
|
|
607
|
+
* @internal
|
|
608
|
+
*/
|
|
609
|
+
static async create(options = {}, forceNew = false) {
|
|
610
|
+
if (!this.instance) {
|
|
611
|
+
this.instance = new TerraformUtility(options);
|
|
612
|
+
}
|
|
613
|
+
if (forceNew) {
|
|
614
|
+
this.instance = new TerraformUtility(options);
|
|
615
|
+
}
|
|
616
|
+
return this.instance;
|
|
617
|
+
}
|
|
618
|
+
};
|
|
619
|
+
TerraformUtilityFactory = __decorate([
|
|
620
|
+
Factory(TerraformUtility)
|
|
621
|
+
], TerraformUtilityFactory);
|
|
622
|
+
export { TerraformUtilityFactory };
|
|
623
|
+
//# sourceMappingURL=terraform.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.utility.js","sourceRoot":"","sources":["../../../src/utilities/terraform/terraform.utility.ts"],"names":[],"mappings":"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"}
|