@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,347 @@
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 { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';
9
+
10
+ import type {
11
+ IEcsDockerImage,
12
+ IEcsServerGroupCommand,
13
+ IEcsTargetGroupMapping,
14
+ } from '../../serverGroupConfiguration.service';
15
+
16
+ export interface IContainerProps {
17
+ command: IEcsServerGroupCommand;
18
+ notifyAngular: (key: string, value: any) => void;
19
+ configureCommand: (query: string) => PromiseLike<void>;
20
+ }
21
+
22
+ interface IContainerState {
23
+ imageDescription: IEcsDockerImage;
24
+ computeUnits: number;
25
+ reservedMemory: number;
26
+ dockerImages: IEcsDockerImage[];
27
+ targetGroupsAvailable: string[];
28
+ targetGroupMappings: IEcsTargetGroupMapping[];
29
+ }
30
+
31
+ export class Container extends React.Component<IContainerProps, IContainerState> {
32
+ constructor(props: IContainerProps) {
33
+ super(props);
34
+ const cmd = this.props.command;
35
+ let defaultContainer = '';
36
+ if (cmd.containerMappings && cmd.containerMappings.length > 0) {
37
+ defaultContainer = cmd.containerMappings[0].containerName;
38
+ }
39
+
40
+ let defaultTargetGroup: IEcsTargetGroupMapping[] = [];
41
+ if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {
42
+ defaultTargetGroup = cmd.targetGroupMappings;
43
+ }
44
+
45
+ if (cmd.targetGroup && cmd.targetGroup.length > 0) {
46
+ defaultTargetGroup.push({
47
+ containerName: cmd.loadBalancedContainer || defaultContainer,
48
+ targetGroup: cmd.targetGroup,
49
+ containerPort: cmd.containerPort,
50
+ });
51
+ cmd.targetGroup = '';
52
+ cmd.loadBalancedContainer = '';
53
+ }
54
+
55
+ cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);
56
+ cmd.containerMappings = null;
57
+
58
+ this.state = {
59
+ imageDescription: cmd.imageDescription ? cmd.imageDescription : this.getEmptyImageDescription(),
60
+ computeUnits: cmd.computeUnits,
61
+ reservedMemory: cmd.reservedMemory,
62
+ dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],
63
+ targetGroupMappings: cmd.targetGroupMappings,
64
+ targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],
65
+ };
66
+
67
+ this.state.targetGroupMappings.forEach((targetGroupMapping) => {
68
+ targetGroupMapping.containerName = '';
69
+ });
70
+ }
71
+
72
+ public componentDidMount() {
73
+ this.props.configureCommand('1').then(() => {
74
+ this.setState({
75
+ dockerImages: this.props.command.backingData.filtered.images,
76
+ targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,
77
+ });
78
+ });
79
+ }
80
+
81
+ // TODO: Separate docker image component used by both TaskDefinition and Container
82
+
83
+ private getIdToImageMap = (): Map<string, IEcsDockerImage> => {
84
+ const imageIdToDescription = new Map<string, IEcsDockerImage>();
85
+ this.props.command.backingData.filtered.images.forEach((e) => {
86
+ imageIdToDescription.set(e.imageId, e);
87
+ });
88
+
89
+ return imageIdToDescription;
90
+ };
91
+
92
+ private getEmptyImageDescription = (): IEcsDockerImage => {
93
+ return {
94
+ imageId: '',
95
+ message: '',
96
+ fromTrigger: false,
97
+ fromContext: false,
98
+ stageId: '',
99
+ imageLabelOrSha: '',
100
+ account: '',
101
+ registry: '',
102
+ repository: '',
103
+ tag: '',
104
+ };
105
+ };
106
+
107
+ private pushTargetGroupMapping = () => {
108
+ const targetMaps = this.state.targetGroupMappings;
109
+ targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });
110
+ this.setState({ targetGroupMappings: targetMaps });
111
+ };
112
+
113
+ private updateContainerMappingImage = (newImage: Option<string>) => {
114
+ const imageMap = this.getIdToImageMap();
115
+ let newImageDescription = imageMap.get(newImage.value);
116
+ if (!newImageDescription) {
117
+ newImageDescription = this.getEmptyImageDescription();
118
+ }
119
+
120
+ this.props.notifyAngular('imageDescription', newImageDescription);
121
+ this.setState({ imageDescription: newImageDescription });
122
+ };
123
+
124
+ private updateComputeUnits = (newComputeUnits: number) => {
125
+ this.props.notifyAngular('computeUnits', newComputeUnits);
126
+ this.setState({ computeUnits: newComputeUnits });
127
+ };
128
+
129
+ private updateReservedMemory = (newReservedMemory: number) => {
130
+ this.props.notifyAngular('reservedMemory', newReservedMemory);
131
+ this.setState({ reservedMemory: newReservedMemory });
132
+ };
133
+
134
+ private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {
135
+ const currentMappings = this.state.targetGroupMappings;
136
+ const targetMapping = currentMappings[index];
137
+ targetMapping.targetGroup = newTargetGroup.value;
138
+ this.props.notifyAngular('targetGroupMappings', currentMappings);
139
+ this.setState({ targetGroupMappings: currentMappings });
140
+ this.updateDirtyTargetGroups();
141
+ };
142
+
143
+ private updateTargetGroupMappingPort = (index: number, targetPort: number) => {
144
+ const currentMappings = this.state.targetGroupMappings;
145
+ const targetMapping = currentMappings[index];
146
+ targetMapping.containerPort = targetPort;
147
+ this.props.notifyAngular('targetGroupMappings', currentMappings);
148
+ this.setState({ targetGroupMappings: currentMappings });
149
+ };
150
+
151
+ private removeTargetGroupMapping = (index: number) => {
152
+ const currentMappings = this.state.targetGroupMappings;
153
+ currentMappings.splice(index, 1);
154
+ this.props.notifyAngular('targetGroupMappings', currentMappings);
155
+ this.setState({ targetGroupMappings: currentMappings });
156
+ };
157
+
158
+ private updateDirtyTargetGroups = () => {
159
+ this.props.command.viewState.dirty.targetGroups = [];
160
+ };
161
+
162
+ public render(): React.ReactElement<Container> {
163
+ const removeTargetGroupMapping = this.removeTargetGroupMapping;
164
+ const updateContainerMappingImage = this.updateContainerMappingImage;
165
+ const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;
166
+ const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;
167
+ const updateComputeUnits = this.updateComputeUnits;
168
+ const updateReservedMemory = this.updateReservedMemory;
169
+ const dirtyTagetGroups =
170
+ this.props.command.viewState.dirty && this.props.command.viewState.dirty.targetGroups
171
+ ? this.props.command.viewState.dirty.targetGroups
172
+ : [];
173
+
174
+ const dockerImageOptions = this.state.dockerImages.map(function (image) {
175
+ let msg = '';
176
+ if (image.fromTrigger || image.fromContext) {
177
+ msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';
178
+ }
179
+ return { label: `${msg} (${image.imageId})`, value: image.imageId };
180
+ });
181
+
182
+ const dirtyTargetGroupList = dirtyTagetGroups
183
+ ? dirtyTagetGroups.map(function (targetGroup, index) {
184
+ return <li key={index}>{targetGroup}</li>;
185
+ })
186
+ : '';
187
+
188
+ const dirtyTargetGroupSection = (
189
+ <div className="alert alert-warning">
190
+ <p>
191
+ <i className="fa fa-exclamation-triangle"></i>
192
+ The following target groups could not be found in the selected account/region/VPC and were removed:
193
+ </p>
194
+ <ul>{dirtyTargetGroupList}</ul>
195
+ <br />
196
+ <p className="text-left">Please select the target group(s) from the dropdown to resolve this error.</p>
197
+ </div>
198
+ );
199
+
200
+ const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (
201
+ <button
202
+ className="btn btn-block btn-sm add-new"
203
+ data-test-id="ContainerInputs.targetGroupAdd"
204
+ onClick={this.pushTargetGroupMapping}
205
+ >
206
+ <span className="glyphicon glyphicon-plus-sign" />
207
+ Add New Target Group Mapping
208
+ </button>
209
+ ) : (
210
+ <div className="sm-label-left">
211
+ <Alert color="warning">No target groups found in the selected account/region/VPC</Alert>
212
+ </div>
213
+ );
214
+
215
+ const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {
216
+ return { label: `${targetGroup}`, value: targetGroup };
217
+ });
218
+
219
+ const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {
220
+ return (
221
+ <tr key={index}>
222
+ <td data-test-id="ContainerInputs.targetGroup">
223
+ <TetheredSelect
224
+ placeholder="Select a target group to use..."
225
+ options={targetGroupsAvailable}
226
+ value={mapping.targetGroup.toString()}
227
+ onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}
228
+ clearable={false}
229
+ />
230
+ </td>
231
+ <td>
232
+ <input
233
+ data-test-id="ContainerInputs.targetGroupPort"
234
+ type="number"
235
+ className="form-control input-sm no-spel"
236
+ required={true}
237
+ value={mapping.containerPort.toString()}
238
+ onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}
239
+ />
240
+ </td>
241
+ <td>
242
+ <div className="form-control-static">
243
+ <a
244
+ className="btn-link sm-label"
245
+ data-test-id="ContainerInputs.targetGroupRemove"
246
+ onClick={() => removeTargetGroupMapping(index)}
247
+ >
248
+ <span className="glyphicon glyphicon-trash" />
249
+ <span className="sr-only">Remove</span>
250
+ </a>
251
+ </div>
252
+ </td>
253
+ </tr>
254
+ );
255
+ });
256
+
257
+ return (
258
+ <div className="container-fluid form-horizontal">
259
+ {dirtyTagetGroups.length > 0 ? <div>{dirtyTargetGroupSection}</div> : ''}
260
+ <div className="form-group">
261
+ <div className="col-md-3 sm-label-right">
262
+ <b>Container Image</b>
263
+ <HelpField id="ecs.containerMappingImage" />
264
+ </div>
265
+ <div className="col-md-9" data-test-id="ContainerInputs.containerImage">
266
+ <TetheredSelect
267
+ placeholder="Select an image to use..."
268
+ options={dockerImageOptions}
269
+ value={this.state.imageDescription.imageId}
270
+ onChange={(e: Option) => {
271
+ updateContainerMappingImage(e as Option<string>);
272
+ }}
273
+ clearable={false}
274
+ />
275
+ </div>
276
+ </div>
277
+ <div className="form-group">
278
+ <div className="col-md-3 sm-label-right">
279
+ <b>Compute Units</b>
280
+ <HelpField id="ecs.capacity.reserved.computeUnits" />
281
+ </div>
282
+ <div className="col-md-9" style={{ width: '100px' }}>
283
+ <input
284
+ data-test-id="ContainerInputs.computeUnits"
285
+ type="number"
286
+ className="form-control input-sm no-spel"
287
+ required={false}
288
+ value={this.state.computeUnits}
289
+ onChange={(e) => updateComputeUnits(e.target.valueAsNumber)}
290
+ />
291
+ </div>
292
+ </div>
293
+ <div className="form-group">
294
+ <div className="col-md-3 sm-label-right">
295
+ <b>Reserved Memory</b>
296
+ <HelpField id="ecs.capacity.reserved.memory" />
297
+ </div>
298
+ <div className="col-md-9" style={{ width: '100px' }}>
299
+ <input
300
+ data-test-id="ContainerInputs.reservedMemory"
301
+ type="number"
302
+ className="form-control input-sm no-spel"
303
+ required={false}
304
+ value={this.state.reservedMemory}
305
+ onChange={(e) => updateReservedMemory(e.target.valueAsNumber)}
306
+ />
307
+ </div>
308
+ </div>
309
+ <div className="form-group">
310
+ <div className="sm-label-left">
311
+ <b>Target Group Mappings</b>
312
+ <HelpField id="ecs.targetGroupMappings" />
313
+ </div>
314
+ <form name="ecsContainerTargetGroupMappings">
315
+ <table className="table table-condensed packed tags">
316
+ <thead>
317
+ <tr key="header">
318
+ <th style={{ width: '80%' }}>
319
+ Target group
320
+ <HelpField id="ecs.loadBalancer.targetGroup" />
321
+ </th>
322
+ <th style={{ width: '20%' }}>
323
+ Target port
324
+ <HelpField id="ecs.loadbalancing.targetPort" />
325
+ </th>
326
+ <th />
327
+ </tr>
328
+ </thead>
329
+ <tbody>{targetGroupInputs}</tbody>
330
+ <tfoot>
331
+ <tr>
332
+ <td colSpan={4}>{newTargetGroupMapping}</td>
333
+ </tr>
334
+ </tfoot>
335
+ </table>
336
+ </form>
337
+ </div>
338
+ </div>
339
+ );
340
+ }
341
+ }
342
+
343
+ export const CONTAINER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.container.react';
344
+ module(CONTAINER_REACT, []).component(
345
+ 'containerReact',
346
+ react2angular(withErrorBoundary(Container, 'containerReact'), ['command', 'notifyAngular', 'configureCommand']),
347
+ );
@@ -0,0 +1,9 @@
1
+ <div class="clearfix">
2
+ <div class="col-md-12">
3
+ <container-react
4
+ command="command"
5
+ notify-angular="notifyAngular"
6
+ configure-command="configureCommand"
7
+ ></container-react>
8
+ </div>
9
+ </div>
@@ -0,0 +1,118 @@
1
+ <div class="container-fluid form-horizontal">
2
+ <div class="form-group">
3
+ <div class="col-md-4 sm-label-right">
4
+ <b>Compute options</b>
5
+ <help-field key="ecs.computeOptions"></help-field>
6
+ </div>
7
+ <div class="col-md-2 radio">
8
+ <label>
9
+ <input
10
+ data-test-id="ServerGroup.computeOptionsLaunchType"
11
+ type="radio"
12
+ ng-model="$ctrl.capacityProviderState.useCapacityProviders"
13
+ ng-value="false"
14
+ ng-click="$ctrl.capacityProviderState.updateComputeOption('launchType')"
15
+ id="computeOptionsLaunchType"
16
+ />
17
+ Launch type
18
+ </label>
19
+ </div>
20
+ <div class="col-md-1 radio">
21
+ <label>
22
+ <input
23
+ data-test-id="ServerGroup.computeOptionsCapacityProviders"
24
+ type="radio"
25
+ ng-model="$ctrl.capacityProviderState.useCapacityProviders"
26
+ ng-value="true"
27
+ ng-click="$ctrl.capacityProviderState.updateComputeOption('capacityProviders')"
28
+ id="computeOptionsCapacityProviders"
29
+ />
30
+ Capacity Providers
31
+ </label>
32
+ </div>
33
+ </div>
34
+
35
+ <div class="form-group" ng-if="$ctrl.capacityProviderState.useCapacityProviders">
36
+ <ecs-capacity-provider-react
37
+ command="$ctrl.command"
38
+ notify-angular="$ctrl.notifyAngular"
39
+ configure-command="$ctrl.configureCommand"
40
+ ></ecs-capacity-provider-react>
41
+ </div>
42
+
43
+ <div class="form-group" ng-if="!$ctrl.capacityProviderState.useCapacityProviders" style="padding-top: 10px">
44
+ <div class="col-md-5 sm-label-right">
45
+ Launch Type
46
+ <help-field key="ecs.launchtype"></help-field>
47
+ </div>
48
+ <div class="col-md-3" data-test-id="ServerGroup.launchType">
49
+ <ui-select ng-model="$ctrl.command.launchType" class="form-control input-sm">
50
+ <ui-select-match placeholder="Select...">{{ $select.selected }}</ui-select-match>
51
+ <ui-select-choices repeat="launchType in $ctrl.command.backingData.launchTypes | filter: $select.search">
52
+ <span ng-bind-html="launchType | highlight: $select.search"></span>
53
+ </ui-select-choices>
54
+ </ui-select>
55
+ </div>
56
+ </div>
57
+
58
+ <hr />
59
+
60
+ <div class="form-group">
61
+ <div class="col-md-5 sm-label-right">
62
+ Desired capacity
63
+ <help-field key="ecs.capacity.desired"></help-field>
64
+ </div>
65
+ <div class="col-md-2">
66
+ <input
67
+ type="number"
68
+ class="form-control input-sm no-spel"
69
+ name="capacity"
70
+ ng-model="$ctrl.command.capacity.desired"
71
+ />
72
+ </div>
73
+ </div>
74
+
75
+ <div class="form-group">
76
+ <div class="col-md-5 sm-label-right">
77
+ Minimum
78
+ <help-field key="ecs.capacity.minimum"></help-field>
79
+ </div>
80
+ <div class="col-md-2">
81
+ <input type="number" class="form-control input-sm no-spel" name="min" ng-model="$ctrl.command.capacity.min" />
82
+ </div>
83
+ </div>
84
+
85
+ <div class="form-group">
86
+ <div class="col-md-5 sm-label-right">
87
+ Maximum
88
+ <help-field key="ecs.capacity.maximum"></help-field>
89
+ </div>
90
+ <div class="col-md-2">
91
+ <input type="number" class="form-control input-sm no-spel" name="max" ng-model="$ctrl.command.capacity.max" />
92
+ </div>
93
+ </div>
94
+
95
+ <div class="form-group">
96
+ <div class="col-md-12 checkbox">
97
+ <label>
98
+ <input
99
+ type="checkbox"
100
+ ng-model="$ctrl.command.useSourceCapacity"
101
+ ng-change="$ctrl.command.preferSourceCapacity=$ctrl.command.useSourceCapacity"
102
+ />
103
+ <b>If available, use the previous server group's capacity</b>
104
+ </label>
105
+ <help-field key="ecs.capacity.overwrite"></help-field>
106
+ </div>
107
+ </div>
108
+
109
+ <div class="form-group">
110
+ <div class="col-md-12 checkbox">
111
+ <label>
112
+ <input type="checkbox" ng-model="$ctrl.command.copySourceScalingPoliciesAndActions" />
113
+ <b>If available, copy the previous server group's autoscaling policies</b>
114
+ </label>
115
+ <help-field key="ecs.capacity.copySourceScalingPoliciesAndActions"></help-field>
116
+ </div>
117
+ </div>
118
+ </div>
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ export const ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT =
6
+ 'spinnaker.ecs.serverGroup.configure.wizard.horizontalScaling.component';
7
+ export const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT; // for backwards compatibility
8
+ module(ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT, []).component(
9
+ 'ecsServerGroupHorizontalScaling',
10
+ {
11
+ bindings: {
12
+ command: '=',
13
+ application: '=',
14
+ capacityProviderState: '=',
15
+ notifyAngular: '=',
16
+ configureCommand: '=',
17
+ },
18
+ templateUrl: require('./horizontalScaling.component.html'),
19
+ },
20
+ );
@@ -0,0 +1,13 @@
1
+ <div class="clearfix">
2
+ <div class="row">
3
+ <div class="col-md-12">
4
+ <ecs-server-group-horizontal-scaling
5
+ command="command"
6
+ application="application"
7
+ capacity-provider-state="capacityProviderState"
8
+ notify-angular="notifyAngular"
9
+ configure-command="configureCommand"
10
+ ></ecs-server-group-horizontal-scaling>
11
+ </div>
12
+ </div>
13
+ </div>
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
4
+ import * as angular from 'angular';
5
+ import ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';
6
+
7
+ import { ModalWizard } from '@spinnaker/core';
8
+
9
+ export const ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER =
10
+ 'spinnaker.ecs.serverGroup.configure.basicSettings';
11
+ export const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility
12
+ angular
13
+ .module(ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER, [
14
+ UIROUTER_ANGULARJS,
15
+ ANGULAR_UI_BOOTSTRAP,
16
+ ])
17
+ .controller('ecsServerGroupBasicSettingsCtrl', [
18
+ '$scope',
19
+ '$controller',
20
+ '$uibModalStack',
21
+ '$state',
22
+ function ($scope, $controller, $uibModalStack, $state) {
23
+ angular.extend(
24
+ this,
25
+ $controller('BasicSettingsMixin', {
26
+ $scope: $scope,
27
+ $uibModalStack: $uibModalStack,
28
+ $state: $state,
29
+ }),
30
+ );
31
+
32
+ $scope.$watch('form.$valid', function (newVal) {
33
+ if (newVal) {
34
+ ModalWizard.markClean('basicSettings');
35
+ ModalWizard.markComplete('basicSettings');
36
+ } else {
37
+ ModalWizard.markIncomplete('basicSettings');
38
+ }
39
+ });
40
+ },
41
+ ]);