@spinnaker/ecs 0.0.0-main-2
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/CHANGELOG.md +1186 -0
- package/LICENSE.txt +203 -0
- package/dist/common/common.module.d.ts +1 -0
- package/dist/common/footer.component.d.ts +1 -0
- package/dist/domain/IEcsLoadBalancer.d.ts +119 -0
- package/dist/ecs.help.d.ts +1 -0
- package/dist/ecs.module.d.ts +4 -0
- package/dist/ecs.settings.d.ts +9 -0
- package/dist/ecsCluster/IEcsCapacityProviderDetails.d.ts +10 -0
- package/dist/ecsCluster/IEcsCluster.d.ts +5 -0
- package/dist/ecsCluster/ecsCluster.read.service.d.ts +7 -0
- package/dist/iamRoles/IRole.d.ts +6 -0
- package/dist/iamRoles/iamRole.read.service.d.ts +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6010 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/details/instance.details.controller.d.ts +2 -0
- package/dist/loadBalancer/EcsLoadBalancerClusterContainer.d.ts +6 -0
- package/dist/loadBalancer/TargetGroup.d.ts +11 -0
- package/dist/loadBalancer/details/loadBalancerDetails.d.ts +27 -0
- package/dist/loadBalancer/details/targetGroupDetails.d.ts +30 -0
- package/dist/loadBalancer/listener.d.ts +10 -0
- package/dist/loadBalancer/loadBalancer.transformer.d.ts +8 -0
- package/dist/loadBalancer/targetGroup.states.d.ts +1 -0
- package/dist/metricAlarm/MetricAlarm.d.ts +6 -0
- package/dist/metricAlarm/metricAlarm.read.service.d.ts +5 -0
- package/dist/pipeline/stages/destroyAsg/ecsDestroyAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/disableAsg/ecsDisableAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/disableCluster/ecsDisableClusterStage.d.ts +2 -0
- package/dist/pipeline/stages/enableAsg/ecsEnableAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.d.ts +2 -0
- package/dist/pipeline/stages/resizeAsg/ecsResizeAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.d.ts +2 -0
- package/dist/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.d.ts +2 -0
- package/dist/placementStrategy/IPlacementStrategy.d.ts +4 -0
- package/dist/placementStrategy/placementStrategy.service.d.ts +11 -0
- package/dist/secrets/ISecret.d.ts +5 -0
- package/dist/secrets/secret.read.service.d.ts +5 -0
- package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +2 -0
- package/dist/securityGroup/securityGroup.module.d.ts +1 -0
- package/dist/securityGroup/securityGroup.reader.d.ts +5 -0
- package/dist/securityGroup/securityGroup.transformer.d.ts +2 -0
- package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +2 -0
- package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +165 -0
- package/dist/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/capacityProvider/CapacityProvider.d.ts +7 -0
- package/dist/serverGroup/configure/wizard/container/Container.d.ts +32 -0
- package/dist/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/logging/logging.component.d.ts +1 -0
- package/dist/serverGroup/configure/wizard/networking/Networking.d.ts +28 -0
- package/dist/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.d.ts +34 -0
- package/dist/serverGroup/configure/wizard/taskDefinition/TaskDefinition.d.ts +39 -0
- package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +1 -0
- package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +2 -0
- package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +2 -0
- package/dist/serverGroup/details/serverGroupDetails.ecs.controller.d.ts +2 -0
- package/dist/serverGroup/details/serverGroupDetails.module.d.ts +1 -0
- package/dist/serverGroup/events/EventsLink.d.ts +4 -0
- package/dist/serverGroup/events/events.component.d.ts +3 -0
- package/dist/serverGroup/events/events.controller.d.ts +19 -0
- package/dist/serverGroup/events/serverGroupEventsReader.service.d.ts +10 -0
- package/dist/serverGroup/serverGroup.module.d.ts +1 -0
- package/dist/serverGroup/serverGroup.transformer.d.ts +11 -0
- package/dist/serviceDiscovery/IServiceDiscovery.d.ts +12 -0
- package/dist/serviceDiscovery/serviceDiscovery.read.service.d.ts +4 -0
- package/package.json +47 -0
- package/src/common/common.module.ts +6 -0
- package/src/common/footer.component.ts +29 -0
- package/src/domain/IEcsLoadBalancer.ts +129 -0
- package/src/ecs.help.ts +91 -0
- package/src/ecs.module.ts +116 -0
- package/src/ecs.settings.ts +17 -0
- package/src/ecsCluster/IEcsCapacityProviderDetails.ts +11 -0
- package/src/ecsCluster/IEcsCluster.ts +5 -0
- package/src/ecsCluster/ecsCluster.read.service.ts +23 -0
- package/src/iamRoles/IRole.ts +6 -0
- package/src/iamRoles/iamRole.read.service.ts +14 -0
- package/src/index.ts +1 -0
- package/src/instance/details/instance.details.controller.js +356 -0
- package/src/instance/details/instanceDetails.html +204 -0
- package/src/loadBalancer/EcsLoadBalancerClusterContainer.tsx +48 -0
- package/src/loadBalancer/TargetGroup.tsx +74 -0
- package/src/loadBalancer/details/loadBalancerDetails.tsx +235 -0
- package/src/loadBalancer/details/targetGroupDetails.tsx +251 -0
- package/src/loadBalancer/listener.tsx +65 -0
- package/src/loadBalancer/loadBalancer.transformer.ts +21 -0
- package/src/loadBalancer/targetGroup.states.ts +59 -0
- package/src/logo/ecs.icon.svg +27 -0
- package/src/logo/ecs.logo.less +5 -0
- package/src/logo/ecs.logo.svg +27 -0
- package/src/metricAlarm/MetricAlarm.ts +6 -0
- package/src/metricAlarm/metricAlarm.read.service.ts +14 -0
- package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStage.html +101 -0
- package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStepLabel.html +1 -0
- package/src/pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage.js +94 -0
- package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +9 -0
- package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
- package/src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js +65 -0
- package/src/pipeline/stages/disableAsg/disableAsgStage.html +11 -0
- package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
- package/src/pipeline/stages/disableAsg/ecsDisableAsgStage.js +70 -0
- package/src/pipeline/stages/disableCluster/disableClusterStage.html +26 -0
- package/src/pipeline/stages/disableCluster/ecsDisableClusterStage.js +84 -0
- package/src/pipeline/stages/enableAsg/ecsEnableAsgStage.js +73 -0
- package/src/pipeline/stages/enableAsg/enableAsgStage.html +11 -0
- package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +1 -0
- package/src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js +26 -0
- package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +36 -0
- package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +9 -0
- package/src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js +128 -0
- package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +87 -0
- package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +1 -0
- package/src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js +78 -0
- package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +35 -0
- package/src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js +73 -0
- package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +34 -0
- package/src/placementStrategy/IPlacementStrategy.ts +4 -0
- package/src/placementStrategy/placementStrategy.service.ts +63 -0
- package/src/secrets/ISecret.ts +5 -0
- package/src/secrets/secret.read.service.ts +14 -0
- package/src/securityGroup/details/securityGroupDetail.controller.js +147 -0
- package/src/securityGroup/details/securityGroupDetail.html +104 -0
- package/src/securityGroup/securityGroup.module.ts +12 -0
- package/src/securityGroup/securityGroup.reader.ts +16 -0
- package/src/securityGroup/securityGroup.transformer.js +13 -0
- package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +281 -0
- package/src/serverGroup/configure/serverGroupConfiguration.service.ts +747 -0
- package/src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js +259 -0
- package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.html +194 -0
- package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js +17 -0
- package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +10 -0
- package/src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx +381 -0
- package/src/serverGroup/configure/wizard/capacityProvider/capacityProvider.html +11 -0
- package/src/serverGroup/configure/wizard/container/Container.tsx +347 -0
- package/src/serverGroup/configure/wizard/container/container.html +9 -0
- package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.html +118 -0
- package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js +20 -0
- package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.html +13 -0
- package/src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js +41 -0
- package/src/serverGroup/configure/wizard/location/basicSettings.html +137 -0
- package/src/serverGroup/configure/wizard/logging/logging.component.html +29 -0
- package/src/serverGroup/configure/wizard/logging/logging.component.ts +12 -0
- package/src/serverGroup/configure/wizard/logging/logging.html +7 -0
- package/src/serverGroup/configure/wizard/networking/Networking.tsx +261 -0
- package/src/serverGroup/configure/wizard/networking/networking.html +9 -0
- package/src/serverGroup/configure/wizard/serverGroupWizard.html +55 -0
- package/src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx +250 -0
- package/src/serverGroup/configure/wizard/serviceDiscovery/serviceDiscovery.html +11 -0
- package/src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx +460 -0
- package/src/serverGroup/configure/wizard/taskDefinition/taskDefinition.html +51 -0
- package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +9 -0
- package/src/serverGroup/configure/wizard/verticalScaling/verticalScaling.html +10 -0
- package/src/serverGroup/details/resize/resizeCapacity.component.html +94 -0
- package/src/serverGroup/details/resize/resizeCapacity.component.ts +14 -0
- package/src/serverGroup/details/resize/resizeServerGroup.controller.js +85 -0
- package/src/serverGroup/details/resize/resizeServerGroup.html +28 -0
- package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +97 -0
- package/src/serverGroup/details/rollback/rollbackServerGroup.html +67 -0
- package/src/serverGroup/details/serverGroupDetails.ecs.controller.js +366 -0
- package/src/serverGroup/details/serverGroupDetails.html +216 -0
- package/src/serverGroup/details/serverGroupDetails.module.ts +5 -0
- package/src/serverGroup/events/EventsLink.tsx +5 -0
- package/src/serverGroup/events/events.component.ts +35 -0
- package/src/serverGroup/events/events.controller.ts +45 -0
- package/src/serverGroup/events/events.html +36 -0
- package/src/serverGroup/events/serverGroupEventsReader.service.ts +27 -0
- package/src/serverGroup/serverGroup.module.ts +6 -0
- package/src/serverGroup/serverGroup.transformer.spec.ts +184 -0
- package/src/serverGroup/serverGroup.transformer.ts +117 -0
- package/src/serviceDiscovery/IServiceDiscovery.ts +13 -0
- package/src/serviceDiscovery/serviceDiscovery.read.service.ts +8 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<div class="container-fluid form-horizontal" ng-controller="ecsServerGroupBasicSettingsCtrl as basicSettingsCtrl">
|
|
2
|
+
<ng-form name="basicSettings">
|
|
3
|
+
<div class="form-group row" ng-if="command.regionIsDeprecated(command)">
|
|
4
|
+
<div class="col-md-12 error-message">
|
|
5
|
+
<div class="alert alert-danger">
|
|
6
|
+
You are deploying into a deprecated region within the {{ command.credentials }} account!
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="form-group">
|
|
11
|
+
<div class="col-md-3 sm-label-right">Account</div>
|
|
12
|
+
<div class="col-md-7">
|
|
13
|
+
<account-select-field
|
|
14
|
+
read-only="command.viewState.readOnlyFields.credentials"
|
|
15
|
+
component="command"
|
|
16
|
+
field="credentials"
|
|
17
|
+
accounts="command.backingData.accounts"
|
|
18
|
+
provider="'ecs'"
|
|
19
|
+
></account-select-field>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<region-select-field
|
|
23
|
+
read-only="command.viewState.readOnlyFields.region"
|
|
24
|
+
label-columns="3"
|
|
25
|
+
component="command"
|
|
26
|
+
field="region"
|
|
27
|
+
account="command.credentials"
|
|
28
|
+
provider="'ecs'"
|
|
29
|
+
regions="command.backingData.filtered.regions"
|
|
30
|
+
></region-select-field>
|
|
31
|
+
<div class="form-group">
|
|
32
|
+
<div class="col-md-3 sm-label-right">
|
|
33
|
+
ECS Cluster name <help-field key="ecs.serverGroup.clusterName"></help-field>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="col-md-7">
|
|
36
|
+
<div class="form-control-static" ng-if="!command.backingData.filtered.ecsClusters.length">
|
|
37
|
+
No ECS clusters found in the selected account/region
|
|
38
|
+
</div>
|
|
39
|
+
<ui-select
|
|
40
|
+
data-test-id="ServerGroup.clusterName"
|
|
41
|
+
ng-model="command.ecsClusterName"
|
|
42
|
+
ng-if="command.backingData.filtered.ecsClusters.length"
|
|
43
|
+
class="form-control input-sm"
|
|
44
|
+
required
|
|
45
|
+
on-select="fieldChanged()"
|
|
46
|
+
>
|
|
47
|
+
<ui-select-match>{{$select.selected}}</ui-select-match>
|
|
48
|
+
<ui-select-choices
|
|
49
|
+
repeat="ecsClusterName in command.backingData.filtered.ecsClusters | filter: $select.search"
|
|
50
|
+
>
|
|
51
|
+
<span ng-bind-html="ecsClusterName"></span>
|
|
52
|
+
</ui-select-choices>
|
|
53
|
+
</ui-select>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="form-group">
|
|
57
|
+
<div class="col-md-3 sm-label-right">
|
|
58
|
+
Stack
|
|
59
|
+
<help-field key="ecs.serverGroup.stack"></help-field>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="col-md-7">
|
|
62
|
+
<input
|
|
63
|
+
data-test-id="ServerGroup.stack"
|
|
64
|
+
type="text"
|
|
65
|
+
class="form-control input-sm no-spel"
|
|
66
|
+
ng-pattern="basicSettingsCtrl.stackPattern"
|
|
67
|
+
name="stack"
|
|
68
|
+
ng-model="command.stack"
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="form-group row slide-in" ng-if="basicSettings.stack.$error.pattern">
|
|
73
|
+
<div class="col-sm-9 col-sm-offset-2 error-message">
|
|
74
|
+
<span>Only dot(.) and underscore(_) special characters are allowed in the Stack field.</span>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="form-group">
|
|
78
|
+
<div class="col-md-3 sm-label-right">
|
|
79
|
+
Detail
|
|
80
|
+
<help-field key="ecs.serverGroup.detail"></help-field>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="col-md-7">
|
|
83
|
+
<input
|
|
84
|
+
data-test-id="ServerGroup.details"
|
|
85
|
+
type="text"
|
|
86
|
+
class="form-control input-sm no-spel"
|
|
87
|
+
ng-pattern="basicSettingsCtrl.detailPattern"
|
|
88
|
+
name="details"
|
|
89
|
+
ng-model="command.freeFormDetails"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="form-group row slide-in" ng-if="basicSettings.details.$error.pattern">
|
|
94
|
+
<div class="col-sm-9 col-sm-offset-2 error-message">
|
|
95
|
+
<span>Only dot(.), underscore(_), and dash(-) special characters are allowed in the Detail field.</span>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
<deployment-strategy-selector
|
|
99
|
+
ng-if="!command.viewState.disableStrategySelection && command.selectedProvider"
|
|
100
|
+
command="command"
|
|
101
|
+
></deployment-strategy-selector>
|
|
102
|
+
<div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">
|
|
103
|
+
<div class="col-md-12">
|
|
104
|
+
<div class="well-compact" ng-class="basicSettingsCtrl.showPreviewAsWarning() ? 'alert alert-warning' : 'well'">
|
|
105
|
+
<h5 class="text-center">
|
|
106
|
+
<p>Your server group will be in the cluster:</p>
|
|
107
|
+
<p>
|
|
108
|
+
<strong>
|
|
109
|
+
{{basicSettingsCtrl.getNamePreview()}}
|
|
110
|
+
<span ng-if="basicSettingsCtrl.createsNewCluster()"> (new cluster)</span>
|
|
111
|
+
</strong>
|
|
112
|
+
</p>
|
|
113
|
+
<div
|
|
114
|
+
class="text-left"
|
|
115
|
+
ng-if="!basicSettingsCtrl.createsNewCluster() && command.viewState.mode === 'create' && latestServerGroup"
|
|
116
|
+
>
|
|
117
|
+
<p>There is already a server group in this cluster. Do you want to clone it?</p>
|
|
118
|
+
<p>
|
|
119
|
+
Cloning copies the entire configuration from the selected server group, allowing you to modify whichever
|
|
120
|
+
fields (e.g. image) you need to change in the new server group.
|
|
121
|
+
</p>
|
|
122
|
+
<p>
|
|
123
|
+
To clone a server group, select "Clone" from the "Server Group Actions" menu in the details view of the
|
|
124
|
+
server group.
|
|
125
|
+
</p>
|
|
126
|
+
<p>
|
|
127
|
+
<a href ng-click="basicSettingsCtrl.navigateToLatestServerGroup()">
|
|
128
|
+
Go to details for {{latestServerGroup.name}}
|
|
129
|
+
</a>
|
|
130
|
+
</p>
|
|
131
|
+
</div>
|
|
132
|
+
</h5>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</ng-form>
|
|
137
|
+
</div>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<div class="container-fluid form-horizontal">
|
|
2
|
+
<div class="form-group">
|
|
3
|
+
<div class="col-md-5 sm-label-right">
|
|
4
|
+
<b>Log driver (Optional)</b> <help-field key="ecs.logDriver"></help-field>
|
|
5
|
+
</div>
|
|
6
|
+
<div class="col-md-7">
|
|
7
|
+
<ui-select ng-model="$ctrl.command.logDriver" class="form-control input-sm" data-test-id="Logging.logDriver">
|
|
8
|
+
<ui-select-match>{{ $select.selected }}</ui-select-match>
|
|
9
|
+
<ui-select-choices
|
|
10
|
+
repeat="item in ['None', 'awslogs', 'fluentd', 'gelf', 'journald', 'json-file', 'logentries', 'splunk', 'sumologic', 'syslog'] | filter: $select.search"
|
|
11
|
+
>
|
|
12
|
+
<span ng-bind-html="item"></span>
|
|
13
|
+
</ui-select-choices>
|
|
14
|
+
</ui-select>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="form-group" ng-if="$ctrl.command.logDriver && $ctrl.command.logDriver !== 'None'">
|
|
19
|
+
<div class="sm-label-left">
|
|
20
|
+
<b>Logging options (optional)</b>
|
|
21
|
+
<help-field key="ecs.logOptions"></help-field>
|
|
22
|
+
</div>
|
|
23
|
+
<map-editor model="$ctrl.command.logOptions" allow-empty="true"></map-editor>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div class="form-group" ng-if="!$ctrl.command.logDriver || $ctrl.command.logDriver == 'None'">
|
|
27
|
+
Logging options are not available for your log driver selection.
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { module } from 'angular';
|
|
4
|
+
|
|
5
|
+
export const ECS_SERVER_GROUP_LOGGING = 'spinnaker.ecs.serverGroup.configure.wizard.logging.component';
|
|
6
|
+
module(ECS_SERVER_GROUP_LOGGING, []).component('ecsServerGroupLogging', {
|
|
7
|
+
bindings: {
|
|
8
|
+
command: '=',
|
|
9
|
+
application: '=',
|
|
10
|
+
},
|
|
11
|
+
templateUrl: require('./logging.component.html'),
|
|
12
|
+
});
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { module } from 'angular';
|
|
2
|
+
import { isEqual, uniqWith } from 'lodash';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Alert } from 'react-bootstrap';
|
|
5
|
+
import type { Option } from 'react-select';
|
|
6
|
+
import { react2angular } from 'react2angular';
|
|
7
|
+
|
|
8
|
+
import type { ISubnet } from '@spinnaker/core';
|
|
9
|
+
import { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';
|
|
10
|
+
|
|
11
|
+
import type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';
|
|
12
|
+
|
|
13
|
+
export interface IEcsNetworkingProps {
|
|
14
|
+
command: IEcsServerGroupCommand;
|
|
15
|
+
notifyAngular: (key: string, value: any) => void;
|
|
16
|
+
configureCommand: (query: string) => PromiseLike<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface IEcsNetworkingState {
|
|
20
|
+
associatePublicIpAddress: boolean;
|
|
21
|
+
networkMode: string;
|
|
22
|
+
networkModesAvailable: string[];
|
|
23
|
+
securityGroupNames: string[];
|
|
24
|
+
securityGroupsAvailable: string[];
|
|
25
|
+
subnetTypes: string[];
|
|
26
|
+
subnetTypesAvailable: ISubnet[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class EcsNetworking extends React.Component<IEcsNetworkingProps, IEcsNetworkingState> {
|
|
30
|
+
constructor(props: IEcsNetworkingProps) {
|
|
31
|
+
super(props);
|
|
32
|
+
const cmd = this.props.command;
|
|
33
|
+
|
|
34
|
+
let defaultSubnetTypes: string[] = [];
|
|
35
|
+
if (cmd.subnetTypes && cmd.subnetTypes.length > 0) {
|
|
36
|
+
defaultSubnetTypes = cmd.subnetTypes;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (cmd.subnetType && cmd.subnetType.length > 0) {
|
|
40
|
+
defaultSubnetTypes.push(cmd.subnetType);
|
|
41
|
+
cmd.subnetType = '';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
cmd.subnetTypes = uniqWith(defaultSubnetTypes, isEqual);
|
|
45
|
+
|
|
46
|
+
this.state = {
|
|
47
|
+
associatePublicIpAddress: cmd.associatePublicIpAddress,
|
|
48
|
+
networkMode: cmd.networkMode,
|
|
49
|
+
networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],
|
|
50
|
+
securityGroupNames: cmd.securityGroupNames,
|
|
51
|
+
securityGroupsAvailable:
|
|
52
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames
|
|
53
|
+
? cmd.backingData.filtered.securityGroupNames
|
|
54
|
+
: [],
|
|
55
|
+
subnetTypes: cmd.subnetTypes,
|
|
56
|
+
subnetTypesAvailable:
|
|
57
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes
|
|
58
|
+
? cmd.backingData.filtered.subnetTypes
|
|
59
|
+
: [],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public componentDidMount() {
|
|
64
|
+
const cmd = this.props.command;
|
|
65
|
+
|
|
66
|
+
this.props.configureCommand('1').then(() => {
|
|
67
|
+
this.setState({
|
|
68
|
+
networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],
|
|
69
|
+
securityGroupsAvailable:
|
|
70
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames
|
|
71
|
+
? cmd.backingData.filtered.securityGroupNames
|
|
72
|
+
: [],
|
|
73
|
+
subnetTypesAvailable:
|
|
74
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes
|
|
75
|
+
? cmd.backingData.filtered.subnetTypes
|
|
76
|
+
: [],
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private updateNetworkMode = (newNetworkMode: Option<string>) => {
|
|
82
|
+
const updatedNetworkMode = newNetworkMode.value;
|
|
83
|
+
const cmd = this.props.command;
|
|
84
|
+
this.props.notifyAngular('networkMode', updatedNetworkMode);
|
|
85
|
+
this.setState({
|
|
86
|
+
networkMode: updatedNetworkMode,
|
|
87
|
+
subnetTypesAvailable:
|
|
88
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes
|
|
89
|
+
? cmd.backingData.filtered.subnetTypes
|
|
90
|
+
: [],
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
private updateSecurityGroups = (newSecurityGroups: Option<string>) => {
|
|
95
|
+
const updatedSecurityGroups = Array.isArray(newSecurityGroups)
|
|
96
|
+
? newSecurityGroups.map((securityGroups) => securityGroups.value)
|
|
97
|
+
: [];
|
|
98
|
+
this.props.notifyAngular('securityGroupNames', updatedSecurityGroups);
|
|
99
|
+
this.setState({ securityGroupNames: updatedSecurityGroups });
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
private updateSubnetTypes = (newSubnetTypes: Option<string>) => {
|
|
103
|
+
const cmd = this.props.command;
|
|
104
|
+
const updatedSubnetTypes = Array.isArray(newSubnetTypes)
|
|
105
|
+
? newSubnetTypes.map((subnetType) => subnetType.value)
|
|
106
|
+
: [];
|
|
107
|
+
this.props.notifyAngular('subnetTypes', updatedSubnetTypes);
|
|
108
|
+
cmd.subnetTypeChanged(cmd);
|
|
109
|
+
this.setState({
|
|
110
|
+
subnetTypes: updatedSubnetTypes,
|
|
111
|
+
securityGroupsAvailable:
|
|
112
|
+
cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames
|
|
113
|
+
? cmd.backingData.filtered.securityGroupNames
|
|
114
|
+
: [],
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
private updateAssociatePublicIpAddress = (usePublicIp: boolean) => {
|
|
119
|
+
this.props.notifyAngular('associatePublicIpAddress', usePublicIp);
|
|
120
|
+
this.setState({ associatePublicIpAddress: usePublicIp });
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
public render(): React.ReactElement<EcsNetworking> {
|
|
124
|
+
const updateAssociatePublicIpAddress = this.updateAssociatePublicIpAddress;
|
|
125
|
+
const updateNetworkMode = this.updateNetworkMode;
|
|
126
|
+
const updateSecurityGroups = this.updateSecurityGroups;
|
|
127
|
+
const updateSubnetTypes = this.updateSubnetTypes;
|
|
128
|
+
|
|
129
|
+
const networkModesAvailable = this.state.networkModesAvailable.map(function (networkMode) {
|
|
130
|
+
return { label: `${networkMode}`, value: networkMode };
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const securityGroupsAvailable = this.state.securityGroupsAvailable.map(function (securityGroup) {
|
|
134
|
+
return { label: `${securityGroup}`, value: securityGroup };
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const subnetTypesAvailable = this.state.subnetTypesAvailable.map(function (subnetType) {
|
|
138
|
+
return { label: `${subnetType.purpose} (${subnetType.vpcId})`, value: subnetType.purpose };
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const subnetTypeOptions = this.state.subnetTypesAvailable.length ? (
|
|
142
|
+
<TetheredSelect
|
|
143
|
+
multi={true}
|
|
144
|
+
options={subnetTypesAvailable}
|
|
145
|
+
value={this.state.subnetTypes}
|
|
146
|
+
onChange={(e: Option) => {
|
|
147
|
+
updateSubnetTypes(e as Option<string>);
|
|
148
|
+
}}
|
|
149
|
+
/>
|
|
150
|
+
) : (
|
|
151
|
+
<Alert color="warning">No account was selected, or no subnet types are available for this account</Alert>
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
const securityGroupsOptions = this.state.securityGroupsAvailable.length ? (
|
|
155
|
+
<TetheredSelect
|
|
156
|
+
multi={true}
|
|
157
|
+
options={securityGroupsAvailable}
|
|
158
|
+
value={this.state.securityGroupNames}
|
|
159
|
+
onChange={(e: Option) => {
|
|
160
|
+
updateSecurityGroups(e as Option<string>);
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
) : (
|
|
164
|
+
<Alert color="warning">No security groups found in the selected account/region</Alert>
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
const awsVpcOptions =
|
|
168
|
+
this.state.networkMode === 'awsvpc' ? (
|
|
169
|
+
<div className="form-group">
|
|
170
|
+
<div className="form-group">
|
|
171
|
+
<div className="col-md-3 sm-label-right">
|
|
172
|
+
<b>VPC Subnet</b>
|
|
173
|
+
<HelpField key="ecs.subnet" />
|
|
174
|
+
</div>
|
|
175
|
+
<div className="col-md-9" data-test-id="Networking.subnetType">
|
|
176
|
+
{subnetTypeOptions}
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div className="form-group">
|
|
181
|
+
<div className="col-md-3 sm-label-right">
|
|
182
|
+
<b>Security Groups</b>
|
|
183
|
+
<HelpField key="ecs.securityGroups" />
|
|
184
|
+
</div>
|
|
185
|
+
<div className="col-md-9" data-test-id="Networking.securityGroups">
|
|
186
|
+
{securityGroupsOptions}
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div className="form-group">
|
|
191
|
+
<div className="col-md-3 sm-label-right">
|
|
192
|
+
<b>Associate Public IP Address</b>
|
|
193
|
+
<HelpField key="ecs.publicip" />
|
|
194
|
+
</div>
|
|
195
|
+
<div className="col-md-1 radio">
|
|
196
|
+
<label>
|
|
197
|
+
<input
|
|
198
|
+
data-test-id="Networking.associatePublicIpAddressTrue"
|
|
199
|
+
type="radio"
|
|
200
|
+
value="true"
|
|
201
|
+
id="associatePublicIpAddressTrue"
|
|
202
|
+
checked={this.state.associatePublicIpAddress === true}
|
|
203
|
+
onChange={() => updateAssociatePublicIpAddress(true)}
|
|
204
|
+
/>
|
|
205
|
+
Yes
|
|
206
|
+
</label>
|
|
207
|
+
</div>
|
|
208
|
+
<div className="col-md-1 radio">
|
|
209
|
+
<label>
|
|
210
|
+
<input
|
|
211
|
+
data-test-id="Networking.associatePublicIpAddressFalse"
|
|
212
|
+
type="radio"
|
|
213
|
+
value="false"
|
|
214
|
+
id="associatePublicIpAddressFalse"
|
|
215
|
+
checked={this.state.associatePublicIpAddress === false}
|
|
216
|
+
onChange={() => updateAssociatePublicIpAddress(false)}
|
|
217
|
+
/>
|
|
218
|
+
No
|
|
219
|
+
</label>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
) : (
|
|
224
|
+
<div className="col-md-3 sm-label-right"></div>
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<div className="networking-fluid form-horizontal">
|
|
229
|
+
<div className="form-group">
|
|
230
|
+
<div className="form-group">
|
|
231
|
+
<div className="col-md-3 sm-label-right">
|
|
232
|
+
<b>Network Mode</b>
|
|
233
|
+
<HelpField id="ecs.networkMode" />
|
|
234
|
+
</div>
|
|
235
|
+
<div className="col-md-9" data-test-id="Networking.networkMode">
|
|
236
|
+
<TetheredSelect
|
|
237
|
+
placeholder="Select a network mode to use ..."
|
|
238
|
+
options={networkModesAvailable}
|
|
239
|
+
value={this.state.networkMode}
|
|
240
|
+
onChange={(e: Option) => {
|
|
241
|
+
updateNetworkMode(e as Option<string>);
|
|
242
|
+
}}
|
|
243
|
+
/>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
{awsVpcOptions}
|
|
248
|
+
</div>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export const ECS_NETWORKING_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.networking.react';
|
|
254
|
+
module(ECS_NETWORKING_REACT, []).component(
|
|
255
|
+
'ecsNetworkingReact',
|
|
256
|
+
react2angular(withErrorBoundary(EcsNetworking, 'ecsNetworkingReact'), [
|
|
257
|
+
'command',
|
|
258
|
+
'notifyAngular',
|
|
259
|
+
'configureCommand',
|
|
260
|
+
]),
|
|
261
|
+
);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<form name="form" class="form-horizontal" novalidate>
|
|
2
|
+
<div ng-if="state.requiresTemplateSelection">
|
|
3
|
+
<ng-include src="pages.templateSelection"></ng-include>
|
|
4
|
+
</div>
|
|
5
|
+
<div ng-if="!state.loaded" style="height: 200px">
|
|
6
|
+
<h3 us-spinner="{radius:30, width:8, length: 16}"></h3>
|
|
7
|
+
</div>
|
|
8
|
+
<div ng-if="!state.requiresTemplateSelection">
|
|
9
|
+
<v2-modal-wizard ng-show="state.loaded" heading="{{title}}" task-monitor="taskMonitor" dismiss="$dismiss()">
|
|
10
|
+
<v2-wizard-page key="basicSettings" label="Basic Settings" mark-complete-on-view="false" done="true">
|
|
11
|
+
<ng-include src="pages.basicSettings"></ng-include>
|
|
12
|
+
</v2-wizard-page>
|
|
13
|
+
<v2-wizard-page key="networking" label="Networking" done="true">
|
|
14
|
+
<ng-include src="pages.networking"></ng-include>
|
|
15
|
+
</v2-wizard-page>
|
|
16
|
+
<v2-wizard-page key="taskDefinition" label="Task Definition" done="true">
|
|
17
|
+
<ng-include src="pages.taskDefinition"></ng-include>
|
|
18
|
+
</v2-wizard-page>
|
|
19
|
+
<div ng-if="!command.useTaskDefinitionArtifact">
|
|
20
|
+
<v2-wizard-page key="container" label="Container" done="true">
|
|
21
|
+
<ng-include src="pages.container"></ng-include>
|
|
22
|
+
</v2-wizard-page>
|
|
23
|
+
</div>
|
|
24
|
+
<v2-wizard-page key="horizontalScaling" label="Horizontal Scaling" done="true">
|
|
25
|
+
<ng-include src="pages.horizontalScaling"></ng-include>
|
|
26
|
+
</v2-wizard-page>
|
|
27
|
+
<div ng-if="!command.useTaskDefinitionArtifact">
|
|
28
|
+
<v2-wizard-page key="logging" label="Logging" done="true">
|
|
29
|
+
<ng-include src="pages.logging"></ng-include>
|
|
30
|
+
</v2-wizard-page>
|
|
31
|
+
</div>
|
|
32
|
+
<v2-wizard-page key="serviceDiscovery" label="Service Discovery" done="true">
|
|
33
|
+
<ng-include ng-if="!command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>
|
|
34
|
+
<ng-include ng-if="command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>
|
|
35
|
+
</v2-wizard-page>
|
|
36
|
+
<v2-wizard-page key="advanced" label="Advanced Settings" mark-complete-on-view="false" done="true">
|
|
37
|
+
<ng-include src="pages.advancedSettings"></ng-include>
|
|
38
|
+
</v2-wizard-page>
|
|
39
|
+
</v2-modal-wizard>
|
|
40
|
+
<div class="modal-footer" ng-if="state.loaded">
|
|
41
|
+
<button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">
|
|
42
|
+
Cancel
|
|
43
|
+
</button>
|
|
44
|
+
<submit-button
|
|
45
|
+
data-test-id="ServerGroupWizard.submitButton"
|
|
46
|
+
ng-if="ctrl.showSubmitButton()"
|
|
47
|
+
is-disabled="!ctrl.isValid() || taskMonitor.submitting"
|
|
48
|
+
label="command.viewState.submitButtonLabel"
|
|
49
|
+
submitting="taskMonitor.submitting"
|
|
50
|
+
on-click="ctrl.submit()"
|
|
51
|
+
is-new="true"
|
|
52
|
+
></submit-button>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</form>
|