@alauda-fe/network 1.0.0-beta.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/esm2022/alauda-fe-network.mjs +5 -0
- package/esm2022/index.mjs +19 -0
- package/esm2022/lib/components/certificate-status/component.mjs +37 -0
- package/esm2022/lib/components/fixed-ip/component.mjs +503 -0
- package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +251 -0
- package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +681 -0
- package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +106 -0
- package/esm2022/lib/components/service-form/component.mjs +307 -0
- package/esm2022/lib/components/service-form/fieldset/component.mjs +407 -0
- package/esm2022/lib/directives/subnet-validator.directive.mjs +111 -0
- package/esm2022/lib/services/alb-api.service.mjs +48 -0
- package/esm2022/lib/services/certificate-api.service.mjs +111 -0
- package/esm2022/lib/services/network-util.service.mjs +116 -0
- package/esm2022/lib/types/alb-exports.mjs +14 -0
- package/esm2022/lib/types/k8s-exports.mjs +13 -0
- package/esm2022/lib/types/resource-definition.mjs +16 -0
- package/esm2022/lib/utils/alb-exports.mjs +108 -0
- package/esm2022/lib/utils/alb-internals.mjs +2 -0
- package/esm2022/lib/utils/cidr-exports.mjs +359 -0
- package/esm2022/lib/utils/cluster-exports.mjs +18 -0
- package/esm2022/lib/utils/service-exports.mjs +58 -0
- package/esm2022/lib/utils/service-internals.mjs +7 -0
- package/esm2022/lib/utils/subnet-exports.mjs +18 -0
- package/index.d.ts +18 -0
- package/lib/components/certificate-status/component.d.ts +17 -0
- package/lib/components/fixed-ip/component.d.ts +67 -0
- package/lib/components/loadbalancer-spec-form/component.d.ts +34 -0
- package/lib/components/service-annotations-form/annotations.component.d.ts +74 -0
- package/lib/components/service-annotations-form-item/annotations.component.d.ts +14 -0
- package/lib/components/service-form/component.d.ts +56 -0
- package/lib/components/service-form/fieldset/component.d.ts +46 -0
- package/lib/directives/subnet-validator.directive.d.ts +34 -0
- package/lib/services/alb-api.service.d.ts +16 -0
- package/lib/services/certificate-api.service.d.ts +38 -0
- package/lib/services/network-util.service.d.ts +21 -0
- package/lib/types/alb-exports.d.ts +29 -0
- package/lib/types/k8s-exports.d.ts +130 -0
- package/lib/types/resource-definition.d.ts +25 -0
- package/lib/utils/alb-exports.d.ts +16 -0
- package/lib/utils/alb-internals.d.ts +10 -0
- package/lib/utils/cidr-exports.d.ts +85 -0
- package/lib/utils/cluster-exports.d.ts +14 -0
- package/lib/utils/service-exports.d.ts +18 -0
- package/lib/utils/service-internals.d.ts +2 -0
- package/lib/utils/subnet-exports.d.ts +20 -0
- package/package.json +31 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { INT_ZERO_PATTERN, IP_ADDRESS_PATTERN, IP_V6_ADDRESS_PATTERN, } from '@alauda-fe/common';
|
|
2
|
+
import { Address4, Address6 } from 'ip-address';
|
|
3
|
+
import { BigInteger } from 'jsbn';
|
|
4
|
+
/**
|
|
5
|
+
* note: we don't use enum here because ts do not support extends enum for now
|
|
6
|
+
* @link https://github.com/microsoft/TypeScript/issues/17592
|
|
7
|
+
*/
|
|
8
|
+
export const IPMode = {
|
|
9
|
+
IPV4: 'v4',
|
|
10
|
+
IPV6: 'v6',
|
|
11
|
+
};
|
|
12
|
+
export const AddressTypes = {
|
|
13
|
+
ADVERTISE: 'Advertise',
|
|
14
|
+
PUBLIC: 'Public',
|
|
15
|
+
};
|
|
16
|
+
export const IP_MODES = [IPMode.IPV4, IPMode.IPV6];
|
|
17
|
+
export const IP_MODE_TEXTS = {
|
|
18
|
+
[IPMode.IPV4]: 'IPv4',
|
|
19
|
+
[IPMode.IPV6]: 'IPv6',
|
|
20
|
+
};
|
|
21
|
+
export const NetworkMode = {
|
|
22
|
+
...IPMode,
|
|
23
|
+
DUAL: 'dual',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} cidrStr cidrBlock, e.g. 10.16.0.0/24 may support ipv6
|
|
27
|
+
* @param {string} ipStr specific ip, e.g. 10.16.1.2 may support ipv6
|
|
28
|
+
* @param {IPMode} ipMode ip network mode ipv4/ipv6
|
|
29
|
+
* @return {boolean} whether ip belongs to cidr
|
|
30
|
+
*/
|
|
31
|
+
export function isBelongCidr(cidrStr, ipStr, ipMode = IPMode.IPV4) {
|
|
32
|
+
if (!isCidrAddressValid(cidrStr, ipMode) ||
|
|
33
|
+
!isIpAddressValid(ipStr, ipMode)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const Builder = getAddressBuilder(ipMode);
|
|
37
|
+
const ip = new Builder(ipStr);
|
|
38
|
+
const cidr = new Builder(cidrStr);
|
|
39
|
+
return ip.isInSubnet(cidr);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param {string} ip specific ip, e.g. 10.16.1.2
|
|
43
|
+
* @param {string} cidr specific cidr which ip may belongs to, e.g. 10.16.0.0/24
|
|
44
|
+
* @return {boolean} whether ip is broadcast address
|
|
45
|
+
*/
|
|
46
|
+
export function isBroadcastAddr(ipStr, cidrStr, ipMode = IPMode.IPV4) {
|
|
47
|
+
// IPV6 无广播地址概念
|
|
48
|
+
if (ipMode === IPMode.IPV6) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (!cidrStr) {
|
|
52
|
+
return ipStr === '255.255.255.255';
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const cidr = new Address4(cidrStr);
|
|
56
|
+
// 子网中的最后一位
|
|
57
|
+
return ipStr === cidr.endAddress().address;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function isLoopback(ipStr, ipMode = IPMode.IPV4) {
|
|
64
|
+
const cidr = ipMode === IPMode.IPV4 ? '127.0.0.0/8' : '::1/128';
|
|
65
|
+
return isBelongCidr(cidr, ipStr, ipMode);
|
|
66
|
+
}
|
|
67
|
+
export function isMultiBroadcast(ipStr, ipMode = IPMode.IPV4) {
|
|
68
|
+
const cidr = ipMode === IPMode.IPV4 ? '224.0.0.0/4' : 'ff00::/8';
|
|
69
|
+
return isBelongCidr(cidr, ipStr, ipMode);
|
|
70
|
+
}
|
|
71
|
+
export function isLinkLocal(ipStr, ipMode = IPMode.IPV4) {
|
|
72
|
+
const cidr = ipMode === IPMode.IPV4 ? '169.254.0.0/16' : 'fe80::/10';
|
|
73
|
+
return isBelongCidr(cidr, ipStr, ipMode);
|
|
74
|
+
}
|
|
75
|
+
export function isAllZero(ipStr, ipMode = IPMode.IPV4) {
|
|
76
|
+
const cidr = ipMode === IPMode.IPV4 ? '0.0.0.0/32' : '::/128';
|
|
77
|
+
return isBelongCidr(cidr, ipStr, ipMode);
|
|
78
|
+
}
|
|
79
|
+
export function isNetworkAddr(ipStr, cidrStr, ipMode = IPMode.IPV4) {
|
|
80
|
+
if (!cidrStr) {
|
|
81
|
+
return ipStr === '0.0.0.0';
|
|
82
|
+
}
|
|
83
|
+
const Builder = getAddressBuilder(ipMode);
|
|
84
|
+
try {
|
|
85
|
+
const cidr = new Builder(cidrStr);
|
|
86
|
+
// 子网中的最后一位
|
|
87
|
+
return ipStr === cidr.startAddress().address;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @param {string} cidrAStr cidrBlock A, e.g. 10.16.0.0/24. support IPv6
|
|
95
|
+
* @param {string} cidrBStr cidrBlock B, e.g. 10.10.0.0/16. support IPv6
|
|
96
|
+
* @param {IPMode} ipMode ipMode, v4 or v6
|
|
97
|
+
* @return {boolean} whether 2 cidr blocks may conflict, judge by whether ip belongs to cidrBlock A may also belongs to B
|
|
98
|
+
*/
|
|
99
|
+
export function isCidrConflict(cidrAStr, cidrBStr, ipMode = IPMode.IPV4) {
|
|
100
|
+
const Builder = getAddressBuilder(ipMode);
|
|
101
|
+
try {
|
|
102
|
+
const cidrA = new Builder(cidrAStr);
|
|
103
|
+
const cidrB = new Builder(cidrBStr);
|
|
104
|
+
const cidrAFrom = cidrA.startAddress();
|
|
105
|
+
const cidrAEnd = cidrA.endAddress();
|
|
106
|
+
const cidrBFrom = cidrB.startAddress();
|
|
107
|
+
const cidrBEnd = cidrB.endAddress();
|
|
108
|
+
return (cidrAFrom.isInSubnet(cidrB) ||
|
|
109
|
+
cidrAEnd.isInSubnet(cidrB) ||
|
|
110
|
+
cidrBFrom.isInSubnet(cidrA) ||
|
|
111
|
+
cidrBEnd.isInSubnet(cidrA));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// whether cidrA contains cidrB (cidrA > cidrB)
|
|
118
|
+
export function isCidrContain(cidrAStr, cidrBStr, ipMode = IPMode.IPV4) {
|
|
119
|
+
const Builder = getAddressBuilder(ipMode);
|
|
120
|
+
try {
|
|
121
|
+
const cidrA = new Builder(cidrAStr);
|
|
122
|
+
const cidrB = new Builder(cidrBStr);
|
|
123
|
+
const cidrBFrom = cidrB.startAddress();
|
|
124
|
+
const cidrBEnd = cidrB.endAddress();
|
|
125
|
+
return cidrBFrom.isInSubnet(cidrA) && cidrBEnd.isInSubnet(cidrA);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export function getAddressBuilder(ipMode) {
|
|
132
|
+
return ipMode === IPMode.IPV6 ? Address6 : Address4;
|
|
133
|
+
}
|
|
134
|
+
export const parseCIDR = (address, ipMode = IPMode.IPV4) => {
|
|
135
|
+
const Builder = getAddressBuilder(ipMode);
|
|
136
|
+
try {
|
|
137
|
+
return new Builder(address);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
export function ipAddressEqual(ipAStr, ipBStr, ipMode = IPMode.IPV4) {
|
|
144
|
+
if (ipAStr === ipBStr) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
if (ipMode === IPMode.IPV4) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const ipA = new Address6(ipAStr);
|
|
152
|
+
const ipB = new Address6(ipBStr);
|
|
153
|
+
return ipA.bigInteger().equals(ipB.bigInteger());
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function isIpAddressValid(address, ipMode = IPMode.IPV4) {
|
|
160
|
+
const Builder = getAddressBuilder(ipMode);
|
|
161
|
+
try {
|
|
162
|
+
const ip = new Builder(address);
|
|
163
|
+
return !ip.address.includes('/');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export function isCidrAddressValid(address, ipMode = IPMode.IPV4) {
|
|
170
|
+
const cidr = parseCIDR(address, ipMode);
|
|
171
|
+
return !!cidr?.address.includes('/');
|
|
172
|
+
}
|
|
173
|
+
export function getCidrType(ip) {
|
|
174
|
+
return isIpv6(ip?.split('/')?.[0]) ? IPMode.IPV6 : IPMode.IPV4;
|
|
175
|
+
}
|
|
176
|
+
export function isIpv4(value) {
|
|
177
|
+
return IP_ADDRESS_PATTERN.pattern.test(value);
|
|
178
|
+
}
|
|
179
|
+
export function isIpv6(value) {
|
|
180
|
+
return IP_V6_ADDRESS_PATTERN.pattern.test(value);
|
|
181
|
+
}
|
|
182
|
+
export function ipAddress(value) {
|
|
183
|
+
if (!value) {
|
|
184
|
+
return '';
|
|
185
|
+
}
|
|
186
|
+
return isIpv4(value) ? value : `[${value}]`;
|
|
187
|
+
}
|
|
188
|
+
export function getStrictCidr(cidrStr, ipMode) {
|
|
189
|
+
if (!cidrStr) {
|
|
190
|
+
return cidrStr;
|
|
191
|
+
}
|
|
192
|
+
const Builder = getAddressBuilder(ipMode);
|
|
193
|
+
try {
|
|
194
|
+
const cidr = new Builder(cidrStr);
|
|
195
|
+
return [cidr.startAddress().address, cidr.subnet].join('');
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return '';
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export const parseSegment = (segment, networkMode) => {
|
|
202
|
+
if (!segment) {
|
|
203
|
+
return {};
|
|
204
|
+
}
|
|
205
|
+
if (networkMode === NetworkMode.IPV4) {
|
|
206
|
+
return {
|
|
207
|
+
ipV4Segment: segment,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (networkMode === NetworkMode.IPV6) {
|
|
211
|
+
return {
|
|
212
|
+
ipV6Segment: segment,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
let ipV4Segment;
|
|
216
|
+
let ipV6Segment;
|
|
217
|
+
if (segment.includes(',')) {
|
|
218
|
+
[ipV4Segment, ipV6Segment] = segment.split(',');
|
|
219
|
+
}
|
|
220
|
+
else if (segment.includes(':')) {
|
|
221
|
+
ipV6Segment = segment;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
ipV4Segment = segment;
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
ipV4Segment,
|
|
228
|
+
ipV6Segment,
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
export function getCidrBlock(param, networkMode) {
|
|
232
|
+
let ipV4Segment;
|
|
233
|
+
let ipV6Segment;
|
|
234
|
+
if (typeof param === 'string') {
|
|
235
|
+
const _ = parseSegment(param, networkMode);
|
|
236
|
+
ipV4Segment = _.ipV4Segment;
|
|
237
|
+
ipV6Segment = _.ipV6Segment;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
ipV4Segment = param.ipV4Segment;
|
|
241
|
+
ipV6Segment = param.ipV6Segment;
|
|
242
|
+
}
|
|
243
|
+
return [
|
|
244
|
+
getStrictCidr(ipV4Segment, IPMode.IPV4),
|
|
245
|
+
getStrictCidr(ipV6Segment, IPMode.IPV6),
|
|
246
|
+
]
|
|
247
|
+
.filter(Boolean)
|
|
248
|
+
.join(',');
|
|
249
|
+
}
|
|
250
|
+
export const DEFAULT_IPV4_MAX_CIDR_PREFIX = 31;
|
|
251
|
+
export const DEFAULT_IPV6_MAX_CIDR_PREFIX = 127;
|
|
252
|
+
export const DEFAULT_NETWORK_CIDR_PREFIX_MAPPER = {
|
|
253
|
+
[IPMode.IPV4]: DEFAULT_IPV4_MAX_CIDR_PREFIX,
|
|
254
|
+
[IPMode.IPV6]: DEFAULT_IPV6_MAX_CIDR_PREFIX,
|
|
255
|
+
};
|
|
256
|
+
export function getCidrMaximumPrefix(ipMode = IPMode.IPV4) {
|
|
257
|
+
return DEFAULT_NETWORK_CIDR_PREFIX_MAPPER[ipMode];
|
|
258
|
+
}
|
|
259
|
+
export const adaptIpMode = (value, networkMode) => networkMode === NetworkMode.DUAL
|
|
260
|
+
? value.includes(':')
|
|
261
|
+
? NetworkMode.IPV6
|
|
262
|
+
: NetworkMode.IPV4
|
|
263
|
+
: networkMode;
|
|
264
|
+
export const isIpPartValid = (part, isIpV4) => {
|
|
265
|
+
if (part === '') {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
if (isIpV4) {
|
|
269
|
+
if (INT_ZERO_PATTERN.pattern.test(part)) {
|
|
270
|
+
return Number(part) <= 255;
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
if (/^[\da-f]+$/i.test(part)) {
|
|
275
|
+
return Number.parseInt(part, 16) <= 65535;
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
};
|
|
279
|
+
export const isIpPartsValid = (parts, isIpV4) => parts.every(part => isIpPartValid(part, isIpV4));
|
|
280
|
+
export const isIpInputValid = (input, isIpV4) => {
|
|
281
|
+
const parts = input.split(isIpV4 ? '.' : ':');
|
|
282
|
+
return parts.length <= (isIpV4 ? 4 : 8) && isIpPartsValid(parts, isIpV4);
|
|
283
|
+
};
|
|
284
|
+
export const getIpAddressSuggestionsByCidrs = (cidrs, networkMode, usedIps, inputValue, isCalico, maxSize = 10) => {
|
|
285
|
+
inputValue = inputValue ?? '';
|
|
286
|
+
const start = performance.now();
|
|
287
|
+
const result = [];
|
|
288
|
+
const usedIpValues = [
|
|
289
|
+
...usedIps.reduce((ipValues, ip) => {
|
|
290
|
+
const Builder = getAddressBuilder(adaptIpMode(ip, networkMode));
|
|
291
|
+
try {
|
|
292
|
+
ipValues.add(new Builder(ip).bigInteger());
|
|
293
|
+
}
|
|
294
|
+
catch { }
|
|
295
|
+
return ipValues;
|
|
296
|
+
}, new Set()),
|
|
297
|
+
];
|
|
298
|
+
for (const cidr of cidrs) {
|
|
299
|
+
const ipMode = adaptIpMode(cidr, networkMode);
|
|
300
|
+
const isIpV4 = ipMode === IPMode.IPV4;
|
|
301
|
+
if (!isIpInputValid(inputValue, isIpV4)) {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
const loopStart = performance.now();
|
|
305
|
+
const Builder = getAddressBuilder(ipMode);
|
|
306
|
+
let ipCidr;
|
|
307
|
+
try {
|
|
308
|
+
ipCidr = new Builder(cidr);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const startAddress = ipCidr._startAddress();
|
|
314
|
+
const endAddress = ipCidr._endAddress();
|
|
315
|
+
// 非 calico 模式下,不允许使用网段的第一个网络 IP 和最后一个 广播 IP
|
|
316
|
+
let address = startAddress.add(isCalico ? BigInteger.ZERO : BigInteger.ONE);
|
|
317
|
+
while (address.compareTo(endAddress) < (isCalico ? 1 : 0)) {
|
|
318
|
+
const now = performance.now();
|
|
319
|
+
// Considering the performance, we don't want to block the UI too much
|
|
320
|
+
if (!isIpV4) {
|
|
321
|
+
if (now - loopStart > 100) {
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
if (now - start > 250) {
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (!usedIpValues.some(ip => !ip.compareTo(address))) {
|
|
329
|
+
const ipAddr = Builder.fromBigInteger(address).correctForm();
|
|
330
|
+
if (ipAddr.includes(inputValue)) {
|
|
331
|
+
result.push(ipAddr);
|
|
332
|
+
if (result.length >= maxSize) {
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
address = address.add(BigInteger.ONE);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return result;
|
|
341
|
+
};
|
|
342
|
+
export function adaptSubnetCidrs(cidrs, networkMode, enableFixIpV6ForDual = false) {
|
|
343
|
+
return cidrs
|
|
344
|
+
?.split(';')
|
|
345
|
+
.map(cidr => parseSegment(cidr))
|
|
346
|
+
.reduce((list, item) => {
|
|
347
|
+
list.push(item.ipV4Segment, (networkMode !== NetworkMode.DUAL || enableFixIpV6ForDual) &&
|
|
348
|
+
item.ipV6Segment);
|
|
349
|
+
return list;
|
|
350
|
+
}, [])
|
|
351
|
+
.filter(Boolean);
|
|
352
|
+
}
|
|
353
|
+
// return true if ipBegin > ipEnd
|
|
354
|
+
export function invalidIpOrder(ipBegin, ipEnd) {
|
|
355
|
+
const ipBeginBigInt = ipBegin.bigInteger();
|
|
356
|
+
const ipEndBigInt = ipEnd.bigInteger();
|
|
357
|
+
return ipBeginBigInt.compareTo(ipEndBigInt) >= 0;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lkci1leHBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvdXRpbHMvY2lkci1leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUV0QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFPbEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLElBQUk7Q0FDRixDQUFDO0FBSVgsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLE1BQU0sRUFBRSxRQUFRO0NBQ1IsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBVSxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNO0lBQ3JCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU07Q0FDYixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLEdBQUcsTUFBTTtJQUNULElBQUksRUFBRSxNQUFNO0NBQ0osQ0FBQztBQUlYOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsT0FBZSxFQUNmLEtBQWEsRUFDYixTQUFpQixNQUFNLENBQUMsSUFBSTtJQUU1QixJQUNFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FB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O1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFdBQVcsRUFDaEIsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLElBQUksSUFBSSxvQkFBb0IsQ0FBQztZQUN4RCxJQUFJLENBQUMsV0FBVyxDQUNuQixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBYyxDQUFDO1NBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsaUNBQWlDO0FBQ2pDLE1BQU0sVUFBVSxjQUFjLENBQzVCLE9BQVUsRUFDVixLQUFRO0lBRVIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJTlRfWkVST19QQVRURVJOLFxuICBJUF9BRERSRVNTX1BBVFRFUk4sXG4gIElQX1Y2X0FERFJFU1NfUEFUVEVSTixcbiAgVmFsdWVPZixcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQWRkcmVzczQsIEFkZHJlc3M2IH0gZnJvbSAnaXAtYWRkcmVzcyc7XG5pbXBvcnQgeyBCaWdJbnRlZ2VyIH0gZnJvbSAnanNibic7XG5cbmludGVyZmFjZSBTZWdtZW50TW9kZWwge1xuICBpcFY0U2VnbWVudD86IHN0cmluZztcbiAgaXBWNlNlZ21lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogbm90ZTogd2UgZG9uJ3QgdXNlIGVudW0gaGVyZSBiZWNhdXNlIHRzIGRvIG5vdCBzdXBwb3J0IGV4dGVuZHMgZW51bSBmb3Igbm93XG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE3NTkyXG4gKi9cbmV4cG9ydCBjb25zdCBJUE1vZGUgPSB7XG4gIElQVjQ6ICd2NCcsXG4gIElQVjY6ICd2NicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBJUE1vZGUgPSBWYWx1ZU9mPHR5cGVvZiBJUE1vZGU+O1xuXG5leHBvcnQgY29uc3QgQWRkcmVzc1R5cGVzID0ge1xuICBBRFZFUlRJU0U6ICdBZHZlcnRpc2UnLFxuICBQVUJMSUM6ICdQdWJsaWMnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQWRkcmVzc1R5cGVzID0gVmFsdWVPZjx0eXBlb2YgQWRkcmVzc1R5cGVzPjtcblxuZXhwb3J0IGNvbnN0IElQX01PREVTID0gW0lQTW9kZS5JUFY0LCBJUE1vZGUuSVBWNl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBJUF9NT0RFX1RFWFRTID0ge1xuICBbSVBNb2RlLklQVjRdOiAnSVB2NCcsXG4gIFtJUE1vZGUuSVBWNl06ICdJUHY2Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBOZXR3b3JrTW9kZSA9IHtcbiAgLi4uSVBNb2RlLFxuICBEVUFMOiAnZHVhbCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrTW9kZSA9IFZhbHVlT2Y8dHlwZW9mIE5ldHdvcmtNb2RlPjtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2lkclN0ciBjaWRyQmxvY2ssIGUuZy4gMTAuMTYuMC4wLzI0IG1heSBzdXBwb3J0IGlwdjZcbiAqIEBwYXJhbSB7c3RyaW5nfSBpcFN0ciBzcGVjaWZpYyBpcCwgZS5nLiAxMC4xNi4xLjIgbWF5IHN1cHBvcnQgaXB2NlxuICogQHBhcmFtIHtJUE1vZGV9IGlwTW9kZSBpcCBuZXR3b3JrIG1vZGUgaXB2NC9pcHY2XG4gKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIGlwIGJlbG9uZ3MgdG8gY2lkclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCZWxvbmdDaWRyKFxuICBjaWRyU3RyOiBzdHJpbmcsXG4gIGlwU3RyOiBzdHJpbmcsXG4gIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQsXG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgICFpc0NpZHJBZGRyZXNzVmFsaWQoY2lkclN0ciwgaXBNb2RlKSB8fFxuICAgICFpc0lwQWRkcmVzc1ZhbGlkKGlwU3RyLCBpcE1vZGUpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IEJ1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcihpcE1vZGUpO1xuICBjb25zdCBpcCA9IG5ldyBCdWlsZGVyKGlwU3RyKTtcbiAgY29uc3QgY2lkciA9IG5ldyBCdWlsZGVyKGNpZHJTdHIpO1xuICByZXR1cm4gaXAuaXNJblN1Ym5ldChjaWRyKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gaXAgc3BlY2lmaWMgaXAsIGUuZy4gMTAuMTYuMS4yXG4gKiBAcGFyYW0ge3N0cmluZ30gY2lkciBzcGVjaWZpYyBjaWRyIHdoaWNoIGlwIG1heSBiZWxvbmdzIHRvLCBlLmcuIDEwLjE2LjAuMC8yNFxuICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciBpcCBpcyBicm9hZGNhc3QgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm9hZGNhc3RBZGRyKFxuICBpcFN0cjogc3RyaW5nLFxuICBjaWRyU3RyPzogc3RyaW5nLFxuICBpcE1vZGU6IElQTW9kZSA9IElQTW9kZS5JUFY0LFxuKTogYm9vbGVhbiB7XG4gIC8vIElQVjYg5peg5bm/5pKt5Zyw5Z2A5qaC5b+1XG4gIGlmIChpcE1vZGUgPT09IElQTW9kZS5JUFY2KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghY2lkclN0cikge1xuICAgIHJldHVybiBpcFN0ciA9PT0gJzI1NS4yNTUuMjU1LjI1NSc7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjaWRyID0gbmV3IEFkZHJlc3M0KGNpZHJTdHIpO1xuICAgIC8vIOWtkOe9keS4reeahOacgOWQjuS4gOS9jVxuICAgIHJldHVybiBpcFN0ciA9PT0gY2lkci5lbmRBZGRyZXNzKCkuYWRkcmVzcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb3BiYWNrKGlwU3RyOiBzdHJpbmcsIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQpIHtcbiAgY29uc3QgY2lkciA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQgPyAnMTI3LjAuMC4wLzgnIDogJzo6MS8xMjgnO1xuICByZXR1cm4gaXNCZWxvbmdDaWRyKGNpZHIsIGlwU3RyLCBpcE1vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aUJyb2FkY2FzdChpcFN0cjogc3RyaW5nLCBpcE1vZGU6IElQTW9kZSA9IElQTW9kZS5JUFY0KSB7XG4gIGNvbnN0IGNpZHIgPSBpcE1vZGUgPT09IElQTW9kZS5JUFY0ID8gJzIyNC4wLjAuMC80JyA6ICdmZjAwOjovOCc7XG4gIHJldHVybiBpc0JlbG9uZ0NpZHIoY2lkciwgaXBTdHIsIGlwTW9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtMb2NhbChpcFN0cjogc3RyaW5nLCBpcE1vZGU6IElQTW9kZSA9IElQTW9kZS5JUFY0KSB7XG4gIGNvbnN0IGNpZHIgPSBpcE1vZGUgPT09IElQTW9kZS5JUFY0ID8gJzE2OS4yNTQuMC4wLzE2JyA6ICdmZTgwOjovMTAnO1xuICByZXR1cm4gaXNCZWxvbmdDaWRyKGNpZHIsIGlwU3RyLCBpcE1vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbGxaZXJvKGlwU3RyOiBzdHJpbmcsIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQpIHtcbiAgY29uc3QgY2lkciA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQgPyAnMC4wLjAuMC8zMicgOiAnOjovMTI4JztcbiAgcmV0dXJuIGlzQmVsb25nQ2lkcihjaWRyLCBpcFN0ciwgaXBNb2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV0d29ya0FkZHIoXG4gIGlwU3RyOiBzdHJpbmcsXG4gIGNpZHJTdHI/OiBzdHJpbmcsXG4gIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQsXG4pIHtcbiAgaWYgKCFjaWRyU3RyKSB7XG4gICAgcmV0dXJuIGlwU3RyID09PSAnMC4wLjAuMCc7XG4gIH1cbiAgY29uc3QgQnVpbGRlciA9IGdldEFkZHJlc3NCdWlsZGVyKGlwTW9kZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2lkciA9IG5ldyBCdWlsZGVyKGNpZHJTdHIpO1xuICAgIC8vIOWtkOe9keS4reeahOacgOWQjuS4gOS9jVxuICAgIHJldHVybiBpcFN0ciA9PT0gY2lkci5zdGFydEFkZHJlc3MoKS5hZGRyZXNzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2lkckFTdHIgY2lkckJsb2NrIEEsIGUuZy4gMTAuMTYuMC4wLzI0LiBzdXBwb3J0IElQdjZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaWRyQlN0ciBjaWRyQmxvY2sgQiwgZS5nLiAxMC4xMC4wLjAvMTYuIHN1cHBvcnQgSVB2NlxuICogQHBhcmFtIHtJUE1vZGV9IGlwTW9kZSBpcE1vZGUsIHY0IG9yIHY2XG4gKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIDIgY2lkciBibG9ja3MgbWF5IGNvbmZsaWN0LCBqdWRnZSBieSB3aGV0aGVyIGlwIGJlbG9uZ3MgdG8gY2lkckJsb2NrIEEgbWF5IGFsc28gYmVsb25ncyB0byBCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NpZHJDb25mbGljdChcbiAgY2lkckFTdHI6IHN0cmluZyxcbiAgY2lkckJTdHI6IHN0cmluZyxcbiAgaXBNb2RlOiBJUE1vZGUgPSBJUE1vZGUuSVBWNCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBCdWlsZGVyID0gZ2V0QWRkcmVzc0J1aWxkZXIoaXBNb2RlKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjaWRyQSA9IG5ldyBCdWlsZGVyKGNpZHJBU3RyKTtcbiAgICBjb25zdCBjaWRyQiA9IG5ldyBCdWlsZGVyKGNpZHJCU3RyKTtcbiAgICBjb25zdCBjaWRyQUZyb20gPSBjaWRyQS5zdGFydEFkZHJlc3MoKTtcbiAgICBjb25zdCBjaWRyQUVuZCA9IGNpZHJBLmVuZEFkZHJlc3MoKTtcbiAgICBjb25zdCBjaWRyQkZyb20gPSBjaWRyQi5zdGFydEFkZHJlc3MoKTtcbiAgICBjb25zdCBjaWRyQkVuZCA9IGNpZHJCLmVuZEFkZHJlc3MoKTtcbiAgICByZXR1cm4gKFxuICAgICAgY2lkckFGcm9tLmlzSW5TdWJuZXQoY2lkckIpIHx8XG4gICAgICBjaWRyQUVuZC5pc0luU3VibmV0KGNpZHJCKSB8fFxuICAgICAgY2lkckJGcm9tLmlzSW5TdWJuZXQoY2lkckEpIHx8XG4gICAgICBjaWRyQkVuZC5pc0luU3VibmV0KGNpZHJBKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyB3aGV0aGVyIGNpZHJBIGNvbnRhaW5zIGNpZHJCIChjaWRyQSA+IGNpZHJCKVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2lkckNvbnRhaW4oXG4gIGNpZHJBU3RyOiBzdHJpbmcsXG4gIGNpZHJCU3RyOiBzdHJpbmcsXG4gIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQsXG4pIHtcbiAgY29uc3QgQnVpbGRlciA9IGdldEFkZHJlc3NCdWlsZGVyKGlwTW9kZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2lkckEgPSBuZXcgQnVpbGRlcihjaWRyQVN0cik7XG4gICAgY29uc3QgY2lkckIgPSBuZXcgQnVpbGRlcihjaWRyQlN0cik7XG4gICAgY29uc3QgY2lkckJGcm9tID0gY2lkckIuc3RhcnRBZGRyZXNzKCk7XG4gICAgY29uc3QgY2lkckJFbmQgPSBjaWRyQi5lbmRBZGRyZXNzKCk7XG4gICAgcmV0dXJuIGNpZHJCRnJvbS5pc0luU3VibmV0KGNpZHJBKSAmJiBjaWRyQkVuZC5pc0luU3VibmV0KGNpZHJBKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzQnVpbGRlcihpcE1vZGU6IElQTW9kZSkge1xuICByZXR1cm4gaXBNb2RlID09PSBJUE1vZGUuSVBWNiA/IEFkZHJlc3M2IDogQWRkcmVzczQ7XG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUNJRFIgPSAoYWRkcmVzczogc3RyaW5nLCBpcE1vZGU6IElQTW9kZSA9IElQTW9kZS5JUFY0KSA9PiB7XG4gIGNvbnN0IEJ1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcihpcE1vZGUpO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgQnVpbGRlcihhZGRyZXNzKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpcEFkZHJlc3NFcXVhbChcbiAgaXBBU3RyOiBzdHJpbmcsXG4gIGlwQlN0cjogc3RyaW5nLFxuICBpcE1vZGU6IElQTW9kZSA9IElQTW9kZS5JUFY0LFxuKSB7XG4gIGlmIChpcEFTdHIgPT09IGlwQlN0cikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlwTW9kZSA9PT0gSVBNb2RlLklQVjQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGlwQSA9IG5ldyBBZGRyZXNzNihpcEFTdHIpO1xuICAgIGNvbnN0IGlwQiA9IG5ldyBBZGRyZXNzNihpcEJTdHIpO1xuICAgIHJldHVybiBpcEEuYmlnSW50ZWdlcigpLmVxdWFscyhpcEIuYmlnSW50ZWdlcigpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lwQWRkcmVzc1ZhbGlkKFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIGlwTW9kZTogSVBNb2RlID0gSVBNb2RlLklQVjQsXG4pIHtcbiAgY29uc3QgQnVpbGRlciA9IGdldEFkZHJlc3NCdWlsZGVyKGlwTW9kZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgaXAgPSBuZXcgQnVpbGRlcihhZGRyZXNzKTtcbiAgICByZXR1cm4gIWlwLmFkZHJlc3MuaW5jbHVkZXMoJy8nKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NpZHJBZGRyZXNzVmFsaWQoXG4gIGFkZHJlc3M6IHN0cmluZyxcbiAgaXBNb2RlOiBJUE1vZGUgPSBJUE1vZGUuSVBWNCxcbikge1xuICBjb25zdCBjaWRyID0gcGFyc2VDSURSKGFkZHJlc3MsIGlwTW9kZSk7XG4gIHJldHVybiAhIWNpZHI/LmFkZHJlc3MuaW5jbHVkZXMoJy8nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENpZHJUeXBlKGlwOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzSXB2NihpcD8uc3BsaXQoJy8nKT8uWzBdKSA/IElQTW9kZS5JUFY2IDogSVBNb2RlLklQVjQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lwdjQodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gSVBfQUREUkVTU19QQVRURVJOLnBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJcHY2KHZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIElQX1Y2X0FERFJFU1NfUEFUVEVSTi5wYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXBBZGRyZXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gaXNJcHY0KHZhbHVlKSA/IHZhbHVlIDogYFske3ZhbHVlfV1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaWN0Q2lkcihjaWRyU3RyOiBzdHJpbmcsIGlwTW9kZTogSVBNb2RlKSB7XG4gIGlmICghY2lkclN0cikge1xuICAgIHJldHVybiBjaWRyU3RyO1xuICB9XG4gIGNvbnN0IEJ1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcihpcE1vZGUpO1xuICB0cnkge1xuICAgIGNvbnN0IGNpZHIgPSBuZXcgQnVpbGRlcihjaWRyU3RyKTtcbiAgICByZXR1cm4gW2NpZHIuc3RhcnRBZGRyZXNzKCkuYWRkcmVzcywgY2lkci5zdWJuZXRdLmpvaW4oJycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlU2VnbWVudCA9IChcbiAgc2VnbWVudD86IHN0cmluZyxcbiAgbmV0d29ya01vZGU/OiBOZXR3b3JrTW9kZSxcbik6IFNlZ21lbnRNb2RlbCA9PiB7XG4gIGlmICghc2VnbWVudCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuSVBWNCkge1xuICAgIHJldHVybiB7XG4gICAgICBpcFY0U2VnbWVudDogc2VnbWVudCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5JUFY2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwVjZTZWdtZW50OiBzZWdtZW50LFxuICAgIH07XG4gIH1cblxuICBsZXQgaXBWNFNlZ21lbnQ6IHN0cmluZztcbiAgbGV0IGlwVjZTZWdtZW50OiBzdHJpbmc7XG5cbiAgaWYgKHNlZ21lbnQuaW5jbHVkZXMoJywnKSkge1xuICAgIFtpcFY0U2VnbWVudCwgaXBWNlNlZ21lbnRdID0gc2VnbWVudC5zcGxpdCgnLCcpO1xuICB9IGVsc2UgaWYgKHNlZ21lbnQuaW5jbHVkZXMoJzonKSkge1xuICAgIGlwVjZTZWdtZW50ID0gc2VnbWVudDtcbiAgfSBlbHNlIHtcbiAgICBpcFY0U2VnbWVudCA9IHNlZ21lbnQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlwVjRTZWdtZW50LFxuICAgIGlwVjZTZWdtZW50LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENpZHJCbG9jayhcbiAgc2VnbWVudDogc3RyaW5nLFxuICBuZXR3b3JrVHlwZT86IE5ldHdvcmtNb2RlLFxuKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIGdldENpZHJCbG9jayh7XG4gIGlwVjRTZWdtZW50LFxuICBpcFY2U2VnbWVudCxcbn06IFNlZ21lbnRNb2RlbCk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBnZXRDaWRyQmxvY2soXG4gIHBhcmFtOiBTZWdtZW50TW9kZWwgfCBzdHJpbmcsXG4gIG5ldHdvcmtNb2RlPzogTmV0d29ya01vZGUsXG4pIHtcbiAgbGV0IGlwVjRTZWdtZW50OiBzdHJpbmc7XG4gIGxldCBpcFY2U2VnbWVudDogc3RyaW5nO1xuXG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgXyA9IHBhcnNlU2VnbWVudChwYXJhbSwgbmV0d29ya01vZGUpO1xuICAgIGlwVjRTZWdtZW50ID0gXy5pcFY0U2VnbWVudDtcbiAgICBpcFY2U2VnbWVudCA9IF8uaXBWNlNlZ21lbnQ7XG4gIH0gZWxzZSB7XG4gICAgaXBWNFNlZ21lbnQgPSBwYXJhbS5pcFY0U2VnbWVudDtcbiAgICBpcFY2U2VnbWVudCA9IHBhcmFtLmlwVjZTZWdtZW50O1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBnZXRTdHJpY3RDaWRyKGlwVjRTZWdtZW50LCBJUE1vZGUuSVBWNCksXG4gICAgZ2V0U3RyaWN0Q2lkcihpcFY2U2VnbWVudCwgSVBNb2RlLklQVjYpLFxuICBdXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCcsJyk7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lQVjRfTUFYX0NJRFJfUFJFRklYID0gMzE7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JUFY2X01BWF9DSURSX1BSRUZJWCA9IDEyNztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkVUV09SS19DSURSX1BSRUZJWF9NQVBQRVIgPSB7XG4gIFtJUE1vZGUuSVBWNF06IERFRkFVTFRfSVBWNF9NQVhfQ0lEUl9QUkVGSVgsXG4gIFtJUE1vZGUuSVBWNl06IERFRkFVTFRfSVBWNl9NQVhfQ0lEUl9QUkVGSVgsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lkck1heGltdW1QcmVmaXgoaXBNb2RlOiBJUE1vZGUgPSBJUE1vZGUuSVBWNCkge1xuICByZXR1cm4gREVGQVVMVF9ORVRXT1JLX0NJRFJfUFJFRklYX01BUFBFUltpcE1vZGVdO1xufVxuXG5leHBvcnQgY29uc3QgYWRhcHRJcE1vZGUgPSAodmFsdWU6IHN0cmluZywgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlKSA9PlxuICBuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuRFVBTFxuICAgID8gdmFsdWUuaW5jbHVkZXMoJzonKVxuICAgICAgPyBOZXR3b3JrTW9kZS5JUFY2XG4gICAgICA6IE5ldHdvcmtNb2RlLklQVjRcbiAgICA6IG5ldHdvcmtNb2RlO1xuXG5leHBvcnQgY29uc3QgaXNJcFBhcnRWYWxpZCA9IChwYXJ0OiBzdHJpbmcsIGlzSXBWNDogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICBpZiAocGFydCA9PT0gJycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNJcFY0KSB7XG4gICAgaWYgKElOVF9aRVJPX1BBVFRFUk4ucGF0dGVybi50ZXN0KHBhcnQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHBhcnQpIDw9IDI1NTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgvXltcXGRhLWZdKyQvaS50ZXN0KHBhcnQpKSB7XG4gICAgcmV0dXJuIE51bWJlci5wYXJzZUludChwYXJ0LCAxNikgPD0gMHhmZl9mZjtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJcFBhcnRzVmFsaWQgPSAocGFydHM6IHN0cmluZ1tdLCBpc0lwVjQ6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIHBhcnRzLmV2ZXJ5KHBhcnQgPT4gaXNJcFBhcnRWYWxpZChwYXJ0LCBpc0lwVjQpKTtcblxuZXhwb3J0IGNvbnN0IGlzSXBJbnB1dFZhbGlkID0gKGlucHV0OiBzdHJpbmcsIGlzSXBWNDogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IGlucHV0LnNwbGl0KGlzSXBWNCA/ICcuJyA6ICc6Jyk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPD0gKGlzSXBWNCA/IDQgOiA4KSAmJiBpc0lwUGFydHNWYWxpZChwYXJ0cywgaXNJcFY0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMgPSAoXG4gIGNpZHJzOiBzdHJpbmdbXSxcbiAgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLFxuICB1c2VkSXBzOiBzdHJpbmdbXSxcbiAgaW5wdXRWYWx1ZTogc3RyaW5nLFxuICBpc0NhbGljbzogYm9vbGVhbixcbiAgbWF4U2l6ZSA9IDEwLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eVxuKTogc3RyaW5nW10gPT4ge1xuICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZSA/PyAnJztcblxuICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCB1c2VkSXBWYWx1ZXMgPSBbXG4gICAgLi4udXNlZElwcy5yZWR1Y2U8U2V0PEJpZ0ludGVnZXI+PigoaXBWYWx1ZXMsIGlwKSA9PiB7XG4gICAgICBjb25zdCBCdWlsZGVyID0gZ2V0QWRkcmVzc0J1aWxkZXIoYWRhcHRJcE1vZGUoaXAsIG5ldHdvcmtNb2RlKSk7XG4gICAgICB0cnkge1xuICAgICAgICBpcFZhbHVlcy5hZGQobmV3IEJ1aWxkZXIoaXApLmJpZ0ludGVnZXIoKSk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICByZXR1cm4gaXBWYWx1ZXM7XG4gICAgfSwgbmV3IFNldDxCaWdJbnRlZ2VyPigpKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGNpZHIgb2YgY2lkcnMpIHtcbiAgICBjb25zdCBpcE1vZGUgPSBhZGFwdElwTW9kZShjaWRyLCBuZXR3b3JrTW9kZSk7XG5cbiAgICBjb25zdCBpc0lwVjQgPSBpcE1vZGUgPT09IElQTW9kZS5JUFY0O1xuXG4gICAgaWYgKCFpc0lwSW5wdXRWYWxpZChpbnB1dFZhbHVlLCBpc0lwVjQpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBsb29wU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIGNvbnN0IEJ1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcihpcE1vZGUpO1xuXG4gICAgbGV0IGlwQ2lkcjogQWRkcmVzczQgfCBBZGRyZXNzNjtcblxuICAgIHRyeSB7XG4gICAgICBpcENpZHIgPSBuZXcgQnVpbGRlcihjaWRyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0QWRkcmVzcyA9IGlwQ2lkci5fc3RhcnRBZGRyZXNzKCk7XG4gICAgY29uc3QgZW5kQWRkcmVzcyA9IGlwQ2lkci5fZW5kQWRkcmVzcygpO1xuXG4gICAgLy8g6Z2eIGNhbGljbyDmqKHlvI/kuIvvvIzkuI3lhYHorrjkvb/nlKjnvZHmrrXnmoTnrKzkuIDkuKrnvZHnu5wgSVAg5ZKM5pyA5ZCO5LiA5LiqIOW5v+aSrSBJUFxuICAgIGxldCBhZGRyZXNzID0gc3RhcnRBZGRyZXNzLmFkZChpc0NhbGljbyA/IEJpZ0ludGVnZXIuWkVSTyA6IEJpZ0ludGVnZXIuT05FKTtcblxuICAgIHdoaWxlIChhZGRyZXNzLmNvbXBhcmVUbyhlbmRBZGRyZXNzKSA8IChpc0NhbGljbyA/IDEgOiAwKSkge1xuICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgIC8vIENvbnNpZGVyaW5nIHRoZSBwZXJmb3JtYW5jZSwgd2UgZG9uJ3Qgd2FudCB0byBibG9jayB0aGUgVUkgdG9vIG11Y2hcbiAgICAgIGlmICghaXNJcFY0KSB7XG4gICAgICAgIGlmIChub3cgLSBsb29wU3RhcnQgPiAxMDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3cgLSBzdGFydCA+IDI1MCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1c2VkSXBWYWx1ZXMuc29tZShpcCA9PiAhaXAuY29tcGFyZVRvKGFkZHJlc3MpKSkge1xuICAgICAgICBjb25zdCBpcEFkZHIgPSBCdWlsZGVyLmZyb21CaWdJbnRlZ2VyKGFkZHJlc3MpLmNvcnJlY3RGb3JtKCk7XG4gICAgICAgIGlmIChpcEFkZHIuaW5jbHVkZXMoaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChpcEFkZHIpO1xuICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID49IG1heFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLmFkZChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdFN1Ym5ldENpZHJzKFxuICBjaWRyczogc3RyaW5nLFxuICBuZXR3b3JrTW9kZTogTmV0d29ya01vZGUsXG4gIGVuYWJsZUZpeElwVjZGb3JEdWFsID0gZmFsc2UsXG4pIHtcbiAgcmV0dXJuIGNpZHJzXG4gICAgPy5zcGxpdCgnOycpXG4gICAgLm1hcChjaWRyID0+IHBhcnNlU2VnbWVudChjaWRyKSlcbiAgICAucmVkdWNlKChsaXN0LCBpdGVtKSA9PiB7XG4gICAgICBsaXN0LnB1c2goXG4gICAgICAgIGl0ZW0uaXBWNFNlZ21lbnQsXG4gICAgICAgIChuZXR3b3JrTW9kZSAhPT0gTmV0d29ya01vZGUuRFVBTCB8fCBlbmFibGVGaXhJcFY2Rm9yRHVhbCkgJiZcbiAgICAgICAgICBpdGVtLmlwVjZTZWdtZW50LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sIFtdIGFzIHN0cmluZ1tdKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIGlwQmVnaW4gPiBpcEVuZFxuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRJcE9yZGVyPFQgZXh0ZW5kcyBBZGRyZXNzNCB8IEFkZHJlc3M2PihcbiAgaXBCZWdpbjogVCxcbiAgaXBFbmQ6IFQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgaXBCZWdpbkJpZ0ludCA9IGlwQmVnaW4uYmlnSW50ZWdlcigpO1xuICBjb25zdCBpcEVuZEJpZ0ludCA9IGlwRW5kLmJpZ0ludGVnZXIoKTtcbiAgcmV0dXJuIGlwQmVnaW5CaWdJbnQuY29tcGFyZVRvKGlwRW5kQmlnSW50KSA+PSAwO1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Fixme: 网络依赖以下类型和工具,如果有 Cluster 相关的 libs 再做迁移
|
|
2
|
+
export var ClusterType;
|
|
3
|
+
(function (ClusterType) {
|
|
4
|
+
ClusterType["Baremetal"] = "Baremetal";
|
|
5
|
+
ClusterType["Imported"] = "Imported";
|
|
6
|
+
ClusterType["OCP"] = "OCP";
|
|
7
|
+
// pubic clouds
|
|
8
|
+
ClusterType["AlibabaCloudACKDedicated"] = "AlibabaCloudACKDedicated";
|
|
9
|
+
ClusterType["AlibabaCloudACKManaged"] = "AlibabaCloudACKManaged";
|
|
10
|
+
ClusterType["AmazonEKS"] = "AmazonEKS";
|
|
11
|
+
ClusterType["AzureAKS"] = "AzureAKS";
|
|
12
|
+
ClusterType["GoogleCloudGKE"] = "GoogleCloudGKE";
|
|
13
|
+
ClusterType["HuaweiCloudCCE"] = "HuaweiCloudCCE";
|
|
14
|
+
ClusterType["TencentTKEManaged"] = "TencentTKEManaged";
|
|
15
|
+
ClusterType["TencentTKESelfDeployed"] = "TencentTKESelfDeployed";
|
|
16
|
+
})(ClusterType || (ClusterType = {}));
|
|
17
|
+
export const isPublicCloud = (clusterType) => !!clusterType && !['Baremetal', 'OCP', 'Imported'].includes(clusterType);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci1leHBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvdXRpbHMvY2x1c3Rlci1leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxNQUFNLENBQU4sSUFBWSxXQWNYO0FBZEQsV0FBWSxXQUFXO0lBQ3JCLHNDQUF1QixDQUFBO0lBQ3ZCLG9DQUFxQixDQUFBO0lBQ3JCLDBCQUFXLENBQUE7SUFFWCxlQUFlO0lBQ2Ysb0VBQXFELENBQUE7SUFDckQsZ0VBQWlELENBQUE7SUFDakQsc0NBQXVCLENBQUE7SUFDdkIsb0NBQXFCLENBQUE7SUFDckIsZ0RBQWlDLENBQUE7SUFDakMsZ0RBQWlDLENBQUE7SUFDakMsc0RBQXVDLENBQUE7SUFDdkMsZ0VBQWlELENBQUE7QUFDbkQsQ0FBQyxFQWRXLFdBQVcsS0FBWCxXQUFXLFFBY3RCO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBb0IsRUFBRSxFQUFFLENBQ3BELENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRml4bWU6IOe9kee7nOS+nei1luS7peS4i+exu+Wei+WSjOW3peWFt++8jOWmguaenOaciSBDbHVzdGVyIOebuOWFs+eahCBsaWJzIOWGjeWBmui/geenu1xuZXhwb3J0IGVudW0gQ2x1c3RlclR5cGUge1xuICBCYXJlbWV0YWwgPSAnQmFyZW1ldGFsJyxcbiAgSW1wb3J0ZWQgPSAnSW1wb3J0ZWQnLFxuICBPQ1AgPSAnT0NQJyxcblxuICAvLyBwdWJpYyBjbG91ZHNcbiAgQWxpYmFiYUNsb3VkQUNLRGVkaWNhdGVkID0gJ0FsaWJhYmFDbG91ZEFDS0RlZGljYXRlZCcsXG4gIEFsaWJhYmFDbG91ZEFDS01hbmFnZWQgPSAnQWxpYmFiYUNsb3VkQUNLTWFuYWdlZCcsXG4gIEFtYXpvbkVLUyA9ICdBbWF6b25FS1MnLFxuICBBenVyZUFLUyA9ICdBenVyZUFLUycsXG4gIEdvb2dsZUNsb3VkR0tFID0gJ0dvb2dsZUNsb3VkR0tFJyxcbiAgSHVhd2VpQ2xvdWRDQ0UgPSAnSHVhd2VpQ2xvdWRDQ0UnLFxuICBUZW5jZW50VEtFTWFuYWdlZCA9ICdUZW5jZW50VEtFTWFuYWdlZCcsXG4gIFRlbmNlbnRUS0VTZWxmRGVwbG95ZWQgPSAnVGVuY2VudFRLRVNlbGZEZXBsb3llZCcsXG59XG5cbmV4cG9ydCBjb25zdCBpc1B1YmxpY0Nsb3VkID0gKGNsdXN0ZXJUeXBlPzogc3RyaW5nKSA9PlxuICAhIWNsdXN0ZXJUeXBlICYmICFbJ0JhcmVtZXRhbCcsICdPQ1AnLCAnSW1wb3J0ZWQnXS5pbmNsdWRlcyhjbHVzdGVyVHlwZSk7XG4iXX0=
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { SERVICE_PORT_BASE_PROTOCOLS, SERVICE_SESSION_AFFINITIES, SERVICE_TYPES, ServiceTypeMeta, } from '@alauda-fe/common';
|
|
2
|
+
import { getServiceDefaultName } from './service-internals';
|
|
3
|
+
export function getDefaultService(namespace, name = '') {
|
|
4
|
+
const protocol = SERVICE_PORT_BASE_PROTOCOLS[0];
|
|
5
|
+
return {
|
|
6
|
+
...ServiceTypeMeta,
|
|
7
|
+
metadata: {
|
|
8
|
+
name,
|
|
9
|
+
namespace,
|
|
10
|
+
},
|
|
11
|
+
spec: {
|
|
12
|
+
type: SERVICE_TYPES[0],
|
|
13
|
+
sessionAffinity: SERVICE_SESSION_AFFINITIES[0],
|
|
14
|
+
ports: [
|
|
15
|
+
{
|
|
16
|
+
protocol,
|
|
17
|
+
name: '',
|
|
18
|
+
port: null,
|
|
19
|
+
targetPort: '',
|
|
20
|
+
appProtocol: protocol.toLowerCase(),
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function getResourceReference(service, self = this) {
|
|
27
|
+
const resourceRef = self.k8sUtil.getAnnotation(service, 'reference', 'resource');
|
|
28
|
+
if (!resourceRef) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const reference = JSON.parse(resourceRef);
|
|
33
|
+
const [refType, refName] = reference[0].split('.');
|
|
34
|
+
return {
|
|
35
|
+
refType,
|
|
36
|
+
refName,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
}
|
|
41
|
+
export function completeDefaultServiceName(resource, networkMode) {
|
|
42
|
+
const type = resource.spec.type;
|
|
43
|
+
return {
|
|
44
|
+
...resource,
|
|
45
|
+
spec: type === 'ExternalName'
|
|
46
|
+
? { ...resource?.spec }
|
|
47
|
+
: {
|
|
48
|
+
ipFamilies: networkMode === 'dual' ? ['IPv4', 'IPv6'] : null,
|
|
49
|
+
ipFamilyPolicy: 'PreferDualStack',
|
|
50
|
+
...resource?.spec,
|
|
51
|
+
ports: resource?.spec?.ports?.map(servicePort => ({
|
|
52
|
+
...servicePort,
|
|
53
|
+
name: servicePort.name || getServiceDefaultName(servicePort),
|
|
54
|
+
})),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1leHBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvdXRpbHMvc2VydmljZS1leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGFBQWEsRUFFYixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUM7QUFHM0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFRNUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDNUQsTUFBTSxRQUFRLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTztRQUNMLEdBQUcsZUFBZTtRQUNsQixRQUFRLEVBQUU7WUFDUixJQUFJO1lBQ0osU0FBUztTQUNWO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDdEIsZUFBZSxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUM5QyxLQUFLLEVBQUU7Z0JBQ0w7b0JBQ0UsUUFBUTtvQkFDUixJQUFJLEVBQUUsRUFBRTtvQkFDUixJQUFJLEVBQUUsSUFBSTtvQkFDVixVQUFVLEVBQUUsRUFBRTtvQkFDZCxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBVztpQkFDN0M7YUFDRjtTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBRWxDLE9BQWdCLEVBQ2hCLElBQUksR0FBRyxJQUFJO0lBRVgsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQzVDLE9BQU8sRUFDUCxXQUFXLEVBQ1gsVUFBVSxDQUNYLENBQUM7SUFDRixJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hCLE9BQU87S0FDUjtJQUNELElBQUk7UUFDRixNQUFNLFNBQVMsR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBR2hELENBQUM7UUFDRixPQUFPO1lBQ0wsT0FBTztZQUNQLE9BQU87U0FDUixDQUFDO0tBQ0g7SUFBQyxNQUFNLEdBQUU7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxRQUFpQixFQUNqQixXQUF3QjtJQUV4QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNoQyxPQUFPO1FBQ0wsR0FBRyxRQUFRO1FBQ1gsSUFBSSxFQUNGLElBQUksS0FBSyxjQUFjO1lBQ3JCLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRTtZQUN2QixDQUFDLENBQUM7Z0JBQ0UsVUFBVSxFQUFFLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUM1RCxjQUFjLEVBQUUsaUJBQWlCO2dCQUNqQyxHQUFHLFFBQVEsRUFBRSxJQUFJO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEQsR0FBRyxXQUFXO29CQUNkLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztpQkFDN0QsQ0FBQyxDQUFDO2FBQ0o7S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERhZW1vblNldCxcbiAgRGVwbG95bWVudCxcbiAgSzhzVXRpbFNlcnZpY2UsXG4gIFNFUlZJQ0VfUE9SVF9CQVNFX1BST1RPQ09MUyxcbiAgU0VSVklDRV9TRVNTSU9OX0FGRklOSVRJRVMsXG4gIFNFUlZJQ0VfVFlQRVMsXG4gIFNlcnZpY2UsXG4gIFNlcnZpY2VUeXBlTWV0YSxcbiAgU3RhdGVmdWxTZXQsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcblxuaW1wb3J0IHsgTmV0d29ya01vZGUgfSBmcm9tICcuL2NpZHItZXhwb3J0cyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlRGVmYXVsdE5hbWUgfSBmcm9tICcuL3NlcnZpY2UtaW50ZXJuYWxzJztcblxuaW50ZXJmYWNlIFdvcmtsb2FkcyB7XG4gIERlcGxveW1lbnQ/OiBEZXBsb3ltZW50W107XG4gIERhZW1vblNldD86IERhZW1vblNldFtdO1xuICBTdGF0ZWZ1bFNldD86IFN0YXRlZnVsU2V0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0U2VydmljZShuYW1lc3BhY2U6IHN0cmluZywgbmFtZSA9ICcnKTogU2VydmljZSB7XG4gIGNvbnN0IHByb3RvY29sID0gU0VSVklDRV9QT1JUX0JBU0VfUFJPVE9DT0xTWzBdO1xuICByZXR1cm4ge1xuICAgIC4uLlNlcnZpY2VUeXBlTWV0YSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgbmFtZSxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICB9LFxuICAgIHNwZWM6IHtcbiAgICAgIHR5cGU6IFNFUlZJQ0VfVFlQRVNbMF0sXG4gICAgICBzZXNzaW9uQWZmaW5pdHk6IFNFUlZJQ0VfU0VTU0lPTl9BRkZJTklUSUVTWzBdLFxuICAgICAgcG9ydHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIHBvcnQ6IG51bGwsXG4gICAgICAgICAgdGFyZ2V0UG9ydDogJycsXG4gICAgICAgICAgYXBwUHJvdG9jb2w6IHByb3RvY29sLnRvTG93ZXJDYXNlKCkgYXMgJ3RjcCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZVJlZmVyZW5jZShcbiAgdGhpczogeyBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSB9LFxuICBzZXJ2aWNlOiBTZXJ2aWNlLFxuICBzZWxmID0gdGhpcyxcbikge1xuICBjb25zdCByZXNvdXJjZVJlZiA9IHNlbGYuazhzVXRpbC5nZXRBbm5vdGF0aW9uKFxuICAgIHNlcnZpY2UsXG4gICAgJ3JlZmVyZW5jZScsXG4gICAgJ3Jlc291cmNlJyxcbiAgKTtcbiAgaWYgKCFyZXNvdXJjZVJlZikge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlZmVyZW5jZTogc3RyaW5nW10gPSBKU09OLnBhcnNlKHJlc291cmNlUmVmKTtcbiAgICBjb25zdCBbcmVmVHlwZSwgcmVmTmFtZV0gPSByZWZlcmVuY2VbMF0uc3BsaXQoJy4nKSBhcyBbXG4gICAgICBrZXlvZiBXb3JrbG9hZHMgfCAnVmlydHVhbE1hY2hpbmUnIHwgJ1ZpcnR1YWxNYWNoaW5lUG9vbCcsXG4gICAgICBzdHJpbmcsXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmVHlwZSxcbiAgICAgIHJlZk5hbWUsXG4gICAgfTtcbiAgfSBjYXRjaCB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGVEZWZhdWx0U2VydmljZU5hbWUoXG4gIHJlc291cmNlOiBTZXJ2aWNlLFxuICBuZXR3b3JrTW9kZTogTmV0d29ya01vZGUsXG4pOiBTZXJ2aWNlIHtcbiAgY29uc3QgdHlwZSA9IHJlc291cmNlLnNwZWMudHlwZTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBzcGVjOlxuICAgICAgdHlwZSA9PT0gJ0V4dGVybmFsTmFtZSdcbiAgICAgICAgPyB7IC4uLnJlc291cmNlPy5zcGVjIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBpcEZhbWlsaWVzOiBuZXR3b3JrTW9kZSA9PT0gJ2R1YWwnID8gWydJUHY0JywgJ0lQdjYnXSA6IG51bGwsXG4gICAgICAgICAgICBpcEZhbWlseVBvbGljeTogJ1ByZWZlckR1YWxTdGFjaycsXG4gICAgICAgICAgICAuLi5yZXNvdXJjZT8uc3BlYyxcbiAgICAgICAgICAgIHBvcnRzOiByZXNvdXJjZT8uc3BlYz8ucG9ydHM/Lm1hcChzZXJ2aWNlUG9ydCA9PiAoe1xuICAgICAgICAgICAgICAuLi5zZXJ2aWNlUG9ydCxcbiAgICAgICAgICAgICAgbmFtZTogc2VydmljZVBvcnQubmFtZSB8fCBnZXRTZXJ2aWNlRGVmYXVsdE5hbWUoc2VydmljZVBvcnQpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// @internal
|
|
2
|
+
export function getServiceDefaultName(item) {
|
|
3
|
+
return [item.appProtocol, item.port, item.targetPort]
|
|
4
|
+
.filter(Boolean)
|
|
5
|
+
.join('-');
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1pbnRlcm5hbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi91dGlscy9zZXJ2aWNlLWludGVybmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxZQUFZO0FBQ1osTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQWlCO0lBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VQb3J0IH0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVmYXVsdE5hbWUoaXRlbTogU2VydmljZVBvcnQpIHtcbiAgcmV0dXJuIFtpdGVtLmFwcFByb3RvY29sLCBpdGVtLnBvcnQsIGl0ZW0udGFyZ2V0UG9ydF1cbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oJy0nKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const DOMAIN_REF = 'domain-ref';
|
|
2
|
+
export const DOMAIN_NAME_REF = 'domain-name-ref';
|
|
3
|
+
export const SECRET_REF = 'secret-ref';
|
|
4
|
+
export const KUBE_OVN_ANNOTATION_PREFIX = 'ovn.kubernetes.io';
|
|
5
|
+
export const CALICO_ANNOTATION_PREFIX = 'cni.projectcalico.org';
|
|
6
|
+
export var ClusterNetworkType;
|
|
7
|
+
(function (ClusterNetworkType) {
|
|
8
|
+
ClusterNetworkType["KUBE_OVN"] = "cni-kube-ovn";
|
|
9
|
+
ClusterNetworkType["CALICO"] = "cni-calico";
|
|
10
|
+
ClusterNetworkType["DEFAULT"] = "default";
|
|
11
|
+
})(ClusterNetworkType || (ClusterNetworkType = {}));
|
|
12
|
+
export var ConflictCidrType;
|
|
13
|
+
(function (ConflictCidrType) {
|
|
14
|
+
ConflictCidrType["EXIST_SUBNET"] = "conflict_subnet";
|
|
15
|
+
ConflictCidrType["HOST_NETWORK"] = "conflict_host";
|
|
16
|
+
ConflictCidrType["SERVICE_CIDR"] = "conflict_service_cidr";
|
|
17
|
+
})(ConflictCidrType || (ConflictCidrType = {}));
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibmV0LWV4cG9ydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi91dGlscy9zdWJuZXQtZXhwb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUNqRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDO0FBRWhFLE1BQU0sQ0FBTixJQUFZLGtCQUlYO0FBSkQsV0FBWSxrQkFBa0I7SUFDNUIsK0NBQXlCLENBQUE7SUFDekIsMkNBQXFCLENBQUE7SUFDckIseUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUpXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJN0I7QUFFRCxNQUFNLENBQU4sSUFBWSxnQkFJWDtBQUpELFdBQVksZ0JBQWdCO0lBQzFCLG9EQUFnQyxDQUFBO0lBQ2hDLGtEQUE4QixDQUFBO0lBQzlCLDBEQUFzQyxDQUFBO0FBQ3hDLENBQUMsRUFKVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBSTNCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERPTUFJTl9SRUYgPSAnZG9tYWluLXJlZic7XG5leHBvcnQgY29uc3QgRE9NQUlOX05BTUVfUkVGID0gJ2RvbWFpbi1uYW1lLXJlZic7XG5leHBvcnQgY29uc3QgU0VDUkVUX1JFRiA9ICdzZWNyZXQtcmVmJztcbmV4cG9ydCBjb25zdCBLVUJFX09WTl9BTk5PVEFUSU9OX1BSRUZJWCA9ICdvdm4ua3ViZXJuZXRlcy5pbyc7XG5leHBvcnQgY29uc3QgQ0FMSUNPX0FOTk9UQVRJT05fUFJFRklYID0gJ2NuaS5wcm9qZWN0Y2FsaWNvLm9yZyc7XG5cbmV4cG9ydCBlbnVtIENsdXN0ZXJOZXR3b3JrVHlwZSB7XG4gIEtVQkVfT1ZOID0gJ2NuaS1rdWJlLW92bicsXG4gIENBTElDTyA9ICdjbmktY2FsaWNvJyxcbiAgREVGQVVMVCA9ICdkZWZhdWx0Jyxcbn1cblxuZXhwb3J0IGVudW0gQ29uZmxpY3RDaWRyVHlwZSB7XG4gIEVYSVNUX1NVQk5FVCA9ICdjb25mbGljdF9zdWJuZXQnLFxuICBIT1NUX05FVFdPUksgPSAnY29uZmxpY3RfaG9zdCcsXG4gIFNFUlZJQ0VfQ0lEUiA9ICdjb25mbGljdF9zZXJ2aWNlX2NpZHInLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZsaWN0Q2lkckJsb2NrIHtcbiAgY2lkcjogc3RyaW5nO1xuICB0eXBlOiBDb25mbGljdENpZHJUeXBlO1xuICBjbHVzdGVyPzogc3RyaW5nO1xufVxuIl19
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { CertificateStatusComponent } from './lib/components/certificate-status/component';
|
|
2
|
+
export { FixedIpInputComponent } from './lib/components/fixed-ip/component';
|
|
3
|
+
export { LoadBalancerSpecFormComponent } from './lib/components/loadbalancer-spec-form/component';
|
|
4
|
+
export { ServiceAnnotationsFormComponent } from './lib/components/service-annotations-form/annotations.component';
|
|
5
|
+
export { ServiceAnnotationsFormItemComponent } from './lib/components/service-annotations-form-item/annotations.component';
|
|
6
|
+
export { K8sServiceFormComponent } from './lib/components/service-form/component';
|
|
7
|
+
export * from './lib/directives/subnet-validator.directive';
|
|
8
|
+
export * from './lib/services/alb-api.service';
|
|
9
|
+
export * from './lib/services/certificate-api.service';
|
|
10
|
+
export * from './lib/services/network-util.service';
|
|
11
|
+
export * from './lib/types/alb-exports';
|
|
12
|
+
export * from './lib/types/k8s-exports';
|
|
13
|
+
export * from './lib/types/resource-definition';
|
|
14
|
+
export * from './lib/utils/alb-exports';
|
|
15
|
+
export * from './lib/utils/cidr-exports';
|
|
16
|
+
export * from './lib/utils/cluster-exports';
|
|
17
|
+
export * from './lib/utils/service-exports';
|
|
18
|
+
export * from './lib/utils/subnet-exports';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Certificate } from '@alauda-fe/common';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare const CERTIFICATE_ERRORS_MAPPER: {
|
|
4
|
+
1: string;
|
|
5
|
+
2: string;
|
|
6
|
+
3: string;
|
|
7
|
+
};
|
|
8
|
+
export declare class CertificateStatusComponent {
|
|
9
|
+
certificate?: Certificate;
|
|
10
|
+
CERTIFICATE_ERRORS_MAPPER: {
|
|
11
|
+
1: string;
|
|
12
|
+
2: string;
|
|
13
|
+
3: string;
|
|
14
|
+
};
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CertificateStatusComponent, never>;
|
|
16
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CertificateStatusComponent, "acl-certificate-status", never, { "certificate": { "alias": "certificate"; "required": false; }; }, {}, never, never, true, never>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { CommonFormControl, FormItemWidth, TagsInputComponent } from '@alauda/ui';
|
|
2
|
+
import { K8sApiService, K8sUtilService, TranslateService, StringMap } from '@alauda-fe/common';
|
|
3
|
+
import { ChangeDetectorRef } from '@angular/core';
|
|
4
|
+
import { AbstractControl, AsyncValidator, NgModel, ValidationErrors } from '@angular/forms';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
|
+
import { NetworkUtilService } from '../../services/network-util.service';
|
|
7
|
+
import { Subnet } from '../../types/k8s-exports';
|
|
8
|
+
import { ClusterNetworkType } from '../../utils/subnet-exports';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export declare class FixedIpInputComponent extends CommonFormControl<string | string[]> implements AsyncValidator {
|
|
11
|
+
readonly cdr: ChangeDetectorRef;
|
|
12
|
+
private readonly k8sUtil;
|
|
13
|
+
private readonly k8sApi;
|
|
14
|
+
private readonly networkUtilService;
|
|
15
|
+
private readonly translate;
|
|
16
|
+
cluster: string;
|
|
17
|
+
cluster$: Observable<string>;
|
|
18
|
+
namespace: string;
|
|
19
|
+
namespace$: Observable<string>;
|
|
20
|
+
networkType: ClusterNetworkType;
|
|
21
|
+
networkType$: Observable<ClusterNetworkType>;
|
|
22
|
+
subnet: Subnet;
|
|
23
|
+
subnet$: Observable<Subnet>;
|
|
24
|
+
label: string;
|
|
25
|
+
placeholder: string;
|
|
26
|
+
hint: string;
|
|
27
|
+
addonTip: string;
|
|
28
|
+
multiple: boolean;
|
|
29
|
+
ipAddress: NgModel;
|
|
30
|
+
tagsInput: TagsInputComponent;
|
|
31
|
+
formItemWidth: FormItemWidth;
|
|
32
|
+
tagsInput$: Observable<TagsInputComponent>;
|
|
33
|
+
skipOccupied: boolean;
|
|
34
|
+
enableFixIpV6ForDual: boolean;
|
|
35
|
+
errors: ValidationErrors;
|
|
36
|
+
errors$: Observable<ValidationErrors>;
|
|
37
|
+
errorsMapper: StringMap;
|
|
38
|
+
errorsMapper$: Observable<StringMap>;
|
|
39
|
+
uniq: <T>(array: import("lodash").List<T>) => T[];
|
|
40
|
+
onValidatorChange: () => void;
|
|
41
|
+
get isCalico(): boolean;
|
|
42
|
+
private readonly namespaceResource$;
|
|
43
|
+
private readonly networkMode$;
|
|
44
|
+
private readonly $networkMode;
|
|
45
|
+
private readonly subnetDetails$;
|
|
46
|
+
private readonly subnetInfo$;
|
|
47
|
+
private readonly $subnetInfo;
|
|
48
|
+
cidr$: Observable<string>;
|
|
49
|
+
private readonly innerErrorsMapper$;
|
|
50
|
+
combinedErrorsMapper$: Observable<{
|
|
51
|
+
pattern: string;
|
|
52
|
+
occupied: string;
|
|
53
|
+
out_of_range: string;
|
|
54
|
+
}>;
|
|
55
|
+
inputErrors$: Observable<ValidationErrors>;
|
|
56
|
+
private readonly usedIps$;
|
|
57
|
+
private readonly $usedIps;
|
|
58
|
+
ipAddressSuggestions$: Observable<string[]>;
|
|
59
|
+
constructor(cdr: ChangeDetectorRef, k8sUtil: K8sUtilService, k8sApi: K8sApiService, networkUtilService: NetworkUtilService, translate: TranslateService);
|
|
60
|
+
registerOnValidatorChange(fn: () => void): void;
|
|
61
|
+
validate(ctrl: AbstractControl): Observable<ValidationErrors>;
|
|
62
|
+
private setErrors;
|
|
63
|
+
private validateFixedIp;
|
|
64
|
+
private adaptIpMode;
|
|
65
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FixedIpInputComponent, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FixedIpInputComponent, "acl-fixed-ip-input", never, { "cluster": { "alias": "cluster"; "required": true; }; "namespace": { "alias": "namespace"; "required": true; }; "networkType": { "alias": "networkType"; "required": true; }; "subnet": { "alias": "subnet"; "required": false; }; "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "addonTip": { "alias": "addonTip"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "formItemWidth": { "alias": "formItemWidth"; "required": false; }; "skipOccupied": { "alias": "skipOccupied"; "required": false; }; "enableFixIpV6ForDual": { "alias": "enableFixIpV6ForDual"; "required": false; }; "errors": { "alias": "errors"; "required": false; }; "errorsMapper": { "alias": "errorsMapper"; "required": false; }; }, {}, never, never, true, never>;
|
|
67
|
+
}
|