@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.1
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 +54630 -26185
- 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 +349 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +237 -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 +281 -0
- package/lib/azure-policydefinition/lib/policy-definition.js +236 -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 +806 -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 +206 -26
- package/lib/core-azure/lib/azapi/azapi-resource.js +379 -91
- 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,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RoleAssignment = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Unified Azure Role Assignment implementation using VersionedAzapiResource framework
|
|
8
|
+
*
|
|
9
|
+
* This class provides a version-aware implementation for managing Azure Role Assignments
|
|
10
|
+
* using the AZAPI provider. Role assignments grant specific permissions (roles) to security
|
|
11
|
+
* principals (users, groups, service principals, managed identities) at a particular scope.
|
|
12
|
+
*
|
|
13
|
+
* Supported API Versions:
|
|
14
|
+
* - 2022-04-01 (Active, Latest)
|
|
15
|
+
*
|
|
16
|
+
* Features:
|
|
17
|
+
* - Automatic latest version resolution when no version is specified
|
|
18
|
+
* - Explicit version pinning for stability requirements
|
|
19
|
+
* - Schema-driven validation and transformation
|
|
20
|
+
* - Support for all principal types (User, Group, ServicePrincipal, ForeignGroup, Device)
|
|
21
|
+
* - Conditional role assignments using ABAC (Attribute-Based Access Control)
|
|
22
|
+
* - Delegated managed identity support for group assignments
|
|
23
|
+
* - Assignment at subscription, resource group, or resource scope
|
|
24
|
+
* - JSII compliance for multi-language support
|
|
25
|
+
*/
|
|
26
|
+
const crypto_1 = require("crypto");
|
|
27
|
+
const cdktf = require("cdktf");
|
|
28
|
+
const role_assignment_schemas_1 = require("./role-assignment-schemas");
|
|
29
|
+
const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
|
|
30
|
+
/**
|
|
31
|
+
* Unified Azure Role Assignment implementation
|
|
32
|
+
*
|
|
33
|
+
* This class provides a single, version-aware implementation for managing Azure
|
|
34
|
+
* Role Assignments. It automatically handles version resolution, schema validation,
|
|
35
|
+
* and property transformation.
|
|
36
|
+
*
|
|
37
|
+
* **Important Notes:**
|
|
38
|
+
* - Role assignments are scoped resources deployed at subscription, resource group,
|
|
39
|
+
* or resource level. They do not have a location property as they are not region-specific.
|
|
40
|
+
* - The `name` property (inherited from AzapiResourceProps) is not used. Azure automatically
|
|
41
|
+
* generates a deterministic GUID for role assignment names based on the deployment context.
|
|
42
|
+
* This ensures idempotent deployments without duplicate role assignments.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* Basic role assignment - Assign Reader role to a user at subscription scope
|
|
46
|
+
*
|
|
47
|
+
* const assignment = new RoleAssignment(this, "reader-assignment", {
|
|
48
|
+
* roleDefinitionId: "/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7",
|
|
49
|
+
* principalId: "00000000-0000-0000-0000-000000000000",
|
|
50
|
+
* scope: "/subscriptions/00000000-0000-0000-0000-000000000000",
|
|
51
|
+
* principalType: "User",
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* Resource group scoped assignment - Assign Contributor to a service principal
|
|
56
|
+
*
|
|
57
|
+
* const assignment = new RoleAssignment(this, "contributor-assignment", {
|
|
58
|
+
* roleDefinitionId: "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
|
|
59
|
+
* principalId: servicePrincipal.objectId,
|
|
60
|
+
* scope: resourceGroup.id,
|
|
61
|
+
* principalType: "ServicePrincipal",
|
|
62
|
+
* description: "Grants contributor access to the deployment service principal",
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* Conditional assignment with ABAC - Limit access to specific storage containers
|
|
67
|
+
*
|
|
68
|
+
* const assignment = new RoleAssignment(this, "conditional-assignment", {
|
|
69
|
+
* roleDefinitionId: storageRole.id,
|
|
70
|
+
* principalId: user.objectId,
|
|
71
|
+
* scope: storageAccount.id,
|
|
72
|
+
* principalType: "User",
|
|
73
|
+
* condition: "@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'logs'",
|
|
74
|
+
* conditionVersion: "2.0",
|
|
75
|
+
* description: "Grants access only to the logs container",
|
|
76
|
+
* });
|
|
77
|
+
*
|
|
78
|
+
* @stability stable
|
|
79
|
+
*/
|
|
80
|
+
class RoleAssignment extends azapi_resource_1.AzapiResource {
|
|
81
|
+
// Public properties
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new Azure Role Assignment using the VersionedAzapiResource framework
|
|
84
|
+
*
|
|
85
|
+
* The constructor automatically handles version resolution, schema registration,
|
|
86
|
+
* validation, and resource creation.
|
|
87
|
+
*
|
|
88
|
+
* @param scope - The scope in which to define this construct
|
|
89
|
+
* @param id - The unique identifier for this instance
|
|
90
|
+
* @param props - Configuration properties for the Role Assignment
|
|
91
|
+
*/
|
|
92
|
+
constructor(scope, id, props) {
|
|
93
|
+
// Azure Role Assignments do not support tags at the resource level.
|
|
94
|
+
// We must strip tags from props before passing to the parent constructor
|
|
95
|
+
// to prevent the AZAPI provider from including tags in the resource.
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
97
|
+
const { tags: _unusedTags, ...propsWithoutTags } = props;
|
|
98
|
+
super(scope, id, propsWithoutTags);
|
|
99
|
+
this.props = props;
|
|
100
|
+
// Extract properties from the AZAPI resource outputs using Terraform interpolation
|
|
101
|
+
// Create Terraform outputs for easy access and referencing from other resources
|
|
102
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
103
|
+
value: this.id,
|
|
104
|
+
description: "The ID of the Role Assignment",
|
|
105
|
+
});
|
|
106
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
107
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
108
|
+
description: "The name of the Role Assignment",
|
|
109
|
+
});
|
|
110
|
+
// Override logical IDs to match original naming convention
|
|
111
|
+
this.idOutput.overrideLogicalId("id");
|
|
112
|
+
this.nameOutput.overrideLogicalId("name");
|
|
113
|
+
// Apply ignore changes if specified
|
|
114
|
+
this._applyIgnoreChanges();
|
|
115
|
+
}
|
|
116
|
+
// =============================================================================
|
|
117
|
+
// REQUIRED ABSTRACT METHODS FROM AzapiResource
|
|
118
|
+
// =============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Gets the default API version to use when no explicit version is specified
|
|
121
|
+
* Returns the most recent stable version as the default
|
|
122
|
+
*/
|
|
123
|
+
defaultVersion() {
|
|
124
|
+
return "2022-04-01";
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Gets the Azure resource type for Role Assignments
|
|
128
|
+
*/
|
|
129
|
+
resourceType() {
|
|
130
|
+
return role_assignment_schemas_1.ROLE_ASSIGNMENT_TYPE;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Gets the API schema for the resolved version
|
|
134
|
+
* Uses the framework's schema resolution to get the appropriate schema
|
|
135
|
+
*/
|
|
136
|
+
apiSchema() {
|
|
137
|
+
return this.resolveSchema();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Creates the resource body for the Azure API call
|
|
141
|
+
* Transforms the input properties into the JSON format expected by Azure REST API
|
|
142
|
+
*
|
|
143
|
+
* Note: Role assignments do not have a location property as they are
|
|
144
|
+
* scoped resources (subscription, resource group, or resource level).
|
|
145
|
+
* The scope property is NOT included in the body as it's read-only and
|
|
146
|
+
* automatically derived from the parentId.
|
|
147
|
+
*/
|
|
148
|
+
createResourceBody(props) {
|
|
149
|
+
const typedProps = props;
|
|
150
|
+
return {
|
|
151
|
+
properties: {
|
|
152
|
+
roleDefinitionId: typedProps.roleDefinitionId,
|
|
153
|
+
principalId: typedProps.principalId,
|
|
154
|
+
// Note: scope is NOT included here - it's read-only and derived from parentId
|
|
155
|
+
principalType: typedProps.principalType,
|
|
156
|
+
description: typedProps.description,
|
|
157
|
+
condition: typedProps.condition,
|
|
158
|
+
conditionVersion: typedProps.conditionVersion,
|
|
159
|
+
delegatedManagedIdentityResourceId: typedProps.delegatedManagedIdentityResourceId,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Overrides the name resolution to generate deterministic GUIDs for role assignments
|
|
165
|
+
*
|
|
166
|
+
* Role assignments require GUID format IDs. This implementation generates a deterministic
|
|
167
|
+
* UUID based on the role assignment's key properties to ensure:
|
|
168
|
+
* - Same GUID is generated on re-deployments with same parameters
|
|
169
|
+
* - Idempotent deployments (no duplicate role assignments)
|
|
170
|
+
* - Consistent behavior across deployment runs
|
|
171
|
+
*/
|
|
172
|
+
resolveName(props) {
|
|
173
|
+
const typedProps = props;
|
|
174
|
+
// Create a deterministic hash from key role assignment properties
|
|
175
|
+
const hashInput = [
|
|
176
|
+
typedProps.scope,
|
|
177
|
+
typedProps.roleDefinitionId,
|
|
178
|
+
typedProps.principalId,
|
|
179
|
+
].join("|");
|
|
180
|
+
const hash = (0, crypto_1.createHash)("sha256").update(hashInput).digest("hex");
|
|
181
|
+
// Convert hash to UUID format (8-4-4-4-12)
|
|
182
|
+
return [
|
|
183
|
+
hash.substring(0, 8),
|
|
184
|
+
hash.substring(8, 12),
|
|
185
|
+
hash.substring(12, 16),
|
|
186
|
+
hash.substring(16, 20),
|
|
187
|
+
hash.substring(20, 32),
|
|
188
|
+
].join("-");
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Overrides parent ID resolution to use the scope from props
|
|
192
|
+
* Role assignments are scoped resources where the scope IS the parent
|
|
193
|
+
*/
|
|
194
|
+
resolveParentId(props) {
|
|
195
|
+
const typedProps = props;
|
|
196
|
+
return typedProps.scope;
|
|
197
|
+
}
|
|
198
|
+
// =============================================================================
|
|
199
|
+
// PUBLIC METHODS FOR ROLE ASSIGNMENT OPERATIONS
|
|
200
|
+
// =============================================================================
|
|
201
|
+
/**
|
|
202
|
+
* Get the full resource identifier for use in other Azure resources
|
|
203
|
+
* Alias for the id property
|
|
204
|
+
*/
|
|
205
|
+
get resourceId() {
|
|
206
|
+
return this.id;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get the role definition ID this assignment references
|
|
210
|
+
*/
|
|
211
|
+
get roleDefinitionId() {
|
|
212
|
+
return this.props.roleDefinitionId;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the principal ID that was granted this role
|
|
216
|
+
*/
|
|
217
|
+
get principalId() {
|
|
218
|
+
return this.props.principalId;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get the scope of this role assignment
|
|
222
|
+
*/
|
|
223
|
+
get assignmentScope() {
|
|
224
|
+
return this.props.scope;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get the principal type
|
|
228
|
+
*/
|
|
229
|
+
get principalType() {
|
|
230
|
+
return this.props.principalType;
|
|
231
|
+
}
|
|
232
|
+
// =============================================================================
|
|
233
|
+
// PRIVATE HELPER METHODS
|
|
234
|
+
// =============================================================================
|
|
235
|
+
/**
|
|
236
|
+
* Applies ignore changes lifecycle rules if specified in props
|
|
237
|
+
* Always includes body.properties.roleDefinitionId to handle Azure API format normalization
|
|
238
|
+
*/
|
|
239
|
+
_applyIgnoreChanges() {
|
|
240
|
+
// Always ignore roleDefinitionId format changes due to Azure API normalization
|
|
241
|
+
// Azure returns subscription-qualified format but accepts non-qualified format
|
|
242
|
+
const ignoreChanges = [
|
|
243
|
+
"body.properties.roleDefinitionId",
|
|
244
|
+
...(this.props.ignoreChanges || []),
|
|
245
|
+
];
|
|
246
|
+
this.terraformResource.addOverride("lifecycle", {
|
|
247
|
+
ignore_changes: ignoreChanges,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.RoleAssignment = RoleAssignment;
|
|
252
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
253
|
+
RoleAssignment[_a] = { fqn: "@microsoft/terraform-cdk-constructs.RoleAssignment", version: "1.3.1" };
|
|
254
|
+
(() => {
|
|
255
|
+
azapi_resource_1.AzapiResource.registerSchemas(role_assignment_schemas_1.ROLE_ASSIGNMENT_TYPE, role_assignment_schemas_1.ALL_ROLE_ASSIGNMENT_VERSIONS);
|
|
256
|
+
})();
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1hc3NpZ25tZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXJvbGVhc3NpZ25tZW50L2xpYi9yb2xlLWFzc2lnbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILG1DQUFvQztBQUNwQywrQkFBK0I7QUFFL0IsdUVBR21DO0FBQ25DLDhFQUdtRDtBQTZKbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpREc7QUFDSCxNQUFhLGNBQWUsU0FBUSw4QkFBYTtJQWlCL0Msb0JBQW9CO0lBRXBCOzs7Ozs7Ozs7T0FTRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsNkRBQTZEO1FBQzdELE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDekQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsZ0JBQXVDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixtRkFBbUY7UUFFbkYsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDcEQsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2QsV0FBVyxFQUFFLCtCQUErQjtTQUM3QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3hELEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFFBQVE7WUFDL0MsV0FBVyxFQUFFLGlDQUFpQztTQUMvQyxDQUFDLENBQUM7UUFFSCwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLCtDQUErQztJQUMvQyxnRkFBZ0Y7SUFFaEY7OztPQUdHO0lBQ08sY0FBYztRQUN0QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZO1FBQ3BCLE9BQU8sOENBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFNBQVM7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08sa0JBQWtCLENBQUMsS0FBVTtRQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUE0QixDQUFDO1FBQ2hELE9BQU87WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtnQkFDN0MsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2dCQUNuQyw4RUFBOEU7Z0JBQzlFLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtnQkFDdkMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2dCQUNuQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Z0JBQy9CLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7Z0JBQzdDLGtDQUFrQyxFQUNoQyxVQUFVLENBQUMsa0NBQWtDO2FBQ2hEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLFdBQVcsQ0FBQyxLQUF5QjtRQUM3QyxNQUFNLFVBQVUsR0FBRyxLQUE0QixDQUFDO1FBRWhELGtFQUFrRTtRQUNsRSxNQUFNLFNBQVMsR0FBRztZQUNoQixVQUFVLENBQUMsS0FBSztZQUNoQixVQUFVLENBQUMsZ0JBQWdCO1lBQzNCLFVBQVUsQ0FBQyxXQUFXO1NBQ3ZCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVosTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEUsMkNBQTJDO1FBQzNDLE9BQU87WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNPLGVBQWUsQ0FBQyxLQUFVO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLEtBQTRCLENBQUM7UUFDaEQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsZ0RBQWdEO0lBQ2hELGdGQUFnRjtJQUVoRjs7O09BR0c7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7OztPQUdHO0lBQ0ssbUJBQW1CO1FBQ3pCLCtFQUErRTtRQUMvRSwrRUFBK0U7UUFDL0UsTUFBTSxhQUFhLEdBQUc7WUFDcEIsa0NBQWtDO1lBQ2xDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7U0FDcEMsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQzlDLGNBQWMsRUFBRSxhQUFhO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBcE5ILHdDQXFOQzs7O0FBcE5DO0lBQ0UsOEJBQWEsQ0FBQyxlQUFlLENBQzNCLDhDQUFvQixFQUNwQixzREFBNEIsQ0FDN0IsQ0FBQztBQUNKLENBQUMsR0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmlmaWVkIEF6dXJlIFJvbGUgQXNzaWdubWVudCBpbXBsZW1lbnRhdGlvbiB1c2luZyBWZXJzaW9uZWRBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB2ZXJzaW9uLWF3YXJlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBBenVyZSBSb2xlIEFzc2lnbm1lbnRzXG4gKiB1c2luZyB0aGUgQVpBUEkgcHJvdmlkZXIuIFJvbGUgYXNzaWdubWVudHMgZ3JhbnQgc3BlY2lmaWMgcGVybWlzc2lvbnMgKHJvbGVzKSB0byBzZWN1cml0eVxuICogcHJpbmNpcGFscyAodXNlcnMsIGdyb3Vwcywgc2VydmljZSBwcmluY2lwYWxzLCBtYW5hZ2VkIGlkZW50aXRpZXMpIGF0IGEgcGFydGljdWxhciBzY29wZS5cbiAqXG4gKiBTdXBwb3J0ZWQgQVBJIFZlcnNpb25zOlxuICogLSAyMDIyLTA0LTAxIChBY3RpdmUsIExhdGVzdClcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gd2hlbiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICogLSBFeHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIHN0YWJpbGl0eSByZXF1aXJlbWVudHNcbiAqIC0gU2NoZW1hLWRyaXZlbiB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvblxuICogLSBTdXBwb3J0IGZvciBhbGwgcHJpbmNpcGFsIHR5cGVzIChVc2VyLCBHcm91cCwgU2VydmljZVByaW5jaXBhbCwgRm9yZWlnbkdyb3VwLCBEZXZpY2UpXG4gKiAtIENvbmRpdGlvbmFsIHJvbGUgYXNzaWdubWVudHMgdXNpbmcgQUJBQyAoQXR0cmlidXRlLUJhc2VkIEFjY2VzcyBDb250cm9sKVxuICogLSBEZWxlZ2F0ZWQgbWFuYWdlZCBpZGVudGl0eSBzdXBwb3J0IGZvciBncm91cCBhc3NpZ25tZW50c1xuICogLSBBc3NpZ25tZW50IGF0IHN1YnNjcmlwdGlvbiwgcmVzb3VyY2UgZ3JvdXAsIG9yIHJlc291cmNlIHNjb3BlXG4gKiAtIEpTSUkgY29tcGxpYW5jZSBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBBTExfUk9MRV9BU1NJR05NRU5UX1ZFUlNJT05TLFxuICBST0xFX0FTU0lHTk1FTlRfVFlQRSxcbn0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIHVuaWZpZWQgQXp1cmUgUm9sZSBBc3NpZ25tZW50XG4gKlxuICogRXh0ZW5kcyBBemFwaVJlc291cmNlUHJvcHMgd2l0aCBSb2xlIEFzc2lnbm1lbnQgc3BlY2lmaWMgcHJvcGVydGllcy5cbiAqXG4gKiAqKk5vdGUgb24gdGhlIGBuYW1lYCBwcm9wZXJ0eToqKiBXaGlsZSB0aGlzIGludGVyZmFjZSBpbmhlcml0cyB0aGUgYG5hbWVgIHByb3BlcnR5XG4gKiBmcm9tIEF6YXBpUmVzb3VyY2VQcm9wcywgaXQgaXMgbm90IHVzZWQgZm9yIHJvbGUgYXNzaWdubWVudHMuIEF6dXJlIHJvbGUgYXNzaWdubWVudHNcbiAqIHJlcXVpcmUgR1VJRCBmb3JtYXQgbmFtZXMsIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgY29uc3RydWN0LlxuICogQW55IHVzZXItcHJvdmlkZWQgbmFtZSB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgQXp1cmUncyBkZXRlcm1pbmlzdGljXG4gKiBHVUlEIGdlbmVyYXRpb24gYmFzZWQgb24gdGhlIGRlcGxveW1lbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlQXNzaWdubWVudFByb3BzIGV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSByb2xlIGRlZmluaXRpb24gSUQgdG8gYXNzaWduXG4gICAqIFRoaXMgY2FuIGJlIGEgYnVpbHQtaW4gb3IgY3VzdG9tIHJvbGUgZGVmaW5pdGlvblxuICAgKiBSZXF1aXJlZCBwcm9wZXJ0eVxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZURlZmluaXRpb25zL2FjZGQ3MmE3LTMzODUtNDhlZi1iZDQyLWY2MDZmYmE4MWFlN1wiIChSZWFkZXIpXG4gICAqIEBleGFtcGxlIFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMvYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCIgKENvbnRyaWJ1dG9yKVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZURlZmluaXRpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIElEIChvYmplY3QgSUQpIHRvIHdoaWNoIHRoZSByb2xlIGlzIGFzc2lnbmVkXG4gICAqIFRoaXMgY2FuIGJlIGEgdXNlciwgZ3JvdXAsIHNlcnZpY2UgcHJpbmNpcGFsLCBvciBtYW5hZ2VkIGlkZW50aXR5XG4gICAqIFJlcXVpcmVkIHByb3BlcnR5XG4gICAqXG4gICAqIEBleGFtcGxlIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCJcbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSBhdCB3aGljaCB0aGUgcm9sZSBhc3NpZ25tZW50IGlzIGFwcGxpZWRcbiAgICogQ2FuIGJlIGEgc3Vic2NyaXB0aW9uLCByZXNvdXJjZSBncm91cCwgb3IgcmVzb3VyY2VcbiAgICogUmVxdWlyZWQgcHJvcGVydHlcbiAgICpcbiAgICogQGV4YW1wbGUgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIlxuICAgKiBAZXhhbXBsZSBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9yZXNvdXJjZUdyb3Vwcy9yZy1uYW1lXCJcbiAgICogQGV4YW1wbGUgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvcmVzb3VyY2VHcm91cHMvcmctbmFtZS9wcm92aWRlcnMvTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL3N0b3JhZ2UtbmFtZVwiXG4gICAqL1xuICByZWFkb25seSBzY29wZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwcmluY2lwYWxcbiAgICogU3BlY2lmaWVzIHdoYXQga2luZCBvZiBpZGVudGl0eSBpcyBiZWluZyBhc3NpZ25lZCB0aGUgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgKEF6dXJlIHdpbGwgYXV0by1kZXRlY3QpXG4gICAqIEBleGFtcGxlIFwiVXNlclwiIC0gQW4gQXp1cmUgQUQgdXNlclxuICAgKiBAZXhhbXBsZSBcIkdyb3VwXCIgLSBBbiBBenVyZSBBRCBncm91cFxuICAgKiBAZXhhbXBsZSBcIlNlcnZpY2VQcmluY2lwYWxcIiAtIEEgc2VydmljZSBwcmluY2lwYWwgKGFwcGxpY2F0aW9uKVxuICAgKiBAZXhhbXBsZSBcIkZvcmVpZ25Hcm91cFwiIC0gQSBncm91cCBmcm9tIGV4dGVybmFsIGRpcmVjdG9yeVxuICAgKiBAZXhhbXBsZSBcIkRldmljZVwiIC0gQSBkZXZpY2UgaWRlbnRpdHlcbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIGFzc2lnbm1lbnQgZGVzY3JpcHRpb25cbiAgICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2h5IHRoZSBhc3NpZ25tZW50IHdhcyBtYWRlXG4gICAqXG4gICAqIEBleGFtcGxlIFwiR3JhbnRzIHJlYWQgYWNjZXNzIHRvIG1vbml0b3JpbmcgdGVhbSBmb3IgcmVzb3VyY2UgZGlhZ25vc3RpY3NcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIG9uIHRoZSByb2xlIGFzc2lnbm1lbnRcbiAgICogTGltaXRzIHRoZSByZXNvdXJjZXMgaXQgYXBwbGllcyB0byB1c2luZyBBQkFDIGV4cHJlc3Npb25zXG4gICAqIFJlcXVpcmVzIGNvbmRpdGlvblZlcnNpb24gdG8gYmUgc2V0IHdoZW4gdXNlZFxuICAgKlxuICAgKiBAZXhhbXBsZSBcIkBSZXNvdXJjZVtNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvYmxvYlNlcnZpY2VzL2NvbnRhaW5lcnM6bmFtZV0gU3RyaW5nRXF1YWxzICdsb2dzJ1wiXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGNvbmRpdGlvbiBzeW50YXhcbiAgICogUmVxdWlyZWQgd2hlbiBjb25kaXRpb24gaXMgc3BlY2lmaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIjIuMFwiXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb25WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsZWdhdGVkIEF6dXJlIFJlc291cmNlIElkIHdoaWNoIGNvbnRhaW5zIGEgTWFuYWdlZCBJZGVudGl0eVxuICAgKiBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0aGUgcHJpbmNpcGFsVHlwZSBpcyBHcm91cFxuICAgKiBVc2VkIGZvciBzY2VuYXJpb3Mgd2hlcmUgYSBncm91cCBhc3NpZ25tZW50IHNob3VsZCB1c2UgYSBzcGVjaWZpYyBtYW5hZ2VkIGlkZW50aXR5XG4gICAqXG4gICAqIEBleGFtcGxlIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL3Jlc291cmNlR3JvdXBzL3JnL3Byb3ZpZGVycy9NaWNyb3NvZnQuTWFuYWdlZElkZW50aXR5L3VzZXJBc3NpZ25lZElkZW50aXRpZXMvaWRlbnRpdHlcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZWdhdGVkTWFuYWdlZElkZW50aXR5UmVzb3VyY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpZmVjeWNsZSBydWxlcyB0byBpZ25vcmUgY2hhbmdlc1xuICAgKiBAZXhhbXBsZSBbXCJkZXNjcmlwdGlvblwiXVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgaW50ZXJmYWNlIGZvciBBenVyZSBSb2xlIEFzc2lnbm1lbnRcbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIEpTSUkgY29tcGxpYW5jZSB0byBzdXBwb3J0IG11bHRpLWxhbmd1YWdlIGNvZGUgZ2VuZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVBc3NpZ25tZW50UHJvcGVydGllcyB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBkZWZpbml0aW9uIElEXG4gICAqL1xuICByZWFkb25seSByb2xlRGVmaW5pdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgSURcbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSBvZiB0aGUgcm9sZSBhc3NpZ25tZW50XG4gICAqL1xuICByZWFkb25seSBzY29wZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwcmluY2lwYWxcbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIGFzc2lnbm1lbnQgZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9ucyBvbiB0aGUgcm9sZSBhc3NpZ25tZW50XG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGNvbmRpdGlvbiBzeW50YXhcbiAgICovXG4gIHJlYWRvbmx5IGNvbmRpdGlvblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWxlZ2F0ZWQgbWFuYWdlZCBpZGVudGl0eSByZXNvdXJjZSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZWdhdGVkTWFuYWdlZElkZW50aXR5UmVzb3VyY2VJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIFJvbGUgQXNzaWdubWVudCBBUEkgY2FsbHNcbiAqIFRoaXMgbWF0Y2hlcyB0aGUgQXp1cmUgUkVTVCBBUEkgc2NoZW1hIGZvciByb2xlIGFzc2lnbm1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZUFzc2lnbm1lbnRCb2R5IHtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByb2xlIGFzc2lnbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IFJvbGVBc3NpZ25tZW50UHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBVbmlmaWVkIEF6dXJlIFJvbGUgQXNzaWdubWVudCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW5nbGUsIHZlcnNpb24tYXdhcmUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIEF6dXJlXG4gKiBSb2xlIEFzc2lnbm1lbnRzLiBJdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiByZXNvbHV0aW9uLCBzY2hlbWEgdmFsaWRhdGlvbixcbiAqIGFuZCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbi5cbiAqXG4gKiAqKkltcG9ydGFudCBOb3RlczoqKlxuICogLSBSb2xlIGFzc2lnbm1lbnRzIGFyZSBzY29wZWQgcmVzb3VyY2VzIGRlcGxveWVkIGF0IHN1YnNjcmlwdGlvbiwgcmVzb3VyY2UgZ3JvdXAsXG4gKiAgIG9yIHJlc291cmNlIGxldmVsLiBUaGV5IGRvIG5vdCBoYXZlIGEgbG9jYXRpb24gcHJvcGVydHkgYXMgdGhleSBhcmUgbm90IHJlZ2lvbi1zcGVjaWZpYy5cbiAqIC0gVGhlIGBuYW1lYCBwcm9wZXJ0eSAoaW5oZXJpdGVkIGZyb20gQXphcGlSZXNvdXJjZVByb3BzKSBpcyBub3QgdXNlZC4gQXp1cmUgYXV0b21hdGljYWxseVxuICogICBnZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIEdVSUQgZm9yIHJvbGUgYXNzaWdubWVudCBuYW1lcyBiYXNlZCBvbiB0aGUgZGVwbG95bWVudCBjb250ZXh0LlxuICogICBUaGlzIGVuc3VyZXMgaWRlbXBvdGVudCBkZXBsb3ltZW50cyB3aXRob3V0IGR1cGxpY2F0ZSByb2xlIGFzc2lnbm1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyByb2xlIGFzc2lnbm1lbnQgLSBBc3NpZ24gUmVhZGVyIHJvbGUgdG8gYSB1c2VyIGF0IHN1YnNjcmlwdGlvbiBzY29wZVxuICpcbiAqIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgUm9sZUFzc2lnbm1lbnQodGhpcywgXCJyZWFkZXItYXNzaWdubWVudFwiLCB7XG4gKiAgIHJvbGVEZWZpbml0aW9uSWQ6IFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMvYWNkZDcyYTctMzM4NS00OGVmLWJkNDItZjYwNmZiYTgxYWU3XCIsXG4gKiAgIHByaW5jaXBhbElkOiBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICogICBzY29wZTogXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAqICAgcHJpbmNpcGFsVHlwZTogXCJVc2VyXCIsXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVzb3VyY2UgZ3JvdXAgc2NvcGVkIGFzc2lnbm1lbnQgLSBBc3NpZ24gQ29udHJpYnV0b3IgdG8gYSBzZXJ2aWNlIHByaW5jaXBhbFxuICpcbiAqIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgUm9sZUFzc2lnbm1lbnQodGhpcywgXCJjb250cmlidXRvci1hc3NpZ25tZW50XCIsIHtcbiAqICAgcm9sZURlZmluaXRpb25JZDogXCIvcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy9iMjQ5ODhhYy02MTgwLTQyYTAtYWI4OC0yMGY3MzgyZGQyNGNcIixcbiAqICAgcHJpbmNpcGFsSWQ6IHNlcnZpY2VQcmluY2lwYWwub2JqZWN0SWQsXG4gKiAgIHNjb3BlOiByZXNvdXJjZUdyb3VwLmlkLFxuICogICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAqICAgZGVzY3JpcHRpb246IFwiR3JhbnRzIGNvbnRyaWJ1dG9yIGFjY2VzcyB0byB0aGUgZGVwbG95bWVudCBzZXJ2aWNlIHByaW5jaXBhbFwiLFxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIENvbmRpdGlvbmFsIGFzc2lnbm1lbnQgd2l0aCBBQkFDIC0gTGltaXQgYWNjZXNzIHRvIHNwZWNpZmljIHN0b3JhZ2UgY29udGFpbmVyc1xuICpcbiAqIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgUm9sZUFzc2lnbm1lbnQodGhpcywgXCJjb25kaXRpb25hbC1hc3NpZ25tZW50XCIsIHtcbiAqICAgcm9sZURlZmluaXRpb25JZDogc3RvcmFnZVJvbGUuaWQsXG4gKiAgIHByaW5jaXBhbElkOiB1c2VyLm9iamVjdElkLFxuICogICBzY29wZTogc3RvcmFnZUFjY291bnQuaWQsXG4gKiAgIHByaW5jaXBhbFR5cGU6IFwiVXNlclwiLFxuICogICBjb25kaXRpb246IFwiQFJlc291cmNlW01pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50cy9ibG9iU2VydmljZXMvY29udGFpbmVyczpuYW1lXSBTdHJpbmdFcXVhbHMgJ2xvZ3MnXCIsXG4gKiAgIGNvbmRpdGlvblZlcnNpb246IFwiMi4wXCIsXG4gKiAgIGRlc2NyaXB0aW9uOiBcIkdyYW50cyBhY2Nlc3Mgb25seSB0byB0aGUgbG9ncyBjb250YWluZXJcIixcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgUk9MRV9BU1NJR05NRU5UX1RZUEUsXG4gICAgICBBTExfUk9MRV9BU1NJR05NRU5UX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlucHV0IHByb3BlcnRpZXMgZm9yIHRoaXMgUm9sZSBBc3NpZ25tZW50IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IFJvbGVBc3NpZ25tZW50UHJvcHM7XG5cbiAgLy8gT3V0cHV0IHByb3BlcnRpZXMgZm9yIGVhc3kgYWNjZXNzIGFuZCByZWZlcmVuY2luZ1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICAvLyBQdWJsaWMgcHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF6dXJlIFJvbGUgQXNzaWdubWVudCB1c2luZyB0aGUgVmVyc2lvbmVkQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uIHJlc29sdXRpb24sIHNjaGVtYSByZWdpc3RyYXRpb24sXG4gICAqIHZhbGlkYXRpb24sIGFuZCByZXNvdXJjZSBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFuY2VcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgUm9sZSBBc3NpZ25tZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm9sZUFzc2lnbm1lbnRQcm9wcykge1xuICAgIC8vIEF6dXJlIFJvbGUgQXNzaWdubWVudHMgZG8gbm90IHN1cHBvcnQgdGFncyBhdCB0aGUgcmVzb3VyY2UgbGV2ZWwuXG4gICAgLy8gV2UgbXVzdCBzdHJpcCB0YWdzIGZyb20gcHJvcHMgYmVmb3JlIHBhc3NpbmcgdG8gdGhlIHBhcmVudCBjb25zdHJ1Y3RvclxuICAgIC8vIHRvIHByZXZlbnQgdGhlIEFaQVBJIHByb3ZpZGVyIGZyb20gaW5jbHVkaW5nIHRhZ3MgaW4gdGhlIHJlc291cmNlLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCB7IHRhZ3M6IF91bnVzZWRUYWdzLCAuLi5wcm9wc1dpdGhvdXRUYWdzIH0gPSBwcm9wcztcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzV2l0aG91dFRhZ3MgYXMgUm9sZUFzc2lnbm1lbnRQcm9wcyk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IHByb3BlcnRpZXMgZnJvbSB0aGUgQVpBUEkgcmVzb3VyY2Ugb3V0cHV0cyB1c2luZyBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvblxuXG4gICAgLy8gQ3JlYXRlIFRlcnJhZm9ybSBvdXRwdXRzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmcgZnJvbSBvdGhlciByZXNvdXJjZXNcbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBSb2xlIEFzc2lnbm1lbnRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBSb2xlIEFzc2lnbm1lbnRcIixcbiAgICB9KTtcblxuICAgIC8vIE92ZXJyaWRlIGxvZ2ljYWwgSURzIHRvIG1hdGNoIG9yaWdpbmFsIG5hbWluZyBjb252ZW50aW9uXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG5cbiAgICAvLyBBcHBseSBpZ25vcmUgY2hhbmdlcyBpZiBzcGVjaWZpZWRcbiAgICB0aGlzLl9hcHBseUlnbm9yZUNoYW5nZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFUVVJUkVEIEFCU1RSQUNUIE1FVEhPRFMgRlJPTSBBemFwaVJlc291cmNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gYXMgdGhlIGRlZmF1bHRcbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjItMDQtMDFcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciBSb2xlIEFzc2lnbm1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFJPTEVfQVNTSUdOTUVOVF9UWVBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqIFVzZXMgdGhlIGZyYW1ld29yaydzIHNjaGVtYSByZXNvbHV0aW9uIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgc2NoZW1hXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJlc291cmNlIGJvZHkgZm9yIHRoZSBBenVyZSBBUEkgY2FsbFxuICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBwcm9wZXJ0aWVzIGludG8gdGhlIEpTT04gZm9ybWF0IGV4cGVjdGVkIGJ5IEF6dXJlIFJFU1QgQVBJXG4gICAqXG4gICAqIE5vdGU6IFJvbGUgYXNzaWdubWVudHMgZG8gbm90IGhhdmUgYSBsb2NhdGlvbiBwcm9wZXJ0eSBhcyB0aGV5IGFyZVxuICAgKiBzY29wZWQgcmVzb3VyY2VzIChzdWJzY3JpcHRpb24sIHJlc291cmNlIGdyb3VwLCBvciByZXNvdXJjZSBsZXZlbCkuXG4gICAqIFRoZSBzY29wZSBwcm9wZXJ0eSBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlIGJvZHkgYXMgaXQncyByZWFkLW9ubHkgYW5kXG4gICAqIGF1dG9tYXRpY2FsbHkgZGVyaXZlZCBmcm9tIHRoZSBwYXJlbnRJZC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFJvbGVBc3NpZ25tZW50UHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgcm9sZURlZmluaXRpb25JZDogdHlwZWRQcm9wcy5yb2xlRGVmaW5pdGlvbklkLFxuICAgICAgICBwcmluY2lwYWxJZDogdHlwZWRQcm9wcy5wcmluY2lwYWxJZCxcbiAgICAgICAgLy8gTm90ZTogc2NvcGUgaXMgTk9UIGluY2x1ZGVkIGhlcmUgLSBpdCdzIHJlYWQtb25seSBhbmQgZGVyaXZlZCBmcm9tIHBhcmVudElkXG4gICAgICAgIHByaW5jaXBhbFR5cGU6IHR5cGVkUHJvcHMucHJpbmNpcGFsVHlwZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHR5cGVkUHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgIGNvbmRpdGlvbjogdHlwZWRQcm9wcy5jb25kaXRpb24sXG4gICAgICAgIGNvbmRpdGlvblZlcnNpb246IHR5cGVkUHJvcHMuY29uZGl0aW9uVmVyc2lvbixcbiAgICAgICAgZGVsZWdhdGVkTWFuYWdlZElkZW50aXR5UmVzb3VyY2VJZDpcbiAgICAgICAgICB0eXBlZFByb3BzLmRlbGVnYXRlZE1hbmFnZWRJZGVudGl0eVJlc291cmNlSWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBuYW1lIHJlc29sdXRpb24gdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBHVUlEcyBmb3Igcm9sZSBhc3NpZ25tZW50c1xuICAgKlxuICAgKiBSb2xlIGFzc2lnbm1lbnRzIHJlcXVpcmUgR1VJRCBmb3JtYXQgSURzLiBUaGlzIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyBhIGRldGVybWluaXN0aWNcbiAgICogVVVJRCBiYXNlZCBvbiB0aGUgcm9sZSBhc3NpZ25tZW50J3Mga2V5IHByb3BlcnRpZXMgdG8gZW5zdXJlOlxuICAgKiAtIFNhbWUgR1VJRCBpcyBnZW5lcmF0ZWQgb24gcmUtZGVwbG95bWVudHMgd2l0aCBzYW1lIHBhcmFtZXRlcnNcbiAgICogLSBJZGVtcG90ZW50IGRlcGxveW1lbnRzIChubyBkdXBsaWNhdGUgcm9sZSBhc3NpZ25tZW50cylcbiAgICogLSBDb25zaXN0ZW50IGJlaGF2aW9yIGFjcm9zcyBkZXBsb3ltZW50IHJ1bnNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlTmFtZShwcm9wczogQXphcGlSZXNvdXJjZVByb3BzKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgUm9sZUFzc2lnbm1lbnRQcm9wcztcblxuICAgIC8vIENyZWF0ZSBhIGRldGVybWluaXN0aWMgaGFzaCBmcm9tIGtleSByb2xlIGFzc2lnbm1lbnQgcHJvcGVydGllc1xuICAgIGNvbnN0IGhhc2hJbnB1dCA9IFtcbiAgICAgIHR5cGVkUHJvcHMuc2NvcGUsXG4gICAgICB0eXBlZFByb3BzLnJvbGVEZWZpbml0aW9uSWQsXG4gICAgICB0eXBlZFByb3BzLnByaW5jaXBhbElkLFxuICAgIF0uam9pbihcInxcIik7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaGFzaElucHV0KS5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICAvLyBDb252ZXJ0IGhhc2ggdG8gVVVJRCBmb3JtYXQgKDgtNC00LTQtMTIpXG4gICAgcmV0dXJuIFtcbiAgICAgIGhhc2guc3Vic3RyaW5nKDAsIDgpLFxuICAgICAgaGFzaC5zdWJzdHJpbmcoOCwgMTIpLFxuICAgICAgaGFzaC5zdWJzdHJpbmcoMTIsIDE2KSxcbiAgICAgIGhhc2guc3Vic3RyaW5nKDE2LCAyMCksXG4gICAgICBoYXNoLnN1YnN0cmluZygyMCwgMzIpLFxuICAgIF0uam9pbihcIi1cIik7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHBhcmVudCBJRCByZXNvbHV0aW9uIHRvIHVzZSB0aGUgc2NvcGUgZnJvbSBwcm9wc1xuICAgKiBSb2xlIGFzc2lnbm1lbnRzIGFyZSBzY29wZWQgcmVzb3VyY2VzIHdoZXJlIHRoZSBzY29wZSBJUyB0aGUgcGFyZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBSb2xlQXNzaWdubWVudFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLnNjb3BlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgRk9SIFJPTEUgQVNTSUdOTUVOVCBPUEVSQVRJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZnVsbCByZXNvdXJjZSBpZGVudGlmaWVyIGZvciB1c2UgaW4gb3RoZXIgQXp1cmUgcmVzb3VyY2VzXG4gICAqIEFsaWFzIGZvciB0aGUgaWQgcHJvcGVydHlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcm9sZSBkZWZpbml0aW9uIElEIHRoaXMgYXNzaWdubWVudCByZWZlcmVuY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvbGVEZWZpbml0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yb2xlRGVmaW5pdGlvbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHJpbmNpcGFsIElEIHRoYXQgd2FzIGdyYW50ZWQgdGhpcyByb2xlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucHJpbmNpcGFsSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzY29wZSBvZiB0aGlzIHJvbGUgYXNzaWdubWVudFxuICAgKi9cbiAgcHVibGljIGdldCBhc3NpZ25tZW50U2NvcGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zY29wZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHByaW5jaXBhbCB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbFR5cGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wcmluY2lwYWxUeXBlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGlnbm9yZSBjaGFuZ2VzIGxpZmVjeWNsZSBydWxlcyBpZiBzcGVjaWZpZWQgaW4gcHJvcHNcbiAgICogQWx3YXlzIGluY2x1ZGVzIGJvZHkucHJvcGVydGllcy5yb2xlRGVmaW5pdGlvbklkIHRvIGhhbmRsZSBBenVyZSBBUEkgZm9ybWF0IG5vcm1hbGl6YXRpb25cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5SWdub3JlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBBbHdheXMgaWdub3JlIHJvbGVEZWZpbml0aW9uSWQgZm9ybWF0IGNoYW5nZXMgZHVlIHRvIEF6dXJlIEFQSSBub3JtYWxpemF0aW9uXG4gICAgLy8gQXp1cmUgcmV0dXJucyBzdWJzY3JpcHRpb24tcXVhbGlmaWVkIGZvcm1hdCBidXQgYWNjZXB0cyBub24tcXVhbGlmaWVkIGZvcm1hdFxuICAgIGNvbnN0IGlnbm9yZUNoYW5nZXMgPSBbXG4gICAgICBcImJvZHkucHJvcGVydGllcy5yb2xlRGVmaW5pdGlvbklkXCIsXG4gICAgICAuLi4odGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzIHx8IFtdKSxcbiAgICBdO1xuXG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5hZGRPdmVycmlkZShcImxpZmVjeWNsZVwiLCB7XG4gICAgICBpZ25vcmVfY2hhbmdlczogaWdub3JlQ2hhbmdlcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for Azure Role Assignment
|
|
3
|
+
*
|
|
4
|
+
* This test demonstrates basic usage of the RoleAssignment construct
|
|
5
|
+
* and validates deployment, idempotency, and cleanup.
|
|
6
|
+
*
|
|
7
|
+
* The test assigns built-in Reader role to a test principal
|
|
8
|
+
* at subscription scope.
|
|
9
|
+
*
|
|
10
|
+
* Run with: npm run integration:nostream
|
|
11
|
+
*/
|
|
12
|
+
import "cdktf/lib/testing/adapters/jest";
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Integration test for Azure Role Assignment
|
|
4
|
+
*
|
|
5
|
+
* This test demonstrates basic usage of the RoleAssignment construct
|
|
6
|
+
* and validates deployment, idempotency, and cleanup.
|
|
7
|
+
*
|
|
8
|
+
* The test assigns built-in Reader role to a test principal
|
|
9
|
+
* at subscription scope.
|
|
10
|
+
*
|
|
11
|
+
* Run with: npm run integration:nostream
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const cdktf_1 = require("cdktf");
|
|
15
|
+
require("cdktf/lib/testing/adapters/jest");
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
|
|
18
|
+
const testing_1 = require("../../testing");
|
|
19
|
+
const metadata_1 = require("../../testing/lib/metadata");
|
|
20
|
+
const role_assignment_1 = require("../lib/role-assignment");
|
|
21
|
+
// Generate unique test run metadata for this test suite
|
|
22
|
+
const testMetadata = new metadata_1.TestRunMetadata("role-assignment-integration", {
|
|
23
|
+
maxAgeHours: 4,
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Example stack demonstrating Role Assignment usage
|
|
27
|
+
*/
|
|
28
|
+
class RoleAssignmentExampleStack extends testing_1.BaseTestStack {
|
|
29
|
+
constructor(scope, id) {
|
|
30
|
+
super(scope, id, {
|
|
31
|
+
testRunOptions: {
|
|
32
|
+
maxAgeHours: testMetadata.maxAgeHours,
|
|
33
|
+
autoCleanup: testMetadata.autoCleanup,
|
|
34
|
+
cleanupPolicy: testMetadata.cleanupPolicy,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// Configure AZAPI provider
|
|
38
|
+
new provider_1.AzapiProvider(this, "azapi", {});
|
|
39
|
+
// Get the subscription ID dynamically from Azure CLI or environment variable
|
|
40
|
+
let subscriptionId;
|
|
41
|
+
try {
|
|
42
|
+
subscriptionId =
|
|
43
|
+
process.env.ARM_SUBSCRIPTION_ID ||
|
|
44
|
+
(0, child_process_1.execSync)("az account show --query id -o tsv", {
|
|
45
|
+
encoding: "utf-8",
|
|
46
|
+
}).trim();
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new Error("Failed to get Azure subscription ID. Please ensure you are logged in with 'az login' or set ARM_SUBSCRIPTION_ID environment variable.");
|
|
50
|
+
}
|
|
51
|
+
const subscriptionScope = `/subscriptions/${subscriptionId}`;
|
|
52
|
+
// Get test principal ID from environment (required for integration tests)
|
|
53
|
+
// This should be the Object ID of a user, group, or service principal
|
|
54
|
+
const principalId = process.env.ARM_TEST_PRINCIPAL_ID ||
|
|
55
|
+
"00000000-0000-0000-0000-000000000001";
|
|
56
|
+
// Built-in Azure role definition IDs
|
|
57
|
+
const readerRoleId = "/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7";
|
|
58
|
+
const contributorRoleId = "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c";
|
|
59
|
+
// Example 1: Assign Reader role at subscription scope
|
|
60
|
+
// Note: name is not needed - Azure generates a deterministic GUID automatically
|
|
61
|
+
new role_assignment_1.RoleAssignment(this, "reader-assignment", {
|
|
62
|
+
roleDefinitionId: readerRoleId,
|
|
63
|
+
principalId: principalId,
|
|
64
|
+
scope: subscriptionScope,
|
|
65
|
+
principalType: "ServicePrincipal",
|
|
66
|
+
description: "Reader role assignment for integration testing",
|
|
67
|
+
tags: {
|
|
68
|
+
...this.systemTags(),
|
|
69
|
+
example: "basic",
|
|
70
|
+
role: "reader",
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// Example 2: Assign Contributor role at subscription scope with description
|
|
74
|
+
// Note: name is not needed - Azure generates a deterministic GUID automatically
|
|
75
|
+
new role_assignment_1.RoleAssignment(this, "contributor-assignment", {
|
|
76
|
+
roleDefinitionId: contributorRoleId,
|
|
77
|
+
principalId: principalId,
|
|
78
|
+
scope: subscriptionScope,
|
|
79
|
+
principalType: "ServicePrincipal",
|
|
80
|
+
description: "Contributor role assignment for integration testing - allows resource management but not role assignments",
|
|
81
|
+
tags: {
|
|
82
|
+
...this.systemTags(),
|
|
83
|
+
example: "advanced",
|
|
84
|
+
role: "contributor",
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
describe("Role Assignment Integration Test", () => {
|
|
90
|
+
it("should deploy, validate idempotency, and cleanup role assignment resources", () => {
|
|
91
|
+
const app = cdktf_1.Testing.app();
|
|
92
|
+
const stack = new RoleAssignmentExampleStack(app, "test-role-assignment");
|
|
93
|
+
const synthesized = cdktf_1.Testing.fullSynth(stack);
|
|
94
|
+
// This will:
|
|
95
|
+
// 1. Run terraform apply to deploy resources (role assignments)
|
|
96
|
+
// 2. Run terraform plan to check idempotency (no changes expected)
|
|
97
|
+
// 3. Run terraform destroy to cleanup resources
|
|
98
|
+
(0, testing_1.TerraformApplyCheckAndDestroy)(synthesized, { verifyCleanup: true });
|
|
99
|
+
}, 600000); // 10 minute timeout for deployment and cleanup
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1hc3NpZ25tZW50LmludGVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXJvbGVhc3NpZ25tZW50L3Rlc3Qvcm9sZS1hc3NpZ25tZW50LmludGVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOztBQUVILGlDQUFnQztBQUVoQywyQ0FBeUM7QUFDekMsaURBQXlDO0FBQ3pDLGtGQUFvRjtBQUNwRiwyQ0FBNkU7QUFDN0UseURBQTZEO0FBQzdELDREQUF3RDtBQUV4RCx3REFBd0Q7QUFDeEQsTUFBTSxZQUFZLEdBQUcsSUFBSSwwQkFBZSxDQUFDLDZCQUE2QixFQUFFO0lBQ3RFLFdBQVcsRUFBRSxDQUFDO0NBQ2YsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLDBCQUEyQixTQUFRLHVCQUFhO0lBQ3BELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsY0FBYyxFQUFFO2dCQUNkLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztnQkFDckMsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxhQUFhLEVBQUUsWUFBWSxDQUFDLGFBQWE7YUFDMUM7U0FDRixDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckMsNkVBQTZFO1FBQzdFLElBQUksY0FBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxjQUFjO2dCQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CO29CQUMvQixJQUFBLHdCQUFRLEVBQUMsbUNBQW1DLEVBQUU7d0JBQzVDLFFBQVEsRUFBRSxPQUFPO3FCQUNsQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUlBQXVJLENBQ3hJLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsY0FBYyxFQUFFLENBQUM7UUFFN0QsMEVBQTBFO1FBQzFFLHNFQUFzRTtRQUN0RSxNQUFNLFdBQVcsR0FDZixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtZQUNqQyxzQ0FBc0MsQ0FBQztRQUV6QyxxQ0FBcUM7UUFDckMsTUFBTSxZQUFZLEdBQ2hCLHlGQUF5RixDQUFDO1FBQzVGLE1BQU0saUJBQWlCLEdBQ3JCLHlGQUF5RixDQUFDO1FBRTVGLHNEQUFzRDtRQUN0RCxnRkFBZ0Y7UUFDaEYsSUFBSSxnQ0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUM1QyxnQkFBZ0IsRUFBRSxZQUFZO1lBQzlCLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLEtBQUssRUFBRSxpQkFBaUI7WUFDeEIsYUFBYSxFQUFFLGtCQUFrQjtZQUNqQyxXQUFXLEVBQUUsZ0RBQWdEO1lBQzdELElBQUksRUFBRTtnQkFDSixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixJQUFJLEVBQUUsUUFBUTthQUNmO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLGdGQUFnRjtRQUNoRixJQUFJLGdDQUFjLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ2pELGdCQUFnQixFQUFFLGlCQUFpQjtZQUNuQyxXQUFXLEVBQUUsV0FBVztZQUN4QixLQUFLLEVBQUUsaUJBQWlCO1lBQ3hCLGFBQWEsRUFBRSxrQkFBa0I7WUFDakMsV0FBVyxFQUNULDJHQUEyRztZQUM3RyxJQUFJLEVBQUU7Z0JBQ0osR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQixPQUFPLEVBQUUsVUFBVTtnQkFDbkIsSUFBSSxFQUFFLGFBQWE7YUFDcEI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCxRQUFRLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO0lBQ2hELEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxHQUFHLEVBQUU7UUFDcEYsTUFBTSxHQUFHLEdBQUcsZUFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksMEJBQTBCLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDMUUsTUFBTSxXQUFXLEdBQUcsZUFBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxhQUFhO1FBQ2IsZ0VBQWdFO1FBQ2hFLG1FQUFtRTtRQUNuRSxnREFBZ0Q7UUFDaEQsSUFBQSx1Q0FBNkIsRUFBQyxXQUFXLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywrQ0FBK0M7QUFDN0QsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVncmF0aW9uIHRlc3QgZm9yIEF6dXJlIFJvbGUgQXNzaWdubWVudFxuICpcbiAqIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNhZ2Ugb2YgdGhlIFJvbGVBc3NpZ25tZW50IGNvbnN0cnVjdFxuICogYW5kIHZhbGlkYXRlcyBkZXBsb3ltZW50LCBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAuXG4gKlxuICogVGhlIHRlc3QgYXNzaWducyBidWlsdC1pbiBSZWFkZXIgcm9sZSB0byBhIHRlc3QgcHJpbmNpcGFsXG4gKiBhdCBzdWJzY3JpcHRpb24gc2NvcGUuXG4gKlxuICogUnVuIHdpdGg6IG5wbSBydW4gaW50ZWdyYXRpb246bm9zdHJlYW1cbiAqL1xuXG5pbXBvcnQgeyBUZXN0aW5nIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IFwiY2RrdGYvbGliL3Rlc3RpbmcvYWRhcHRlcnMvamVzdFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgQXphcGlQcm92aWRlciB9IGZyb20gXCIuLi8uLi9jb3JlLWF6dXJlL2xpYi9hemFwaS9wcm92aWRlcnMtYXphcGkvcHJvdmlkZXJcIjtcbmltcG9ydCB7IEJhc2VUZXN0U3RhY2ssIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95IH0gZnJvbSBcIi4uLy4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IFRlc3RSdW5NZXRhZGF0YSB9IGZyb20gXCIuLi8uLi90ZXN0aW5nL2xpYi9tZXRhZGF0YVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vbGliL3JvbGUtYXNzaWdubWVudFwiO1xuXG4vLyBHZW5lcmF0ZSB1bmlxdWUgdGVzdCBydW4gbWV0YWRhdGEgZm9yIHRoaXMgdGVzdCBzdWl0ZVxuY29uc3QgdGVzdE1ldGFkYXRhID0gbmV3IFRlc3RSdW5NZXRhZGF0YShcInJvbGUtYXNzaWdubWVudC1pbnRlZ3JhdGlvblwiLCB7XG4gIG1heEFnZUhvdXJzOiA0LFxufSk7XG5cbi8qKlxuICogRXhhbXBsZSBzdGFjayBkZW1vbnN0cmF0aW5nIFJvbGUgQXNzaWdubWVudCB1c2FnZVxuICovXG5jbGFzcyBSb2xlQXNzaWdubWVudEV4YW1wbGVTdGFjayBleHRlbmRzIEJhc2VUZXN0U3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXN0UnVuT3B0aW9uczoge1xuICAgICAgICBtYXhBZ2VIb3VyczogdGVzdE1ldGFkYXRhLm1heEFnZUhvdXJzLFxuICAgICAgICBhdXRvQ2xlYW51cDogdGVzdE1ldGFkYXRhLmF1dG9DbGVhbnVwLFxuICAgICAgICBjbGVhbnVwUG9saWN5OiB0ZXN0TWV0YWRhdGEuY2xlYW51cFBvbGljeSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDb25maWd1cmUgQVpBUEkgcHJvdmlkZXJcbiAgICBuZXcgQXphcGlQcm92aWRlcih0aGlzLCBcImF6YXBpXCIsIHt9KTtcblxuICAgIC8vIEdldCB0aGUgc3Vic2NyaXB0aW9uIElEIGR5bmFtaWNhbGx5IGZyb20gQXp1cmUgQ0xJIG9yIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgbGV0IHN1YnNjcmlwdGlvbklkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmlwdGlvbklkID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQVJNX1NVQlNDUklQVElPTl9JRCB8fFxuICAgICAgICBleGVjU3luYyhcImF6IGFjY291bnQgc2hvdyAtLXF1ZXJ5IGlkIC1vIHRzdlwiLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgfSkudHJpbSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGdldCBBenVyZSBzdWJzY3JpcHRpb24gSUQuIFBsZWFzZSBlbnN1cmUgeW91IGFyZSBsb2dnZWQgaW4gd2l0aCAnYXogbG9naW4nIG9yIHNldCBBUk1fU1VCU0NSSVBUSU9OX0lEIGVudmlyb25tZW50IHZhcmlhYmxlLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uU2NvcGUgPSBgL3N1YnNjcmlwdGlvbnMvJHtzdWJzY3JpcHRpb25JZH1gO1xuXG4gICAgLy8gR2V0IHRlc3QgcHJpbmNpcGFsIElEIGZyb20gZW52aXJvbm1lbnQgKHJlcXVpcmVkIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cylcbiAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgT2JqZWN0IElEIG9mIGEgdXNlciwgZ3JvdXAsIG9yIHNlcnZpY2UgcHJpbmNpcGFsXG4gICAgY29uc3QgcHJpbmNpcGFsSWQgPVxuICAgICAgcHJvY2Vzcy5lbnYuQVJNX1RFU1RfUFJJTkNJUEFMX0lEIHx8XG4gICAgICBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMVwiO1xuXG4gICAgLy8gQnVpbHQtaW4gQXp1cmUgcm9sZSBkZWZpbml0aW9uIElEc1xuICAgIGNvbnN0IHJlYWRlclJvbGVJZCA9XG4gICAgICBcIi9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZURlZmluaXRpb25zL2FjZGQ3MmE3LTMzODUtNDhlZi1iZDQyLWY2MDZmYmE4MWFlN1wiO1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9yUm9sZUlkID1cbiAgICAgIFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMvYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCI7XG5cbiAgICAvLyBFeGFtcGxlIDE6IEFzc2lnbiBSZWFkZXIgcm9sZSBhdCBzdWJzY3JpcHRpb24gc2NvcGVcbiAgICAvLyBOb3RlOiBuYW1lIGlzIG5vdCBuZWVkZWQgLSBBenVyZSBnZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIEdVSUQgYXV0b21hdGljYWxseVxuICAgIG5ldyBSb2xlQXNzaWdubWVudCh0aGlzLCBcInJlYWRlci1hc3NpZ25tZW50XCIsIHtcbiAgICAgIHJvbGVEZWZpbml0aW9uSWQ6IHJlYWRlclJvbGVJZCxcbiAgICAgIHByaW5jaXBhbElkOiBwcmluY2lwYWxJZCxcbiAgICAgIHNjb3BlOiBzdWJzY3JpcHRpb25TY29wZSxcbiAgICAgIHByaW5jaXBhbFR5cGU6IFwiU2VydmljZVByaW5jaXBhbFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUmVhZGVyIHJvbGUgYXNzaWdubWVudCBmb3IgaW50ZWdyYXRpb24gdGVzdGluZ1wiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgICAgZXhhbXBsZTogXCJiYXNpY1wiLFxuICAgICAgICByb2xlOiBcInJlYWRlclwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEV4YW1wbGUgMjogQXNzaWduIENvbnRyaWJ1dG9yIHJvbGUgYXQgc3Vic2NyaXB0aW9uIHNjb3BlIHdpdGggZGVzY3JpcHRpb25cbiAgICAvLyBOb3RlOiBuYW1lIGlzIG5vdCBuZWVkZWQgLSBBenVyZSBnZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIEdVSUQgYXV0b21hdGljYWxseVxuICAgIG5ldyBSb2xlQXNzaWdubWVudCh0aGlzLCBcImNvbnRyaWJ1dG9yLWFzc2lnbm1lbnRcIiwge1xuICAgICAgcm9sZURlZmluaXRpb25JZDogY29udHJpYnV0b3JSb2xlSWQsXG4gICAgICBwcmluY2lwYWxJZDogcHJpbmNpcGFsSWQsXG4gICAgICBzY29wZTogc3Vic2NyaXB0aW9uU2NvcGUsXG4gICAgICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkNvbnRyaWJ1dG9yIHJvbGUgYXNzaWdubWVudCBmb3IgaW50ZWdyYXRpb24gdGVzdGluZyAtIGFsbG93cyByZXNvdXJjZSBtYW5hZ2VtZW50IGJ1dCBub3Qgcm9sZSBhc3NpZ25tZW50c1wiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgICAgZXhhbXBsZTogXCJhZHZhbmNlZFwiLFxuICAgICAgICByb2xlOiBcImNvbnRyaWJ1dG9yXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKFwiUm9sZSBBc3NpZ25tZW50IEludGVncmF0aW9uIFRlc3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBkZXBsb3ksIHZhbGlkYXRlIGlkZW1wb3RlbmN5LCBhbmQgY2xlYW51cCByb2xlIGFzc2lnbm1lbnQgcmVzb3VyY2VzXCIsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFJvbGVBc3NpZ25tZW50RXhhbXBsZVN0YWNrKGFwcCwgXCJ0ZXN0LXJvbGUtYXNzaWdubWVudFwiKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXMgKHJvbGUgYXNzaWdubWVudHMpXG4gICAgLy8gMi4gUnVuIHRlcnJhZm9ybSBwbGFuIHRvIGNoZWNrIGlkZW1wb3RlbmN5IChubyBjaGFuZ2VzIGV4cGVjdGVkKVxuICAgIC8vIDMuIFJ1biB0ZXJyYWZvcm0gZGVzdHJveSB0byBjbGVhbnVwIHJlc291cmNlc1xuICAgIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95KHN5bnRoZXNpemVkLCB7IHZlcmlmeUNsZWFudXA6IHRydWUgfSk7XG4gIH0sIDYwMDAwMCk7IC8vIDEwIG1pbnV0ZSB0aW1lb3V0IGZvciBkZXBsb3ltZW50IGFuZCBjbGVhbnVwXG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive tests for the unified RoleAssignment implementation
|
|
3
|
+
*
|
|
4
|
+
* This test suite validates the unified RoleAssignment class that uses
|
|
5
|
+
* the VersionedAzapiResource framework. Tests cover automatic version resolution,
|
|
6
|
+
* explicit version pinning, schema validation, property transformation, and
|
|
7
|
+
* role assignment-specific functionality.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|