@microsoft/terraform-cdk-constructs 1.9.0 → 1.10.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.
Files changed (165) hide show
  1. package/.jsii +55122 -31830
  2. package/API.md +74039 -46109
  3. package/lib/azure-actiongroup/lib/action-group.js +1 -1
  4. package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
  5. package/lib/azure-aks/lib/aks-cluster.js +1 -1
  6. package/lib/azure-applicationinsights/index.d.ts +7 -0
  7. package/lib/azure-applicationinsights/index.js +24 -0
  8. package/lib/azure-applicationinsights/lib/application-insights-schemas.d.ts +29 -0
  9. package/lib/azure-applicationinsights/lib/application-insights-schemas.js +162 -0
  10. package/lib/azure-applicationinsights/lib/application-insights.d.ts +206 -0
  11. package/lib/azure-applicationinsights/lib/application-insights.js +209 -0
  12. package/lib/azure-applicationinsights/lib/index.d.ts +5 -0
  13. package/lib/azure-applicationinsights/lib/index.js +22 -0
  14. package/lib/azure-applicationinsights/test/application-insights.integ.d.ts +9 -0
  15. package/lib/azure-applicationinsights/test/application-insights.integ.js +84 -0
  16. package/lib/azure-applicationinsights/test/application-insights.spec.d.ts +8 -0
  17. package/lib/azure-applicationinsights/test/application-insights.spec.js +209 -0
  18. package/lib/azure-containerapps/index.d.ts +1 -0
  19. package/lib/azure-containerapps/index.js +18 -0
  20. package/lib/azure-containerapps/lib/container-app-environment-schemas.d.ts +50 -0
  21. package/lib/azure-containerapps/lib/container-app-environment-schemas.js +522 -0
  22. package/lib/azure-containerapps/lib/container-app-environment.d.ts +374 -0
  23. package/lib/azure-containerapps/lib/container-app-environment.js +310 -0
  24. package/lib/azure-containerapps/lib/container-app-schemas.d.ts +48 -0
  25. package/lib/azure-containerapps/lib/container-app-schemas.js +466 -0
  26. package/lib/azure-containerapps/lib/container-app.d.ts +925 -0
  27. package/lib/azure-containerapps/lib/container-app.js +320 -0
  28. package/lib/azure-containerapps/lib/index.d.ts +4 -0
  29. package/lib/azure-containerapps/lib/index.js +21 -0
  30. package/lib/azure-containerapps/test/container-app-environment.integ.d.ts +10 -0
  31. package/lib/azure-containerapps/test/container-app-environment.integ.js +82 -0
  32. package/lib/azure-containerapps/test/container-app-environment.spec.d.ts +9 -0
  33. package/lib/azure-containerapps/test/container-app-environment.spec.js +412 -0
  34. package/lib/azure-containerapps/test/container-app.integ.d.ts +10 -0
  35. package/lib/azure-containerapps/test/container-app.integ.js +119 -0
  36. package/lib/azure-containerapps/test/container-app.spec.d.ts +9 -0
  37. package/lib/azure-containerapps/test/container-app.spec.js +839 -0
  38. package/lib/azure-containerregistry/index.d.ts +1 -0
  39. package/lib/azure-containerregistry/index.js +18 -0
  40. package/lib/azure-containerregistry/lib/container-registry-schemas.d.ts +32 -0
  41. package/lib/azure-containerregistry/lib/container-registry-schemas.js +316 -0
  42. package/lib/azure-containerregistry/lib/container-registry.d.ts +330 -0
  43. package/lib/azure-containerregistry/lib/container-registry.js +217 -0
  44. package/lib/azure-containerregistry/lib/index.d.ts +2 -0
  45. package/lib/azure-containerregistry/lib/index.js +19 -0
  46. package/lib/azure-containerregistry/test/container-registry.integ.d.ts +9 -0
  47. package/lib/azure-containerregistry/test/container-registry.integ.js +101 -0
  48. package/lib/azure-containerregistry/test/container-registry.spec.d.ts +4 -0
  49. package/lib/azure-containerregistry/test/container-registry.spec.js +425 -0
  50. package/lib/azure-cosmosdb/index.d.ts +1 -0
  51. package/lib/azure-cosmosdb/index.js +18 -0
  52. package/lib/azure-cosmosdb/lib/cosmos-db-schemas.d.ts +40 -0
  53. package/lib/azure-cosmosdb/lib/cosmos-db-schemas.js +330 -0
  54. package/lib/azure-cosmosdb/lib/cosmos-db.d.ts +290 -0
  55. package/lib/azure-cosmosdb/lib/cosmos-db.js +222 -0
  56. package/lib/azure-cosmosdb/lib/index.d.ts +2 -0
  57. package/lib/azure-cosmosdb/lib/index.js +19 -0
  58. package/lib/azure-cosmosdb/test/cosmos-db.integ.d.ts +9 -0
  59. package/lib/azure-cosmosdb/test/cosmos-db.integ.js +98 -0
  60. package/lib/azure-cosmosdb/test/cosmos-db.spec.d.ts +4 -0
  61. package/lib/azure-cosmosdb/test/cosmos-db.spec.js +339 -0
  62. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
  63. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
  64. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
  65. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
  66. package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
  67. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
  68. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
  69. package/lib/azure-dnszone/lib/dns-zone.js +1 -1
  70. package/lib/azure-dnszone/lib/records/dns-records.js +10 -10
  71. package/lib/azure-functionapp/index.d.ts +1 -0
  72. package/lib/azure-functionapp/index.js +18 -0
  73. package/lib/azure-functionapp/lib/function-app-schemas.d.ts +32 -0
  74. package/lib/azure-functionapp/lib/function-app-schemas.js +303 -0
  75. package/lib/azure-functionapp/lib/function-app.d.ts +367 -0
  76. package/lib/azure-functionapp/lib/function-app.js +223 -0
  77. package/lib/azure-functionapp/lib/index.d.ts +2 -0
  78. package/lib/azure-functionapp/lib/index.js +19 -0
  79. package/lib/azure-functionapp/test/function-app.integ.d.ts +12 -0
  80. package/lib/azure-functionapp/test/function-app.integ.js +134 -0
  81. package/lib/azure-functionapp/test/function-app.spec.d.ts +4 -0
  82. package/lib/azure-functionapp/test/function-app.spec.js +566 -0
  83. package/lib/azure-keyvault/index.d.ts +1 -0
  84. package/lib/azure-keyvault/index.js +18 -0
  85. package/lib/azure-keyvault/lib/index.d.ts +2 -0
  86. package/lib/azure-keyvault/lib/index.js +19 -0
  87. package/lib/azure-keyvault/lib/key-vault-schemas.d.ts +40 -0
  88. package/lib/azure-keyvault/lib/key-vault-schemas.js +312 -0
  89. package/lib/azure-keyvault/lib/key-vault.d.ts +344 -0
  90. package/lib/azure-keyvault/lib/key-vault.js +243 -0
  91. package/lib/azure-keyvault/test/key-vault.integ.d.ts +9 -0
  92. package/lib/azure-keyvault/test/key-vault.integ.js +108 -0
  93. package/lib/azure-keyvault/test/key-vault.spec.d.ts +4 -0
  94. package/lib/azure-keyvault/test/key-vault.spec.js +264 -0
  95. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +1 -1
  96. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  97. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  98. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  99. package/lib/azure-networkwatcher/lib/network-watcher.js +1 -1
  100. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  101. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  102. package/lib/azure-policysetdefinition/lib/policy-set-definition.js +1 -1
  103. package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
  104. package/lib/azure-privatednszone/lib/records/private-dns-records.js +8 -8
  105. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  106. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  107. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  108. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  109. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  110. package/lib/azure-sreagent/index.d.ts +1 -0
  111. package/lib/azure-sreagent/index.js +18 -0
  112. package/lib/azure-sreagent/lib/index.d.ts +2 -0
  113. package/lib/azure-sreagent/lib/index.js +19 -0
  114. package/lib/azure-sreagent/lib/sre-agent-schemas.d.ts +29 -0
  115. package/lib/azure-sreagent/lib/sre-agent-schemas.js +296 -0
  116. package/lib/azure-sreagent/lib/sre-agent.d.ts +208 -0
  117. package/lib/azure-sreagent/lib/sre-agent.js +217 -0
  118. package/lib/azure-sreagent/test/sre-agent.integ.d.ts +9 -0
  119. package/lib/azure-sreagent/test/sre-agent.integ.js +78 -0
  120. package/lib/azure-sreagent/test/sre-agent.spec.d.ts +4 -0
  121. package/lib/azure-sreagent/test/sre-agent.spec.js +216 -0
  122. package/lib/azure-staticwebapp/index.d.ts +1 -0
  123. package/lib/azure-staticwebapp/index.js +18 -0
  124. package/lib/azure-staticwebapp/lib/index.d.ts +2 -0
  125. package/lib/azure-staticwebapp/lib/index.js +19 -0
  126. package/lib/azure-staticwebapp/lib/static-web-app-schemas.d.ts +40 -0
  127. package/lib/azure-staticwebapp/lib/static-web-app-schemas.js +236 -0
  128. package/lib/azure-staticwebapp/lib/static-web-app.d.ts +242 -0
  129. package/lib/azure-staticwebapp/lib/static-web-app.js +232 -0
  130. package/lib/azure-staticwebapp/test/static-web-app.integ.d.ts +9 -0
  131. package/lib/azure-staticwebapp/test/static-web-app.integ.js +76 -0
  132. package/lib/azure-staticwebapp/test/static-web-app.spec.d.ts +15 -0
  133. package/lib/azure-staticwebapp/test/static-web-app.spec.js +293 -0
  134. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  135. package/lib/azure-subnet/lib/subnet.js +1 -1
  136. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  137. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  138. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +1 -1
  139. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
  140. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  141. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  142. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  143. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  144. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  145. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  146. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  147. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  148. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  149. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  150. package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
  151. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  152. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  153. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  154. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  155. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  156. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  157. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  158. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  159. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  160. package/lib/index.d.ts +16 -0
  161. package/lib/index.js +18 -2
  162. package/lib/testing/index.js +2 -2
  163. package/lib/testing/lib/cleanup.js +1 -1
  164. package/lib/testing/lib/metadata.js +1 -1
  165. package/package.json +1 -1
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Unified Azure Key Vault implementation using AzapiResource framework
3
+ *
4
+ * This class provides a version-aware implementation for Azure Key Vault
5
+ * (Microsoft.KeyVault/vaults) that automatically handles version management,
6
+ * schema validation, and property transformation across all supported API versions.
7
+ *
8
+ * Supported API Versions:
9
+ * - 2023-02-01 (Active)
10
+ * - 2023-07-01 (Active)
11
+ * - 2024-11-01 (Active, Latest)
12
+ *
13
+ * Features:
14
+ * - Automatic latest version resolution when no version is specified
15
+ * - Explicit version pinning for stability requirements
16
+ * - Schema-driven validation and transformation
17
+ * - Full JSII compliance for multi-language support
18
+ * - Configurable SKU, tenant, RBAC and access policies
19
+ * - Network ACLs and public network access control
20
+ * - Soft-delete and purge protection support
21
+ */
22
+ import * as cdktf from "cdktf";
23
+ import { Construct } from "constructs";
24
+ import { AzapiResource, AzapiResourceProps } from "../../core-azure/lib/azapi/azapi-resource";
25
+ import { ApiSchema } from "../../core-azure/lib/version-manager/interfaces/version-interfaces";
26
+ /**
27
+ * SKU configuration for Key Vault
28
+ */
29
+ export interface KeyVaultSku {
30
+ /**
31
+ * The SKU name (standard or premium)
32
+ *
33
+ * @default "standard"
34
+ */
35
+ readonly name: "standard" | "premium";
36
+ /**
37
+ * The SKU family. Always "A" for Key Vault.
38
+ *
39
+ * @default "A"
40
+ */
41
+ readonly family?: string;
42
+ }
43
+ /**
44
+ * Permissions configuration for an access policy
45
+ */
46
+ export interface KeyVaultAccessPolicyPermissions {
47
+ /**
48
+ * Permissions for keys (e.g. "get", "list", "create", "delete")
49
+ */
50
+ readonly keys?: string[];
51
+ /**
52
+ * Permissions for secrets (e.g. "get", "list", "set", "delete")
53
+ */
54
+ readonly secrets?: string[];
55
+ /**
56
+ * Permissions for certificates (e.g. "get", "list", "create", "delete")
57
+ */
58
+ readonly certificates?: string[];
59
+ /**
60
+ * Permissions for storage (e.g. "get", "list", "set", "delete")
61
+ */
62
+ readonly storage?: string[];
63
+ }
64
+ /**
65
+ * Access policy configuration for the Key Vault
66
+ */
67
+ export interface KeyVaultAccessPolicy {
68
+ /**
69
+ * The Azure Active Directory tenant ID
70
+ */
71
+ readonly tenantId: string;
72
+ /**
73
+ * The object ID of a user, service principal, or security group in AAD
74
+ */
75
+ readonly objectId: string;
76
+ /**
77
+ * The application ID of the client making the request on behalf of the user
78
+ */
79
+ readonly applicationId?: string;
80
+ /**
81
+ * The permissions granted to the identity
82
+ */
83
+ readonly permissions: KeyVaultAccessPolicyPermissions;
84
+ }
85
+ /**
86
+ * IP rule for Key Vault network ACLs
87
+ */
88
+ export interface KeyVaultIpRule {
89
+ /**
90
+ * IP address or CIDR range
91
+ */
92
+ readonly value: string;
93
+ }
94
+ /**
95
+ * Virtual network rule for Key Vault network ACLs
96
+ */
97
+ export interface KeyVaultVirtualNetworkRule {
98
+ /**
99
+ * Virtual network subnet resource ID
100
+ */
101
+ readonly id: string;
102
+ /**
103
+ * Whether to ignore missing VNET service endpoint
104
+ */
105
+ readonly ignoreMissingVnetServiceEndpoint?: boolean;
106
+ }
107
+ /**
108
+ * Network ACL configuration for the Key Vault
109
+ */
110
+ export interface KeyVaultNetworkAcls {
111
+ /**
112
+ * Default action when no rule matches (Allow or Deny)
113
+ *
114
+ * @default "Allow"
115
+ */
116
+ readonly defaultAction?: "Allow" | "Deny";
117
+ /**
118
+ * Tells what traffic can bypass network rules. Can be 'AzureServices' or 'None'.
119
+ *
120
+ * @default "AzureServices"
121
+ */
122
+ readonly bypass?: "AzureServices" | "None";
123
+ /**
124
+ * IP rules for the Key Vault
125
+ */
126
+ readonly ipRules?: KeyVaultIpRule[];
127
+ /**
128
+ * Virtual network subnet rules for the Key Vault
129
+ */
130
+ readonly virtualNetworkRules?: KeyVaultVirtualNetworkRule[];
131
+ }
132
+ /**
133
+ * Properties for the unified Azure Key Vault
134
+ *
135
+ * Extends AzapiResourceProps with Key Vault specific properties.
136
+ */
137
+ export interface KeyVaultProps extends AzapiResourceProps {
138
+ /**
139
+ * Resource group ID where the Key Vault will be created
140
+ */
141
+ readonly resourceGroupId?: string;
142
+ /**
143
+ * The SKU (pricing tier) for the Key Vault
144
+ *
145
+ * @default { name: "standard", family: "A" }
146
+ */
147
+ readonly sku?: KeyVaultSku;
148
+ /**
149
+ * The Azure Active Directory tenant ID that should be used for authenticating
150
+ * requests to the Key Vault. If not provided, the current tenant ID from the
151
+ * AZAPI client configuration is used.
152
+ */
153
+ readonly tenantId?: string;
154
+ /**
155
+ * Access policies for the Key Vault.
156
+ *
157
+ * Only applicable when `enableRbacAuthorization` is false.
158
+ */
159
+ readonly accessPolicies?: KeyVaultAccessPolicy[];
160
+ /**
161
+ * Network ACL configuration for the Key Vault
162
+ */
163
+ readonly networkAcls?: KeyVaultNetworkAcls;
164
+ /**
165
+ * Whether Azure Virtual Machines are permitted to retrieve certificates
166
+ * stored as secrets from the Key Vault.
167
+ *
168
+ * @default false
169
+ */
170
+ readonly enabledForDeployment?: boolean;
171
+ /**
172
+ * Whether Azure Disk Encryption is permitted to retrieve secrets from the
173
+ * Key Vault and unwrap keys.
174
+ *
175
+ * @default false
176
+ */
177
+ readonly enabledForDiskEncryption?: boolean;
178
+ /**
179
+ * Whether Azure Resource Manager is permitted to retrieve secrets from the
180
+ * Key Vault.
181
+ *
182
+ * @default false
183
+ */
184
+ readonly enabledForTemplateDeployment?: boolean;
185
+ /**
186
+ * Whether Azure RBAC is used to authorize data actions instead of access
187
+ * policies.
188
+ *
189
+ * @default true
190
+ */
191
+ readonly enableRbacAuthorization?: boolean;
192
+ /**
193
+ * Whether soft-delete is enabled on the Key Vault.
194
+ *
195
+ * @default true
196
+ */
197
+ readonly enableSoftDelete?: boolean;
198
+ /**
199
+ * Number of days that items should be retained after soft-delete (7-90).
200
+ *
201
+ * @default 90
202
+ */
203
+ readonly softDeleteRetentionInDays?: number;
204
+ /**
205
+ * Whether purge protection is enabled. Once enabled, this property cannot
206
+ * be disabled.
207
+ */
208
+ readonly enablePurgeProtection?: boolean;
209
+ /**
210
+ * Whether the Key Vault accepts traffic from public networks.
211
+ *
212
+ * @default "Enabled"
213
+ */
214
+ readonly publicNetworkAccess?: "Enabled" | "Disabled";
215
+ /**
216
+ * Properties to ignore during updates
217
+ *
218
+ * @example ["tags"]
219
+ */
220
+ readonly ignoreChanges?: string[];
221
+ }
222
+ /**
223
+ * Key Vault properties for the request body
224
+ */
225
+ export interface KeyVaultBodyProperties {
226
+ readonly tenantId: string;
227
+ readonly sku: KeyVaultSku;
228
+ readonly accessPolicies?: KeyVaultAccessPolicy[];
229
+ readonly networkAcls?: KeyVaultNetworkAcls;
230
+ readonly enabledForDeployment?: boolean;
231
+ readonly enabledForDiskEncryption?: boolean;
232
+ readonly enabledForTemplateDeployment?: boolean;
233
+ readonly enableRbacAuthorization?: boolean;
234
+ readonly enableSoftDelete?: boolean;
235
+ readonly softDeleteRetentionInDays?: number;
236
+ readonly enablePurgeProtection?: boolean;
237
+ readonly publicNetworkAccess?: string;
238
+ }
239
+ /**
240
+ * The resource body interface for Azure Key Vault API calls
241
+ */
242
+ export interface KeyVaultBody {
243
+ readonly location: string;
244
+ readonly tags?: {
245
+ [key: string]: string;
246
+ };
247
+ readonly properties: KeyVaultBodyProperties;
248
+ }
249
+ /**
250
+ * Unified Azure Key Vault implementation
251
+ *
252
+ * This class provides a single, version-aware implementation that automatically
253
+ * handles version resolution, schema validation, and property transformation
254
+ * while maintaining full JSII compliance.
255
+ *
256
+ * Azure Key Vault is a cloud service for securely storing and accessing secrets,
257
+ * keys, and certificates with centralized management and access control.
258
+ *
259
+ * @example
260
+ * // Basic usage with automatic version resolution and current tenant:
261
+ * const keyVault = new KeyVault(this, "kv", {
262
+ * name: "my-keyvault-1234",
263
+ * location: "eastus",
264
+ * resourceGroupId: resourceGroup.id,
265
+ * });
266
+ *
267
+ * @example
268
+ * // Usage with explicit version pinning and configuration:
269
+ * const keyVault = new KeyVault(this, "kv", {
270
+ * name: "my-keyvault-1234",
271
+ * location: "eastus",
272
+ * resourceGroupId: resourceGroup.id,
273
+ * sku: { name: "premium" },
274
+ * apiVersion: "2023-07-01",
275
+ * enablePurgeProtection: true,
276
+ * publicNetworkAccess: "Disabled",
277
+ * networkAcls: {
278
+ * defaultAction: "Deny",
279
+ * bypass: "AzureServices",
280
+ * },
281
+ * });
282
+ *
283
+ * @stability stable
284
+ */
285
+ export declare class KeyVault extends AzapiResource {
286
+ /**
287
+ * The input properties for this Key Vault instance
288
+ */
289
+ readonly props: KeyVaultProps;
290
+ readonly idOutput: cdktf.TerraformOutput;
291
+ readonly locationOutput: cdktf.TerraformOutput;
292
+ readonly nameOutput: cdktf.TerraformOutput;
293
+ readonly tagsOutput: cdktf.TerraformOutput;
294
+ readonly vaultUriOutput: cdktf.TerraformOutput;
295
+ /**
296
+ * Creates a new Azure Key Vault using the AzapiResource framework
297
+ *
298
+ * @param scope - The scope in which to define this construct
299
+ * @param id - The unique identifier for this instance
300
+ * @param props - Configuration properties for the Key Vault
301
+ */
302
+ constructor(scope: Construct, id: string, props: KeyVaultProps);
303
+ /**
304
+ * Gets the default API version to use when no explicit version is specified
305
+ */
306
+ protected defaultVersion(): string;
307
+ /**
308
+ * Gets the Azure resource type for Key Vault
309
+ */
310
+ protected resourceType(): string;
311
+ /**
312
+ * Gets the API schema for the resolved version
313
+ */
314
+ protected apiSchema(): ApiSchema;
315
+ /**
316
+ * Indicates that location is required for Key Vaults
317
+ */
318
+ protected requiresLocation(): boolean;
319
+ /**
320
+ * Creates the resource body for the Azure API call
321
+ */
322
+ protected createResourceBody(props: any): any;
323
+ /**
324
+ * Get the data plane URI of the Key Vault
325
+ *
326
+ * Returns the deterministic Azure public cloud Key Vault URI in the form
327
+ * `https://{name}.vault.azure.net/`. This avoids depending on the AZAPI
328
+ * resource `output` attribute which is only populated for properties listed
329
+ * in `response_export_values`.
330
+ */
331
+ get vaultUri(): string;
332
+ /**
333
+ * Add a tag to the Key Vault
334
+ */
335
+ addTag(key: string, value: string): void;
336
+ /**
337
+ * Remove a tag from the Key Vault
338
+ */
339
+ removeTag(key: string): void;
340
+ /**
341
+ * Applies ignore changes lifecycle rules if specified in props
342
+ */
343
+ private _applyIgnoreChanges;
344
+ }
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.KeyVault = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Unified Azure Key Vault implementation using AzapiResource framework
8
+ *
9
+ * This class provides a version-aware implementation for Azure Key Vault
10
+ * (Microsoft.KeyVault/vaults) that automatically handles version management,
11
+ * schema validation, and property transformation across all supported API versions.
12
+ *
13
+ * Supported API Versions:
14
+ * - 2023-02-01 (Active)
15
+ * - 2023-07-01 (Active)
16
+ * - 2024-11-01 (Active, Latest)
17
+ *
18
+ * Features:
19
+ * - Automatic latest version resolution when no version is specified
20
+ * - Explicit version pinning for stability requirements
21
+ * - Schema-driven validation and transformation
22
+ * - Full JSII compliance for multi-language support
23
+ * - Configurable SKU, tenant, RBAC and access policies
24
+ * - Network ACLs and public network access control
25
+ * - Soft-delete and purge protection support
26
+ */
27
+ const cdktf = require("cdktf");
28
+ const key_vault_schemas_1 = require("./key-vault-schemas");
29
+ const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
30
+ const data_azapi_client_config_1 = require("../../core-azure/lib/azapi/providers-azapi/data-azapi-client-config");
31
+ /**
32
+ * Unified Azure Key Vault implementation
33
+ *
34
+ * This class provides a single, version-aware implementation that automatically
35
+ * handles version resolution, schema validation, and property transformation
36
+ * while maintaining full JSII compliance.
37
+ *
38
+ * Azure Key Vault is a cloud service for securely storing and accessing secrets,
39
+ * keys, and certificates with centralized management and access control.
40
+ *
41
+ * @example
42
+ * // Basic usage with automatic version resolution and current tenant:
43
+ * const keyVault = new KeyVault(this, "kv", {
44
+ * name: "my-keyvault-1234",
45
+ * location: "eastus",
46
+ * resourceGroupId: resourceGroup.id,
47
+ * });
48
+ *
49
+ * @example
50
+ * // Usage with explicit version pinning and configuration:
51
+ * const keyVault = new KeyVault(this, "kv", {
52
+ * name: "my-keyvault-1234",
53
+ * location: "eastus",
54
+ * resourceGroupId: resourceGroup.id,
55
+ * sku: { name: "premium" },
56
+ * apiVersion: "2023-07-01",
57
+ * enablePurgeProtection: true,
58
+ * publicNetworkAccess: "Disabled",
59
+ * networkAcls: {
60
+ * defaultAction: "Deny",
61
+ * bypass: "AzureServices",
62
+ * },
63
+ * });
64
+ *
65
+ * @stability stable
66
+ */
67
+ class KeyVault extends azapi_resource_1.AzapiResource {
68
+ /**
69
+ * Creates a new Azure Key Vault using the AzapiResource framework
70
+ *
71
+ * @param scope - The scope in which to define this construct
72
+ * @param id - The unique identifier for this instance
73
+ * @param props - Configuration properties for the Key Vault
74
+ */
75
+ constructor(scope, id, props) {
76
+ // Validate softDeleteRetentionInDays bounds before delegating to base class
77
+ if (props.softDeleteRetentionInDays !== undefined) {
78
+ if (props.softDeleteRetentionInDays < 7 ||
79
+ props.softDeleteRetentionInDays > 90) {
80
+ throw new Error("softDeleteRetentionInDays must be between 7 and 90 days");
81
+ }
82
+ }
83
+ // If tenantId is not provided, fall back to the current AZAPI client tenant.
84
+ // The DataAzapiClientConfig data source must be created on the parent scope
85
+ // so it is available before super() is called.
86
+ const resolvedTenantId = props.tenantId ??
87
+ (() => {
88
+ const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(scope, `${id}_client_config`, {});
89
+ return `\${${clientConfig.fqn}.tenant_id}`;
90
+ })();
91
+ super(scope, id, { ...props, tenantId: resolvedTenantId });
92
+ this.props = props;
93
+ // Create Terraform outputs
94
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
95
+ value: this.id,
96
+ description: "The ID of the Key Vault",
97
+ });
98
+ this.locationOutput = new cdktf.TerraformOutput(this, "location", {
99
+ value: `\${${this.terraformResource.fqn}.location}`,
100
+ description: "The location of the Key Vault",
101
+ });
102
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
103
+ value: `\${${this.terraformResource.fqn}.name}`,
104
+ description: "The name of the Key Vault",
105
+ });
106
+ this.tagsOutput = new cdktf.TerraformOutput(this, "tags", {
107
+ value: `\${${this.terraformResource.fqn}.tags}`,
108
+ description: "The tags assigned to the Key Vault",
109
+ });
110
+ this.vaultUriOutput = new cdktf.TerraformOutput(this, "vault_uri", {
111
+ value: this.vaultUri,
112
+ description: "The URI of the Key Vault for performing data plane operations",
113
+ });
114
+ // Override logical IDs
115
+ this.idOutput.overrideLogicalId("id");
116
+ this.locationOutput.overrideLogicalId("location");
117
+ this.nameOutput.overrideLogicalId("name");
118
+ this.tagsOutput.overrideLogicalId("tags");
119
+ this.vaultUriOutput.overrideLogicalId("vault_uri");
120
+ // Apply ignore changes if specified
121
+ this._applyIgnoreChanges();
122
+ }
123
+ // =============================================================================
124
+ // REQUIRED ABSTRACT METHODS FROM AzapiResource
125
+ // =============================================================================
126
+ /**
127
+ * Gets the default API version to use when no explicit version is specified
128
+ */
129
+ defaultVersion() {
130
+ return "2024-11-01";
131
+ }
132
+ /**
133
+ * Gets the Azure resource type for Key Vault
134
+ */
135
+ resourceType() {
136
+ return key_vault_schemas_1.KEY_VAULT_TYPE;
137
+ }
138
+ /**
139
+ * Gets the API schema for the resolved version
140
+ */
141
+ apiSchema() {
142
+ return this.resolveSchema();
143
+ }
144
+ /**
145
+ * Indicates that location is required for Key Vaults
146
+ */
147
+ requiresLocation() {
148
+ return true;
149
+ }
150
+ /**
151
+ * Creates the resource body for the Azure API call
152
+ */
153
+ createResourceBody(props) {
154
+ const typedProps = props;
155
+ const properties = {
156
+ tenantId: typedProps.tenantId,
157
+ sku: {
158
+ name: typedProps.sku?.name ?? "standard",
159
+ family: typedProps.sku?.family ?? "A",
160
+ },
161
+ enabledForDeployment: typedProps.enabledForDeployment ?? false,
162
+ enabledForDiskEncryption: typedProps.enabledForDiskEncryption ?? false,
163
+ enabledForTemplateDeployment: typedProps.enabledForTemplateDeployment ?? false,
164
+ enableRbacAuthorization: typedProps.enableRbacAuthorization ?? true,
165
+ enableSoftDelete: typedProps.enableSoftDelete ?? true,
166
+ softDeleteRetentionInDays: typedProps.softDeleteRetentionInDays ?? 90,
167
+ publicNetworkAccess: typedProps.publicNetworkAccess ?? "Enabled",
168
+ };
169
+ if (typedProps.enablePurgeProtection !== undefined) {
170
+ properties.enablePurgeProtection = typedProps.enablePurgeProtection;
171
+ }
172
+ // accessPolicies is only meaningful when RBAC authorization is disabled.
173
+ // Always include the array (Azure requires it) - default to empty.
174
+ properties.accessPolicies = typedProps.accessPolicies ?? [];
175
+ if (typedProps.networkAcls) {
176
+ properties.networkAcls = {
177
+ defaultAction: typedProps.networkAcls.defaultAction ?? "Allow",
178
+ bypass: typedProps.networkAcls.bypass ?? "AzureServices",
179
+ ipRules: typedProps.networkAcls.ipRules ?? [],
180
+ virtualNetworkRules: typedProps.networkAcls.virtualNetworkRules ?? [],
181
+ };
182
+ }
183
+ return {
184
+ location: this.location,
185
+ tags: this.allTags(),
186
+ properties,
187
+ };
188
+ }
189
+ // =============================================================================
190
+ // PUBLIC METHODS FOR KEY VAULT OPERATIONS
191
+ // =============================================================================
192
+ /**
193
+ * Get the data plane URI of the Key Vault
194
+ *
195
+ * Returns the deterministic Azure public cloud Key Vault URI in the form
196
+ * `https://{name}.vault.azure.net/`. This avoids depending on the AZAPI
197
+ * resource `output` attribute which is only populated for properties listed
198
+ * in `response_export_values`.
199
+ */
200
+ get vaultUri() {
201
+ return `https://\${${this.terraformResource.fqn}.name}.vault.azure.net/`;
202
+ }
203
+ /**
204
+ * Add a tag to the Key Vault
205
+ */
206
+ addTag(key, value) {
207
+ if (!this.props.tags) {
208
+ this.props.tags = {};
209
+ }
210
+ this.props.tags[key] = value;
211
+ }
212
+ /**
213
+ * Remove a tag from the Key Vault
214
+ */
215
+ removeTag(key) {
216
+ if (this.props.tags && this.props.tags[key]) {
217
+ delete this.props.tags[key];
218
+ }
219
+ }
220
+ // =============================================================================
221
+ // PRIVATE HELPER METHODS
222
+ // =============================================================================
223
+ /**
224
+ * Applies ignore changes lifecycle rules if specified in props
225
+ */
226
+ _applyIgnoreChanges() {
227
+ if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
228
+ this.terraformResource.addOverride("lifecycle", [
229
+ {
230
+ ignore_changes: this.props.ignoreChanges,
231
+ },
232
+ ]);
233
+ }
234
+ }
235
+ }
236
+ exports.KeyVault = KeyVault;
237
+ _a = JSII_RTTI_SYMBOL_1;
238
+ KeyVault[_a] = { fqn: "@microsoft/terraform-cdk-constructs.KeyVault", version: "1.10.0" };
239
+ // Static initializer runs once when the class is first loaded
240
+ (() => {
241
+ azapi_resource_1.AzapiResource.registerSchemas(key_vault_schemas_1.KEY_VAULT_TYPE, key_vault_schemas_1.ALL_KEY_VAULT_VERSIONS);
242
+ })();
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LXZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLWtleXZhdWx0L2xpYi9rZXktdmF1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCwrQkFBK0I7QUFFL0IsMkRBQTZFO0FBQzdFLDhFQUdtRDtBQUNuRCxrSEFBNEc7QUFpUTVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILE1BQWEsUUFBUyxTQUFRLDhCQUFhO0lBa0J6Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELDRFQUE0RTtRQUM1RSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRCxJQUNFLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxDQUFDO2dCQUNuQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsRUFBRSxFQUNwQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELENBQzFELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsK0NBQStDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQ3BCLEtBQUssQ0FBQyxRQUFRO1lBQ2QsQ0FBQyxHQUFHLEVBQUU7Z0JBQ0osTUFBTSxZQUFZLEdBQUcsSUFBSSxnREFBcUIsQ0FDNUMsS0FBSyxFQUNMLEdBQUcsRUFBRSxnQkFBZ0IsRUFDckIsRUFBRSxDQUNILENBQUM7Z0JBQ0YsT0FBTyxNQUFNLFlBQVksQ0FBQyxHQUFHLGFBQWEsQ0FBQztZQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQW1CLENBQUMsQ0FBQztRQUU1RSxJ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Q0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxHQUFXO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDO29CQUNFLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBOU5ILDRCQStOQzs7O0FBOU5DLDhEQUE4RDtBQUM5RDtJQUNFLDhCQUFhLENBQUMsZUFBZSxDQUFDLGtDQUFjLEVBQUUsMENBQXNCLENBQUMsQ0FBQztBQUN4RSxDQUFDLEdBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pZmllZCBBenVyZSBLZXkgVmF1bHQgaW1wbGVtZW50YXRpb24gdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdmVyc2lvbi1hd2FyZSBpbXBsZW1lbnRhdGlvbiBmb3IgQXp1cmUgS2V5IFZhdWx0XG4gKiAoTWljcm9zb2Z0LktleVZhdWx0L3ZhdWx0cykgdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiBtYW5hZ2VtZW50LFxuICogc2NoZW1hIHZhbGlkYXRpb24sIGFuZCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiBhY3Jvc3MgYWxsIHN1cHBvcnRlZCBBUEkgdmVyc2lvbnMuXG4gKlxuICogU3VwcG9ydGVkIEFQSSBWZXJzaW9uczpcbiAqIC0gMjAyMy0wMi0wMSAoQWN0aXZlKVxuICogLSAyMDIzLTA3LTAxIChBY3RpdmUpXG4gKiAtIDIwMjQtMTEtMDEgKEFjdGl2ZSwgTGF0ZXN0KVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiB3aGVuIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3Igc3RhYmlsaXR5IHJlcXVpcmVtZW50c1xuICogLSBTY2hlbWEtZHJpdmVuIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uXG4gKiAtIEZ1bGwgSlNJSSBjb21wbGlhbmNlIGZvciBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0XG4gKiAtIENvbmZpZ3VyYWJsZSBTS1UsIHRlbmFudCwgUkJBQyBhbmQgYWNjZXNzIHBvbGljaWVzXG4gKiAtIE5ldHdvcmsgQUNMcyBhbmQgcHVibGljIG5ldHdvcmsgYWNjZXNzIGNvbnRyb2xcbiAqIC0gU29mdC1kZWxldGUgYW5kIHB1cmdlIHByb3RlY3Rpb24gc3VwcG9ydFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFMTF9LRVlfVkFVTFRfVkVSU0lPTlMsIEtFWV9WQVVMVF9UWVBFIH0gZnJvbSBcIi4va2V5LXZhdWx0LXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBEYXRhQXphcGlDbGllbnRDb25maWcgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvYXphcGkvcHJvdmlkZXJzLWF6YXBpL2RhdGEtYXphcGktY2xpZW50LWNvbmZpZ1wiO1xuaW1wb3J0IHsgQXBpU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9pbnRlcmZhY2VzL3ZlcnNpb24taW50ZXJmYWNlc1wiO1xuXG4vKipcbiAqIFNLVSBjb25maWd1cmF0aW9uIGZvciBLZXkgVmF1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYXVsdFNrdSB7XG4gIC8qKlxuICAgKiBUaGUgU0tVIG5hbWUgKHN0YW5kYXJkIG9yIHByZW1pdW0pXG4gICAqXG4gICAqIEBkZWZhdWx0IFwic3RhbmRhcmRcIlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogXCJzdGFuZGFyZFwiIHwgXCJwcmVtaXVtXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBTS1UgZmFtaWx5LiBBbHdheXMgXCJBXCIgZm9yIEtleSBWYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBXCJcbiAgICovXG4gIHJlYWRvbmx5IGZhbWlseT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyBjb25maWd1cmF0aW9uIGZvciBhbiBhY2Nlc3MgcG9saWN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRBY2Nlc3NQb2xpY3lQZXJtaXNzaW9ucyB7XG4gIC8qKlxuICAgKiBQZXJtaXNzaW9ucyBmb3Iga2V5cyAoZS5nLiBcImdldFwiLCBcImxpc3RcIiwgXCJjcmVhdGVcIiwgXCJkZWxldGVcIilcbiAgICovXG4gIHJlYWRvbmx5IGtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVybWlzc2lvbnMgZm9yIHNlY3JldHMgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwic2V0XCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBlcm1pc3Npb25zIGZvciBjZXJ0aWZpY2F0ZXMgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwiY3JlYXRlXCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVybWlzc2lvbnMgZm9yIHN0b3JhZ2UgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwic2V0XCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWNjZXNzIHBvbGljeSBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRBY2Nlc3NQb2xpY3kge1xuICAvKipcbiAgICogVGhlIEF6dXJlIEFjdGl2ZSBEaXJlY3RvcnkgdGVuYW50IElEXG4gICAqL1xuICByZWFkb25seSB0ZW5hbnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IElEIG9mIGEgdXNlciwgc2VydmljZSBwcmluY2lwYWwsIG9yIHNlY3VyaXR5IGdyb3VwIGluIEFBRFxuICAgKi9cbiAgcmVhZG9ubHkgb2JqZWN0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIElEIG9mIHRoZSBjbGllbnQgbWFraW5nIHRoZSByZXF1ZXN0IG9uIGJlaGFsZiBvZiB0aGUgdXNlclxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIGlkZW50aXR5XG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uczogS2V5VmF1bHRBY2Nlc3NQb2xpY3lQZXJtaXNzaW9ucztcbn1cblxuLyoqXG4gKiBJUCBydWxlIGZvciBLZXkgVmF1bHQgbmV0d29yayBBQ0xzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRJcFJ1bGUge1xuICAvKipcbiAgICogSVAgYWRkcmVzcyBvciBDSURSIHJhbmdlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpcnR1YWwgbmV0d29yayBydWxlIGZvciBLZXkgVmF1bHQgbmV0d29yayBBQ0xzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRWaXJ0dWFsTmV0d29ya1J1bGUge1xuICAvKipcbiAgICogVmlydHVhbCBuZXR3b3JrIHN1Ym5ldCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgbWlzc2luZyBWTkVUIHNlcnZpY2UgZW5kcG9pbnRcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZU1pc3NpbmdWbmV0U2VydmljZUVuZHBvaW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIEFDTCBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHROZXR3b3JrQWNscyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGFjdGlvbiB3aGVuIG5vIHJ1bGUgbWF0Y2hlcyAoQWxsb3cgb3IgRGVueSlcbiAgICpcbiAgICogQGRlZmF1bHQgXCJBbGxvd1wiXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QWN0aW9uPzogXCJBbGxvd1wiIHwgXCJEZW55XCI7XG5cbiAgLyoqXG4gICAqIFRlbGxzIHdoYXQgdHJhZmZpYyBjYW4gYnlwYXNzIG5ldHdvcmsgcnVsZXMuIENhbiBiZSAnQXp1cmVTZXJ2aWNlcycgb3IgJ05vbmUnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkF6dXJlU2VydmljZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnlwYXNzPzogXCJBenVyZVNlcnZpY2VzXCIgfCBcIk5vbmVcIjtcblxuICAvKipcbiAgICogSVAgcnVsZXMgZm9yIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlwUnVsZXM/OiBLZXlWYXVsdElwUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIG5ldHdvcmsgc3VibmV0IHJ1bGVzIGZvciB0aGUgS2V5IFZhdWx0XG4gICAqL1xuICByZWFkb25seSB2aXJ0dWFsTmV0d29ya1J1bGVzPzogS2V5VmF1bHRWaXJ0dWFsTmV0d29ya1J1bGVbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgdW5pZmllZCBBenVyZSBLZXkgVmF1bHRcbiAqXG4gKiBFeHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB3aXRoIEtleSBWYXVsdCBzcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhdWx0UHJvcHMgZXh0ZW5kcyBBemFwaVJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogUmVzb3VyY2UgZ3JvdXAgSUQgd2hlcmUgdGhlIEtleSBWYXVsdCB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlR3JvdXBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNLVSAocHJpY2luZyB0aWVyKSBmb3IgdGhlIEtleSBWYXVsdFxuICAgKlxuICAgKiBAZGVmYXVsdCB7IG5hbWU6IFwic3RhbmRhcmRcIiwgZmFtaWx5OiBcIkFcIiB9XG4gICAqL1xuICByZWFkb25seSBza3U/OiBLZXlWYXVsdFNrdTtcblxuICAvKipcbiAgICogVGhlIEF6dXJlIEFjdGl2ZSBEaXJlY3RvcnkgdGVuYW50IElEIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW5nXG4gICAqIHJlcXVlc3RzIHRvIHRoZSBLZXkgVmF1bHQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGVuYW50IElEIGZyb20gdGhlXG4gICAqIEFaQVBJIGNsaWVudCBjb25maWd1cmF0aW9uIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB0ZW5hbnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXNzIHBvbGljaWVzIGZvciB0aGUgS2V5IFZhdWx0LlxuICAgKlxuICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiBgZW5hYmxlUmJhY0F1dGhvcml6YXRpb25gIGlzIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzUG9saWNpZXM/OiBLZXlWYXVsdEFjY2Vzc1BvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIEFDTCBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQWNscz86IEtleVZhdWx0TmV0d29ya0FjbHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgVmlydHVhbCBNYWNoaW5lcyBhcmUgcGVybWl0dGVkIHRvIHJldHJpZXZlIGNlcnRpZmljYXRlc1xuICAgKiBzdG9yZWQgYXMgc2VjcmV0cyBmcm9tIHRoZSBLZXkgVmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkRm9yRGVwbG95bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgRGlzayBFbmNyeXB0aW9uIGlzIHBlcm1pdHRlZCB0byByZXRyaWV2ZSBzZWNyZXRzIGZyb20gdGhlXG4gICAqIEtleSBWYXVsdCBhbmQgdW53cmFwIGtleXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkRm9yRGlza0VuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEF6dXJlIFJlc291cmNlIE1hbmFnZXIgaXMgcGVybWl0dGVkIHRvIHJldHJpZXZlIHNlY3JldHMgZnJvbSB0aGVcbiAgICogS2V5IFZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZEZvclRlbXBsYXRlRGVwbG95bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgUkJBQyBpcyB1c2VkIHRvIGF1dGhvcml6ZSBkYXRhIGFjdGlvbnMgaW5zdGVhZCBvZiBhY2Nlc3NcbiAgICogcG9saWNpZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVJiYWNBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBzb2Z0LWRlbGV0ZSBpcyBlbmFibGVkIG9uIHRoZSBLZXkgVmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNvZnREZWxldGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGF5cyB0aGF0IGl0ZW1zIHNob3VsZCBiZSByZXRhaW5lZCBhZnRlciBzb2Z0LWRlbGV0ZSAoNy05MCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDkwXG4gICAqL1xuICByZWFkb25seSBzb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHB1cmdlIHByb3RlY3Rpb24gaXMgZW5hYmxlZC4gT25jZSBlbmFibGVkLCB0aGlzIHByb3BlcnR5IGNhbm5vdFxuICAgKiBiZSBkaXNhYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVB1cmdlUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIEtleSBWYXVsdCBhY2NlcHRzIHRyYWZmaWMgZnJvbSBwdWJsaWMgbmV0d29ya3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiRW5hYmxlZFwiXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNOZXR3b3JrQWNjZXNzPzogXCJFbmFibGVkXCIgfCBcIkRpc2FibGVkXCI7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gaWdub3JlIGR1cmluZyB1cGRhdGVzXG4gICAqXG4gICAqIEBleGFtcGxlIFtcInRhZ3NcIl1cbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZUNoYW5nZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBLZXkgVmF1bHQgcHJvcGVydGllcyBmb3IgdGhlIHJlcXVlc3QgYm9keVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhdWx0Qm9keVByb3BlcnRpZXMge1xuICByZWFkb25seSB0ZW5hbnRJZDogc3RyaW5nO1xuICByZWFkb25seSBza3U6IEtleVZhdWx0U2t1O1xuICByZWFkb25seSBhY2Nlc3NQb2xpY2llcz86IEtleVZhdWx0QWNjZXNzUG9saWN5W107XG4gIHJlYWRvbmx5IG5ldHdvcmtBY2xzPzogS2V5VmF1bHROZXR3b3JrQWNscztcbiAgcmVhZG9ubHkgZW5hYmxlZEZvckRlcGxveW1lbnQ/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVkRm9yRGlza0VuY3J5cHRpb24/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVkRm9yVGVtcGxhdGVEZXBsb3ltZW50PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlUmJhY0F1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVTb2Z0RGVsZXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc29mdERlbGV0ZVJldGVudGlvbkluRGF5cz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHVibGljTmV0d29ya0FjY2Vzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIEtleSBWYXVsdCBBUEkgY2FsbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYXVsdEJvZHkge1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydGllczogS2V5VmF1bHRCb2R5UHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBVbmlmaWVkIEF6dXJlIEtleSBWYXVsdCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW5nbGUsIHZlcnNpb24tYXdhcmUgaW1wbGVtZW50YXRpb24gdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBoYW5kbGVzIHZlcnNpb24gcmVzb2x1dGlvbiwgc2NoZW1hIHZhbGlkYXRpb24sIGFuZCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvblxuICogd2hpbGUgbWFpbnRhaW5pbmcgZnVsbCBKU0lJIGNvbXBsaWFuY2UuXG4gKlxuICogQXp1cmUgS2V5IFZhdWx0IGlzIGEgY2xvdWQgc2VydmljZSBmb3Igc2VjdXJlbHkgc3RvcmluZyBhbmQgYWNjZXNzaW5nIHNlY3JldHMsXG4gKiBrZXlzLCBhbmQgY2VydGlmaWNhdGVzIHdpdGggY2VudHJhbGl6ZWQgbWFuYWdlbWVudCBhbmQgYWNjZXNzIGNvbnRyb2wuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHZlcnNpb24gcmVzb2x1dGlvbiBhbmQgY3VycmVudCB0ZW5hbnQ6XG4gKiBjb25zdCBrZXlWYXVsdCA9IG5ldyBLZXlWYXVsdCh0aGlzLCBcImt2XCIsIHtcbiAqICAgbmFtZTogXCJteS1rZXl2YXVsdC0xMjM0XCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVXNhZ2Ugd2l0aCBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgYW5kIGNvbmZpZ3VyYXRpb246XG4gKiBjb25zdCBrZXlWYXVsdCA9IG5ldyBLZXlWYXVsdCh0aGlzLCBcImt2XCIsIHtcbiAqICAgbmFtZTogXCJteS1rZXl2YXVsdC0xMjM0XCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiAgIHNrdTogeyBuYW1lOiBcInByZW1pdW1cIiB9LFxuICogICBhcGlWZXJzaW9uOiBcIjIwMjMtMDctMDFcIixcbiAqICAgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uOiB0cnVlLFxuICogICBwdWJsaWNOZXR3b3JrQWNjZXNzOiBcIkRpc2FibGVkXCIsXG4gKiAgIG5ldHdvcmtBY2xzOiB7XG4gKiAgICAgZGVmYXVsdEFjdGlvbjogXCJEZW55XCIsXG4gKiAgICAgYnlwYXNzOiBcIkF6dXJlU2VydmljZXNcIixcbiAqICAgfSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXlWYXVsdCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgcnVucyBvbmNlIHdoZW4gdGhlIGNsYXNzIGlzIGZpcnN0IGxvYWRlZFxuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKEtFWV9WQVVMVF9UWVBFLCBBTExfS0VZX1ZBVUxUX1ZFUlNJT05TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcHJvcGVydGllcyBmb3IgdGhpcyBLZXkgVmF1bHQgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogS2V5VmF1bHRQcm9wcztcblxuICAvLyBPdXRwdXQgcHJvcGVydGllcyBmb3IgZWFzeSBhY2Nlc3MgYW5kIHJlZmVyZW5jaW5nXG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYXRpb25PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IHRhZ3NPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IHZhdWx0VXJpT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXp1cmUgS2V5IFZhdWx0IHVzaW5nIHRoZSBBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBLZXlWYXVsdFByb3BzKSB7XG4gICAgLy8gVmFsaWRhdGUgc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyBib3VuZHMgYmVmb3JlIGRlbGVnYXRpbmcgdG8gYmFzZSBjbGFzc1xuICAgIGlmIChwcm9wcy5zb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA8IDcgfHxcbiAgICAgICAgcHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA+IDkwXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwic29mdERlbGV0ZVJldGVudGlvbkluRGF5cyBtdXN0IGJlIGJldHdlZW4gNyBhbmQgOTAgZGF5c1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRlbmFudElkIGlzIG5vdCBwcm92aWRlZCwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IEFaQVBJIGNsaWVudCB0ZW5hbnQuXG4gICAgLy8gVGhlIERhdGFBemFwaUNsaWVudENvbmZpZyBkYXRhIHNvdXJjZSBtdXN0IGJlIGNyZWF0ZWQgb24gdGhlIHBhcmVudCBzY29wZVxuICAgIC8vIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgc3VwZXIoKSBpcyBjYWxsZWQuXG4gICAgY29uc3QgcmVzb2x2ZWRUZW5hbnRJZCA9XG4gICAgICBwcm9wcy50ZW5hbnRJZCA/P1xuICAgICAgKCgpID0+IHtcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnID0gbmV3IERhdGFBemFwaUNsaWVudENvbmZpZyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBgJHtpZH1fY2xpZW50X2NvbmZpZ2AsXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBgXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0udGVuYW50X2lkfWA7XG4gICAgICB9KSgpO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IC4uLnByb3BzLCB0ZW5hbnRJZDogcmVzb2x2ZWRUZW5hbnRJZCB9IGFzIEtleVZhdWx0UHJvcHMpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIFRlcnJhZm9ybSBvdXRwdXRzXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgS2V5IFZhdWx0XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvY2F0aW9uT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImxvY2F0aW9uXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59LmxvY2F0aW9ufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbG9jYXRpb24gb2YgdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy50YWdzT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcInRhZ3NcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0udGFnc31gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRhZ3MgYXNzaWduZWQgdG8gdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy52YXVsdFVyaU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJ2YXVsdF91cmlcIiwge1xuICAgICAgdmFsdWU6IHRoaXMudmF1bHRVcmksXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJUaGUgVVJJIG9mIHRoZSBLZXkgVmF1bHQgZm9yIHBlcmZvcm1pbmcgZGF0YSBwbGFuZSBvcGVyYXRpb25zXCIsXG4gICAgfSk7XG5cbiAgICAvLyBPdmVycmlkZSBsb2dpY2FsIElEc1xuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLmxvY2F0aW9uT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibG9jYXRpb25cIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLnRhZ3NPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJ0YWdzXCIpO1xuICAgIHRoaXMudmF1bHRVcmlPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJ2YXVsdF91cmlcIik7XG5cbiAgICAvLyBBcHBseSBpZ25vcmUgY2hhbmdlcyBpZiBzcGVjaWZpZWRcbiAgICB0aGlzLl9hcHBseUlnbm9yZUNoYW5nZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFUVVJUkVEIEFCU1RSQUNUIE1FVEhPRFMgRlJPTSBBemFwaVJlc291cmNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjQtMTEtMDFcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciBLZXkgVmF1bHRcbiAgICovXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gS0VZX1ZBVUxUX1RZUEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIEtleSBWYXVsdHNcbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJlc291cmNlIGJvZHkgZm9yIHRoZSBBenVyZSBBUEkgY2FsbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgS2V5VmF1bHRQcm9wcztcblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IGFueSA9IHtcbiAgICAgIHRlbmFudElkOiB0eXBlZFByb3BzLnRlbmFudElkLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IHR5cGVkUHJvcHMuc2t1Py5uYW1lID8/IFwic3RhbmRhcmRcIixcbiAgICAgICAgZmFtaWx5OiB0eXBlZFByb3BzLnNrdT8uZmFtaWx5ID8/IFwiQVwiLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZWRGb3JEZXBsb3ltZW50OiB0eXBlZFByb3BzLmVuYWJsZWRGb3JEZXBsb3ltZW50ID8/IGZhbHNlLFxuICAgICAgZW5hYmxlZEZvckRpc2tFbmNyeXB0aW9uOiB0eXBlZFByb3BzLmVuYWJsZWRGb3JEaXNrRW5jcnlwdGlvbiA/PyBmYWxzZSxcbiAgICAgIGVuYWJsZWRGb3JUZW1wbGF0ZURlcGxveW1lbnQ6XG4gICAgICAgIHR5cGVkUHJvcHMuZW5hYmxlZEZvclRlbXBsYXRlRGVwbG95bWVudCA/PyBmYWxzZSxcbiAgICAgIGVuYWJsZVJiYWNBdXRob3JpemF0aW9uOiB0eXBlZFByb3BzLmVuYWJsZVJiYWNBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBlbmFibGVTb2Z0RGVsZXRlOiB0eXBlZFByb3BzLmVuYWJsZVNvZnREZWxldGUgPz8gdHJ1ZSxcbiAgICAgIHNvZnREZWxldGVSZXRlbnRpb25JbkRheXM6IHR5cGVkUHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA/PyA5MCxcbiAgICAgIHB1YmxpY05ldHdvcmtBY2Nlc3M6IHR5cGVkUHJvcHMucHVibGljTmV0d29ya0FjY2VzcyA/PyBcIkVuYWJsZWRcIixcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMuZW5hYmxlUHVyZ2VQcm90ZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuZW5hYmxlUHVyZ2VQcm90ZWN0aW9uID0gdHlwZWRQcm9wcy5lbmFibGVQdXJnZVByb3RlY3Rpb247XG4gICAgfVxuXG4gICAgLy8gYWNjZXNzUG9saWNpZXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gUkJBQyBhdXRob3JpemF0aW9uIGlzIGRpc2FibGVkLlxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIHRoZSBhcnJheSAoQXp1cmUgcmVxdWlyZXMgaXQpIC0gZGVmYXVsdCB0byBlbXB0eS5cbiAgICBwcm9wZXJ0aWVzLmFjY2Vzc1BvbGljaWVzID0gdHlwZWRQcm9wcy5hY2Nlc3NQb2xpY2llcyA/PyBbXTtcblxuICAgIGlmICh0eXBlZFByb3BzLm5ldHdvcmtBY2xzKSB7XG4gICAgICBwcm9wZXJ0aWVzLm5ldHdvcmtBY2xzID0ge1xuICAgICAgICBkZWZhdWx0QWN0aW9uOiB0eXBlZFByb3BzLm5ldHdvcmtBY2xzLmRlZmF1bHRBY3Rpb24gPz8gXCJBbGxvd1wiLFxuICAgICAgICBieXBhc3M6IHR5cGVkUHJvcHMubmV0d29ya0FjbHMuYnlwYXNzID8/IFwiQXp1cmVTZXJ2aWNlc1wiLFxuICAgICAgICBpcFJ1bGVzOiB0eXBlZFByb3BzLm5ldHdvcmtBY2xzLmlwUnVsZXMgPz8gW10sXG4gICAgICAgIHZpcnR1YWxOZXR3b3JrUnVsZXM6IHR5cGVkUHJvcHMubmV0d29ya0FjbHMudmlydHVhbE5ldHdvcmtSdWxlcyA/PyBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgdGFnczogdGhpcy5hbGxUYWdzKCksXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyBGT1IgS0VZIFZBVUxUIE9QRVJBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhIHBsYW5lIFVSSSBvZiB0aGUgS2V5IFZhdWx0XG4gICAqXG4gICAqIFJldHVybnMgdGhlIGRldGVybWluaXN0aWMgQXp1cmUgcHVibGljIGNsb3VkIEtleSBWYXVsdCBVUkkgaW4gdGhlIGZvcm1cbiAgICogYGh0dHBzOi8ve25hbWV9LnZhdWx0LmF6dXJlLm5ldC9gLiBUaGlzIGF2b2lkcyBkZXBlbmRpbmcgb24gdGhlIEFaQVBJXG4gICAqIHJlc291cmNlIGBvdXRwdXRgIGF0dHJpYnV0ZSB3aGljaCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgcHJvcGVydGllcyBsaXN0ZWRcbiAgICogaW4gYHJlc3BvbnNlX2V4cG9ydF92YWx1ZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCB2YXVsdFVyaSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cHM6Ly9cXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX0udmF1bHQuYXp1cmUubmV0L2A7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFnIHRvIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHB1YmxpYyBhZGRUYWcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMudGFncykge1xuICAgICAgKHRoaXMucHJvcHMgYXMgYW55KS50YWdzID0ge307XG4gICAgfVxuICAgIHRoaXMucHJvcHMudGFncyFba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhZyBmcm9tIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUYWcoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy50YWdzICYmIHRoaXMucHJvcHMudGFnc1trZXldKSB7XG4gICAgICBkZWxldGUgdGhpcy5wcm9wcy50YWdzW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGlnbm9yZSBjaGFuZ2VzIGxpZmVjeWNsZSBydWxlcyBpZiBzcGVjaWZpZWQgaW4gcHJvcHNcbiAgICovXG4gIHByaXZhdGUgX2FwcGx5SWdub3JlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzICYmIHRoaXMucHJvcHMuaWdub3JlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwibGlmZWN5Y2xlXCIsIFtcbiAgICAgICAge1xuICAgICAgICAgIGlnbm9yZV9jaGFuZ2VzOiB0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Integration test for Azure Key Vault
3
+ *
4
+ * This test demonstrates basic usage of the KeyVault construct
5
+ * and validates deployment, idempotency, and cleanup.
6
+ *
7
+ * Run with: npm run integration:nostream
8
+ */
9
+ import "cdktf/lib/testing/adapters/jest";