@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,106 @@
|
|
|
1
|
+
import { FormModule } from '@alauda/ui';
|
|
2
|
+
import { FoldableBlockComponent, PurePipe, TranslateModule, } from '@alauda-fe/common';
|
|
3
|
+
import { NgIf, NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
5
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { BaseResourceFormComponent } from 'ng-resource-form-util';
|
|
7
|
+
import { ClusterType, isPublicCloud } from '../../utils/cluster-exports';
|
|
8
|
+
import { ServiceAnnotationsFormComponent } from '../service-annotations-form/annotations.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/forms";
|
|
11
|
+
import * as i2 from "@alauda/ui";
|
|
12
|
+
import * as i3 from "@alauda-fe/common";
|
|
13
|
+
function ServiceAnnotationsFormItemComponent_ng_container_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementContainer(0);
|
|
15
|
+
} }
|
|
16
|
+
function ServiceAnnotationsFormItemComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
17
|
+
i0.ɵɵelementContainerStart(0);
|
|
18
|
+
i0.ɵɵtemplate(1, ServiceAnnotationsFormItemComponent_ng_container_0_ng_container_1_Template, 1, 0, "ng-container", 3);
|
|
19
|
+
i0.ɵɵelementContainerEnd();
|
|
20
|
+
} if (rf & 2) {
|
|
21
|
+
i0.ɵɵnextContext();
|
|
22
|
+
const _r3 = i0.ɵɵreference(5);
|
|
23
|
+
i0.ɵɵadvance(1);
|
|
24
|
+
i0.ɵɵproperty("ngTemplateOutlet", _r3);
|
|
25
|
+
} }
|
|
26
|
+
function ServiceAnnotationsFormItemComponent_ng_template_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
+
i0.ɵɵelementContainer(0);
|
|
28
|
+
} }
|
|
29
|
+
function ServiceAnnotationsFormItemComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵelementStart(0, "acl-foldable-block", 4);
|
|
31
|
+
i0.ɵɵpipe(1, "translate");
|
|
32
|
+
i0.ɵɵtemplate(2, ServiceAnnotationsFormItemComponent_ng_template_2_ng_container_2_Template, 1, 0, "ng-container", 3);
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
} if (rf & 2) {
|
|
35
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
36
|
+
const _r3 = i0.ɵɵreference(5);
|
|
37
|
+
i0.ɵɵproperty("expandHint", i0.ɵɵpipeBind1(1, 2, ctx_r2.resourceName));
|
|
38
|
+
i0.ɵɵadvance(2);
|
|
39
|
+
i0.ɵɵproperty("ngTemplateOutlet", _r3);
|
|
40
|
+
} }
|
|
41
|
+
function ServiceAnnotationsFormItemComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 5);
|
|
43
|
+
i0.ɵɵtext(2);
|
|
44
|
+
i0.ɵɵpipe(3, "translate");
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
i0.ɵɵelementStart(4, "acl-service-annotations-form", 6);
|
|
47
|
+
i0.ɵɵprojection(5);
|
|
48
|
+
i0.ɵɵelementEnd()();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
51
|
+
i0.ɵɵadvance(2);
|
|
52
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 5, ctx_r4.resourceName));
|
|
53
|
+
i0.ɵɵadvance(2);
|
|
54
|
+
i0.ɵɵproperty("formControl", ctx_r4.form)("isUpdate", ctx_r4.isUpdate)("clusterType", ctx_r4.clusterType)("resourceName", ctx_r4.resourceName);
|
|
55
|
+
} }
|
|
56
|
+
const _c0 = ["*"];
|
|
57
|
+
export class ServiceAnnotationsFormItemComponent extends BaseResourceFormComponent {
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
60
|
+
this.isPublicCloud = isPublicCloud;
|
|
61
|
+
}
|
|
62
|
+
get resourceName() {
|
|
63
|
+
return this.inService ? 'annotation' : 'service_annotations';
|
|
64
|
+
}
|
|
65
|
+
createForm() {
|
|
66
|
+
return this.fb.control({});
|
|
67
|
+
}
|
|
68
|
+
static { this.ɵfac = /*@__PURE__*/ function () { let ɵServiceAnnotationsFormItemComponent_BaseFactory; return function ServiceAnnotationsFormItemComponent_Factory(t) { return (ɵServiceAnnotationsFormItemComponent_BaseFactory || (ɵServiceAnnotationsFormItemComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ServiceAnnotationsFormItemComponent)))(t || ServiceAnnotationsFormItemComponent); }; }(); }
|
|
69
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ServiceAnnotationsFormItemComponent, selectors: [["acl-service-annotations-form-item"]], inputs: { isUpdate: "isUpdate", clusterType: "clusterType", inService: "inService" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c0, decls: 6, vars: 5, consts: [[4, "ngIf", "ngIfElse"], ["nonPublicCloud", ""], ["innerFormItem", ""], [4, "ngTemplateOutlet"], [3, "expandHint"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", 3, "formControl", "isUpdate", "clusterType", "resourceName"]], template: function ServiceAnnotationsFormItemComponent_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
+
i0.ɵɵprojectionDef();
|
|
71
|
+
i0.ɵɵtemplate(0, ServiceAnnotationsFormItemComponent_ng_container_0_Template, 2, 1, "ng-container", 0);
|
|
72
|
+
i0.ɵɵpipe(1, "pure");
|
|
73
|
+
i0.ɵɵtemplate(2, ServiceAnnotationsFormItemComponent_ng_template_2_Template, 3, 4, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
74
|
+
i0.ɵɵtemplate(4, ServiceAnnotationsFormItemComponent_ng_template_4_Template, 6, 7, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
|
|
75
|
+
} if (rf & 2) {
|
|
76
|
+
const _r1 = i0.ɵɵreference(3);
|
|
77
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(1, 2, ctx.clusterType, ctx.isPublicCloud))("ngIfElse", _r1);
|
|
78
|
+
} }, dependencies: [ReactiveFormsModule, i1.NgControlStatus, i1.FormControlDirective, NgIf,
|
|
79
|
+
NgTemplateOutlet,
|
|
80
|
+
PurePipe,
|
|
81
|
+
FormModule, i2.FormItemComponent, i2.FormItemLabelDirective, i2.FormItemControlDirective, FoldableBlockComponent,
|
|
82
|
+
ServiceAnnotationsFormComponent,
|
|
83
|
+
TranslateModule, i3.TranslatePipe], styles: ["acl-foldable-block[_ngcontent-%COMP%] .foldable{margin-bottom:20px}acl-foldable-block[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}"], changeDetection: 0 }); }
|
|
84
|
+
}
|
|
85
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ServiceAnnotationsFormItemComponent, [{
|
|
86
|
+
type: Component,
|
|
87
|
+
args: [{ selector: 'acl-service-annotations-form-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
88
|
+
ReactiveFormsModule,
|
|
89
|
+
NgIf,
|
|
90
|
+
NgTemplateOutlet,
|
|
91
|
+
PurePipe,
|
|
92
|
+
FormModule,
|
|
93
|
+
FoldableBlockComponent,
|
|
94
|
+
ServiceAnnotationsFormComponent,
|
|
95
|
+
TranslateModule,
|
|
96
|
+
], template: "<ng-container *ngIf=\"clusterType | pure: isPublicCloud; else nonPublicCloud\">\n <ng-container *ngTemplateOutlet=\"innerFormItem\"></ng-container>\n</ng-container>\n\n<ng-template #nonPublicCloud>\n <acl-foldable-block [expandHint]=\"resourceName | translate\">\n <ng-container *ngTemplateOutlet=\"innerFormItem\"></ng-container>\n </acl-foldable-block>\n</ng-template>\n\n<ng-template #innerFormItem>\n <aui-form-item>\n <label auiFormItemLabel>{{ resourceName | translate }}</label>\n <acl-service-annotations-form\n auiFormItemControl\n [formControl]=\"form\"\n [isUpdate]=\"isUpdate\"\n [clusterType]=\"clusterType\"\n [resourceName]=\"resourceName\"\n >\n <ng-content></ng-content>\n </acl-service-annotations-form>\n </aui-form-item>\n</ng-template>\n", styles: ["acl-foldable-block ::ng-deep .foldable{margin-bottom:20px}acl-foldable-block ::ng-deep .aui-form-item{margin-bottom:0}\n"] }]
|
|
97
|
+
}], null, { isUpdate: [{
|
|
98
|
+
type: Input,
|
|
99
|
+
args: [{ required: true }]
|
|
100
|
+
}], clusterType: [{
|
|
101
|
+
type: Input,
|
|
102
|
+
args: [{ required: true }]
|
|
103
|
+
}], inService: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}] }); })();
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0taXRlbS9hbm5vdGF0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3NlcnZpY2UtYW5ub3RhdGlvbnMtZm9ybS1pdGVtL2Fubm90YXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBRVIsZUFBZSxHQUNoQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7SUNabEcsd0JBQStEOzs7SUFEakUsNkJBQTZFO0lBQzNFLHFIQUErRDtJQUNqRSwwQkFBZTs7OztJQURFLGVBQStCO0lBQS9CLHNDQUErQjs7O0lBSzVDLHdCQUErRDs7O0lBRGpFLDZDQUE0RDs7SUFDMUQsb0hBQStEO0lBQ2pFLGlCQUFxQjs7OztJQUZELHNFQUF1QztJQUMxQyxlQUErQjtJQUEvQixzQ0FBK0I7OztJQUtoRCxxQ0FBZSxlQUFBO0lBQ1csWUFBOEI7O0lBQUEsaUJBQVE7SUFDOUQsdURBTUM7SUFDQyxrQkFBeUI7SUFDM0IsaUJBQStCLEVBQUE7OztJQVRQLGVBQThCO0lBQTlCLCtEQUE4QjtJQUdwRCxlQUFvQjtJQUFwQix5Q0FBb0IsNkJBQUEsbUNBQUEscUNBQUE7OztBRGlCMUIsTUFBTSxPQUFPLG1DQUFvQyxTQUFRLHlCQUFvQztJQWpCN0Y7O1FBK0JFLGtCQUFhLEdBQUcsYUFBYSxDQUFDO0tBSy9CO0lBVEMsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQy9ELENBQUM7SUFJUSxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztxVEFsQlUsbUNBQW1DLFNBQW5DLG1DQUFtQztvRUFBbkMsbUNBQW1DOztZQ2hDaEQsc0dBRWU7O1lBRWYscUlBSWM7WUFFZCxxSUFhYzs7O1lBdkJDLCtFQUF5QyxpQkFBQTs0QkRzQnBELG1CQUFtQiwrQ0FDbkIsSUFBSTtZQUNKLGdCQUFnQjtZQUNoQixRQUFRO1lBQ1IsVUFBVSxnRkFDVixzQkFBc0I7WUFDdEIsK0JBQStCO1lBQy9CLGVBQWU7O3VGQUdOLG1DQUFtQztjQWpCL0MsU0FBUzsyQkFDRSxtQ0FBbUMsbUJBRzVCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO29CQUNQLG1CQUFtQjtvQkFDbkIsSUFBSTtvQkFDSixnQkFBZ0I7b0JBQ2hCLFFBQVE7b0JBQ1IsVUFBVTtvQkFDVixzQkFBc0I7b0JBQ3RCLCtCQUErQjtvQkFDL0IsZUFBZTtpQkFDaEI7Z0JBSUQsUUFBUTtrQkFEUCxLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUl6QixXQUFXO2tCQURWLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLFNBQVM7a0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Nb2R1bGUgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEZvbGRhYmxlQmxvY2tDb21wb25lbnQsXG4gIFB1cmVQaXBlLFxuICBTdHJpbmdNYXAsXG4gIFRyYW5zbGF0ZU1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhc2VSZXNvdXJjZUZvcm1Db21wb25lbnQgfSBmcm9tICduZy1yZXNvdXJjZS1mb3JtLXV0aWwnO1xuXG5pbXBvcnQgeyBDbHVzdGVyVHlwZSwgaXNQdWJsaWNDbG91ZCB9IGZyb20gJy4uLy4uL3V0aWxzL2NsdXN0ZXItZXhwb3J0cyc7XG5pbXBvcnQgeyBTZXJ2aWNlQW5ub3RhdGlvbnNGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VydmljZS1hbm5vdGF0aW9ucy1mb3JtL2Fubm90YXRpb25zLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0taXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnYW5ub3RhdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnYW5ub3RhdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBQdXJlUGlwZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIEZvbGRhYmxlQmxvY2tDb21wb25lbnQsXG4gICAgU2VydmljZUFubm90YXRpb25zRm9ybUNvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlcnZpY2VBbm5vdGF0aW9uc0Zvcm1JdGVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVJlc291cmNlRm9ybUNvbXBvbmVudDxTdHJpbmdNYXA+IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgaXNVcGRhdGU6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3RlclR5cGU6IENsdXN0ZXJUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIGluU2VydmljZTogYm9vbGVhbjtcblxuICBnZXQgcmVzb3VyY2VOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmluU2VydmljZSA/ICdhbm5vdGF0aW9uJyA6ICdzZXJ2aWNlX2Fubm90YXRpb25zJztcbiAgfVxuXG4gIGlzUHVibGljQ2xvdWQgPSBpc1B1YmxpY0Nsb3VkO1xuXG4gIG92ZXJyaWRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmIuY29udHJvbCh7fSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjbHVzdGVyVHlwZSB8IHB1cmU6IGlzUHVibGljQ2xvdWQ7IGVsc2Ugbm9uUHVibGljQ2xvdWRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlubmVyRm9ybUl0ZW1cIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI25vblB1YmxpY0Nsb3VkPlxuICA8YWNsLWZvbGRhYmxlLWJsb2NrIFtleHBhbmRIaW50XT1cInJlc291cmNlTmFtZSB8IHRyYW5zbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbm5lckZvcm1JdGVtXCI+PC9uZy1jb250YWluZXI+XG4gIDwvYWNsLWZvbGRhYmxlLWJsb2NrPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbm5lckZvcm1JdGVtPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyByZXNvdXJjZU5hbWUgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhY2wtc2VydmljZS1hbm5vdGF0aW9ucy1mb3JtXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtXCJcbiAgICAgIFtpc1VwZGF0ZV09XCJpc1VwZGF0ZVwiXG4gICAgICBbY2x1c3RlclR5cGVdPVwiY2x1c3RlclR5cGVcIlxuICAgICAgW3Jlc291cmNlTmFtZV09XCJyZXNvdXJjZU5hbWVcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2FjbC1zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0+XG4gIDwvYXVpLWZvcm0taXRlbT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { FormModule, IconModule, InputModule, RadioModule, SwitchModule, TooltipModule, } from '@alauda/ui';
|
|
3
|
+
import { DISPLAY_NAME, SERVICE_TYPES, FeatureGateService, K8sUtilService, ObservableInput, publishRef, TranslateModule, ReadonlyFieldDirective, ErrorsMapperModule, DisabledDirective, K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY, DOMAIN_PATTERN, ServiceTypeMeta, } from '@alauda-fe/common';
|
|
4
|
+
import { AsyncPipe, NgFor, NgIf } from '@angular/common';
|
|
5
|
+
import { ChangeDetectionStrategy, Component, Injector, Input, } from '@angular/core';
|
|
6
|
+
import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
7
|
+
import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
|
|
8
|
+
import { combineLatest, map, Observable, startWith, switchMap, takeUntil, } from 'rxjs';
|
|
9
|
+
import { ServicePortsFieldsetComponent } from './fieldset/component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@alauda-fe/common";
|
|
12
|
+
import * as i2 from "@alauda/ui";
|
|
13
|
+
import * as i3 from "@angular/forms";
|
|
14
|
+
function K8sServiceFormComponent_aui_radio_button_20_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
+
i0.ɵɵelementStart(0, "aui-radio-button", 21);
|
|
16
|
+
i0.ɵɵtext(1);
|
|
17
|
+
i0.ɵɵelementEnd();
|
|
18
|
+
} if (rf & 2) {
|
|
19
|
+
const option_r2 = ctx.$implicit;
|
|
20
|
+
i0.ɵɵproperty("value", option_r2);
|
|
21
|
+
i0.ɵɵadvance(1);
|
|
22
|
+
i0.ɵɵtextInterpolate1(" ", option_r2, " ");
|
|
23
|
+
} }
|
|
24
|
+
function K8sServiceFormComponent_div_22_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
i0.ɵɵelementStart(0, "div", 22);
|
|
26
|
+
i0.ɵɵtext(1);
|
|
27
|
+
i0.ɵɵpipe(2, "translate");
|
|
28
|
+
i0.ɵɵelementEnd();
|
|
29
|
+
} if (rf & 2) {
|
|
30
|
+
i0.ɵɵadvance(1);
|
|
31
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "service_external_name_hint"), " ");
|
|
32
|
+
} }
|
|
33
|
+
const _c0 = function () { return ["metadata", "name"]; };
|
|
34
|
+
const _c1 = function (a0) { return { pattern: a0 }; };
|
|
35
|
+
const _c2 = function () { return ["spec", "type"]; };
|
|
36
|
+
const _c3 = function () { return ["spec", "externalName"]; };
|
|
37
|
+
const _c4 = ["*"];
|
|
38
|
+
const NON_LB_SERVICE_TYPES = SERVICE_TYPES.filter(op => op !== 'LoadBalancer');
|
|
39
|
+
// K8s base service form
|
|
40
|
+
export class K8sServiceFormComponent extends BaseResourceFormGroupComponent {
|
|
41
|
+
constructor(injector, k8sUtil, featureGate) {
|
|
42
|
+
super(injector);
|
|
43
|
+
this.k8sUtil = k8sUtil;
|
|
44
|
+
this.featureGate = featureGate;
|
|
45
|
+
this.isUpdate = false;
|
|
46
|
+
this.targetComponent = 'workload';
|
|
47
|
+
this.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY = K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY;
|
|
48
|
+
this.DOMAIN_PATTERN = DOMAIN_PATTERN;
|
|
49
|
+
this.displayNameKey = this.k8sUtil.normalizeType(DISPLAY_NAME);
|
|
50
|
+
this.isLbEnabled$ = this.cluster$.pipe(switchMap(cluster => this.featureGate.isEnabled('loadbalancer-service', cluster)), startWith(null), publishRef());
|
|
51
|
+
this.types$ = combineLatest([
|
|
52
|
+
this.isUpdate$,
|
|
53
|
+
this.isLbEnabled$,
|
|
54
|
+
this.resource$,
|
|
55
|
+
]).pipe(map(([isUpdate, isLbEnabled, resource]) => {
|
|
56
|
+
return isLbEnabled ||
|
|
57
|
+
(isUpdate && resource?.spec?.type === 'LoadBalancer')
|
|
58
|
+
? SERVICE_TYPES
|
|
59
|
+
: NON_LB_SERVICE_TYPES;
|
|
60
|
+
}), publishRef());
|
|
61
|
+
}
|
|
62
|
+
ngAfterViewInit() {
|
|
63
|
+
super.ngAfterViewInit();
|
|
64
|
+
const typeCtrl = this.form.get('spec.type');
|
|
65
|
+
typeCtrl.valueChanges
|
|
66
|
+
.pipe(takeUntil(this.destroy$), startWith(typeCtrl.value))
|
|
67
|
+
.subscribe(type => {
|
|
68
|
+
const virtualIpCtrl = this.form.get('virtualIp');
|
|
69
|
+
if (this.isUpdate) {
|
|
70
|
+
virtualIpCtrl.disable();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (['NodePort', 'LoadBalancer'].includes(type)) {
|
|
74
|
+
virtualIpCtrl.setValue(true);
|
|
75
|
+
virtualIpCtrl.disable();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
virtualIpCtrl.enable();
|
|
79
|
+
}
|
|
80
|
+
if (type !== 'ExternalName') {
|
|
81
|
+
this.onVirtualIpChange(virtualIpCtrl.value);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
getDefaultFormModel() {
|
|
86
|
+
return {
|
|
87
|
+
kind: 'Service',
|
|
88
|
+
virtualIp: true,
|
|
89
|
+
sessionPersistence: false,
|
|
90
|
+
spec: {
|
|
91
|
+
type: 'ClusterIP',
|
|
92
|
+
ports: [],
|
|
93
|
+
externalName: '',
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
createForm() {
|
|
98
|
+
return this.fb.group({
|
|
99
|
+
virtualIp: this.fb.control(true),
|
|
100
|
+
sessionPersistence: false,
|
|
101
|
+
metadata: this.fb.group({
|
|
102
|
+
name: this.fb.control('', [
|
|
103
|
+
Validators.required,
|
|
104
|
+
Validators.maxLength(32),
|
|
105
|
+
Validators.pattern(K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.pattern),
|
|
106
|
+
]),
|
|
107
|
+
labels: this.fb.control({}),
|
|
108
|
+
annotations: this.fb.group({
|
|
109
|
+
[this.displayNameKey]: '',
|
|
110
|
+
}),
|
|
111
|
+
}),
|
|
112
|
+
spec: this.fb.group({
|
|
113
|
+
type: 'ClusterIP',
|
|
114
|
+
ports: null,
|
|
115
|
+
externalName: '',
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
adaptFormModel({ virtualIp, sessionPersistence, ...resource }) {
|
|
120
|
+
const service = { ...ServiceTypeMeta, ...resource };
|
|
121
|
+
// `ExternalName` type just need externalName
|
|
122
|
+
if (resource.spec.type === 'ExternalName') {
|
|
123
|
+
service.spec = {
|
|
124
|
+
type: 'ExternalName',
|
|
125
|
+
externalName: resource.spec.externalName,
|
|
126
|
+
};
|
|
127
|
+
return service;
|
|
128
|
+
}
|
|
129
|
+
// It must be non Headless if `virtualIp` is enabled
|
|
130
|
+
if (virtualIp) {
|
|
131
|
+
if (service.spec.clusterIP === 'None') {
|
|
132
|
+
delete service.spec.clusterIP;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// virtualIp 被禁用后为 undefined, 此时不做处理
|
|
136
|
+
else if (virtualIp === false) {
|
|
137
|
+
// Headless
|
|
138
|
+
service.spec.clusterIP = 'None';
|
|
139
|
+
}
|
|
140
|
+
service.spec.sessionAffinity = sessionPersistence ? 'ClientIP' : 'None';
|
|
141
|
+
return service;
|
|
142
|
+
}
|
|
143
|
+
adaptResourceModel(resource) {
|
|
144
|
+
return {
|
|
145
|
+
...resource,
|
|
146
|
+
virtualIp: resource?.spec?.clusterIP !== 'None',
|
|
147
|
+
sessionPersistence: resource?.spec?.sessionAffinity === 'ClientIP',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
onVirtualIpChange(virtualIp) {
|
|
151
|
+
if (!virtualIp) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const portsCtrl = this.form.get('spec.ports');
|
|
155
|
+
if (!portsCtrl.value?.length) {
|
|
156
|
+
portsCtrl.patchValue([{}]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
static { this.ɵfac = function K8sServiceFormComponent_Factory(t) { return new (t || K8sServiceFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.K8sUtilService), i0.ɵɵdirectiveInject(i1.FeatureGateService)); }; }
|
|
160
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: K8sServiceFormComponent, selectors: [["acl-k8s-service-form"]], inputs: { cluster: "cluster", isUpdate: "isUpdate", containerPortSuggestions: "containerPortSuggestions", targetComponent: "targetComponent" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c4, decls: 51, vars: 69, consts: [["auiForm", "", 3, "formGroup"], ["formGroupName", "metadata"], ["width", "large"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", "required", "", "name", "name", "formControlName", "name", 3, "aclReadonlyField", "placeholder"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["width", "large", "formGroupName", "annotations"], ["auiFormItemControl", "", "aui-input", "", 3, "formControlName"], ["formGroupName", "spec"], ["formControlName", "type"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemHint", "", 4, "ngIf"], ["formGroupName", "spec", "width", "large", 1, "last-form-item-no-margin", 3, "hidden"], ["type", "text", "aui-input", "", "auiFormItemControl", "", "formControlName", "externalName", 3, "aclDisabled", "required", "pattern", "placeholder"], [3, "hidden"], ["formControlName", "virtualIp", 3, "valueChange"], ["auiFormItemAddon", ""], ["icon", "question_circle", 1, "icon--help", 3, "auiTooltip", "auiTooltipPosition"], ["auiFormItemControl", "", "name", "ports", "formControlName", "ports", 1, "tw-w-full", 3, "required", "aclDisabled", "serviceType", "containerPortSuggestions", "targetComponent"], [1, "last-form-item-no-margin"], ["formControlName", "sessionPersistence"], [3, "value"], ["auiFormItemHint", ""]], template: function K8sServiceFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
+
i0.ɵɵprojectionDef();
|
|
162
|
+
i0.ɵɵelementStart(0, "form", 0);
|
|
163
|
+
i0.ɵɵelementContainerStart(1, 1);
|
|
164
|
+
i0.ɵɵelementStart(2, "aui-form-item", 2)(3, "label", 3);
|
|
165
|
+
i0.ɵɵtext(4);
|
|
166
|
+
i0.ɵɵpipe(5, "translate");
|
|
167
|
+
i0.ɵɵelementEnd();
|
|
168
|
+
i0.ɵɵelement(6, "input", 4);
|
|
169
|
+
i0.ɵɵpipe(7, "translate");
|
|
170
|
+
i0.ɵɵelement(8, "acl-errors-mapper", 5);
|
|
171
|
+
i0.ɵɵpipe(9, "translate");
|
|
172
|
+
i0.ɵɵelementEnd();
|
|
173
|
+
i0.ɵɵelementStart(10, "aui-form-item", 6)(11, "label", 3);
|
|
174
|
+
i0.ɵɵtext(12);
|
|
175
|
+
i0.ɵɵpipe(13, "translate");
|
|
176
|
+
i0.ɵɵelementEnd();
|
|
177
|
+
i0.ɵɵelement(14, "input", 7);
|
|
178
|
+
i0.ɵɵelementEnd();
|
|
179
|
+
i0.ɵɵelementContainerEnd();
|
|
180
|
+
i0.ɵɵelementStart(15, "aui-form-item", 8)(16, "label", 3);
|
|
181
|
+
i0.ɵɵtext(17);
|
|
182
|
+
i0.ɵɵpipe(18, "translate");
|
|
183
|
+
i0.ɵɵelementEnd();
|
|
184
|
+
i0.ɵɵelementStart(19, "aui-radio-group", 9);
|
|
185
|
+
i0.ɵɵtemplate(20, K8sServiceFormComponent_aui_radio_button_20_Template, 2, 2, "aui-radio-button", 10);
|
|
186
|
+
i0.ɵɵpipe(21, "async");
|
|
187
|
+
i0.ɵɵelementEnd();
|
|
188
|
+
i0.ɵɵtemplate(22, K8sServiceFormComponent_div_22_Template, 3, 3, "div", 11);
|
|
189
|
+
i0.ɵɵelementEnd();
|
|
190
|
+
i0.ɵɵelementStart(23, "aui-form-item", 12)(24, "label", 3);
|
|
191
|
+
i0.ɵɵtext(25);
|
|
192
|
+
i0.ɵɵpipe(26, "translate");
|
|
193
|
+
i0.ɵɵelementEnd();
|
|
194
|
+
i0.ɵɵelement(27, "input", 13);
|
|
195
|
+
i0.ɵɵpipe(28, "translate");
|
|
196
|
+
i0.ɵɵelement(29, "acl-errors-mapper", 5);
|
|
197
|
+
i0.ɵɵpipe(30, "translate");
|
|
198
|
+
i0.ɵɵelementEnd();
|
|
199
|
+
i0.ɵɵelementStart(31, "div", 14)(32, "aui-form-item")(33, "label", 3);
|
|
200
|
+
i0.ɵɵtext(34);
|
|
201
|
+
i0.ɵɵpipe(35, "translate");
|
|
202
|
+
i0.ɵɵelementEnd();
|
|
203
|
+
i0.ɵɵelementStart(36, "aui-switch", 15);
|
|
204
|
+
i0.ɵɵlistener("valueChange", function K8sServiceFormComponent_Template_aui_switch_valueChange_36_listener($event) { return ctx.onVirtualIpChange($event); });
|
|
205
|
+
i0.ɵɵelementEnd();
|
|
206
|
+
i0.ɵɵelementStart(37, "div", 16);
|
|
207
|
+
i0.ɵɵelement(38, "aui-icon", 17);
|
|
208
|
+
i0.ɵɵpipe(39, "translate");
|
|
209
|
+
i0.ɵɵelementEnd()();
|
|
210
|
+
i0.ɵɵprojection(40);
|
|
211
|
+
i0.ɵɵelementStart(41, "aui-form-item", 8)(42, "label", 3);
|
|
212
|
+
i0.ɵɵtext(43);
|
|
213
|
+
i0.ɵɵpipe(44, "translate");
|
|
214
|
+
i0.ɵɵelementEnd();
|
|
215
|
+
i0.ɵɵelement(45, "acl-service-ports-fieldset", 18);
|
|
216
|
+
i0.ɵɵelementEnd();
|
|
217
|
+
i0.ɵɵelementStart(46, "aui-form-item", 19)(47, "label", 3);
|
|
218
|
+
i0.ɵɵtext(48);
|
|
219
|
+
i0.ɵɵpipe(49, "translate");
|
|
220
|
+
i0.ɵɵelementEnd();
|
|
221
|
+
i0.ɵɵelement(50, "aui-switch", 20);
|
|
222
|
+
i0.ɵɵelementEnd()()();
|
|
223
|
+
} if (rf & 2) {
|
|
224
|
+
i0.ɵɵproperty("formGroup", ctx.form);
|
|
225
|
+
i0.ɵɵadvance(4);
|
|
226
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 30, "name"));
|
|
227
|
+
i0.ɵɵadvance(2);
|
|
228
|
+
i0.ɵɵproperty("aclReadonlyField", ctx.isUpdate)("placeholder", i0.ɵɵpipeBind1(7, 32, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip));
|
|
229
|
+
i0.ɵɵadvance(2);
|
|
230
|
+
i0.ɵɵproperty("errors", ctx.form.get(i0.ɵɵpureFunction0(56, _c0)).errors)("errorsMapper", i0.ɵɵpureFunction1(57, _c1, i0.ɵɵpipeBind1(9, 34, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip)));
|
|
231
|
+
i0.ɵɵadvance(4);
|
|
232
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 36, "display_name"));
|
|
233
|
+
i0.ɵɵadvance(2);
|
|
234
|
+
i0.ɵɵproperty("formControlName", ctx.displayNameKey);
|
|
235
|
+
i0.ɵɵadvance(3);
|
|
236
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(18, 38, "type"));
|
|
237
|
+
i0.ɵɵadvance(3);
|
|
238
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(21, 40, ctx.types$));
|
|
239
|
+
i0.ɵɵadvance(2);
|
|
240
|
+
i0.ɵɵproperty("ngIf", ctx.form.get(i0.ɵɵpureFunction0(59, _c2)).value === "ExternalName");
|
|
241
|
+
i0.ɵɵadvance(1);
|
|
242
|
+
i0.ɵɵproperty("hidden", ctx.form.get(i0.ɵɵpureFunction0(60, _c2)).value !== "ExternalName");
|
|
243
|
+
i0.ɵɵadvance(2);
|
|
244
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 42, "service_external_name_mapping_domain"), " ");
|
|
245
|
+
i0.ɵɵadvance(2);
|
|
246
|
+
i0.ɵɵproperty("aclDisabled", ctx.form.get(i0.ɵɵpureFunction0(61, _c2)).value !== "ExternalName")("required", ctx.form.get(i0.ɵɵpureFunction0(62, _c2)).value === "ExternalName")("pattern", ctx.DOMAIN_PATTERN.pattern)("placeholder", i0.ɵɵpipeBind1(28, 44, "service_external_name_domain_placeholder"));
|
|
247
|
+
i0.ɵɵadvance(2);
|
|
248
|
+
i0.ɵɵproperty("errors", ctx.form.get(i0.ɵɵpureFunction0(63, _c3)).errors)("errorsMapper", i0.ɵɵpureFunction1(64, _c1, i0.ɵɵpipeBind1(30, 46, ctx.DOMAIN_PATTERN.tip)));
|
|
249
|
+
i0.ɵɵadvance(2);
|
|
250
|
+
i0.ɵɵproperty("hidden", ctx.form.get(i0.ɵɵpureFunction0(66, _c2)).value === "ExternalName");
|
|
251
|
+
i0.ɵɵadvance(3);
|
|
252
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(35, 48, "virtual_ip"));
|
|
253
|
+
i0.ɵɵadvance(4);
|
|
254
|
+
i0.ɵɵproperty("auiTooltip", i0.ɵɵpipeBind1(39, 50, "virtual_ip_hint"))("auiTooltipPosition", "top center");
|
|
255
|
+
i0.ɵɵadvance(5);
|
|
256
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(44, 52, "ports"));
|
|
257
|
+
i0.ɵɵadvance(2);
|
|
258
|
+
i0.ɵɵproperty("required", !!ctx.form.get("virtualIp").value)("aclDisabled", ctx.form.get(i0.ɵɵpureFunction0(67, _c2)).value === "ExternalName")("serviceType", ctx.form.get(i0.ɵɵpureFunction0(68, _c2)).value)("containerPortSuggestions", ctx.containerPortSuggestions)("targetComponent", ctx.targetComponent);
|
|
259
|
+
i0.ɵɵadvance(3);
|
|
260
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(49, 54, "session_affinity"));
|
|
261
|
+
} }, dependencies: [AsyncPipe,
|
|
262
|
+
FormModule, i2.FormDirective, i2.FormItemComponent, i2.FormItemAddonDirective, i2.FormItemErrorDirective, i2.FormItemHintDirective, i2.FormItemLabelDirective, i2.FormItemControlDirective, InputModule, i2.InputComponent, NgIf,
|
|
263
|
+
NgFor,
|
|
264
|
+
FormsModule, i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.PatternValidator, ReactiveFormsModule, i3.FormGroupDirective, i3.FormControlName, i3.FormGroupName, SwitchModule, i2.SwitchComponent, IconModule, i2.IconComponent, TranslateModule, i1.TranslatePipe, RadioModule, i2.RadioGroupComponent, i2.RadioButtonComponent, TooltipModule, i2.TooltipDirective, ErrorsMapperModule, i1.ErrorsMapperComponent, ServicePortsFieldsetComponent,
|
|
265
|
+
ReadonlyFieldDirective,
|
|
266
|
+
DisabledDirective], encapsulation: 2, changeDetection: 0 }); }
|
|
267
|
+
}
|
|
268
|
+
__decorate([
|
|
269
|
+
ObservableInput(),
|
|
270
|
+
__metadata("design:type", Observable)
|
|
271
|
+
], K8sServiceFormComponent.prototype, "cluster$", void 0);
|
|
272
|
+
__decorate([
|
|
273
|
+
ObservableInput(),
|
|
274
|
+
__metadata("design:type", Observable)
|
|
275
|
+
], K8sServiceFormComponent.prototype, "isUpdate$", void 0);
|
|
276
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sServiceFormComponent, [{
|
|
277
|
+
type: Component,
|
|
278
|
+
args: [{ standalone: true, selector: 'acl-k8s-service-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
279
|
+
AsyncPipe,
|
|
280
|
+
FormModule,
|
|
281
|
+
InputModule,
|
|
282
|
+
NgIf,
|
|
283
|
+
NgFor,
|
|
284
|
+
FormsModule,
|
|
285
|
+
ReactiveFormsModule,
|
|
286
|
+
SwitchModule,
|
|
287
|
+
IconModule,
|
|
288
|
+
TranslateModule,
|
|
289
|
+
RadioModule,
|
|
290
|
+
TooltipModule,
|
|
291
|
+
ErrorsMapperModule,
|
|
292
|
+
ServicePortsFieldsetComponent,
|
|
293
|
+
ReadonlyFieldDirective,
|
|
294
|
+
DisabledDirective,
|
|
295
|
+
], template: "<form\n auiForm\n [formGroup]=\"form\"\n>\n <ng-container formGroupName=\"metadata\">\n <aui-form-item width=\"large\">\n <label auiFormItemLabel>{{ 'name' | translate }}</label>\n <input\n [aclReadonlyField]=\"isUpdate\"\n aui-input\n auiFormItemControl\n required\n name=\"name\"\n formControlName=\"name\"\n [placeholder]=\"K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip | translate\"\n />\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"form.get(['metadata', 'name']).errors\"\n [errorsMapper]=\"{\n pattern: K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip | translate\n }\"\n ></acl-errors-mapper>\n </aui-form-item>\n\n <aui-form-item\n width=\"large\"\n formGroupName=\"annotations\"\n >\n <label auiFormItemLabel>{{ 'display_name' | translate }}</label>\n <input\n auiFormItemControl\n aui-input\n [formControlName]=\"displayNameKey\"\n />\n </aui-form-item>\n </ng-container>\n\n <aui-form-item formGroupName=\"spec\">\n <label auiFormItemLabel>{{ 'type' | translate }}</label>\n <aui-radio-group formControlName=\"type\">\n <aui-radio-button\n *ngFor=\"let option of types$ | async\"\n [value]=\"option\"\n >\n {{ option }}\n </aui-radio-button>\n </aui-radio-group>\n <div\n auiFormItemHint\n *ngIf=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n >\n {{ 'service_external_name_hint' | translate }}\n </div>\n </aui-form-item>\n\n <aui-form-item\n formGroupName=\"spec\"\n width=\"large\"\n class=\"last-form-item-no-margin\"\n [hidden]=\"form.get(['spec', 'type']).value !== 'ExternalName'\"\n >\n <label auiFormItemLabel>\n {{ 'service_external_name_mapping_domain' | translate }}\n </label>\n <input\n type=\"text\"\n aui-input\n auiFormItemControl\n [aclDisabled]=\"form.get(['spec', 'type']).value !== 'ExternalName'\"\n [required]=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n formControlName=\"externalName\"\n [pattern]=\"DOMAIN_PATTERN.pattern\"\n [placeholder]=\"'service_external_name_domain_placeholder' | translate\"\n />\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"form.get(['spec', 'externalName']).errors\"\n [errorsMapper]=\"{\n pattern: DOMAIN_PATTERN.tip | translate\n }\"\n >\n </acl-errors-mapper>\n </aui-form-item>\n\n <!-- ExternalName \u7C7B\u578B\u65F6\u9690\u85CF\u5176\u4ED6\u5C5E\u6027 -->\n <div [hidden]=\"form.get(['spec', 'type']).value === 'ExternalName'\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'virtual_ip' | translate }}</label>\n <aui-switch\n formControlName=\"virtualIp\"\n (valueChange)=\"onVirtualIpChange($event)\"\n ></aui-switch>\n <div auiFormItemAddon>\n <aui-icon\n [auiTooltip]=\"'virtual_ip_hint' | translate\"\n [auiTooltipPosition]=\"'top center'\"\n icon=\"question_circle\"\n class=\"icon--help\"\n ></aui-icon>\n </div>\n </aui-form-item>\n\n <!-- \u81EA\u5B9A\u4E49 Controls -->\n <ng-content></ng-content>\n\n <aui-form-item formGroupName=\"spec\">\n <label auiFormItemLabel>{{ 'ports' | translate }}</label>\n <acl-service-ports-fieldset\n class=\"tw-w-full\"\n auiFormItemControl\n [required]=\"!!form.get('virtualIp').value\"\n [aclDisabled]=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n name=\"ports\"\n formControlName=\"ports\"\n [serviceType]=\"form.get(['spec', 'type']).value\"\n [containerPortSuggestions]=\"containerPortSuggestions\"\n [targetComponent]=\"targetComponent\"\n ></acl-service-ports-fieldset>\n </aui-form-item>\n\n <aui-form-item class=\"last-form-item-no-margin\">\n <label auiFormItemLabel>{{ 'session_affinity' | translate }}</label>\n <aui-switch formControlName=\"sessionPersistence\"></aui-switch>\n </aui-form-item>\n </div>\n</form>\n" }]
|
|
296
|
+
}], function () { return [{ type: i0.Injector }, { type: i1.K8sUtilService }, { type: i1.FeatureGateService }]; }, { cluster: [{
|
|
297
|
+
type: Input,
|
|
298
|
+
args: [{ required: true }]
|
|
299
|
+
}], cluster$: [], isUpdate: [{
|
|
300
|
+
type: Input
|
|
301
|
+
}], isUpdate$: [], containerPortSuggestions: [{
|
|
302
|
+
type: Input,
|
|
303
|
+
args: [{ required: true }]
|
|
304
|
+
}], targetComponent: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}] }); })();
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZvcm0vY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZvcm0vdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFFTCxZQUFZLEVBQ1osYUFBYSxFQUNiLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZUFBZSxFQUNmLFVBQVUsRUFFVixlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUNBQXVDLEVBQ3ZDLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxhQUFhLEVBQ2IsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNCQUFz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Q25CLFlBQVk7b0JBQ1osVUFBVTtvQkFDVixlQUFlO29CQUNmLFdBQVc7b0JBQ1gsYUFBYTtvQkFDYixrQkFBa0I7b0JBQ2xCLDZCQUE2QjtvQkFDN0Isc0JBQXNCO29CQUN0QixpQkFBaUI7aUJBQ2xCO3lIQU9ELE9BQU87a0JBRE4sS0FBSzttQkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFJekIsUUFBUSxNQUdSLFFBQVE7a0JBRFAsS0FBSztZQUlOLFNBQVMsTUFHVCx3QkFBd0I7a0JBRHZCLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLGVBQWU7a0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZvcm1Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxuICBSYWRpb01vZHVsZSxcbiAgU3dpdGNoTW9kdWxlLFxuICBUb29sdGlwTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIENvbnRhaW5lclBvcnQsXG4gIERJU1BMQVlfTkFNRSxcbiAgU0VSVklDRV9UWVBFUyxcbiAgRmVhdHVyZUdhdGVTZXJ2aWNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBwdWJsaXNoUmVmLFxuICBTZXJ2aWNlLFxuICBUcmFuc2xhdGVNb2R1bGUsXG4gIFJlYWRvbmx5RmllbGREaXJlY3RpdmUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgRGlzYWJsZWREaXJlY3RpdmUsXG4gIEs4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWSxcbiAgRE9NQUlOX1BBVFRFUk4sXG4gIFNlcnZpY2VUeXBlTWV0YSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYXNlUmVzb3VyY2VGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICduZy1yZXNvdXJjZS1mb3JtLXV0aWwnO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2VydmljZVBvcnRzRmllbGRzZXRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkc2V0L2NvbXBvbmVudCc7XG5cbmNvbnN0IE5PTl9MQl9TRVJWSUNFX1RZUEVTID0gU0VSVklDRV9UWVBFUy5maWx0ZXIob3AgPT4gb3AgIT09ICdMb2FkQmFsYW5jZXInKTtcbmludGVyZmFjZSBTZXJ2aWNlRm9ybU1vZGVsIGV4dGVuZHMgU2VydmljZSB7XG4gIHZpcnR1YWxJcD86IGJvb2xlYW47IC8vIOiZmuaLnyBpcO+8jOS4uiBmYWxzZSDml7bpnIDopoHorr7nva4gc3BlYy5jbHVzdGVySXA6IE5vbmVcbiAgc2Vzc2lvblBlcnNpc3RlbmNlPzogYm9vbGVhbjsgLy8g5Lya6K+d5L+d5oyB77yM5a+55bqUIHNwZWMuc2Vzc2lvbkFmZmluaXR5OiBDbGllbnRJUC9Ob25lXG59XG5cbi8vIEs4cyBiYXNlIHNlcnZpY2UgZm9ybVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWs4cy1zZXJ2aWNlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIEZvcm1Nb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFN3aXRjaE1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBSYWRpb01vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBTZXJ2aWNlUG9ydHNGaWVsZHNldENvbXBvbmVudCxcbiAgICBSZWFkb25seUZpZWxkRGlyZWN0aXZlLFxuICAgIERpc2FibGVkRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBLOHNTZXJ2aWNlRm9ybUNvbXBvbmVudFxuICBleHRlbmRzIEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudDxTZXJ2aWNlLCBTZXJ2aWNlRm9ybU1vZGVsPlxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXRcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3Rlcjogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBjbHVzdGVyJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoKVxuICBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBpc1VwZGF0ZSQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGNvbnRhaW5lclBvcnRTdWdnZXN0aW9uczogQ29udGFpbmVyUG9ydFtdO1xuXG4gIEBJbnB1dCgpXG4gIHRhcmdldENvbXBvbmVudDogJ3dvcmtsb2FkJyB8ICd2bScgfCAnbGFiZWwtc2VsZWN0b3JzJyA9ICd3b3JrbG9hZCc7XG5cbiAgSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZID1cbiAgICBLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFk7XG5cbiAgRE9NQUlOX1BBVFRFUk4gPSBET01BSU5fUEFUVEVSTjtcbiAgZGlzcGxheU5hbWVLZXkgPSB0aGlzLms4c1V0aWwubm9ybWFsaXplVHlwZShESVNQTEFZX05BTUUpO1xuXG4gIGlzTGJFbmFibGVkJCA9IHRoaXMuY2x1c3RlciQucGlwZShcbiAgICBzd2l0Y2hNYXAoY2x1c3RlciA9PlxuICAgICAgdGhpcy5mZWF0dXJlR2F0ZS5pc0VuYWJsZWQoJ2xvYWRiYWxhbmNlci1zZXJ2aWNlJywgY2x1c3RlciksXG4gICAgKSxcbiAgICBzdGFydFdpdGgobnVsbCksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHR5cGVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaXNVcGRhdGUkLFxuICAgIHRoaXMuaXNMYkVuYWJsZWQkLFxuICAgIHRoaXMucmVzb3VyY2UkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lzVXBkYXRlLCBpc0xiRW5hYmxlZCwgcmVzb3VyY2VdKSA9PiB7XG4gICAgICByZXR1cm4gaXNMYkVuYWJsZWQgfHxcbiAgICAgICAgKGlzVXBkYXRlICYmIHJlc291cmNlPy5zcGVjPy50eXBlID09PSAnTG9hZEJhbGFuY2VyJylcbiAgICAgICAgPyBTRVJWSUNFX1RZUEVTXG4gICAgICAgIDogTk9OX0xCX1NFUlZJQ0VfVFlQRVM7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgY29uc3QgdHlwZUN0cmwgPSB0aGlzLmZvcm0uZ2V0KCdzcGVjLnR5cGUnKTtcbiAgICB0eXBlQ3RybC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgc3RhcnRXaXRoKHR5cGVDdHJsLnZhbHVlKSlcbiAgICAgIC5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAgIGNvbnN0IHZpcnR1YWxJcEN0cmwgPSB0aGlzLmZvcm0uZ2V0KCd2aXJ0dWFsSXAnKTtcblxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgICAgIHZpcnR1YWxJcEN0cmwuZGlzYWJsZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbJ05vZGVQb3J0JywgJ0xvYWRCYWxhbmNlciddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgdmlydHVhbElwQ3RybC5zZXRWYWx1ZSh0cnVlKTtcbiAgICAgICAgICB2aXJ0dWFsSXBDdHJsLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aXJ0dWFsSXBDdHJsLmVuYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdFeHRlcm5hbE5hbWUnKSB7XG4gICAgICAgICAgdGhpcy5vblZpcnR1YWxJcENoYW5nZSh2aXJ0dWFsSXBDdHJsLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBnZXREZWZhdWx0Rm9ybU1vZGVsKCk6IFNlcnZpY2VGb3JtTW9kZWwge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnU2VydmljZScsXG4gICAgICB2aXJ0dWFsSXA6IHRydWUsXG4gICAgICBzZXNzaW9uUGVyc2lzdGVuY2U6IGZhbHNlLFxuICAgICAgc3BlYzoge1xuICAgICAgICB0eXBlOiAnQ2x1c3RlcklQJyxcbiAgICAgICAgcG9ydHM6IFtdLFxuICAgICAgICBleHRlcm5hbE5hbWU6ICcnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2aXJ0dWFsSXA6IHRoaXMuZmIuY29udHJvbCh0cnVlKSxcbiAgICAgIHNlc3Npb25QZXJzaXN0ZW5jZTogZmFsc2UsXG4gICAgICBtZXRhZGF0YTogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IHRoaXMuZmIuY29udHJvbCgnJywgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzIpLFxuICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFkucGF0dGVybiksXG4gICAgICAgIF0pLFxuICAgICAgICBsYWJlbHM6IHRoaXMuZmIuY29udHJvbCh7fSksXG4gICAgICAgIGFubm90YXRpb25zOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICBbdGhpcy5kaXNwbGF5TmFtZUtleV06ICcnLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgc3BlYzogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIHR5cGU6ICdDbHVzdGVySVAnLFxuICAgICAgICBwb3J0czogbnVsbCxcbiAgICAgICAgZXh0ZXJuYWxOYW1lOiAnJyxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRGb3JtTW9kZWwoe1xuICAgIHZpcnR1YWxJcCxcbiAgICBzZXNzaW9uUGVyc2lzdGVuY2UsXG4gICAgLi4ucmVzb3VyY2VcbiAgfTogU2VydmljZUZvcm1Nb2RlbCk6IFNlcnZpY2Uge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB7IC4uLlNlcnZpY2VUeXBlTWV0YSwgLi4ucmVzb3VyY2UgfTtcbiAgICAvLyBgRXh0ZXJuYWxOYW1lYCB0eXBlIGp1c3QgbmVlZCBleHRlcm5hbE5hbWVcbiAgICBpZiAocmVzb3VyY2Uuc3BlYy50eXBlID09PSAnRXh0ZXJuYWxOYW1lJykge1xuICAgICAgc2VydmljZS5zcGVjID0ge1xuICAgICAgICB0eXBlOiAnRXh0ZXJuYWxOYW1lJyxcbiAgICAgICAgZXh0ZXJuYWxOYW1lOiByZXNvdXJjZS5zcGVjLmV4dGVybmFsTmFtZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9XG4gICAgLy8gSXQgbXVzdCBiZSBub24gSGVhZGxlc3MgaWYgYHZpcnR1YWxJcGAgaXMgZW5hYmxlZFxuICAgIGlmICh2aXJ0dWFsSXApIHtcbiAgICAgIGlmIChzZXJ2aWNlLnNwZWMuY2x1c3RlcklQID09PSAnTm9uZScpIHtcbiAgICAgICAgZGVsZXRlIHNlcnZpY2Uuc3BlYy5jbHVzdGVySVA7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHZpcnR1YWxJcCDooqvnpoHnlKjlkI7kuLogdW5kZWZpbmVk77yMIOatpOaXtuS4jeWBmuWkhOeQhlxuICAgIGVsc2UgaWYgKHZpcnR1YWxJcCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEhlYWRsZXNzXG4gICAgICBzZXJ2aWNlLnNwZWMuY2x1c3RlcklQID0gJ05vbmUnO1xuICAgIH1cblxuICAgIHNlcnZpY2Uuc3BlYy5zZXNzaW9uQWZmaW5pdHkgPSBzZXNzaW9uUGVyc2lzdGVuY2UgPyAnQ2xpZW50SVAnIDogJ05vbmUnO1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRSZXNvdXJjZU1vZGVsKHJlc291cmNlOiBTZXJ2aWNlKTogU2VydmljZUZvcm1Nb2RlbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc291cmNlLFxuICAgICAgdmlydHVhbElwOiByZXNvdXJjZT8uc3BlYz8uY2x1c3RlcklQICE9PSAnTm9uZScsXG4gICAgICBzZXNzaW9uUGVyc2lzdGVuY2U6IHJlc291cmNlPy5zcGVjPy5zZXNzaW9uQWZmaW5pdHkgPT09ICdDbGllbnRJUCcsXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlydHVhbElwQ2hhbmdlKHZpcnR1YWxJcDogYm9vbGVhbikge1xuICAgIGlmICghdmlydHVhbElwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydHNDdHJsID0gdGhpcy5mb3JtLmdldCgnc3BlYy5wb3J0cycpO1xuXG4gICAgaWYgKCFwb3J0c0N0cmwudmFsdWU/Lmxlbmd0aCkge1xuICAgICAgcG9ydHNDdHJsLnBhdGNoVmFsdWUoW3t9XSk7XG4gICAgfVxuICB9XG59XG4iLCI8Zm9ybVxuICBhdWlGb3JtXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4+XG4gIDxuZy1jb250YWluZXIgZm9ybUdyb3VwTmFtZT1cIm1ldGFkYXRhXCI+XG4gICAgPGF1aS1mb3JtLWl0ZW0gd2lkdGg9XCJsYXJnZVwiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBbYWNsUmVhZG9ubHlGaWVsZF09XCJpc1VwZGF0ZVwiXG4gICAgICAgIGF1aS1pbnB1dFxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgbmFtZT1cIm5hbWVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIks4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWS50aXAgfCB0cmFuc2xhdGVcIlxuICAgICAgLz5cbiAgICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgICAgIFtlcnJvcnNdPVwiZm9ybS5nZXQoWydtZXRhZGF0YScsICduYW1lJ10pLmVycm9yc1wiXG4gICAgICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgICAgIHBhdHRlcm46IEs4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWS50aXAgfCB0cmFuc2xhdGVcbiAgICAgICAgfVwiXG4gICAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8YXVpLWZvcm0taXRlbVxuICAgICAgd2lkdGg9XCJsYXJnZVwiXG4gICAgICBmb3JtR3JvdXBOYW1lPVwiYW5ub3RhdGlvbnNcIlxuICAgID5cbiAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdkaXNwbGF5X25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgYXVpLWlucHV0XG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGlzcGxheU5hbWVLZXlcIlxuICAgICAgLz5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxhdWktZm9ybS1pdGVtIGZvcm1Hcm91cE5hbWU9XCJzcGVjXCI+XG4gICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3R5cGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cbiAgICAgIDxhdWktcmFkaW8tYnV0dG9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgdHlwZXMkIHwgYXN5bmNcIlxuICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCJcbiAgICAgID5cbiAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICA8L2F1aS1yYWRpby1idXR0b24+XG4gICAgPC9hdWktcmFkaW8tZ3JvdXA+XG4gICAgPGRpdlxuICAgICAgYXVpRm9ybUl0ZW1IaW50XG4gICAgICAqbmdJZj1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgPlxuICAgICAge3sgJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9oaW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgPGF1aS1mb3JtLWl0ZW1cbiAgICBmb3JtR3JvdXBOYW1lPVwic3BlY1wiXG4gICAgd2lkdGg9XCJsYXJnZVwiXG4gICAgY2xhc3M9XCJsYXN0LWZvcm0taXRlbS1uby1tYXJnaW5cIlxuICAgIFtoaWRkZW5dPVwiZm9ybS5nZXQoWydzcGVjJywgJ3R5cGUnXSkudmFsdWUgIT09ICdFeHRlcm5hbE5hbWUnXCJcbiAgPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPlxuICAgICAge3sgJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9tYXBwaW5nX2RvbWFpbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgYXVpLWlucHV0XG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIFthY2xEaXNhYmxlZF09XCJmb3JtLmdldChbJ3NwZWMnLCAndHlwZSddKS52YWx1ZSAhPT0gJ0V4dGVybmFsTmFtZSdcIlxuICAgICAgW3JlcXVpcmVkXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHRlcm5hbE5hbWVcIlxuICAgICAgW3BhdHRlcm5dPVwiRE9NQUlOX1BBVFRFUk4ucGF0dGVyblwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9kb21haW5fcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAvPlxuICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgYXVpRm9ybUl0ZW1FcnJvclxuICAgICAgW2Vycm9yc109XCJmb3JtLmdldChbJ3NwZWMnLCAnZXh0ZXJuYWxOYW1lJ10pLmVycm9yc1wiXG4gICAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgcGF0dGVybjogRE9NQUlOX1BBVFRFUk4udGlwIHwgdHJhbnNsYXRlXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgPC9hdWktZm9ybS1pdGVtPlxuXG4gIDwhLS0gRXh0ZXJuYWxOYW1lIOexu+Wei+aXtumakOiXj+WFtuS7luWxnuaApyAtLT5cbiAgPGRpdiBbaGlkZGVuXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiPlxuICAgIDxhdWktZm9ybS1pdGVtPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3ZpcnR1YWxfaXAnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxhdWktc3dpdGNoXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZpcnR1YWxJcFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZpcnR1YWxJcENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L2F1aS1zd2l0Y2g+XG4gICAgICA8ZGl2IGF1aUZvcm1JdGVtQWRkb24+XG4gICAgICAgIDxhdWktaWNvblxuICAgICAgICAgIFthdWlUb29sdGlwXT1cIid2aXJ0dWFsX2lwX2hpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXVpVG9vbHRpcFBvc2l0aW9uXT1cIid0b3AgY2VudGVyJ1wiXG4gICAgICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICAgICAgY2xhc3M9XCJpY29uLS1oZWxwXCJcbiAgICAgICAgPjwvYXVpLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8IS0tIOiHquWumuS5iSBDb250cm9scyAtLT5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICA8YXVpLWZvcm0taXRlbSBmb3JtR3JvdXBOYW1lPVwic3BlY1wiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3BvcnRzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICA8YWNsLXNlcnZpY2UtcG9ydHMtZmllbGRzZXRcbiAgICAgICAgY2xhc3M9XCJ0dy13LWZ1bGxcIlxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgW3JlcXVpcmVkXT1cIiEhZm9ybS5nZXQoJ3ZpcnR1YWxJcCcpLnZhbHVlXCJcbiAgICAgICAgW2FjbERpc2FibGVkXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgICAgIG5hbWU9XCJwb3J0c1wiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBvcnRzXCJcbiAgICAgICAgW3NlcnZpY2VUeXBlXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlXCJcbiAgICAgICAgW2NvbnRhaW5lclBvcnRTdWdnZXN0aW9uc109XCJjb250YWluZXJQb3J0U3VnZ2VzdGlvbnNcIlxuICAgICAgICBbdGFyZ2V0Q29tcG9uZW50XT1cInRhcmdldENvbXBvbmVudFwiXG4gICAgICA+PC9hY2wtc2VydmljZS1wb3J0cy1maWVsZHNldD5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8YXVpLWZvcm0taXRlbSBjbGFzcz1cImxhc3QtZm9ybS1pdGVtLW5vLW1hcmdpblwiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3Nlc3Npb25fYWZmaW5pdHknIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxhdWktc3dpdGNoIGZvcm1Db250cm9sTmFtZT1cInNlc3Npb25QZXJzaXN0ZW5jZVwiPjwvYXVpLXN3aXRjaD5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
|