@drunk-pulumi/azure 0.0.37 → 0.0.39
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/Aks/Helper.d.ts +6 -11
- package/Aks/Helper.js +40 -65
- package/Aks/Identity.d.ts +3 -10
- package/Aks/Identity.js +9 -8
- package/Aks/index.d.ts +67 -71
- package/Aks/index.js +198 -314
- package/Apim/ApiProduct/PolicyBuilder.js +25 -27
- package/Apim/ApiProduct/SwaggerHelper.js +1 -3
- package/Apim/ApiProduct/index.d.ts +3 -3
- package/Apim/ApiProduct/index.js +1 -2
- package/Automation/index.d.ts +7 -0
- package/Automation/index.js +55 -0
- package/AzAd/EnvRoles.Consts.d.ts +12 -0
- package/AzAd/EnvRoles.Consts.js +125 -0
- package/AzAd/EnvRoles.d.ts +17 -15
- package/AzAd/EnvRoles.js +69 -47
- package/AzAd/GraphDefinition.d.ts +2 -2
- package/AzAd/GraphDefinition.js +3055 -3056
- package/AzAd/Helper.d.ts +24 -13
- package/AzAd/Helper.js +98 -25
- package/AzAd/Identities/AzDevOpsIdentity.d.ts +12 -0
- package/AzAd/Identities/AzDevOpsIdentity.js +32 -0
- package/AzAd/Identities/AzDevOpsManagedIdentity.d.ts +7 -0
- package/AzAd/Identities/AzDevOpsManagedIdentity.js +15 -0
- package/AzAd/Identities/AzUserAdRevertSync.d.ts +2 -9
- package/AzAd/Identities/AzUserAdRevertSync.js +4 -5
- package/AzAd/Identities/index.d.ts +3 -0
- package/AzAd/Identities/index.js +10 -0
- package/AzAd/Identity.d.ts +10 -22
- package/AzAd/Identity.js +50 -61
- package/AzAd/Role.d.ts +2 -3
- package/AzAd/Role.js +4 -5
- package/AzAd/RoleAssignment.d.ts +34 -5
- package/AzAd/RoleAssignment.js +2 -2
- package/AzAd/RoleDefinitions/JustInTimeRequestRole.d.ts +2 -0
- package/AzAd/RoleDefinitions/JustInTimeRequestRole.js +24 -0
- package/AzAd/RolesBuiltIn.d.ts +29 -0
- package/AzAd/RolesBuiltIn.js +13034 -8058
- package/AzAd/UserAssignedIdentity.d.ts +6 -0
- package/AzAd/UserAssignedIdentity.js +27 -0
- package/Builder/AksBuilder.d.ts +3 -0
- package/Builder/AksBuilder.js +95 -0
- package/Builder/ResourceBuilder.d.ts +3 -0
- package/Builder/ResourceBuilder.js +116 -0
- package/Builder/VnetBuilder.d.ts +3 -0
- package/Builder/VnetBuilder.js +279 -0
- package/Builder/index.d.ts +4 -0
- package/Builder/index.js +21 -0
- package/Builder/types/askBuilder.d.ts +32 -0
- package/Builder/types/askBuilder.js +3 -0
- package/Builder/types/genericBuilder.d.ts +26 -0
- package/Builder/types/genericBuilder.js +18 -0
- package/Builder/types/index.d.ts +4 -0
- package/Builder/types/index.js +21 -0
- package/Builder/types/resourceBuilder.d.ts +24 -0
- package/Builder/types/resourceBuilder.js +3 -0
- package/Builder/types/vnetBuilder.d.ts +65 -0
- package/Builder/types/vnetBuilder.js +3 -0
- package/Certificate/index.d.ts +1 -1
- package/Certificate/index.js +26 -28
- package/Common/AutoTags.js +2 -2
- package/Common/AzureEnv.d.ts +4 -3
- package/Common/AzureEnv.js +31 -24
- package/Common/GlobalEnv.d.ts +1 -2
- package/Common/GlobalEnv.js +7 -7
- package/Common/Location.d.ts +3 -3
- package/Common/Location.js +22 -9
- package/Common/LocationBuiltIn.d.ts +6 -81
- package/Common/LocationBuiltIn.js +491 -1923
- package/Common/Naming/index.d.ts +6 -4
- package/Common/Naming/index.js +64 -60
- package/Common/ResourceEnv.d.ts +2 -2
- package/Common/ResourceEnv.js +11 -10
- package/Common/StackEnv.js +2 -9
- package/Core/KeyGenetators.d.ts +16 -20
- package/Core/KeyGenetators.js +17 -16
- package/Core/Random.d.ts +4 -4
- package/Core/Random.js +10 -10
- package/Core/ResourceGroup.d.ts +13 -6
- package/Core/ResourceGroup.js +12 -24
- package/IOT/Hub/index.d.ts +4 -8
- package/IOT/Hub/index.js +19 -54
- package/KeyVault/Helper.d.ts +8 -6
- package/KeyVault/Helper.js +13 -19
- package/KeyVault/index.d.ts +1 -3
- package/KeyVault/index.js +2 -26
- package/Logs/Helpers.d.ts +35 -25
- package/Logs/Helpers.js +33 -20
- package/Logs/LogAnalytics.d.ts +2 -2
- package/Logs/LogAnalytics.js +15 -6
- package/Logs/index.d.ts +3 -3
- package/Logs/index.js +4 -4
- package/MySql/index.d.ts +2 -3
- package/MySql/index.js +16 -19
- package/{ReadMe.md → README.md} +6 -1
- package/Sql/index.d.ts +15 -9
- package/Sql/index.js +39 -41
- package/Storage/CdnEndpoint.d.ts +2 -2
- package/Storage/CdnEndpoint.js +14 -15
- package/Storage/Helper.d.ts +2 -2
- package/Storage/Helper.js +6 -6
- package/Storage/ManagementRules.d.ts +5 -23
- package/Storage/ManagementRules.js +3 -3
- package/Storage/index.d.ts +3 -3
- package/Storage/index.js +28 -28
- package/VM/AzureDevOpsExtension.d.ts +16 -0
- package/VM/AzureDevOpsExtension.js +14 -0
- package/VM/Extension.d.ts +15 -0
- package/VM/Extension.js +13 -0
- package/VM/GlobalSchedule.d.ts +10 -0
- package/VM/GlobalSchedule.js +20 -0
- package/VM/index.d.ts +18 -18
- package/VM/index.js +94 -57
- package/VNet/Bastion.d.ts +4 -4
- package/VNet/Bastion.js +12 -8
- package/VNet/Firewall.d.ts +19 -12
- package/VNet/Firewall.js +59 -40
- package/VNet/FirewallPolicies/AksFirewallPolicy.d.ts +16 -16
- package/VNet/FirewallPolicies/AksFirewallPolicy.js +193 -220
- package/VNet/FirewallPolicies/CloudPCFirewallPolicy.d.ts +12 -10
- package/VNet/FirewallPolicies/CloudPCFirewallPolicy.js +170 -282
- package/VNet/FirewallPolicies/DefaultFirewallPolicy.d.ts +3 -0
- package/VNet/FirewallPolicies/DefaultFirewallPolicy.js +25 -0
- package/VNet/FirewallPolicies/index.d.ts +4 -0
- package/VNet/FirewallPolicies/index.js +10 -0
- package/VNet/FirewallPolicy.d.ts +14 -11
- package/VNet/FirewallPolicy.js +67 -74
- package/VNet/FirewallRules/AksFirewallRules.d.ts +4 -3
- package/VNet/FirewallRules/AksFirewallRules.js +101 -100
- package/VNet/Helper.d.ts +8 -4
- package/VNet/Helper.js +42 -35
- package/VNet/IpAddress.d.ts +6 -8
- package/VNet/IpAddress.js +6 -11
- package/VNet/IpAddressPrefix.d.ts +12 -9
- package/VNet/IpAddressPrefix.js +14 -13
- package/VNet/NSGRules/AppGatewaySecurityRule.d.ts +9 -0
- package/VNet/NSGRules/AppGatewaySecurityRule.js +46 -0
- package/VNet/NSGRules/AzADSecurityRule.d.ts +6 -0
- package/VNet/NSGRules/AzADSecurityRule.js +39 -0
- package/VNet/NSGRules/BastionSecurityRule.d.ts +9 -0
- package/VNet/NSGRules/BastionSecurityRule.js +93 -0
- package/VNet/NatGateway.d.ts +10 -0
- package/VNet/NatGateway.js +21 -0
- package/VNet/NetworkPeering.d.ts +7 -7
- package/VNet/NetworkPeering.js +29 -20
- package/VNet/PrivateDns.d.ts +8 -10
- package/VNet/PrivateDns.js +12 -14
- package/VNet/PrivateEndpoint.js +5 -2
- package/VNet/RouteTable.d.ts +7 -8
- package/VNet/RouteTable.js +6 -6
- package/VNet/SecurityGroup.d.ts +4 -4
- package/VNet/SecurityGroup.js +7 -3
- package/VNet/Subnet.d.ts +10 -7
- package/VNet/Subnet.js +4 -3
- package/VNet/VPNGateway.d.ts +13 -0
- package/VNet/VPNGateway.js +73 -0
- package/VNet/VirtualWAN.d.ts +7 -10
- package/VNet/VirtualWAN.js +1 -1
- package/VNet/Vnet.d.ts +29 -23
- package/VNet/Vnet.js +58 -121
- package/VNet/index.d.ts +17 -18
- package/VNet/index.js +41 -54
- package/VNet/types.d.ts +94 -0
- package/VNet/types.js +3 -0
- package/Web/types.d.ts +2 -134
- package/package.json +8 -8
- package/types.d.ts +22 -8
- package/z_tests/_tools/Mocks.js +12 -13
- package/Automation/AutoAccount.d.ts +0 -5
- package/Automation/AutoAccount.js +0 -18
- package/AzAd/Identities/AzDevOps.d.ts +0 -23
- package/AzAd/Identities/AzDevOps.js +0 -61
- package/AzAd/KeyVaultRoles.d.ts +0 -8
- package/AzAd/KeyVaultRoles.js +0 -53
- package/AzAd/ManagedIdentity.d.ts +0 -6
- package/AzAd/ManagedIdentity.js +0 -20
- package/AzAd/UserIdentity.d.ts +0 -5
- package/AzAd/UserIdentity.js +0 -12
- package/Common/Naming/AzureRegions.d.ts +0 -4
- package/Common/Naming/AzureRegions.js +0 -49
- package/KeyVault/VaultPermissions.d.ts +0 -27
- package/KeyVault/VaultPermissions.js +0 -226
- package/VNet/FirewallRules/types.d.ts +0 -20
- package/VNet/FirewallRules/types.js +0 -5
- package/VNet/NSGRules/AzADService.d.ts +0 -10
- package/VNet/NSGRules/AzADService.js +0 -45
package/VNet/Vnet.js
CHANGED
|
@@ -3,21 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const network = require("@pulumi/azure-native/network");
|
|
4
4
|
const Helper_1 = require("./Helper");
|
|
5
5
|
const Naming_1 = require("../Common/Naming");
|
|
6
|
-
const Bastion_1 = require("./Bastion");
|
|
7
6
|
const Subnet_1 = require("./Subnet");
|
|
8
|
-
|
|
7
|
+
const SecurityGroup_1 = require("./SecurityGroup");
|
|
8
|
+
const RouteTable_1 = require("./RouteTable");
|
|
9
|
+
const AppGatewaySecurityRule_1 = require("./NSGRules/AppGatewaySecurityRule");
|
|
10
|
+
exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], natGateway, dnsServers, features = {}, dependsOn, }) => {
|
|
9
11
|
const vName = (0, Naming_1.getVnetName)(name);
|
|
10
|
-
const securityRules = features.securityGroup?.rules ||
|
|
11
|
-
new Array();
|
|
12
|
+
const securityRules = features.securityGroup?.rules || [];
|
|
12
13
|
//AppGateway
|
|
13
14
|
if (features.appGatewaySubnet) {
|
|
14
15
|
subnets.push({
|
|
15
16
|
name: Helper_1.appGatewaySubnetName,
|
|
16
17
|
addressPrefix: features.appGatewaySubnet.addressPrefix,
|
|
17
18
|
allowedServiceEndpoints: false,
|
|
19
|
+
enableSecurityGroup: false,
|
|
20
|
+
enableRouteTable: false,
|
|
21
|
+
});
|
|
22
|
+
//TODO: Move this to vnetBuilder instead. Add Security Rules for App Gateway
|
|
23
|
+
securityRules.push(...(0, AppGatewaySecurityRule_1.default)(features.appGatewaySubnet));
|
|
24
|
+
}
|
|
25
|
+
//Gateway Subnet
|
|
26
|
+
if (features?.gatewaySubnet) {
|
|
27
|
+
subnets.push({
|
|
28
|
+
name: Helper_1.gatewaySubnetName,
|
|
29
|
+
addressPrefix: features.gatewaySubnet.addressPrefix,
|
|
30
|
+
allowedServiceEndpoints: false,
|
|
31
|
+
enableSecurityGroup: false,
|
|
32
|
+
enableRouteTable: false,
|
|
18
33
|
});
|
|
19
|
-
//Add Security Rules for App Gateway
|
|
20
|
-
securityRules.push(...getAppGatewayRules(features.appGatewaySubnet));
|
|
21
34
|
}
|
|
22
35
|
//Bastion Host
|
|
23
36
|
if (features.bastion) {
|
|
@@ -25,17 +38,8 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
|
|
|
25
38
|
name: Helper_1.azBastionSubnetName,
|
|
26
39
|
addressPrefix: features.bastion.addressPrefix,
|
|
27
40
|
allowedServiceEndpoints: false,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
name: 'allow-internet-bastion',
|
|
31
|
-
sourceAddressPrefix: '*',
|
|
32
|
-
sourcePortRange: '*',
|
|
33
|
-
destinationAddressPrefix: features.bastion.addressPrefix,
|
|
34
|
-
destinationPortRange: '443',
|
|
35
|
-
protocol: 'TCP',
|
|
36
|
-
access: 'Allow',
|
|
37
|
-
direction: 'Inbound',
|
|
38
|
-
priority: 3000,
|
|
41
|
+
enableSecurityGroup: true,
|
|
42
|
+
enableRouteTable: false,
|
|
39
43
|
});
|
|
40
44
|
}
|
|
41
45
|
//Firewall Subnet
|
|
@@ -44,43 +48,52 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
|
|
|
44
48
|
name: Helper_1.azFirewallSubnet,
|
|
45
49
|
addressPrefix: features.firewall.addressPrefix,
|
|
46
50
|
allowedServiceEndpoints: false,
|
|
51
|
+
enableSecurityGroup: false,
|
|
52
|
+
enableRouteTable: true,
|
|
53
|
+
enableNatGateway: features.firewall.enableNatGateway,
|
|
47
54
|
});
|
|
48
55
|
if (features.firewall.managementAddressPrefix)
|
|
49
56
|
subnets.push({
|
|
50
57
|
name: Helper_1.azFirewallManagementSubnet,
|
|
51
58
|
addressPrefix: features.firewall.managementAddressPrefix,
|
|
52
59
|
allowedServiceEndpoints: false,
|
|
60
|
+
enableSecurityGroup: false,
|
|
61
|
+
enableNatGateway: false,
|
|
62
|
+
enableRouteTable: false,
|
|
53
63
|
});
|
|
54
64
|
}
|
|
55
65
|
//NetworkSecurityGroup
|
|
56
66
|
let securityGroup = undefined;
|
|
57
|
-
if (features.securityGroup) {
|
|
67
|
+
if (features.securityGroup?.enabled) {
|
|
58
68
|
//Allow outbound internet
|
|
59
69
|
if (!features.securityGroup.allowOutboundInternetAccess) {
|
|
60
70
|
securityRules.push({
|
|
61
|
-
name:
|
|
62
|
-
sourceAddressPrefix:
|
|
63
|
-
sourcePortRange:
|
|
64
|
-
destinationAddressPrefix:
|
|
65
|
-
destinationPortRange:
|
|
66
|
-
protocol:
|
|
67
|
-
access:
|
|
68
|
-
direction:
|
|
71
|
+
name: "DefaultDeniedInternetOutbound",
|
|
72
|
+
sourceAddressPrefix: "*",
|
|
73
|
+
sourcePortRange: "*",
|
|
74
|
+
destinationAddressPrefix: "Internet",
|
|
75
|
+
destinationPortRange: "*",
|
|
76
|
+
protocol: "*",
|
|
77
|
+
access: "Deny",
|
|
78
|
+
direction: "Outbound",
|
|
69
79
|
priority: 4096, //The last rule in the list;
|
|
70
80
|
});
|
|
71
81
|
}
|
|
72
|
-
securityGroup =
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
securityGroup = (0, SecurityGroup_1.default)({
|
|
83
|
+
name: vName,
|
|
84
|
+
group,
|
|
75
85
|
securityRules,
|
|
76
86
|
});
|
|
77
87
|
}
|
|
78
88
|
//Route Table
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
const routeRules = features.routeTable?.rules || [];
|
|
90
|
+
const routeTable = features.routeTable?.enabled
|
|
91
|
+
? (0, RouteTable_1.default)({
|
|
92
|
+
name: vName,
|
|
93
|
+
group,
|
|
94
|
+
routes: routeRules,
|
|
95
|
+
})
|
|
96
|
+
: undefined;
|
|
84
97
|
//Create VNet
|
|
85
98
|
const vnet = new network.VirtualNetwork(vName, {
|
|
86
99
|
virtualNetworkName: vName,
|
|
@@ -94,101 +107,25 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
|
|
|
94
107
|
subnet: s,
|
|
95
108
|
vnetName: name,
|
|
96
109
|
group,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
: securityGroup,
|
|
101
|
-
routeTable: [
|
|
102
|
-
Helper_1.azBastionSubnetName,
|
|
103
|
-
Helper_1.azFirewallSubnet,
|
|
104
|
-
Helper_1.gatewaySubnetName,
|
|
105
|
-
].includes(s.name)
|
|
106
|
-
? undefined
|
|
107
|
-
: routeTable,
|
|
110
|
+
natGateway: s.enableNatGateway ? natGateway : undefined,
|
|
111
|
+
securityGroup: s.enableSecurityGroup === false ? undefined : securityGroup,
|
|
112
|
+
routeTable: s.enableRouteTable === false ? undefined : routeTable,
|
|
108
113
|
})),
|
|
109
114
|
enableDdosProtection: ddosId !== undefined,
|
|
110
115
|
ddosProtectionPlan: ddosId ? { id: ddosId } : undefined,
|
|
111
|
-
});
|
|
112
|
-
const subnetResults = {};
|
|
116
|
+
}, { dependsOn, ignoreChanges: ["virtualNetworkPeerings"] });
|
|
113
117
|
const findSubnet = (name) => vnet.subnets.apply((ss) => ss.find((s) => s.name === name));
|
|
114
|
-
subnets?.forEach((s) => {
|
|
115
|
-
subnetResults[s.name] = findSubnet(s.name).apply((s) => s);
|
|
116
|
-
});
|
|
117
|
-
const bastionSubnet = subnetResults[Helper_1.azBastionSubnetName];
|
|
118
|
-
//Create Bastion
|
|
119
|
-
if (features.bastion && !features.bastion.disableBastionHostCreation) {
|
|
120
|
-
(0, Bastion_1.default)({
|
|
121
|
-
name,
|
|
122
|
-
group,
|
|
123
|
-
subnetId: bastionSubnet.apply((s) => s.id),
|
|
124
|
-
dependsOn: [vnet],
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
118
|
//Return the results
|
|
128
119
|
return {
|
|
129
120
|
vnet,
|
|
130
|
-
firewallSubnet: subnetResults[Helper_1.azFirewallSubnet],
|
|
131
|
-
firewallManageSubnet: subnetResults[Helper_1.azFirewallManagementSubnet],
|
|
132
|
-
appGatewaySubnet: subnetResults[Helper_1.appGatewaySubnetName],
|
|
133
|
-
bastionSubnet,
|
|
134
|
-
subnets: subnetResults,
|
|
135
121
|
securityGroup,
|
|
136
122
|
routeTable,
|
|
123
|
+
findSubnet,
|
|
124
|
+
firewallSubnet: findSubnet(Helper_1.azFirewallSubnet),
|
|
125
|
+
firewallManageSubnet: findSubnet(Helper_1.azFirewallManagementSubnet),
|
|
126
|
+
appGatewaySubnet: findSubnet(Helper_1.appGatewaySubnetName),
|
|
127
|
+
gatewaySubnet: findSubnet(Helper_1.gatewaySubnetName),
|
|
128
|
+
bastionSubnet: findSubnet(Helper_1.azBastionSubnetName),
|
|
137
129
|
};
|
|
138
130
|
};
|
|
139
|
-
|
|
140
|
-
let start = 100;
|
|
141
|
-
return [
|
|
142
|
-
//Add inbound rule for app gateway subnet
|
|
143
|
-
{
|
|
144
|
-
name: 'allow_internet_in_gateway_health',
|
|
145
|
-
description: 'Allow Health check access from internet to Gateway',
|
|
146
|
-
priority: 200 + start++,
|
|
147
|
-
protocol: 'Tcp',
|
|
148
|
-
access: 'Allow',
|
|
149
|
-
direction: 'Inbound',
|
|
150
|
-
sourceAddressPrefix: 'Internet',
|
|
151
|
-
sourcePortRange: '*',
|
|
152
|
-
destinationAddressPrefix: addressPrefix,
|
|
153
|
-
destinationPortRanges: version === 'v1' ? ['65503-65534'] : ['65200-65535'],
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
name: 'allow_https_internet_in_gateway',
|
|
157
|
-
description: 'Allow HTTPS access from internet to Gateway',
|
|
158
|
-
priority: 200 + start++,
|
|
159
|
-
protocol: 'Tcp',
|
|
160
|
-
access: 'Allow',
|
|
161
|
-
direction: 'Inbound',
|
|
162
|
-
sourceAddressPrefix: 'Internet',
|
|
163
|
-
sourcePortRange: '*',
|
|
164
|
-
destinationAddressPrefix: addressPrefix,
|
|
165
|
-
destinationPortRange: '443',
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
name: 'allow_loadbalancer_in_gateway',
|
|
169
|
-
description: 'Allow Load balancer to Gateway',
|
|
170
|
-
priority: 200 + start++,
|
|
171
|
-
protocol: 'Tcp',
|
|
172
|
-
access: 'Allow',
|
|
173
|
-
direction: 'Inbound',
|
|
174
|
-
sourceAddressPrefix: 'AzureLoadBalancer',
|
|
175
|
-
sourcePortRange: '*',
|
|
176
|
-
destinationAddressPrefix: addressPrefix,
|
|
177
|
-
destinationPortRange: '*',
|
|
178
|
-
},
|
|
179
|
-
//Denied others
|
|
180
|
-
// {
|
|
181
|
-
// name: 'denied_others_in_gateway',
|
|
182
|
-
// description: 'Denied others to Gateway',
|
|
183
|
-
// priority: 3000 + start++,
|
|
184
|
-
// protocol: 'Tcp',
|
|
185
|
-
// access: 'Deny',
|
|
186
|
-
// direction: 'Inbound',
|
|
187
|
-
// sourceAddressPrefix: '*',
|
|
188
|
-
// sourcePortRange: '*',
|
|
189
|
-
// destinationAddressPrefix: addressPrefix,
|
|
190
|
-
// destinationPortRange: '*',
|
|
191
|
-
// },
|
|
192
|
-
];
|
|
193
|
-
};
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm5ldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WTmV0L1ZuZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3REFBd0Q7QUFLeEQscUNBTWtCO0FBQ2xCLDZDQUErQztBQUMvQyx1Q0FBZ0M7QUFDaEMscUNBQXFEO0FBZ0RyRCxrQkFBZSxDQUFDLEVBQ2QsSUFBSSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sYUFBYSxFQUNiLE9BQU8sR0FBRyxFQUFFLEVBQ1osVUFBVSxFQUNWLFFBQVEsR0FBRyxFQUFFLEdBQ0gsRUFBRSxFQUFFO0lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBVyxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUNqQixRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUs7UUFDN0IsSUFBSSxLQUFLLEVBQWlELENBQUM7SUFFN0QsWUFBWTtJQUNaLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSw2QkFBb0I7WUFDMUIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO1lBQ3RELHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxjQUFjO0lBQ2QsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSw0QkFBbUI7WUFDekIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUM3Qyx1QkFBdUIsRUFBRSxLQUFLO1NBQy9CLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDakIsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixtQkFBbUIsRUFBRSxHQUFHO1lBQ3hCLGVBQWUsRUFBRSxHQUFHO1lBQ3BCLHdCQUF3QixFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUN4RCxvQkFBb0IsRUFBRSxLQUFLO1lBQzNCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSx5QkFBZ0I7WUFDdEIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYTtZQUM5Qyx1QkFBdUIsRUFBRSxLQUFLO1NBQy9CLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxJQUFJLEVBQUUsbUNBQTBCO2dCQUNoQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7Z0JBQ3hELHVCQUF1QixFQUFFLEtBQUs7YUFDL0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixJQUFJLGFBQWEsR0FBNkMsU0FBUyxDQUFDO0lBQ3hFLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3hELGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxlQUFlO2dCQUNyQixtQkFBbUIsRUFBRSxHQUFHO2dCQUN4QixlQUFlLEVBQUUsR0FBRztnQkFDcEIsd0JBQXdCLEVBQUUsVUFBVTtnQkFDcEMsb0JBQW9CLEVBQUUsR0FBRztnQkFDekIsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsU0FBUyxFQUFFLFVBQVU7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLEVBQUUsNEJBQTRCO2FBQzdDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRTtZQUM5RCx3QkFBd0IsRUFBRSxHQUFHLEtBQUssS0FBSztZQUN2QyxHQUFHLEtBQUs7WUFDUixhQUFhO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7SUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUMxRCxjQUFjLEVBQUUsR0FBRyxLQUFLLFFBQVE7UUFDaEMsR0FBRyxLQUFLO1FBQ1IsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUU7S0FDekMsQ0FBQyxDQUFDO0lBRUgsYUFBYTtJQUNiLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7UUFDN0Msa0JBQWtCLEVBQUUsS0FBSztRQUN6QixZQUFZLEVBQUU7WUFDWixlQUFlLEVBQUUsYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7U0FDdEU7UUFDRCxHQUFHLEtBQUs7UUFDUixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFFcEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN6QixJQUFBLGdCQUFZLEVBQUM7WUFDWCxNQUFNLEVBQUUsQ0FBQztZQUNULFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSztZQUVMLGFBQWEsRUFDWCxDQUFDLENBQUMsbUJBQW1CLEtBQUssS0FBSztnQkFDL0IsQ0FBQyx5QkFBZ0IsRUFBRSw0QkFBbUIsRUFBRSwwQkFBaUIsQ0FBQyxDQUFDLFFBQVEsQ0FDakUsQ0FBQyxDQUFDLElBQUksQ0FDUDtnQkFDQyxDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUMsYUFBYTtZQUVuQixVQUFVLEVBQUU7Z0JBQ1YsNEJBQW1CO2dCQUNuQix5QkFBZ0I7Z0JBQ2hCLDBCQUFpQjthQUNsQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUMsVUFBVTtTQUNmLENBQUMsQ0FDSDtRQUVELG9CQUFvQixFQUFFLE1BQU0sS0FBSyxTQUFTO1FBQzFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDeEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBSWYsRUFBRSxDQUFDO0lBRVAsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNyQixhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyw0QkFBbUIsQ0FBQyxDQUFDO0lBRXpELGdCQUFnQjtJQUNoQixJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDckUsSUFBQSxpQkFBTyxFQUFDO1lBQ04sSUFBSTtZQUNKLEtBQUs7WUFDTCxRQUFRLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUcsQ0FBQztZQUMzQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixPQUFPO1FBQ0wsSUFBSTtRQUVKLGNBQWMsRUFBRSxhQUFhLENBQUMseUJBQWdCLENBQUM7UUFDL0Msb0JBQW9CLEVBQUUsYUFBYSxDQUFDLG1DQUEwQixDQUFDO1FBQy9ELGdCQUFnQixFQUFFLGFBQWEsQ0FBQyw2QkFBb0IsQ0FBQztRQUVyRCxhQUFhO1FBQ2IsT0FBTyxFQUFFLGFBQWE7UUFFdEIsYUFBYTtRQUNiLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEVBQzFCLGFBQWEsRUFDYixPQUFPLEdBSVIsRUFBbUQsRUFBRTtJQUNwRCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7SUFFaEIsT0FBTztRQUNMLHlDQUF5QztRQUN6QztZQUNFLElBQUksRUFBRSxrQ0FBa0M7WUFDeEMsV0FBVyxFQUFFLG9EQUFvRDtZQUNqRSxRQUFRLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBRTtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxPQUFPO1lBQ2YsU0FBUyxFQUFFLFNBQVM7WUFFcEIsbUJBQW1CLEVBQUUsVUFBVTtZQUMvQixlQUFlLEVBQUUsR0FBRztZQUNwQix3QkFBd0IsRUFBRSxhQUFhO1lBQ3ZDLHFCQUFxQixFQUNuQixPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztTQUN2RDtRQUVEO1lBQ0UsSUFBSSxFQUFFLGlDQUFpQztZQUN2QyxXQUFXLEVBQUUsNkNBQTZDO1lBQzFELFFBQVEsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsU0FBUztZQUVwQixtQkFBbUIsRUFBRSxVQUFVO1lBQy9CLGVBQWUsRUFBRSxHQUFHO1lBQ3BCLHdCQUF3QixFQUFFLGFBQWE7WUFDdkMsb0JBQW9CLEVBQUUsS0FBSztTQUM1QjtRQUVEO1lBQ0UsSUFBSSxFQUFFLCtCQUErQjtZQUNyQyxXQUFXLEVBQUUsZ0NBQWdDO1lBQzdDLFFBQVEsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsU0FBUztZQUVwQixtQkFBbUIsRUFBRSxtQkFBbUI7WUFDeEMsZUFBZSxFQUFFLEdBQUc7WUFDcEIsd0JBQXdCLEVBQUUsYUFBYTtZQUN2QyxvQkFBb0IsRUFBRSxHQUFHO1NBQzFCO1FBRUQsZUFBZTtRQUNmLElBQUk7UUFDSixzQ0FBc0M7UUFDdEMsNkNBQTZDO1FBQzdDLDhCQUE4QjtRQUM5QixxQkFBcUI7UUFDckIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUUxQiw4QkFBOEI7UUFDOUIsMEJBQTBCO1FBQzFCLDZDQUE2QztRQUM3QywrQkFBK0I7UUFDL0IsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm5ldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WTmV0L1ZuZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3REFBd0Q7QUFLeEQscUNBTWtCO0FBQ2xCLDZDQUErQztBQUMvQyxxQ0FBcUQ7QUFDckQsbURBQTRDO0FBQzVDLDZDQUFzQztBQUN0Qyw4RUFBdUU7QUF3RXZFLGtCQUFlLENBQUMsRUFDZCxJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sRUFDTixhQUFhLEVBQ2IsT0FBTyxHQUFHLEVBQUUsRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFFBQVEsR0FBRyxFQUFFLEVBQ2IsU0FBUyxHQUNDLEVBQWMsRUFBRTtJQUMxQixNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFXLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBRTFELFlBQVk7SUFDWixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDWCxJQUFJLEVBQUUsNkJBQW9CO1lBQzFCLGFBQWEsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtZQUN0RCx1QkFBdUIsRUFBRSxLQUFLO1lBQzlCLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsZ0NBQXNCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQUksUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDWCxJQUFJLEVBQUUsMEJBQWlCO1lBQ3ZCLGFBQWEsRUFBRSxRQUFRLENB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
|
package/VNet/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as network from
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import { FirewallSkus } from
|
|
7
|
-
import { FirewallPolicyProps } from
|
|
8
|
-
import { SubnetProps } from
|
|
1
|
+
import * as network from "@pulumi/azure-native/network";
|
|
2
|
+
import { Input } from "@pulumi/pulumi";
|
|
3
|
+
import * as pulumi from "@pulumi/pulumi";
|
|
4
|
+
import { BasicMonitorArgs, ResourceGroupInfo } from "../types";
|
|
5
|
+
import { CustomSecurityRuleArgs } from "./types";
|
|
6
|
+
import { FirewallSkus } from "./Firewall";
|
|
7
|
+
import { FirewallPolicyProps } from "./types";
|
|
8
|
+
import { SubnetProps } from "./Subnet";
|
|
9
9
|
interface Props {
|
|
10
10
|
name: string;
|
|
11
11
|
group: ResourceGroupInfo;
|
|
@@ -17,7 +17,6 @@ interface Props {
|
|
|
17
17
|
features?: {
|
|
18
18
|
enableBastion?: {
|
|
19
19
|
subnetPrefix: string;
|
|
20
|
-
disableBastionHostCreation?: boolean;
|
|
21
20
|
};
|
|
22
21
|
enableAppGateway?: {
|
|
23
22
|
subnetPrefix: string;
|
|
@@ -27,8 +26,7 @@ interface Props {
|
|
|
27
26
|
/** Only required if Firewall is Basic tier */
|
|
28
27
|
managementSubnetPrefix?: string;
|
|
29
28
|
sku?: FirewallSkus;
|
|
30
|
-
|
|
31
|
-
policy: Omit<FirewallPolicyProps, 'enabled'>;
|
|
29
|
+
policy: Omit<FirewallPolicyProps, "enabled">;
|
|
32
30
|
/** set this is TRUE if want to create firewall subnet but not create firewall component */
|
|
33
31
|
disabledFirewallCreation?: boolean;
|
|
34
32
|
};
|
|
@@ -42,7 +40,7 @@ interface Props {
|
|
|
42
40
|
allowInboundInternetAccess?: boolean;
|
|
43
41
|
/**Add Security rule to block/allow internet if it is TRUE*/
|
|
44
42
|
allowOutboundInternetAccess?: boolean;
|
|
45
|
-
rules?: Input<
|
|
43
|
+
rules?: Input<CustomSecurityRuleArgs>[];
|
|
46
44
|
};
|
|
47
45
|
};
|
|
48
46
|
monitorConfig?: BasicMonitorArgs;
|
|
@@ -53,13 +51,14 @@ declare const _default: ({ group, name, ddosId, addressSpace, publicIpAddress, s
|
|
|
53
51
|
policy: network.FirewallPolicy | undefined;
|
|
54
52
|
} | undefined;
|
|
55
53
|
vnet: import("@pulumi/azure-native/network/virtualNetwork").VirtualNetwork;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
appGatewaySubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
55
|
+
gatewaySubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
56
|
+
firewallManageSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
57
|
+
routeTable?: import("@pulumi/azure-native/network/routeTable").RouteTable | undefined;
|
|
58
|
+
firewallSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
59
|
+
bastionSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
60
|
+
findSubnet: (name: string) => pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
|
|
61
61
|
securityGroup: import("@pulumi/azure-native/network/networkSecurityGroup").NetworkSecurityGroup | undefined;
|
|
62
|
-
routeTable: import("@pulumi/azure-native/network/routeTable").RouteTable;
|
|
63
62
|
publicIpAddress: import("@pulumi/azure-native/network/publicIPAddress").PublicIPAddress | undefined;
|
|
64
63
|
};
|
|
65
64
|
export default _default;
|
package/VNet/index.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const network = require("@pulumi/azure-native/network");
|
|
4
|
-
const pulumi_1 = require("@pulumi/pulumi");
|
|
5
|
-
const AzureEnv_1 = require("../Common/AzureEnv");
|
|
6
4
|
const NetworkRuote_1 = require("@drunk-pulumi/azure-providers/NetworkRuote");
|
|
7
5
|
const Firewall_1 = require("./Firewall");
|
|
8
6
|
const NetworkPeering_1 = require("./NetworkPeering");
|
|
9
7
|
const Vnet_1 = require("./Vnet");
|
|
8
|
+
const Helper_1 = require("./Helper");
|
|
10
9
|
exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets, features = {}, monitorConfig, ...others }) => {
|
|
11
|
-
const securities = features.securityGroup?.rules ||
|
|
12
|
-
new Array();
|
|
10
|
+
const securities = features.securityGroup?.rules || [];
|
|
13
11
|
const routes = new Array();
|
|
14
12
|
if (publicIpAddress) {
|
|
15
13
|
//Add route from IpAddress to internet
|
|
@@ -22,14 +20,14 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
|
|
|
22
20
|
} //Allow Internet to public IpAddress security group
|
|
23
21
|
else if (features.securityGroup?.allowInboundInternetAccess)
|
|
24
22
|
securities.push({
|
|
25
|
-
name:
|
|
26
|
-
sourceAddressPrefix:
|
|
27
|
-
sourcePortRange:
|
|
23
|
+
name: "allow-inbound-internet-publicIpAddress",
|
|
24
|
+
sourceAddressPrefix: "*",
|
|
25
|
+
sourcePortRange: "*",
|
|
28
26
|
destinationAddressPrefix: publicIpAddress.ipAddress.apply((i) => `${i}/32`),
|
|
29
|
-
destinationPortRanges: [
|
|
30
|
-
protocol:
|
|
31
|
-
access:
|
|
32
|
-
direction:
|
|
27
|
+
destinationPortRanges: ["443", "80"],
|
|
28
|
+
protocol: "TCP",
|
|
29
|
+
access: "Allow",
|
|
30
|
+
direction: "Inbound",
|
|
33
31
|
priority: 200 + securities.length + 1,
|
|
34
32
|
});
|
|
35
33
|
}
|
|
@@ -41,32 +39,32 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
|
|
|
41
39
|
//Update route to firewall IpAddress
|
|
42
40
|
routes.push({
|
|
43
41
|
name: `vnet-to-firewall`,
|
|
44
|
-
addressPrefix:
|
|
42
|
+
addressPrefix: "0.0.0.0/0",
|
|
45
43
|
nextHopType: network.RouteNextHopType.VirtualAppliance,
|
|
46
44
|
nextHopIpAddress: pp.firewallPrivateIpAddress,
|
|
47
45
|
});
|
|
48
46
|
//Allow Vnet to Firewall
|
|
49
47
|
securities.push({
|
|
50
48
|
name: `allow-vnet-to-firewall`,
|
|
51
|
-
sourceAddressPrefix:
|
|
52
|
-
sourcePortRange:
|
|
49
|
+
sourceAddressPrefix: "*",
|
|
50
|
+
sourcePortRange: "*",
|
|
53
51
|
destinationAddressPrefix: pp.firewallPrivateIpAddress,
|
|
54
|
-
destinationPortRange:
|
|
55
|
-
protocol:
|
|
56
|
-
access:
|
|
57
|
-
direction:
|
|
52
|
+
destinationPortRange: "*",
|
|
53
|
+
protocol: "*",
|
|
54
|
+
access: "Allow",
|
|
55
|
+
direction: "Outbound",
|
|
58
56
|
priority: 100,
|
|
59
57
|
});
|
|
60
58
|
}
|
|
61
59
|
securities.push({
|
|
62
60
|
name: `allow-vnet-to-vnet-${index}`,
|
|
63
|
-
sourceAddressPrefix:
|
|
64
|
-
sourcePortRange:
|
|
65
|
-
destinationAddressPrefix:
|
|
66
|
-
destinationPortRange:
|
|
67
|
-
protocol:
|
|
68
|
-
access:
|
|
69
|
-
direction:
|
|
61
|
+
sourceAddressPrefix: "VirtualNetwork",
|
|
62
|
+
sourcePortRange: "*",
|
|
63
|
+
destinationAddressPrefix: "VirtualNetwork",
|
|
64
|
+
destinationPortRange: "*",
|
|
65
|
+
protocol: "*",
|
|
66
|
+
access: "Allow",
|
|
67
|
+
direction: "Outbound",
|
|
70
68
|
priority: 101,
|
|
71
69
|
});
|
|
72
70
|
});
|
|
@@ -89,7 +87,7 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
|
|
|
89
87
|
appGatewaySubnet: features.enableAppGateway
|
|
90
88
|
? {
|
|
91
89
|
addressPrefix: features.enableAppGateway.subnetPrefix,
|
|
92
|
-
version:
|
|
90
|
+
version: "v1",
|
|
93
91
|
}
|
|
94
92
|
: undefined,
|
|
95
93
|
firewall: features.enableFirewall
|
|
@@ -101,7 +99,6 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
|
|
|
101
99
|
bastion: features.enableBastion
|
|
102
100
|
? {
|
|
103
101
|
addressPrefix: features.enableBastion.subnetPrefix,
|
|
104
|
-
disableBastionHostCreation: features.enableBastion.disableBastionHostCreation,
|
|
105
102
|
}
|
|
106
103
|
: undefined,
|
|
107
104
|
},
|
|
@@ -115,53 +112,43 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
|
|
|
115
112
|
name,
|
|
116
113
|
group,
|
|
117
114
|
policy: {
|
|
118
|
-
enabled: true,
|
|
119
115
|
...features.enableFirewall.policy,
|
|
120
116
|
},
|
|
121
117
|
outbound: [
|
|
122
118
|
{
|
|
123
|
-
name: `${name}-outbound`,
|
|
124
119
|
publicIpAddress: publicIpAddress,
|
|
125
120
|
subnetId: vnet.firewallSubnet.apply((c) => c.id),
|
|
126
121
|
},
|
|
127
122
|
],
|
|
128
|
-
management: features
|
|
123
|
+
management: features?.enableFirewall.managementSubnetPrefix
|
|
129
124
|
? {
|
|
130
|
-
name: `${name}-management`,
|
|
131
|
-
publicIpAddress: features.enableFirewall.publicManageIpAddress,
|
|
132
125
|
subnetId: vnet.firewallManageSubnet.apply((c) => c.id),
|
|
133
126
|
}
|
|
134
127
|
: undefined,
|
|
135
128
|
sku: features.enableFirewall.sku,
|
|
136
|
-
routeTableName: vnet.routeTable
|
|
129
|
+
routeTableName: vnet.routeTable?.name,
|
|
137
130
|
monitorConfig,
|
|
138
|
-
dependsOn: [vnet.
|
|
131
|
+
dependsOn: [vnet.vnet],
|
|
139
132
|
});
|
|
140
133
|
}
|
|
141
134
|
//Vnet Peering
|
|
142
135
|
if (features.vnetPeering) {
|
|
143
136
|
features.vnetPeering.map((pp) => {
|
|
144
|
-
|
|
145
|
-
(0,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
firstVNetName: vnet.vnet.name,
|
|
152
|
-
firstVNetResourceGroupName: group.resourceGroupName,
|
|
153
|
-
secondVNetName: info.name,
|
|
154
|
-
secondVNetResourceGroupName: info.group.resourceGroupName,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
137
|
+
const info = (0, Helper_1.parseVnetInfoFromId)(pp.vnetId);
|
|
138
|
+
(0, NetworkPeering_1.default)({
|
|
139
|
+
firstVnet: {
|
|
140
|
+
vnetName: vnet.vnet.name,
|
|
141
|
+
resourceGroupName: group.resourceGroupName,
|
|
142
|
+
},
|
|
143
|
+
secondVnet: info,
|
|
157
144
|
});
|
|
158
145
|
//Update route to firewall IpAddress
|
|
159
|
-
if (pp.firewallPrivateIpAddress) {
|
|
146
|
+
if (pp.firewallPrivateIpAddress && vnet.routeTable) {
|
|
160
147
|
new NetworkRuote_1.NetworkRouteResource(`${name}-vnet-to-firewall`, {
|
|
161
|
-
routeName:
|
|
148
|
+
routeName: "vnet-to-firewall",
|
|
162
149
|
...group,
|
|
163
150
|
routeTableName: vnet.routeTable.name,
|
|
164
|
-
addressPrefix:
|
|
151
|
+
addressPrefix: "0.0.0.0/0",
|
|
165
152
|
nextHopType: network.RouteNextHopType.VirtualAppliance,
|
|
166
153
|
nextHopIpAddress: pp.firewallPrivateIpAddress,
|
|
167
154
|
}, {
|
|
@@ -186,13 +173,13 @@ const createFirewall = ({ name, group, routeTableName, dependsOn = [], ...others
|
|
|
186
173
|
routeName: `vnet-to-firewall`,
|
|
187
174
|
...group,
|
|
188
175
|
routeTableName: routeTableName,
|
|
189
|
-
addressPrefix:
|
|
176
|
+
addressPrefix: "0.0.0.0/0",
|
|
190
177
|
nextHopType: network.RouteNextHopType.VirtualAppliance,
|
|
191
|
-
nextHopIpAddress: rs.firewall.ipConfigurations.apply((c) => c ? c[0].privateIPAddress :
|
|
178
|
+
nextHopIpAddress: rs.firewall.ipConfigurations.apply((c) => c ? c[0].privateIPAddress : ""),
|
|
192
179
|
}, {
|
|
193
|
-
dependsOn: [
|
|
180
|
+
dependsOn: [rs.firewall],
|
|
194
181
|
});
|
|
195
182
|
}
|
|
196
183
|
return rs;
|
|
197
184
|
};
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVk5ldC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdEQUF3RDtBQUl4RCw2RUFBa0Y7QUFHbEYseUNBQW1FO0FBRW5FLHFEQUEyQztBQUUzQyxpQ0FBMEI7QUFDMUIscUNBQStDO0FBK0MvQyxrQkFBZSxDQUFDLEVBQ2QsS0FBSyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sWUFBWSxFQUNaLGVBQWUsRUFDZixPQUFPLEVBQ1AsUUFBUSxHQUFHLEVBQUUsRUFDYixhQUFhLEVBQ2IsR0FBRyxNQUFNLEVBQ0gsRUFBRSxFQUFFO0lBQ1YsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFtQyxDQUFDO0lBRTVELElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsc0NBQXNDO1FBQ3RDLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLHNCQUFzQjtnQkFDNUIsYUFBYSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxXQUFXLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVE7YUFDL0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLG1EQUFtRDthQUNoRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCO1lBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLHdDQUF3QztnQkFDOUMsbUJBQW1CLEVBQUUsR0FBRztnQkFDeEIsZUFBZSxFQUFFLEdBQUc7Z0JBQ3BCLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FB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
|