@microsoft/terraform-cdk-constructs 1.7.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +46476 -27231
- package/API.md +68443 -28286
- package/lib/azure-actiongroup/lib/action-group.js +1 -1
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
- package/lib/azure-aks/lib/aks-cluster.js +1 -1
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
- package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
- package/lib/azure-dnszone/lib/dns-zone.js +1 -1
- package/lib/azure-dnszone/lib/index.d.ts +1 -0
- package/lib/azure-dnszone/lib/index.js +2 -1
- package/lib/azure-dnszone/lib/records/dns-record-schemas.d.ts +68 -0
- package/lib/azure-dnszone/lib/records/dns-record-schemas.js +813 -0
- package/lib/azure-dnszone/lib/records/dns-records.d.ts +688 -0
- package/lib/azure-dnszone/lib/records/dns-records.js +924 -0
- package/lib/azure-dnszone/lib/records/index.d.ts +19 -0
- package/lib/azure-dnszone/lib/records/index.js +38 -0
- package/lib/azure-dnszone/test/dns-records.integ.d.ts +21 -0
- package/lib/azure-dnszone/test/dns-records.integ.js +321 -0
- package/lib/azure-dnszone/test/dns-records.spec.d.ts +20 -0
- package/lib/azure-dnszone/test/dns-records.spec.js +950 -0
- package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
- package/lib/azure-loganalyticsworkspace/index.js +23 -0
- package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
- package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
- package/lib/azure-metricalert/lib/metric-alert.js +1 -1
- package/lib/azure-networkinterface/lib/network-interface.js +1 -1
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
- package/lib/azure-networkwatcher/index.d.ts +14 -0
- package/lib/azure-networkwatcher/index.js +31 -0
- package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
- package/lib/azure-networkwatcher/lib/index.js +22 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
- package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
- package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
- package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
- package/lib/azure-policysetdefinition/index.d.ts +10 -0
- package/lib/azure-policysetdefinition/index.js +27 -0
- package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
- package/lib/azure-policysetdefinition/lib/index.js +22 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
- package/lib/azure-privatednszone/lib/index.d.ts +1 -0
- package/lib/azure-privatednszone/lib/index.js +2 -1
- package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +0 -2
- package/lib/azure-privatednszone/lib/private-dns-zone.js +6 -13
- package/lib/azure-privatednszone/lib/records/index.d.ts +7 -0
- package/lib/azure-privatednszone/lib/records/index.js +26 -0
- package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.d.ts +52 -0
- package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.js +683 -0
- package/lib/azure-privatednszone/lib/records/private-dns-records.d.ts +523 -0
- package/lib/azure-privatednszone/lib/records/private-dns-records.js +739 -0
- package/lib/azure-privatednszone/test/private-dns-records.integ.d.ts +19 -0
- package/lib/azure-privatednszone/test/private-dns-records.integ.js +245 -0
- package/lib/azure-privatednszone/test/private-dns-records.spec.d.ts +18 -0
- package/lib/azure-privatednszone/test/private-dns-records.spec.js +756 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.js +5 -5
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
- package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
- package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
- package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
- package/lib/azure-roledefinition/lib/role-definition.js +1 -1
- package/lib/azure-storageaccount/lib/storage-account.js +1 -1
- package/lib/azure-subnet/lib/subnet.js +1 -1
- package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
- package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
- package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
- package/lib/core-azure/lib/azapi/azapi-resource.js +4 -4
- 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 +1 -1
- 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/schema-mapper/schema-mapper.js +1 -1
- 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 +23 -0
- package/lib/index.js +25 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.js +1 -1
- package/lib/testing/lib/metadata.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure Public DNS Zone Records module
|
|
3
|
+
*
|
|
4
|
+
* This module exports all Public DNS Zone record types and their schemas.
|
|
5
|
+
*
|
|
6
|
+
* Supported Record Types:
|
|
7
|
+
* - DnsARecord (A records with IPv4 addresses)
|
|
8
|
+
* - DnsAaaaRecord (AAAA records with IPv6 addresses)
|
|
9
|
+
* - DnsCaaRecord (CAA records - PUBLIC DNS ONLY)
|
|
10
|
+
* - DnsCnameRecord (CNAME records)
|
|
11
|
+
* - DnsMxRecord (MX records)
|
|
12
|
+
* - DnsNsRecord (NS records - PUBLIC DNS ONLY)
|
|
13
|
+
* - DnsPtrRecord (PTR records)
|
|
14
|
+
* - DnsSoaRecord (SOA records)
|
|
15
|
+
* - DnsSrvRecord (SRV records)
|
|
16
|
+
* - DnsTxtRecord (TXT records)
|
|
17
|
+
*/
|
|
18
|
+
export * from "./dns-record-schemas";
|
|
19
|
+
export * from "./dns-records";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Azure Public DNS Zone Records module
|
|
4
|
+
*
|
|
5
|
+
* This module exports all Public DNS Zone record types and their schemas.
|
|
6
|
+
*
|
|
7
|
+
* Supported Record Types:
|
|
8
|
+
* - DnsARecord (A records with IPv4 addresses)
|
|
9
|
+
* - DnsAaaaRecord (AAAA records with IPv6 addresses)
|
|
10
|
+
* - DnsCaaRecord (CAA records - PUBLIC DNS ONLY)
|
|
11
|
+
* - DnsCnameRecord (CNAME records)
|
|
12
|
+
* - DnsMxRecord (MX records)
|
|
13
|
+
* - DnsNsRecord (NS records - PUBLIC DNS ONLY)
|
|
14
|
+
* - DnsPtrRecord (PTR records)
|
|
15
|
+
* - DnsSoaRecord (SOA records)
|
|
16
|
+
* - DnsSrvRecord (SRV records)
|
|
17
|
+
* - DnsTxtRecord (TXT records)
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
31
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
32
|
+
};
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
// Export schemas
|
|
35
|
+
__exportStar(require("./dns-record-schemas"), exports);
|
|
36
|
+
// Export record implementations
|
|
37
|
+
__exportStar(require("./dns-records"), exports);
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXp1cmUtZG5zem9uZS9saWIvcmVjb3Jkcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxpQkFBaUI7QUFDakIsdURBQXFDO0FBRXJDLGdDQUFnQztBQUNoQyxnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgWm9uZSBSZWNvcmRzIG1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgYWxsIFB1YmxpYyBETlMgWm9uZSByZWNvcmQgdHlwZXMgYW5kIHRoZWlyIHNjaGVtYXMuXG4gKlxuICogU3VwcG9ydGVkIFJlY29yZCBUeXBlczpcbiAqIC0gRG5zQVJlY29yZCAoQSByZWNvcmRzIHdpdGggSVB2NCBhZGRyZXNzZXMpXG4gKiAtIERuc0FhYWFSZWNvcmQgKEFBQUEgcmVjb3JkcyB3aXRoIElQdjYgYWRkcmVzc2VzKVxuICogLSBEbnNDYWFSZWNvcmQgKENBQSByZWNvcmRzIC0gUFVCTElDIEROUyBPTkxZKVxuICogLSBEbnNDbmFtZVJlY29yZCAoQ05BTUUgcmVjb3JkcylcbiAqIC0gRG5zTXhSZWNvcmQgKE1YIHJlY29yZHMpXG4gKiAtIERuc05zUmVjb3JkIChOUyByZWNvcmRzIC0gUFVCTElDIEROUyBPTkxZKVxuICogLSBEbnNQdHJSZWNvcmQgKFBUUiByZWNvcmRzKVxuICogLSBEbnNTb2FSZWNvcmQgKFNPQSByZWNvcmRzKVxuICogLSBEbnNTcnZSZWNvcmQgKFNSViByZWNvcmRzKVxuICogLSBEbnNUeHRSZWNvcmQgKFRYVCByZWNvcmRzKVxuICovXG5cbi8vIEV4cG9ydCBzY2hlbWFzXG5leHBvcnQgKiBmcm9tIFwiLi9kbnMtcmVjb3JkLXNjaGVtYXNcIjtcblxuLy8gRXhwb3J0IHJlY29yZCBpbXBsZW1lbnRhdGlvbnNcbmV4cG9ydCAqIGZyb20gXCIuL2Rucy1yZWNvcmRzXCI7XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for Azure Public DNS Zone Records
|
|
3
|
+
*
|
|
4
|
+
* This test demonstrates usage of all Public DNS record types
|
|
5
|
+
* and validates deployment, idempotency, and cleanup for child resources.
|
|
6
|
+
*
|
|
7
|
+
* Supported Record Types:
|
|
8
|
+
* - A record (IPv4 addresses, including alias records)
|
|
9
|
+
* - AAAA record (IPv6 addresses, including alias records)
|
|
10
|
+
* - CAA record (Certificate Authority Authorization - PUBLIC ONLY)
|
|
11
|
+
* - CNAME record (including alias records)
|
|
12
|
+
* - MX record
|
|
13
|
+
* - NS record (Name Server - PUBLIC ONLY)
|
|
14
|
+
* - PTR record
|
|
15
|
+
* - SRV record
|
|
16
|
+
* - TXT record
|
|
17
|
+
* - (SOA is managed by Azure automatically)
|
|
18
|
+
*
|
|
19
|
+
* Run with: npm run integration:nostream
|
|
20
|
+
*/
|
|
21
|
+
import "cdktf/lib/testing/adapters/jest";
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Integration test for Azure Public DNS Zone Records
|
|
4
|
+
*
|
|
5
|
+
* This test demonstrates usage of all Public DNS record types
|
|
6
|
+
* and validates deployment, idempotency, and cleanup for child resources.
|
|
7
|
+
*
|
|
8
|
+
* Supported Record Types:
|
|
9
|
+
* - A record (IPv4 addresses, including alias records)
|
|
10
|
+
* - AAAA record (IPv6 addresses, including alias records)
|
|
11
|
+
* - CAA record (Certificate Authority Authorization - PUBLIC ONLY)
|
|
12
|
+
* - CNAME record (including alias records)
|
|
13
|
+
* - MX record
|
|
14
|
+
* - NS record (Name Server - PUBLIC ONLY)
|
|
15
|
+
* - PTR record
|
|
16
|
+
* - SRV record
|
|
17
|
+
* - TXT record
|
|
18
|
+
* - (SOA is managed by Azure automatically)
|
|
19
|
+
*
|
|
20
|
+
* Run with: npm run integration:nostream
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
const cdktf_1 = require("cdktf");
|
|
24
|
+
require("cdktf/lib/testing/adapters/jest");
|
|
25
|
+
const resource_group_1 = require("../../azure-resourcegroup/lib/resource-group");
|
|
26
|
+
const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
|
|
27
|
+
const testing_1 = require("../../testing");
|
|
28
|
+
const metadata_1 = require("../../testing/lib/metadata");
|
|
29
|
+
const dns_zone_1 = require("../lib/dns-zone");
|
|
30
|
+
const records_1 = require("../lib/records");
|
|
31
|
+
// Generate unique test run metadata for this test suite
|
|
32
|
+
const testMetadata = new metadata_1.TestRunMetadata("dnsrec-integration", {
|
|
33
|
+
maxAgeHours: 4,
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Example stack demonstrating Public DNS Records usage
|
|
37
|
+
*
|
|
38
|
+
* Creates a Public DNS Zone and various record types within it.
|
|
39
|
+
*/
|
|
40
|
+
class DnsRecordsExampleStack extends testing_1.BaseTestStack {
|
|
41
|
+
constructor(scope, id) {
|
|
42
|
+
super(scope, id, {
|
|
43
|
+
testRunOptions: {
|
|
44
|
+
maxAgeHours: testMetadata.maxAgeHours,
|
|
45
|
+
autoCleanup: testMetadata.autoCleanup,
|
|
46
|
+
cleanupPolicy: testMetadata.cleanupPolicy,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
// Configure AZAPI provider
|
|
50
|
+
new provider_1.AzapiProvider(this, "azapi", {});
|
|
51
|
+
// Generate unique names
|
|
52
|
+
const resourceGroupName = this.generateResourceName("Microsoft.Resources/resourceGroups", "dnsrec");
|
|
53
|
+
// Create resource group for the DNS zone and records
|
|
54
|
+
const resourceGroup = new resource_group_1.ResourceGroup(this, "test-rg", {
|
|
55
|
+
name: resourceGroupName,
|
|
56
|
+
location: "eastus2",
|
|
57
|
+
tags: {
|
|
58
|
+
...this.systemTags(),
|
|
59
|
+
purpose: "public-dns-records-testing",
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
// Create Public DNS Zone - using a unique zone name
|
|
63
|
+
// Note: Public DNS zones require globally unique names
|
|
64
|
+
const zoneName = this.generateResourceName("Microsoft.Network/dnsZones", "rec");
|
|
65
|
+
const zone = new dns_zone_1.DnsZone(this, "public-dns-zone", {
|
|
66
|
+
name: `${zoneName}.com`,
|
|
67
|
+
location: "global",
|
|
68
|
+
resourceGroupId: resourceGroup.id,
|
|
69
|
+
tags: {
|
|
70
|
+
...this.systemTags(),
|
|
71
|
+
purpose: "dns-records-testing",
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
// =========================================================================
|
|
75
|
+
// A Record - Single IP
|
|
76
|
+
// =========================================================================
|
|
77
|
+
new records_1.DnsARecord(this, "a-record-single", {
|
|
78
|
+
name: "web",
|
|
79
|
+
dnsZoneId: zone.id,
|
|
80
|
+
ttl: 300,
|
|
81
|
+
records: [{ ipv4Address: "20.30.40.50" }],
|
|
82
|
+
metadata: {
|
|
83
|
+
purpose: "web-server",
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
// =========================================================================
|
|
87
|
+
// A Record - Multiple IPs (load balancing)
|
|
88
|
+
// =========================================================================
|
|
89
|
+
new records_1.DnsARecord(this, "a-record-multi", {
|
|
90
|
+
name: "api",
|
|
91
|
+
dnsZoneId: zone.id,
|
|
92
|
+
ttl: 300,
|
|
93
|
+
records: [
|
|
94
|
+
{ ipv4Address: "20.30.40.51" },
|
|
95
|
+
{ ipv4Address: "20.30.40.52" },
|
|
96
|
+
{ ipv4Address: "20.30.40.53" },
|
|
97
|
+
],
|
|
98
|
+
metadata: {
|
|
99
|
+
purpose: "api-servers-loadbalanced",
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
// =========================================================================
|
|
103
|
+
// AAAA Record - IPv6 addresses
|
|
104
|
+
// =========================================================================
|
|
105
|
+
new records_1.DnsAaaaRecord(this, "aaaa-record", {
|
|
106
|
+
name: "ipv6host",
|
|
107
|
+
dnsZoneId: zone.id,
|
|
108
|
+
ttl: 300,
|
|
109
|
+
records: [
|
|
110
|
+
{ ipv6Address: "2001:db8:85a3::8a2e:370:7334" },
|
|
111
|
+
{ ipv6Address: "2001:db8:85a3::8a2e:370:7335" },
|
|
112
|
+
],
|
|
113
|
+
metadata: {
|
|
114
|
+
purpose: "ipv6-servers",
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
// =========================================================================
|
|
118
|
+
// CAA Record - Certificate Authority Authorization (PUBLIC DNS ONLY)
|
|
119
|
+
// Specifies which CAs are allowed to issue certificates for this domain
|
|
120
|
+
// =========================================================================
|
|
121
|
+
new records_1.DnsCaaRecord(this, "caa-record", {
|
|
122
|
+
name: "@",
|
|
123
|
+
dnsZoneId: zone.id,
|
|
124
|
+
ttl: 3600,
|
|
125
|
+
records: [
|
|
126
|
+
{ flags: 0, tag: "issue", value: "letsencrypt.org" },
|
|
127
|
+
{ flags: 0, tag: "issue", value: "digicert.com" },
|
|
128
|
+
{ flags: 0, tag: "issuewild", value: "letsencrypt.org" },
|
|
129
|
+
{ flags: 0, tag: "iodef", value: "mailto:security@example.com" },
|
|
130
|
+
],
|
|
131
|
+
metadata: {
|
|
132
|
+
purpose: "certificate-authority-authorization",
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
// =========================================================================
|
|
136
|
+
// CNAME Record - Alias
|
|
137
|
+
// =========================================================================
|
|
138
|
+
new records_1.DnsCnameRecord(this, "cname-record", {
|
|
139
|
+
name: "www",
|
|
140
|
+
dnsZoneId: zone.id,
|
|
141
|
+
ttl: 3600,
|
|
142
|
+
cname: `web.${zoneName}.com`,
|
|
143
|
+
metadata: {
|
|
144
|
+
purpose: "alias-to-web",
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
// =========================================================================
|
|
148
|
+
// MX Record - Mail exchange servers
|
|
149
|
+
// =========================================================================
|
|
150
|
+
new records_1.DnsMxRecord(this, "mx-record", {
|
|
151
|
+
name: "@",
|
|
152
|
+
dnsZoneId: zone.id,
|
|
153
|
+
ttl: 3600,
|
|
154
|
+
records: [
|
|
155
|
+
{ preference: 10, exchange: `mail1.${zoneName}.com` },
|
|
156
|
+
{ preference: 20, exchange: `mail2.${zoneName}.com` },
|
|
157
|
+
{ preference: 30, exchange: "mail.backup-provider.com" },
|
|
158
|
+
],
|
|
159
|
+
metadata: {
|
|
160
|
+
purpose: "mail-servers",
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
// =========================================================================
|
|
164
|
+
// NS Record - Name server delegation (PUBLIC DNS ONLY)
|
|
165
|
+
// Used for delegating a subdomain to different name servers
|
|
166
|
+
// =========================================================================
|
|
167
|
+
new records_1.DnsNsRecord(this, "ns-record", {
|
|
168
|
+
name: "subdomain",
|
|
169
|
+
dnsZoneId: zone.id,
|
|
170
|
+
ttl: 3600,
|
|
171
|
+
records: [
|
|
172
|
+
{ nsdname: "ns1.subdomain-provider.com" },
|
|
173
|
+
{ nsdname: "ns2.subdomain-provider.com" },
|
|
174
|
+
],
|
|
175
|
+
metadata: {
|
|
176
|
+
purpose: "subdomain-delegation",
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
// =========================================================================
|
|
180
|
+
// PTR Record - Reverse DNS
|
|
181
|
+
// Note: In practice, PTR records are created in reverse DNS zones
|
|
182
|
+
// managed by IP address providers. This demonstrates the record structure.
|
|
183
|
+
// =========================================================================
|
|
184
|
+
new records_1.DnsPtrRecord(this, "ptr-record", {
|
|
185
|
+
name: "ptr",
|
|
186
|
+
dnsZoneId: zone.id,
|
|
187
|
+
ttl: 3600,
|
|
188
|
+
records: [{ ptrdname: `server1.${zoneName}.com` }],
|
|
189
|
+
metadata: {
|
|
190
|
+
purpose: "reverse-dns-example",
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
// =========================================================================
|
|
194
|
+
// SRV Record - Service location
|
|
195
|
+
// Format: _service._protocol (e.g., _sip._tcp)
|
|
196
|
+
// =========================================================================
|
|
197
|
+
new records_1.DnsSrvRecord(this, "srv-record-sip", {
|
|
198
|
+
name: "_sip._tcp",
|
|
199
|
+
dnsZoneId: zone.id,
|
|
200
|
+
ttl: 3600,
|
|
201
|
+
records: [
|
|
202
|
+
{
|
|
203
|
+
priority: 10,
|
|
204
|
+
weight: 60,
|
|
205
|
+
port: 5060,
|
|
206
|
+
target: `sipserver1.${zoneName}.com`,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
priority: 10,
|
|
210
|
+
weight: 40,
|
|
211
|
+
port: 5060,
|
|
212
|
+
target: `sipserver2.${zoneName}.com`,
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
metadata: {
|
|
216
|
+
purpose: "sip-service-discovery",
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
// =========================================================================
|
|
220
|
+
// SRV Record - Microsoft 365 Autodiscover
|
|
221
|
+
// =========================================================================
|
|
222
|
+
new records_1.DnsSrvRecord(this, "srv-record-autodiscover", {
|
|
223
|
+
name: "_autodiscover._tcp",
|
|
224
|
+
dnsZoneId: zone.id,
|
|
225
|
+
ttl: 3600,
|
|
226
|
+
records: [
|
|
227
|
+
{
|
|
228
|
+
priority: 0,
|
|
229
|
+
weight: 1,
|
|
230
|
+
port: 443,
|
|
231
|
+
target: "autodiscover.outlook.com",
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
metadata: {
|
|
235
|
+
purpose: "outlook-autodiscover",
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
// =========================================================================
|
|
239
|
+
// TXT Record - Root domain TXT records (SPF + Domain Verification)
|
|
240
|
+
// Note: In Azure DNS, all TXT records for the same name must be in a single record set.
|
|
241
|
+
// Each TXT record in the set can have multiple string values.
|
|
242
|
+
// =========================================================================
|
|
243
|
+
new records_1.DnsTxtRecord(this, "txt-record-root", {
|
|
244
|
+
name: "@",
|
|
245
|
+
dnsZoneId: zone.id,
|
|
246
|
+
ttl: 3600,
|
|
247
|
+
records: [
|
|
248
|
+
{
|
|
249
|
+
value: [
|
|
250
|
+
"v=spf1 include:spf.protection.outlook.com include:_spf.google.com ~all",
|
|
251
|
+
],
|
|
252
|
+
},
|
|
253
|
+
{ value: ["MS=ms12345678"] },
|
|
254
|
+
],
|
|
255
|
+
metadata: {
|
|
256
|
+
purpose: "root-txt-records",
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
// =========================================================================
|
|
260
|
+
// TXT Record - DKIM record
|
|
261
|
+
// =========================================================================
|
|
262
|
+
new records_1.DnsTxtRecord(this, "txt-record-dkim", {
|
|
263
|
+
name: "selector1._domainkey",
|
|
264
|
+
dnsZoneId: zone.id,
|
|
265
|
+
ttl: 3600,
|
|
266
|
+
records: [
|
|
267
|
+
{
|
|
268
|
+
value: [
|
|
269
|
+
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...",
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
metadata: {
|
|
274
|
+
purpose: "dkim-record",
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
// =========================================================================
|
|
278
|
+
// TXT Record - DMARC record
|
|
279
|
+
// =========================================================================
|
|
280
|
+
new records_1.DnsTxtRecord(this, "txt-record-dmarc", {
|
|
281
|
+
name: "_dmarc",
|
|
282
|
+
dnsZoneId: zone.id,
|
|
283
|
+
ttl: 3600,
|
|
284
|
+
records: [
|
|
285
|
+
{
|
|
286
|
+
value: [
|
|
287
|
+
"v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; pct=100",
|
|
288
|
+
],
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
metadata: {
|
|
292
|
+
purpose: "dmarc-policy",
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
// =========================================================================
|
|
296
|
+
// Additional A Record - subdomain
|
|
297
|
+
// =========================================================================
|
|
298
|
+
new records_1.DnsARecord(this, "a-record-subdomain", {
|
|
299
|
+
name: "blog",
|
|
300
|
+
dnsZoneId: zone.id,
|
|
301
|
+
ttl: 300,
|
|
302
|
+
records: [{ ipv4Address: "20.30.40.100" }],
|
|
303
|
+
metadata: {
|
|
304
|
+
purpose: "blog-server",
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
describe("DnsRecords Integration Test", () => {
|
|
310
|
+
it("should deploy, validate idempotency, and cleanup resources", () => {
|
|
311
|
+
const app = cdktf_1.Testing.app();
|
|
312
|
+
const stack = new DnsRecordsExampleStack(app, "test-dnsrecords");
|
|
313
|
+
const synthesized = cdktf_1.Testing.fullSynth(stack);
|
|
314
|
+
// This will:
|
|
315
|
+
// 1. Run terraform apply to deploy resources (including parent-child relationships)
|
|
316
|
+
// 2. Run terraform plan to check idempotency (no changes expected)
|
|
317
|
+
// 3. Run terraform destroy to cleanup resources (child resources cleanup before parent)
|
|
318
|
+
(0, testing_1.TerraformApplyCheckAndDestroy)(synthesized, { verifyCleanup: true });
|
|
319
|
+
}, 600000); // 10 minute timeout for deployment and cleanup
|
|
320
|
+
});
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXJlY29yZHMuaW50ZWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtZG5zem9uZS90ZXN0L2Rucy1yZWNvcmRzLmludGVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7QUFFSCxpQ0FBZ0M7QUFFaEMsMkNBQXlDO0FBQ3pDLGlGQUE2RTtBQUM3RSxrRkFBb0Y7QUFDcEYsMkNBQTZFO0FBQzdFLHlEQUE2RDtBQUM3RCw4Q0FBMEM7QUFDMUMsNENBVXdCO0FBRXhCLHdEQUF3RDtBQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLDBCQUFlLENBQUMsb0JBQW9CLEVBQUU7SUFDN0QsV0FBVyxFQUFFLENBQUM7Q0FDZixDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsTUFBTSxzQkFBdUIsU0FBUSx1QkFBYTtJQUNoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLGNBQWMsRUFBRTtnQkFDZCxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7Z0JBQ3JDLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztnQkFDckMsYUFBYSxFQUFFLFlBQVksQ0FBQyxhQUFhO2FBQzFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksd0JBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLHdCQUF3QjtRQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDakQsb0NBQW9DLEVBQ3BDLFFBQVEsQ0FDVCxDQUFDO1FBRUYscURBQXFEO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUksOEJBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELElBQUksRUFBRSxpQkFBaUI7WUFDdkIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsSUFBSSxFQUFF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QUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLCtDQUErQztBQUM3RCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZWdyYXRpb24gdGVzdCBmb3IgQXp1cmUgUHVibGljIEROUyBab25lIFJlY29yZHNcbiAqXG4gKiBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHVzYWdlIG9mIGFsbCBQdWJsaWMgRE5TIHJlY29yZCB0eXBlc1xuICogYW5kIHZhbGlkYXRlcyBkZXBsb3ltZW50LCBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAgZm9yIGNoaWxkIHJlc291cmNlcy5cbiAqXG4gKiBTdXBwb3J0ZWQgUmVjb3JkIFR5cGVzOlxuICogLSBBIHJlY29yZCAoSVB2NCBhZGRyZXNzZXMsIGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBBQUFBIHJlY29yZCAoSVB2NiBhZGRyZXNzZXMsIGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBDQUEgcmVjb3JkIChDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgQXV0aG9yaXphdGlvbiAtIFBVQkxJQyBPTkxZKVxuICogLSBDTkFNRSByZWNvcmQgKGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBNWCByZWNvcmRcbiAqIC0gTlMgcmVjb3JkIChOYW1lIFNlcnZlciAtIFBVQkxJQyBPTkxZKVxuICogLSBQVFIgcmVjb3JkXG4gKiAtIFNSViByZWNvcmRcbiAqIC0gVFhUIHJlY29yZFxuICogLSAoU09BIGlzIG1hbmFnZWQgYnkgQXp1cmUgYXV0b21hdGljYWxseSlcbiAqXG4gKiBSdW4gd2l0aDogbnBtIHJ1biBpbnRlZ3JhdGlvbjpub3N0cmVhbVxuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgXCJjZGt0Zi9saWIvdGVzdGluZy9hZGFwdGVycy9qZXN0XCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyb3VwIH0gZnJvbSBcIi4uLy4uL2F6dXJlLXJlc291cmNlZ3JvdXAvbGliL3Jlc291cmNlLWdyb3VwXCI7XG5pbXBvcnQgeyBBemFwaVByb3ZpZGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL3Byb3ZpZGVycy1hemFwaS9wcm92aWRlclwiO1xuaW1wb3J0IHsgQmFzZVRlc3RTdGFjaywgVGVycmFmb3JtQXBwbHlDaGVja0FuZERlc3Ryb3kgfSBmcm9tIFwiLi4vLi4vdGVzdGluZ1wiO1xuaW1wb3J0IHsgVGVzdFJ1bk1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL3Rlc3RpbmcvbGliL21ldGFkYXRhXCI7XG5pbXBvcnQgeyBEbnNab25lIH0gZnJvbSBcIi4uL2xpYi9kbnMtem9uZVwiO1xuaW1wb3J0IHtcbiAgRG5zQVJlY29yZCxcbiAgRG5zQWFhYVJlY29yZCxcbiAgRG5zQ2FhUmVjb3JkLFxuICBEbnNDbmFtZVJlY29yZCxcbiAgRG5zTXhSZWNvcmQsXG4gIERuc05zUmVjb3JkLFxuICBEbnNQdHJSZWNvcmQsXG4gIERuc1NydlJlY29yZCxcbiAgRG5zVHh0UmVjb3JkLFxufSBmcm9tIFwiLi4vbGliL3JlY29yZHNcIjtcblxuLy8gR2VuZXJhdGUgdW5pcXVlIHRlc3QgcnVuIG1ldGFkYXRhIGZvciB0aGlzIHRlc3Qgc3VpdGVcbmNvbnN0IHRlc3RNZXRhZGF0YSA9IG5ldyBUZXN0UnVuTWV0YWRhdGEoXCJkbnNyZWMtaW50ZWdyYXRpb25cIiwge1xuICBtYXhBZ2VIb3VyczogNCxcbn0pO1xuXG4vKipcbiAqIEV4YW1wbGUgc3RhY2sgZGVtb25zdHJhdGluZyBQdWJsaWMgRE5TIFJlY29yZHMgdXNhZ2VcbiAqXG4gKiBDcmVhdGVzIGEgUHVibGljIEROUyBab25lIGFuZCB2YXJpb3VzIHJlY29yZCB0eXBlcyB3aXRoaW4gaXQuXG4gKi9cbmNsYXNzIERuc1JlY29yZHNFeGFtcGxlU3RhY2sgZXh0ZW5kcyBCYXNlVGVzdFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVzdFJ1bk9wdGlvbnM6IHtcbiAgICAgICAgbWF4QWdlSG91cnM6IHRlc3RNZXRhZGF0YS5tYXhBZ2VIb3VycyxcbiAgICAgICAgYXV0b0NsZWFudXA6IHRlc3RNZXRhZGF0YS5hdXRvQ2xlYW51cCxcbiAgICAgICAgY2xlYW51cFBvbGljeTogdGVzdE1ldGFkYXRhLmNsZWFudXBQb2xpY3ksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIEFaQVBJIHByb3ZpZGVyXG4gICAgbmV3IEF6YXBpUHJvdmlkZXIodGhpcywgXCJhemFwaVwiLCB7fSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgbmFtZXNcbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IHRoaXMuZ2VuZXJhdGVSZXNvdXJjZU5hbWUoXG4gICAgICBcIk1pY3Jvc29mdC5SZXNvdXJjZXMvcmVzb3VyY2VHcm91cHNcIixcbiAgICAgIFwiZG5zcmVjXCIsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSByZXNvdXJjZSBncm91cCBmb3IgdGhlIEROUyB6b25lIGFuZCByZWNvcmRzXG4gICAgY29uc3QgcmVzb3VyY2VHcm91cCA9IG5ldyBSZXNvdXJjZUdyb3VwKHRoaXMsIFwidGVzdC1yZ1wiLCB7XG4gICAgICBuYW1lOiByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIGxvY2F0aW9uOiBcImVhc3R1czJcIixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICAgIHB1cnBvc2U6IFwicHVibGljLWRucy1yZWNvcmRzLXRlc3RpbmdcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgUHVibGljIEROUyBab25lIC0gdXNpbmcgYSB1bmlxdWUgem9uZSBuYW1lXG4gICAgLy8gTm90ZTogUHVibGljIEROUyB6b25lcyByZXF1aXJlIGdsb2JhbGx5IHVuaXF1ZSBuYW1lc1xuICAgIGNvbnN0IHpvbmVOYW1lID0gdGhpcy5nZW5lcmF0ZVJlc291cmNlTmFtZShcbiAgICAgIFwiTWljcm9zb2Z0Lk5ldHdvcmsvZG5zWm9uZXNcIixcbiAgICAgIFwicmVjXCIsXG4gICAgKTtcbiAgICBjb25zdCB6b25lID0gbmV3IERuc1pvbmUodGhpcywgXCJwdWJsaWMtZG5zLXpvbmVcIiwge1xuICAgICAgbmFtZTogYCR7em9uZU5hbWV9LmNvbWAsXG4gICAgICBsb2NhdGlvbjogXCJnbG9iYWxcIixcbiAgICAgIHJlc291cmNlR3JvdXBJZDogcmVzb3VyY2VHcm91cC5pZCxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICAgIHB1cnBvc2U6IFwiZG5zLXJlY29yZHMtdGVzdGluZ1wiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBBIFJlY29yZCAtIFNpbmdsZSBJUFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQVJlY29yZCh0aGlzLCBcImEtcmVjb3JkLXNpbmdsZVwiLCB7XG4gICAgICBuYW1lOiBcIndlYlwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzMDAsXG4gICAgICByZWNvcmRzOiBbeyBpcHY0QWRkcmVzczogXCIyMC4zMC40MC41MFwiIH1dLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJ3ZWItc2VydmVyXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEEgUmVjb3JkIC0gTXVsdGlwbGUgSVBzIChsb2FkIGJhbGFuY2luZylcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc0FSZWNvcmQodGhpcywgXCJhLXJlY29yZC1tdWx0aVwiLCB7XG4gICAgICBuYW1lOiBcImFwaVwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzMDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHsgaXB2NEFkZHJlc3M6IFwiMjAuMzAuNDAuNTFcIiB9LFxuICAgICAgICB7IGlwdjRBZGRyZXNzOiBcIjIwLjMwLjQwLjUyXCIgfSxcbiAgICAgICAgeyBpcHY0QWRkcmVzczogXCIyMC4zMC40MC41M1wiIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJhcGktc2VydmVycy1sb2FkYmFsYW5jZWRcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQUFBQSBSZWNvcmQgLSBJUHY2IGFkZHJlc3Nlc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQWFhYVJlY29yZCh0aGlzLCBcImFhYWEtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwiaXB2Nmhvc3RcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7IGlwdjZBZGRyZXNzOiBcIjIwMDE6ZGI4Ojg1YTM6OjhhMmU6MzcwOjczMzRcIiB9LFxuICAgICAgICB7IGlwdjZBZGRyZXNzOiBcIjIwMDE6ZGI4Ojg1YTM6OjhhMmU6MzcwOjczMzVcIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwiaXB2Ni1zZXJ2ZXJzXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIENBQSBSZWNvcmQgLSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgQXV0aG9yaXphdGlvbiAoUFVCTElDIEROUyBPTkxZKVxuICAgIC8vIFNwZWNpZmllcyB3aGljaCBDQXMgYXJlIGFsbG93ZWQgdG8gaXNzdWUgY2VydGlmaWNhdGVzIGZvciB0aGlzIGRvbWFpblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQ2FhUmVjb3JkKHRoaXMsIFwiY2FhLXJlY29yZFwiLCB7XG4gICAgICBuYW1lOiBcIkBcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAgeyBmbGFnczogMCwgdGFnOiBcImlzc3VlXCIsIHZhbHVlOiBcImxldHNlbmNyeXB0Lm9yZ1wiIH0sXG4gICAgICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpc3N1ZVwiLCB2YWx1ZTogXCJkaWdpY2VydC5jb21cIiB9LFxuICAgICAgICB7IGZsYWdzOiAwLCB0YWc6IFwiaXNzdWV3aWxkXCIsIHZhbHVlOiBcImxldHNlbmNyeXB0Lm9yZ1wiIH0sXG4gICAgICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpb2RlZlwiLCB2YWx1ZTogXCJtYWlsdG86c2VjdXJpdHlAZXhhbXBsZS5jb21cIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwiY2VydGlmaWNhdGUtYXV0aG9yaXR5LWF1dGhvcml6YXRpb25cIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQ05BTUUgUmVjb3JkIC0gQWxpYXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc0NuYW1lUmVjb3JkKHRoaXMsIFwiY25hbWUtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwid3d3XCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICBjbmFtZTogYHdlYi4ke3pvbmVOYW1lfS5jb21gLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJhbGlhcy10by13ZWJcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTVggUmVjb3JkIC0gTWFpbCBleGNoYW5nZSBzZXJ2ZXJzXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIG5ldyBEbnNNeFJlY29yZCh0aGlzLCBcIm14LXJlY29yZFwiLCB7XG4gICAgICBuYW1lOiBcIkBcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAgeyBwcmVmZXJlbmNlOiAxMCwgZXhjaGFuZ2U6IGBtYWlsMS4ke3pvbmVOYW1lfS5jb21gIH0sXG4gICAgICAgIHsgcHJlZmVyZW5jZTogMjAsIGV4Y2hhbmdlOiBgbWFpbDIuJHt6b25lTmFtZX0uY29tYCB9LFxuICAgICAgICB7IHByZWZlcmVuY2U6IDMwLCBleGNoYW5nZTogXCJtYWlsLmJhY2t1cC1wcm92aWRlci5jb21cIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwibWFpbC1zZXJ2ZXJzXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5TIFJlY29yZCAtIE5hbWUgc2VydmVyIGRlbGVnYXRpb24gKFBVQkxJQyBETlMgT05MWSlcbiAgICAvLyBVc2VkIGZvciBkZWxlZ2F0aW5nIGEgc3ViZG9tYWluIHRvIGRpZmZlcmVudCBuYW1lIHNlcnZlcnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc05zUmVjb3JkKHRoaXMsIFwibnMtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwic3ViZG9tYWluXCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHsgbnNkbmFtZTogXCJuczEuc3ViZG9tYWluLXByb3ZpZGVyLmNvbVwiIH0sXG4gICAgICAgIHsgbnNkbmFtZTogXCJuczIuc3ViZG9tYWluLXByb3ZpZGVyLmNvbVwiIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJzdWJkb21haW4tZGVsZWdhdGlvblwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBQVFIgUmVjb3JkIC0gUmV2ZXJzZSBETlNcbiAgICAvLyBOb3RlOiBJbiBwcmFjdGljZSwgUFRSIHJlY29yZHMgYXJlIGNyZWF0ZWQgaW4gcmV2ZXJzZSBETlMgem9uZXNcbiAgICAvLyBtYW5hZ2VkIGJ5IElQIGFkZHJlc3MgcHJvdmlkZXJzLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgcmVjb3JkIHN0cnVjdHVyZS5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1B0clJlY29yZCh0aGlzLCBcInB0ci1yZWNvcmRcIiwge1xuICAgICAgbmFtZTogXCJwdHJcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFt7IHB0cmRuYW1lOiBgc2VydmVyMS4ke3pvbmVOYW1lfS5jb21gIH1dLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJyZXZlcnNlLWRucy1leGFtcGxlXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFNSViBSZWNvcmQgLSBTZXJ2aWNlIGxvY2F0aW9uXG4gICAgLy8gRm9ybWF0OiBfc2VydmljZS5fcHJvdG9jb2wgKGUuZy4sIF9zaXAuX3RjcClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1NydlJlY29yZCh0aGlzLCBcInNydi1yZWNvcmQtc2lwXCIsIHtcbiAgICAgIG5hbWU6IFwiX3NpcC5fdGNwXCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcmlvcml0eTogMTAsXG4gICAgICAgICAgd2VpZ2h0OiA2MCxcbiAgICAgICAgICBwb3J0OiA1MDYwLFxuICAgICAgICAgIHRhcmdldDogYHNpcHNlcnZlcjEuJHt6b25lTmFtZX0uY29tYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByaW9yaXR5OiAxMCxcbiAgICAgICAgICB3ZWlnaHQ6IDQwLFxuICAgICAgICAgIHBvcnQ6IDUwNjAsXG4gICAgICAgICAgdGFyZ2V0OiBgc2lwc2VydmVyMi4ke3pvbmVOYW1lfS5jb21gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwic2lwLXNlcnZpY2UtZGlzY292ZXJ5XCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFNSViBSZWNvcmQgLSBNaWNyb3NvZnQgMzY1IEF1dG9kaXNjb3ZlclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zU3J2UmVjb3JkKHRoaXMsIFwic3J2LXJlY29yZC1hdXRvZGlzY292ZXJcIiwge1xuICAgICAgbmFtZTogXCJfYXV0b2Rpc2NvdmVyLl90Y3BcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICAgIHdlaWdodDogMSxcbiAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgdGFyZ2V0OiBcImF1dG9kaXNjb3Zlci5vdXRsb29rLmNvbVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwib3V0bG9vay1hdXRvZGlzY292ZXJcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVFhUIFJlY29yZCAtIFJvb3QgZG9tYWluIFRYVCByZWNvcmRzIChTUEYgKyBEb21haW4gVmVyaWZpY2F0aW9uKVxuICAgIC8vIE5vdGU6IEluIEF6dXJlIEROUywgYWxsIFRYVCByZWNvcmRzIGZvciB0aGUgc2FtZSBuYW1lIG11c3QgYmUgaW4gYSBzaW5nbGUgcmVjb3JkIHNldC5cbiAgICAvLyBFYWNoIFRYVCByZWNvcmQgaW4gdGhlIHNldCBjYW4gaGF2ZSBtdWx0aXBsZSBzdHJpbmcgdmFsdWVzLlxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zVHh0UmVjb3JkKHRoaXMsIFwidHh0LXJlY29yZC1yb290XCIsIHtcbiAgICAgIG5hbWU6IFwiQFwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzNjAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgIFwidj1zcGYxIGluY2x1ZGU6c3BmLnByb3RlY3Rpb24ub3V0bG9vay5jb20gaW5jbHVkZTpfc3BmLmdvb2dsZS5jb20gfmFsbFwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgdmFsdWU6IFtcIk1TPW1zMTIzNDU2NzhcIl0gfSxcbiAgICAgIF0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcInJvb3QtdHh0LXJlY29yZHNcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVFhUIFJlY29yZCAtIERLSU0gcmVjb3JkXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIG5ldyBEbnNUeHRSZWNvcmQodGhpcywgXCJ0eHQtcmVjb3JkLWRraW1cIiwge1xuICAgICAgbmFtZTogXCJzZWxlY3RvcjEuX2RvbWFpbmtleVwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzNjAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgIFwidj1ES0lNMTsgaz1yc2E7IHA9TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDLi4uXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcImRraW0tcmVjb3JkXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFRYVCBSZWNvcmQgLSBETUFSQyByZWNvcmRcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1R4dFJlY29yZCh0aGlzLCBcInR4dC1yZWNvcmQtZG1hcmNcIiwge1xuICAgICAgbmFtZTogXCJfZG1hcmNcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICBcInY9RE1BUkMxOyBwPXF1YXJhbnRpbmU7IHJ1YT1tYWlsdG86ZG1hcmMtcmVwb3J0c0BleGFtcGxlLmNvbTsgcGN0PTEwMFwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJkbWFyYy1wb2xpY3lcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQWRkaXRpb25hbCBBIFJlY29yZCAtIHN1YmRvbWFpblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQVJlY29yZCh0aGlzLCBcImEtcmVjb3JkLXN1YmRvbWFpblwiLCB7XG4gICAgICBuYW1lOiBcImJsb2dcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzAwLFxuICAgICAgcmVjb3JkczogW3sgaXB2NEFkZHJlc3M6IFwiMjAuMzAuNDAuMTAwXCIgfV0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcImJsb2ctc2VydmVyXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKFwiRG5zUmVjb3JkcyBJbnRlZ3JhdGlvbiBUZXN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgZGVwbG95LCB2YWxpZGF0ZSBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAgcmVzb3VyY2VzXCIsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IERuc1JlY29yZHNFeGFtcGxlU3RhY2soYXBwLCBcInRlc3QtZG5zcmVjb3Jkc1wiKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXMgKGluY2x1ZGluZyBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcylcbiAgICAvLyAyLiBSdW4gdGVycmFmb3JtIHBsYW4gdG8gY2hlY2sgaWRlbXBvdGVuY3kgKG5vIGNoYW5nZXMgZXhwZWN0ZWQpXG4gICAgLy8gMy4gUnVuIHRlcnJhZm9ybSBkZXN0cm95IHRvIGNsZWFudXAgcmVzb3VyY2VzIChjaGlsZCByZXNvdXJjZXMgY2xlYW51cCBiZWZvcmUgcGFyZW50KVxuICAgIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95KHN5bnRoZXNpemVkLCB7IHZlcmlmeUNsZWFudXA6IHRydWUgfSk7XG4gIH0sIDYwMDAwMCk7IC8vIDEwIG1pbnV0ZSB0aW1lb3V0IGZvciBkZXBsb3ltZW50IGFuZCBjbGVhbnVwXG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for Azure Public DNS Zone Record implementations
|
|
3
|
+
*
|
|
4
|
+
* This test suite validates all 10 Public DNS record types:
|
|
5
|
+
* - DnsARecord
|
|
6
|
+
* - DnsAaaaRecord
|
|
7
|
+
* - DnsCaaRecord (Public DNS only)
|
|
8
|
+
* - DnsCnameRecord
|
|
9
|
+
* - DnsMxRecord
|
|
10
|
+
* - DnsNsRecord (Public DNS only)
|
|
11
|
+
* - DnsPtrRecord
|
|
12
|
+
* - DnsSoaRecord
|
|
13
|
+
* - DnsSrvRecord
|
|
14
|
+
* - DnsTxtRecord
|
|
15
|
+
*
|
|
16
|
+
* Tests verify basic creation, correct resource types, API versions,
|
|
17
|
+
* parent ID resolution, resource body structure, TTL handling,
|
|
18
|
+
* record-specific properties, metadata handling, and alias record support.
|
|
19
|
+
*/
|
|
20
|
+
export {};
|