@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.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/.jsii +54846 -26661
- package/API.md +72091 -23784
- package/lib/azure-actiongroup/index.d.ts +0 -10
- package/lib/azure-actiongroup/index.js +1 -11
- package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
- package/lib/azure-actiongroup/lib/action-group.js +6 -32
- package/lib/azure-actiongroup/lib/index.d.ts +1 -4
- package/lib/azure-actiongroup/lib/index.js +2 -5
- package/lib/azure-activitylogalert/index.d.ts +0 -10
- package/lib/azure-activitylogalert/index.js +1 -11
- package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
- package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
- package/lib/azure-activitylogalert/lib/index.js +2 -5
- package/lib/azure-aks/index.d.ts +0 -8
- package/lib/azure-aks/index.js +1 -11
- package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
- package/lib/azure-aks/lib/aks-cluster.js +13 -36
- package/lib/azure-aks/lib/index.d.ts +1 -10
- package/lib/azure-aks/lib/index.js +2 -21
- package/lib/azure-diagnosticsettings/index.d.ts +0 -6
- package/lib/azure-diagnosticsettings/index.js +1 -7
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
- package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
- package/lib/azure-diagnosticsettings/lib/index.js +2 -8
- package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
- package/lib/azure-dnsforwardingruleset/index.js +18 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
- package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
- package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
- package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
- package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
- package/lib/azure-dnsresolver/index.d.ts +1 -0
- package/lib/azure-dnsresolver/index.js +18 -0
- package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
- package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
- package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
- package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
- package/lib/azure-dnsresolver/lib/index.js +23 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
- package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
- package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
- package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
- package/lib/azure-dnszone/index.d.ts +1 -0
- package/lib/azure-dnszone/index.js +18 -0
- package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
- package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
- package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
- package/lib/azure-dnszone/lib/dns-zone.js +228 -0
- package/lib/azure-dnszone/lib/index.d.ts +2 -0
- package/lib/azure-dnszone/lib/index.js +19 -0
- package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
- package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
- package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
- package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
- package/lib/azure-metricalert/index.d.ts +0 -10
- package/lib/azure-metricalert/index.js +1 -11
- package/lib/azure-metricalert/lib/index.d.ts +1 -4
- package/lib/azure-metricalert/lib/index.js +2 -5
- package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
- package/lib/azure-metricalert/lib/metric-alert.js +6 -32
- package/lib/azure-networkinterface/index.d.ts +0 -3
- package/lib/azure-networkinterface/index.js +1 -4
- package/lib/azure-networkinterface/lib/index.d.ts +1 -5
- package/lib/azure-networkinterface/lib/index.js +2 -5
- package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
- package/lib/azure-networkinterface/lib/network-interface.js +14 -29
- package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
- package/lib/azure-networksecuritygroup/index.d.ts +0 -5
- package/lib/azure-networksecuritygroup/index.js +1 -6
- package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
- package/lib/azure-networksecuritygroup/lib/index.js +17 -14
- package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
- package/lib/azure-policyassignment/index.d.ts +1 -0
- package/lib/azure-policyassignment/index.js +18 -0
- package/lib/azure-policyassignment/lib/index.d.ts +2 -0
- package/lib/azure-policyassignment/lib/index.js +19 -0
- package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
- package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
- package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
- package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
- package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
- package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
- package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
- package/lib/azure-policydefinition/index.d.ts +1 -0
- package/lib/azure-policydefinition/index.js +18 -0
- package/lib/azure-policydefinition/lib/index.d.ts +2 -0
- package/lib/azure-policydefinition/lib/index.js +19 -0
- package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
- package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
- package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
- package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
- package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
- package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
- package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
- package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
- package/lib/azure-privatednszone/index.d.ts +1 -0
- package/lib/azure-privatednszone/index.js +18 -0
- package/lib/azure-privatednszone/lib/index.d.ts +2 -0
- package/lib/azure-privatednszone/lib/index.js +19 -0
- package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
- package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
- package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
- package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
- package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
- package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
- package/lib/azure-privatednszonelink/index.d.ts +1 -0
- package/lib/azure-privatednszonelink/index.js +18 -0
- package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
- package/lib/azure-privatednszonelink/lib/index.js +19 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
- package/lib/azure-publicipaddress/index.d.ts +0 -5
- package/lib/azure-publicipaddress/index.js +1 -6
- package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
- package/lib/azure-publicipaddress/lib/index.js +17 -17
- package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
- package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
- package/lib/azure-resourcegroup/index.d.ts +0 -37
- package/lib/azure-resourcegroup/index.js +1 -39
- package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
- package/lib/azure-resourcegroup/lib/index.js +2 -43
- package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
- package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
- package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
- package/lib/azure-roleassignment/index.d.ts +1 -0
- package/lib/azure-roleassignment/index.js +18 -0
- package/lib/azure-roleassignment/lib/index.d.ts +2 -0
- package/lib/azure-roleassignment/lib/index.js +19 -0
- package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
- package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
- package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
- package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
- package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
- package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
- package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
- package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
- package/lib/azure-roledefinition/index.d.ts +1 -0
- package/lib/azure-roledefinition/index.js +18 -0
- package/lib/azure-roledefinition/lib/index.d.ts +2 -0
- package/lib/azure-roledefinition/lib/index.js +19 -0
- package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
- package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
- package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
- package/lib/azure-roledefinition/lib/role-definition.js +192 -0
- package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
- package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
- package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
- package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
- package/lib/azure-storageaccount/index.d.ts +0 -19
- package/lib/azure-storageaccount/index.js +1 -20
- package/lib/azure-storageaccount/lib/index.d.ts +1 -7
- package/lib/azure-storageaccount/lib/index.js +2 -8
- package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
- package/lib/azure-storageaccount/lib/storage-account.js +15 -29
- package/lib/azure-subnet/index.d.ts +0 -3
- package/lib/azure-subnet/index.js +1 -4
- package/lib/azure-subnet/lib/index.d.ts +1 -4
- package/lib/azure-subnet/lib/index.js +2 -5
- package/lib/azure-subnet/lib/subnet.d.ts +3 -14
- package/lib/azure-subnet/lib/subnet.js +28 -47
- package/lib/azure-subnet/test/subnet.integ.js +19 -7
- package/lib/azure-subnet/test/subnet.spec.js +1 -2
- package/lib/azure-virtualmachine/index.d.ts +0 -6
- package/lib/azure-virtualmachine/index.js +1 -7
- package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
- package/lib/azure-virtualmachine/lib/index.js +2 -21
- package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
- package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
- package/lib/azure-virtualnetwork/index.d.ts +0 -9
- package/lib/azure-virtualnetwork/index.js +1 -11
- package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
- package/lib/azure-virtualnetwork/lib/index.js +17 -20
- package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
- package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
- package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
- package/lib/azure-virtualnetworkmanager/index.js +18 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
- package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
- package/lib/azure-vmss/index.d.ts +0 -5
- package/lib/azure-vmss/index.js +1 -6
- package/lib/azure-vmss/lib/index.d.ts +0 -7
- package/lib/azure-vmss/lib/index.js +1 -21
- package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
- package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
- package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
- package/lib/core-azure/lib/azapi/azapi-resource.d.ts +178 -26
- package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
- package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +5 -3
- package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
- package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
- package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
- package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
- package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
- package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
- package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
- package/lib/core-azure/lib/index.d.ts +2 -2
- package/lib/core-azure/lib/index.js +5 -5
- package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
- package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
- package/lib/index.d.ts +19 -0
- package/lib/index.js +21 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.d.ts +1 -0
- package/lib/testing/lib/cleanup.js +19 -12
- package/lib/testing/lib/metadata.js +19 -16
- package/package.json +1 -1
- package/scripts/cleanup-test-resources.ts +22 -4
- package/scripts/generate-index.js +25 -8
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for the AzapiResource tag management functionality
|
|
4
|
+
*
|
|
5
|
+
* These tests verify that the immutability pattern for tags works correctly:
|
|
6
|
+
* - Tags from props are stored separately from the readonly props
|
|
7
|
+
* - Tags added via addTag() are combined with props tags
|
|
8
|
+
* - The tags getter returns all tags (props + added)
|
|
9
|
+
* - The allTags() method used in createResourceBody includes all tags
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const cdktf_1 = require("cdktf");
|
|
13
|
+
const cdktf = require("cdktf");
|
|
14
|
+
const resource_group_1 = require("../../../azure-resourcegroup/lib/resource-group");
|
|
15
|
+
describe("AzapiResource - Tag Management", () => {
|
|
16
|
+
let app;
|
|
17
|
+
let stack;
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
app = cdktf_1.Testing.app();
|
|
20
|
+
stack = new cdktf.TerraformStack(app, "TestStack");
|
|
21
|
+
});
|
|
22
|
+
describe("Tag Immutability", () => {
|
|
23
|
+
it("should store tags separately from readonly props", () => {
|
|
24
|
+
const props = {
|
|
25
|
+
name: "test-rg",
|
|
26
|
+
location: "eastus",
|
|
27
|
+
tags: { initial: "value" },
|
|
28
|
+
};
|
|
29
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", props);
|
|
30
|
+
// Original props should remain unchanged
|
|
31
|
+
expect(props.tags).toEqual({ initial: "value" });
|
|
32
|
+
// Tags should be accessible via getter
|
|
33
|
+
expect(rg.tags).toEqual({ initial: "value" });
|
|
34
|
+
});
|
|
35
|
+
it("should not mutate props when adding tags", () => {
|
|
36
|
+
const props = {
|
|
37
|
+
name: "test-rg",
|
|
38
|
+
location: "eastus",
|
|
39
|
+
tags: { initial: "value" },
|
|
40
|
+
};
|
|
41
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", props);
|
|
42
|
+
// Add a tag
|
|
43
|
+
rg.addTag("added", "dynamically");
|
|
44
|
+
// Original props should remain unchanged
|
|
45
|
+
expect(props.tags).toEqual({ initial: "value" });
|
|
46
|
+
expect(props.tags.added).toBeUndefined();
|
|
47
|
+
// Tags getter should include both
|
|
48
|
+
expect(rg.tags).toEqual({
|
|
49
|
+
initial: "value",
|
|
50
|
+
added: "dynamically",
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it("should handle tags when no initial tags are provided", () => {
|
|
54
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
55
|
+
name: "test-rg",
|
|
56
|
+
location: "eastus",
|
|
57
|
+
});
|
|
58
|
+
// Should start with empty tags
|
|
59
|
+
expect(rg.tags).toEqual({});
|
|
60
|
+
// Add tags
|
|
61
|
+
rg.addTag("tag1", "value1");
|
|
62
|
+
rg.addTag("tag2", "value2");
|
|
63
|
+
// Should have the added tags
|
|
64
|
+
expect(rg.tags).toEqual({
|
|
65
|
+
tag1: "value1",
|
|
66
|
+
tag2: "value2",
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("Tag Combination", () => {
|
|
71
|
+
it("should combine props tags with dynamically added tags", () => {
|
|
72
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
73
|
+
name: "test-rg",
|
|
74
|
+
location: "eastus",
|
|
75
|
+
tags: {
|
|
76
|
+
environment: "test",
|
|
77
|
+
project: "cdktf",
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// Add more tags
|
|
81
|
+
rg.addTag("owner", "team@example.com");
|
|
82
|
+
rg.addTag("cost-center", "engineering");
|
|
83
|
+
// All tags should be accessible
|
|
84
|
+
expect(rg.tags).toEqual({
|
|
85
|
+
environment: "test",
|
|
86
|
+
project: "cdktf",
|
|
87
|
+
owner: "team@example.com",
|
|
88
|
+
"cost-center": "engineering",
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
it("should allow overwriting tags via addTag", () => {
|
|
92
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
93
|
+
name: "test-rg",
|
|
94
|
+
location: "eastus",
|
|
95
|
+
tags: { environment: "dev" },
|
|
96
|
+
});
|
|
97
|
+
// Overwrite existing tag
|
|
98
|
+
rg.addTag("environment", "production");
|
|
99
|
+
// Should have the new value
|
|
100
|
+
expect(rg.tags.environment).toBe("production");
|
|
101
|
+
});
|
|
102
|
+
it("should return a copy from tags getter to maintain immutability", () => {
|
|
103
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
104
|
+
name: "test-rg",
|
|
105
|
+
location: "eastus",
|
|
106
|
+
tags: { initial: "value" },
|
|
107
|
+
});
|
|
108
|
+
// Get tags reference
|
|
109
|
+
const tags1 = rg.tags;
|
|
110
|
+
const tags2 = rg.tags;
|
|
111
|
+
// Should be different objects (copies)
|
|
112
|
+
expect(tags1).not.toBe(tags2);
|
|
113
|
+
// But with same content
|
|
114
|
+
expect(tags1).toEqual(tags2);
|
|
115
|
+
// Modifying the returned object should not affect the resource
|
|
116
|
+
tags1.modified = "externally";
|
|
117
|
+
expect(rg.tags.modified).toBeUndefined();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("Multiple Tag Operations", () => {
|
|
121
|
+
it("should handle multiple addTag calls", () => {
|
|
122
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
123
|
+
name: "test-rg",
|
|
124
|
+
location: "eastus",
|
|
125
|
+
});
|
|
126
|
+
// Add multiple tags
|
|
127
|
+
for (let i = 0; i < 10; i++) {
|
|
128
|
+
rg.addTag(`tag${i}`, `value${i}`);
|
|
129
|
+
}
|
|
130
|
+
// All tags should be present
|
|
131
|
+
const tags = rg.tags;
|
|
132
|
+
expect(Object.keys(tags)).toHaveLength(10);
|
|
133
|
+
for (let i = 0; i < 10; i++) {
|
|
134
|
+
expect(tags[`tag${i}`]).toBe(`value${i}`);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
it("should handle special characters in tag keys and values", () => {
|
|
138
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
139
|
+
name: "test-rg",
|
|
140
|
+
location: "eastus",
|
|
141
|
+
});
|
|
142
|
+
rg.addTag("tag-with-dash", "value-with-dash");
|
|
143
|
+
rg.addTag("tag:with:colon", "value:with:colon");
|
|
144
|
+
rg.addTag("tag.with.dot", "value.with.dot");
|
|
145
|
+
const tags = rg.tags;
|
|
146
|
+
expect(tags["tag-with-dash"]).toBe("value-with-dash");
|
|
147
|
+
expect(tags["tag:with:colon"]).toBe("value:with:colon");
|
|
148
|
+
expect(tags["tag.with.dot"]).toBe("value.with.dot");
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("Resource Body Integration", () => {
|
|
152
|
+
it("should include all tags in synthesized Terraform configuration when added before synthesis", () => {
|
|
153
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
154
|
+
name: "test-rg",
|
|
155
|
+
location: "eastus",
|
|
156
|
+
tags: { initial: "tag" },
|
|
157
|
+
});
|
|
158
|
+
// Tags are set during construction via props
|
|
159
|
+
// Verify they're accessible
|
|
160
|
+
expect(rg.tags).toEqual({ initial: "tag" });
|
|
161
|
+
// Synthesize the stack
|
|
162
|
+
const synthesized = cdktf_1.Testing.synth(stack);
|
|
163
|
+
const stackConfig = JSON.parse(synthesized);
|
|
164
|
+
// The azapi_resource should exist
|
|
165
|
+
expect(stackConfig.resource).toBeDefined();
|
|
166
|
+
expect(stackConfig.resource.azapi_resource).toBeDefined();
|
|
167
|
+
// Find the resource (name may vary based on construct ID generation)
|
|
168
|
+
const resources = Object.values(stackConfig.resource.azapi_resource);
|
|
169
|
+
expect(resources.length).toBeGreaterThan(0);
|
|
170
|
+
const resource = resources[0];
|
|
171
|
+
// Tags should be at the resource level, not in the body
|
|
172
|
+
// The createAzapiResource method extracts tags from body and places them at top level
|
|
173
|
+
expect(resource.tags).toEqual({
|
|
174
|
+
initial: "tag",
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
it("should make tags added via addTag accessible via tags getter", () => {
|
|
178
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
179
|
+
name: "test-rg",
|
|
180
|
+
location: "eastus",
|
|
181
|
+
tags: { initial: "tag" },
|
|
182
|
+
});
|
|
183
|
+
// Add tag after construction
|
|
184
|
+
rg.addTag("added", "later");
|
|
185
|
+
// Verify tags are accessible via getter
|
|
186
|
+
expect(rg.tags).toEqual({
|
|
187
|
+
initial: "tag",
|
|
188
|
+
added: "later",
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe("JSII Compliance", () => {
|
|
193
|
+
it("should have JSII-compliant addTag method", () => {
|
|
194
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
195
|
+
name: "test-rg",
|
|
196
|
+
location: "eastus",
|
|
197
|
+
});
|
|
198
|
+
// Should be a function
|
|
199
|
+
expect(typeof rg.addTag).toBe("function");
|
|
200
|
+
// Should work with standard parameters
|
|
201
|
+
expect(() => {
|
|
202
|
+
rg.addTag("key", "value");
|
|
203
|
+
}).not.toThrow();
|
|
204
|
+
});
|
|
205
|
+
it("should have JSII-compliant tags getter", () => {
|
|
206
|
+
const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
|
|
207
|
+
name: "test-rg",
|
|
208
|
+
location: "eastus",
|
|
209
|
+
tags: { test: "tag" },
|
|
210
|
+
});
|
|
211
|
+
// Should return an object
|
|
212
|
+
expect(typeof rg.tags).toBe("object");
|
|
213
|
+
// Should be serializable
|
|
214
|
+
expect(() => JSON.stringify(rg.tags)).not.toThrow();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UtdGFncy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlLXRhZ3Muc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBRUgsaUNBQWdDO0FBQ2hDLCtCQUErQjtBQUMvQixvRkFBZ0Y7QUFFaEYsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtJQUM5QyxJQUFJLEdBQWMsQ0FBQztJQUNuQixJQUFJLEtBQTJCLENBQUM7SUFFaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEdBQUcsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7YUFDM0IsQ0FBQztZQUVGLE1BQU0sRUFBRSxHQUFHLElBQUksOEJBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJELHlDQUF5QztZQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRWpELHVDQUF1QztZQUN2QyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxP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QUcsRUFBRTtZQUNsRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDhCQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDNUMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1lBRUgsdUJBQXVCO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFMUMsdUNBQXVDO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDhCQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDNUMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsMEJBQTBCO1lBQzFCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdEMseUJBQXlCO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3RzIGZvciB0aGUgQXphcGlSZXNvdXJjZSB0YWcgbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5XG4gKlxuICogVGhlc2UgdGVzdHMgdmVyaWZ5IHRoYXQgdGhlIGltbXV0YWJpbGl0eSBwYXR0ZXJuIGZvciB0YWdzIHdvcmtzIGNvcnJlY3RseTpcbiAqIC0gVGFncyBmcm9tIHByb3BzIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSByZWFkb25seSBwcm9wc1xuICogLSBUYWdzIGFkZGVkIHZpYSBhZGRUYWcoKSBhcmUgY29tYmluZWQgd2l0aCBwcm9wcyB0YWdzXG4gKiAtIFRoZSB0YWdzIGdldHRlciByZXR1cm5zIGFsbCB0YWdzIChwcm9wcyArIGFkZGVkKVxuICogLSBUaGUgYWxsVGFncygpIG1ldGhvZCB1c2VkIGluIGNyZWF0ZVJlc291cmNlQm9keSBpbmNsdWRlcyBhbGwgdGFnc1xuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcm91cCB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1yZXNvdXJjZWdyb3VwL2xpYi9yZXNvdXJjZS1ncm91cFwiO1xuXG5kZXNjcmliZShcIkF6YXBpUmVzb3VyY2UgLSBUYWcgTWFuYWdlbWVudFwiLCAoKSA9PiB7XG4gIGxldCBhcHA6IGNka3RmLkFwcDtcbiAgbGV0IHN0YWNrOiBjZGt0Zi5UZXJyYWZvcm1TdGFjaztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIHN0YWNrID0gbmV3IGNka3RmLlRlcnJhZm9ybVN0YWNrKGFwcCwgXCJUZXN0U3RhY2tcIik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiVGFnIEltbXV0YWJpbGl0eVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc3RvcmUgdGFncyBzZXBhcmF0ZWx5IGZyb20gcmVhZG9ubHkgcHJvcHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInZhbHVlXCIgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHByb3BzKTtcblxuICAgICAgLy8gT3JpZ2luYWwgcHJvcHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWRcbiAgICAgIGV4cGVjdChwcm9wcy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuXG4gICAgICAvLyBUYWdzIHNob3VsZCBiZSBhY2Nlc3NpYmxlIHZpYSBnZXR0ZXJcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgbm90IG11dGF0ZSBwcm9wcyB3aGVuIGFkZGluZyB0YWdzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHRhZ3M6IHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCBwcm9wcyk7XG5cbiAgICAgIC8vIEFkZCBhIHRhZ1xuICAgICAgcmcuYWRkVGFnKFwiYWRkZWRcIiwgXCJkeW5hbWljYWxseVwiKTtcblxuICAgICAgLy8gT3JpZ2luYWwgcHJvcHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWRcbiAgICAgIGV4cGVjdChwcm9wcy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuICAgICAgZXhwZWN0KChwcm9wcy50YWdzIGFzIGFueSkuYWRkZWQpLnRvQmVVbmRlZmluZWQoKTtcblxuICAgICAgLy8gVGFncyBnZXR0ZXIgc2hvdWxkIGluY2x1ZGUgYm90aFxuICAgICAgZXhwZWN0KHJnLnRhZ3MpLnRvRXF1YWwoe1xuICAgICAgICBpbml0aWFsOiBcInZhbHVlXCIsXG4gICAgICAgIGFkZGVkOiBcImR5bmFtaWNhbGx5XCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSB0YWdzIHdoZW4gbm8gaW5pdGlhbCB0YWdzIGFyZSBwcm92aWRlZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBlbXB0eSB0YWdzXG4gICAgICBleHBlY3QocmcudGFncykudG9FcXVhbCh7fSk7XG5cbiAgICAgIC8vIEFkZCB0YWdzXG4gICAgICByZy5hZGRUYWcoXCJ0YWcxXCIsIFwidmFsdWUxXCIpO1xuICAgICAgcmcuYWRkVGFnKFwidGFnMlwiLCBcInZhbHVlMlwiKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgdGhlIGFkZGVkIHRhZ3NcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgdGFnMTogXCJ2YWx1ZTFcIixcbiAgICAgICAgdGFnMjogXCJ2YWx1ZTJcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlRhZyBDb21iaW5hdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY29tYmluZSBwcm9wcyB0YWdzIHdpdGggZHluYW1pY2FsbHkgYWRkZWQgdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIGVudmlyb25tZW50OiBcInRlc3RcIixcbiAgICAgICAgICBwcm9qZWN0OiBcImNka3RmXCIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIG1vcmUgdGFnc1xuICAgICAgcmcuYWRkVGFnKFwib3duZXJcIiwgXCJ0ZWFtQGV4YW1wbGUuY29tXCIpO1xuICAgICAgcmcuYWRkVGFnKFwiY29zdC1jZW50ZXJcIiwgXCJlbmdpbmVlcmluZ1wiKTtcblxuICAgICAgLy8gQWxsIHRhZ3Mgc2hvdWxkIGJlIGFjY2Vzc2libGVcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IFwidGVzdFwiLFxuICAgICAgICBwcm9qZWN0OiBcImNka3RmXCIsXG4gICAgICAgIG93bmVyOiBcInRlYW1AZXhhbXBsZS5jb21cIixcbiAgICAgICAgXCJjb3N0LWNlbnRlclwiOiBcImVuZ2luZWVyaW5nXCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGFsbG93IG92ZXJ3cml0aW5nIHRhZ3MgdmlhIGFkZFRhZ1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBlbnZpcm9ubWVudDogXCJkZXZcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE92ZXJ3cml0ZSBleGlzdGluZyB0YWdcbiAgICAgIHJnLmFkZFRhZyhcImVudmlyb25tZW50XCIsIFwicHJvZHVjdGlvblwiKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgdGhlIG5ldyB2YWx1ZVxuICAgICAgZXhwZWN0KHJnLnRhZ3MuZW52aXJvbm1lbnQpLnRvQmUoXCJwcm9kdWN0aW9uXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGEgY29weSBmcm9tIHRhZ3MgZ2V0dGVyIHRvIG1haW50YWluIGltbXV0YWJpbGl0eVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInZhbHVlXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGFncyByZWZlcmVuY2VcbiAgICAgIGNvbnN0IHRhZ3MxID0gcmcudGFncztcbiAgICAgIGNvbnN0IHRhZ3MyID0gcmcudGFncztcblxuICAgICAgLy8gU2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzIChjb3BpZXMpXG4gICAgICBleHBlY3QodGFnczEpLm5vdC50b0JlKHRhZ3MyKTtcblxuICAgICAgLy8gQnV0IHdpdGggc2FtZSBjb250ZW50XG4gICAgICBleHBlY3QodGFnczEpLnRvRXF1YWwodGFnczIpO1xuXG4gICAgICAvLyBNb2RpZnlpbmcgdGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgcmVzb3VyY2VcbiAgICAgIHRhZ3MxLm1vZGlmaWVkID0gXCJleHRlcm5hbGx5XCI7XG4gICAgICBleHBlY3QocmcudGFncy5tb2RpZmllZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIk11bHRpcGxlIFRhZyBPcGVyYXRpb25zXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgYWRkVGFnIGNhbGxzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCBtdWx0aXBsZSB0YWdzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgcmcuYWRkVGFnKGB0YWcke2l9YCwgYHZhbHVlJHtpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBbGwgdGFncyBzaG91bGQgYmUgcHJlc2VudFxuICAgICAgY29uc3QgdGFncyA9IHJnLnRhZ3M7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXModGFncykpLnRvSGF2ZUxlbmd0aCgxMCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgZXhwZWN0KHRhZ3NbYHRhZyR7aX1gXSkudG9CZShgdmFsdWUke2l9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRhZyBrZXlzIGFuZCB2YWx1ZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmcgPSBuZXcgUmVzb3VyY2VHcm91cChzdGFjaywgXCJUZXN0UkdcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICB9KTtcblxuICAgICAgcmcuYWRkVGFnKFwidGFnLXdpdGgtZGFzaFwiLCBcInZhbHVlLXdpdGgtZGFzaFwiKTtcbiAgICAgIHJnLmFkZFRhZyhcInRhZzp3aXRoOmNvbG9uXCIsIFwidmFsdWU6d2l0aDpjb2xvblwiKTtcbiAgICAgIHJnLmFkZFRhZyhcInRhZy53aXRoLmRvdFwiLCBcInZhbHVlLndpdGguZG90XCIpO1xuXG4gICAgICBjb25zdCB0YWdzID0gcmcudGFncztcbiAgICAgIGV4cGVjdCh0YWdzW1widGFnLXdpdGgtZGFzaFwiXSkudG9CZShcInZhbHVlLXdpdGgtZGFzaFwiKTtcbiAgICAgIGV4cGVjdCh0YWdzW1widGFnOndpdGg6Y29sb25cIl0pLnRvQmUoXCJ2YWx1ZTp3aXRoOmNvbG9uXCIpO1xuICAgICAgZXhwZWN0KHRhZ3NbXCJ0YWcud2l0aC5kb3RcIl0pLnRvQmUoXCJ2YWx1ZS53aXRoLmRvdFwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJSZXNvdXJjZSBCb2R5IEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBpbmNsdWRlIGFsbCB0YWdzIGluIHN5bnRoZXNpemVkIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uIHdoZW4gYWRkZWQgYmVmb3JlIHN5bnRoZXNpc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInRhZ1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gVGFncyBhcmUgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24gdmlhIHByb3BzXG4gICAgICAvLyBWZXJpZnkgdGhleSdyZSBhY2Nlc3NpYmxlXG4gICAgICBleHBlY3QocmcudGFncykudG9FcXVhbCh7IGluaXRpYWw6IFwidGFnXCIgfSk7XG5cbiAgICAgIC8vIFN5bnRoZXNpemUgdGhlIHN0YWNrXG4gICAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3Rpbmcuc3ludGgoc3RhY2spO1xuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcblxuICAgICAgLy8gVGhlIGF6YXBpX3Jlc291cmNlIHNob3VsZCBleGlzdFxuICAgICAgZXhwZWN0KHN0YWNrQ29uZmlnLnJlc291cmNlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YWNrQ29uZmlnLnJlc291cmNlLmF6YXBpX3Jlc291cmNlKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBGaW5kIHRoZSByZXNvdXJjZSAobmFtZSBtYXkgdmFyeSBiYXNlZCBvbiBjb25zdHJ1Y3QgSUQgZ2VuZXJhdGlvbilcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC52YWx1ZXMoc3RhY2tDb25maWcucmVzb3VyY2UuYXphcGlfcmVzb3VyY2UpO1xuICAgICAgZXhwZWN0KHJlc291cmNlcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcblxuICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHJlc291cmNlc1swXTtcblxuICAgICAgLy8gVGFncyBzaG91bGQgYmUgYXQgdGhlIHJlc291cmNlIGxldmVsLCBub3QgaW4gdGhlIGJvZHlcbiAgICAgIC8vIFRoZSBjcmVhdGVBemFwaVJlc291cmNlIG1ldGhvZCBleHRyYWN0cyB0YWdzIGZyb20gYm9keSBhbmQgcGxhY2VzIHRoZW0gYXQgdG9wIGxldmVsXG4gICAgICBleHBlY3QocmVzb3VyY2UudGFncykudG9FcXVhbCh7XG4gICAgICAgIGluaXRpYWw6IFwidGFnXCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIG1ha2UgdGFncyBhZGRlZCB2aWEgYWRkVGFnIGFjY2Vzc2libGUgdmlhIHRhZ3MgZ2V0dGVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICB0YWdzOiB7IGluaXRpYWw6IFwidGFnXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgdGFnIGFmdGVyIGNvbnN0cnVjdGlvblxuICAgICAgcmcuYWRkVGFnKFwiYWRkZWRcIiwgXCJsYXRlclwiKTtcblxuICAgICAgLy8gVmVyaWZ5IHRhZ3MgYXJlIGFjY2Vzc2libGUgdmlhIGdldHRlclxuICAgICAgZXhwZWN0KHJnLnRhZ3MpLnRvRXF1YWwoe1xuICAgICAgICBpbml0aWFsOiBcInRhZ1wiLFxuICAgICAgICBhZGRlZDogXCJsYXRlclwiLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiSlNJSSBDb21wbGlhbmNlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYXZlIEpTSUktY29tcGxpYW50IGFkZFRhZyBtZXRob2RcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmcgPSBuZXcgUmVzb3VyY2VHcm91cChzdGFjaywgXCJUZXN0UkdcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIGJlIGEgZnVuY3Rpb25cbiAgICAgIGV4cGVjdCh0eXBlb2YgcmcuYWRkVGFnKS50b0JlKFwiZnVuY3Rpb25cIik7XG5cbiAgICAgIC8vIFNob3VsZCB3b3JrIHdpdGggc3RhbmRhcmQgcGFyYW1ldGVyc1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgcmcuYWRkVGFnKFwia2V5XCIsIFwidmFsdWVcIik7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGF2ZSBKU0lJLWNvbXBsaWFudCB0YWdzIGdldHRlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyB0ZXN0OiBcInRhZ1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIHJldHVybiBhbiBvYmplY3RcbiAgICAgIGV4cGVjdCh0eXBlb2YgcmcudGFncykudG9CZShcIm9iamVjdFwiKTtcblxuICAgICAgLy8gU2hvdWxkIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgZXhwZWN0KCgpID0+IEpTT04uc3RyaW5naWZ5KHJnLnRhZ3MpKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -92,13 +92,36 @@ export interface MonitoringConfig {
|
|
|
92
92
|
* Combines base resource properties with version management capabilities
|
|
93
93
|
* and advanced configuration options for the unified framework.
|
|
94
94
|
*/
|
|
95
|
-
export interface AzapiResourceProps {
|
|
95
|
+
export interface AzapiResourceProps extends cdktf.TerraformMetaArguments {
|
|
96
96
|
/**
|
|
97
97
|
* The name of the resource
|
|
98
98
|
*/
|
|
99
99
|
readonly name?: string;
|
|
100
100
|
/**
|
|
101
101
|
* The location where the resource should be created
|
|
102
|
+
*
|
|
103
|
+
* @remarks
|
|
104
|
+
* Location handling varies by resource type:
|
|
105
|
+
* - **Top-level resources**: Most require an explicit location (e.g., "eastus", "westus")
|
|
106
|
+
* - **Global resources**: Some use "global" as location (e.g., Private DNS Zones)
|
|
107
|
+
* - **Child resources**: Inherit location from parent and should NOT set this property
|
|
108
|
+
*
|
|
109
|
+
* Each resource type may provide its own default through the `resolveLocation()` method.
|
|
110
|
+
* If no location is specified and no default exists, resource creation may fail.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* // Explicit location for most resources
|
|
114
|
+
* location: "eastus"
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* // Global resource (Private DNS Zone)
|
|
118
|
+
* location: "global"
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* // Child resource (Subnet) - do not set location
|
|
122
|
+
* // location: undefined (inherited from parent Virtual Network)
|
|
123
|
+
*
|
|
124
|
+
* @defaultValue Varies by resource type - see specific resource documentation
|
|
102
125
|
*/
|
|
103
126
|
readonly location?: string;
|
|
104
127
|
/**
|
|
@@ -214,15 +237,35 @@ export interface AzapiResourceProps {
|
|
|
214
237
|
* @stability stable
|
|
215
238
|
*/
|
|
216
239
|
export declare abstract class AzapiResource extends Construct {
|
|
240
|
+
/**
|
|
241
|
+
* Static helper for child classes to register their schemas in static initializers
|
|
242
|
+
*
|
|
243
|
+
* This method should be called in a static initializer block of each child class
|
|
244
|
+
* to register all supported API versions and their schemas with the ApiVersionManager.
|
|
245
|
+
* The static block runs once when the class is first loaded, ensuring schemas are
|
|
246
|
+
* registered before any instances are created.
|
|
247
|
+
*
|
|
248
|
+
* @param resourceType - The Azure resource type (e.g., "Microsoft.Network/virtualNetworks")
|
|
249
|
+
* @param versions - Array of version configurations containing schemas
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* static {
|
|
253
|
+
* AzapiResource.registerSchemas(
|
|
254
|
+
* "Microsoft.Network/virtualNetworks",
|
|
255
|
+
* ALL_VIRTUAL_NETWORK_VERSIONS
|
|
256
|
+
* );
|
|
257
|
+
* }
|
|
258
|
+
*/
|
|
259
|
+
protected static registerSchemas(resourceType: string, versions: VersionConfig[]): void;
|
|
217
260
|
/**
|
|
218
261
|
* The Azure resource type (e.g., "Microsoft.Resources/resourceGroups")
|
|
219
262
|
* @internal
|
|
220
263
|
*/
|
|
221
|
-
protected
|
|
264
|
+
protected _resourceType: string;
|
|
222
265
|
/**
|
|
223
266
|
* The API version to use for this resource
|
|
224
267
|
*/
|
|
225
|
-
protected
|
|
268
|
+
protected apiVersion: string;
|
|
226
269
|
/**
|
|
227
270
|
* The underlying AZAPI Terraform resource
|
|
228
271
|
*/
|
|
@@ -232,13 +275,17 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
232
275
|
*/
|
|
233
276
|
readonly name: string;
|
|
234
277
|
/**
|
|
235
|
-
* The location of the resource
|
|
278
|
+
* The location of the resource (optional - not all resources have a location)
|
|
279
|
+
* Child resources typically inherit location from their parent
|
|
236
280
|
*/
|
|
237
|
-
readonly location
|
|
281
|
+
readonly location?: string;
|
|
238
282
|
/**
|
|
239
|
-
* The resource ID
|
|
283
|
+
* The Azure resource ID
|
|
284
|
+
*
|
|
285
|
+
* This property is automatically derived from the underlying Terraform resource.
|
|
286
|
+
* Child classes no longer need to implement this property.
|
|
240
287
|
*/
|
|
241
|
-
|
|
288
|
+
get id(): string;
|
|
242
289
|
/**
|
|
243
290
|
* The resolved API version being used for this resource instance
|
|
244
291
|
*
|
|
@@ -246,37 +293,43 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
246
293
|
* either explicitly specified in props or automatically resolved to
|
|
247
294
|
* the latest active version.
|
|
248
295
|
*/
|
|
249
|
-
|
|
296
|
+
resolvedApiVersion: string;
|
|
250
297
|
/**
|
|
251
298
|
* The API schema for the resolved version
|
|
252
299
|
*
|
|
253
300
|
* Contains the complete schema definition including properties, validation
|
|
254
301
|
* rules, and transformation mappings for the resolved API version.
|
|
255
302
|
*/
|
|
256
|
-
|
|
303
|
+
schema: ApiSchema;
|
|
257
304
|
/**
|
|
258
305
|
* The version configuration for the resolved version
|
|
259
306
|
*
|
|
260
307
|
* Contains lifecycle information, breaking changes, and migration metadata
|
|
261
308
|
* for the resolved API version.
|
|
262
309
|
*/
|
|
263
|
-
|
|
310
|
+
versionConfig: VersionConfig;
|
|
264
311
|
/**
|
|
265
312
|
* Validation results for the resource properties
|
|
266
313
|
*
|
|
267
314
|
* Available after construction if validation is enabled. Contains detailed
|
|
268
315
|
* information about any validation errors or warnings.
|
|
269
316
|
*/
|
|
270
|
-
|
|
317
|
+
validationResult?: ValidationResult;
|
|
271
318
|
/**
|
|
272
319
|
* Migration analysis results
|
|
273
320
|
*
|
|
274
321
|
* Available after construction if migration analysis is enabled and a
|
|
275
322
|
* previous version can be determined for comparison.
|
|
276
323
|
*/
|
|
277
|
-
|
|
324
|
+
migrationAnalysis?: MigrationAnalysis;
|
|
278
325
|
private readonly _apiVersionManager;
|
|
279
|
-
private
|
|
326
|
+
private _versionManager;
|
|
327
|
+
private _schemaValidator;
|
|
328
|
+
/**
|
|
329
|
+
* Internal mutable tags storage separate from input props
|
|
330
|
+
* Combines props.tags with dynamically added tags via addTag()
|
|
331
|
+
*/
|
|
332
|
+
private _tags;
|
|
280
333
|
protected readonly monitoringActionGroups: Construct[];
|
|
281
334
|
protected readonly monitoringMetricAlerts: Construct[];
|
|
282
335
|
protected readonly monitoringActivityLogAlerts: Construct[];
|
|
@@ -292,6 +345,16 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
292
345
|
* @param props - Configuration properties for the resource
|
|
293
346
|
*/
|
|
294
347
|
constructor(scope: Construct, id: string, props?: AzapiResourceProps);
|
|
348
|
+
/**
|
|
349
|
+
* Protected initialization method called after the constructor completes
|
|
350
|
+
*
|
|
351
|
+
* This method is called at the end of the constructor to perform initialization
|
|
352
|
+
* that requires calling abstract methods. Child classes can override this method
|
|
353
|
+
* if they need to extend initialization logic, but they MUST call super.initialize(props).
|
|
354
|
+
*
|
|
355
|
+
* @param props - Configuration properties for the resource
|
|
356
|
+
*/
|
|
357
|
+
protected initialize(props: AzapiResourceProps): void;
|
|
295
358
|
/**
|
|
296
359
|
* Gets the default API version to use when no explicit version is specified
|
|
297
360
|
*
|
|
@@ -332,6 +395,36 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
332
395
|
* @returns The resource body object to send to Azure API
|
|
333
396
|
*/
|
|
334
397
|
protected abstract createResourceBody(props: any): any;
|
|
398
|
+
/**
|
|
399
|
+
* Override in child classes to provide default location
|
|
400
|
+
* @returns Default location or undefined
|
|
401
|
+
*/
|
|
402
|
+
protected defaultLocation(): string | undefined;
|
|
403
|
+
/**
|
|
404
|
+
* Override in child classes to indicate if location is required
|
|
405
|
+
* @returns true if location is mandatory for this resource type
|
|
406
|
+
*/
|
|
407
|
+
protected requiresLocation(): boolean;
|
|
408
|
+
/**
|
|
409
|
+
* Override in child classes to specify parent resource for location inheritance
|
|
410
|
+
* @returns Parent resource or undefined
|
|
411
|
+
*/
|
|
412
|
+
protected parentResourceForLocation(): AzapiResource | undefined;
|
|
413
|
+
/**
|
|
414
|
+
* Resolves location using template method pattern
|
|
415
|
+
* Priority: props.location > parent location > default location > validation
|
|
416
|
+
*/
|
|
417
|
+
protected resolveLocation(props: AzapiResourceProps): string | undefined;
|
|
418
|
+
/**
|
|
419
|
+
* Resolves the name for this resource
|
|
420
|
+
*
|
|
421
|
+
* This method centralizes name resolution logic. By default, it uses the
|
|
422
|
+
* provided name or falls back to the construct ID.
|
|
423
|
+
*
|
|
424
|
+
* @param props - The resource properties
|
|
425
|
+
* @returns The resolved resource name
|
|
426
|
+
*/
|
|
427
|
+
protected resolveName(props: AzapiResourceProps): string;
|
|
335
428
|
/**
|
|
336
429
|
* Helper method for standard schema resolution
|
|
337
430
|
*
|
|
@@ -371,18 +464,10 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
371
464
|
* @returns Detailed migration analysis results
|
|
372
465
|
*/
|
|
373
466
|
analyzeMigrationTo(targetVersion: string): MigrationAnalysis;
|
|
374
|
-
/**
|
|
375
|
-
* Resolves the API version to use for this resource instance
|
|
376
|
-
*/
|
|
377
|
-
private _resolveApiVersion;
|
|
378
467
|
/**
|
|
379
468
|
* Processes properties through the framework pipeline
|
|
380
469
|
*/
|
|
381
470
|
private _processProperties;
|
|
382
|
-
/**
|
|
383
|
-
* Validates properties against the schema
|
|
384
|
-
*/
|
|
385
|
-
private _validateProperties;
|
|
386
471
|
/**
|
|
387
472
|
* Performs migration analysis for the current version
|
|
388
473
|
*/
|
|
@@ -391,6 +476,23 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
391
476
|
* Creates the underlying Azure resource
|
|
392
477
|
*/
|
|
393
478
|
private _createAzureResource;
|
|
479
|
+
/**
|
|
480
|
+
* Finds the parent AzapiResource construct if the parentId references a resource
|
|
481
|
+
* Returns undefined if parentId is a static string or parent not found
|
|
482
|
+
* @private
|
|
483
|
+
*/
|
|
484
|
+
private _findParentAzapiResource;
|
|
485
|
+
/**
|
|
486
|
+
* Finds the root of the construct tree
|
|
487
|
+
* @private
|
|
488
|
+
*/
|
|
489
|
+
private _findRoot;
|
|
490
|
+
/**
|
|
491
|
+
* Recursively searches for a parent resource by matching parentId patterns
|
|
492
|
+
* Enhanced to better handle Terraform interpolation syntax
|
|
493
|
+
* @private
|
|
494
|
+
*/
|
|
495
|
+
private _findParentResource;
|
|
394
496
|
/**
|
|
395
497
|
* Resolves the parent resource ID for this resource.
|
|
396
498
|
*
|
|
@@ -405,8 +507,12 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
405
507
|
/**
|
|
406
508
|
* Determines the parent ID for the resource (internal implementation)
|
|
407
509
|
*
|
|
408
|
-
* This method provides the default parent ID resolution logic
|
|
409
|
-
*
|
|
510
|
+
* This method provides the default parent ID resolution logic.
|
|
511
|
+
* Resource-specific logic should be implemented in the overrideable resolveParentId() method.
|
|
512
|
+
*
|
|
513
|
+
* Default behavior:
|
|
514
|
+
* - If resourceGroupId is provided in props, use it
|
|
515
|
+
* - Otherwise, default to subscription scope
|
|
410
516
|
*/
|
|
411
517
|
private _determineParentId;
|
|
412
518
|
/**
|
|
@@ -427,13 +533,16 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
427
533
|
/**
|
|
428
534
|
* Creates the underlying AZAPI Terraform resource using the generated provider classes
|
|
429
535
|
*
|
|
430
|
-
* @param properties - The properties object to send to the Azure API
|
|
536
|
+
* @param properties - The properties object to send to the Azure API (should include location if needed)
|
|
431
537
|
* @param parentId - The parent resource ID (e.g., subscription or resource group)
|
|
432
538
|
* @param name - The name of the resource
|
|
433
|
-
* @param location - The location of the resource (optional,
|
|
539
|
+
* @param location - The location of the resource (optional, only for top-level resources without location in body)
|
|
540
|
+
* @param parentResource - The parent resource for dependency tracking
|
|
541
|
+
* @param dependsOn - Explicit dependencies for this resource
|
|
542
|
+
* @param tags - Tags to apply to the resource (passed separately from body for proper idempotency)
|
|
434
543
|
* @returns The created AZAPI resource
|
|
435
544
|
*/
|
|
436
|
-
protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string): cdktf.TerraformResource;
|
|
545
|
+
protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string, parentResource?: AzapiResource, dependsOn?: cdktf.ITerraformDependable[], tags?: Record<string, string>): cdktf.TerraformResource;
|
|
437
546
|
/**
|
|
438
547
|
* Creates an AZAPI data source for reading existing resources
|
|
439
548
|
*
|
|
@@ -451,6 +560,11 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
451
560
|
* Gets the full resource ID
|
|
452
561
|
*/
|
|
453
562
|
get resourceId(): string;
|
|
563
|
+
/**
|
|
564
|
+
* Gets the underlying Terraform resource for use in dependency declarations
|
|
565
|
+
* This allows explicit dependency management between resources
|
|
566
|
+
*/
|
|
567
|
+
get resource(): cdktf.TerraformResource;
|
|
454
568
|
/**
|
|
455
569
|
* Gets the resource as a Terraform output value
|
|
456
570
|
*/
|
|
@@ -464,6 +578,44 @@ export declare abstract class AzapiResource extends Construct {
|
|
|
464
578
|
* @param roleDefinitionName - The name of the Azure RBAC role to be assigned
|
|
465
579
|
*/
|
|
466
580
|
addAccess(objectId: string, roleDefinitionName: string): void;
|
|
581
|
+
/**
|
|
582
|
+
* Adds a tag to this resource. The tag will be included in the Azure resource.
|
|
583
|
+
*
|
|
584
|
+
* This method provides proper immutability by storing tags separately from props.
|
|
585
|
+
* Tags added via this method are combined with tags from props and included in
|
|
586
|
+
* the deployed Azure resource.
|
|
587
|
+
*
|
|
588
|
+
* **Important:** In CDK for Terraform, tags should ideally be set during resource
|
|
589
|
+
* construction via props. While this method allows adding tags after construction,
|
|
590
|
+
* those tags are only included if added before the Terraform configuration is
|
|
591
|
+
* synthesized. For best results, add all tags via props or call addTag() in the
|
|
592
|
+
* same scope where the resource is created.
|
|
593
|
+
*
|
|
594
|
+
* @param key - The tag key
|
|
595
|
+
* @param value - The tag value
|
|
596
|
+
*/
|
|
597
|
+
addTag(key: string, value: string): void;
|
|
598
|
+
/**
|
|
599
|
+
* All tags on this resource (readonly view)
|
|
600
|
+
*
|
|
601
|
+
* This getter provides convenient access to all tags including those from props
|
|
602
|
+
* and those added dynamically via addTag(). Returns a copy to maintain immutability.
|
|
603
|
+
*/
|
|
604
|
+
get tags(): {
|
|
605
|
+
[key: string]: string;
|
|
606
|
+
};
|
|
607
|
+
/**
|
|
608
|
+
* Protected method to retrieve all tags for use in createResourceBody implementations
|
|
609
|
+
*
|
|
610
|
+
* Subclasses should use this method when creating resource bodies to ensure
|
|
611
|
+
* all tags (from props and addTag()) are included in the Azure resource.
|
|
612
|
+
* Uses a non-getter name to avoid JSII conflicts with the tags property.
|
|
613
|
+
*
|
|
614
|
+
* @returns Object containing all tags
|
|
615
|
+
*/
|
|
616
|
+
protected allTags(): {
|
|
617
|
+
[key: string]: string;
|
|
618
|
+
};
|
|
467
619
|
}
|
|
468
620
|
/**
|
|
469
621
|
* Properties for AZAPI role assignment
|