@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.
Files changed (173) hide show
  1. package/CHANGELOG.md +1186 -0
  2. package/LICENSE.txt +203 -0
  3. package/dist/common/common.module.d.ts +1 -0
  4. package/dist/common/footer.component.d.ts +1 -0
  5. package/dist/domain/IEcsLoadBalancer.d.ts +119 -0
  6. package/dist/ecs.help.d.ts +1 -0
  7. package/dist/ecs.module.d.ts +4 -0
  8. package/dist/ecs.settings.d.ts +9 -0
  9. package/dist/ecsCluster/IEcsCapacityProviderDetails.d.ts +10 -0
  10. package/dist/ecsCluster/IEcsCluster.d.ts +5 -0
  11. package/dist/ecsCluster/ecsCluster.read.service.d.ts +7 -0
  12. package/dist/iamRoles/IRole.d.ts +6 -0
  13. package/dist/iamRoles/iamRole.read.service.d.ts +5 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.js +6010 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/instance/details/instance.details.controller.d.ts +2 -0
  18. package/dist/loadBalancer/EcsLoadBalancerClusterContainer.d.ts +6 -0
  19. package/dist/loadBalancer/TargetGroup.d.ts +11 -0
  20. package/dist/loadBalancer/details/loadBalancerDetails.d.ts +27 -0
  21. package/dist/loadBalancer/details/targetGroupDetails.d.ts +30 -0
  22. package/dist/loadBalancer/listener.d.ts +10 -0
  23. package/dist/loadBalancer/loadBalancer.transformer.d.ts +8 -0
  24. package/dist/loadBalancer/targetGroup.states.d.ts +1 -0
  25. package/dist/metricAlarm/MetricAlarm.d.ts +6 -0
  26. package/dist/metricAlarm/metricAlarm.read.service.d.ts +5 -0
  27. package/dist/pipeline/stages/destroyAsg/ecsDestroyAsgStage.d.ts +2 -0
  28. package/dist/pipeline/stages/disableAsg/ecsDisableAsgStage.d.ts +2 -0
  29. package/dist/pipeline/stages/disableCluster/ecsDisableClusterStage.d.ts +2 -0
  30. package/dist/pipeline/stages/enableAsg/ecsEnableAsgStage.d.ts +2 -0
  31. package/dist/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.d.ts +2 -0
  32. package/dist/pipeline/stages/resizeAsg/ecsResizeAsgStage.d.ts +2 -0
  33. package/dist/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.d.ts +2 -0
  34. package/dist/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.d.ts +2 -0
  35. package/dist/placementStrategy/IPlacementStrategy.d.ts +4 -0
  36. package/dist/placementStrategy/placementStrategy.service.d.ts +11 -0
  37. package/dist/secrets/ISecret.d.ts +5 -0
  38. package/dist/secrets/secret.read.service.d.ts +5 -0
  39. package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +2 -0
  40. package/dist/securityGroup/securityGroup.module.d.ts +1 -0
  41. package/dist/securityGroup/securityGroup.reader.d.ts +5 -0
  42. package/dist/securityGroup/securityGroup.transformer.d.ts +2 -0
  43. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +2 -0
  44. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +165 -0
  45. package/dist/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.d.ts +2 -0
  46. package/dist/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.d.ts +2 -0
  47. package/dist/serverGroup/configure/wizard/capacityProvider/CapacityProvider.d.ts +7 -0
  48. package/dist/serverGroup/configure/wizard/container/Container.d.ts +32 -0
  49. package/dist/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.d.ts +2 -0
  50. package/dist/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.d.ts +2 -0
  51. package/dist/serverGroup/configure/wizard/logging/logging.component.d.ts +1 -0
  52. package/dist/serverGroup/configure/wizard/networking/Networking.d.ts +28 -0
  53. package/dist/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.d.ts +34 -0
  54. package/dist/serverGroup/configure/wizard/taskDefinition/TaskDefinition.d.ts +39 -0
  55. package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +1 -0
  56. package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +2 -0
  57. package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +2 -0
  58. package/dist/serverGroup/details/serverGroupDetails.ecs.controller.d.ts +2 -0
  59. package/dist/serverGroup/details/serverGroupDetails.module.d.ts +1 -0
  60. package/dist/serverGroup/events/EventsLink.d.ts +4 -0
  61. package/dist/serverGroup/events/events.component.d.ts +3 -0
  62. package/dist/serverGroup/events/events.controller.d.ts +19 -0
  63. package/dist/serverGroup/events/serverGroupEventsReader.service.d.ts +10 -0
  64. package/dist/serverGroup/serverGroup.module.d.ts +1 -0
  65. package/dist/serverGroup/serverGroup.transformer.d.ts +11 -0
  66. package/dist/serviceDiscovery/IServiceDiscovery.d.ts +12 -0
  67. package/dist/serviceDiscovery/serviceDiscovery.read.service.d.ts +4 -0
  68. package/package.json +47 -0
  69. package/src/common/common.module.ts +6 -0
  70. package/src/common/footer.component.ts +29 -0
  71. package/src/domain/IEcsLoadBalancer.ts +129 -0
  72. package/src/ecs.help.ts +91 -0
  73. package/src/ecs.module.ts +116 -0
  74. package/src/ecs.settings.ts +17 -0
  75. package/src/ecsCluster/IEcsCapacityProviderDetails.ts +11 -0
  76. package/src/ecsCluster/IEcsCluster.ts +5 -0
  77. package/src/ecsCluster/ecsCluster.read.service.ts +23 -0
  78. package/src/iamRoles/IRole.ts +6 -0
  79. package/src/iamRoles/iamRole.read.service.ts +14 -0
  80. package/src/index.ts +1 -0
  81. package/src/instance/details/instance.details.controller.js +356 -0
  82. package/src/instance/details/instanceDetails.html +204 -0
  83. package/src/loadBalancer/EcsLoadBalancerClusterContainer.tsx +48 -0
  84. package/src/loadBalancer/TargetGroup.tsx +74 -0
  85. package/src/loadBalancer/details/loadBalancerDetails.tsx +235 -0
  86. package/src/loadBalancer/details/targetGroupDetails.tsx +251 -0
  87. package/src/loadBalancer/listener.tsx +65 -0
  88. package/src/loadBalancer/loadBalancer.transformer.ts +21 -0
  89. package/src/loadBalancer/targetGroup.states.ts +59 -0
  90. package/src/logo/ecs.icon.svg +27 -0
  91. package/src/logo/ecs.logo.less +5 -0
  92. package/src/logo/ecs.logo.svg +27 -0
  93. package/src/metricAlarm/MetricAlarm.ts +6 -0
  94. package/src/metricAlarm/metricAlarm.read.service.ts +14 -0
  95. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStage.html +101 -0
  96. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStepLabel.html +1 -0
  97. package/src/pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage.js +94 -0
  98. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +9 -0
  99. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
  100. package/src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js +65 -0
  101. package/src/pipeline/stages/disableAsg/disableAsgStage.html +11 -0
  102. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
  103. package/src/pipeline/stages/disableAsg/ecsDisableAsgStage.js +70 -0
  104. package/src/pipeline/stages/disableCluster/disableClusterStage.html +26 -0
  105. package/src/pipeline/stages/disableCluster/ecsDisableClusterStage.js +84 -0
  106. package/src/pipeline/stages/enableAsg/ecsEnableAsgStage.js +73 -0
  107. package/src/pipeline/stages/enableAsg/enableAsgStage.html +11 -0
  108. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +1 -0
  109. package/src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js +26 -0
  110. package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +36 -0
  111. package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +9 -0
  112. package/src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js +128 -0
  113. package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +87 -0
  114. package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +1 -0
  115. package/src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js +78 -0
  116. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +35 -0
  117. package/src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js +73 -0
  118. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +34 -0
  119. package/src/placementStrategy/IPlacementStrategy.ts +4 -0
  120. package/src/placementStrategy/placementStrategy.service.ts +63 -0
  121. package/src/secrets/ISecret.ts +5 -0
  122. package/src/secrets/secret.read.service.ts +14 -0
  123. package/src/securityGroup/details/securityGroupDetail.controller.js +147 -0
  124. package/src/securityGroup/details/securityGroupDetail.html +104 -0
  125. package/src/securityGroup/securityGroup.module.ts +12 -0
  126. package/src/securityGroup/securityGroup.reader.ts +16 -0
  127. package/src/securityGroup/securityGroup.transformer.js +13 -0
  128. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +281 -0
  129. package/src/serverGroup/configure/serverGroupConfiguration.service.ts +747 -0
  130. package/src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js +259 -0
  131. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.html +194 -0
  132. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js +17 -0
  133. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +10 -0
  134. package/src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx +381 -0
  135. package/src/serverGroup/configure/wizard/capacityProvider/capacityProvider.html +11 -0
  136. package/src/serverGroup/configure/wizard/container/Container.tsx +347 -0
  137. package/src/serverGroup/configure/wizard/container/container.html +9 -0
  138. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.html +118 -0
  139. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js +20 -0
  140. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.html +13 -0
  141. package/src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js +41 -0
  142. package/src/serverGroup/configure/wizard/location/basicSettings.html +137 -0
  143. package/src/serverGroup/configure/wizard/logging/logging.component.html +29 -0
  144. package/src/serverGroup/configure/wizard/logging/logging.component.ts +12 -0
  145. package/src/serverGroup/configure/wizard/logging/logging.html +7 -0
  146. package/src/serverGroup/configure/wizard/networking/Networking.tsx +261 -0
  147. package/src/serverGroup/configure/wizard/networking/networking.html +9 -0
  148. package/src/serverGroup/configure/wizard/serverGroupWizard.html +55 -0
  149. package/src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx +250 -0
  150. package/src/serverGroup/configure/wizard/serviceDiscovery/serviceDiscovery.html +11 -0
  151. package/src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx +460 -0
  152. package/src/serverGroup/configure/wizard/taskDefinition/taskDefinition.html +51 -0
  153. package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +9 -0
  154. package/src/serverGroup/configure/wizard/verticalScaling/verticalScaling.html +10 -0
  155. package/src/serverGroup/details/resize/resizeCapacity.component.html +94 -0
  156. package/src/serverGroup/details/resize/resizeCapacity.component.ts +14 -0
  157. package/src/serverGroup/details/resize/resizeServerGroup.controller.js +85 -0
  158. package/src/serverGroup/details/resize/resizeServerGroup.html +28 -0
  159. package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +97 -0
  160. package/src/serverGroup/details/rollback/rollbackServerGroup.html +67 -0
  161. package/src/serverGroup/details/serverGroupDetails.ecs.controller.js +366 -0
  162. package/src/serverGroup/details/serverGroupDetails.html +216 -0
  163. package/src/serverGroup/details/serverGroupDetails.module.ts +5 -0
  164. package/src/serverGroup/events/EventsLink.tsx +5 -0
  165. package/src/serverGroup/events/events.component.ts +35 -0
  166. package/src/serverGroup/events/events.controller.ts +45 -0
  167. package/src/serverGroup/events/events.html +36 -0
  168. package/src/serverGroup/events/serverGroupEventsReader.service.ts +27 -0
  169. package/src/serverGroup/serverGroup.module.ts +6 -0
  170. package/src/serverGroup/serverGroup.transformer.spec.ts +184 -0
  171. package/src/serverGroup/serverGroup.transformer.ts +117 -0
  172. package/src/serviceDiscovery/IServiceDiscovery.ts +13 -0
  173. 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,7 @@
1
+ <div class="clearfix">
2
+ <div class="row">
3
+ <div class="col-md-12">
4
+ <ecs-server-group-logging command="command" application="application"></ecs-server-group-logging>
5
+ </div>
6
+ </div>
7
+ </div>
@@ -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,9 @@
1
+ <div class="clearfix">
2
+ <div class="col-md-12">
3
+ <ecs-networking-react
4
+ command="command"
5
+ notify-angular="notifyAngular"
6
+ configure-command="configureCommand"
7
+ ></ecs-networking-react>
8
+ </div>
9
+ </div>
@@ -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>