@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,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,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
|
+
]);
|