@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,216 @@
1
+ <div class="details-panel" ng-class="{ disabled: ctrl.serverGroup.isDisabled }">
2
+ <div class="header" ng-if="ctrl.state.loading">
3
+ <div class="close-button">
4
+ <a class="btn btn-link" ui-sref="^">
5
+ <span class="glyphicon glyphicon-remove"></span>
6
+ </a>
7
+ </div>
8
+ <h4 class="text-center">
9
+ <span us-spinner="{radius:20, width:6, length: 12}"></span>
10
+ </h4>
11
+ </div>
12
+
13
+ <div class="header" ng-if="!ctrl.state.loading">
14
+ <div class="close-button">
15
+ <a class="btn btn-link" ui-sref="^">
16
+ <span class="glyphicon glyphicon-remove"></span>
17
+ </a>
18
+ </div>
19
+ <div class="header-text horizontal middle">
20
+ <cloud-provider-logo provider="ctrl.serverGroup.type" height="'36px'" width="'36px'"></cloud-provider-logo>
21
+ <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>
22
+ {{ctrl.serverGroup.name}}
23
+ <render-if-feature feature="entityTags">
24
+ <entity-notifications
25
+ entity="ctrl.serverGroup"
26
+ application="ctrl.application"
27
+ placement="bottom"
28
+ h-offset-percent="90%"
29
+ entity-type="serverGroup"
30
+ page-location="details"
31
+ on-update="ctrl.application.serverGroups.refresh()"
32
+ ></entity-notifications>
33
+ </render-if-feature>
34
+ </h3>
35
+ </div>
36
+ <div>
37
+ <div class="actions" ng-class="{ insights: ctrl.serverGroup.insightActions.length > 0 }">
38
+ <div class="dropdown" uib-dropdown dropdown-append-to-body>
39
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>
40
+ Server Group Actions <span class="caret"></span>
41
+ </button>
42
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
43
+ <li><a href ng-if=" !ctrl.serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>
44
+ <li role="presentation" class="divider" ng-if=" !ctrl.serverGroup.isDisabled"></li>
45
+ <li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>
46
+ <li><a href ng-if=" !ctrl.serverGroup.isDisabled" ng-click="ctrl.disableServerGroup()">Disable</a></li>
47
+ <li>
48
+ <a href ng-if="ctrl.serverGroup.isDisabled && !ctrl.isEnableLocked()" ng-click="ctrl.enableServerGroup()"
49
+ >Enable</a
50
+ >
51
+ </li>
52
+ <li class="disabled" ng-if="ctrl.isEnableLocked()">
53
+ <a
54
+ uib-tooltip="Cannot enable this server group until resize operation completes"
55
+ tooltip-placement="left"
56
+ >
57
+ <span class="small glyphicon glyphicon-lock"></span>
58
+ Enable
59
+ </a>
60
+ </li>
61
+ <li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>
62
+ <li><migrator application="ctrl.application" server-group="ctrl.serverGroup"></migrator></li>
63
+ <render-if-feature feature="entityTags">
64
+ <add-entity-tag-links
65
+ component="ctrl.serverGroup"
66
+ application="ctrl.application"
67
+ entity-type="serverGroup"
68
+ owner-options="ctrl.entityTagTargets"
69
+ on-update="ctrl.application.serverGroups.refresh"
70
+ ></add-entity-tag-links>
71
+ </render-if-feature>
72
+ </ul>
73
+ </div>
74
+ <div class="dropdown" ng-if="ctrl.serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>
75
+ <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>
76
+ Insight <span class="caret"></span>
77
+ </button>
78
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
79
+ <li ng-repeat="action in ctrl.serverGroup.insightActions">
80
+ <a target="_blank" href="{{action.url}}">{{action.label}}</a>
81
+ </li>
82
+ </ul>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ <div class="band band-info" ng-if="ctrl.serverGroup.isDisabled">Disabled {{ctrl.disabledDate | timestamp}}</div>
88
+ <div class="content" ng-if="!ctrl.state.loading">
89
+ <server-group-running-tasks-details
90
+ server-group="ctrl.serverGroup"
91
+ application="ctrl.application"
92
+ ></server-group-running-tasks-details>
93
+ <collapsible-section heading="General" expanded="true">
94
+ <dl class="dl-horizontal dl-narrow">
95
+ <dt>Created</dt>
96
+ <dd>{{ctrl.serverGroup.createdTime | timestamp}}</dd>
97
+ <render-if-feature feature="entityTags">
98
+ <entity-source metadata="ctrl.serverGroup.entityTags.creationMetadata"></entity-source>
99
+ <view-changes-link
100
+ change-config="ctrl.changeConfig"
101
+ jar-diffs="ctrl.jarDiffs"
102
+ link-text="view changes"
103
+ name-item="ctrl.serverGroup"
104
+ ></view-changes-link>
105
+ </render-if-feature>
106
+ <dt>In</dt>
107
+ <dd>
108
+ <account-tag account="ctrl.serverGroup.account" pad="right"></account-tag>
109
+ <br />
110
+ {{ctrl.serverGroup.region}}
111
+ </dd>
112
+ <dt>ECS Cluster</dt>
113
+ <dd>{{ctrl.serverGroup.ecsCluster}}</dd>
114
+ <dt>VPC ID</dt>
115
+ <dd>{{ctrl.serverGroup.vpcId}}</dd>
116
+ </dl>
117
+ </collapsible-section>
118
+ <collapsible-section heading="Definitions" expanded="true">
119
+ <dl class="horizontal-when-filters-collapsed">
120
+ <dt>Task Name</dt>
121
+ <dd>{{ctrl.serverGroup.taskDefinition.taskName}}</dd>
122
+
123
+ <dt>Container URL</dt>
124
+ <dd>{{ctrl.serverGroup.taskDefinition.containerImage}}</dd>
125
+
126
+ <dt>Container IAM Profile</dt>
127
+ <dd>{{ctrl.serverGroup.taskDefinition.iamRole}}</dd>
128
+
129
+ <dt ng-if="ctrl.serverGroup.taskDefinition.containerPort">Container Port</dt>
130
+ <dd ng-if="ctrl.serverGroup.taskDefinition.containerPort">{{ctrl.serverGroup.taskDefinition.containerPort}}</dd>
131
+
132
+ <dt>Container CPU Units</dt>
133
+ <dd>{{ctrl.serverGroup.taskDefinition.cpuUnits}}</dd>
134
+
135
+ <dt ng-if="ctrl.serverGroup.taskDefinition.memoryReservation">Container Reserved Memory</dt>
136
+ <dd ng-if="ctrl.serverGroup.taskDefinition.memoryReservation">
137
+ {{ctrl.serverGroup.taskDefinition.memoryReservation}} mb
138
+ </dd>
139
+
140
+ <dt ng-if="ctrl.serverGroup.taskDefinition.memoryLimit">Container Memory Limit</dt>
141
+ <dd ng-if="ctrl.serverGroup.taskDefinition.memoryLimit">{{ctrl.serverGroup.taskDefinition.memoryLimit}} mb</dd>
142
+ </dl>
143
+ </collapsible-section>
144
+ <collapsible-section heading="Environment Variables" expanded="false">
145
+ <div ng-if="!ctrl.serverGroup.taskDefinition.environmentVariables.length">
146
+ This server group has no environment variables
147
+ </div>
148
+ <dl ng-if="ctrl.serverGroup.taskDefinition.environmentVariables.length">
149
+ <dt ng-repeat-start="variable in ctrl.serverGroup.taskDefinition.environmentVariables">{{variable.name}}</dt>
150
+ <dd ng-repeat-end>{{variable.value}}</dd>
151
+ </dl>
152
+ </collapsible-section>
153
+ <collapsible-section heading="Health" expanded="true" ng-if="ctrl.serverGroup.instanceCounts.total > 0">
154
+ <dl class="dl-horizontal dl-narrow" ng-if="ctrl.serverGroup">
155
+ <dt>Instances</dt>
156
+ <dd>
157
+ <health-counts container="ctrl.serverGroup.instanceCounts" class="pull-left"></health-counts>
158
+ </dd>
159
+ </dl>
160
+ </collapsible-section>
161
+ <collapsible-section heading="{{ctrl.firewallsLabel}}" expanded="false">
162
+ <ul>
163
+ <li ng-repeat="securityGroup in ctrl.serverGroup.securityGroups">{{securityGroup}}</li>
164
+ </ul>
165
+ </collapsible-section>
166
+ <collapsible-section heading="Capacity" expanded="false">
167
+ <dl class="dl-horizontal dl-narrow">
168
+ <dt>Current</dt>
169
+ <dd>{{ctrl.serverGroup.instances.length}}</dd>
170
+
171
+ <dt>Desired</dt>
172
+ <dd>{{ctrl.serverGroup.capacity.desired}}</dd>
173
+
174
+ <dt>Min</dt>
175
+ <dd>{{ctrl.serverGroup.capacity.min}}</dd>
176
+
177
+ <dt>Max</dt>
178
+ <dd>{{ctrl.serverGroup.capacity.max}}</dd>
179
+ </dl>
180
+ </collapsible-section>
181
+ <collapsible-section heading="Scaling Policies" expanded="false">
182
+ <dl class="horizontal-when-filters-collapsed">
183
+ <dd
184
+ ng-if="ctrl.serverGroup.metricAlarms.length > 0"
185
+ ng-repeat="metricAlarmName in ctrl.serverGroup.metricAlarms"
186
+ >
187
+ {{metricAlarmName}}
188
+ </dd>
189
+ <dd ng-if="ctrl.serverGroup.metricAlarms.length <= 0"><i>There are no scaling policies assigned.</i></dd>
190
+ </dl>
191
+ </collapsible-section>
192
+ <collapsible-section heading="Build data" ng-if="ctrl.serverGroup.buildInfo && ctrl.serverGroup.buildInfo.jenkins">
193
+ <dl class="horizontal-when-filters-collapsed">
194
+ <dt>Job</dt>
195
+ <dd>{{ctrl.serverGroup.buildInfo.jenkins.name}}</dd>
196
+ <dt>Package</dt>
197
+ <dd>{{ctrl.serverGroup.buildInfo.package_name}}</dd>
198
+ <dt>Build</dt>
199
+ <dd>{{ctrl.serverGroup.buildInfo.jenkins.number}}</dd>
200
+ <dt>Commit</dt>
201
+ <dd>{{ctrl.truncateCommitHash()}}</dd>
202
+ <dt>Version</dt>
203
+ <dd>{{ctrl.serverGroup.buildInfo.version}}</dd>
204
+ <dt>Build Link</dt>
205
+ <dd><a target="_blank" href="{{ctrl.buildJenkinsLink()}}">{{ctrl.buildJenkinsLink()}}</a></dd>
206
+ </dl>
207
+ </collapsible-section>
208
+ <collapsible-section heading="Server Group Logs">
209
+ <ul>
210
+ <li>
211
+ <view-events-link server-group="ctrl.serverGroup"></view-events-link>
212
+ </li>
213
+ </ul>
214
+ </collapsible-section>
215
+ </div>
216
+ </div>
@@ -0,0 +1,5 @@
1
+ import { module } from 'angular';
2
+ import { ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER } from './serverGroupDetails.ecs.controller';
3
+
4
+ export const SERVER_GROUP_DETAILS_MODULE = 'spinnaker.ecs.serverGroup.details';
5
+ module(SERVER_GROUP_DETAILS_MODULE, [ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER]);
@@ -0,0 +1,5 @@
1
+ import type { IServerGroup } from '@spinnaker/core';
2
+
3
+ export interface IViewScalingActivitiesLinkProps {
4
+ serverGroup: IServerGroup;
5
+ }
@@ -0,0 +1,35 @@
1
+ import type { IComponentOptions, IController } from 'angular';
2
+ import { module } from 'angular';
3
+ import type { IModalService } from 'angular-ui-bootstrap';
4
+
5
+ import { EVENTS_CTRL, EventsController } from './events.controller';
6
+
7
+ class ViewEventsLinkCtrl implements IController {
8
+ public serverGroup: any;
9
+
10
+ public static $inject = ['$uibModal'];
11
+ public constructor(private $uibModal: IModalService) {}
12
+
13
+ public showEvents(): void {
14
+ this.$uibModal.open({
15
+ templateUrl: require('./events.html'),
16
+ controller: EventsController,
17
+ controllerAs: '$ctrl',
18
+ windowClass: 'modal-z-index',
19
+ resolve: {
20
+ serverGroup: () => this.serverGroup,
21
+ },
22
+ });
23
+ }
24
+ }
25
+
26
+ export const viewEventsLink: IComponentOptions = {
27
+ bindings: {
28
+ serverGroup: '<',
29
+ },
30
+ controller: ViewEventsLinkCtrl,
31
+ template: `<a href ng-click="$ctrl.showEvents()">View Events</a>`,
32
+ };
33
+
34
+ export const VIEW_EVENTS_LINK_COMPONENT = 'spinnaker.ecs.serverGroup.details.viewEvents.link';
35
+ module(VIEW_EVENTS_LINK_COMPONENT, [EVENTS_CTRL]).component('viewEventsLink', viewEventsLink);
@@ -0,0 +1,45 @@
1
+ import type { IController } from 'angular';
2
+ import { module } from 'angular';
3
+ import type { IModalServiceInstance } from 'angular-ui-bootstrap';
4
+
5
+ import type { IServerGroup } from '@spinnaker/core';
6
+
7
+ import type { IEventDescription } from './serverGroupEventsReader.service';
8
+ import { ServerGroupEventsReader } from './serverGroupEventsReader.service';
9
+
10
+ export interface IScalingActivitiesViewState {
11
+ loading: boolean;
12
+ error: boolean;
13
+ }
14
+
15
+ export class EventsController implements IController {
16
+ public viewState: IScalingActivitiesViewState;
17
+ public events: IEventDescription[] = [];
18
+
19
+ public static $inject = ['$uibModalInstance', 'serverGroup'];
20
+ public constructor(private $uibModalInstance: IModalServiceInstance, public serverGroup: IServerGroup) {}
21
+
22
+ public $onInit(): void {
23
+ this.viewState = {
24
+ loading: true,
25
+ error: false,
26
+ };
27
+
28
+ ServerGroupEventsReader.getEvents(this.serverGroup).then(
29
+ (rawEvents: IEventDescription[]) => {
30
+ this.viewState.loading = false;
31
+ this.events = rawEvents;
32
+ },
33
+ () => {
34
+ this.viewState.error = true;
35
+ },
36
+ );
37
+ }
38
+
39
+ public close(): void {
40
+ this.$uibModalInstance.close();
41
+ }
42
+ }
43
+
44
+ export const EVENTS_CTRL = 'spinnaker.ecs.serverGroup.events.controller';
45
+ module(EVENTS_CTRL, []).controller('EventsController', EventsController);
@@ -0,0 +1,36 @@
1
+ <div modal-page>
2
+ <modal-close dismiss="$ctrl.close()"></modal-close>
3
+ <div class="modal-header">
4
+ <h4 class="modal-title">Server Group Events for {{$ctrl.serverGroup.name}}</h4>
5
+ </div>
6
+ <div class="modal-body">
7
+ <div class="loading" ng-if="$ctrl.viewState.loading">
8
+ <loading-spinner size="'small'"></loading-spinner>
9
+ </div>
10
+ <div ng-if="$ctrl.viewState.error" class="text-center">
11
+ <p>There was an error loading events for {{$ctrl.serverGroup.name}}. Please try again later.</p>
12
+ </div>
13
+ <div ng-if="!$ctrl.viewState.loading && !$ctrl.viewState.error && !$ctrl.events.length" class="text-center">
14
+ <p>No scaling events found for {{$ctrl.serverGroup.name}}.</p>
15
+ </div>
16
+
17
+ <div ng-repeat="event in $ctrl.events" ng-if="!$ctrl.viewState.loading">
18
+ <p class="clearfix"></p>
19
+ <div ng-if="event.status === 'Success'">
20
+ <span class="label label-success pull-left">{{event.status}}</span>
21
+ </div>
22
+ <div ng-if="event.status !== 'Success'">
23
+ <span class="label label-{{event.status === 'Transition' ? 'info' : 'danger'}} pull-left"
24
+ >{{event.status}}</span
25
+ >
26
+ </div>
27
+
28
+ <span class="label label-default pull-right">{{event.createdAt | timestamp}}</span>
29
+ <div>{{event.message}}</div>
30
+ <hr ng-if="!$last" />
31
+ </div>
32
+ </div>
33
+ <div class="modal-footer">
34
+ <button class="btn btn-primary" ng-click="$ctrl.close()">Close</button>
35
+ </div>
36
+ </div>
@@ -0,0 +1,27 @@
1
+ import { $log } from 'ngimport';
2
+
3
+ import type { IServerGroup } from '@spinnaker/core';
4
+ import { REST } from '@spinnaker/core';
5
+
6
+ export interface IEventDescription {
7
+ createdAt: number;
8
+ message: string;
9
+ id: string;
10
+ status: string;
11
+ }
12
+
13
+ export class ServerGroupEventsReader {
14
+ public static getEvents(serverGroup: IServerGroup): PromiseLike<IEventDescription[]> {
15
+ return REST('/applications')
16
+ .path(serverGroup.app, 'serverGroups', serverGroup.account, serverGroup.name, 'events')
17
+ .query({
18
+ region: serverGroup.region,
19
+ provider: serverGroup.cloudProvider,
20
+ })
21
+ .get()
22
+ .catch((error: any): any[] => {
23
+ $log.error(error, 'error retrieving events');
24
+ return [];
25
+ });
26
+ }
27
+ }
@@ -0,0 +1,6 @@
1
+ import { module } from 'angular';
2
+
3
+ import { VIEW_EVENTS_LINK_COMPONENT } from './events/events.component';
4
+
5
+ export const ECS_SERVERGROUP_MODULE = 'spinnaker.ecs.serverGroup';
6
+ module(ECS_SERVERGROUP_MODULE, [VIEW_EVENTS_LINK_COMPONENT]);
@@ -0,0 +1,184 @@
1
+ import type { IQService, IRootScopeService, IScope } from 'angular';
2
+ import { mock } from 'angular';
3
+
4
+ import type { IAmazonServerGroup, IScalingPolicyAlarmView, IStepAdjustment } from '@spinnaker/amazon';
5
+ import { VpcReader } from '@spinnaker/amazon';
6
+
7
+ import type { EcsServerGroupTransformer } from './serverGroup.transformer';
8
+ import { ECS_SERVER_GROUP_TRANSFORMER } from './serverGroup.transformer';
9
+
10
+ describe('ecsServerGroupTransformer', () => {
11
+ let transformer: EcsServerGroupTransformer, $q: IQService, $scope: IScope;
12
+
13
+ beforeEach(mock.module(ECS_SERVER_GROUP_TRANSFORMER));
14
+
15
+ beforeEach(
16
+ mock.inject(
17
+ (_ecsServerGroupTransformer_: EcsServerGroupTransformer, _$q_: IQService, $rootScope: IRootScopeService) => {
18
+ transformer = _ecsServerGroupTransformer_;
19
+ $q = _$q_;
20
+ $scope = $rootScope.$new();
21
+ },
22
+ ),
23
+ );
24
+
25
+ describe('normalize server group', () => {
26
+ beforeEach(() => {
27
+ spyOn(VpcReader, 'listVpcs').and.returnValue(
28
+ $q.when([{ account: 'test', region: 'us-east-1', id: 'vpc-1', name: 'main' } as any]),
29
+ );
30
+ });
31
+
32
+ it('adds vpc name to server group', () => {
33
+ const serverGroup = {
34
+ account: 'test',
35
+ region: 'us-east-1',
36
+ vpcId: 'vpc-1',
37
+ instances: [],
38
+ } as IAmazonServerGroup;
39
+ transformer.normalizeServerGroup(serverGroup);
40
+ $scope.$digest();
41
+ expect(serverGroup.vpcName).toBe('main');
42
+ });
43
+
44
+ it('adds empty vpc name when no vpcId found on server group', () => {
45
+ const serverGroup = {
46
+ account: 'test',
47
+ region: 'us-east-1',
48
+ instances: [],
49
+ } as IAmazonServerGroup;
50
+ transformer.normalizeServerGroup(serverGroup);
51
+ $scope.$digest();
52
+ expect(serverGroup.vpcName).toBe('');
53
+ });
54
+ });
55
+
56
+ describe('command transforms', () => {
57
+ it('sets subnetType property to empty string when null', () => {
58
+ const command: any = {
59
+ viewState: {
60
+ mode: 'create',
61
+ useAllImageSelection: true,
62
+ allImageSelection: 'something-packagebase',
63
+ },
64
+ subnetType: null,
65
+ application: { name: 'theApp' },
66
+ };
67
+
68
+ let transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
69
+ expect(transformed.subnetType).toBe('');
70
+
71
+ command.subnetType = 'internal';
72
+ transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
73
+ expect(transformed.subnetType).toBe('internal');
74
+ });
75
+ });
76
+
77
+ describe('normalize server group details', () => {
78
+ it('adds appropriate comparator to alarm', () => {
79
+ const serverGroup = {
80
+ scalingPolicies: [
81
+ {
82
+ alarms: [
83
+ { comparisonOperator: 'LessThanThreshold' },
84
+ { comparisonOperator: 'GreaterThanThreshold' },
85
+ { comparisonOperator: 'LessThanOrEqualToThreshold' },
86
+ { comparisonOperator: 'GreaterThanOrEqualToThreshold' },
87
+ { comparisonOperator: 'WhatIsThis' },
88
+ ],
89
+ },
90
+ ],
91
+ } as IAmazonServerGroup;
92
+ transformer.normalizeServerGroupDetails(serverGroup);
93
+ const alarms = serverGroup.scalingPolicies[0].alarms as IScalingPolicyAlarmView[];
94
+ expect(alarms.map((a) => a.comparator)).toEqual(['&lt;', '&gt;', '&le;', '&ge;', undefined]);
95
+ });
96
+
97
+ it('adds operator, absAdjustment to simple policies', () => {
98
+ const serverGroup = {
99
+ scalingPolicies: [{ scalingAdjustment: 10 }, { scalingAdjustment: 0 }, { scalingAdjustment: -5 }],
100
+ } as IAmazonServerGroup;
101
+ const transformed = transformer.normalizeServerGroupDetails(serverGroup);
102
+ const policies = transformed.scalingPolicies;
103
+ expect(policies.map((a) => a.absAdjustment)).toEqual([10, 0, 5]);
104
+ expect(policies.map((a) => a.operator)).toEqual(['increase', 'increase', 'decrease']);
105
+ });
106
+
107
+ it('adds operator, absAdjustment to step policies', () => {
108
+ const serverGroup = {
109
+ scalingPolicies: [
110
+ {
111
+ stepAdjustments: [
112
+ { scalingAdjustment: 10, metricIntervalLowerBound: 0 },
113
+ { scalingAdjustment: 0, metricIntervalLowerBound: 6 },
114
+ { scalingAdjustment: -5, metricIntervalLowerBound: 11 },
115
+ ],
116
+ },
117
+ ],
118
+ } as IAmazonServerGroup;
119
+ const transformed = transformer.normalizeServerGroupDetails(serverGroup);
120
+ const steps = transformed.scalingPolicies[0].stepAdjustments;
121
+ expect(steps.map((a) => a.absAdjustment)).toEqual([10, 0, 5]);
122
+ expect(steps.map((a) => a.operator)).toEqual(['increase', 'increase', 'decrease']);
123
+ });
124
+
125
+ describe('sorting step adjustments', () => {
126
+ beforeEach(function () {
127
+ this.test = (steps: IStepAdjustment[], expected: any[]) => {
128
+ const serverGroup = {
129
+ scalingPolicies: [
130
+ {
131
+ stepAdjustments: steps,
132
+ },
133
+ ],
134
+ } as IAmazonServerGroup;
135
+ transformer.normalizeServerGroupDetails(serverGroup);
136
+ const check = serverGroup.scalingPolicies[0].stepAdjustments;
137
+ expect(check.map((s) => s.scalingAdjustment)).toEqual(expected);
138
+ };
139
+ });
140
+
141
+ it('reverse sorts step adjustments by lower bound when none have an upper bound defined', function () {
142
+ this.test(
143
+ [
144
+ { scalingAdjustment: 10, metricIntervalLowerBound: 3 },
145
+ { scalingAdjustment: 0, metricIntervalLowerBound: 5 },
146
+ { scalingAdjustment: -5, metricIntervalLowerBound: 1 },
147
+ ],
148
+ [-5, 10, 0],
149
+ );
150
+ });
151
+
152
+ it('reverse sorts step adjustments by lower bound when some do not have an upper bound defined', function () {
153
+ this.test(
154
+ [
155
+ { id: 1, scalingAdjustment: 10, metricIntervalLowerBound: 3, metricIntervalUpperBound: 5 },
156
+ { id: 2, scalingAdjustment: 0, metricIntervalLowerBound: 5 },
157
+ { id: 3, scalingAdjustment: -5, metricIntervalLowerBound: 1, metricIntervalUpperBound: 3 },
158
+ ],
159
+ [-5, 10, 0],
160
+ );
161
+ });
162
+ it('verify float adjustments work within the range', function () {
163
+ this.test(
164
+ [
165
+ { id: 1, scalingAdjustment: 10, metricIntervalLowerBound: 3.5, metricIntervalUpperBound: 5.5 },
166
+ { id: 2, scalingAdjustment: 0, metricIntervalLowerBound: 5.5 },
167
+ { id: 3, scalingAdjustment: -5, metricIntervalLowerBound: 1.2, metricIntervalUpperBound: 3.5 },
168
+ ],
169
+ [-5, 10, 0],
170
+ );
171
+ });
172
+ it('reverse sorts step adjustments by upper bound when all have an upper bound defined', function () {
173
+ this.test(
174
+ [
175
+ { id: 1, scalingAdjustment: 10, metricIntervalLowerBound: 3, metricIntervalUpperBound: 5 },
176
+ { id: 2, scalingAdjustment: 0, metricIntervalLowerBound: 5, metricIntervalUpperBound: 9 },
177
+ { id: 3, scalingAdjustment: -5, metricIntervalLowerBound: 1, metricIntervalUpperBound: 0 },
178
+ ],
179
+ [0, 10, -5],
180
+ );
181
+ });
182
+ });
183
+ });
184
+ });