@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,36 @@
1
+ <div ng-controller="BaseExecutionDetailsCtrl">
2
+ <execution-details-section-nav sections="configSections"></execution-details-section-nav>
3
+ <div class="step-section-details" ng-if="detailsSection === 'findImageConfig'">
4
+ <div class="row">
5
+ <div class="col-md-12">
6
+ <dl class="dl-narrow dl-horizontal">
7
+ <dt if-multiple-providers>Provider</dt>
8
+ <dd if-multiple-providers>ECS</dd>
9
+ </dl>
10
+ </div>
11
+ </div>
12
+ <stage-failure-message stage="stage" message="stage.failureMessage"></stage-failure-message>
13
+
14
+ <div class="row" ng-if="stage.context.amiDetails">
15
+ <div class="col-md-12">
16
+ <div class="well alert alert-info">
17
+ <h4>Results</h4>
18
+ <dl ng-repeat="image in stage.context.amiDetails" class="dl-narrow dl-horizontal">
19
+ <dt>Region</dt>
20
+ <dd>{{image.region}}</dd>
21
+ <dt>Image ID</dt>
22
+ <dd>{{image.imageId}}</dd>
23
+ <dt>Unique ID</dt>
24
+ <dd>{{image.imageName}}</dd>
25
+ </dl>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+
31
+ <div class="step-section-details" ng-if="detailsSection === 'taskStatus'">
32
+ <div class="row">
33
+ <execution-step-details item="stage"></execution-step-details>
34
+ </div>
35
+ </div>
36
+ </div>
@@ -0,0 +1,9 @@
1
+ <div ng-controller="ecsFindImageFromTagsStageCtrl as findImageFromTagsCtrl" class="form-horizontal">
2
+ <stage-config-field label="Full Docker Image path (label or SHA-256)">
3
+ <input type="text" class="form-control input-sm" ng-model="stage.imageLabelOrSha" />
4
+ </stage-config-field>
5
+ </div>
6
+
7
+ <div>
8
+ <h5>Example value: <i>12345678901.dkr.ecr.us-west-2.amazonaws.com/continuous-delivery:latest</i></h5>
9
+ </div>
@@ -0,0 +1,128 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ import { AccountService, Registry, StageConstants } from '@spinnaker/core';
6
+
7
+ export const ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.resizeAsgStage';
8
+ export const name = ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE; // for backwards compatibility
9
+ module(ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE, [])
10
+ .config(function () {
11
+ Registry.pipeline.registerStage({
12
+ provides: 'resizeServerGroup',
13
+ alias: 'resizeAsg',
14
+ cloudProvider: 'ecs',
15
+ templateUrl: require('./resizeAsgStage.html'),
16
+ executionConfigSections: ['resizeServerGroupConfig', 'taskStatus'],
17
+ executionStepLabelUrl: require('./resizeAsgStepLabel.html'),
18
+ accountExtractor: (stage) => [stage.context.credentials],
19
+ configAccountExtractor: (stage) => [stage.credentials],
20
+ validators: [
21
+ {
22
+ type: 'targetImpedance',
23
+ message:
24
+ 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',
25
+ },
26
+ { type: 'requiredField', fieldName: 'target' },
27
+ { type: 'requiredField', fieldName: 'action' },
28
+ { type: 'requiredField', fieldName: 'regions' },
29
+ { type: 'requiredField', fieldName: 'cluster' },
30
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
31
+ ],
32
+ });
33
+ })
34
+ .controller('ecsResizeAsgStageCtrl', [
35
+ '$scope',
36
+ function ($scope) {
37
+ const ctrl = this;
38
+
39
+ const stage = $scope.stage;
40
+
41
+ $scope.viewState = {
42
+ accountsLoaded: false,
43
+ regionsLoaded: false,
44
+ };
45
+
46
+ AccountService.listAccounts('ecs').then(function (accounts) {
47
+ $scope.accounts = accounts;
48
+ $scope.viewState.accountsLoaded = true;
49
+ });
50
+
51
+ $scope.resizeTargets = StageConstants.TARGET_LIST;
52
+
53
+ $scope.scaleActions = [
54
+ {
55
+ label: 'Scale Up',
56
+ val: 'scale_up',
57
+ },
58
+ {
59
+ label: 'Scale Down',
60
+ val: 'scale_down',
61
+ },
62
+ {
63
+ label: 'Scale to Cluster Size',
64
+ val: 'scale_to_cluster',
65
+ },
66
+ {
67
+ label: 'Scale to Exact Size',
68
+ val: 'scale_exact',
69
+ },
70
+ ];
71
+
72
+ $scope.resizeTypes = [
73
+ {
74
+ label: 'Percentage',
75
+ val: 'pct',
76
+ },
77
+ {
78
+ label: 'Incremental',
79
+ val: 'incr',
80
+ },
81
+ ];
82
+
83
+ stage.capacity = stage.capacity || {};
84
+ stage.regions = stage.regions || [];
85
+ stage.target = stage.target || $scope.resizeTargets[0].val;
86
+ stage.action = stage.action || $scope.scaleActions[0].val;
87
+ stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;
88
+ if (stage.targetHealthyDeployPercentage === undefined) {
89
+ stage.targetHealthyDeployPercentage = 100;
90
+ }
91
+ if (!stage.action && stage.resizeType === 'exact') {
92
+ stage.action = 'scale_exact';
93
+ }
94
+ stage.cloudProvider = 'ecs';
95
+
96
+ if (
97
+ stage.isNew &&
98
+ $scope.application.attributes.platformHealthOnlyShowOverride &&
99
+ $scope.application.attributes.platformHealthOnly
100
+ ) {
101
+ stage.interestingHealthProviderNames = ['Ecs'];
102
+ }
103
+
104
+ if (!stage.credentials && $scope.application.defaultCredentials.ecs) {
105
+ stage.credentials = $scope.application.defaultCredentials.ecs;
106
+ }
107
+ if (!stage.regions.length && $scope.application.defaultRegions.ecs) {
108
+ stage.regions.push($scope.application.defaultRegions.ecs);
109
+ }
110
+
111
+ ctrl.updateResizeType = function () {
112
+ if (stage.action === 'scale_exact') {
113
+ stage.resizeType = 'exact';
114
+ delete stage.scalePct;
115
+ delete stage.scaleNum;
116
+ } else {
117
+ stage.capacity = {};
118
+ if (stage.resizeType === 'pct') {
119
+ delete stage.scaleNum;
120
+ } else {
121
+ stage.resizeType = 'incr';
122
+ delete stage.scalePct;
123
+ stage.scaleNum = stage.scaleNum || 0;
124
+ }
125
+ }
126
+ };
127
+ },
128
+ ]);
@@ -0,0 +1,87 @@
1
+ <div ng-controller="ecsResizeAsgStageCtrl as resizeAsgStageCtrl">
2
+ <div ng-if="!pipeline.strategy">
3
+ <div ng-if="!viewState.accountsLoaded">
4
+ <h4 class="text-center">
5
+ <span us-spinner="{radius:20, width:6, length: 12}"></span>
6
+ </h4>
7
+ </div>
8
+ <div ng-if="viewState.accountsLoaded">
9
+ <account-region-cluster-selector application="application" component="stage" accounts="accounts">
10
+ </account-region-cluster-selector>
11
+ </div>
12
+ </div>
13
+ <stage-config-field label="Target">
14
+ <target-select model="stage" options="resizeTargets"></target-select>
15
+ </stage-config-field>
16
+ <stage-config-field label="Action" help-key="pipeline.config.resizeAsg.action">
17
+ <select
18
+ class="form-control input-sm"
19
+ required
20
+ ng-model="stage.action"
21
+ ng-change="resizeAsgStageCtrl.updateResizeType()"
22
+ ng-options="a.val as a.label for a in scaleActions"
23
+ >
24
+ <option>Select an action...</option>
25
+ </select>
26
+ </stage-config-field>
27
+ <div ng-if="stage.action !== 'scale_exact'">
28
+ <stage-config-field label="{{stage.action === 'scale_to_cluster' ? 'Additional Capacity' : 'Type'}}">
29
+ <select
30
+ class="form-control input-sm"
31
+ required
32
+ ng-model="stage.resizeType"
33
+ ng-change="resizeAsgStageCtrl.updateResizeType()"
34
+ ng-options="t.val as t.label for t in resizeTypes"
35
+ >
36
+ <option>Select an action...</option>
37
+ </select>
38
+ </stage-config-field>
39
+ <div ng-if="stage.resizeType === 'pct'">
40
+ <stage-config-field label="Resize Percentage">
41
+ <input type="number" min="0" ng-model="stage.scalePct" class="form-control input-sm" style="width: 80px" />
42
+ <div>
43
+ <em class="subinput-note"
44
+ >This is the percentage by which the target server group's capacity will be increased</em
45
+ >
46
+ </div>
47
+ </stage-config-field>
48
+ </div>
49
+ <div ng-if="stage.resizeType === 'incr'">
50
+ <stage-config-field label="Resize-by Amount">
51
+ <input type="number" min="0" ng-model="stage.scaleNum" class="form-control input-sm" style="width: 80px" />
52
+ <div>
53
+ <em class="subinput-note"
54
+ >This is the exact amount by which the target server group's capacity will be increased</em
55
+ >
56
+ </div>
57
+ </stage-config-field>
58
+ </div>
59
+ </div>
60
+ <div ng-if="stage.action === 'scale_exact'">
61
+ <stage-config-field class="small">
62
+ <div class="row">
63
+ <div class="col-md-3">Min</div>
64
+ <div class="col-md-3">Max</div>
65
+ <div class="col-md-3">Desired</div>
66
+ </div>
67
+ </stage-config-field>
68
+ <stage-config-field label="Match Capacity">
69
+ <div class="row">
70
+ <div class="col-md-3">
71
+ <input type="number" ng-model="stage.capacity.min" class="form-control input-sm" />
72
+ </div>
73
+ <div class="col-md-3">
74
+ <input type="number" ng-model="stage.capacity.max" class="form-control input-sm" />
75
+ </div>
76
+ <div class="col-md-3">
77
+ <input type="number" ng-model="stage.capacity.desired" class="form-control input-sm" />
78
+ </div>
79
+ </div>
80
+ </stage-config-field>
81
+ <stage-config-field>
82
+ <em class="subinput-note">This is the exact amount to which the target server group will be scaled</em>
83
+ </stage-config-field>
84
+ </div>
85
+ <stage-platform-health-override application="application" stage="stage" platform-health-type="'Ecs'">
86
+ </stage-platform-health-override>
87
+ </div>
@@ -0,0 +1 @@
1
+ <span class="task-label"> Resize Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ import { AccountService, Registry } from '@spinnaker/core';
6
+
7
+ export const ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE =
8
+ 'spinnaker.ecs.pipeline.stage.scaleDownClusterStage';
9
+ export const name = ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE; // for backwards compatibility
10
+ module(ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE, [])
11
+ .config(function () {
12
+ Registry.pipeline.registerStage({
13
+ provides: 'scaleDownCluster',
14
+ cloudProvider: 'ecs',
15
+ templateUrl: require('./scaleDownClusterStage.html'),
16
+ accountExtractor: (stage) => [stage.context.credentials],
17
+ configAccountExtractor: (stage) => [stage.credentials],
18
+ validators: [
19
+ { type: 'requiredField', fieldName: 'cluster' },
20
+ {
21
+ type: 'requiredField',
22
+ fieldName: 'remainingFullSizeServerGroups',
23
+ fieldLabel: 'Keep [X] full size Server Groups',
24
+ },
25
+ { type: 'requiredField', fieldName: 'regions' },
26
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
27
+ ],
28
+ strategy: true,
29
+ });
30
+ })
31
+ .controller('ecsScaleDownClusterStageCtrl', [
32
+ '$scope',
33
+ function ($scope) {
34
+ const ctrl = this;
35
+
36
+ const stage = $scope.stage;
37
+
38
+ $scope.state = {
39
+ accounts: false,
40
+ regionsLoaded: false,
41
+ };
42
+
43
+ AccountService.listAccounts('ecs').then(function (accounts) {
44
+ $scope.accounts = accounts;
45
+ $scope.state.accounts = true;
46
+ });
47
+
48
+ stage.regions = stage.regions || [];
49
+ stage.cloudProvider = 'ecs';
50
+
51
+ if (!stage.credentials && $scope.application.defaultCredentials.ecs) {
52
+ stage.credentials = $scope.application.defaultCredentials.ecs;
53
+ }
54
+ if (!stage.regions.length && $scope.application.defaultRegions.ecs) {
55
+ stage.regions.push($scope.application.defaultRegions.ecs);
56
+ }
57
+
58
+ if (stage.remainingFullSizeServerGroups === undefined) {
59
+ stage.remainingFullSizeServerGroups = 1;
60
+ }
61
+
62
+ if (stage.allowScaleDownActive === undefined) {
63
+ stage.allowScaleDownActive = false;
64
+ }
65
+
66
+ ctrl.pluralize = function (str, val) {
67
+ if (val === 1) {
68
+ return str;
69
+ }
70
+ return str + 's';
71
+ };
72
+
73
+ if (stage.preferLargerOverNewer === undefined) {
74
+ stage.preferLargerOverNewer = 'false';
75
+ }
76
+ stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();
77
+ },
78
+ ]);
@@ -0,0 +1,35 @@
1
+ <div ng-controller="ecsScaleDownClusterStageCtrl as scaleDownClusterStageCtrl" class="form-horizontal">
2
+ <div ng-if="!pipeline.strategy">
3
+ <account-region-cluster-selector application="application" component="stage" accounts="accounts">
4
+ </account-region-cluster-selector>
5
+ </div>
6
+ <stage-config-field label="Scale Down Options">
7
+ <div class="form-inline">
8
+ <p>
9
+ Keep the
10
+ <input
11
+ type="number"
12
+ min="0"
13
+ required
14
+ ng-model="stage.remainingFullSizeServerGroups"
15
+ class="form-control input-sm"
16
+ style="width: 50px"
17
+ />
18
+ <select class="form-control input-sm" ng-model="stage.preferLargerOverNewer" style="width: 100px">
19
+ <option value="true">largest</option>
20
+ <option value="false">newest</option>
21
+ </select>
22
+ {{scaleDownClusterStageCtrl.pluralize('server group', stage.remainingFullSizeServerGroups)}} at current size.
23
+ </p>
24
+ <p>The remaining server groups will be scaled down to zero instances.</p>
25
+ </div>
26
+ </stage-config-field>
27
+ <div class="form-group">
28
+ <div class="col-md-offset-3 col-md-6 checkbox">
29
+ <label>
30
+ <input type="checkbox" ng-model="stage.allowScaleDownActive" />
31
+ Allow scale down of active server groups
32
+ </label>
33
+ </div>
34
+ </div>
35
+ </div>
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ import { AccountService, Registry } from '@spinnaker/core';
6
+
7
+ export const ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE =
8
+ 'spinnaker.ecs.pipeline.stage.ecs.shrinkClusterStage';
9
+ export const name = ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE; // for backwards compatibility
10
+ module(ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE, [])
11
+ .config(function () {
12
+ Registry.pipeline.registerStage({
13
+ provides: 'shrinkCluster',
14
+ cloudProvider: 'ecs',
15
+ templateUrl: require('./shrinkClusterStage.html'),
16
+ accountExtractor: (stage) => [stage.context.credentials],
17
+ configAccountExtractor: (stage) => [stage.credentials],
18
+ validators: [
19
+ { type: 'requiredField', fieldName: 'cluster' },
20
+ { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },
21
+ { type: 'requiredField', fieldName: 'regions' },
22
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
23
+ ],
24
+ });
25
+ })
26
+ .controller('ecsShrinkClusterStageCtrl', [
27
+ '$scope',
28
+ function ($scope) {
29
+ const ctrl = this;
30
+
31
+ const stage = $scope.stage;
32
+
33
+ $scope.state = {
34
+ accounts: false,
35
+ regionsLoaded: false,
36
+ };
37
+
38
+ AccountService.listAccounts('ecs').then(function (accounts) {
39
+ $scope.accounts = accounts;
40
+ $scope.state.accounts = true;
41
+ });
42
+
43
+ stage.regions = stage.regions || [];
44
+ stage.cloudProvider = 'ecs';
45
+
46
+ if (!stage.credentials && $scope.application.defaultCredentials.ecs) {
47
+ stage.credentials = $scope.application.defaultCredentials.ecs;
48
+ }
49
+ if (!stage.regions.length && $scope.application.defaultRegions.ecs) {
50
+ stage.regions.push($scope.application.defaultRegions.ecs);
51
+ }
52
+
53
+ if (stage.shrinkToSize === undefined) {
54
+ stage.shrinkToSize = 1;
55
+ }
56
+
57
+ if (stage.allowDeleteActive === undefined) {
58
+ stage.allowDeleteActive = false;
59
+ }
60
+
61
+ ctrl.pluralize = function (str, val) {
62
+ if (val === 1) {
63
+ return str;
64
+ }
65
+ return str + 's';
66
+ };
67
+
68
+ if (stage.retainLargerOverNewer === undefined) {
69
+ stage.retainLargerOverNewer = 'false';
70
+ }
71
+ stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();
72
+ },
73
+ ]);
@@ -0,0 +1,34 @@
1
+ <div ng-controller="ecsShrinkClusterStageCtrl as shrinkClusterStageCtrl" class="form-horizontal">
2
+ <div ng-if="!pipeline.strategy">
3
+ <account-region-cluster-selector application="application" component="stage" accounts="accounts">
4
+ </account-region-cluster-selector>
5
+ </div>
6
+ <stage-config-field label="Shrink Options">
7
+ <div class="form-inline">
8
+ Shrink to
9
+ <input
10
+ type="number"
11
+ min="0"
12
+ required
13
+ ng-model="stage.shrinkToSize"
14
+ class="form-control input-sm"
15
+ style="width: 50px"
16
+ />
17
+ {{shrinkClusterStageCtrl.pluralize('server group', stage.shrinkToSize)}}, keeping the
18
+ <select class="form-control input-sm" ng-model="stage.retainLargerOverNewer" style="width: 100px">
19
+ <option value="true">largest</option>
20
+ <option value="false">newest</option>
21
+ </select>
22
+ </div>
23
+ </stage-config-field>
24
+ <div class="form-group">
25
+ <div class="col-md-offset-3 col-md-6 checkbox">
26
+ <label>
27
+ <input type="checkbox" ng-model="stage.allowDeleteActive" />
28
+ Allow deletion of active server groups
29
+ </label>
30
+ </div>
31
+ </div>
32
+ <stage-platform-health-override application="application" stage="stage" platform-health-type="'Ecs'">
33
+ </stage-platform-health-override>
34
+ </div>
@@ -0,0 +1,4 @@
1
+ export interface IPlacementStrategy {
2
+ field: string;
3
+ type: string;
4
+ }
@@ -0,0 +1,63 @@
1
+ import { module } from 'angular';
2
+
3
+ import type { IPlacementStrategy } from './IPlacementStrategy';
4
+
5
+ export class PlacementStrategyService {
6
+ public getPredefinedStrategy(strategyName: string): IPlacementStrategy[] {
7
+ if (strategyName === 'AZ Balanced Spread') {
8
+ return this.getAzBalancedSpreadStrategy();
9
+ } else if (strategyName === 'AZ Balanced BinPack' || strategyName === 'AZ Balanced BinPack Memory') {
10
+ // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear
11
+ return this.getAzBalancedMemoryBinPackStrategy();
12
+ } else if (strategyName === 'BinPack' || strategyName === 'BinPack Memory') {
13
+ // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear
14
+ return this.getBinPackMemoryStrategy();
15
+ } else if (strategyName === 'AZ Balanced BinPack CPU') {
16
+ return this.getAzBalancedCpuBinPackStrategy();
17
+ } else if (strategyName === 'BinPack CPU') {
18
+ return this.getBinPackCpuStrategy();
19
+ } else if (strategyName === 'One Task Per Host') {
20
+ return this.getOneTaskPerHostStrategy();
21
+ } else {
22
+ // TODO: Add support for custom placement strategy.
23
+ return [];
24
+ }
25
+ }
26
+
27
+ public getAzBalancedSpreadStrategy(): IPlacementStrategy[] {
28
+ return [
29
+ { type: 'spread', field: 'attribute:ecs.availability-zone' },
30
+ { type: 'spread', field: 'instanceId' },
31
+ ];
32
+ }
33
+
34
+ public getAzBalancedMemoryBinPackStrategy(): IPlacementStrategy[] {
35
+ return [
36
+ { type: 'spread', field: 'attribute:ecs.availability-zone' },
37
+ { type: 'binpack', field: 'memory' },
38
+ ];
39
+ }
40
+
41
+ public getBinPackMemoryStrategy(): IPlacementStrategy[] {
42
+ return [{ type: 'binpack', field: 'memory' }];
43
+ }
44
+
45
+ public getAzBalancedCpuBinPackStrategy(): IPlacementStrategy[] {
46
+ return [
47
+ { type: 'spread', field: 'attribute:ecs.availability-zone' },
48
+ { type: 'binpack', field: 'cpu' },
49
+ ];
50
+ }
51
+
52
+ public getBinPackCpuStrategy(): IPlacementStrategy[] {
53
+ return [{ type: 'binpack', field: 'cpu' }];
54
+ }
55
+
56
+ public getOneTaskPerHostStrategy(): IPlacementStrategy[] {
57
+ return [{ type: 'spread', field: 'instanceId' }];
58
+ }
59
+ }
60
+
61
+ export const PLACEMENT_STRATEGY_SERVICE = 'spinnaker.ecs.placementStrategyService.service';
62
+
63
+ module(PLACEMENT_STRATEGY_SERVICE, []).service('placementStrategyService', PlacementStrategyService);
@@ -0,0 +1,5 @@
1
+ export interface ISecretDescriptor {
2
+ account: string;
3
+ region: string;
4
+ name: string;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { module } from 'angular';
2
+
3
+ import { REST } from '@spinnaker/core';
4
+ import type { ISecretDescriptor } from './ISecret';
5
+
6
+ export class SecretReader {
7
+ public listSecrets(): PromiseLike<ISecretDescriptor[]> {
8
+ return REST('/ecs/secrets').get();
9
+ }
10
+ }
11
+
12
+ export const ECS_SECRET_READ_SERVICE = 'spinnaker.ecs.secret.read.service';
13
+
14
+ module(ECS_SECRET_READ_SERVICE, []).service('secretReader', SecretReader);