@microsoft/terraform-cdk-constructs 0.0.3-pre.11 → 0.0.3-pre.12
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/.jsii +334 -211
- package/API.md +166 -76
- package/README.md +4 -5
- package/docs/testing.md +39 -137
- package/lib/azure-actiongroup/test/AzureActionGroup.integ.js +66 -0
- package/lib/azure-actiongroup/test/AzureActionGroup.spec.js +5 -22
- package/lib/azure-applicationgateway/lib/gateway.js +1 -1
- package/lib/azure-applicationgateway/test/AzureApplicationGateway.integ.d.ts +1 -0
- package/lib/azure-applicationgateway/test/AzureApplicationGateway.integ.js +272 -0
- package/lib/azure-applicationgateway/test/AzureApplicationGateway.spec.js +3 -20
- package/lib/azure-applicationinsights/lib/appinsights.js +1 -1
- package/lib/azure-applicationinsights/test/AzureAppInsights.integ.d.ts +1 -0
- package/lib/azure-applicationinsights/test/AzureAppInsights.integ.js +101 -0
- package/lib/azure-applicationinsights/test/AzureAppInsights.spec.js +4 -21
- package/lib/azure-containerregistry/lib/registry.js +1 -1
- package/lib/azure-containerregistry/test/AzureContainerRegistry.integ.d.ts +1 -0
- package/lib/azure-containerregistry/test/AzureContainerRegistry.integ.js +68 -0
- package/lib/azure-containerregistry/test/AzureContainerRegistry.spec.js +4 -17
- package/lib/azure-datalake/lib/datalake.d.ts +1 -0
- package/lib/azure-datalake/lib/datalake.js +2 -1
- package/lib/azure-datalake/test/AzureDatalake.spec.d.ts +1 -0
- package/lib/azure-datalake/test/AzureDatalake.spec.js +32 -0
- package/lib/azure-datalake/test/AzureStorageAccount.integ.d.ts +1 -0
- package/lib/azure-datalake/test/AzureStorageAccount.integ.js +60 -0
- package/lib/azure-eventhub/lib/authorization.js +1 -1
- package/lib/azure-eventhub/lib/consumer.js +1 -1
- package/lib/azure-eventhub/lib/eventhubcluster.js +1 -1
- package/lib/azure-eventhub/lib/instance.d.ts +1 -0
- package/lib/azure-eventhub/lib/instance.js +5 -4
- package/lib/azure-eventhub/lib/kusto-connection.js +1 -1
- package/lib/azure-eventhub/lib/namespace.js +8 -8
- package/lib/azure-eventhub/test/AzureEventhub.integ.d.ts +1 -0
- package/lib/azure-eventhub/test/AzureEventhub.integ.js +72 -0
- package/lib/azure-eventhub/test/AzureEventhub.spec.js +4 -21
- package/lib/azure-functionapp/lib/functionapplinux.js +1 -1
- package/lib/azure-functionapp/test/AzureLinuxFunctionApp.integ.d.ts +1 -0
- package/lib/azure-functionapp/test/AzureLinuxFunctionApp.integ.js +117 -0
- package/lib/azure-functionapp/test/AzureLinuxFunctionApp.spec.js +4 -21
- package/lib/azure-keyvault/lib/certificate.js +2 -2
- package/lib/azure-keyvault/lib/key.js +1 -1
- package/lib/azure-keyvault/lib/policy.js +1 -1
- package/lib/azure-keyvault/lib/secret.js +1 -1
- package/lib/azure-keyvault/lib/vault.js +1 -1
- package/lib/azure-keyvault/test/AzureKeyVault.integ.d.ts +1 -0
- package/lib/azure-keyvault/test/AzureKeyVault.integ.js +119 -0
- package/lib/azure-keyvault/test/AzureKeyVault.spec.js +4 -29
- package/lib/azure-kubernetes/lib/cluster.js +1 -1
- package/lib/azure-kubernetes/test/AzureKubernetesCluster.integ.d.ts +1 -0
- package/lib/azure-kubernetes/test/AzureKubernetesCluster.integ.js +75 -0
- package/lib/azure-kubernetes/test/AzureKubernetesCluster.spec.js +4 -21
- package/lib/azure-kusto/lib/cluster.d.ts +3 -0
- package/lib/azure-kusto/lib/cluster.js +45 -21
- package/lib/azure-kusto/lib/compute-specification.js +1 -1
- package/lib/azure-kusto/lib/database.d.ts +7 -8
- package/lib/azure-kusto/lib/database.js +23 -25
- package/lib/azure-kusto/test/AzureKusto.integ.d.ts +1 -0
- package/lib/azure-kusto/test/AzureKusto.integ.js +74 -0
- package/lib/azure-kusto/test/AzureKusto.spec.js +3 -16
- package/lib/azure-loganalytics/lib/workspace.d.ts +2 -0
- package/lib/azure-loganalytics/lib/workspace.js +3 -2
- package/lib/azure-loganalytics/test/AzureLogAnalytics.integ.d.ts +1 -0
- package/lib/azure-loganalytics/test/AzureLogAnalytics.integ.js +117 -0
- package/lib/azure-loganalytics/test/AzureLogAnalytics.spec.js +4 -17
- package/lib/azure-metricalert/lib/metric-alert.js +1 -1
- package/lib/azure-metricalert/test/AzureMetricAlert.integ.d.ts +1 -0
- package/lib/azure-metricalert/test/AzureMetricAlert.integ.js +85 -0
- package/lib/azure-metricalert/test/AzureMetricAlert.spec.js +4 -21
- package/lib/azure-networksecuritygroup/lib/preconfigured-rules.js +1 -1
- package/lib/azure-networksecuritygroup/lib/securitygroup.js +2 -2
- package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.integ.d.ts +1 -0
- package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.integ.js +85 -0
- package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.spec.js +4 -17
- package/lib/azure-queryrulealert/lib/query-rule-alert.js +1 -1
- package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.integ.d.ts +1 -0
- package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.integ.js +63 -0
- package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.spec.js +4 -21
- package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
- package/lib/azure-resourcegroup/test/AzureResourceGroup.integ.d.ts +1 -0
- package/lib/azure-resourcegroup/test/AzureResourceGroup.integ.js +41 -0
- package/lib/azure-resourcegroup/test/AzureResourceGroup.spec.js +4 -17
- package/lib/azure-storageaccount/lib/account.d.ts +5 -0
- package/lib/azure-storageaccount/lib/account.js +3 -2
- package/lib/azure-storageaccount/lib/container.js +2 -2
- package/lib/azure-storageaccount/lib/fileshare.js +2 -2
- package/lib/azure-storageaccount/lib/queue.js +1 -1
- package/lib/azure-storageaccount/lib/table.js +1 -1
- package/lib/azure-storageaccount/test/AzureStorageAccount.integ.d.ts +1 -0
- package/lib/azure-storageaccount/test/AzureStorageAccount.integ.js +84 -0
- package/lib/azure-storageaccount/test/AzureStorageAccount.spec.js +4 -17
- package/lib/azure-virtualmachine/lib/image-references.js +2 -2
- package/lib/azure-virtualmachine/lib/vm.d.ts +21 -0
- package/lib/azure-virtualmachine/lib/vm.js +5 -3
- package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.integ.d.ts +1 -0
- package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.integ.js +109 -0
- package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.spec.js +4 -17
- package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.integ.d.ts +1 -0
- package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.integ.js +105 -0
- package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.spec.js +4 -17
- package/lib/azure-virtualmachinescaleset/lib/cluster.d.ts +20 -0
- package/lib/azure-virtualmachinescaleset/lib/cluster.js +5 -3
- package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.integ.d.ts +1 -0
- package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.integ.js +113 -0
- package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.spec.js +4 -17
- package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.integ.d.ts +1 -0
- package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.integ.js +109 -0
- package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.spec.js +4 -17
- package/lib/azure-virtualnetwork/lib/network.js +1 -1
- package/lib/azure-virtualnetwork/lib/peering.js +1 -1
- package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.integ.d.ts +1 -0
- package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.integ.js +92 -0
- package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.spec.js +4 -17
- package/lib/core-azure/lib/diagsettings.d.ts +3 -2
- package/lib/core-azure/lib/diagsettings.js +15 -21
- package/lib/core-azure/lib/rbac.js +1 -1
- package/lib/core-azure/lib/resource.js +5 -3
- package/lib/core-azure/test/AzureResource.integ.d.ts +1 -0
- package/lib/core-azure/test/AzureResource.integ.js +75 -0
- package/lib/testing/index.d.ts +34 -0
- package/lib/testing/index.js +235 -2
- package/package.json +6 -4
- package/cdktf.out/manifest.json +0 -13
- package/cdktf.out/stacks/testAzureActionGroup/cdk.tf.json +0 -111
- package/cdktf.out/stacks/testAzureApplicationGateway/cdk.tf.json +0 -588
- package/cdktf.out/stacks/testAzureApplicationInsights/cdk.tf.json +0 -245
- package/cdktf.out/stacks/testAzureContainerRegistry/cdk.tf.json +0 -179
- package/cdktf.out/stacks/testAzureEventhub/cdk.tf.json +0 -236
- package/cdktf.out/stacks/testAzureKeyVault/cdk.tf.json +0 -436
- package/cdktf.out/stacks/testAzureKubernetesCluster/cdk.tf.json +0 -152
- package/cdktf.out/stacks/testAzureKusto/cdk.tf.json +0 -209
- package/cdktf.out/stacks/testAzureLinuxFunctionApp/cdk.tf.json +0 -439
- package/cdktf.out/stacks/testAzureLinuxVirtualMachineExample/cdk.tf.json +0 -283
- package/cdktf.out/stacks/testAzureLinuxVirtualMachineScaleSetExample/cdk.tf.json +0 -261
- package/cdktf.out/stacks/testAzureLogAnalytics/cdk.tf.json +0 -309
- package/cdktf.out/stacks/testAzureMetricAlert/cdk.tf.json +0 -161
- package/cdktf.out/stacks/testAzureNetworkSecurityGroup/cdk.tf.json +0 -271
- package/cdktf.out/stacks/testAzureQueryRuleAlert/cdk.tf.json +0 -122
- package/cdktf.out/stacks/testAzureResourceGroup/cdk.tf.json +0 -88
- package/cdktf.out/stacks/testAzureStorageAccount/cdk.tf.json +0 -339
- package/cdktf.out/stacks/testAzureVirtualNetwork/cdk.tf.json +0 -264
- package/cdktf.out/stacks/testAzureWindowVirtualMachineScaleSetExample/cdk.tf.json +0 -261
- package/cdktf.out/stacks/testAzureWindowsVirtualMachineExample/cdk.tf.json +0 -280
- package/cdktf.out/stacks/testExampleAzureResource/cdk.tf.json +0 -167
- package/lib/azure-actiongroup/test/ExampleAzureActionGroup.d.ts +0 -5
- package/lib/azure-actiongroup/test/ExampleAzureActionGroup.js +0 -66
- package/lib/azure-applicationgateway/test/ExampleAzureApplicationGateway.d.ts +0 -5
- package/lib/azure-applicationgateway/test/ExampleAzureApplicationGateway.js +0 -267
- package/lib/azure-applicationinsights/test/ExampleAzureApplicationInsights.d.ts +0 -5
- package/lib/azure-applicationinsights/test/ExampleAzureApplicationInsights.js +0 -87
- package/lib/azure-containerregistry/test/ExampleAzureContainerRegistry.d.ts +0 -5
- package/lib/azure-containerregistry/test/ExampleAzureContainerRegistry.js +0 -57
- package/lib/azure-eventhub/test/ExampleAzureEventhub.d.ts +0 -5
- package/lib/azure-eventhub/test/ExampleAzureEventhub.js +0 -72
- package/lib/azure-functionapp/test/ExampleAzureLinuxFunctionApp.d.ts +0 -5
- package/lib/azure-functionapp/test/ExampleAzureLinuxFunctionApp.js +0 -123
- package/lib/azure-keyvault/test/ExampleAzureKeyVault.d.ts +0 -5
- package/lib/azure-keyvault/test/ExampleAzureKeyVault.js +0 -112
- package/lib/azure-kubernetes/test/ExampleAzureKubernetesCluster.d.ts +0 -5
- package/lib/azure-kubernetes/test/ExampleAzureKubernetesCluster.js +0 -65
- package/lib/azure-kusto/test/ExampleAzureKusto.d.ts +0 -5
- package/lib/azure-kusto/test/ExampleAzureKusto.js +0 -71
- package/lib/azure-loganalytics/test/ExampleAzureLogAnalytics.d.ts +0 -5
- package/lib/azure-loganalytics/test/ExampleAzureLogAnalytics.js +0 -115
- package/lib/azure-metricalert/test/ExampleAzureMetricAlert.d.ts +0 -5
- package/lib/azure-metricalert/test/ExampleAzureMetricAlert.js +0 -81
- package/lib/azure-networksecuritygroup/test/ExampleAzureNetworkSecurityGroup.d.ts +0 -5
- package/lib/azure-networksecuritygroup/test/ExampleAzureNetworkSecurityGroup.js +0 -97
- package/lib/azure-queryrulealert/test/ExampleAzureQueryRuleAlert.d.ts +0 -5
- package/lib/azure-queryrulealert/test/ExampleAzureQueryRuleAlert.js +0 -67
- package/lib/azure-resourcegroup/test/ExampleAzureResourceGroup.d.ts +0 -5
- package/lib/azure-resourcegroup/test/ExampleAzureResourceGroup.js +0 -29
- package/lib/azure-storageaccount/test/ExampleAzureStorageAccount.d.ts +0 -5
- package/lib/azure-storageaccount/test/ExampleAzureStorageAccount.js +0 -102
- package/lib/azure-virtualmachine/test/ExampleAzureLinuxVirtualMachine.d.ts +0 -5
- package/lib/azure-virtualmachine/test/ExampleAzureLinuxVirtualMachine.js +0 -106
- package/lib/azure-virtualmachine/test/ExampleAzureWindowsVirtualMachine.d.ts +0 -5
- package/lib/azure-virtualmachine/test/ExampleAzureWindowsVirtualMachine.js +0 -102
- package/lib/azure-virtualmachinescaleset/test/ExampleAzureLinuxVirtualMachineScaleSet.d.ts +0 -5
- package/lib/azure-virtualmachinescaleset/test/ExampleAzureLinuxVirtualMachineScaleSet.js +0 -107
- package/lib/azure-virtualmachinescaleset/test/ExampleAzureWindowsVirtualMachineScaleSet.d.ts +0 -5
- package/lib/azure-virtualmachinescaleset/test/ExampleAzureWindowsVirtualMachineScaleSet.js +0 -103
- package/lib/azure-virtualnetwork/test/ExampleAzureVirtualNetwork.d.ts +0 -5
- package/lib/azure-virtualnetwork/test/ExampleAzureVirtualNetwork.js +0 -88
- package/lib/core-azure/test/AzureResource.spec.js +0 -19
- package/lib/core-azure/test/ExampleAzureResource.d.ts +0 -5
- package/lib/core-azure/test/ExampleAzureResource.js +0 -67
- package/tfsec.json +0 -4
- /package/lib/{core-azure/test/AzureResource.spec.d.ts → azure-actiongroup/test/AzureActionGroup.integ.d.ts} +0 -0
package/lib/testing/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseTestStack = void 0;
|
|
3
|
+
exports.cleanupCdkTfOutDirs = exports.AssertionReturn = exports.TerraformPlan = exports.TerraformApplyCheckAndDestroy = exports.TerraformApplyAndCheckIdempotency = exports.TerraformDestroy = exports.TerraformIdempotentCheck = exports.TerraformPlanExitCode = exports.TerraformApply = exports.execTerraformCommand = exports.BaseTestStack = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const path = require("path");
|
|
4
7
|
const cdktf = require("cdktf");
|
|
5
8
|
const cdktf_1 = require("cdktf");
|
|
6
9
|
class BaseTestStack extends cdktf_1.TerraformStack {
|
|
@@ -15,4 +18,234 @@ class BaseTestStack extends cdktf_1.TerraformStack {
|
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
20
|
exports.BaseTestStack = BaseTestStack;
|
|
18
|
-
|
|
21
|
+
function execTerraformCommand(command, opts, streamOutput) {
|
|
22
|
+
try {
|
|
23
|
+
if (streamOutput) {
|
|
24
|
+
(0, child_process_1.execSync)(command, { ...opts, stdio: "inherit" });
|
|
25
|
+
return { stdout: "", stderr: "", exitCode: 0 };
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const stdout = (0, child_process_1.execSync)(command, { ...opts, stdio: "pipe" }).toString();
|
|
29
|
+
return { stdout, stderr: "", exitCode: 0 };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const stdout = error.stdout ? error.stdout.toString() : "";
|
|
34
|
+
const stderr = error.stderr ? error.stderr.toString() : "";
|
|
35
|
+
return { stdout, stderr, exitCode: error.status || 1 };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.execTerraformCommand = execTerraformCommand;
|
|
39
|
+
function TerraformApply(stack, streamOutput = false) {
|
|
40
|
+
try {
|
|
41
|
+
const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
|
|
42
|
+
const stacks = Object.entries(manifest.stacks);
|
|
43
|
+
for (const [, stackDetails] of stacks) {
|
|
44
|
+
const opts = {
|
|
45
|
+
cwd: path.resolve(stack, stackDetails.workingDirectory),
|
|
46
|
+
env: process.env,
|
|
47
|
+
encoding: "utf-8",
|
|
48
|
+
};
|
|
49
|
+
const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
|
|
50
|
+
if (initResult.exitCode !== 0)
|
|
51
|
+
throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
|
|
52
|
+
const applyResult = execTerraformCommand(`terraform apply -auto-approve`, opts, streamOutput);
|
|
53
|
+
if (applyResult.exitCode !== 0) {
|
|
54
|
+
return {
|
|
55
|
+
stdout: applyResult.stdout,
|
|
56
|
+
stderr: applyResult.stderr,
|
|
57
|
+
error: new Error(`Terraform apply failed: ${applyResult.stdout} ${applyResult.stderr}`),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { stdout: "Terraform apply succeeded", stderr: "", error: null };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Error during Terraform init or apply:", error);
|
|
65
|
+
return { stdout: "", stderr: "", error };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.TerraformApply = TerraformApply;
|
|
69
|
+
function TerraformPlanExitCode(stack, streamOutput = false) {
|
|
70
|
+
try {
|
|
71
|
+
const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
|
|
72
|
+
const stacks = Object.entries(manifest.stacks);
|
|
73
|
+
for (const [, stackDetails] of stacks) {
|
|
74
|
+
const opts = {
|
|
75
|
+
cwd: path.resolve(stack, stackDetails.workingDirectory),
|
|
76
|
+
env: process.env,
|
|
77
|
+
encoding: "utf-8",
|
|
78
|
+
};
|
|
79
|
+
const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
|
|
80
|
+
if (initResult.exitCode !== 0)
|
|
81
|
+
throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
|
|
82
|
+
const planResult = execTerraformCommand(`terraform plan -input=false -lock=false -detailed-exitcode`, opts, streamOutput);
|
|
83
|
+
return {
|
|
84
|
+
stdout: planResult.stdout,
|
|
85
|
+
stderr: planResult.stderr,
|
|
86
|
+
exitCode: planResult.exitCode,
|
|
87
|
+
error: null,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
stdout: "Terraform plan succeeded",
|
|
92
|
+
stderr: "",
|
|
93
|
+
exitCode: 0,
|
|
94
|
+
error: null,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error("Error during Terraform init or plan:", error);
|
|
99
|
+
return { stdout: "", stderr: "", exitCode: 1, error };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.TerraformPlanExitCode = TerraformPlanExitCode;
|
|
103
|
+
function TerraformIdempotentCheck(stack) {
|
|
104
|
+
try {
|
|
105
|
+
const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
|
|
106
|
+
const stacks = Object.entries(manifest.stacks);
|
|
107
|
+
for (const [, stackDetails] of stacks) {
|
|
108
|
+
const opts = {
|
|
109
|
+
cwd: path.resolve(stack, stackDetails.workingDirectory),
|
|
110
|
+
env: process.env,
|
|
111
|
+
stdio: "pipe",
|
|
112
|
+
};
|
|
113
|
+
(0, child_process_1.execSync)(`terraform init`, opts);
|
|
114
|
+
let planOutput;
|
|
115
|
+
try {
|
|
116
|
+
planOutput = (0, child_process_1.execSync)(`terraform plan -input=false -detailed-exitcode`, opts).toString();
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
planOutput = error.stdout ? error.stdout.toString() : "";
|
|
120
|
+
}
|
|
121
|
+
if (planOutput.includes("No changes. Your infrastructure matches the configuration.")) {
|
|
122
|
+
return new AssertionReturn(`Expected subject to be idempotent with no changes`, true);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw new Error(`Plan resulted in changes:\n${planOutput}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return new AssertionReturn(`Expected subject to be idempotent with no changes`, true);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error("Error during Terraform init or plan:", error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.TerraformIdempotentCheck = TerraformIdempotentCheck;
|
|
136
|
+
function TerraformDestroy(stack, streamOutput = false) {
|
|
137
|
+
try {
|
|
138
|
+
const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
|
|
139
|
+
const stacks = Object.entries(manifest.stacks);
|
|
140
|
+
for (const [, stackDetails] of stacks) {
|
|
141
|
+
const opts = {
|
|
142
|
+
cwd: path.resolve(stack, stackDetails.workingDirectory),
|
|
143
|
+
env: process.env,
|
|
144
|
+
encoding: "utf-8",
|
|
145
|
+
};
|
|
146
|
+
const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
|
|
147
|
+
if (initResult.exitCode !== 0)
|
|
148
|
+
throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
|
|
149
|
+
const destroyResult = execTerraformCommand(`terraform destroy -auto-approve`, opts, streamOutput);
|
|
150
|
+
if (destroyResult.exitCode !== 0)
|
|
151
|
+
throw new Error(`Terraform destroy failed: ${destroyResult.stdout} ${destroyResult.stderr}`);
|
|
152
|
+
}
|
|
153
|
+
return new AssertionReturn(`Expected subject to destroy successfully`, true);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.error("Error during Terraform init or destroy:", error);
|
|
157
|
+
return new AssertionReturn(`Expected subject to destroy successfully`, false);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.TerraformDestroy = TerraformDestroy;
|
|
161
|
+
function TerraformApplyAndCheckIdempotency(stack, streamOutput = false) {
|
|
162
|
+
const applyResult = TerraformApply(stack, streamOutput);
|
|
163
|
+
if (applyResult.error) {
|
|
164
|
+
return new AssertionReturn(applyResult.error.message, false);
|
|
165
|
+
}
|
|
166
|
+
const planResult = TerraformPlanExitCode(stack, streamOutput);
|
|
167
|
+
if (planResult.error) {
|
|
168
|
+
return new AssertionReturn(planResult.error.message, false);
|
|
169
|
+
}
|
|
170
|
+
if (planResult.exitCode !== 0) {
|
|
171
|
+
return new AssertionReturn(`Terraform configuration not idempotent:\n${planResult.stdout}`, false);
|
|
172
|
+
}
|
|
173
|
+
return new AssertionReturn(`Terraform apply and idempotency check completed successfully`, true);
|
|
174
|
+
}
|
|
175
|
+
exports.TerraformApplyAndCheckIdempotency = TerraformApplyAndCheckIdempotency;
|
|
176
|
+
function TerraformApplyCheckAndDestroy(stack) {
|
|
177
|
+
try {
|
|
178
|
+
const applyAndCheckResult = TerraformApplyAndCheckIdempotency(stack);
|
|
179
|
+
if (!applyAndCheckResult.pass) {
|
|
180
|
+
throw new Error(applyAndCheckResult.message);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error("Error during Terraform apply and idempotency check:", error);
|
|
185
|
+
throw error; // Re-throw the error to ensure the test fails
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
try {
|
|
189
|
+
const destroyResult = TerraformDestroy(stack);
|
|
190
|
+
if (!destroyResult.pass) {
|
|
191
|
+
console.error("Error during Terraform destroy:", destroyResult.message);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (destroyError) {
|
|
195
|
+
console.error("Error during Terraform destroy:", destroyError);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.TerraformApplyCheckAndDestroy = TerraformApplyCheckAndDestroy;
|
|
200
|
+
function TerraformPlan(stack) {
|
|
201
|
+
try {
|
|
202
|
+
// Assuming the presence of a received variable pointing to the relevant directory
|
|
203
|
+
const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
|
|
204
|
+
const stacks = Object.entries(manifest.stacks);
|
|
205
|
+
stacks.forEach(([, stackDetails]) => {
|
|
206
|
+
const opts = {
|
|
207
|
+
cwd: path.resolve(stack, stackDetails.workingDirectory),
|
|
208
|
+
env: process.env,
|
|
209
|
+
stdio: "pipe",
|
|
210
|
+
};
|
|
211
|
+
(0, child_process_1.execSync)(`terraform init`, opts);
|
|
212
|
+
(0, child_process_1.execSync)(`terraform plan -input=false -lock=false`, opts);
|
|
213
|
+
});
|
|
214
|
+
return new AssertionReturn(`Expected subject not to plan successfully`, true);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error("Error during Terraform init or plan:", error);
|
|
218
|
+
throw error;
|
|
219
|
+
return new AssertionReturn("Expected subject to plan successfully, false", false);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.TerraformPlan = TerraformPlan;
|
|
223
|
+
class AssertionReturn {
|
|
224
|
+
/**
|
|
225
|
+
* Create an AssertionReturn
|
|
226
|
+
* @param message - String message containing information about the result of the assertion
|
|
227
|
+
* @param pass - Boolean pass denoting the success of the assertion
|
|
228
|
+
*/
|
|
229
|
+
constructor(message, pass) {
|
|
230
|
+
this.message = message;
|
|
231
|
+
this.pass = pass;
|
|
232
|
+
if (!pass) {
|
|
233
|
+
throw new Error(message);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.AssertionReturn = AssertionReturn;
|
|
238
|
+
// Define a cleanup function that can be exported and used in tests.
|
|
239
|
+
function cleanupCdkTfOutDirs() {
|
|
240
|
+
try {
|
|
241
|
+
(0, child_process_1.execSync)('find /tmp -name "cdktf.outdir.*" -type d -exec rm -rf {} +');
|
|
242
|
+
// console.log(
|
|
243
|
+
// "Cleanup of cdktf.outdir.* directories in /tmp was successful.",
|
|
244
|
+
// );
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
console.error("Error during cleanup:", error);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.cleanupCdkTfOutDirs = cleanupCdkTfOutDirs;
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBNEU7QUFDNUUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaUNBQXVDO0FBR3ZDLE1BQWEsYUFBYyxTQUFRLHNCQUFjO0lBRy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNyRCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFNO1lBQ2YsV0FBVyxFQUFFLDZDQUE2QztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBZEQsc0NBY0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsT0FBZSxFQUNmLElBQXVDLEVBQ3ZDLFlBQXFCO0lBRXJCLElBQUk7UUFDRixJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFBLHdCQUFRLEVBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVEsRUFBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFF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QUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUM7QUFURCxrREFTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jLCBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgY2xhc3MgQmFzZVRlc3RTdGFjayBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IG5hbWUgPSBuZXcgY2RrdGYuVGVycmFmb3JtVmFyaWFibGUodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZWZhdWx0OiBcInRlc3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlN5c3RlbSBuYW1lIHVzZWQgdG8gcmFuZG9taXplIHRoZSByZXNvdXJjZXNcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWUudmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IEV4ZWNTeW5jT3B0aW9uc1dpdGhTdHJpbmdFbmNvZGluZyxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuLFxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfSB7XG4gIHRyeSB7XG4gICAgaWYgKHN0cmVhbU91dHB1dCkge1xuICAgICAgZXhlY1N5bmMoY29tbWFuZCwgeyAuLi5vcHRzLCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gICAgICByZXR1cm4geyBzdGRvdXQ6IFwiXCIsIHN0ZGVycjogXCJcIiwgZXhpdENvZGU6IDAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gZXhlY1N5bmMoY29tbWFuZCwgeyAuLi5vcHRzLCBzdGRpbzogXCJwaXBlXCIgfSkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiBcIlwiLCBleGl0Q29kZTogMCB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGVycm9yLnN0ZG91dCA/IGVycm9yLnN0ZG91dC50b1N0cmluZygpIDogXCJcIjtcbiAgICBjb25zdCBzdGRlcnIgPSBlcnJvci5zdGRlcnIgPyBlcnJvci5zdGRlcnIudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBlcnJvci5zdGF0dXMgfHwgMSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1BcHBseShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXJyb3I6IGFueSB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHN0YWNrLCBcIm1hbmlmZXN0Lmpzb25cIiksIFwidXRmOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YWNrcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LnN0YWNrcyk7XG5cbiAgICBmb3IgKGNvbnN0IFssIHN0YWNrRGV0YWlsc10gb2Ygc3RhY2tzKSB7XG4gICAgICBjb25zdCBvcHRzOiBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHN0YWNrLCAoc3RhY2tEZXRhaWxzIGFzIGFueSkud29ya2luZ0RpcmVjdG9yeSksXG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gZXhlY1RlcnJhZm9ybUNvbW1hbmQoXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdGAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICBpZiAoaW5pdFJlc3VsdC5leGl0Q29kZSAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZXJyYWZvcm0gaW5pdCBmYWlsZWQ6ICR7aW5pdFJlc3VsdC5zdGRvdXR9ICR7aW5pdFJlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgYXBwbHlSZXN1bHQgPSBleGVjVGVycmFmb3JtQ29tbWFuZChcbiAgICAgICAgYHRlcnJhZm9ybSBhcHBseSAtYXV0by1hcHByb3ZlYCxcbiAgICAgICAgb3B0cyxcbiAgICAgICAgc3RyZWFtT3V0cHV0LFxuICAgICAgKTtcbiAgICAgIGlmIChhcHBseVJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0ZG91dDogYXBwbHlSZXN1bHQuc3Rkb3V0LFxuICAgICAgICAgIHN0ZGVycjogYXBwbHlSZXN1bHQuc3RkZXJyLFxuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGVycmFmb3JtIGFwcGx5IGZhaWxlZDogJHthcHBseVJlc3VsdC5zdGRvdXR9ICR7YXBwbHlSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGRvdXQ6IFwiVGVycmFmb3JtIGFwcGx5IHN1Y2NlZWRlZFwiLCBzdGRlcnI6IFwiXCIsIGVycm9yOiBudWxsIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIGFwcGx5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgc3Rkb3V0OiBcIlwiLCBzdGRlcnI6IFwiXCIsIGVycm9yIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybVBsYW5FeGl0Q29kZShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXhpdENvZGU6IG51bWJlcjsgZXJyb3I6IGFueSB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHN0YWNrLCBcIm1hbmlmZXN0Lmpzb25cIiksIFwidXRmOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YWNrcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LnN0YWNrcyk7XG5cbiAgICBmb3IgKGNvbnN0IFssIHN0YWNrRGV0YWlsc10gb2Ygc3RhY2tzKSB7XG4gICAgICBjb25zdCBvcHRzOiBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHN0YWNrLCAoc3RhY2tEZXRhaWxzIGFzIGFueSkud29ya2luZ0RpcmVjdG9yeSksXG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gZXhlY1RlcnJhZm9ybUNvbW1hbmQoXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdGAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICBpZiAoaW5pdFJlc3VsdC5leGl0Q29kZSAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZXJyYWZvcm0gaW5pdCBmYWlsZWQ6ICR7aW5pdFJlc3VsdC5zdGRvdXR9ICR7aW5pdFJlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgcGxhblJlc3VsdCA9IGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICAgICAgICBgdGVycmFmb3JtIHBsYW4gLWlucHV0PWZhbHNlIC1sb2NrPWZhbHNlIC1kZXRhaWxlZC1leGl0Y29kZWAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGRvdXQ6IHBsYW5SZXN1bHQuc3Rkb3V0LFxuICAgICAgICBzdGRlcnI6IHBsYW5SZXN1bHQuc3RkZXJyLFxuICAgICAgICBleGl0Q29kZTogcGxhblJlc3VsdC5leGl0Q29kZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGRvdXQ6IFwiVGVycmFmb3JtIHBsYW4gc3VjY2VlZGVkXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBleGl0Q29kZTogMCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIHBsYW46XCIsIGVycm9yKTtcbiAgICByZXR1cm4geyBzdGRvdXQ6IFwiXCIsIHN0ZGVycjogXCJcIiwgZXhpdENvZGU6IDEsIGVycm9yIH07XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1JZGVtcG90ZW50Q2hlY2soc3RhY2s6IGFueSk6IEFzc2VydGlvblJldHVybiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuXG4gICAgZm9yIChjb25zdCBbLCBzdGFja0RldGFpbHNdIG9mIHN0YWNrcykge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgY3dkOiBwYXRoLnJlc29sdmUoc3RhY2ssIChzdGFja0RldGFpbHMgYXMgYW55KS53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIGV4ZWNTeW5jKGB0ZXJyYWZvcm0gaW5pdGAsIG9wdHMpO1xuXG4gICAgICBsZXQgcGxhbk91dHB1dDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGxhbk91dHB1dCA9IGV4ZWNTeW5jKFxuICAgICAgICAgIGB0ZXJyYWZvcm0gcGxhbiAtaW5wdXQ9ZmFsc2UgLWRldGFpbGVkLWV4aXRjb2RlYCxcbiAgICAgICAgICBvcHRzLFxuICAgICAgICApLnRvU3RyaW5nKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBsYW5PdXRwdXQgPSBlcnJvci5zdGRvdXQgPyBlcnJvci5zdGRvdXQudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGxhbk91dHB1dC5pbmNsdWRlcyhcbiAgICAgICAgICBcIk5vIGNoYW5nZXMuIFlvdXIgaW5mcmFzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgY29uZmlndXJhdGlvbi5cIixcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGlkZW1wb3RlbnQgd2l0aCBubyBjaGFuZ2VzYCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGFuIHJlc3VsdGVkIGluIGNoYW5nZXM6XFxuJHtwbGFuT3V0cHV0fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgYEV4cGVjdGVkIHN1YmplY3QgdG8gYmUgaWRlbXBvdGVudCB3aXRoIG5vIGNoYW5nZXNgLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGluaXQgb3IgcGxhbjpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1EZXN0cm95KFxuICBzdGFjazogYW55LFxuICBzdHJlYW1PdXRwdXQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IEFzc2VydGlvblJldHVybiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuXG4gICAgZm9yIChjb25zdCBbLCBzdGFja0RldGFpbHNdIG9mIHN0YWNrcykge1xuICAgICAgY29uc3Qgb3B0czogRXhlY1N5bmNPcHRpb25zV2l0aFN0cmluZ0VuY29kaW5nID0ge1xuICAgICAgICBjd2Q6IHBhdGgucmVzb2x2ZShzdGFjaywgKHN0YWNrRGV0YWlscyBhcyBhbnkpLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICAgICAgICBgdGVycmFmb3JtIGluaXRgLFxuICAgICAgICBvcHRzLFxuICAgICAgICBzdHJlYW1PdXRwdXQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRSZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGluaXQgZmFpbGVkOiAke2luaXRSZXN1bHQuc3Rkb3V0fSAke2luaXRSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlc3Ryb3lSZXN1bHQgPSBleGVjVGVycmFmb3JtQ29tbWFuZChcbiAgICAgICAgYHRlcnJhZm9ybSBkZXN0cm95IC1hdXRvLWFwcHJvdmVgLFxuICAgICAgICBvcHRzLFxuICAgICAgICBzdHJlYW1PdXRwdXQsXG4gICAgICApO1xuICAgICAgaWYgKGRlc3Ryb3lSZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGRlc3Ryb3kgZmFpbGVkOiAke2Rlc3Ryb3lSZXN1bHQuc3Rkb3V0fSAke2Rlc3Ryb3lSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICBgRXhwZWN0ZWQgc3ViamVjdCB0byBkZXN0cm95IHN1Y2Nlc3NmdWxseWAsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIGRlc3Ryb3k6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGRlc3Ryb3kgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybUFwcGx5QW5kQ2hlY2tJZGVtcG90ZW5jeShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiBBc3NlcnRpb25SZXR1cm4ge1xuICBjb25zdCBhcHBseVJlc3VsdCA9IFRlcnJhZm9ybUFwcGx5KHN0YWNrLCBzdHJlYW1PdXRwdXQpO1xuICBpZiAoYXBwbHlSZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihhcHBseVJlc3VsdC5lcnJvci5tZXNzYWdlLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBwbGFuUmVzdWx0ID0gVGVycmFmb3JtUGxhbkV4aXRDb2RlKHN0YWNrLCBzdHJlYW1PdXRwdXQpO1xuICBpZiAocGxhblJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKHBsYW5SZXN1bHQuZXJyb3IubWVzc2FnZSwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHBsYW5SZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBUZXJyYWZvcm0gY29uZmlndXJhdGlvbiBub3QgaWRlbXBvdGVudDpcXG4ke3BsYW5SZXN1bHQuc3Rkb3V0fWAsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgYFRlcnJhZm9ybSBhcHBseSBhbmQgaWRlbXBvdGVuY3kgY2hlY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWAsXG4gICAgdHJ1ZSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95KHN0YWNrOiBhbnkpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcHBseUFuZENoZWNrUmVzdWx0ID0gVGVycmFmb3JtQXBwbHlBbmRDaGVja0lkZW1wb3RlbmN5KHN0YWNrKTtcbiAgICBpZiAoIWFwcGx5QW5kQ2hlY2tSZXN1bHQucGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGFwcGx5QW5kQ2hlY2tSZXN1bHQubWVzc2FnZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGFwcGx5IGFuZCBpZGVtcG90ZW5jeSBjaGVjazpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0aGUgZXJyb3IgdG8gZW5zdXJlIHRoZSB0ZXN0IGZhaWxzXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc3Ryb3lSZXN1bHQgPSBUZXJyYWZvcm1EZXN0cm95KHN0YWNrKTtcbiAgICAgIGlmICghZGVzdHJveVJlc3VsdC5wYXNzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGRlc3Ryb3k6XCIsIGRlc3Ryb3lSZXN1bHQubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZGVzdHJveUVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBkZXN0cm95OlwiLCBkZXN0cm95RXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVGVycmFmb3JtUGxhbihzdGFjazogYW55KTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyB0aGUgcHJlc2VuY2Ugb2YgYSByZWNlaXZlZCB2YXJpYWJsZSBwb2ludGluZyB0byB0aGUgcmVsZXZhbnQgZGlyZWN0b3J5XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuICAgIHN0YWNrcy5mb3JFYWNoKChbLCBzdGFja0RldGFpbHNdKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICBjd2Q6IHBhdGgucmVzb2x2ZShzdGFjaywgKHN0YWNrRGV0YWlscyBhcyBhbnkpLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICB9IGFzIGFueTtcbiAgICAgIGV4ZWNTeW5jKGB0ZXJyYWZvcm0gaW5pdGAsIG9wdHMpO1xuICAgICAgZXhlY1N5bmMoYHRlcnJhZm9ybSBwbGFuIC1pbnB1dD1mYWxzZSAtbG9jaz1mYWxzZWAsIG9wdHMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICBgRXhwZWN0ZWQgc3ViamVjdCBub3QgdG8gcGxhbiBzdWNjZXNzZnVsbHlgLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGluaXQgb3IgcGxhbjpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgXCJFeHBlY3RlZCBzdWJqZWN0IHRvIHBsYW4gc3VjY2Vzc2Z1bGx5LCBmYWxzZVwiLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzZXJ0aW9uUmV0dXJuIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBc3NlcnRpb25SZXR1cm5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBTdHJpbmcgbWVzc2FnZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXN1bHQgb2YgdGhlIGFzc2VydGlvblxuICAgKiBAcGFyYW0gcGFzcyAtIEJvb2xlYW4gcGFzcyBkZW5vdGluZyB0aGUgc3VjY2VzcyBvZiB0aGUgYXNzZXJ0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBwYXNzOiBib29sZWFuLFxuICApIHtcbiAgICBpZiAoIXBhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRGVmaW5lIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleHBvcnRlZCBhbmQgdXNlZCBpbiB0ZXN0cy5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwQ2RrVGZPdXREaXJzKCkge1xuICB0cnkge1xuICAgIGV4ZWNTeW5jKCdmaW5kIC90bXAgLW5hbWUgXCJjZGt0Zi5vdXRkaXIuKlwiIC10eXBlIGQgLWV4ZWMgcm0gLXJmIHt9ICsnKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIFwiQ2xlYW51cCBvZiBjZGt0Zi5vdXRkaXIuKiBkaXJlY3RvcmllcyBpbiAvdG1wIHdhcyBzdWNjZXNzZnVsLlwiLFxuICAgIC8vICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBjbGVhbnVwOlwiLCBlcnJvcik7XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -25,13 +25,15 @@
|
|
|
25
25
|
"post-upgrade": "npx projen post-upgrade",
|
|
26
26
|
"pre-compile": "npx projen pre-compile",
|
|
27
27
|
"release": "npx projen release",
|
|
28
|
-
"test": "
|
|
28
|
+
"test": "jest --testMatch '**/*.spec.ts'",
|
|
29
29
|
"test:update": "npx projen test:update",
|
|
30
30
|
"test:watch": "npx projen test:watch",
|
|
31
31
|
"unbump": "npx projen unbump",
|
|
32
32
|
"upgrade": "npx projen upgrade",
|
|
33
33
|
"watch": "npx projen watch",
|
|
34
34
|
"projen": "npx projen",
|
|
35
|
+
"integration": "STREAM_OUTPUT=true jest --testMatch '**/*.integ.ts'",
|
|
36
|
+
"integration:nostream": "STREAM_OUTPUT=false jest --maxWorkers=12 --testMatch '**/*.integ.ts'",
|
|
35
37
|
"generate-index": "node ./scripts/generate-index.js"
|
|
36
38
|
},
|
|
37
39
|
"author": {
|
|
@@ -101,11 +103,11 @@
|
|
|
101
103
|
"publishConfig": {
|
|
102
104
|
"access": "public"
|
|
103
105
|
},
|
|
104
|
-
"version": "0.0.3-pre.
|
|
106
|
+
"version": "0.0.3-pre.12",
|
|
105
107
|
"jest": {
|
|
106
108
|
"testMatch": [
|
|
107
109
|
"<rootDir>/src/**/__tests__/**/*.ts?(x)",
|
|
108
|
-
"<rootDir>/@(|src)/**/*(*.)@(spec|test).ts?(x)"
|
|
110
|
+
"<rootDir>/@(|src)/**/*(*.)@(spec|test|integ).ts?(x)"
|
|
109
111
|
],
|
|
110
112
|
"clearMocks": true,
|
|
111
113
|
"collectCoverage": true,
|
|
@@ -157,7 +159,7 @@
|
|
|
157
159
|
"java": {
|
|
158
160
|
"package": "com.microsoft.terraformcdkconstructs",
|
|
159
161
|
"maven": {
|
|
160
|
-
"groupId": "com.microsoft",
|
|
162
|
+
"groupId": "com.microsoft.terraformcdkconstructs",
|
|
161
163
|
"artifactId": "cdktf-azure-constructs"
|
|
162
164
|
}
|
|
163
165
|
},
|
package/cdktf.out/manifest.json
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "0.17.3",
|
|
3
|
-
"stacks": {
|
|
4
|
-
"testExampleAzureResource": {
|
|
5
|
-
"name": "testExampleAzureResource",
|
|
6
|
-
"constructPath": "testExampleAzureResource",
|
|
7
|
-
"workingDirectory": "stacks/testExampleAzureResource",
|
|
8
|
-
"synthesizedStackPath": "stacks/testExampleAzureResource/cdk.tf.json",
|
|
9
|
-
"annotations": [],
|
|
10
|
-
"dependencies": []
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"//": {
|
|
3
|
-
"metadata": {
|
|
4
|
-
"backend": "local",
|
|
5
|
-
"stackName": "testAzureActionGroup",
|
|
6
|
-
"version": "0.17.3"
|
|
7
|
-
},
|
|
8
|
-
"outputs": {
|
|
9
|
-
"testAzureActionGroup": {
|
|
10
|
-
"id": "id",
|
|
11
|
-
"testAzureActionGroup": {
|
|
12
|
-
"id": "id"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"output": {
|
|
18
|
-
"id": {
|
|
19
|
-
"value": "${azurerm_monitor_action_group.testAzureActionGroup_actiongroup_73C559FB.id}"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"provider": {
|
|
23
|
-
"azurerm": [
|
|
24
|
-
{
|
|
25
|
-
"features": {
|
|
26
|
-
"resource_group": {
|
|
27
|
-
"prevent_deletion_if_contains_resources": false
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
},
|
|
33
|
-
"resource": {
|
|
34
|
-
"azurerm_monitor_action_group": {
|
|
35
|
-
"testAzureActionGroup_actiongroup_73C559FB": {
|
|
36
|
-
"//": {
|
|
37
|
-
"metadata": {
|
|
38
|
-
"path": "testAzureActionGroup/testAzureActionGroup/actiongroup",
|
|
39
|
-
"uniqueId": "testAzureActionGroup_actiongroup_73C559FB"
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
"email_receiver": [
|
|
43
|
-
{
|
|
44
|
-
"email_address": "test1@email.com",
|
|
45
|
-
"name": "testemail1",
|
|
46
|
-
"use_common_alert_schema": true
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"email_address": "test2@email.com",
|
|
50
|
-
"name": "testemail2",
|
|
51
|
-
"use_common_alert_schema": false
|
|
52
|
-
}
|
|
53
|
-
],
|
|
54
|
-
"enabled": true,
|
|
55
|
-
"location": "global",
|
|
56
|
-
"name": "testactiongroup",
|
|
57
|
-
"resource_group_name": "${azurerm_resource_group.rg.name}",
|
|
58
|
-
"short_name": "testshortn",
|
|
59
|
-
"tags": {
|
|
60
|
-
},
|
|
61
|
-
"webhook_receiver": [
|
|
62
|
-
{
|
|
63
|
-
"name": "testwebhook1",
|
|
64
|
-
"service_uri": "https://www.example1.com",
|
|
65
|
-
"use_common_alert_schema": true
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"name": "testwebhook2",
|
|
69
|
-
"service_uri": "https://www.example2.com",
|
|
70
|
-
"use_common_alert_schema": false
|
|
71
|
-
}
|
|
72
|
-
]
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
"azurerm_resource_group": {
|
|
76
|
-
"rg": {
|
|
77
|
-
"//": {
|
|
78
|
-
"metadata": {
|
|
79
|
-
"path": "testAzureActionGroup/rg",
|
|
80
|
-
"uniqueId": "rg"
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
"location": "eastus",
|
|
84
|
-
"name": "rg-${var.name}",
|
|
85
|
-
"tags": {
|
|
86
|
-
"test": "test"
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
"terraform": {
|
|
92
|
-
"backend": {
|
|
93
|
-
"local": {
|
|
94
|
-
"path": "/home/runner/work/terraform-cdk-constructs/terraform-cdk-constructs/terraform.testAzureActionGroup.tfstate"
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
"required_providers": {
|
|
98
|
-
"azurerm": {
|
|
99
|
-
"source": "azurerm",
|
|
100
|
-
"version": "3.70.0"
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
"variable": {
|
|
105
|
-
"name": {
|
|
106
|
-
"default": "test",
|
|
107
|
-
"description": "System name used to randomize the resources",
|
|
108
|
-
"type": "string"
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|