@aws-cdk/aws-ec2-alpha 2.156.0-alpha.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 +8230 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +259 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +207 -0
- package/awslint.json +7 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +26 -0
- package/lib/ipam.d.ts +250 -0
- package/lib/ipam.js +255 -0
- package/lib/route.d.ts +390 -0
- package/lib/route.js +270 -0
- package/lib/subnet-v2.d.ts +152 -0
- package/lib/subnet-v2.js +272 -0
- package/lib/util.d.ts +157 -0
- package/lib/util.js +310 -0
- package/lib/vpc-v2-base.d.ts +132 -0
- package/lib/vpc-v2-base.js +264 -0
- package/lib/vpc-v2.d.ts +222 -0
- package/lib/vpc-v2.js +303 -0
- package/package.json +110 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +15 -0
package/lib/route.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RouteTable = exports.Route = exports.RouteTargetType = exports.NatGateway = exports.VPNGateway = exports.InternetGateway = exports.EgressOnlyInternetGateway = exports.NatConnectivityType = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
|
+
const core_1 = require("aws-cdk-lib/core");
|
|
9
|
+
/**
|
|
10
|
+
* Indicates whether the NAT gateway supports public or private connectivity.
|
|
11
|
+
* The default is public connectivity.
|
|
12
|
+
* See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-connectivitytype
|
|
13
|
+
*/
|
|
14
|
+
var NatConnectivityType;
|
|
15
|
+
(function (NatConnectivityType) {
|
|
16
|
+
/**
|
|
17
|
+
* Sets Connectivity type to PUBLIC
|
|
18
|
+
*/
|
|
19
|
+
NatConnectivityType["PUBLIC"] = "public";
|
|
20
|
+
/**
|
|
21
|
+
* Sets Connectivity type to PRIVATE
|
|
22
|
+
*/
|
|
23
|
+
NatConnectivityType["PRIVATE"] = "private";
|
|
24
|
+
})(NatConnectivityType || (exports.NatConnectivityType = NatConnectivityType = {}));
|
|
25
|
+
/**
|
|
26
|
+
* Creates an egress-only internet gateway
|
|
27
|
+
* @resource AWS::EC2::EgressOnlyInternetGateway
|
|
28
|
+
*/
|
|
29
|
+
class EgressOnlyInternetGateway extends core_1.Resource {
|
|
30
|
+
constructor(scope, id, props) {
|
|
31
|
+
super(scope, id);
|
|
32
|
+
try {
|
|
33
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayProps(props);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
37
|
+
Error.captureStackTrace(error, EgressOnlyInternetGateway);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
this.routerType = aws_ec2_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY;
|
|
42
|
+
this.resource = new aws_ec2_1.CfnEgressOnlyInternetGateway(this, 'EIGW', {
|
|
43
|
+
vpcId: props.vpc.vpcId,
|
|
44
|
+
});
|
|
45
|
+
this.node.defaultChild = this.resource;
|
|
46
|
+
this.routerTargetId = this.resource.attrId;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.EgressOnlyInternetGateway = EgressOnlyInternetGateway;
|
|
50
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
51
|
+
EgressOnlyInternetGateway[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.EgressOnlyInternetGateway", version: "2.156.0-alpha.0" };
|
|
52
|
+
/**
|
|
53
|
+
* Creates an internet gateway
|
|
54
|
+
* @resource AWS::EC2::InternetGateway
|
|
55
|
+
*/
|
|
56
|
+
class InternetGateway extends core_1.Resource {
|
|
57
|
+
constructor(scope, id, props) {
|
|
58
|
+
super(scope, id);
|
|
59
|
+
try {
|
|
60
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_InternetGatewayProps(props);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
64
|
+
Error.captureStackTrace(error, InternetGateway);
|
|
65
|
+
}
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
this.routerType = aws_ec2_1.RouterType.GATEWAY;
|
|
69
|
+
this.resource = new aws_ec2_1.CfnInternetGateway(this, 'IGW', {});
|
|
70
|
+
this.node.defaultChild = this.resource;
|
|
71
|
+
this.routerTargetId = this.resource.attrInternetGatewayId;
|
|
72
|
+
this.vpcId = props.vpc.vpcId;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.InternetGateway = InternetGateway;
|
|
76
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
77
|
+
InternetGateway[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.InternetGateway", version: "2.156.0-alpha.0" };
|
|
78
|
+
/**
|
|
79
|
+
* Creates a virtual private gateway
|
|
80
|
+
* @resource AWS::EC2::VPNGateway
|
|
81
|
+
*/
|
|
82
|
+
class VPNGateway extends core_1.Resource {
|
|
83
|
+
constructor(scope, id, props) {
|
|
84
|
+
super(scope, id);
|
|
85
|
+
try {
|
|
86
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VPNGatewayProps(props);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
90
|
+
Error.captureStackTrace(error, VPNGateway);
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
this.routerType = aws_ec2_1.RouterType.GATEWAY;
|
|
95
|
+
this.resource = new aws_ec2_1.CfnVPNGateway(this, 'IGW', {
|
|
96
|
+
type: props.type,
|
|
97
|
+
amazonSideAsn: props.amazonSideAsn,
|
|
98
|
+
});
|
|
99
|
+
this.node.defaultChild = this.resource;
|
|
100
|
+
this.routerTargetId = this.resource.attrVpnGatewayId;
|
|
101
|
+
this.vpcId = props.vpc.vpcId;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.VPNGateway = VPNGateway;
|
|
105
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
106
|
+
VPNGateway[_c] = { fqn: "@aws-cdk/aws-ec2-alpha.VPNGateway", version: "2.156.0-alpha.0" };
|
|
107
|
+
/**
|
|
108
|
+
* Creates a network address translation (NAT) gateway
|
|
109
|
+
* @resource AWS::EC2::NatGateway
|
|
110
|
+
*/
|
|
111
|
+
class NatGateway extends core_1.Resource {
|
|
112
|
+
constructor(scope, id, props) {
|
|
113
|
+
super(scope, id);
|
|
114
|
+
try {
|
|
115
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_NatGatewayProps(props);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
119
|
+
Error.captureStackTrace(error, NatGateway);
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
this.routerType = aws_ec2_1.RouterType.NAT_GATEWAY;
|
|
124
|
+
this.connectivityType = props.connectivityType || NatConnectivityType.PUBLIC;
|
|
125
|
+
this.maxDrainDuration = props.maxDrainDuration || core_1.Duration.seconds(350);
|
|
126
|
+
// If user does not provide EIP, generate one for them
|
|
127
|
+
var aId;
|
|
128
|
+
if (this.connectivityType == 'public') {
|
|
129
|
+
if (!props.allocationId) {
|
|
130
|
+
let eip = new aws_ec2_1.CfnEIP(this, 'EIP', {
|
|
131
|
+
domain: props.vpc?.vpcId,
|
|
132
|
+
});
|
|
133
|
+
aId = eip.attrAllocationId;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
aId = props.allocationId;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
this.resource = new aws_ec2_1.CfnNatGateway(this, 'NATGateway', {
|
|
140
|
+
subnetId: props.subnet.subnetId,
|
|
141
|
+
allocationId: aId,
|
|
142
|
+
maxDrainDurationSeconds: props.maxDrainDuration?.toSeconds(),
|
|
143
|
+
secondaryAllocationIds: props.secondaryAllocationIds,
|
|
144
|
+
...props,
|
|
145
|
+
});
|
|
146
|
+
this.routerTargetId = this.resource.attrNatGatewayId;
|
|
147
|
+
this.node.defaultChild = this.resource;
|
|
148
|
+
this.node.addDependency(props.subnet.internetConnectivityEstablished);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.NatGateway = NatGateway;
|
|
152
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
153
|
+
NatGateway[_d] = { fqn: "@aws-cdk/aws-ec2-alpha.NatGateway", version: "2.156.0-alpha.0" };
|
|
154
|
+
/**
|
|
155
|
+
* The gateway or endpoint targeted by the route.
|
|
156
|
+
*/
|
|
157
|
+
class RouteTargetType {
|
|
158
|
+
constructor(props) {
|
|
159
|
+
try {
|
|
160
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTargetProps(props);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
164
|
+
Error.captureStackTrace(error, RouteTargetType);
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
if (props.gateway && props.endpoint) {
|
|
169
|
+
throw new Error('Cannot specify both gateway and endpoint');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.gateway = props.gateway;
|
|
173
|
+
this.endpoint = props.endpoint;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.RouteTargetType = RouteTargetType;
|
|
178
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
179
|
+
RouteTargetType[_e] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTargetType", version: "2.156.0-alpha.0" };
|
|
180
|
+
/**
|
|
181
|
+
* Creates a new route with added functionality.
|
|
182
|
+
* @resource AWS::EC2::Route
|
|
183
|
+
*/
|
|
184
|
+
class Route extends core_1.Resource {
|
|
185
|
+
constructor(scope, id, props) {
|
|
186
|
+
super(scope, id);
|
|
187
|
+
try {
|
|
188
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteProps(props);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
192
|
+
Error.captureStackTrace(error, Route);
|
|
193
|
+
}
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
this.destination = props.destination;
|
|
197
|
+
this.target = props.target;
|
|
198
|
+
this.routeTable = props.routeTable;
|
|
199
|
+
this.targetRouterType = this.target.gateway ? this.target.gateway.routerType : aws_ec2_1.RouterType.VPC_ENDPOINT;
|
|
200
|
+
// Gateway generates route automatically via its RouteTable, thus we don't need to generate the resource for it
|
|
201
|
+
if (!(this.target.endpoint instanceof aws_ec2_1.GatewayVpcEndpoint)) {
|
|
202
|
+
this.resource = new aws_ec2_1.CfnRoute(this, 'Route', {
|
|
203
|
+
routeTableId: this.routeTable.routeTableId,
|
|
204
|
+
destinationCidrBlock: this.destination,
|
|
205
|
+
destinationIpv6CidrBlock: this.destination,
|
|
206
|
+
[routerTypeToPropName(this.targetRouterType)]: this.target.gateway ? this.target.gateway.routerTargetId :
|
|
207
|
+
this.target.endpoint ? this.target.endpoint.vpcEndpointId : null,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
this.node.defaultChild = this.resource;
|
|
211
|
+
if (this.targetRouterType == aws_ec2_1.RouterType.GATEWAY) {
|
|
212
|
+
if (this.target.gateway instanceof InternetGateway) {
|
|
213
|
+
new aws_ec2_1.CfnVPCGatewayAttachment(this, 'GWAttachment', {
|
|
214
|
+
vpcId: this.target.gateway.vpcId,
|
|
215
|
+
internetGatewayId: this.target.gateway.routerTargetId,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
else if (this.target.gateway instanceof VPNGateway) {
|
|
219
|
+
new aws_ec2_1.CfnVPCGatewayAttachment(this, 'GWAttachment', {
|
|
220
|
+
vpcId: this.target.gateway.vpcId,
|
|
221
|
+
vpnGatewayId: this.target.gateway.routerTargetId,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.Route = Route;
|
|
228
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
229
|
+
Route[_f] = { fqn: "@aws-cdk/aws-ec2-alpha.Route", version: "2.156.0-alpha.0" };
|
|
230
|
+
/**
|
|
231
|
+
* Creates a route table for the specified VPC
|
|
232
|
+
* @resource AWS::EC2::RouteTable
|
|
233
|
+
*/
|
|
234
|
+
class RouteTable extends core_1.Resource {
|
|
235
|
+
constructor(scope, id, props) {
|
|
236
|
+
super(scope, id);
|
|
237
|
+
try {
|
|
238
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_RouteTableProps(props);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
242
|
+
Error.captureStackTrace(error, RouteTable);
|
|
243
|
+
}
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
this.resource = new aws_ec2_1.CfnRouteTable(this, 'RouteTable', {
|
|
247
|
+
vpcId: props.vpc.vpcId,
|
|
248
|
+
});
|
|
249
|
+
this.node.defaultChild = this.resource;
|
|
250
|
+
this.routeTableId = this.resource.attrRouteTableId;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.RouteTable = RouteTable;
|
|
254
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
255
|
+
RouteTable[_g] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTable", version: "2.156.0-alpha.0" };
|
|
256
|
+
function routerTypeToPropName(routerType) {
|
|
257
|
+
return ({
|
|
258
|
+
[aws_ec2_1.RouterType.CARRIER_GATEWAY]: 'carrierGatewayId',
|
|
259
|
+
[aws_ec2_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY]: 'egressOnlyInternetGatewayId',
|
|
260
|
+
[aws_ec2_1.RouterType.GATEWAY]: 'gatewayId',
|
|
261
|
+
[aws_ec2_1.RouterType.INSTANCE]: 'instanceId',
|
|
262
|
+
[aws_ec2_1.RouterType.LOCAL_GATEWAY]: 'localGatewayId',
|
|
263
|
+
[aws_ec2_1.RouterType.NAT_GATEWAY]: 'natGatewayId',
|
|
264
|
+
[aws_ec2_1.RouterType.NETWORK_INTERFACE]: 'networkInterfaceId',
|
|
265
|
+
[aws_ec2_1.RouterType.TRANSIT_GATEWAY]: 'transitGatewayId',
|
|
266
|
+
[aws_ec2_1.RouterType.VPC_PEERING_CONNECTION]: 'vpcPeeringConnectionId',
|
|
267
|
+
[aws_ec2_1.RouterType.VPC_ENDPOINT]: 'vpcEndpointId',
|
|
268
|
+
})[routerType];
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpREFBc1E7QUFFdFEsMkNBQXNEO0FBR3REOzs7O0dBSUc7QUFDSCxJQUFZLG1CQVNYO0FBVEQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCx3Q0FBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILDBDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFUVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQVM5QjtBQWdLRDs7O0dBR0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLGVBQVE7SUFnQnJELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs7Ozs7OytDQWpCUix5QkFBeUI7Ozs7UUFtQmxDLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyw0QkFBNEIsQ0FBQztRQUUxRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksc0NBQTRCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUM3RCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztLQUM1Qzs7QUEzQkgsOERBNEJDOzs7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLGVBQWdCLFNBQVEsZUFBUTtJQXFCM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBdEJSLGVBQWU7Ozs7UUF3QnhCLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENB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QkFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsb0JBQW9CO1FBQ3BELENBQUMsb0JBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxrQkFBa0I7UUFDaEQsQ0FBQyxvQkFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsd0JBQXdCO1FBQzdELENBQUMsb0JBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxlQUFlO0tBQzNDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuRUlQLCBDZm5FZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5LCBDZm5JbnRlcm5ldEdhdGV3YXksIENmbk5hdEdhdGV3YXksIENmblJvdXRlLCBDZm5Sb3V0ZVRhYmxlLCBDZm5WUENHYXRld2F5QXR0YWNobWVudCwgQ2ZuVlBOR2F0ZXdheSwgR2F0ZXdheVZwY0VuZHBvaW50LCBJUm91dGVUYWJsZSwgSVN1Ym5ldCwgSVZwY0VuZHBvaW50LCBSb3V0ZXJUeXBlLCBWcG5Db25uZWN0aW9uVHlwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJRGVwZW5kYWJsZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlc291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBJVnBjVjIgfSBmcm9tICcuL3ZwYy12Mi1iYXNlJztcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgTkFUIGdhdGV3YXkgc3VwcG9ydHMgcHVibGljIG9yIHByaXZhdGUgY29ubmVjdGl2aXR5LlxuICogVGhlIGRlZmF1bHQgaXMgcHVibGljIGNvbm5lY3Rpdml0eS5cbiAqIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1uYXRnYXRld2F5Lmh0bWwjY2ZuLWVjMi1uYXRnYXRld2F5LWNvbm5lY3Rpdml0eXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gTmF0Q29ubmVjdGl2aXR5VHlwZSB7XG4gIC8qKlxuICAgKiBTZXRzIENvbm5lY3Rpdml0eSB0eXBlIHRvIFBVQkxJQ1xuICAgKi9cbiAgUFVCTElDID0gJ3B1YmxpYycsXG4gIC8qKlxuICAgKiBTZXRzIENvbm5lY3Rpdml0eSB0eXBlIHRvIFBSSVZBVEVcbiAgICovXG4gIFBSSVZBVEUgPSAncHJpdmF0ZScsXG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhIHJvdXRpbmcgdGFyZ2V0LCBzdWNoIGFzIGFuXG4gKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUm91dGVUYXJnZXQge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWdyZXNzT25seUludGVybmV0R2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXkuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGFuIGludGVybmV0IGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuZXRHYXRld2F5UHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuZXRHYXRld2F5TmFtZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGEgVlBOIGdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBOR2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIFZQTiBjb25uZWN0aW9uIHRoZSB2aXJ0dWFsIHByaXZhdGUgZ2F0ZXdheSBzdXBwb3J0cy5cbiAgICogQHNlZSBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdnBuZ2F0ZXdheS5odG1sI2Nmbi1lYzItdnBuZ2F0ZXdheS10eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBWcG5Db25uZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgVlBOIGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgQXV0b25vbW91cyBTeXN0ZW0gTnVtYmVyIChBU04pIGZvciB0aGUgQW1hem9uIHNpZGUgb2YgYSBCR1Agc2Vzc2lvbi5cbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYW1hem9uU2lkZUFzbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIFZQTiBnYXRld2F5LlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqL1xuICByZWFkb25seSB2cG5HYXRld2F5TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhIE5BVCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdEdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgc3VibmV0IGluIHdoaWNoIHRoZSBOQVQgZ2F0ZXdheSBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0OiBJU3VibmV0O1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyBpbiB3aGljaCB0aGUgTkFUIGdhdGV3YXkgaXMgbG9jYXRlZC5cbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBBbGxvY2F0aW9uSUQgb2YgRWxhc3RpYyBJUCBhZGRyZXNzIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIE5BVCBnYXRld2F5LiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGZvciBhIHB1YmxpYyBOQVRcbiAgICogZ2F0ZXdheSBhbmQgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRoIGEgcHJpdmF0ZSBOQVQgZ2F0ZXdheS5cbiAgICogQGRlZmF1bHQgYXR0ci5hbGxvY2F0aW9uSUQgb2YgYSBuZXcgRWxhc3RpYyBJUCBjcmVhdGVkIGJ5IGRlZmF1bHRcbiAgICogLy9UT0RPOiBBREQgTDIgZm9yIGVsYXN0aWMgaXBcbiAgICovXG4gIHJlYWRvbmx5IGFsbG9jYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICogQGRlZmF1bHQgcHVibGljXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aXZpdHlUeXBlPzogTmF0Q29ubmVjdGl2aXR5VHlwZTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgZm9yY2libHkgcmVsZWFzaW5nIHRoZVxuICAgKiBJUCBhZGRyZXNzZXMgaWYgY29ubmVjdGlvbnMgYXJlIHN0aWxsIGluIHByb2dyZXNzLlxuICAgKiBAZGVmYXVsdCAzNTAgc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4RHJhaW5EdXJhdGlvbj86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpdmF0ZSBJUHY0IGFkZHJlc3MgdG8gYXNzaWduIHRvIHRoZSBOQVQgZ2F0ZXdheS4gSWYgeW91IGRvbid0IHByb3ZpZGUgYW5cbiAgICogYWRkcmVzcywgYSBwcml2YXRlIElQdjQgYWRkcmVzcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVJcEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlY29uZGFyeSBFSVAgYWxsb2NhdGlvbiBJRHMuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLW5hdC1nYXRld2F5Lmh0bWwjbmF0LWdhdGV3YXktY3JlYXRpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeUFsbG9jYXRpb25JZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWNvbmRhcnkgcHJpdmF0ZSBJUHY0IGFkZHJlc3NlcyB5b3VcbiAgICogd2FudCB0byBhc3NpZ24gdG8gdGhlIE5BVCBnYXRld2F5LlxuICAgKlxuICAgKiBgU2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50YCBhbmQgYFNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3Nlc2AgY2Fubm90IGJlXG4gICAqIHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sI25hdC1nYXRld2F5LWNyZWF0aW5nXG4gICAqL1xuICByZWFkb25seSBzZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlY29uZGFyeSBwcml2YXRlIElQdjQgYWRkcmVzc2VzLlxuICAgKlxuICAgKiBgU2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50YCBhbmQgYFNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3Nlc2AgY2Fubm90IGJlXG4gICAqIHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sI25hdC1nYXRld2F5LWNyZWF0aW5nXG4gICAqL1xuICByZWFkb25seSBzZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIE5BVCBnYXRld2F5LlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqL1xuICByZWFkb25seSBuYXRHYXRld2F5TmFtZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheVxuICogQHJlc291cmNlIEFXUzo6RUMyOjpFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5XG4gKi9cbmV4cG9ydCBjbGFzcyBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVUYXJnZXQge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmbkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkVHUkVTU19PTkxZX0lOVEVSTkVUX0dBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkodGhpcywgJ0VJR1cnLCB7XG4gICAgICB2cGNJZDogcHJvcHMudnBjLnZwY0lkLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0cklkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcm5ldCBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OkludGVybmV0R2F0ZXdheVxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuZXRHYXRld2F5IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVUYXJnZXQge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyBmb3Igd2hpY2ggdG8gY3JlYXRlIHRoZSBpbnRlcm5ldCBnYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5ldCBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuSW50ZXJuZXRHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbnRlcm5ldEdhdGV3YXlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLkdBVEVXQVk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkludGVybmV0R2F0ZXdheSh0aGlzLCAnSUdXJywge30pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0ckludGVybmV0R2F0ZXdheUlkO1xuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmlydHVhbCBwcml2YXRlIGdhdGV3YXlcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6VlBOR2F0ZXdheVxuICovXG5leHBvcnQgY2xhc3MgVlBOR2F0ZXdheSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgVlBOIGdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFZQTiBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuVlBOR2F0ZXdheTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBOR2F0ZXdheVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucm91dGVyVHlwZSA9IFJvdXRlclR5cGUuR0FURVdBWTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuVlBOR2F0ZXdheSh0aGlzLCAnSUdXJywge1xuICAgICAgdHlwZTogcHJvcHMudHlwZSxcbiAgICAgIGFtYXpvblNpZGVBc246IHByb3BzLmFtYXpvblNpZGVBc24sXG4gICAgfSk7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5hdHRyVnBuR2F0ZXdheUlkO1xuICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGMudnBjSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0aW9uIChOQVQpIGdhdGV3YXlcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6TmF0R2F0ZXdheVxuICovXG5leHBvcnQgY2xhc3MgTmF0R2F0ZXdheSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICogQGRlZmF1bHQgcHVibGljXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGl2aXR5VHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgZm9yY2libHkgcmVsZWFzaW5nIHRoZVxuICAgKiBJUCBhZGRyZXNzZXMgaWYgY29ubmVjdGlvbnMgYXJlIHN0aWxsIGluIHByb2dyZXNzLlxuICAgKiBAZGVmYXVsdCAzNTAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIE5BVCBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ2ZuTmF0R2F0ZXdheTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmF0R2F0ZXdheVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucm91dGVyVHlwZSA9IFJvdXRlclR5cGUuTkFUX0dBVEVXQVk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpdml0eVR5cGUgPSBwcm9wcy5jb25uZWN0aXZpdHlUeXBlIHx8IE5hdENvbm5lY3Rpdml0eVR5cGUuUFVCTElDO1xuICAgIHRoaXMubWF4RHJhaW5EdXJhdGlvbiA9IHByb3BzLm1heERyYWluRHVyYXRpb24gfHwgRHVyYXRpb24uc2Vjb25kcygzNTApO1xuXG4gICAgLy8gSWYgdXNlciBkb2VzIG5vdCBwcm92aWRlIEVJUCwgZ2VuZXJhdGUgb25lIGZvciB0aGVtXG4gICAgdmFyIGFJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpdml0eVR5cGUgPT0gJ3B1YmxpYycpIHtcbiAgICAgIGlmICghcHJvcHMuYWxsb2NhdGlvbklkKSB7XG4gICAgICAgIGxldCBlaXAgPSBuZXcgQ2ZuRUlQKHRoaXMsICdFSVAnLCB7XG4gICAgICAgICAgZG9tYWluOiBwcm9wcy52cGM/LnZwY0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgYUlkID0gZWlwLmF0dHJBbGxvY2F0aW9uSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhSWQgPSBwcm9wcy5hbGxvY2F0aW9uSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5OYXRHYXRld2F5KHRoaXMsICdOQVRHYXRld2F5Jywge1xuICAgICAgc3VibmV0SWQ6IHByb3BzLnN1Ym5ldC5zdWJuZXRJZCxcbiAgICAgIGFsbG9jYXRpb25JZDogYUlkLFxuICAgICAgbWF4RHJhaW5EdXJhdGlvblNlY29uZHM6IHByb3BzLm1heERyYWluRHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgc2Vjb25kYXJ5QWxsb2NhdGlvbklkczogcHJvcHMuc2Vjb25kYXJ5QWxsb2NhdGlvbklkcyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuYXR0ck5hdEdhdGV3YXlJZDtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5zdWJuZXQuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBlbmRwb2ludCBvciBnYXRld2F5IGJlaW5nIHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhcmdldFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBvciBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5PzogSVJvdXRlVGFyZ2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBWUEMgZW5kcG9pbnRzLlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IElWcGNFbmRwb2ludDtcbn1cblxuLyoqXG4gKiBUaGUgZ2F0ZXdheSBvciBlbmRwb2ludCB0YXJnZXRlZCBieSB0aGUgcm91dGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZVRhcmdldFR5cGUge1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgcm91dGUgdGFyZ2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRhcmdldHMgc3VjaCBhc1xuICAgKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXk/OiBJUm91dGVUYXJnZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCByb3V0ZSB0YXJnZXQuIFRoaXMgaXMgdXNlZCBmb3IgdGFyZ2V0cyBzdWNoIGFzXG4gICAqIFZQQyBlbmRwb2ludHMuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogSVZwY0VuZHBvaW50O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSb3V0ZVRhcmdldFByb3BzKSB7XG4gICAgaWYgKHByb3BzLmdhdGV3YXkgJiYgcHJvcHMuZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNwZWNpZnkgYm90aCBnYXRld2F5IGFuZCBlbmRwb2ludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdhdGV3YXkgPSBwcm9wcy5nYXRld2F5O1xuICAgICAgdGhpcy5lbmRwb2ludCA9IHByb3BzLmVuZHBvaW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSB0byBkZWZpbmUgYSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUm91dGVWMiB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhYmxlIGZvciB0aGUgcm91dGUuXG4gICAqIEBhdHRyaWJ1dGUgcm91dGVUYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZTogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY0IG9yIElQdjYgQ0lEUiBibG9jayB1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gbWF0Y2guXG4gICAqXG4gICAqIFJvdXRpbmcgZGVjaXNpb25zIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCBzcGVjaWZpYyBtYXRjaC5cbiAgICogVE9ETzogTG9vayBmb3Igc3Ryb25nIElQIHR5cGUgaW1wbGVtZW50YXRpb24gaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogUm91dGVUYXJnZXRUeXBlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIGEgcm91dGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhYmxlIGZvciB0aGUgcm91dGUuXG4gICAqIEBhdHRyaWJ1dGUgcm91dGVUYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZTogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY0IG9yIElQdjYgQ0lEUiBibG9jayB1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gbWF0Y2guXG4gICAqXG4gICAqIFJvdXRpbmcgZGVjaXNpb25zIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCBzcGVjaWZpYyBtYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogUm91dGVUYXJnZXRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJvdXRlIHdpdGggYWRkZWQgZnVuY3Rpb25hbGl0eS5cbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6Um91dGVcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVWMiB7XG4gIC8qKlxuICAgKiBUaGUgSVB2NCBvciBJUHY2IENJRFIgYmxvY2sgdXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIG1hdGNoLlxuICAgKlxuICAgKiBSb3V0aW5nIGRlY2lzaW9ucyBhcmUgYmFzZWQgb24gdGhlIG1vc3Qgc3BlY2lmaWMgbWF0Y2guXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldDogUm91dGVUYXJnZXRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVUYWJsZTogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB0aGUgcm91dGUgaXMgdGFyZ2V0dGluZ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFJvdXRlclR5cGU6IFJvdXRlclR5cGVcblxuICAvKipcbiAgICogVGhlIHJvdXRlIENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZT86IENmblJvdXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuZGVzdGluYXRpb24gPSBwcm9wcy5kZXN0aW5hdGlvbjtcbiAgICB0aGlzLnRhcmdldCA9IHByb3BzLnRhcmdldDtcbiAgICB0aGlzLnJvdXRlVGFibGUgPSBwcm9wcy5yb3V0ZVRhYmxlO1xuXG4gICAgdGhpcy50YXJnZXRSb3V0ZXJUeXBlID0gdGhpcy50YXJnZXQuZ2F0ZXdheSA/IHRoaXMudGFyZ2V0LmdhdGV3YXkucm91dGVyVHlwZSA6IFJvdXRlclR5cGUuVlBDX0VORFBPSU5UO1xuXG4gICAgLy8gR2F0ZXdheSBnZW5lcmF0ZXMgcm91dGUgYXV0b21hdGljYWxseSB2aWEgaXRzIFJvdXRlVGFibGUsIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSB0aGUgcmVzb3VyY2UgZm9yIGl0XG4gICAgaWYgKCEodGhpcy50YXJnZXQuZW5kcG9pbnQgaW5zdGFuY2VvZiBHYXRld2F5VnBjRW5kcG9pbnQpKSB7XG4gICAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblJvdXRlKHRoaXMsICdSb3V0ZScsIHtcbiAgICAgICAgcm91dGVUYWJsZUlkOiB0aGlzLnJvdXRlVGFibGUucm91dGVUYWJsZUlkLFxuICAgICAgICBkZXN0aW5hdGlvbkNpZHJCbG9jazogdGhpcy5kZXN0aW5hdGlvbixcbiAgICAgICAgZGVzdGluYXRpb25JcHY2Q2lkckJsb2NrOiB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgICBbcm91dGVyVHlwZVRvUHJvcE5hbWUodGhpcy50YXJnZXRSb3V0ZXJUeXBlKV06IHRoaXMudGFyZ2V0LmdhdGV3YXkgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkIDpcbiAgICAgICAgICB0aGlzLnRhcmdldC5lbmRwb2ludCA/IHRoaXMudGFyZ2V0LmVuZHBvaW50LnZwY0VuZHBvaW50SWQgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgaWYgKHRoaXMudGFyZ2V0Um91dGVyVHlwZSA9PSBSb3V0ZXJUeXBlLkdBVEVXQVkpIHtcbiAgICAgIGlmICh0aGlzLnRhcmdldC5nYXRld2F5IGluc3RhbmNlb2YgSW50ZXJuZXRHYXRld2F5KSB7XG4gICAgICAgIG5ldyBDZm5WUENHYXRld2F5QXR0YWNobWVudCh0aGlzLCAnR1dBdHRhY2htZW50Jywge1xuICAgICAgICAgIHZwY0lkOiB0aGlzLnRhcmdldC5nYXRld2F5LnZwY0lkLFxuICAgICAgICAgIGludGVybmV0R2F0ZXdheUlkOiB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50YXJnZXQuZ2F0ZXdheSBpbnN0YW5jZW9mIFZQTkdhdGV3YXkpIHtcbiAgICAgICAgbmV3IENmblZQQ0dhdGV3YXlBdHRhY2htZW50KHRoaXMsICdHV0F0dGFjaG1lbnQnLCB7XG4gICAgICAgICAgdnBjSWQ6IHRoaXMudGFyZ2V0LmdhdGV3YXkudnBjSWQsXG4gICAgICAgICAgdnBuR2F0ZXdheUlkOiB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhIHJvdXRlIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlVGFibGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcm91dGUgdGFibGUuXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlVGFibGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBWUENcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6Um91dGVUYWJsZVxuICovXG5leHBvcnQgY2xhc3MgUm91dGVUYWJsZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJvdXRlVGFibGUsIElEZXBlbmRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVUYWJsZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZSB0YWJsZSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmblJvdXRlVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvdXRlVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblJvdXRlVGFibGUodGhpcywgJ1JvdXRlVGFibGUnLCB7XG4gICAgICB2cGNJZDogcHJvcHMudnBjLnZwY0lkLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZVRhYmxlSWQgPSB0aGlzLnJlc291cmNlLmF0dHJSb3V0ZVRhYmxlSWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91dGVyVHlwZVRvUHJvcE5hbWUocm91dGVyVHlwZTogUm91dGVyVHlwZSkge1xuICByZXR1cm4gKHtcbiAgICBbUm91dGVyVHlwZS5DQVJSSUVSX0dBVEVXQVldOiAnY2FycmllckdhdGV3YXlJZCcsXG4gICAgW1JvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWV06ICdlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLkdBVEVXQVldOiAnZ2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5JTlNUQU5DRV06ICdpbnN0YW5jZUlkJyxcbiAgICBbUm91dGVyVHlwZS5MT0NBTF9HQVRFV0FZXTogJ2xvY2FsR2F0ZXdheUlkJyxcbiAgICBbUm91dGVyVHlwZS5OQVRfR0FURVdBWV06ICduYXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLk5FVFdPUktfSU5URVJGQUNFXTogJ25ldHdvcmtJbnRlcmZhY2VJZCcsXG4gICAgW1JvdXRlclR5cGUuVFJBTlNJVF9HQVRFV0FZXTogJ3RyYW5zaXRHYXRld2F5SWQnLFxuICAgIFtSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT05dOiAndnBjUGVlcmluZ0Nvbm5lY3Rpb25JZCcsXG4gICAgW1JvdXRlclR5cGUuVlBDX0VORFBPSU5UXTogJ3ZwY0VuZHBvaW50SWQnLFxuICB9KVtyb3V0ZXJUeXBlXTtcbn0iXX0=
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Resource } from 'aws-cdk-lib';
|
|
2
|
+
import { INetworkAcl, IRouteTable, ISubnet, SubnetType } from 'aws-cdk-lib/aws-ec2';
|
|
3
|
+
import { Construct, IDependable } from 'constructs';
|
|
4
|
+
import { IVpcV2 } from './vpc-v2-base';
|
|
5
|
+
/**
|
|
6
|
+
* Interface to define subnet CIDR
|
|
7
|
+
*/
|
|
8
|
+
interface ICidr {
|
|
9
|
+
readonly cidr: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* IPv4 or IPv6 CIDR range for the subnet
|
|
13
|
+
*/
|
|
14
|
+
export declare class IpCidr implements ICidr {
|
|
15
|
+
/**
|
|
16
|
+
* IPv6 CIDR range for the subnet
|
|
17
|
+
* Allowed only if IPv6 is enabled on VPc
|
|
18
|
+
*/
|
|
19
|
+
readonly cidr: string;
|
|
20
|
+
constructor(props: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Properties to define subnet for VPC.
|
|
24
|
+
*/
|
|
25
|
+
export interface SubnetV2Props {
|
|
26
|
+
/**
|
|
27
|
+
* VPC Prop
|
|
28
|
+
*/
|
|
29
|
+
readonly vpc: IVpcV2;
|
|
30
|
+
/**
|
|
31
|
+
* ipv4 cidr to assign to this subnet.
|
|
32
|
+
* See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-cidrblock
|
|
33
|
+
*/
|
|
34
|
+
readonly ipv4CidrBlock: IpCidr;
|
|
35
|
+
/**
|
|
36
|
+
* Ipv6 CIDR Range for subnet
|
|
37
|
+
* @default No Ipv6 address
|
|
38
|
+
*/
|
|
39
|
+
readonly ipv6CidrBlock?: IpCidr;
|
|
40
|
+
/**
|
|
41
|
+
* Custom AZ for the subnet
|
|
42
|
+
*/
|
|
43
|
+
readonly availabilityZone: string;
|
|
44
|
+
/**
|
|
45
|
+
* Custom Route for subnet
|
|
46
|
+
* @default Default route table
|
|
47
|
+
*/
|
|
48
|
+
readonly routeTable?: IRouteTable;
|
|
49
|
+
/**
|
|
50
|
+
* The type of Subnet to configure.
|
|
51
|
+
*
|
|
52
|
+
* The Subnet type will control the ability to route and connect to the
|
|
53
|
+
* Internet.
|
|
54
|
+
*
|
|
55
|
+
* TODO: Add validation check `subnetType` when adding resources (e.g. cannot add NatGateway to private)
|
|
56
|
+
*/
|
|
57
|
+
readonly subnetType: SubnetType;
|
|
58
|
+
/**
|
|
59
|
+
* Subnet name
|
|
60
|
+
* @default none
|
|
61
|
+
*/
|
|
62
|
+
readonly subnetName?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Indicates whether a network interface created in this subnet receives an IPv6 address.
|
|
65
|
+
*
|
|
66
|
+
* If you specify AssignIpv6AddressOnCreation, you must also specify Ipv6CidrBlock.
|
|
67
|
+
*
|
|
68
|
+
* @default false
|
|
69
|
+
*/
|
|
70
|
+
readonly assignIpv6AddressOnCreation?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Interface with additional properties for SubnetV2
|
|
74
|
+
*/
|
|
75
|
+
export interface ISubnetV2 extends ISubnet {
|
|
76
|
+
/**
|
|
77
|
+
* The IPv6 CIDR block for this subnet
|
|
78
|
+
*/
|
|
79
|
+
readonly ipv6CidrBlock?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The SubnetV2 class represents a subnet within a VPC (Virtual Private Cloud) in AWS.
|
|
83
|
+
* It extends the Resource class and implements the ISubnet interface.
|
|
84
|
+
*
|
|
85
|
+
* Instances of this class can be used to create and manage subnets within a VpcV2 instance.
|
|
86
|
+
* Subnets can be configured with specific IP address ranges (IPv4 and IPv6), availability zones,
|
|
87
|
+
* and subnet types (e.g., public, private, isolated).
|
|
88
|
+
*
|
|
89
|
+
* @resource AWS::EC2::Subnet
|
|
90
|
+
*
|
|
91
|
+
*/
|
|
92
|
+
export declare class SubnetV2 extends Resource implements ISubnetV2 {
|
|
93
|
+
/**
|
|
94
|
+
* The Availability Zone the subnet is located in
|
|
95
|
+
*/
|
|
96
|
+
readonly availabilityZone: string;
|
|
97
|
+
/**
|
|
98
|
+
* The subnetId for this particular subnet
|
|
99
|
+
* @attribute
|
|
100
|
+
*/
|
|
101
|
+
readonly subnetId: string;
|
|
102
|
+
/**
|
|
103
|
+
* Dependencies for internet connectivity
|
|
104
|
+
* This Property exposes the RouteTable-Subnet association so that other resources can depend on it.
|
|
105
|
+
*/
|
|
106
|
+
readonly internetConnectivityEstablished: IDependable;
|
|
107
|
+
/**
|
|
108
|
+
* The variable name `internetConnectivityEstablished` does not reflect what it actually is.
|
|
109
|
+
* The naming is enforced by ISubnet. We need to keep it to maintain compatibility.
|
|
110
|
+
* It exposes the RouteTable-Subnet association so that other resources can depend on it.
|
|
111
|
+
* E.g. Resources in a subnet, when being deleted, may need the RouteTable to exist in order to delete properly
|
|
112
|
+
*/
|
|
113
|
+
private readonly _internetConnectivityEstablished;
|
|
114
|
+
/**
|
|
115
|
+
* The IPv4 CIDR block for this subnet
|
|
116
|
+
*/
|
|
117
|
+
readonly ipv4CidrBlock: string;
|
|
118
|
+
/**
|
|
119
|
+
* The IPv6 CIDR Block for this subnet
|
|
120
|
+
*/
|
|
121
|
+
readonly ipv6CidrBlock?: string;
|
|
122
|
+
/**
|
|
123
|
+
* The route table for this subnet
|
|
124
|
+
*/
|
|
125
|
+
readonly routeTable: IRouteTable;
|
|
126
|
+
/**
|
|
127
|
+
* The type of subnet (public or private) that this subnet represents.
|
|
128
|
+
* @attribute SubnetType
|
|
129
|
+
*/
|
|
130
|
+
readonly subnetType: SubnetType;
|
|
131
|
+
private _networkAcl;
|
|
132
|
+
/**
|
|
133
|
+
* Constructs a new SubnetV2 instance.
|
|
134
|
+
* @param scope The parent Construct that this resource will be part of.
|
|
135
|
+
* @param id The unique identifier for this resource.
|
|
136
|
+
* @param props The configuration properties for the subnet.
|
|
137
|
+
*/
|
|
138
|
+
constructor(scope: Construct, id: string, props: SubnetV2Props);
|
|
139
|
+
/**
|
|
140
|
+
* Associate a Network ACL with this subnet
|
|
141
|
+
*
|
|
142
|
+
* @param id The unique identifier for this association.
|
|
143
|
+
* @param networkAcl The Network ACL to associate with this subnet.
|
|
144
|
+
* This allows controlling inbound and outbound traffic for instances in this subnet.
|
|
145
|
+
*/
|
|
146
|
+
associateNetworkAcl(id: string, networkAcl: INetworkAcl): void;
|
|
147
|
+
/**
|
|
148
|
+
* Returns the Network ACL associated with this subnet.
|
|
149
|
+
*/
|
|
150
|
+
get networkAcl(): INetworkAcl;
|
|
151
|
+
}
|
|
152
|
+
export {};
|