@spinnaker/ecs 2026.2.4 → 2026.3.1

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 (209) hide show
  1. package/dist/ecs.module.d.ts +3 -1
  2. package/dist/ecsCluster/ecsCluster.read.service.d.ts +2 -3
  3. package/dist/iamRoles/iamRole.read.service.d.ts +1 -2
  4. package/dist/index.d.ts +5 -0
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/instance/details/EcsInstanceDetails.d.ts +50 -0
  8. package/dist/loadBalancer/loadBalancer.transformer.d.ts +1 -5
  9. package/dist/loadBalancer/targetGroup.states.d.ts +2 -1
  10. package/dist/metricAlarm/metricAlarm.read.service.d.ts +1 -2
  11. package/dist/pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage.d.ts +1 -0
  12. package/dist/pipeline/stages/common/EcsServerGroupStepLabel.d.ts +7 -0
  13. package/dist/pipeline/stages/common/EcsStageConfigs.d.ts +11 -0
  14. package/dist/pipeline/stages/destroyAsg/ecsDestroyAsgStage.d.ts +1 -2
  15. package/dist/pipeline/stages/disableAsg/ecsDisableAsgStage.d.ts +1 -2
  16. package/dist/pipeline/stages/disableCluster/ecsDisableClusterStage.d.ts +1 -2
  17. package/dist/pipeline/stages/enableAsg/ecsEnableAsgStage.d.ts +1 -2
  18. package/dist/pipeline/stages/findImageFromTags/EcsFindImageFromTagsExecutionDetails.d.ts +5 -0
  19. package/dist/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.d.ts +1 -2
  20. package/dist/pipeline/stages/resizeAsg/ecsResizeAsgStage.d.ts +1 -2
  21. package/dist/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.d.ts +1 -2
  22. package/dist/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.d.ts +1 -2
  23. package/dist/placementStrategy/placementStrategy.service.d.ts +0 -1
  24. package/dist/secrets/secret.read.service.d.ts +1 -2
  25. package/dist/securityGroup/details/EcsSecurityGroupDetails.d.ts +45 -0
  26. package/dist/securityGroup/securityGroup.reader.d.ts +0 -1
  27. package/dist/securityGroup/securityGroup.transformer.d.ts +3 -2
  28. package/dist/serverGroup/configure/dockerImage.util.d.ts +3 -0
  29. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +111 -2
  30. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +13 -63
  31. package/dist/serverGroup/configure/wizard/EcsCloneServerGroupModal.d.ts +64 -0
  32. package/dist/serverGroup/configure/wizard/capacityProvider/CapacityProvider.d.ts +29 -4
  33. package/dist/serverGroup/configure/wizard/container/Container.d.ts +3 -3
  34. package/dist/serverGroup/configure/wizard/networking/Networking.d.ts +3 -3
  35. package/dist/serverGroup/configure/wizard/pages/AdvancedSettings.d.ts +3 -0
  36. package/dist/serverGroup/configure/wizard/pages/BasicSettings.d.ts +3 -0
  37. package/dist/serverGroup/configure/wizard/pages/ContainerSettings.d.ts +3 -0
  38. package/dist/serverGroup/configure/wizard/pages/HorizontalScalingSettings.d.ts +3 -0
  39. package/dist/serverGroup/configure/wizard/pages/LoggingSettings.d.ts +3 -0
  40. package/dist/serverGroup/configure/wizard/pages/NetworkingSettings.d.ts +3 -0
  41. package/dist/serverGroup/configure/wizard/pages/ServiceDiscoverySettings.d.ts +3 -0
  42. package/dist/serverGroup/configure/wizard/pages/TaskDefinitionSettings.d.ts +3 -0
  43. package/dist/serverGroup/configure/wizard/pages/common.d.ts +8 -0
  44. package/dist/serverGroup/configure/wizard/pages/validation.d.ts +22 -0
  45. package/dist/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.d.ts +5 -3
  46. package/dist/serverGroup/configure/wizard/taskDefinition/TaskDefinition.d.ts +3 -3
  47. package/dist/serverGroup/details/EcsServerGroupActions.d.ts +6 -0
  48. package/dist/serverGroup/details/ecsServerGroupDetailsGetter.d.ts +3 -0
  49. package/dist/serverGroup/details/resize/EcsResizeServerGroupModal.d.ts +43 -0
  50. package/dist/serverGroup/details/resize/index.d.ts +1 -0
  51. package/dist/serverGroup/details/rollback/EcsRollbackServerGroupModal.d.ts +46 -0
  52. package/dist/serverGroup/details/rollback/index.d.ts +1 -0
  53. package/dist/serverGroup/details/sections/EcsServerGroupDetailsSections.d.ts +9 -0
  54. package/dist/serverGroup/details/sections/EcsServerGroupEventsSection.d.ts +3 -0
  55. package/dist/serverGroup/details/sections/EcsServerGroupInformationSection.d.ts +3 -0
  56. package/dist/serverGroup/events/EcsServerGroupEventsModal.d.ts +22 -0
  57. package/dist/serverGroup/events/EventsLink.d.ts +2 -0
  58. package/dist/serverGroup/events/serverGroupEventsReader.service.d.ts +1 -1
  59. package/dist/serverGroup/serverGroup.transformer.d.ts +1 -2
  60. package/dist/serviceDiscovery/serviceDiscovery.read.service.d.ts +1 -1
  61. package/package.json +3 -9
  62. package/src/ecs.module.spec.ts +86 -0
  63. package/src/ecs.module.ts +68 -84
  64. package/src/ecsCluster/ecsCluster.read.service.ts +3 -9
  65. package/src/iamRoles/iamRole.read.service.ts +1 -7
  66. package/src/index.ts +6 -0
  67. package/src/instance/details/EcsInstanceDetails.spec.tsx +426 -0
  68. package/src/instance/details/EcsInstanceDetails.tsx +474 -0
  69. package/src/loadBalancer/details/loadBalancerDetails.tsx +1 -1
  70. package/src/loadBalancer/details/targetGroupDetails.tsx +1 -1
  71. package/src/loadBalancer/loadBalancer.transformer.ts +2 -7
  72. package/src/loadBalancer/targetGroup.states.ts +55 -53
  73. package/src/metricAlarm/metricAlarm.read.service.ts +1 -7
  74. package/src/pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage.js +22 -94
  75. package/src/pipeline/stages/common/EcsServerGroupStepLabel.tsx +16 -0
  76. package/src/pipeline/stages/common/EcsStageConfigs.tsx +587 -0
  77. package/src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js +29 -65
  78. package/src/pipeline/stages/disableAsg/ecsDisableAsgStage.js +27 -70
  79. package/src/pipeline/stages/disableCluster/ecsDisableClusterStage.js +21 -84
  80. package/src/pipeline/stages/enableAsg/ecsEnableAsgStage.js +22 -73
  81. package/src/pipeline/stages/findImageFromTags/EcsFindImageFromTagsExecutionDetails.tsx +40 -0
  82. package/src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js +12 -24
  83. package/src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js +30 -128
  84. package/src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js +24 -78
  85. package/src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js +19 -73
  86. package/src/placementStrategy/placementStrategy.service.ts +0 -6
  87. package/src/secrets/secret.read.service.ts +1 -7
  88. package/src/securityGroup/details/EcsSecurityGroupDetails.spec.tsx +245 -0
  89. package/src/securityGroup/details/EcsSecurityGroupDetails.tsx +285 -0
  90. package/src/securityGroup/securityGroup.reader.ts +0 -5
  91. package/src/securityGroup/securityGroup.transformer.js +5 -13
  92. package/src/serverGroup/configure/dockerImage.util.ts +29 -0
  93. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +215 -278
  94. package/src/serverGroup/configure/serverGroupCommandBuilder.service.spec.ts +83 -0
  95. package/src/serverGroup/configure/serverGroupConfiguration.service.ts +16 -633
  96. package/src/serverGroup/configure/wizard/EcsCloneServerGroupModal.spec.tsx +2078 -0
  97. package/src/serverGroup/configure/wizard/EcsCloneServerGroupModal.tsx +712 -0
  98. package/src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx +98 -49
  99. package/src/serverGroup/configure/wizard/container/Container.spec.tsx +20 -8
  100. package/src/serverGroup/configure/wizard/container/Container.tsx +53 -24
  101. package/src/serverGroup/configure/wizard/networking/Networking.tsx +60 -38
  102. package/src/serverGroup/configure/wizard/pages/AdvancedSettings.tsx +290 -0
  103. package/src/serverGroup/configure/wizard/pages/BasicSettings.tsx +101 -0
  104. package/src/serverGroup/configure/wizard/pages/ContainerSettings.tsx +10 -0
  105. package/src/serverGroup/configure/wizard/pages/HorizontalScalingSettings.tsx +137 -0
  106. package/src/serverGroup/configure/wizard/pages/LoggingSettings.tsx +60 -0
  107. package/src/serverGroup/configure/wizard/pages/NetworkingSettings.tsx +10 -0
  108. package/src/serverGroup/configure/wizard/pages/ServiceDiscoverySettings.tsx +10 -0
  109. package/src/serverGroup/configure/wizard/pages/TaskDefinitionSettings.tsx +59 -0
  110. package/src/serverGroup/configure/wizard/pages/common.ts +10 -0
  111. package/src/serverGroup/configure/wizard/pages/validation.tsx +190 -0
  112. package/src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx +83 -34
  113. package/src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.spec.tsx +21 -8
  114. package/src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx +63 -33
  115. package/src/serverGroup/details/EcsServerGroupActions.spec.tsx +244 -0
  116. package/src/serverGroup/details/EcsServerGroupActions.tsx +152 -0
  117. package/src/serverGroup/details/ecsServerGroupDetailsGetter.spec.ts +110 -0
  118. package/src/serverGroup/details/ecsServerGroupDetailsGetter.ts +73 -0
  119. package/src/serverGroup/details/resize/EcsResizeServerGroupModal.spec.tsx +130 -0
  120. package/src/serverGroup/details/resize/EcsResizeServerGroupModal.tsx +263 -0
  121. package/src/serverGroup/details/resize/index.ts +1 -0
  122. package/src/serverGroup/details/rollback/EcsRollbackServerGroupModal.spec.tsx +173 -0
  123. package/src/serverGroup/details/rollback/EcsRollbackServerGroupModal.tsx +285 -0
  124. package/src/serverGroup/details/rollback/index.ts +1 -0
  125. package/src/serverGroup/details/sections/EcsServerGroupDetailsSections.spec.tsx +130 -0
  126. package/src/serverGroup/details/sections/EcsServerGroupDetailsSections.tsx +172 -0
  127. package/src/serverGroup/details/sections/EcsServerGroupEventsSection.tsx +14 -0
  128. package/src/serverGroup/details/sections/EcsServerGroupInformationSection.tsx +25 -0
  129. package/src/serverGroup/events/EcsServerGroupEventsModal.spec.tsx +109 -0
  130. package/src/serverGroup/events/EcsServerGroupEventsModal.tsx +112 -0
  131. package/src/serverGroup/events/EventsLink.tsx +18 -0
  132. package/src/serverGroup/events/serverGroupEventsReader.service.spec.ts +41 -0
  133. package/src/serverGroup/events/serverGroupEventsReader.service.ts +2 -8
  134. package/src/serverGroup/serverGroup.transformer.spec.ts +10 -24
  135. package/src/serverGroup/serverGroup.transformer.ts +1 -5
  136. package/src/serviceDiscovery/serviceDiscovery.read.service.ts +1 -1
  137. package/dist/common/common.module.d.ts +0 -1
  138. package/dist/common/footer.component.d.ts +0 -1
  139. package/dist/instance/details/instance.details.controller.d.ts +0 -2
  140. package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +0 -2
  141. package/dist/securityGroup/securityGroup.module.d.ts +0 -1
  142. package/dist/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.d.ts +0 -2
  143. package/dist/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.d.ts +0 -2
  144. package/dist/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.d.ts +0 -2
  145. package/dist/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.d.ts +0 -2
  146. package/dist/serverGroup/configure/wizard/logging/logging.component.d.ts +0 -1
  147. package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +0 -1
  148. package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +0 -2
  149. package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +0 -2
  150. package/dist/serverGroup/details/serverGroupDetails.ecs.controller.d.ts +0 -2
  151. package/dist/serverGroup/details/serverGroupDetails.module.d.ts +0 -1
  152. package/dist/serverGroup/events/events.component.d.ts +0 -3
  153. package/dist/serverGroup/events/events.controller.d.ts +0 -19
  154. package/dist/serverGroup/serverGroup.module.d.ts +0 -1
  155. package/src/common/common.module.ts +0 -6
  156. package/src/common/footer.component.ts +0 -29
  157. package/src/instance/details/instance.details.controller.js +0 -356
  158. package/src/instance/details/instanceDetails.html +0 -204
  159. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStage.html +0 -101
  160. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStepLabel.html +0 -1
  161. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +0 -9
  162. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +0 -1
  163. package/src/pipeline/stages/disableAsg/disableAsgStage.html +0 -11
  164. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +0 -1
  165. package/src/pipeline/stages/disableCluster/disableClusterStage.html +0 -26
  166. package/src/pipeline/stages/enableAsg/enableAsgStage.html +0 -11
  167. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +0 -1
  168. package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +0 -36
  169. package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +0 -9
  170. package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +0 -87
  171. package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +0 -1
  172. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +0 -35
  173. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +0 -34
  174. package/src/securityGroup/details/securityGroupDetail.controller.js +0 -147
  175. package/src/securityGroup/details/securityGroupDetail.html +0 -104
  176. package/src/securityGroup/securityGroup.module.ts +0 -12
  177. package/src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js +0 -259
  178. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.html +0 -194
  179. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js +0 -17
  180. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +0 -10
  181. package/src/serverGroup/configure/wizard/capacityProvider/capacityProvider.html +0 -11
  182. package/src/serverGroup/configure/wizard/container/container.html +0 -9
  183. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.html +0 -118
  184. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js +0 -20
  185. package/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.html +0 -13
  186. package/src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js +0 -41
  187. package/src/serverGroup/configure/wizard/location/basicSettings.html +0 -137
  188. package/src/serverGroup/configure/wizard/logging/logging.component.html +0 -29
  189. package/src/serverGroup/configure/wizard/logging/logging.component.ts +0 -12
  190. package/src/serverGroup/configure/wizard/logging/logging.html +0 -7
  191. package/src/serverGroup/configure/wizard/networking/networking.html +0 -9
  192. package/src/serverGroup/configure/wizard/serverGroupWizard.html +0 -55
  193. package/src/serverGroup/configure/wizard/serviceDiscovery/serviceDiscovery.html +0 -11
  194. package/src/serverGroup/configure/wizard/taskDefinition/taskDefinition.html +0 -51
  195. package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +0 -9
  196. package/src/serverGroup/configure/wizard/verticalScaling/verticalScaling.html +0 -10
  197. package/src/serverGroup/details/resize/resizeCapacity.component.html +0 -94
  198. package/src/serverGroup/details/resize/resizeCapacity.component.ts +0 -14
  199. package/src/serverGroup/details/resize/resizeServerGroup.controller.js +0 -85
  200. package/src/serverGroup/details/resize/resizeServerGroup.html +0 -28
  201. package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +0 -97
  202. package/src/serverGroup/details/rollback/rollbackServerGroup.html +0 -67
  203. package/src/serverGroup/details/serverGroupDetails.ecs.controller.js +0 -366
  204. package/src/serverGroup/details/serverGroupDetails.html +0 -216
  205. package/src/serverGroup/details/serverGroupDetails.module.ts +0 -5
  206. package/src/serverGroup/events/events.component.ts +0 -35
  207. package/src/serverGroup/events/events.controller.ts +0 -45
  208. package/src/serverGroup/events/events.html +0 -36
  209. package/src/serverGroup/serverGroup.module.ts +0 -6
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/common/footer.component.ts","../src/common/common.module.ts","../src/ecs.help.ts","../src/ecs.settings.ts","../src/ecsCluster/ecsCluster.read.service.ts","../src/iamRoles/iamRole.read.service.ts","../src/instance/details/instance.details.controller.js","../src/loadBalancer/TargetGroup.tsx","../src/loadBalancer/EcsLoadBalancerClusterContainer.tsx","../src/loadBalancer/listener.tsx","../src/loadBalancer/details/loadBalancerDetails.tsx","../src/loadBalancer/details/targetGroupDetails.tsx","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/targetGroup.states.ts","../src/metricAlarm/metricAlarm.read.service.ts","../src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js","../src/pipeline/stages/disableAsg/ecsDisableAsgStage.js","../src/pipeline/stages/disableCluster/ecsDisableClusterStage.js","../src/pipeline/stages/enableAsg/ecsEnableAsgStage.js","../src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js","../src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js","../src/placementStrategy/placementStrategy.service.ts","../src/secrets/secret.read.service.ts","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/securityGroup.transformer.js","../src/securityGroup/securityGroup.module.ts","../src/serviceDiscovery/serviceDiscovery.read.service.ts","../src/serverGroup/configure/serverGroupConfiguration.service.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js","../src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx","../src/serverGroup/configure/wizard/container/Container.tsx","../src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js","../src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/logging/logging.component.ts","../src/serverGroup/configure/wizard/networking/Networking.tsx","../src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx","../src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx","../src/serverGroup/details/resize/resizeCapacity.component.ts","../src/serverGroup/details/resize/resizeServerGroup.controller.js","../src/serverGroup/details/rollback/rollbackServerGroup.controller.js","../src/serverGroup/serverGroup.transformer.ts","../src/serverGroup/details/serverGroupDetails.ecs.controller.js","../src/serverGroup/details/serverGroupDetails.module.ts","../src/serverGroup/events/serverGroupEventsReader.service.ts","../src/serverGroup/events/events.controller.ts","../src/serverGroup/events/events.component.ts","../src/serverGroup/serverGroup.module.ts","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/ecs.module.ts","../src/logo/ecs.logo.svg"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst footerComponent: IComponentOptions = {\n bindings: {\n action: '&',\n isValid: '&',\n cancel: '&',\n account: '=?',\n verification: '=?',\n },\n template: `\n <div class=\"modal-footer\">\n <user-verification account=\"$ctrl.account\" verification=\"$ctrl.verification\"></user-verification>\n <button type=\"submit\" ng-click=\"$ctrl.action()\" style=\"display:none\"></button> <!-- Allows form submission via enter keypress-->\n <button class=\"btn btn-default\" ng-click=\"$ctrl.cancel()\">Cancel</button>\n <button type=\"submit\"\n class=\"btn btn-primary\"\n ng-click=\"$ctrl.action()\"\n ng-disabled=\"!$ctrl.isValid()\">\n Submit\n </button>\n </div>\n `,\n controller: () => {},\n};\n\nexport const ECS_FOOTER_COMPONENT = 'spinnaker.ecs.footer';\nmodule(ECS_FOOTER_COMPONENT, []).component('ecsFooter', footerComponent);\n","import { module } from 'angular';\n\nimport { ECS_FOOTER_COMPONENT } from './footer.component';\n\nexport const COMMON_MODULE = 'spinnaker.ecs.common';\nmodule(COMMON_MODULE, [ECS_FOOTER_COMPONENT]);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'ecs.loadBalancer.targetGroup':\n '<p>A <em>target group</em> is attached to an application / network load balancer and is a target for load balancer traffic.</p> <p> You need to create both the application load balancer and target groups prior to being able to use them in your pipeline.</p>',\n 'ecs.serverGroup.clusterName':\n '<p>The name of the ECS cluster (group of underlying EC2 hosts) onto which your application will be deployed.</p><p>Note that suggestions here are dependent on the selected account and region combination.</p>',\n 'ecs.stage.findImageByTags.labelOrSha':\n \"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>\",\n 'ecs.serverGroup.stack':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>staging</i>, <i>prod</i>, etc. Keep this parameter short!</p>',\n 'ecs.serverGroup.detail':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>app</i>, <i>worker</i>, <i>migrator</i>, etc. Keep this parameter short!</p>',\n 'ecs.capacity.overwrite':\n \"<p>Checking this box will have the previous server group's capacity overwrite the new <i>min</i>, <i>max</i> and <i>desired capacity</i> parameters if a previous server group exists.</p>\",\n 'ecs.capacity.desired': '<p>The starting number of containers, before any autoscaling happens.</p>',\n 'ecs.capacity.minimum':\n '<p>The minimum number of containers you can reach as a result of autoscaling.</p> <p>Typically, this represents the bare minimum you can afford to run without impacting your capacity to meet your SLA (Service Level Agreement) objectives</p>',\n 'ecs.capacity.maximum': '<p>The maximal number of containers you can reach as a result of autoscaling.</p>',\n 'ecs.capacity.reserved.computeUnits':\n '<p>The assured minimal amount of computing capacity your container will be able to use. 1024 units are equal to 1 AWS virtual CPU</p> <p>If other containers on your underlying host are not using their reserved compute capacity, this container will be able to use it.</p>',\n 'ecs.capacity.reserved.memory':\n '<p>The maximal amount of memory that your container can use, in megabytes. Exceeding this amount may result in termination of your container.</p><p>1024 mb = 1 gb</p>',\n 'ecs.loadbalancing.targetPort': '<p>The port on which your application is listening for incoming traffic</p>',\n 'ecs.iamrole':\n '<p>The IAM role that your container (task, in AWS wording) will inherit. </p><p>Define a role only if your application needs to access AWS APIs</p>',\n 'ecs.dockerimage': 'Docker image for your container, such as nginx:latest',\n 'ecs.dockerimagecredentials':\n '<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>',\n 'ecs.placementConstraints':\n '<p>Rules for task placement. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.placementConstraintType':\n '<p>To ensure that each task in a particular group is running on a different container instance, use distinctInstance. To restrict the selection to a group of valid candidates, use memberOf. </p>',\n 'ecs.placementConstraintExpression':\n '<p>A cluster query language expression to apply to memberOf constraints. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\" target=\"_blank\">AWS documentation</a> for more details.</p>',\n 'ecs.placementStrategy':\n '<p>The strategy the container scheduler will be using. See <a href=\"http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html\" target=\"_blank\">AWS documentation</a> for more details. </p><p>You should at least balance across availability zones</p><p>Custom placement strategies have not been implemented yet.</p>',\n 'ecs.platformVersion': '<p>Defaults to the latest platform version.</p>',\n 'ecs.enableDeploymentCircuitBreaker': '<p>Enable circuit breaker for the ECS service.</p>',\n 'ecs.capacity.copySourceScalingPoliciesAndActions':\n '<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>',\n 'ecs.launchtype': '<p>Launch service tasks on your own EC2 instances or on Fargate.</p>',\n 'ecs.healthgraceperiod':\n '<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>',\n 'ecs.publicip': '<p>Assign a public IP address to each task.</p>',\n 'ecs.networkMode':\n '<p>awsvpc is the only networking mode that allows you to use Elastic Network Interfaces (ENI). The default value converts to Bridge on Linux, and NAT on Windows.</p>',\n 'ecs.subnet':\n '<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>',\n 'ecs.securityGroups': '<p>The security group(s) name(s) your containers are deployed with.</p>',\n 'ecs.dockerLabels':\n '<p>Additional labels applied to your Docker container. This metadata can be used to identify your containers, or in conjunction with logging options. Maps directly to the <a href=\"https://docs.docker.com/engine/reference/commandline/run/#set-metadata-on-container--l---label---label-file\"><b>--label</b> Docker flag</a>.</p> <p>Spinnaker will automatically add the spinnaker.servergroup, spinnaker.stack, spinnaker.detail labels for non-null values.</p>',\n 'ecs.logDriver':\n '<p>The container\\'s logging driver. This directly maps to the <a href=\"https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver\"><b>--log-driver</b> Docker flag.</a></p>',\n 'ecs.logOptions':\n '<p>A map of log options. This directly maps with the <a href=\"https://docs.docker.com/config/containers/logging/log_tags/\"><b>--log-opt</b> Docker flag </a></p>',\n 'ecs.taskDefinition':\n '<p>The source of the ECS Task Definition. Task Definition contents can either be entered manually via input fields or from a selected JSON file artifact. Artifact file contents should be structured as an ECS \"RegisterTaskDefinition\" request.</p>',\n 'ecs.taskDefinitionArtifact': '<p>The artifact containing the ECS Task Definition.</p>',\n 'ecs.containerMappings':\n '<p>The list of expected containers within the Task Definition and which container image they should use. Containers in the Task Definition which are not specified here will be registered as they appear in the artifact.</p>',\n 'ecs.containerMappingName':\n '<p>The name of the container. Name should match the <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html#ECS-Type-ContainerDefinition-name\"><b>containerDefinition.name</b></a> field as it appears in the Task Definition.</p>',\n 'ecs.containerMappingImage': '<p>The container image the named container should run.</p>',\n 'ecs.targetGroupMappings':\n '<p>The list of target groups through which the ECS service will receive load balancer traffic. Each target group is mapped to a container name and port within the Task Definition to specify which container should be registered to the target group.</p>',\n 'ecs.loadBalancedContainer':\n '<p>The container in the Task Definition that should receive traffic from the load balancer. Required if a load balancer target group has been specified.</p>',\n 'ecs.tags': '<p>The tags to apply to the task definition and the service',\n 'ecs.environmentVariables':\n '<p>The environment variable(s) your container are deployed with. SERVER_GROUP, CLOUD_STACK and CLOUD_DETAIL environment variables are used during deployment to identify the task and cannot be set here.</p>',\n 'ecs.serviceDiscovery': '<p>The AWS Cloud Map service discovery registries to assign to this service</p>',\n 'ecs.serviceDiscoveryRegistry': '<p>The AWS Cloud Map service to use for service discovery registration</p>',\n 'ecs.serviceDiscoveryContainerPort':\n '<p>The port to be used for your service discovery service. Required only for services using bridge or host network mode, and for services using awsvpc network mode and a type SRV DNS record',\n 'ecs.serviceDiscoveryContainerName':\n '<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>',\n 'ecs.computeOptions':\n '<p>Specify either a <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\" target=\"_blank\">launch type</a> (default) or <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html\" target=\"_blank\">capacity providers</a> for running your ECS service.</p>',\n 'ecs.capacityProviderStrategy':\n '<p>A capacity provider strategy gives you control over how your tasks use one or more capacity providers. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html#capacity-providers-concepts\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.capacityProviderName': '<p>The short name of the capacity provider.</p>',\n 'ecs.capacityProviderBase':\n '<p>Designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a <em>base</em> defined.</p>',\n 'ecs.capacityProviderWeight':\n '<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>',\n 'ecs.evaluateExpression':\n '<p>Whether to evaluate <a href=\"https://spinnaker.io/guides/user/pipeline/expressions/\" target=\"_blank\"><b>pipeline expressions</b></a> within the task definition artifact in this stage. Checking this box let\\'s you evaluate your task definition artifact coming from external sources.(e.g. GitHub) </p>',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IECSProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n zone?: string;\n };\n}\n\nexport const IECSProviderSettings: IECSProviderSettings = (SETTINGS.providers.ecs as IECSProviderSettings) || {\n defaults: {},\n};\nif (IECSProviderSettings) {\n IECSProviderSettings.resetToOriginal = SETTINGS.resetProvider('ecs');\n}\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderDetails } from './IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from './IEcsCluster';\n\nexport class EcsClusterReader {\n public listClusters(): PromiseLike<IEcsClusterDescriptor[]> {\n return REST('/ecs/ecsClusters').get();\n }\n\n public describeClusters(account: string, region: string): PromiseLike<IEcsCapacityProviderDetails[]> {\n if (account != null && region != null) {\n return REST('/ecs/ecsClusterDescriptions').path(account).path(region).get();\n }\n return {} as PromiseLike<IEcsCapacityProviderDetails[]>;\n }\n}\n\nexport const ECS_CLUSTER_READ_SERVICE = 'spinnaker.ecs.ecsCluster.read.service';\n\nmodule(ECS_CLUSTER_READ_SERVICE, []).service('ecsClusterReader', EcsClusterReader);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IRoleDescriptor } from './IRole';\n\nexport class IamRoleReader {\n public listRoles(provider: string): PromiseLike<IRoleDescriptor[]> {\n return REST('/roles').path(provider).get();\n }\n}\n\nexport const IAM_ROLE_READ_SERVICE = 'spinnaker.ecs.iamRole.read.service';\n\nmodule(IAM_ROLE_READ_SERVICE, []).service('iamRoleReader', IamRoleReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport { applyHealthCheckInfoToTargetGroups, getAllTargetGroups } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n SETTINGS,\n} from '@spinnaker/core';\n\nexport const ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.ecs.instance.details.controller';\nexport const name = ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'ecsInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n 'moniker',\n 'environment',\n '$q',\n 'overrides',\n function ($scope, $state, $uibModal, instance, app, moniker, environment, $q, overrides) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n instancePort: _.get(app, 'attributes.instancePort') || SETTINGS.defaultInstancePort || 80,\n };\n\n $scope.application = app;\n $scope.moniker = moniker;\n $scope.environment = environment;\n\n const cloudProvider = 'ecs';\n const defaultRequestParams = { cloudProvider: cloudProvider };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Ecs' || metric.state !== 'Unknown';\n });\n\n // augment with target group healthcheck data\n const targetGroups = getAllTargetGroups(app.loadBalancers.data);\n applyHealthCheckInfoToTargetGroups(displayableMetrics, targetGroups, instance.account);\n\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, targetGroup, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n targetGroup = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n targetGroup = serverGroup.targetGroup;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n return targetGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n targetGroup = targetGroup.name;\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n })\n );\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n targetGroup.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n })\n );\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n instanceSummary.account = account;\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then((details) => {\n if ($scope.$$destroyed) {\n return;\n }\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n $scope.instance.targetGroup = targetGroup;\n if ($scope.instance.networkInterfaces) {\n const permanentNetworkInterfaces = $scope.instance.networkInterfaces.filter(\n (f) => f.attachment.deleteOnTermination === false,\n );\n if (permanentNetworkInterfaces.length) {\n $scope.instance.permanentIps = permanentNetworkInterfaces.map((f) => f.privateIpAddress);\n }\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n if (overrides.instanceDetailsLoaded) {\n overrides.instanceDetailsLoaded();\n }\n }, autoClose);\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n function autoClose() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.state.loading = false;\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.notFoundStandalone = true;\n RecentHistoryService.removeLastItem('instances');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n const discoveryHealth = healthMetrics.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n return healthMetrics.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { IInstanceCounts } from '@spinnaker/core';\nimport { LoadBalancerServerGroup } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsTargetGroupProps {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n showServerGroups: boolean;\n showInstances: boolean;\n}\n\nexport class EcsTargetGroup extends React.Component<IEcsTargetGroupProps> {\n public render(): React.ReactElement<EcsTargetGroup> {\n const { targetGroup, loadBalancer, showServerGroups } = this.props;\n\n const params = {\n loadBalancerName: loadBalancer.name,\n region: targetGroup.region,\n accountId: targetGroup.account,\n name: targetGroup.targetGroupName,\n vpcId: targetGroup.vpcId,\n provider: targetGroup.cloudProvider,\n };\n\n // info not yet available; HealthCounts component requires it,\n // but will not render if no values are defined.\n const emptyInstanceCounts: IInstanceCounts = {\n up: undefined,\n down: undefined,\n starting: undefined,\n succeeded: undefined,\n failed: undefined,\n unknown: undefined,\n outOfService: undefined,\n };\n\n return (\n <div className=\"target-group-container container-fluid no-padding\">\n <UISrefActive class=\"active\">\n <UISref to=\".ecsTargetGroupDetails\" params={params}>\n <div className={`clickable clickable-row row no-margin-y target-group-header`}>\n <div className=\"col-md-8 target-group-title\">{targetGroup.targetGroupName}</div>\n </div>\n </UISref>\n </UISrefActive>\n {showServerGroups &&\n targetGroup.serverGroups.map((sgName) => {\n return (\n <LoadBalancerServerGroup\n key={sgName}\n account={targetGroup.account}\n region={targetGroup.region}\n serverGroup={{\n account: targetGroup.account,\n cloudProvider: targetGroup.cloudProvider,\n cluster: sgName,\n instanceCounts: emptyInstanceCounts,\n instances: targetGroup.instances,\n name: sgName,\n type: targetGroup.type,\n region: targetGroup.region,\n }}\n showInstances={false} // TODO: use prop when instanceCounts available\n />\n );\n })}\n </div>\n );\n }\n}\n","import { isEqual } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancerClusterContainerProps } from '@spinnaker/core';\n\nimport { EcsTargetGroup } from './TargetGroup';\nimport type { IEcsLoadBalancer } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerClusterContainer extends React.Component<ILoadBalancerClusterContainerProps> {\n public shouldComponentUpdate(nextProps: ILoadBalancerClusterContainerProps) {\n const serverGroupsDiffer = () =>\n !isEqual(\n (nextProps.serverGroups || []).map((g) => g.name),\n (this.props.serverGroups || []).map((g) => g.name),\n );\n const targetGroupsDiffer = () =>\n !isEqual(\n ((nextProps.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n ((this.props.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n );\n return (\n nextProps.showInstances !== this.props.showInstances ||\n nextProps.showServerGroups !== this.props.showServerGroups ||\n nextProps.loadBalancer !== this.props.loadBalancer ||\n serverGroupsDiffer() ||\n targetGroupsDiffer()\n );\n }\n\n public render(): React.ReactElement<EcsLoadBalancerClusterContainer> {\n const { loadBalancer, showInstances, showServerGroups } = this.props;\n const lb = loadBalancer as IEcsLoadBalancer;\n\n const TargetGroups = lb.targetGroups.map((targetGroup) => {\n return (\n <EcsTargetGroup\n key={targetGroup.targetGroupName}\n loadBalancer={loadBalancer as IEcsLoadBalancer}\n targetGroup={targetGroup}\n showInstances={showInstances}\n showServerGroups={showServerGroups}\n />\n );\n });\n\n return <div className=\"cluster-container\">{TargetGroups}</div>;\n }\n}\n","import React from 'react';\n\nimport type { IEcsListener } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsListenerProps {\n listener: IEcsListener;\n}\n\nexport class EcsListener extends React.Component<IEcsListenerProps> {\n constructor(props: IEcsListenerProps) {\n super(props);\n }\n\n private getTargetGroupNameFromArn(arn: string): string {\n const parts = arn.split('/');\n if (parts.length < 0) {\n return arn;\n }\n return parts[1];\n }\n\n public render(): React.ReactElement<EcsListener> {\n const { port, protocol, defaultActions } = this.props.listener;\n\n // TODO: retrieve and display 'rules' in addition to default actions\n return (\n <div>\n <h4>\n {protocol}:{port}\n </h4>\n <div style={{ paddingLeft: 10 }}>\n <i>default actions</i>\n <ul>\n {defaultActions.map((action, i) => {\n if (action.type == 'forward') {\n return (\n <li key={i}>\n &rarr;\n <i className=\"fa fa-fw fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <span>\n {action.targetGroupArn ||\n action.forwardConfig.targetGroups.map((tg) => {\n return this.getTargetGroupNameFromArn(tg.targetGroupArn);\n })}\n </span>\n </li>\n );\n } else {\n return (\n <li key={i}>\n {action.type}:{' '}\n {action.redirectConfig.statusCode ||\n action.fixedResponseConfig.statusCode ||\n action.authenticateOidcConfig.clientId ||\n action.authenticateCognitoActionConfig.userPoolDomain}\n </li>\n );\n }\n })}\n </ul>\n </div>\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer } from '../../domain/IEcsLoadBalancer';\nimport { EcsListener } from '../listener';\n\ninterface IEcsLoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n vpcId: string;\n}\n\ninterface IEcsLoadBalancerDetailsState {\n loadBalancer: IEcsLoadBalancer;\n loadBalancerNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsLoadBalancerDetailsProps {\n app: Application;\n accountId: string;\n loadBalancer: IEcsLoadBalancerFromStateParams;\n}\n\nexport class EcsLoadBalancerDetails extends React.Component<\n IEcsLoadBalancerDetailsProps,\n IEcsLoadBalancerDetailsState\n> {\n constructor(props: IEcsLoadBalancerDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractLoadBalancer(): void {\n const { name, region } = this.props.loadBalancer;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === name && test.account === this.props.loadBalancer.accountId && test.region === region;\n });\n\n this.setState({\n loading: false,\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (loadBalancer) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractLoadBalancer()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n\n public render(): React.ReactElement<EcsLoadBalancerDetails> {\n const loadBalancerName = this.props.loadBalancer.name;\n const { loadBalancer, loading } = this.state;\n const { accountId } = this.props;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Load balancer not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const loadBalancerHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"header-text horizontal middle\">\n <i className=\"fa icon-sitemap\" />\n <h3 className=\"horizontal middle space-between flex-1\">{loadBalancerName}</h3>\n </div>\n </div>\n );\n\n const loadBalancerContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(loadBalancer.createdTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId} />\n <br />\n {loadBalancer.region}\n </dd>\n <dt>VPC</dt>\n <dd>{loadBalancer.vpcId}</dd>\n <dt>Type</dt>\n <dd>{loadBalancer.loadBalancerType}</dd>\n <dt>IP Type</dt>\n <dd>{loadBalancer.ipAddressType}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Availability Zones</dt>\n <dd>\n <ul>\n {loadBalancer.availabilityZones.map((az) => {\n return <li key={az}>{az}</li>;\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target Groups</dt>\n <dd>\n <ul>\n {loadBalancer.targetGroups.map((tg) => {\n return (\n <li key={tg.targetGroupName}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.ecsTargetGroupDetails\"\n params={{\n loadBalancerName: loadBalancer.name,\n region: loadBalancer.region,\n accountId: loadBalancer.account,\n name: tg.targetGroupName,\n vpcId: tg.vpcId,\n provider: loadBalancer.cloudProvider,\n }}\n >\n <a>{tg.targetGroupName}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Status\" defaultExpanded={false}>\n <span>Select a target group to check the instance health status from the view of its server groups.</span>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Listeners\" defaultExpanded={false}>\n {loadBalancer.listeners ? (\n loadBalancer.listeners.map((listener, index) => {\n return (\n <div key={index}>\n <span>\n <EcsListener listener={listener}></EcsListener>\n </span>\n </div>\n );\n })\n ) : (\n <li>No listeners provided.</li>\n )}\n </CollapsibleSection>\n <CollapsibleSection heading=\"Firewalls\" defaultExpanded={false}>\n <ul>\n {loadBalancer.securityGroups ? (\n loadBalancer.securityGroups.map((sg) => {\n return <li key={sg}>{sg}</li>;\n })\n ) : (\n <li>No security groups provided.</li>\n )}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Subnets\" defaultExpanded={false}>\n <ul>\n {loadBalancer.subnets.map((subnet) => {\n return <li key={subnet}>{subnet}</li>;\n })}\n </ul>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && loadBalancerHeader()}\n {!loading && !loadBalancer && notFoundContent()}\n {!loading && loadBalancer && loadBalancerContent()}\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../../domain/IEcsLoadBalancer';\n\ninterface IEcsTargetGroupFromStateParams {\n loadBalancerName: string;\n targetGroupName: string;\n region: string;\n vpcId: string;\n}\n\ninterface IEcsTargetGroupDetailsState {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n targetGroupNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsTargetGroupProps {\n app: Application;\n accountId: string;\n name: string;\n targetGroup: IEcsTargetGroupFromStateParams;\n provider: string;\n}\n\nexport class EcsTargetGroupDetails extends React.Component<IEcsTargetGroupProps, IEcsTargetGroupDetailsState> {\n constructor(props: IEcsTargetGroupProps) {\n super(props);\n this.state = {\n loading: true,\n targetGroup: undefined,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractTargetGroup());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractTargetGroup(): void {\n const { loadBalancerName, region, targetGroupName } = this.props.targetGroup;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === loadBalancerName && test.account === this.props.accountId && test.region === region;\n });\n\n this.setState({\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (!loadBalancer) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n } else {\n const targetGroup: IEcsTargetGroup = loadBalancer.targetGroups.find(\n (tg) => tg.targetGroupName === targetGroupName,\n );\n if (!targetGroup) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n }\n\n if (targetGroup) {\n this.setState({\n loading: false,\n targetGroup,\n });\n\n if (targetGroup) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractTargetGroup()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n }\n }\n\n public render(): React.ReactElement<EcsTargetGroupDetails> {\n const { name, accountId } = this.props;\n const region = this.props.targetGroup.region;\n const { targetGroup, loadBalancer, loading } = this.state;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Target group not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const targetGroupHeader = () => (\n <div className=\"header\">\n <div className=\"header-text horizontal middle\">\n <i className=\"fa fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <h3 className=\"horizontal middle space-between flex-1\">{name}</h3>\n </div>\n </div>\n );\n\n const targetGroupContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Target Group Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId}></AccountTag>\n <br />\n {targetGroup.region}\n </dd>\n <dt>VPC</dt>\n <dd>{targetGroup.vpcId}</dd>\n <dt>Protocol</dt>\n <dd>{targetGroup.protocol}</dd>\n <dt>Port</dt>\n <dd>{targetGroup.port}</dd>\n <dt>Target Type</dt>\n <dd>{targetGroup.targetType.toUpperCase()}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancers</dt>\n <dd>\n {/* TODO: use UISref to display/highlight LBs in this app. See core/.../LoadBalancer.tsx */}\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.loadBalancerNames ? (\n targetGroup.loadBalancerNames.map((lb, i) => {\n return <li key={i}>{lb}</li>;\n })\n ) : (\n <li>No load balncers provided.</li>\n )}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancer DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Server Groups</dt>\n <dd>\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.serverGroups.map((sg, i) => {\n return (\n <li key={i}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: region,\n accountId: accountId,\n serverGroup: sg,\n provider: 'ecs',\n }}\n >\n <a>{sg}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Health Checks\" defaultExpanded={false}>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target</dt>\n <dd>\n {targetGroup.healthCheckProtocol}:{targetGroup.healthCheckPort}\n {targetGroup.healthCheckPath}\n </dd>\n <dt>Timeout</dt>\n <dd>{targetGroup.healthCheckTimeoutSeconds} seconds</dd>\n <dt>Interval</dt>\n <dd>{targetGroup.healthCheckIntervalSeconds} seconds</dd>\n <dt>Healthy Threshold</dt>\n <dd>{targetGroup.healthyThresholdCount}</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{targetGroup.unhealthyThresholdCount}</dd>\n <dt>Matcher</dt>\n <dd>HTTP Code(s): {targetGroup && targetGroup.matcher ? targetGroup.matcher.httpCode : 'None'}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Attributes\" defaultExpanded={false}>\n <dl>\n <dt>Deregistration Delay Timeout</dt>\n <dd>{targetGroup.attributes['deregistration_delay.timeout_seconds'] || 0} seconds</dd>\n <dt>Stickiness Enabled</dt>\n <dd>{targetGroup.attributes['stickiness.enabled'] || 'N/A'}</dd>\n </dl>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && targetGroupHeader()}\n {!loading && !targetGroup && notFoundContent()}\n {!loading && targetGroup && targetGroupContent()}\n </div>\n );\n }\n}\n","import type { IQService } from 'angular';\n\nimport type { IEcsLoadBalancer, IEcsLoadBalancerSourceData, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeLoadBalancer(loadBalancer: IEcsLoadBalancerSourceData): PromiseLike<IEcsLoadBalancer> {\n loadBalancer.targetGroups.forEach((tg: IEcsTargetGroup) => {\n tg.region = loadBalancer.region;\n tg.account = loadBalancer.account;\n tg.cloudProvider = loadBalancer.cloudProvider;\n if (loadBalancer.targetGroupServices) {\n const tgServiceMap = loadBalancer.targetGroupServices;\n tg.serverGroups = tgServiceMap[tg.targetGroupArn];\n }\n });\n return this.$q.resolve(loadBalancer);\n }\n}\n","import type { StateParams } from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\n\nimport { EcsTargetGroupDetails } from '../loadBalancer/details/targetGroupDetails';\n//import { IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport const ECS_TARGET_GROUP_STATES = 'spinnaker.ecs.loadBalancer.targetGroup.states';\nmodule(ECS_TARGET_GROUP_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const ecsTargetGroupDetails: INestedState = {\n name: 'ecsTargetGroupDetails',\n url: '/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name',\n params: {\n vpcId: {\n value: null,\n squash: true,\n },\n },\n views: {\n 'detail@../insight': {\n component: EcsTargetGroupDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: StateParams) => $stateParams.accountId],\n name: ['$stateParams', ($stateParams: StateParams) => $stateParams.name],\n provider: ['$stateParams', ($stateParams: StateParams) => $stateParams.provider],\n // resolve flat params into an IEcsTargetGroup\n targetGroup: [\n '$stateParams',\n ($stateParams: StateParams) => {\n return {\n loadBalancerName: $stateParams.loadBalancerName,\n targetGroupName: $stateParams.name,\n accountId: $stateParams.accountId,\n region: $stateParams.region,\n vpcId: $stateParams.vpcId,\n };\n },\n ],\n },\n data: {\n pageTitleDetails: {\n title: 'Target Group Details',\n nameParam: 'name',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n },\n };\n\n applicationStateProvider.addInsightDetailState(ecsTargetGroupDetails);\n },\n]);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IMetricAlarmDescriptor } from './MetricAlarm';\n\nexport class MetricAlarmReader {\n public listMetricAlarms(): PromiseLike<IMetricAlarmDescriptor[]> {\n return REST('/ecs/cloudMetrics/alarms').get();\n }\n}\n\nexport const METRIC_ALARM_READ_SERVICE = 'spinnaker.ecs.metricAlarm.read.service';\n\nmodule(METRIC_ALARM_READ_SERVICE, []).service('metricAlarmReader', MetricAlarmReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.destroyAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n alias: 'destroyAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.regions = ['us-east-1', 'us-west-1', 'eu-west-1', 'us-west-2'];\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, PipelineTemplates, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.disableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./disableAsgStage.html'),\n executionDetailsUrl: PipelineTemplates.disableAsgExecutionDetails,\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.disableClusterStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./disableClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingEnabledServerGroups',\n fieldLabel: 'Keep [X] enabled Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingEnabledServerGroups === undefined) {\n stage.remainingEnabledServerGroups = 1;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.enableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE =\n 'spinnaker.ecs.pipeline.stage.findImageFromTagsStage';\nexport const name = ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'ecs',\n templateUrl: require('./findImageFromTagsStage.html'),\n executionDetailsUrl: require('./findImageFromTagsExecutionDetails.html'),\n executionConfigSections: ['findImageConfig', 'taskStatus'],\n validators: [{ type: 'requiredField', fieldName: 'imageLabelOrSha' }],\n });\n })\n .controller('ecsFindImageFromTagsStageCtrl', [\n '$scope',\n function ($scope) {\n $scope.stage.cloudProvider = $scope.stage.cloudProvider || 'ecs';\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.resizeAsgStage';\nexport const name = ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n alias: 'resizeAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./resizeAsgStage.html'),\n executionConfigSections: ['resizeServerGroupConfig', 'taskStatus'],\n executionStepLabelUrl: require('./resizeAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsResizeAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.viewState = {\n accountsLoaded: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.viewState.accountsLoaded = true;\n });\n\n $scope.resizeTargets = StageConstants.TARGET_LIST;\n\n $scope.scaleActions = [\n {\n label: 'Scale Up',\n val: 'scale_up',\n },\n {\n label: 'Scale Down',\n val: 'scale_down',\n },\n {\n label: 'Scale to Cluster Size',\n val: 'scale_to_cluster',\n },\n {\n label: 'Scale to Exact Size',\n val: 'scale_exact',\n },\n ];\n\n $scope.resizeTypes = [\n {\n label: 'Percentage',\n val: 'pct',\n },\n {\n label: 'Incremental',\n val: 'incr',\n },\n ];\n\n stage.capacity = stage.capacity || {};\n stage.regions = stage.regions || [];\n stage.target = stage.target || $scope.resizeTargets[0].val;\n stage.action = stage.action || $scope.scaleActions[0].val;\n stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;\n if (stage.targetHealthyDeployPercentage === undefined) {\n stage.targetHealthyDeployPercentage = 100;\n }\n if (!stage.action && stage.resizeType === 'exact') {\n stage.action = 'scale_exact';\n }\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n ctrl.updateResizeType = function () {\n if (stage.action === 'scale_exact') {\n stage.resizeType = 'exact';\n delete stage.scalePct;\n delete stage.scaleNum;\n } else {\n stage.capacity = {};\n if (stage.resizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n stage.resizeType = 'incr';\n delete stage.scalePct;\n stage.scaleNum = stage.scaleNum || 0;\n }\n }\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.scaleDownClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./scaleDownClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n })\n .controller('ecsScaleDownClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingFullSizeServerGroups === undefined) {\n stage.remainingFullSizeServerGroups = 1;\n }\n\n if (stage.allowScaleDownActive === undefined) {\n stage.allowScaleDownActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.ecs.shrinkClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./shrinkClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsShrinkClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.shrinkToSize === undefined) {\n stage.shrinkToSize = 1;\n }\n\n if (stage.allowDeleteActive === undefined) {\n stage.allowDeleteActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.retainLargerOverNewer === undefined) {\n stage.retainLargerOverNewer = 'false';\n }\n stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();\n },\n ]);\n","import { module } from 'angular';\n\nimport type { IPlacementStrategy } from './IPlacementStrategy';\n\nexport class PlacementStrategyService {\n public getPredefinedStrategy(strategyName: string): IPlacementStrategy[] {\n if (strategyName === 'AZ Balanced Spread') {\n return this.getAzBalancedSpreadStrategy();\n } else if (strategyName === 'AZ Balanced BinPack' || strategyName === 'AZ Balanced BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getAzBalancedMemoryBinPackStrategy();\n } else if (strategyName === 'BinPack' || strategyName === 'BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getBinPackMemoryStrategy();\n } else if (strategyName === 'AZ Balanced BinPack CPU') {\n return this.getAzBalancedCpuBinPackStrategy();\n } else if (strategyName === 'BinPack CPU') {\n return this.getBinPackCpuStrategy();\n } else if (strategyName === 'One Task Per Host') {\n return this.getOneTaskPerHostStrategy();\n } else {\n // TODO: Add support for custom placement strategy.\n return [];\n }\n }\n\n public getAzBalancedSpreadStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'spread', field: 'instanceId' },\n ];\n }\n\n public getAzBalancedMemoryBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'memory' },\n ];\n }\n\n public getBinPackMemoryStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'memory' }];\n }\n\n public getAzBalancedCpuBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'cpu' },\n ];\n }\n\n public getBinPackCpuStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'cpu' }];\n }\n\n public getOneTaskPerHostStrategy(): IPlacementStrategy[] {\n return [{ type: 'spread', field: 'instanceId' }];\n }\n}\n\nexport const PLACEMENT_STRATEGY_SERVICE = 'spinnaker.ecs.placementStrategyService.service';\n\nmodule(PLACEMENT_STRATEGY_SERVICE, []).service('placementStrategyService', PlacementStrategyService);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { ISecretDescriptor } from './ISecret';\n\nexport class SecretReader {\n public listSecrets(): PromiseLike<ISecretDescriptor[]> {\n return REST('/ecs/secrets').get();\n }\n}\n\nexport const ECS_SECRET_READ_SERVICE = 'spinnaker.ecs.secret.read.service';\n\nmodule(ECS_SECRET_READ_SERVICE, []).service('secretReader', SecretReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { VpcReader } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n FirewallLabels,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n RecentHistoryService,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.ecs.securityGroup.details.controller';\nexport const name = ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n ])\n .controller('ecsSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'securityGroupReader',\n function ($scope, $state, resolvedSecurityGroup, app, securityGroupReader) {\n this.application = app;\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n this.firewallLabel = FirewallLabels.get('Firewall');\n\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'securityGroup.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(function (details) {\n return VpcReader.getVpcName(details.vpcId).then((name) => {\n details.vpcName = name;\n return details;\n });\n })\n .then(function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n const applicationSecurityGroup = securityGroupReader.getApplicationSecurityGroup(\n application,\n securityGroup.accountId,\n securityGroup.region,\n securityGroup.name,\n );\n\n angular.extend(securityGroup, applicationSecurityGroup, details);\n $scope.securityGroup = securityGroup;\n $scope.ipRules = buildIpRulesModel(securityGroup);\n $scope.securityGroupRules = buildSecurityGroupRulesModel(securityGroup);\n }\n }, fourOhFour);\n }\n\n function buildIpRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.ipRangeRules, (rule) => rule.range.ip + rule.range.cidr);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n address: addr,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildSecurityGroupRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.securityGroupRules, (rule) => rule.securityGroup.id);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n securityGroup: groupedRangeRules[addr][0].securityGroup,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildRuleModel(groupedRangeRules, addr) {\n const rules = [];\n groupedRangeRules[addr].forEach((rule) => {\n (rule.portRanges || []).forEach((range) => {\n if (rule.protocol === '-1' || (range.startPort !== undefined && range.endPort !== undefined)) {\n rules.push({ startPort: range.startPort, endPort: range.endPort, protocol: rule.protocol });\n }\n });\n });\n return rules;\n }\n\n function fourOhFour() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.group = securityGroup.name;\n $scope.state.notFound = true;\n $scope.state.loading = false;\n RecentHistoryService.removeLastItem('securityGroups');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","import { module } from 'angular';\n\nimport type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class EcsSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n\nexport const ECS_SECURITY_GROUP_READER = 'spinnaker.ecs.securityGroup.reader';\nmodule(ECS_SECURITY_GROUP_READER, []).service('ecsSecurityGroupReader', EcsSecurityGroupReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.ecs.securityGroup.transformer';\nexport const name = ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('ecsSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","import { module } from 'angular';\n\nimport { ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './details/securityGroupDetail.controller';\nimport { ECS_SECURITY_GROUP_READER } from './securityGroup.reader';\nimport { ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup.transformer';\n\nexport const ECS_SECURITY_GROUP_MODULE = 'spinnaker.ecs.securityGroup';\nmodule(ECS_SECURITY_GROUP_MODULE, [\n ECS_SECURITY_GROUP_READER,\n ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n]);\n","import { REST } from '@spinnaker/core';\nimport type { IServiceDiscoveryRegistryDescriptor } from './IServiceDiscovery';\n\nexport class ServiceDiscoveryReader {\n public static listServiceDiscoveryRegistries(): PromiseLike<IServiceDiscoveryRegistryDescriptor[]> {\n return REST('/ecs/serviceDiscoveryRegistries').get();\n }\n}\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\nimport { chain, clone, extend, find, flatten, has, intersection, keys, some, xor } from 'lodash';\n\nimport type { IAmazonLoadBalancer } from '@spinnaker/amazon';\nimport type {\n IAccountDetails,\n IArtifact,\n IDeploymentStrategy,\n IPipeline,\n IRegion,\n IServerGroupCommand,\n IServerGroupCommandBackingData,\n IServerGroupCommandBackingDataFiltered,\n IServerGroupCommandDirty,\n IServerGroupCommandResult,\n IServerGroupCommandViewState,\n IStage,\n ISubnet,\n LoadBalancerReader,\n SecurityGroupReader,\n ServerGroupCommandRegistry,\n} from '@spinnaker/core';\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n NameUtils,\n SECURITY_GROUP_READER,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SubnetReader,\n} from '@spinnaker/core';\nimport type { IDockerImage } from '@spinnaker/docker';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport type { IEcsCapacityProviderDetails } from '../../ecsCluster/IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from '../../ecsCluster/IEcsCluster';\nimport type { EcsClusterReader } from '../../ecsCluster/ecsCluster.read.service';\nimport type { IRoleDescriptor } from '../../iamRoles/IRole';\nimport type { IamRoleReader } from '../../iamRoles/iamRole.read.service';\nimport type { IMetricAlarmDescriptor } from '../../metricAlarm/MetricAlarm';\nimport type { MetricAlarmReader } from '../../metricAlarm/metricAlarm.read.service';\nimport type { IPlacementStrategy } from '../../placementStrategy/IPlacementStrategy';\nimport type { PlacementStrategyService } from '../../placementStrategy/placementStrategy.service';\nimport type { ISecretDescriptor } from '../../secrets/ISecret';\nimport type { SecretReader } from '../../secrets/secret.read.service';\nimport type { IServiceDiscoveryRegistryDescriptor } from '../../serviceDiscovery/IServiceDiscovery';\nimport { ServiceDiscoveryReader } from '../../serviceDiscovery/serviceDiscovery.read.service';\n\nexport interface IEcsServerGroupCommandDirty extends IServerGroupCommandDirty {\n targetGroups?: string[];\n defaulCapacityProviders?: string[];\n customCapacityProviders?: string[];\n}\n\nexport interface IEcsServerGroupCommandResult extends IServerGroupCommandResult {\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsDockerImage extends IDockerImage {\n imageId: string;\n message: string;\n fromTrigger: boolean;\n fromContext: boolean;\n stageId: string;\n imageLabelOrSha: string;\n}\n\nexport interface IEcsServerGroupCommandViewState extends IServerGroupCommandViewState {\n contextImages: IEcsDockerImage[];\n pipeline: IPipeline;\n currentStage: IStage;\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsServerGroupCommandBackingDataFiltered extends IServerGroupCommandBackingDataFiltered {\n targetGroups: string[];\n iamRoles: string[];\n ecsClusters: string[];\n availableCapacityProviders: string[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n metricAlarms: IMetricAlarmDescriptor[];\n subnetTypes: ISubnet[];\n securityGroupNames: string[];\n secrets: string[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsServerGroupCommandBackingData extends IServerGroupCommandBackingData {\n filtered: IEcsServerGroupCommandBackingDataFiltered;\n targetGroups: string[];\n ecsClusters: IEcsClusterDescriptor[];\n capacityProviderDetails: IEcsCapacityProviderDetails[];\n iamRoles: IRoleDescriptor[];\n metricAlarms: IMetricAlarmDescriptor[];\n launchTypes: string[];\n networkModes: string[];\n secrets: ISecretDescriptor[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsTaskDefinitionArtifact {\n artifact?: IArtifact;\n artifactId?: string;\n}\n\nexport interface IEcsContainerMapping {\n containerName: string;\n imageDescription: IEcsDockerImage;\n}\n\nexport interface IEcsTargetGroupMapping {\n containerName: string;\n containerPort: number;\n targetGroup: string;\n}\n\nexport interface IEcsServiceDiscoveryRegistryAssociation {\n registry: IServiceDiscoveryRegistryDescriptor;\n containerPort: number;\n containerName: string;\n}\n\nexport interface IEcsCapacityProviderStrategyItem {\n capacityProvider: string;\n base: number;\n weight: number;\n}\n\nexport interface IEcsServerGroupCommand extends IServerGroupCommand {\n associatePublicIpAddress: boolean;\n backingData: IEcsServerGroupCommandBackingData;\n computeUnits: number;\n reservedMemory: number;\n targetHealthyDeployPercentage: number;\n targetGroup: string;\n containerPort: number;\n placementStrategyName: string;\n placementStrategySequence: IPlacementStrategy[];\n imageDescription: IEcsDockerImage;\n networkMode: string;\n subnetType: string;\n subnetTypes: string[];\n securityGroups: string[];\n securityGroupNames: string[];\n viewState: IEcsServerGroupCommandViewState;\n taskDefinitionArtifact: IEcsTaskDefinitionArtifact;\n taskDefinitionArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n loadBalancedContainer: string;\n targetGroupMappings: IEcsTargetGroupMapping[];\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n useTaskDefinitionArtifact: boolean;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n useDefaultCapacityProviders: boolean;\n ecsClusterName: string;\n subnetTypeChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n placementStrategyNameChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n regionIsDeprecated: (command: IEcsServerGroupCommand) => boolean;\n\n clusterChanged: (command: IServerGroupCommand) => void;\n}\n\nexport class EcsServerGroupConfigurationService {\n // private enabledMetrics = ['GroupMinSize', 'GroupMaxSize', 'GroupDesiredCapacity', 'GroupInServiceInstances', 'GroupPendingInstances', 'GroupStandbyInstances', 'GroupTerminatingInstances', 'GroupTotalInstances'];\n // private healthCheckTypes = ['EC2', 'ELB'];\n // private terminationPolicies = ['OldestInstance', 'NewestInstance', 'OldestLaunchConfiguration', 'ClosestToNextInstanceHour', 'Default'];\n private launchTypes = ['EC2', 'FARGATE'];\n private networkModes = ['bridge', 'host', 'awsvpc', 'none', 'default'];\n\n public static $inject = [\n '$q',\n 'loadBalancerReader',\n 'serverGroupCommandRegistry',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'metricAlarmReader',\n 'placementStrategyService',\n 'securityGroupReader',\n 'secretReader',\n ];\n constructor(\n private $q: IQService,\n private loadBalancerReader: LoadBalancerReader,\n private serverGroupCommandRegistry: ServerGroupCommandRegistry,\n private iamRoleReader: IamRoleReader,\n private ecsClusterReader: EcsClusterReader,\n private metricAlarmReader: MetricAlarmReader,\n private placementStrategyService: PlacementStrategyService,\n private securityGroupReader: SecurityGroupReader,\n private secretReader: SecretReader,\n ) {}\n\n public configureUpdateCommand(command: IEcsServerGroupCommand): void {\n command.backingData = {\n // terminationPolicies: clone(this.terminationPolicies)\n launchTypes: clone(this.launchTypes),\n networkModes: clone(this.networkModes),\n } as IEcsServerGroupCommandBackingData;\n }\n\n // TODO (Bruno Carrier): Why do we need to inject an Application into this constructor so that the app works? This is strange, and needs investigating\n public configureCommand(cmd: IEcsServerGroupCommand, imageQuery = ''): PromiseLike<void> {\n this.applyOverrides('beforeConfiguration', cmd);\n cmd.toggleSuspendedProcess = (command: IEcsServerGroupCommand, process: string): void => {\n command.suspendedProcesses = command.suspendedProcesses || [];\n const processIndex = command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n command.suspendedProcesses.push(process);\n } else {\n command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n cmd.processIsSuspended = (command: IEcsServerGroupCommand, process: string): boolean =>\n command.suspendedProcesses.includes(process);\n\n cmd.onStrategyChange = (command: IEcsServerGroupCommand, strategy: IDeploymentStrategy): void => {\n // Any strategy other than None or Custom should force traffic to be enabled\n if (strategy.key !== '' && strategy.key !== 'custom') {\n command.suspendedProcesses = (command.suspendedProcesses || []).filter((p) => p !== 'AddToLoadBalancer');\n }\n };\n\n cmd.regionIsDeprecated = (command: IEcsServerGroupCommand): boolean => {\n return (\n has(command, 'backingData.filtered.regions') &&\n command.backingData.filtered.regions.some((region) => region.name === command.region && region.deprecated)\n );\n };\n\n const imageQueries = cmd.imageDescription ? [this.grabImageAndTag(cmd.imageDescription.imageId)] : [];\n\n if (imageQuery) {\n imageQueries.push(imageQuery);\n }\n\n // Scope image search to a known account. If no account is available yet the Docker registry\n // account picker in the wizard will trigger an account-scoped reload once the user selects one.\n const searchAccount = cmd.imageDescription?.account;\n\n let imagesPromise;\n if (imageQueries.length && searchAccount) {\n imagesPromise = this.$q\n .all(\n imageQueries.map((q) =>\n DockerImageReader.findImages({\n provider: 'dockerRegistry',\n account: searchAccount,\n count: 50,\n q: q,\n }),\n ),\n )\n .then((promises) => flatten(promises));\n } else {\n imagesPromise = this.$q.when([]);\n }\n\n return this.$q\n .all({\n credentialsKeyedByAccount: AccountService.getCredentialsKeyedByAccount('ecs'),\n loadBalancers: this.loadBalancerReader.listLoadBalancers('ecs'),\n subnets: SubnetReader.listSubnetsByProvider('ecs'),\n iamRoles: this.iamRoleReader.listRoles('ecs'),\n ecsClusters: this.ecsClusterReader.listClusters(),\n capacityProviderDetails: this.ecsClusterReader.describeClusters(cmd.credentials, cmd.region),\n metricAlarms: this.metricAlarmReader.listMetricAlarms(),\n securityGroups: this.securityGroupReader.getAllSecurityGroups(),\n launchTypes: this.$q.when(clone(this.launchTypes)),\n networkModes: this.$q.when(clone(this.networkModes)),\n secrets: this.secretReader.listSecrets(),\n serviceDiscoveryRegistries: ServiceDiscoveryReader.listServiceDiscoveryRegistries(),\n images: imagesPromise,\n })\n .then((backingData: Partial<IEcsServerGroupCommandBackingData>) => {\n backingData.accounts = keys(backingData.credentialsKeyedByAccount);\n backingData.filtered = {} as IEcsServerGroupCommandBackingDataFiltered;\n\n if (cmd.viewState.contextImages) {\n backingData.images = backingData.images.concat(cmd.viewState.contextImages);\n }\n cmd.backingData = backingData as IEcsServerGroupCommandBackingData;\n this.configureVpcId(cmd);\n this.configureAvailableIamRoles(cmd);\n this.configureAvailableSubnetTypes(cmd);\n this.configureAvailableSecurityGroups(cmd);\n this.configureAvailableEcsClusters(cmd);\n this.setCapacityProviderDetails(cmd);\n this.configureAvailableSecrets(cmd);\n this.configureAvailableServiceDiscoveryRegistries(cmd);\n this.configureAvailableImages(cmd);\n this.configureAvailableRegions(cmd);\n this.configureLoadBalancerOptions(cmd);\n this.applyOverrides('afterConfiguration', cmd);\n this.attachEventHandlers(cmd);\n });\n }\n\n public setCapacityProviderDetails(command: IEcsServerGroupCommand): void {\n this.$q\n .all({\n capacityProviderDetails: this.ecsClusterReader.describeClusters(command.credentials, command.region),\n })\n .then((result: Partial<IEcsServerGroupCommandBackingData>) => {\n command.backingData.capacityProviderDetails = chain(result.capacityProviderDetails)\n .map((cluster) => this.mapCapacityProviderDetails(cluster))\n .value();\n });\n\n if (command.ecsClusterName != null && command.ecsClusterName.length > 0) {\n this.configureAvailableCapacityProviders(command);\n } else {\n command.backingData.filtered.availableCapacityProviders = [];\n command.backingData.filtered.defaultCapacityProviderStrategy = [];\n }\n this.checkDirtyCapacityProviders(command);\n }\n\n public configureAvailableCapacityProviders(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availableCapacityProviders = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.capacityProviders)\n .flattenDeep<string>()\n .value();\n\n command.backingData.filtered.defaultCapacityProviderStrategy = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.defaultCapacityProviderStrategy)\n .flattenDeep<IEcsCapacityProviderStrategyItem>()\n .value();\n }\n\n public mapCapacityProviderDetails(describeClusters: IEcsCapacityProviderDetails): IEcsCapacityProviderDetails {\n return {\n capacityProviders: describeClusters.capacityProviders,\n clusterName: describeClusters.clusterName,\n defaultCapacityProviderStrategy: describeClusters.defaultCapacityProviderStrategy,\n };\n }\n\n public applyOverrides(phase: string, command: IEcsServerGroupCommand): void {\n this.serverGroupCommandRegistry.getCommandOverrides('ecs').forEach((override: any) => {\n if (override[phase]) {\n override[phase](command);\n }\n });\n }\n\n public grabImageAndTag(imageId: string): string {\n return imageId.split('/').pop();\n }\n\n public buildImageId(image: IEcsDockerImage): string {\n if (image.fromContext) {\n return `${image.imageLabelOrSha}`;\n } else if (image.fromTrigger && !image.tag) {\n return `${image.registry}/${image.repository} (Tag resolved at runtime)`;\n } else {\n return `${image.registry}/${image.repository}:${image.tag}`;\n }\n }\n\n public mapImage(image: IEcsDockerImage): IEcsDockerImage {\n if (image.message !== undefined) {\n return image;\n }\n\n return {\n repository: image.repository,\n tag: image.tag,\n imageId: this.buildImageId(image),\n registry: image.registry,\n fromContext: image.fromContext,\n fromTrigger: image.fromTrigger,\n account: image.account,\n imageLabelOrSha: image.imageLabelOrSha,\n stageId: image.stageId,\n message: image.message,\n };\n }\n\n public configureAvailableImages(command: IEcsServerGroupCommand): void {\n // No filtering required, but need to decorate with the displayable image ID\n command.backingData.filtered.images = command.backingData.images.map((image) => this.mapImage(image));\n }\n\n public configureAvailabilityZones(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availabilityZones = find<IRegion>(\n command.backingData.credentialsKeyedByAccount[command.credentials].regions,\n { name: command.region },\n ).availabilityZones;\n command.availabilityZones = command.backingData.filtered.availabilityZones;\n }\n\n public configureAvailableSecurityGroups(command: IEcsServerGroupCommand): void {\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.backingData.filtered.securityGroups = [];\n return;\n }\n\n const vpcId = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n purpose: command.subnetTypes ? command.subnetTypes[0] : command.subnetType,\n })\n .compact()\n .uniqBy('purpose')\n .map('vpcId')\n .value()[0];\n\n if (\n command.backingData.securityGroups[command.credentials] &&\n command.backingData.securityGroups[command.credentials]['ecs'] &&\n command.backingData.securityGroups[command.credentials]['ecs'][command.region]\n ) {\n const allSecurityGroups = command.backingData.securityGroups[command.credentials]['ecs'][command.region];\n command.backingData.filtered.securityGroupNames = chain(allSecurityGroups)\n .filter({ vpcId: vpcId })\n .map('name')\n .value() as string[];\n }\n }\n\n public configureAvailableSubnetTypes(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.subnetTypes = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .compact()\n .uniqBy('purpose')\n .value()\n .filter(function (e: ISubnet) {\n return e.purpose && e.purpose.length > 0;\n });\n }\n\n public configureAvailableEcsClusters(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.ecsClusters = chain(command.backingData.ecsClusters)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public configureAvailableSecrets(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.secrets = chain(command.backingData.secrets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public buildServiceRegistryDisplayName(registry: IServiceDiscoveryRegistryDescriptor): string {\n return `${registry.name} (${registry.id})`;\n }\n\n public mapServiceRegistry(registry: IServiceDiscoveryRegistryDescriptor): IServiceDiscoveryRegistryDescriptor {\n return {\n account: registry.account,\n region: registry.region,\n name: registry.name,\n id: registry.id,\n arn: registry.arn,\n displayName: this.buildServiceRegistryDisplayName(registry),\n };\n }\n\n public configureAvailableServiceDiscoveryRegistries(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.serviceDiscoveryRegistries = chain(command.backingData.serviceDiscoveryRegistries)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map((registry) => this.mapServiceRegistry(registry))\n .value();\n }\n\n public configureAvailableRegions(command: IEcsServerGroupCommand): void {\n const regionsForAccount: IAccountDetails =\n command.backingData.credentialsKeyedByAccount[command.credentials] || ({ regions: [] } as IAccountDetails);\n command.backingData.filtered.regions = regionsForAccount.regions;\n }\n\n public configureAvailableIamRoles(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.iamRoles = chain(command.backingData.iamRoles)\n .filter({ accountName: command.credentials })\n .map('name')\n .value();\n if (command.backingData.filtered.iamRoles.length > 0) {\n command.backingData.filtered.iamRoles.splice(0, 0, 'None (No IAM role)');\n }\n }\n\n public configureSubnetPurposes(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (command.region === null) {\n return result;\n }\n filteredData.subnetPurposes = chain(command.backingData.subnets)\n .filter({ account: command.credentials, region: command.region })\n .reject({ target: 'elb' })\n .reject({ purpose: null })\n .uniqBy('purpose')\n .value();\n\n if (command.subnetTypes) {\n result.dirty.subnetType = !command.subnetTypes.every((subnetType) =>\n chain(filteredData.subnetPurposes).some({ purpose: subnetType }).value(),\n );\n } else if (!chain(filteredData.subnetPurposes).some({ purpose: command.subnetType }).value()) {\n result.dirty.subnetType = true;\n }\n\n if (result.dirty.subnetType) {\n command.subnetTypes = null;\n command.subnetType = null;\n }\n\n return result;\n }\n\n private getLoadBalancerMap(command: IEcsServerGroupCommand): IAmazonLoadBalancer[] {\n return chain(command.backingData.loadBalancers)\n .map('accounts')\n .flattenDeep()\n .filter({ name: command.credentials })\n .map('regions')\n .flattenDeep()\n .filter({ name: command.region })\n .map<IAmazonLoadBalancer>('loadBalancers')\n .flattenDeep<IAmazonLoadBalancer>()\n .value();\n }\n\n public getLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancers = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId === command.vpcId,\n );\n return loadBalancers.map((lb) => lb.name).sort();\n }\n\n public getVpcLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersForVpc = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId,\n );\n return loadBalancersForVpc.map((lb) => lb.name).sort();\n }\n\n public getTargetGroupNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersV2 = this.getLoadBalancerMap(command).filter((lb) => lb.loadBalancerType !== 'classic') as any[];\n const allTargetGroups = flatten(loadBalancersV2.map<string[]>((lb) => lb.targetGroups));\n return allTargetGroups.sort();\n }\n\n public configureLoadBalancerOptions(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const currentLoadBalancers = (command.loadBalancers || []).concat(command.vpcLoadBalancers || []);\n const newLoadBalancers = this.getLoadBalancerNames(command);\n const vpcLoadBalancers = this.getVpcLoadBalancerNames(command);\n const allTargetGroups = this.getTargetGroupNames(command);\n const currentTargetGroups = command.targetGroupMappings.map((tg) => tg.targetGroup);\n if (currentLoadBalancers && command.loadBalancers) {\n const valid = command.vpcId ? newLoadBalancers : newLoadBalancers.concat(vpcLoadBalancers);\n const matched = intersection(valid, currentLoadBalancers);\n const removedLoadBalancers = xor(matched, currentLoadBalancers);\n command.loadBalancers = intersection(newLoadBalancers, matched);\n if (!command.vpcId) {\n command.vpcLoadBalancers = intersection(vpcLoadBalancers, matched);\n } else {\n delete command.vpcLoadBalancers;\n }\n if (removedLoadBalancers.length) {\n result.dirty.loadBalancers = removedLoadBalancers;\n }\n }\n\n if (currentTargetGroups) {\n const matched = intersection(allTargetGroups, currentTargetGroups);\n const removedTargetGroups = xor(matched, currentTargetGroups);\n if (removedTargetGroups && removedTargetGroups.length > 0) {\n command.viewState.dirty.targetGroups = removedTargetGroups;\n } else if (command.viewState.dirty && command.viewState.dirty.targetGroups) {\n command.viewState.dirty.targetGroups = [];\n }\n }\n\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n command.backingData.filtered.vpcLoadBalancers = vpcLoadBalancers;\n command.backingData.filtered.targetGroups = allTargetGroups;\n return result;\n }\n\n public refreshLoadBalancers(command: IEcsServerGroupCommand, skipCommandReconfiguration?: boolean) {\n return this.loadBalancerReader.listLoadBalancers('ecs').then((loadBalancers) => {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n this.configureLoadBalancerOptions(command);\n }\n });\n }\n\n public configureVpcId(command: IEcsServerGroupCommand): IEcsServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.vpcId = null;\n result.dirty.vpcId = true;\n } else if (command.subnetTypes != null && command.subnetTypes.length > 0) {\n command.subnetTypes.forEach(function (subnetType) {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n });\n } else {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: command.subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n }\n return result;\n }\n\n public checkDirtyCapacityProviders(command: IEcsServerGroupCommand): void {\n if (command.capacityProviderStrategy) {\n const availableCustomCapacityProviders = command.backingData.filtered.availableCapacityProviders;\n const currentCapacityProviders = command.capacityProviderStrategy.map((cp) => cp.capacityProvider);\n const matchedCustomCapacityProviders = intersection(availableCustomCapacityProviders, currentCapacityProviders);\n const removedCustomCapacityProviders = xor(matchedCustomCapacityProviders, currentCapacityProviders);\n\n if (removedCustomCapacityProviders && removedCustomCapacityProviders.length > 0) {\n command.viewState.dirty.customCapacityProviders = removedCustomCapacityProviders;\n } else if (command.viewState.dirty && command.viewState.dirty.customCapacityProviders) {\n command.viewState.dirty.customCapacityProviders = [];\n }\n\n if (command.useDefaultCapacityProviders) {\n const availableDefaultCapacityProvider = command.backingData.filtered.defaultCapacityProviderStrategy.map(\n (cp) => cp.capacityProvider,\n );\n const matchedDefaultCapacityProviders = intersection(\n availableDefaultCapacityProvider,\n currentCapacityProviders,\n );\n const removedDefaultCapacityProviders = xor(matchedDefaultCapacityProviders, currentCapacityProviders);\n\n if (removedDefaultCapacityProviders && removedDefaultCapacityProviders.length > 0) {\n command.viewState.dirty.defaulCapacityProviders = removedDefaultCapacityProviders;\n }\n }\n }\n }\n\n public attachEventHandlers(cmd: IEcsServerGroupCommand): void {\n cmd.subnetChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result = this.configureVpcId(command);\n extend(result.dirty, this.configureLoadBalancerOptions(command).dirty);\n command.viewState.dirty = command.viewState.dirty || {};\n extend(command.viewState.dirty, result.dirty);\n return result;\n };\n\n cmd.regionChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n extend(result.dirty, this.configureSubnetPurposes(command).dirty);\n if (command.region) {\n extend(result.dirty, command.subnetChanged(command).dirty);\n this.configureAvailabilityZones(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.setCapacityProviderDetails(command);\n }\n\n return result;\n };\n\n cmd.subnetTypeChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n this.configureAvailableSecurityGroups(command);\n return result;\n };\n\n cmd.clusterChanged = (command: IEcsServerGroupCommand): void => {\n command.moniker = NameUtils.getMoniker(command.application, command.stack, command.freeFormDetails);\n };\n\n cmd.credentialsChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const backingData = command.backingData;\n if (command.credentials) {\n this.configureAvailableIamRoles(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.configureAvailableRegions(command);\n this.setCapacityProviderDetails(command);\n\n if (!some(backingData.filtered.regions, { name: command.region })) {\n command.region = null;\n result.dirty.region = true;\n } else {\n extend(result.dirty, command.regionChanged(command).dirty);\n }\n } else {\n command.region = null;\n }\n return result;\n };\n\n cmd.placementStrategyNameChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n command.placementStrategySequence = this.placementStrategyService.getPredefinedStrategy(\n command.placementStrategyName,\n );\n return result;\n };\n\n this.applyOverrides('attachEventHandlers', cmd);\n }\n}\n\nexport const ECS_SERVER_GROUP_CONFIGURATION_SERVICE = 'spinnaker.ecs.serverGroup.configure.service';\nmodule(ECS_SERVER_GROUP_CONFIGURATION_SERVICE, [\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n]).service('ecsServerGroupConfigurationService', EcsServerGroupConfigurationService);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, INSTANCE_TYPE_SERVICE } from '@spinnaker/core';\n\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from './serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.ecs.serverGroupCommandBuilder.service';\nexport const name = ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n INSTANCE_TYPE_SERVICE,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n ])\n .factory('ecsServerGroupCommandBuilder', [\n '$q',\n 'instanceTypeService',\n 'ecsServerGroupConfigurationService',\n function ($q, instanceTypeService, ecsServerGroupConfigurationService) {\n function reconcileUpstreamImages(image, upstreamImages) {\n if (image.fromContext) {\n const matchingImage = upstreamImages.find((otherImage) => image.stageId === otherImage.stageId);\n\n if (matchingImage) {\n image.cluster = matchingImage.cluster;\n image.pattern = matchingImage.pattern;\n image.repository = matchingImage.repository;\n return image;\n } else {\n return null;\n }\n } else if (image.fromTrigger) {\n const matchingImage = upstreamImages.find((otherImage) => {\n return (\n image.registry === otherImage.registry &&\n image.repository === otherImage.repository &&\n image.tag === otherImage.tag\n );\n });\n\n if (matchingImage) {\n return image;\n } else {\n return null;\n }\n } else {\n return image;\n }\n }\n\n function findUpstreamImages(current, all, visited = {}) {\n // This actually indicates a loop in the stage dependencies.\n if (visited[current.refId]) {\n return [];\n } else {\n visited[current.refId] = true;\n }\n let result = [];\n if (current.type === 'findImageFromTags') {\n result.push({\n fromContext: true,\n imageLabelOrSha: current.imageLabelOrSha,\n stageId: current.refId,\n });\n }\n current.requisiteStageRefIds.forEach(function (id) {\n const next = all.find((stage) => stage.refId === id);\n if (next) {\n result = result.concat(findUpstreamImages(next, all, visited));\n }\n });\n\n return result;\n }\n\n function findTriggerImages(triggers) {\n const result = triggers\n .filter((trigger) => {\n return trigger.type === 'docker';\n })\n .map((trigger) => {\n return {\n fromTrigger: true,\n repository: trigger.repository,\n account: trigger.account,\n organization: trigger.organization,\n registry: trigger.registry,\n tag: trigger.tag,\n };\n });\n\n return result;\n }\n\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n const credentialsLoader = AccountService.getCredentialsKeyedByAccount('ecs');\n\n const defaultCredentials = defaults.account || application.defaultCredentials.ecs;\n const defaultRegion = defaults.region || application.defaultRegions.ecs;\n\n const preferredZonesLoader = AccountService.getAvailabilityZonesForAccountAndRegion(\n 'ecs',\n defaultCredentials,\n defaultRegion,\n );\n\n return $q\n .all({\n preferredZones: preferredZonesLoader,\n credentialsKeyedByAccount: credentialsLoader,\n })\n .then(function (asyncData) {\n const availabilityZones = asyncData.preferredZones;\n\n let defaultIamRole = 'None (No IAM role)';\n defaultIamRole = defaultIamRole.replace('{{application}}', application.name);\n\n const defaultImageCredentials = 'None (No registry credentials)';\n\n const command = {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n strategy: '',\n capacity: {\n min: 1,\n max: 1,\n desired: 1,\n },\n launchType: 'EC2',\n healthCheckType: 'EC2',\n selectedProvider: 'ecs',\n iamRole: defaultIamRole,\n dockerImageCredentialsSecret: defaultImageCredentials,\n availabilityZones: availabilityZones,\n subnetType: '',\n securityGroupNames: [],\n healthCheckGracePeriodSeconds: '',\n placementConstraints: [],\n placementStrategyName: '',\n taskDefinitionArtifact: {},\n useTaskDefinitionArtifact: false,\n placementStrategySequence: [],\n serviceDiscoveryAssociations: [],\n ecsClusterName: '',\n targetGroup: '',\n copySourceScalingPoliciesAndActions: true,\n preferSourceCapacity: true,\n useSourceCapacity: true,\n enableDeploymentCircuitBreaker: false,\n viewState: {\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n dirty: {},\n },\n };\n\n if (\n application.attributes &&\n application.attributes.platformHealthOnlyShowOverride &&\n application.attributes.platformHealthOnly\n ) {\n command.interestingHealthProviderNames = ['ecs'];\n }\n\n return command;\n });\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = Object.keys(pipelineCluster.availabilityZones)[0];\n // var instanceTypeCategoryLoader = instanceTypeService.getCategoryForInstanceType('ecs', pipelineCluster.instanceType);\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const zones = pipelineCluster.availabilityZones[region];\n const usePreferredZones = zones.join(',') === command.availabilityZones.join(',');\n\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n if (command.docker && command.docker.image) {\n command.docker.image = reconcileUpstreamImages(command.docker.image, contextImages);\n }\n\n const viewState = {\n instanceProfile: undefined,\n disableImageSelection: true,\n useSimpleCapacity:\n pipelineCluster.capacity.min === pipelineCluster.capacity.max &&\n pipelineCluster.useSourceCapacity !== true,\n usePreferredZones: usePreferredZones,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n existingPipelineCluster: true,\n dirty: {},\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n availabilityZones: pipelineCluster.availabilityZones[region],\n viewState: viewState,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n return angular.extend({}, command, pipelineCluster, viewOverrides);\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline(current, pipeline) {\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n // applies viewState overrides after template selection\n overrides: {\n viewState: {\n mode: 'editPipeline',\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n },\n },\n },\n });\n }\n\n function buildUpdateServerGroupCommand(serverGroup) {\n const command = {\n type: 'modifyAsg',\n asgs: [{ asgName: serverGroup.name, region: serverGroup.region }],\n healthCheckType: serverGroup.asg.healthCheckType,\n credentials: serverGroup.account,\n };\n ecsServerGroupConfigurationService.configureUpdateCommand(command);\n return command;\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode = 'clone') {\n // do NOT copy: deployment strategy. DO copy: account, region, cluster name, stack\n // TODO: query for & pull in ECS-specific data that would be useful, e.g, network mode, launch type\n const commandOptions = { account: serverGroup.account, region: serverGroup.region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n command.credentials = serverGroup.account;\n command.app = serverGroup.moniker.app;\n command.stack = serverGroup.moniker.stack;\n command.region = serverGroup.region;\n command.ecsClusterName = serverGroup.ecsCluster;\n command.capacity = serverGroup.capacity;\n command.viewState.mode = mode;\n\n return command;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n buildUpdateServerGroupCommand: buildUpdateServerGroupCommand,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport {\n ModalWizard,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SERVER_GROUP_WRITER,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { ECS_CLUSTER_READ_SERVICE } from '../../../ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from '../../../iamRoles/iamRole.read.service';\nimport { ECS_SECRET_READ_SERVICE } from '../../../secrets/secret.read.service';\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER =\n 'spinnaker.ecs.cloneServerGroup.controller';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n SERVER_GROUP_WRITER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n IAM_ROLE_READ_SERVICE,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n]).controller('ecsCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'overrideRegistry',\n 'ecsServerGroupConfigurationService',\n 'serverGroupCommandRegistry',\n 'serverGroupCommand',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'secretReader',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n overrideRegistry,\n ecsServerGroupConfigurationService,\n serverGroupCommandRegistry,\n serverGroupCommand,\n iamRoleReader,\n ecsClusterReader,\n secretReader,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: overrideRegistry.getTemplate(\n 'ecs.serverGroup.templateSelection',\n require('./templateSelection/templateSelection.html'),\n ),\n basicSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.basicSettings',\n require('./location/basicSettings.html'),\n ),\n container: overrideRegistry.getTemplate('ecs.serverGroup.container', require('./container/container.html')),\n horizontalScaling: overrideRegistry.getTemplate(\n 'ecs.serverGroup.horizontalScaling',\n require('./horizontalScaling/horizontalScaling.html'),\n ),\n networking: overrideRegistry.getTemplate('ecs.serverGroup.networking', require('./networking/networking.html')),\n logging: overrideRegistry.getTemplate('ecs.serverGroup.logging', require('./logging/logging.html')),\n serviceDiscovery: overrideRegistry.getTemplate(\n 'ecs.serverGroup.serviceDiscovery',\n require('./serviceDiscovery/serviceDiscovery.html'),\n ),\n advancedSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.advancedSettings',\n require('./advancedSettings/advancedSettings.html'),\n ),\n taskDefinition: overrideRegistry.getTemplate(\n 'ecs.taskDefinition',\n require('./taskDefinition/taskDefinition.html'),\n ),\n };\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n\n $scope.command = serverGroupCommand;\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: ['account, region, ecs cluster, stack', 'capacity'],\n notCopied: ['launch type, target group, network mode'],\n };\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'ecs',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n ecsServerGroupConfigurationService.configureCommand($scope.command).then(function () {\n $scope.state.loaded = true;\n initializeCommand();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWatches() {\n $scope.$watch('command.subnetType', createResultProcessor($scope.command.subnetTypeChanged));\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n $scope.$watch(\n 'command.placementStrategyName',\n createResultProcessor($scope.command.placementStrategyNameChanged),\n );\n $scope.$watch('command.stack', () => $scope.command.clusterChanged($scope.command));\n $scope.$watch('command.freeFormDetails', () => $scope.command.clusterChanged($scope.command));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged(serverGroupCommand));\n processCommandUpdateResult($scope.command.regionChanged(serverGroupCommand));\n }\n\n function createResultProcessor(method) {\n return function () {\n processCommandUpdateResult(method(serverGroupCommand));\n };\n }\n\n function processCommandUpdateResult() {\n // TODO(Bruno Carrier) - Implement marking sections either dirty or complete\n }\n\n function initializeCommand() {}\n\n this.isValid = function () {\n return true; // TODO(Bruno Carrier) - Implement validation of the form\n };\n\n this.showSubmitButton = function () {\n return ModalWizard.allPagesVisited();\n };\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n // used by react components to update command fields in parent (angular) scope\n $scope.notifyAngular = function (commandKey, value) {\n if (commandKey == 'pipeline') {\n $scope.command.viewState.pipeline = value;\n } else {\n $scope.command[commandKey] = value;\n }\n };\n\n // used by react components to configure command for image queries\n $scope.configureCommand = function (query) {\n return ecsServerGroupConfigurationService.configureCommand($scope.command, query);\n };\n\n // TODO: Migrate horizontalScaling component to react and move this logic there\n $scope.capacityProviderState = {\n useCapacityProviders:\n $scope.command.capacityProviderStrategy && $scope.command.capacityProviderStrategy.length > 0,\n updateComputeOption: function (chosenOption) {\n if (chosenOption == 'launchType') {\n $scope.command.capacityProviderStrategy = [];\n } else if (chosenOption == 'capacityProviders') {\n $scope.command.launchType = '';\n $scope.command.capacityProviderStrategy = $scope.command.capacityProviderStrategy || [];\n }\n },\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.advancedSettings.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT, []).component(\n 'ecsServerGroupAdvancedSettings',\n {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./advancedSettings.component.html'),\n },\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderStrategyItem, IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsCapacityProviderProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsCapacityProviderState {\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n availableCapacityProviders: string[];\n ecsClusterName: string;\n useDefaultCapacityProviders: boolean;\n capacityProviderLoadedFlag: boolean;\n}\n\nclass EcsCapacityProvider extends React.Component<IEcsCapacityProviderProps, IEcsCapacityProviderState> {\n constructor(props: IEcsCapacityProviderProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n ecsClusterName: cmd.ecsClusterName,\n useDefaultCapacityProviders:\n cmd.useDefaultCapacityProviders || (cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length == 0),\n capacityProviderStrategy:\n cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length > 0 ? cmd.capacityProviderStrategy : [],\n capacityProviderLoadedFlag: false,\n };\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n const cmd = this.props.command;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n this.setState({\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n capacityProviderStrategy: this.getCapacityProviderStrategy(useDefaultCapacityProviders, cmd),\n capacityProviderLoadedFlag: true,\n });\n this.props.notifyAngular('useDefaultCapacityProviders', this.state.useDefaultCapacityProviders);\n this.props.notifyAngular('capacityProviderStrategy', this.state.capacityProviderStrategy);\n });\n }\n\n private getAvailableCapacityProviders = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.availableCapacityProviders\n ? cmd.backingData.filtered.availableCapacityProviders\n : [];\n };\n\n private getDefaultCapacityProviderStrategy = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : [];\n };\n\n private getCapacityProviderStrategy = (useDefaultCapacityProviders: boolean, cmd: IEcsServerGroupCommand) => {\n return useDefaultCapacityProviders &&\n cmd.backingData &&\n cmd.backingData.filtered &&\n cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : this.state.capacityProviderStrategy;\n };\n\n private addCapacityProviderStrategy = () => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.push({ capacityProvider: '', base: null, weight: null });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private removeCapacityProviderStrategy = (index: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.splice(index, 1);\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderName = (index: number, targetCapacityProviderName: string) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.capacityProvider = targetCapacityProviderName;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.command.viewState.dirty.customCapacityProviders = [];\n };\n\n private updateCapacityProviderBase = (index: number, targetCapacityProviderBase: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.base = targetCapacityProviderBase;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderWeight = (index: number, targetCapacityProviderWeight: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.weight = targetCapacityProviderWeight;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderType = (targetCapacityProviderType: boolean) => {\n this.setState({ useDefaultCapacityProviders: targetCapacityProviderType });\n this.props.notifyAngular('useDefaultCapacityProviders', targetCapacityProviderType);\n this.props.command.viewState.dirty.customCapacityProviders = [];\n\n const capacityProviderStrategy =\n targetCapacityProviderType && this.state.defaultCapacityProviderStrategy.length > 0\n ? this.state.defaultCapacityProviderStrategy\n : [];\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n };\n\n render(): React.ReactElement<EcsCapacityProvider> {\n const updateCapacityProviderName = this.updateCapacityProviderName;\n const updateCapacityProviderBase = this.updateCapacityProviderBase;\n const updateCapacityProviderWeight = this.updateCapacityProviderWeight;\n const addCapacityProviderStrategy = this.addCapacityProviderStrategy;\n const removeCapacityProviderStrategy = this.removeCapacityProviderStrategy;\n const updateCapacityProviderType = this.updateCapacityProviderType;\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n const capacityProviderLoadedFlag = this.state.capacityProviderLoadedFlag;\n const customDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.customCapacityProviders\n ? this.props.command.viewState.dirty.customCapacityProviders\n : [];\n const defaultDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.defaulCapacityProviders\n ? this.props.command.viewState.dirty.defaulCapacityProviders\n : [];\n\n const capacityProviderNames =\n this.state.availableCapacityProviders && this.state.availableCapacityProviders.length > 0\n ? this.state.availableCapacityProviders.map((capacityProviderNames) => {\n return { label: `${capacityProviderNames}`, value: capacityProviderNames };\n })\n : [];\n\n const defaultCPError =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p className=\"text-left\">\n <i className=\"fa fa-exclamation-triangle\"></i>\n Invalid capacity providers are a part of default capacity provider strategy.\n <br />\n Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a\n custom strategy.\n </p>\n </div>\n ) : (\n ''\n );\n\n const dirtyCapacityProviderList = customDirtyCapacityProviders\n ? customDirtyCapacityProviders.map(function (capacityProvider, index) {\n return <li key={index}>{capacityProvider}</li>;\n })\n : '';\n\n const dirtyCapacityProviderSection =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders.length > 0 ? (\n defaultCPError\n ) : customDirtyCapacityProviders.length > 0 && !useDefaultCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following capacity providers could not be found in the selected account/region/cluster and were removed:\n </p>\n <ul>{dirtyCapacityProviderList}</ul>\n <br />\n <p className=\"text-left\">Please select the capacity provider(s) from the dropdown to resolve this error.</p>\n </div>\n ) : (\n ''\n );\n\n const capacityProviderInputs =\n capacityProviderStrategy.length > 0 ? (\n capacityProviderStrategy.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useDefaultCapacityProviders ? (\n <td>\n <input\n data-test-id={'ServerGroup.defaultCapacityProvider.name.' + index}\n type=\"string\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.capacityProvider}\n disabled={true}\n />\n </td>\n ) : (\n <td data-test-id={'ServerGroup.customCapacityProvider.name.' + index}>\n <TetheredSelect\n placeholder=\"Select capacity provider\"\n options={capacityProviderNames}\n value={mapping.capacityProvider}\n onChange={(e: Option) => {\n updateCapacityProviderName(index, e.label as string);\n }}\n clearable={false}\n />\n </td>\n )}\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.base.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n value={mapping.base}\n onChange={(e) => updateCapacityProviderBase(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.weight.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.weight}\n onChange={(e) => updateCapacityProviderWeight(index, e.target.valueAsNumber)}\n />\n </td>\n {!useDefaultCapacityProviders ? (\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeCapacityProviderStrategy(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n ) : (\n ''\n )}\n </tr>\n );\n })\n ) : useDefaultCapacityProviders && this.state.capacityProviderStrategy.length == 0 ? (\n <tr>\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\">\n {' '}\n The cluster does not have a default capacity provider strategy defined. Set a default capacity provider\n strategy or use a custom strategy.\n </Alert>\n </div>\n </tr>\n ) : (\n ''\n );\n\n const newCapacityProviderStrategy =\n this.state.ecsClusterName &&\n this.props.command.credentials &&\n this.props.command.region &&\n !useDefaultCapacityProviders &&\n capacityProviderNames.length > 0 ? (\n <button\n data-test-id=\"ServerGroup.addCapacityProvider\"\n className=\"btn btn-block btn-sm add-new\"\n onClick={addCapacityProviderStrategy}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Capacity Provider\n </button>\n ) : !useDefaultCapacityProviders && capacityProviderLoadedFlag && capacityProviderNames.length == 0 ? (\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\"> The cluster does not have capacity providers defined. </Alert>\n </div>\n ) : (\n ''\n );\n\n return (\n <div>\n {(customDirtyCapacityProviders.length > 0 || defaultDirtyCapacityProviders.length > 0) &&\n capacityProviderLoadedFlag ? (\n <div>{dirtyCapacityProviderSection}</div>\n ) : (\n ''\n )}\n <div className=\"sm-label-left\">\n <b>Capacity Provider Strategy</b>\n <HelpField id=\"ecs.capacityProviderStrategy\" /> <br />\n <span>({this.state.ecsClusterName})</span>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.default\"\n type=\"radio\"\n checked={useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(true)}\n id=\"computeOptionsLaunchType1\"\n />\n Use cluster default\n </label>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.custom\"\n type=\"radio\"\n checked={!useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(false)}\n id=\"computeOptionsCapacityProviders2\"\n />\n Use custom (Advanced)\n </label>\n </div>\n {capacityProviderLoadedFlag ? (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th style={{ width: '50%' }}>\n Provider name\n <HelpField id=\"ecs.capacityProviderName\" />\n </th>\n <th style={{ width: '25%' }}>\n Base\n <HelpField id=\"ecs.capacityProviderBase\" />\n </th>\n <th style={{ width: '25%' }}>\n Weight\n <HelpField id=\"ecs.capacityProviderWeight\" />\n </th>\n </tr>\n </thead>\n <tbody>{capacityProviderInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newCapacityProviderStrategy}</td>\n </tr>\n </tfoot>\n </table>\n ) : (\n <div className=\"load medium\">\n <div className=\"message\">Loading capacity providers...</div>\n <div className=\"bars\">\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const ECS_CAPACITY_PROVIDER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.capacityProvider.react';\nmodule(ECS_CAPACITY_PROVIDER_REACT, []).component(\n 'ecsCapacityProviderReact',\n react2angular(withErrorBoundary(EcsCapacityProvider, 'ecsCapacityProviderReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { IAccountDetails } from '@spinnaker/core';\nimport { AccountService, HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport type {\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IContainerProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IContainerState {\n imageDescription: IEcsDockerImage;\n computeUnits: number;\n reservedMemory: number;\n dockerImages: IEcsDockerImage[];\n dockerRegistryAccounts: IAccountDetails[];\n selectedDockerAccount: string;\n targetGroupsAvailable: string[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n}\n\nexport class Container extends React.Component<IContainerProps, IContainerState> {\n constructor(props: IContainerProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n cmd.containerMappings = null;\n\n this.state = {\n imageDescription: cmd.imageDescription ? cmd.imageDescription : this.getEmptyImageDescription(),\n computeUnits: cmd.computeUnits,\n reservedMemory: cmd.reservedMemory,\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n dockerRegistryAccounts: [],\n selectedDockerAccount: cmd.imageDescription?.account ?? '',\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n };\n\n this.state.targetGroupMappings.forEach((targetGroupMapping) => {\n targetGroupMapping.containerName = '';\n });\n }\n\n public componentDidMount() {\n AccountService.listAccounts('dockerRegistry').then((accounts: IAccountDetails[]) => {\n this.setState({ dockerRegistryAccounts: accounts });\n });\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private updateDockerRegistryAccount = (newAccount: Option<string>) => {\n const account = newAccount.value;\n this.setState({ selectedDockerAccount: account, dockerImages: [] });\n DockerImageReader.findImages({ provider: 'dockerRegistry', account, count: 50 }).then((images) => {\n const ecsImages = images as IEcsDockerImage[];\n this.props.command.backingData.filtered.images = ecsImages;\n this.setState({ dockerImages: ecsImages });\n });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingImage = (newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n\n this.props.notifyAngular('imageDescription', newImageDescription);\n this.setState({ imageDescription: newImageDescription });\n };\n\n private updateComputeUnits = (newComputeUnits: number) => {\n this.props.notifyAngular('computeUnits', newComputeUnits);\n this.setState({ computeUnits: newComputeUnits });\n };\n\n private updateReservedMemory = (newReservedMemory: number) => {\n this.props.notifyAngular('reservedMemory', newReservedMemory);\n this.setState({ reservedMemory: newReservedMemory });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n this.updateDirtyTargetGroups();\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateDirtyTargetGroups = () => {\n this.props.command.viewState.dirty.targetGroups = [];\n };\n\n public render(): React.ReactElement<Container> {\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateComputeUnits = this.updateComputeUnits;\n const updateReservedMemory = this.updateReservedMemory;\n const dirtyTagetGroups =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.targetGroups\n ? this.props.command.viewState.dirty.targetGroups\n : [];\n\n const dockerRegistryAccountOptions = this.state.dockerRegistryAccounts.map((account) => ({\n label: account.name,\n value: account.name,\n }));\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const dirtyTargetGroupList = dirtyTagetGroups\n ? dirtyTagetGroups.map(function (targetGroup, index) {\n return <li key={index}>{targetGroup}</li>;\n })\n : '';\n\n const dirtyTargetGroupSection = (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following target groups could not be found in the selected account/region/VPC and were removed:\n </p>\n <ul>{dirtyTargetGroupList}</ul>\n <br />\n <p className=\"text-left\">Please select the target group(s) from the dropdown to resolve this error.</p>\n </div>\n );\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"ContainerInputs.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td data-test-id=\"ContainerInputs.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"ContainerInputs.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"ContainerInputs.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n return (\n <div className=\"container-fluid form-horizontal\">\n {dirtyTagetGroups.length > 0 ? <div>{dirtyTargetGroupSection}</div> : ''}\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Docker Registry Account</b>\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.dockerRegistryAccount\">\n <TetheredSelect\n placeholder=\"Select a Docker registry account...\"\n options={dockerRegistryAccountOptions}\n value={this.state.selectedDockerAccount}\n onChange={(e: Option) => this.updateDockerRegistryAccount(e as Option<string>)}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Container Image</b>\n <HelpField id=\"ecs.containerMappingImage\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={this.state.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(e as Option<string>);\n }}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Compute Units</b>\n <HelpField id=\"ecs.capacity.reserved.computeUnits\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.computeUnits\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.computeUnits}\n onChange={(e) => updateComputeUnits(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Reserved Memory</b>\n <HelpField id=\"ecs.capacity.reserved.memory\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.reservedMemory\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.reservedMemory}\n onChange={(e) => updateReservedMemory(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsContainerTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '80%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '20%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const CONTAINER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.container.react';\nmodule(CONTAINER_REACT, []).component(\n 'containerReact',\n react2angular(withErrorBoundary(Container, 'containerReact'), ['command', 'notifyAngular', 'configureCommand']),\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.horizontalScaling.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT, []).component(\n 'ecsServerGroupHorizontalScaling',\n {\n bindings: {\n command: '=',\n application: '=',\n capacityProviderState: '=',\n notifyAngular: '=',\n configureCommand: '=',\n },\n templateUrl: require('./horizontalScaling.component.html'),\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.ecs.serverGroup.configure.basicSettings';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n ])\n .controller('ecsServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n function ($scope, $controller, $uibModalStack, $state) {\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basicSettings');\n ModalWizard.markComplete('basicSettings');\n } else {\n ModalWizard.markIncomplete('basicSettings');\n }\n });\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVER_GROUP_LOGGING = 'spinnaker.ecs.serverGroup.configure.wizard.logging.component';\nmodule(ECS_SERVER_GROUP_LOGGING, []).component('ecsServerGroupLogging', {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./logging.component.html'),\n});\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { ISubnet } from '@spinnaker/core';\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsNetworkingProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsNetworkingState {\n associatePublicIpAddress: boolean;\n networkMode: string;\n networkModesAvailable: string[];\n securityGroupNames: string[];\n securityGroupsAvailable: string[];\n subnetTypes: string[];\n subnetTypesAvailable: ISubnet[];\n}\n\nexport class EcsNetworking extends React.Component<IEcsNetworkingProps, IEcsNetworkingState> {\n constructor(props: IEcsNetworkingProps) {\n super(props);\n const cmd = this.props.command;\n\n let defaultSubnetTypes: string[] = [];\n if (cmd.subnetTypes && cmd.subnetTypes.length > 0) {\n defaultSubnetTypes = cmd.subnetTypes;\n }\n\n if (cmd.subnetType && cmd.subnetType.length > 0) {\n defaultSubnetTypes.push(cmd.subnetType);\n cmd.subnetType = '';\n }\n\n cmd.subnetTypes = uniqWith(defaultSubnetTypes, isEqual);\n\n this.state = {\n associatePublicIpAddress: cmd.associatePublicIpAddress,\n networkMode: cmd.networkMode,\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupNames: cmd.securityGroupNames,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypes: cmd.subnetTypes,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n };\n }\n\n public componentDidMount() {\n const cmd = this.props.command;\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n });\n }\n\n private updateNetworkMode = (newNetworkMode: Option<string>) => {\n const updatedNetworkMode = newNetworkMode.value;\n const cmd = this.props.command;\n this.props.notifyAngular('networkMode', updatedNetworkMode);\n this.setState({\n networkMode: updatedNetworkMode,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n };\n\n private updateSecurityGroups = (newSecurityGroups: Option<string>) => {\n const updatedSecurityGroups = Array.isArray(newSecurityGroups)\n ? newSecurityGroups.map((securityGroups) => securityGroups.value)\n : [];\n this.props.notifyAngular('securityGroupNames', updatedSecurityGroups);\n this.setState({ securityGroupNames: updatedSecurityGroups });\n };\n\n private updateSubnetTypes = (newSubnetTypes: Option<string>) => {\n const cmd = this.props.command;\n const updatedSubnetTypes = Array.isArray(newSubnetTypes)\n ? newSubnetTypes.map((subnetType) => subnetType.value)\n : [];\n this.props.notifyAngular('subnetTypes', updatedSubnetTypes);\n cmd.subnetTypeChanged(cmd);\n this.setState({\n subnetTypes: updatedSubnetTypes,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n });\n };\n\n private updateAssociatePublicIpAddress = (usePublicIp: boolean) => {\n this.props.notifyAngular('associatePublicIpAddress', usePublicIp);\n this.setState({ associatePublicIpAddress: usePublicIp });\n };\n\n public render(): React.ReactElement<EcsNetworking> {\n const updateAssociatePublicIpAddress = this.updateAssociatePublicIpAddress;\n const updateNetworkMode = this.updateNetworkMode;\n const updateSecurityGroups = this.updateSecurityGroups;\n const updateSubnetTypes = this.updateSubnetTypes;\n\n const networkModesAvailable = this.state.networkModesAvailable.map(function (networkMode) {\n return { label: `${networkMode}`, value: networkMode };\n });\n\n const securityGroupsAvailable = this.state.securityGroupsAvailable.map(function (securityGroup) {\n return { label: `${securityGroup}`, value: securityGroup };\n });\n\n const subnetTypesAvailable = this.state.subnetTypesAvailable.map(function (subnetType) {\n return { label: `${subnetType.purpose} (${subnetType.vpcId})`, value: subnetType.purpose };\n });\n\n const subnetTypeOptions = this.state.subnetTypesAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={subnetTypesAvailable}\n value={this.state.subnetTypes}\n onChange={(e: Option) => {\n updateSubnetTypes(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No account was selected, or no subnet types are available for this account</Alert>\n );\n\n const securityGroupsOptions = this.state.securityGroupsAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={securityGroupsAvailable}\n value={this.state.securityGroupNames}\n onChange={(e: Option) => {\n updateSecurityGroups(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No security groups found in the selected account/region</Alert>\n );\n\n const awsVpcOptions =\n this.state.networkMode === 'awsvpc' ? (\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>VPC Subnet</b>\n <HelpField key=\"ecs.subnet\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.subnetType\">\n {subnetTypeOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Security Groups</b>\n <HelpField key=\"ecs.securityGroups\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.securityGroups\">\n {securityGroupsOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Associate Public IP Address</b>\n <HelpField key=\"ecs.publicip\" />\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressTrue\"\n type=\"radio\"\n value=\"true\"\n id=\"associatePublicIpAddressTrue\"\n checked={this.state.associatePublicIpAddress === true}\n onChange={() => updateAssociatePublicIpAddress(true)}\n />\n Yes\n </label>\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressFalse\"\n type=\"radio\"\n value=\"false\"\n id=\"associatePublicIpAddressFalse\"\n checked={this.state.associatePublicIpAddress === false}\n onChange={() => updateAssociatePublicIpAddress(false)}\n />\n No\n </label>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"col-md-3 sm-label-right\"></div>\n );\n\n return (\n <div className=\"networking-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Network Mode</b>\n <HelpField id=\"ecs.networkMode\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.networkMode\">\n <TetheredSelect\n placeholder=\"Select a network mode to use ...\"\n options={networkModesAvailable}\n value={this.state.networkMode}\n onChange={(e: Option) => {\n updateNetworkMode(e as Option<string>);\n }}\n />\n </div>\n </div>\n </div>\n {awsVpcOptions}\n </div>\n );\n }\n}\n\nexport const ECS_NETWORKING_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.networking.react';\nmodule(ECS_NETWORKING_REACT, []).component(\n 'ecsNetworkingReact',\n react2angular(withErrorBoundary(EcsNetworking, 'ecsNetworkingReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type {\n IEcsServerGroupCommand,\n IEcsServiceDiscoveryRegistryAssociation,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IServiceDiscoveryProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\nexport interface IEcsServiceDiscoveryRegistry {\n account: string;\n region: string;\n name: string;\n id: string;\n arn: string;\n displayName: string;\n}\n\ninterface IServiceDiscoveryState {\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n serviceDiscoveryRegistriesAvailable: IEcsServiceDiscoveryRegistry[];\n useTaskDefinitionArtifact: boolean;\n}\n\nexport class ServiceDiscovery extends React.Component<IServiceDiscoveryProps, IServiceDiscoveryState> {\n constructor(props: IServiceDiscoveryProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n serviceDiscoveryAssociations: cmd.serviceDiscoveryAssociations,\n serviceDiscoveryRegistriesAvailable:\n cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.serviceDiscoveryRegistries : [],\n useTaskDefinitionArtifact: cmd.useTaskDefinitionArtifact,\n };\n\n if (!this.state.useTaskDefinitionArtifact) {\n this.state.serviceDiscoveryAssociations.forEach((serviceDiscoveryRegistryAssociation) => {\n serviceDiscoveryRegistryAssociation.containerName = null;\n });\n }\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n serviceDiscoveryRegistriesAvailable: this.props.command.backingData.filtered.serviceDiscoveryRegistries,\n });\n });\n }\n\n private getNameToRegistryMap = (): Map<string, IEcsServiceDiscoveryRegistry> => {\n const displayNameToRegistry = new Map<string, IEcsServiceDiscoveryRegistry>();\n this.props.command.backingData.filtered.serviceDiscoveryRegistries.forEach((e) => {\n displayNameToRegistry.set(e.displayName, e);\n });\n\n return displayNameToRegistry;\n };\n\n private getEmptyRegistry = (): IEcsServiceDiscoveryRegistry => {\n return {\n account: '',\n region: '',\n name: '',\n id: '',\n arn: '',\n displayName: '',\n };\n };\n\n private updateServiceDiscoveryRegistry = (index: number, newRegistry: Option<string>) => {\n const registryMap = this.getNameToRegistryMap();\n let newServiceDiscoveryRegistry = registryMap.get(newRegistry.value);\n\n if (!newServiceDiscoveryRegistry) {\n newServiceDiscoveryRegistry = this.getEmptyRegistry();\n }\n\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociation = currentAssociations[index];\n targetAssociation.registry = newServiceDiscoveryRegistry;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryPort = (index: number, targetPort: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerPort = targetPort;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryContainerName = (index: number, targetContainerName: string) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerName = targetContainerName;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private pushServiceDiscoveryAssociation = () => {\n const registryAssociations = this.state.serviceDiscoveryAssociations;\n registryAssociations.push({ registry: this.getEmptyRegistry(), containerPort: 80, containerName: '' });\n this.setState({ serviceDiscoveryAssociations: registryAssociations });\n };\n\n private removeServiceDiscoveryAssociations = (index: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n currentAssociations.splice(index, 1);\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n public render(): React.ReactElement<ServiceDiscovery> {\n const removeServiceDiscoveryAssociation = this.removeServiceDiscoveryAssociations;\n const updateServiceDiscoveryRegistry = this.updateServiceDiscoveryRegistry;\n const updateServiceDiscoveryPort = this.updateServiceDiscoveryPort;\n const updateServiceDiscoveryContainerName = this.updateServiceDiscoveryContainerName;\n\n const registriesAvailable = this.state.serviceDiscoveryRegistriesAvailable.map(function (registry) {\n return { label: `${registry.displayName}`, value: registry.displayName };\n });\n\n const useTaskDefinitionArtifact = this.state.useTaskDefinitionArtifact;\n const serviceDiscoveryInputs = this.state.serviceDiscoveryAssociations.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useTaskDefinitionArtifact && (\n <td>\n <input\n className=\"form-control input-sm\"\n placeholder=\"Enter a container name ...\"\n required={true}\n value={mapping.containerName}\n onChange={(e) => updateServiceDiscoveryContainerName(index, e.target.value)}\n />\n </td>\n )}\n <td>\n <TetheredSelect\n placeholder=\"Select a registry...\"\n options={registriesAvailable}\n value={mapping.registry.displayName.toString()}\n onChange={(e: Option) => updateServiceDiscoveryRegistry(index, e as Option<string>)}\n clearable={false}\n required={true}\n />\n </td>\n <td>\n <input\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort}\n onChange={(e) => updateServiceDiscoveryPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeServiceDiscoveryAssociation(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newServiceDiscoveryAssociation = this.state.serviceDiscoveryRegistriesAvailable.length ? (\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.pushServiceDiscoveryAssociation}>\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Service Registry\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No registries found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Service Registries (optional)</b>\n <HelpField id=\"ecs.serviceDiscovery\" />\n </div>\n <form name=\"ecsServiceDiscoveryRegistryMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n {useTaskDefinitionArtifact && (\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.serviceDiscoveryContainerName\" />\n </th>\n )}\n {useTaskDefinitionArtifact ? (\n <th style={{ width: '55%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n ) : (\n <th style={{ width: '80%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n )}\n <th style={{ width: '15%' }}>\n Port\n <HelpField id=\"ecs.serviceDiscoveryContainerPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{serviceDiscoveryInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newServiceDiscoveryAssociation}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const SERVICE_DISCOVERY_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.serviceDiscovery.react';\nmodule(SERVICE_DISCOVERY_REACT, []).component(\n 'serviceDiscoveryReact',\n react2angular(withErrorBoundary(ServiceDiscovery, 'serviceDiscoveryReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact } from '@spinnaker/core';\nimport {\n AccountService,\n ArtifactTypePatterns,\n CheckboxInput,\n HelpField,\n StageArtifactSelectorDelegate,\n StageConfigField,\n TetheredSelect,\n withErrorBoundary,\n} from '@spinnaker/core';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport type {\n IEcsContainerMapping,\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n IEcsTaskDefinitionArtifact,\n} from '../../serverGroupConfiguration.service';\n\nexport interface ITaskDefinitionProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface ITaskDefinitionState {\n taskDefArtifact: IEcsTaskDefinitionArtifact;\n taskDefArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n dockerImages: IEcsDockerImage[];\n dockerRegistryAccounts: IAccountDetails[];\n selectedDockerAccount: string;\n targetGroupsAvailable: string[];\n loadBalancedContainer: string;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n}\n\nexport class TaskDefinition extends React.Component<ITaskDefinitionProps, ITaskDefinitionState> {\n constructor(props: ITaskDefinitionProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n\n this.state = {\n taskDefArtifact: cmd.taskDefinitionArtifact,\n containerMappings: cmd.containerMappings ? cmd.containerMappings : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n dockerRegistryAccounts: [],\n selectedDockerAccount: cmd.imageDescription?.account ?? '',\n loadBalancedContainer: cmd.loadBalancedContainer || defaultContainer,\n taskDefArtifactAccount: cmd.taskDefinitionArtifactAccount,\n evaluateTaskDefinitionArtifactExpressions: cmd.evaluateTaskDefinitionArtifactExpressions,\n };\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n public componentDidMount() {\n AccountService.listAccounts('dockerRegistry').then((accounts: IAccountDetails[]) => {\n this.setState({ dockerRegistryAccounts: accounts });\n });\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n private updateDockerRegistryAccount = (newAccount: Option<string>) => {\n const account = newAccount.value;\n this.setState({ selectedDockerAccount: account, dockerImages: [] });\n DockerImageReader.findImages({ provider: 'dockerRegistry', account, count: 50 }).then((images) => {\n const ecsImages = images as IEcsDockerImage[];\n this.props.command.backingData.filtered.images = ecsImages;\n this.setState({ dockerImages: ecsImages });\n });\n };\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private excludedArtifactTypePatterns = [\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ];\n\n private onExpectedArtifactSelected = (expectedArtifactId: string): void => {\n const selectedArtifact = { artifactId: expectedArtifactId };\n this.props.notifyAngular('taskDefinitionArtifact', selectedArtifact);\n this.setState({ taskDefArtifact: selectedArtifact });\n };\n\n private onArtifactEdited = (artifact: IArtifact): void => {\n const newArtifact = { artifact: artifact };\n this.props.notifyAngular('taskDefinitionArtifact', newArtifact);\n this.setState({ taskDefArtifact: newArtifact });\n };\n\n private pushMapping = () => {\n const conMaps = this.state.containerMappings;\n conMaps.push({ containerName: '', imageDescription: this.getEmptyImageDescription() });\n this.setState({ containerMappings: conMaps });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingName = (index: number, newName: string) => {\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = newName;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateContainerMappingImage = (index: number, newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.imageDescription = newImageDescription;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingContainer = (index: number, targetContainer: string) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = targetContainer;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeMapping = (index: number) => {\n const currentMappings = this.state.containerMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateEvaluateTaskDefArtifactFlag = () => {\n this.props.notifyAngular(\n 'evaluateTaskDefinitionArtifactExpressions',\n !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n );\n this.setState({\n evaluateTaskDefinitionArtifactExpressions: !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n });\n };\n\n public render(): React.ReactElement<TaskDefinition> {\n const { command } = this.props;\n const removeMapping = this.removeMapping;\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingName = this.updateContainerMappingName;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingContainer = this.updateTargetGroupMappingContainer;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateEvaluateTaskDefArtifactFlag = this.updateEvaluateTaskDefArtifactFlag;\n\n const dockerRegistryAccountOptions = this.state.dockerRegistryAccounts.map((account) => ({\n label: account.name,\n value: account.name,\n }));\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const mappingInputs = this.state.containerMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.containerName\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"enter container name...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateContainerMappingName(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={mapping.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(index, e as Option<string>);\n }}\n clearable={false}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.containerRemove\"\n onClick={() => removeMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupContainer\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"Enter a container name ...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateTargetGroupMappingContainer(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-12\">\n <StageArtifactSelectorDelegate\n artifact={this.state.taskDefArtifact.artifact}\n excludedArtifactTypePatterns={this.excludedArtifactTypePatterns}\n expectedArtifactId={this.state.taskDefArtifact.artifactId}\n label=\"Artifact\"\n helpKey=\"ecs.taskDefinitionArtifact\"\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onExpectedArtifactSelected(artifact.id)}\n onArtifactEdited={this.onArtifactEdited}\n pipeline={command.viewState.pipeline}\n stage={command.viewState.currentStage}\n />\n </div>\n </div>\n\n <StageConfigField\n groupClassName=\"form-group evaluateTaskDef\"\n label=\"Expression Evaluation\"\n helpKey=\"ecs.evaluateExpression\"\n labelColumns={5}\n fieldColumns={7}\n >\n <CheckboxInput\n checked={command.evaluateTaskDefinitionArtifactExpressions === true}\n onChange={() => {\n updateEvaluateTaskDefArtifactFlag();\n }}\n text=\"Evaluate SpEL expressions in artifact\"\n />\n </StageConfigField>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Docker Registry Account</b>\n </div>\n <div className=\"col-md-9\" data-test-id=\"Artifacts.dockerRegistryAccount\">\n <TetheredSelect\n placeholder=\"Select a Docker registry account...\"\n options={dockerRegistryAccountOptions}\n value={this.state.selectedDockerAccount}\n onChange={(e: Option) => this.updateDockerRegistryAccount(e as Option<string>)}\n clearable={false}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Container Mappings</b>\n <HelpField id=\"ecs.containerMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionContainerMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.containerMappingName\" />\n </th>\n <th style={{ width: '70%' }}>\n Container image\n <HelpField id=\"ecs.containerMappingImage\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{mappingInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={3}>\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.containerAdd\"\n onClick={this.pushMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Container Mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.loadBalancedContainer\" />\n </th>\n <th style={{ width: '55%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '15%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const TASK_DEFINITION_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.taskDefinition.react';\nmodule(TASK_DEFINITION_REACT, []).component(\n 'taskDefinitionReact',\n react2angular(withErrorBoundary(TaskDefinition, 'taskDefinitionReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst resizeCapacityComponent: IComponentOptions = {\n bindings: {\n command: '=',\n currentSize: '=',\n },\n templateUrl: require('./resizeCapacity.component.html'),\n controller: () => {},\n};\n\nexport const ECS_RESIZE_CAPACITY_COMPONENT = 'spinnaker.ecs.serverGroup.resize';\nmodule(ECS_RESIZE_CAPACITY_COMPONENT, []).component('ecsResizeCapacity', resizeCapacityComponent);\n","'use strict';\n\nimport * as angular from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { ECS_RESIZE_CAPACITY_COMPONENT } from './resizeCapacity.component';\n\nexport const ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.resize.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER, [\n SERVER_GROUP_WRITER,\n ECS_RESIZE_CAPACITY_COMPONENT,\n ])\n .controller('ecsResizeServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n function ($scope, $uibModalInstance, serverGroupWriter, application, serverGroup) {\n $scope.serverGroup = serverGroup;\n $scope.currentSize = {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n newSize: null,\n };\n\n $scope.verification = {};\n\n $scope.command = angular.copy($scope.currentSize);\n $scope.command.advancedMode = serverGroup.capacity.min !== serverGroup.capacity.max;\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n return command.advancedMode\n ? command.min <= command.max && command.desired >= command.min && command.desired <= command.max\n : command.newSize !== null;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Resizing ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.resize = function () {\n if (!this.isValid()) {\n return;\n }\n let capacity = { min: $scope.command.min, max: $scope.command.max, desired: $scope.command.desired };\n if (!$scope.command.advancedMode) {\n capacity = { min: $scope.command.newSize, max: $scope.command.newSize, desired: $scope.command.newSize };\n }\n\n const submitMethod = function () {\n return serverGroupWriter.resizeServerGroup(serverGroup, application, {\n capacity: capacity,\n interestingHealthProviderNames: $scope.command.interestingHealthProviderNames,\n reason: $scope.command.reason,\n });\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.rollback.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER, [SERVER_GROUP_WRITER]).controller(\n 'ecsRollbackServerGroupCtrl',\n [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n 'disabledServerGroups',\n 'allServerGroups',\n function (\n $scope,\n $uibModalInstance,\n serverGroupWriter,\n application,\n serverGroup,\n disabledServerGroups,\n allServerGroups,\n ) {\n $scope.serverGroup = serverGroup;\n $scope.disabledServerGroups = disabledServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.allServerGroups = allServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.verification = {};\n\n $scope.command = {\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n },\n };\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n\n return command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Rollback ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.rollback = function () {\n if (!this.isValid()) {\n return;\n }\n\n const submitMethod = function () {\n return serverGroupWriter.rollbackServerGroup(serverGroup, application, $scope.command);\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.label = function (serverGroup) {\n if (!serverGroup) {\n return '';\n }\n\n if (!serverGroup.buildInfo || !serverGroup.buildInfo.jenkins || !serverGroup.buildInfo.jenkins.number) {\n return serverGroup.name;\n }\n\n return serverGroup.name + ' (build #' + serverGroup.buildInfo.jenkins.number + ')';\n };\n\n this.group = function (serverGroup) {\n return serverGroup.isDisabled ? 'Disabled Server Groups' : 'Enabled Server Groups';\n };\n },\n ],\n);\n","import { module } from 'angular';\nimport { defaults } from 'lodash';\n\nimport type {\n IAmazonServerGroup,\n IAmazonServerGroupView,\n IScalingAdjustmentView,\n IScalingPolicyAlarmView,\n IScalingPolicyView,\n IStepAdjustment,\n IStepAdjustmentView,\n} from '@spinnaker/amazon';\nimport { VpcReader } from '@spinnaker/amazon';\nimport type { IInstance, IVpc } from '@spinnaker/core';\n\nexport class EcsServerGroupTransformer {\n private addComparator(alarm: IScalingPolicyAlarmView): void {\n if (!alarm.comparisonOperator) {\n return;\n }\n\n switch (alarm.comparisonOperator) {\n case 'LessThanThreshold':\n alarm.comparator = '&lt;';\n break;\n case 'GreaterThanThreshold':\n alarm.comparator = '&gt;';\n break;\n case 'LessThanOrEqualToThreshold':\n alarm.comparator = '&le;';\n break;\n case 'GreaterThanOrEqualToThreshold':\n alarm.comparator = '&ge;';\n break;\n }\n }\n\n private addAdjustmentAttributes(policyOrStepAdjustment: IScalingAdjustmentView): void {\n policyOrStepAdjustment.operator = policyOrStepAdjustment.scalingAdjustment < 0 ? 'decrease' : 'increase';\n policyOrStepAdjustment.absAdjustment = Math.abs(policyOrStepAdjustment.scalingAdjustment);\n }\n\n private transformScalingPolicy(policy: IScalingPolicyView): IScalingPolicyView {\n const view: IScalingPolicyView = { ...policy };\n const upperBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n b.metricIntervalUpperBound - a.metricIntervalUpperBound;\n const lowerBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n a.metricIntervalLowerBound - b.metricIntervalLowerBound;\n\n view.alarms = policy.alarms || [];\n view.alarms.forEach((alarm: IScalingPolicyAlarmView) => this.addComparator(alarm));\n this.addAdjustmentAttributes(view); // simple policies\n if (view.stepAdjustments && view.stepAdjustments.length) {\n view.stepAdjustments.forEach((sa: IStepAdjustmentView) => this.addAdjustmentAttributes(sa)); // step policies\n const sorter = policy.stepAdjustments.every((a: IStepAdjustment) => a.metricIntervalUpperBound !== undefined)\n ? upperBoundSorter\n : lowerBoundSorter;\n view.stepAdjustments.sort((a: IStepAdjustmentView, b: IStepAdjustmentView) => sorter(a, b));\n }\n return view;\n }\n\n public normalizeServerGroupDetails(serverGroup: IAmazonServerGroup): IAmazonServerGroupView {\n const view: IAmazonServerGroupView = { ...serverGroup } as IAmazonServerGroupView;\n if (serverGroup.scalingPolicies) {\n view.scalingPolicies = serverGroup.scalingPolicies.map((policy: IScalingPolicyView) =>\n this.transformScalingPolicy(policy),\n );\n }\n return view;\n }\n\n public normalizeServerGroup(serverGroup: IAmazonServerGroup): PromiseLike<IAmazonServerGroup> {\n serverGroup.instances.forEach((instance: IInstance) => {\n instance.vpcId = serverGroup.vpcId;\n });\n return VpcReader.listVpcs().then(\n (vpc: IVpc[]): IAmazonServerGroup => this.addVpcNameToServerGroup(serverGroup)(vpc),\n );\n }\n\n private addVpcNameToServerGroup(serverGroup: IAmazonServerGroup): (vpc: IVpc[]) => IAmazonServerGroup {\n return (vpcs: IVpc[]) => {\n const match = vpcs.find((test) => test.id === serverGroup.vpcId);\n serverGroup.vpcName = match ? match.name : '';\n return serverGroup;\n };\n }\n\n public convertServerGroupCommandToDeployConfiguration(base: any): any {\n // use _.defaults to avoid copying the backingData, which is huge and expensive to copy over\n const command = defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = 'ecs';\n command.availabilityZones = {};\n command.availabilityZones[command.region] = base.availabilityZones;\n command.loadBalancers = (base.loadBalancers || []).concat(base.vpcLoadBalancers || []);\n command.targetGroup = base.targetGroup || '';\n command.account = command.credentials;\n command.subnetType = command.subnetType || '';\n\n if (base.viewState.mode !== 'clone') {\n delete command.source;\n }\n\n delete command.region;\n delete command.viewState;\n delete command.backingData;\n delete command.selectedProvider;\n delete command.instanceProfile;\n delete command.vpcId;\n\n return command;\n }\n}\n\nexport const ECS_SERVER_GROUP_TRANSFORMER = 'spinnaker.ecs.serverGroup.transformer';\nmodule(ECS_SERVER_GROUP_TRANSFORMER, []).service('ecsServerGroupTransformer', EcsServerGroupTransformer);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport { chain, filter, find, has, isEmpty } from 'lodash';\n\nimport {\n AccountService,\n ConfirmationModalService,\n FirewallLabels,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n SubnetReader,\n} from '@spinnaker/core';\n\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER } from './resize/resizeServerGroup.controller';\nimport { ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER } from './rollback/rollbackServerGroup.controller';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER = 'spinnaker.ecs.serverGroup.details.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_TRANSFORMER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER,\n ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER,\n ])\n .controller('ecsServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'app',\n 'serverGroup',\n 'ecsServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n 'ecsServerGroupTransformer',\n 'overrideRegistry',\n function (\n $scope,\n $state,\n app,\n serverGroup,\n ecsServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ecsServerGroupTransformer,\n overrideRegistry,\n ) {\n this.state = {\n loading: true,\n };\n\n this.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n const extractServerGroupSummary = () => {\n return app.ready().then(() => {\n let summary = find(app.serverGroups.data, (toCheck) => {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some((loadBalancer) => {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some((possibleServerGroup) => {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n return summary;\n });\n };\n\n const autoClose = () => {\n if ($scope.$$destroyed) {\n return;\n }\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n };\n\n const cancelLoader = () => {\n this.state.loading = false;\n };\n\n const retrieveServerGroup = () => {\n return extractServerGroupSummary()\n .then((summary) => {\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then((details) => {\n cancelLoader();\n\n // it's possible the summary was not found because the clusters are still loading\n angular.extend(details, summary, { account: serverGroup.accountId });\n\n this.serverGroup = ecsServerGroupTransformer.normalizeServerGroupDetails(details);\n this.applyAccountDetails(this.serverGroup);\n\n if (!isEmpty(this.serverGroup)) {\n this.image = details.image ? details.image : undefined;\n\n const vpc = this.serverGroup.asg ? this.serverGroup.asg.vpczoneIdentifier : '';\n\n if (vpc !== '') {\n const subnetId = vpc.split(',')[0];\n SubnetReader.listSubnets().then((subnets) => {\n const subnet = chain(subnets).find({ id: subnetId }).value();\n this.serverGroup.subnetType = subnet.purpose;\n });\n }\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach((tag) => {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.image && details.image.tags) {\n const baseAmiVersionTag = details.image.tags.find((tag) => tag.key === 'base_ami_version');\n if (baseAmiVersionTag) {\n details.baseAmiVersion = baseAmiVersionTag.value;\n }\n }\n\n this.scalingPolicies = this.serverGroup.scalingPolicies;\n // TODO - figure out whether we need the commented out block below, or not. IF we do, then we need to make it stop crashing\n\n if (has(this.serverGroup, 'buildInfo.jenkins')) {\n this.changeConfig.buildInfo = {\n jenkins: this.serverGroup.buildInfo.jenkins,\n };\n }\n\n /*this.scalingPoliciesDisabled = this.scalingPolicies.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','AlarmNotification'].includes(p.name));\n this.scheduledActionsDisabled = this.serverGroup.scheduledActions.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','ScheduledAction'].includes(p.name));\n configureEntityTagTargets();\n\n this.changeConfig = {\n metadata: get(this.serverGroup.entityTags, 'creationMetadata')\n };\n */\n } else {\n autoClose();\n }\n });\n })\n .catch(autoClose);\n };\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: () => {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = (params) => serverGroupWriter.destroyServerGroup(serverGroup, app, params);\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.disableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.rollbackServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate(\n 'ecs.rollback.modal',\n require('./rollback/rollbackServerGroup.html'),\n ),\n windowClass: 'modal-z-index',\n controller: 'ecsRollbackServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => this.serverGroup,\n disabledServerGroups: () => {\n const cluster = find(app.clusters, { name: this.serverGroup.cluster, account: this.serverGroup.account });\n return filter(cluster.serverGroups, { isDisabled: true, region: this.serverGroup.region });\n },\n allServerGroups: () =>\n app\n .getDataSource('serverGroups')\n .data.filter(\n (g) =>\n g.cluster === this.serverGroup.cluster &&\n g.region === this.serverGroup.region &&\n g.account === this.serverGroup.account &&\n g.name !== this.serverGroup.name,\n ),\n application: () => app,\n },\n });\n };\n\n this.resizeServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate('ecs.resize.modal', require('./resize/resizeServerGroup.html')),\n controller: 'ecsResizeServerGroupCtrl as ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n application: () => app,\n },\n });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'ecsCloneServerGroupCtrl as ctrl',\n size: 'lg',\n windowClass: 'modal-z-index',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n ecsServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.buildJenkinsLink = () => {\n if (has(this, 'serverGroup.buildInfo.buildInfoUrl')) {\n return this.serverGroup.buildInfo.buildInfoUrl;\n } else if (has(this, 'serverGroup.buildInfo.jenkins')) {\n const jenkins = this.serverGroup.buildInfo.jenkins;\n return jenkins.host + 'job/' + jenkins.name + '/' + jenkins.number;\n }\n return null;\n };\n\n this.truncateCommitHash = () => {\n if (this.serverGroup && this.serverGroup.buildInfo && this.serverGroup.buildInfo.commit) {\n return this.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n\n this.applyAccountDetails = (serverGroup) => {\n return AccountService.getAccountDetails(serverGroup.account).then((details) => {\n serverGroup.accountDetails = details;\n });\n };\n },\n ]);\n","import { module } from 'angular';\nimport { ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER } from './serverGroupDetails.ecs.controller';\n\nexport const SERVER_GROUP_DETAILS_MODULE = 'spinnaker.ecs.serverGroup.details';\nmodule(SERVER_GROUP_DETAILS_MODULE, [ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER]);\n","import { $log } from 'ngimport';\n\nimport type { IServerGroup } from '@spinnaker/core';\nimport { REST } from '@spinnaker/core';\n\nexport interface IEventDescription {\n createdAt: number;\n message: string;\n id: string;\n status: string;\n}\n\nexport class ServerGroupEventsReader {\n public static getEvents(serverGroup: IServerGroup): PromiseLike<IEventDescription[]> {\n return REST('/applications')\n .path(serverGroup.app, 'serverGroups', serverGroup.account, serverGroup.name, 'events')\n .query({\n region: serverGroup.region,\n provider: serverGroup.cloudProvider,\n })\n .get()\n .catch((error: any): any[] => {\n $log.error(error, 'error retrieving events');\n return [];\n });\n }\n}\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { IEventDescription } from './serverGroupEventsReader.service';\nimport { ServerGroupEventsReader } from './serverGroupEventsReader.service';\n\nexport interface IScalingActivitiesViewState {\n loading: boolean;\n error: boolean;\n}\n\nexport class EventsController implements IController {\n public viewState: IScalingActivitiesViewState;\n public events: IEventDescription[] = [];\n\n public static $inject = ['$uibModalInstance', 'serverGroup'];\n public constructor(private $uibModalInstance: IModalServiceInstance, public serverGroup: IServerGroup) {}\n\n public $onInit(): void {\n this.viewState = {\n loading: true,\n error: false,\n };\n\n ServerGroupEventsReader.getEvents(this.serverGroup).then(\n (rawEvents: IEventDescription[]) => {\n this.viewState.loading = false;\n this.events = rawEvents;\n },\n () => {\n this.viewState.error = true;\n },\n );\n }\n\n public close(): void {\n this.$uibModalInstance.close();\n }\n}\n\nexport const EVENTS_CTRL = 'spinnaker.ecs.serverGroup.events.controller';\nmodule(EVENTS_CTRL, []).controller('EventsController', EventsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport { EVENTS_CTRL, EventsController } from './events.controller';\n\nclass ViewEventsLinkCtrl implements IController {\n public serverGroup: any;\n\n public static $inject = ['$uibModal'];\n public constructor(private $uibModal: IModalService) {}\n\n public showEvents(): void {\n this.$uibModal.open({\n templateUrl: require('./events.html'),\n controller: EventsController,\n controllerAs: '$ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n },\n });\n }\n}\n\nexport const viewEventsLink: IComponentOptions = {\n bindings: {\n serverGroup: '<',\n },\n controller: ViewEventsLinkCtrl,\n template: `<a href ng-click=\"$ctrl.showEvents()\">View Events</a>`,\n};\n\nexport const VIEW_EVENTS_LINK_COMPONENT = 'spinnaker.ecs.serverGroup.details.viewEvents.link';\nmodule(VIEW_EVENTS_LINK_COMPONENT, [EVENTS_CTRL]).component('viewEventsLink', viewEventsLink);\n","import { module } from 'angular';\n\nimport { VIEW_EVENTS_LINK_COMPONENT } from './events/events.component';\n\nexport const ECS_SERVERGROUP_MODULE = 'spinnaker.ecs.serverGroup';\nmodule(ECS_SERVERGROUP_MODULE, [VIEW_EVENTS_LINK_COMPONENT]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { COMMON_MODULE } from './common/common.module';\nimport './ecs.help';\nimport './ecs.settings';\nimport { ECS_CLUSTER_READ_SERVICE } from './ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from './iamRoles/iamRole.read.service';\nimport { ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { EcsLoadBalancerClusterContainer } from './loadBalancer/EcsLoadBalancerClusterContainer';\nimport { EcsLoadBalancerDetails } from './loadBalancer/details/loadBalancerDetails';\nimport { EcsTargetGroupDetails } from './loadBalancer/details/targetGroupDetails';\nimport { EcsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';\nimport { ECS_TARGET_GROUP_STATES } from './loadBalancer/targetGroup.states';\nimport ecsLogo from './logo/ecs.logo.svg';\nimport { METRIC_ALARM_READ_SERVICE } from './metricAlarm/metricAlarm.read.service';\nimport { ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/ecsDestroyAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE } from './pipeline/stages/disableAsg/ecsDisableAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE } from './pipeline/stages/disableCluster/ecsDisableClusterStage';\nimport { ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE } from './pipeline/stages/enableAsg/ecsEnableAsgStage';\nimport { ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE } from './pipeline/stages/findImageFromTags/ecsFindImageFromTagStage';\nimport { ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE } from './pipeline/stages/resizeAsg/ecsResizeAsgStage';\nimport { ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE } from './pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage';\nimport { ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE } from './pipeline/stages/shrinkCluster/ecsShrinkClusterStage';\nimport { PLACEMENT_STRATEGY_SERVICE } from './placementStrategy/placementStrategy.service';\nimport { ECS_SECRET_READ_SERVICE } from './secrets/secret.read.service';\nimport { ECS_SECURITY_GROUP_MODULE } from './securityGroup/securityGroup.module';\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.ecs.controller';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT } from './serverGroup/configure/wizard/advancedSettings/advancedSettings.component';\nimport { ECS_CAPACITY_PROVIDER_REACT } from './serverGroup/configure/wizard/capacityProvider/CapacityProvider';\nimport { CONTAINER_REACT } from './serverGroup/configure/wizard/container/Container';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT } from './serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER } from './serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller';\nimport { ECS_SERVER_GROUP_LOGGING } from './serverGroup/configure/wizard/logging/logging.component';\nimport { ECS_NETWORKING_REACT } from './serverGroup/configure/wizard/networking/Networking';\nimport { SERVICE_DISCOVERY_REACT } from './serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery';\nimport { TASK_DEFINITION_REACT } from './serverGroup/configure/wizard/taskDefinition/TaskDefinition';\nimport { SERVER_GROUP_DETAILS_MODULE } from './serverGroup/details/serverGroupDetails.module';\nimport { ECS_SERVERGROUP_MODULE } from './serverGroup/serverGroup.module';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\n\nimport './logo/ecs.logo.less';\n\nexport const ECS_MODULE = 'spinnaker.ecs';\nmodule(ECS_MODULE, [\n ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER,\n SERVER_GROUP_DETAILS_MODULE,\n IAM_ROLE_READ_SERVICE,\n ECS_SERVER_GROUP_TRANSFORMER,\n // require('./pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage').name, // TODO(Bruno Carrier): We should enable this on Clouddriver before revealing this stage\n ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT,\n TASK_DEFINITION_REACT,\n CONTAINER_REACT,\n ECS_NETWORKING_REACT,\n SERVICE_DISCOVERY_REACT,\n ECS_CAPACITY_PROVIDER_REACT,\n ECS_SERVER_GROUP_LOGGING,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n METRIC_ALARM_READ_SERVICE,\n PLACEMENT_STRATEGY_SERVICE,\n COMMON_MODULE,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE,\n ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE,\n ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE,\n ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE,\n ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE,\n ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE,\n ECS_SECURITY_GROUP_MODULE,\n ECS_SERVERGROUP_MODULE,\n ECS_TARGET_GROUP_STATES,\n]).config(function () {\n CloudProviderRegistry.registerProvider('ecs', {\n name: 'EC2 Container Service',\n logo: { path: ecsLogo },\n serverGroup: {\n transformer: 'ecsServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'ecsServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'ecsCloneServerGroupCtrl',\n commandBuilder: 'ecsServerGroupCommandBuilder',\n // configurationService: 'ecsServerGroupConfigurationService',\n scalingActivitiesEnabled: false,\n skipUpstreamStageCheck: true,\n },\n loadBalancer: {\n transformer: EcsLoadBalancerTransformer,\n ClusterContainer: EcsLoadBalancerClusterContainer,\n targetGroupDetails: EcsTargetGroupDetails,\n details: EcsLoadBalancerDetails,\n },\n instance: {\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'ecsInstanceDetailsCtrl',\n },\n securityGroup: {\n transformer: 'ecsSecurityGroupTransformer',\n reader: 'ecsSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'ecsSecurityGroupDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('ecs', ['redblack']);\n","export default \"data:image/svg+xml,%3Csvg%20id%3D%22Layer_1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%3E%20%20%3Ctitle%3ECompute%3C%2Ftitle%3E%20%20%3Cg%3E%20%20%20%20%3Cpolygon%20points%3D%2219.64%2022.51%2016%2024.32%2016%2075.68%2019.64%2077.49%2033.98%2051.07%2019.64%2022.51%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2230.72%2031.78%2036.08%2024.19%2060.1%2034.87%2054.5%2035.76%2030.72%2031.78%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2226.56%2068.77%2032.46%2076.88%2060.1%2064.95%2054.76%2064.12%2026.56%2068.77%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2228.12%2075.5%2019.64%2077.49%2019.64%2022.51%2028.12%2024.44%2028.12%2075.5%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2223.66%2020.5%2028.12%2018.27%2036.52%2053.56%2028.12%2081.73%2023.66%2079.5%2023.66%2020.5%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2254.46%2064.08%2060.1%2064.95%2065.26%2050.58%2060.1%2034.87%2054.46%2035.76%2054.46%2064.08%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2236.8%2079.28%2028.12%2081.73%2028.12%2018.27%2036.8%2020.73%2036.8%2079.28%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.01%2063.84%2028.12%2070.88%2028.12%2081.73%2066.01%2071.03%2066.01%2063.84%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.08%2036%2028.12%2028.79%2028.12%2018.27%2066.08%2029.04%2066.08%2036%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2260.1%2027.34%2066.19%2029.02%2066.19%2071.03%2060.1%2072.7%2060.1%2027.34%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2044.45%2067.7%2045.22%2061.94%2044.83%2078.42%2031.55%2084%2044.45%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2044.83%2078.42%2043.9%2078.42%2031.55%2061.94%2034.22%2061.94%2044.83%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2026.96%2071.62%2043.22%2054.31%2044.32%2046.43%2043.79%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2042.37%2063.13%2026.96%2046.43%2030.87%2046.43%2043.79%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2055.39%2084%2055.77%2078.42%2068.67%2061.94%2066%2061.94%2055.39%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2071.62%2057.01%2063.13%2073.26%2046.43%2069.36%2046.43%2056.43%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2063.13%2057.86%2071.62%2057.01%2054.31%2055.9%2046.43%2056.43%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2055.77%2067.7%2055.01%2061.94%2055.39%2078.42%2056.33%2084%2055.77%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2043.9%2084%2044.45%2084%2033.22%2078.42%2031.55%2078.42%2043.9%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2043.22%2063.13%2042.37%2063.13%2026.96%2071.62%2029.51%2071.62%2043.22%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2056.33%2084%2055.77%2084%2067%2078.42%2068.67%2078.42%2056.33%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2057.01%2063.13%2057.86%2063.13%2073.26%2071.62%2070.72%2071.62%2057.01%22%20fill%3D%22%23f58536%22%2F%3E%20%20%3C%2Fg%3E%3C%2Fsvg%3E\""],"names":["footerComponent","bindings","action","isValid","cancel","account","verification","template","controller","ECS_FOOTER_COMPONENT","module","component","COMMON_MODULE","helpContents","Object","keys","forEach","key","HelpContentsRegistry","register","IECSProviderSettings","SETTINGS","providers","ecs","resetToOriginal","resetProvider","ECS_CLUSTER_READ_SERVICE","service","listClusters","REST","get","describeClusters","region","path","IAM_ROLE_READ_SERVICE","listRoles","provider","ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","UIROUTER_ANGULARJS","ANGULAR_UI_BOOTSTRAP","$scope","$state","$uibModal","instance","app","moniker","environment","$q","overrides","detailsTemplateUrl","CloudProviderRegistry","getValue","state","loading","standalone","isStandalone","instancePort","_","defaultInstancePort","application","defaultRequestParams","cloudProvider","retrieveInstance","extraData","instanceSummary","loadBalancers","targetGroup","vpcId","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","name","loadBalancer","isDisabled","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","then","details","$$destroyed","latest","health","displayableMetrics","filter","metric","type","targetGroups","getAllTargetGroups","applyHealthCheckInfoToTargetGroups","detailsMatch","latestHealth","length","defaults","healthMetrics","extractHealthMetrics","networkInterfaces","permanentNetworkInterfaces","f","attachment","deleteOnTermination","permanentIps","map","privateIpAddress","baseIpAddress","publicDnsName","instanceDetailsLoaded","autoClose","instanceIdNotFound","when","notFoundStandalone","removeLastItem","go","allowModalToStayOpen","location","this","canRegisterWithDiscovery","discoveryHealth","terminateInstance","taskMonitor","title","onTaskComplete","includes","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","InstanceWriter","terminateInstanceAndShrinkServerGroup","enableInstanceInDiscovery","disableInstanceInDiscovery","hasHealthState","healthProviderType","all","ready","onRefresh","EcsTargetGroup","React","Component","render","showServerGroups","props","params","loadBalancerName","accountId","targetGroupName","emptyInstanceCounts","up","down","starting","succeeded","failed","unknown","outOfService","createElement","className","UISrefActive","class","UISref","to","sgName","LoadBalancerServerGroup","cluster","instanceCounts","showInstances","EcsLoadBalancerClusterContainer","shouldComponentUpdate","nextProps","isEqual","g","serverGroupsDiffer","t","targetGroupsDiffer","TargetGroups","EcsListener","constructor","super","getTargetGroupNameFromArn","arn","parts","split","port","protocol","defaultActions","listener","style","paddingLeft","i","targetGroupArn","forwardConfig","tg","redirectConfig","statusCode","fixedResponseConfig","authenticateOidcConfig","clientId","authenticateCognitoActionConfig","userPoolDomain","EcsLoadBalancerDetails","refreshListenerUnsubscribe","getDataSource","extractLoadBalancer","componentWillUnmount","find","test","setState","CloseButton","Spinner","size","CollapsibleSection","heading","defaultExpanded","timestamp","createdTime","AccountTag","loadBalancerType","ipAddressType","availabilityZones","az","target","href","dnsname","listeners","index","securityGroups","sg","subnets","subnet","EcsTargetGroupDetails","extractTargetGroup","targetType","toUpperCase","loadBalancerNames","lb","healthCheckProtocol","healthCheckPort","healthCheckPath","healthCheckTimeoutSeconds","healthCheckIntervalSeconds","healthyThresholdCount","unhealthyThresholdCount","matcher","httpCode","attributes","EcsLoadBalancerTransformer","normalizeLoadBalancer","targetGroupServices","tgServiceMap","resolve","$inject","ECS_TARGET_GROUP_STATES","APPLICATION_STATE_PROVIDER","config","applicationStateProvider","ecsTargetGroupDetails","url","value","squash","views","$type","$stateParams","pageTitleDetails","nameParam","accountParam","regionParam","addInsightDetailState","METRIC_ALARM_READ_SERVICE","listMetricAlarms","ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE","Registry","pipeline","registerStage","provides","alias","templateUrl","executionStepLabelUrl","accountExtractor","stage","context","credentials","configAccountExtractor","validators","message","fieldName","fieldLabel","accounts","regionsLoaded","AccountService","listAccounts","regions","targets","StageConstants","TARGET_LIST","defaultCredentials","defaultRegions","push","val","ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE","executionDetailsUrl","PipelineTemplates","disableAsgExecutionDetails","isNew","platformHealthOnlyShowOverride","platformHealthOnly","interestingHealthProviderNames","ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE","ctrl","reset","accountUpdated","resetSelectedCluster","remainingEnabledServerGroups","pluralize","str","preferLargerOverNewer","toString","ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE","$watch","ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE","executionConfigSections","ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE","viewState","accountsLoaded","resizeTargets","scaleActions","label","resizeTypes","capacity","resizeType","targetHealthyDeployPercentage","updateResizeType","scalePct","scaleNum","ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE","strategy","remainingFullSizeServerGroups","allowScaleDownActive","ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE","shrinkToSize","allowDeleteActive","retainLargerOverNewer","PLACEMENT_STRATEGY_SERVICE","getPredefinedStrategy","strategyName","getAzBalancedSpreadStrategy","getAzBalancedMemoryBinPackStrategy","getBinPackMemoryStrategy","getAzBalancedCpuBinPackStrategy","getBinPackCpuStrategy","getOneTaskPerHostStrategy","field","ECS_SECRET_READ_SERVICE","listSecrets","ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER","angular","SECURITY_GROUP_READER","MANAGED_RESOURCE_DETAILS_INDICATOR","resolvedSecurityGroup","securityGroupReader","securityGroup","extractSecurityGroup","getSecurityGroupDetails","VpcReader","getVpcName","vpcName","isEmpty","fourOhFour","applicationSecurityGroup","getApplicationSecurityGroup","extend","ipRules","groupedRangeRules","groupBy","ipRangeRules","rule","range","ip","cidr","addr","address","rules","buildRuleModel","buildIpRulesModel","securityGroupRules","buildSecurityGroupRulesModel","portRanges","startPort","endPort","group","notFound","firewallLabel","FirewallLabels","refresh","ECS_SECURITY_GROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","securityGroupId","ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","factory","normalizeSecurityGroup","ECS_SECURITY_GROUP_MODULE","ServiceDiscoveryReader","listServiceDiscoveryRegistries","EcsServerGroupConfigurationService","loadBalancerReader","serverGroupCommandRegistry","iamRoleReader","ecsClusterReader","metricAlarmReader","placementStrategyService","secretReader","launchTypes","networkModes","configureUpdateCommand","command","backingData","clone","configureCommand","cmd","imageQuery","_a","applyOverrides","toggleSuspendedProcess","process","suspendedProcesses","processIndex","indexOf","splice","processIsSuspended","onStrategyChange","p","regionIsDeprecated","has","filtered","deprecated","imageQueries","imageDescription","grabImageAndTag","imageId","searchAccount","imagesPromise","q","DockerImageReader","findImages","count","promises","flatten","credentialsKeyedByAccount","getCredentialsKeyedByAccount","listLoadBalancers","SubnetReader","listSubnetsByProvider","iamRoles","ecsClusters","capacityProviderDetails","metricAlarms","getAllSecurityGroups","secrets","serviceDiscoveryRegistries","images","contextImages","concat","configureVpcId","configureAvailableIamRoles","configureAvailableSubnetTypes","configureAvailableSecurityGroups","configureAvailableEcsClusters","setCapacityProviderDetails","configureAvailableSecrets","configureAvailableServiceDiscoveryRegistries","configureAvailableImages","configureAvailableRegions","configureLoadBalancerOptions","attachEventHandlers","result","chain","mapCapacityProviderDetails","ecsClusterName","configureAvailableCapacityProviders","availableCapacityProviders","defaultCapacityProviderStrategy","checkDirtyCapacityProviders","clusterName","availableCPs","capacityProviders","flattenDeep","phase","getCommandOverrides","override","pop","buildImageId","image","fromContext","imageLabelOrSha","fromTrigger","tag","registry","repository","mapImage","stageId","configureAvailabilityZones","subnetType","subnetTypes","purpose","compact","uniqBy","allSecurityGroups","securityGroupNames","e","buildServiceRegistryDisplayName","mapServiceRegistry","displayName","regionsForAccount","accountName","configureSubnetPurposes","dirty","filteredData","subnetPurposes","reject","every","getLoadBalancerMap","getLoadBalancerNames","sort","getVpcLoadBalancerNames","getTargetGroupNames","loadBalancersV2","currentLoadBalancers","vpcLoadBalancers","newLoadBalancers","allTargetGroups","currentTargetGroups","targetGroupMappings","valid","matched","intersection","removedLoadBalancers","xor","removedTargetGroups","refreshLoadBalancers","skipCommandReconfiguration","capacityProviderStrategy","availableCustomCapacityProviders","currentCapacityProviders","cp","capacityProvider","matchedCustomCapacityProviders","removedCustomCapacityProviders","customCapacityProviders","useDefaultCapacityProviders","availableDefaultCapacityProvider","matchedDefaultCapacityProviders","removedDefaultCapacityProviders","defaulCapacityProviders","subnetChanged","regionChanged","subnetTypeChanged","clusterChanged","NameUtils","getMoniker","stack","freeFormDetails","credentialsChanged","placementStrategyNameChanged","placementStrategySequence","placementStrategyName","ECS_SERVER_GROUP_CONFIGURATION_SERVICE","LOAD_BALANCER_READ_SERVICE","CACHE_INITIALIZER_SERVICE","SERVER_GROUP_COMMAND_REGISTRY_PROVIDER","ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","INSTANCE_TYPE_SERVICE","instanceTypeService","ecsServerGroupConfigurationService","findUpstreamImages","current","visited","refId","requisiteStageRefIds","next","findTriggerImages","triggers","trigger","organization","buildNewServerGroupCommand","credentialsLoader","defaultRegion","preferredZonesLoader","getAvailabilityZonesForAccountAndRegion","preferredZones","asyncData","defaultIamRole","replace","min","max","desired","launchType","healthCheckType","selectedProvider","iamRole","dockerImageCredentialsSecret","healthCheckGracePeriodSeconds","placementConstraints","taskDefinitionArtifact","useTaskDefinitionArtifact","serviceDiscoveryAssociations","copySourceScalingPoliciesAndActions","preferSourceCapacity","useSourceCapacity","enableDeploymentCircuitBreaker","useAllImageSelection","useSimpleCapacity","usePreferredZones","mode","disableStrategySelection","buildServerGroupCommandFromExisting","ecsCluster","buildNewServerGroupCommandForPipeline","stages","requiresTemplateSelection","currentStage","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","join","docker","upstreamImages","matchingImage","otherImage","pattern","reconcileUpstreamImages","instanceProfile","disableImageSelection","submitButtonLabel","templatingEnabled","existingPipelineCluster","viewOverrides","buildUpdateServerGroupCommand","asgs","asgName","asg","ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER","SERVER_GROUP_WRITER","OVERRIDE_REGISTRY","STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT","$uibModalInstance","serverGroupWriter","overrideRegistry","serverGroupCommand","onApplicationRefresh","cloneStage","task","execution","newServerGroupName","newStateParams","transitionTo","loaded","createResultProcessor","method","pages","templateSelection","getTemplate","basicSettings","horizontalScaling","networking","logging","serviceDiscovery","advancedSettings","taskDefinition","applicationName","templateSelectionText","copied","notCopied","TaskMonitor","modalInstance","onNextRefresh","showSubmitButton","ModalWizard","allPagesVisited","submit","close","cloneServerGroup","dismiss","templateSelected","notifyAngular","commandKey","query","capacityProviderState","useCapacityProviders","updateComputeOption","chosenOption","ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT","EcsCapacityProvider","getAvailableCapacityProviders","getDefaultCapacityProviderStrategy","getCapacityProviderStrategy","addCapacityProviderStrategy","base","weight","removeCapacityProviderStrategy","updateCapacityProviderName","targetCapacityProviderName","updateCapacityProviderBase","targetCapacityProviderBase","updateCapacityProviderWeight","targetCapacityProviderWeight","updateCapacityProviderType","targetCapacityProviderType","capacityProviderLoadedFlag","componentDidMount","customDirtyCapacityProviders","defaultDirtyCapacityProviders","capacityProviderNames","defaultCPError","dirtyCapacityProviderList","dirtyCapacityProviderSection","capacityProviderInputs","mapping","required","disabled","TetheredSelect","placeholder","options","onChange","clearable","valueAsNumber","onClick","width","Alert","color","newCapacityProviderStrategy","HelpField","checked","colSpan","ECS_CAPACITY_PROVIDER_REACT","react2angular","withErrorBoundary","Container","_b","getIdToImageMap","imageIdToDescription","Map","set","getEmptyImageDescription","updateDockerRegistryAccount","newAccount","selectedDockerAccount","dockerImages","ecsImages","pushTargetGroupMapping","targetMaps","containerName","containerPort","updateContainerMappingImage","newImage","newImageDescription","updateComputeUnits","newComputeUnits","computeUnits","updateReservedMemory","newReservedMemory","reservedMemory","updateTargetGroupMappingTargetGroup","newTargetGroup","currentMappings","updateDirtyTargetGroups","updateTargetGroupMappingPort","targetPort","removeTargetGroupMapping","defaultContainer","containerMappings","defaultTargetGroup","loadBalancedContainer","uniqWith","dockerRegistryAccounts","targetGroupsAvailable","targetGroupMapping","dirtyTagetGroups","dockerRegistryAccountOptions","dockerImageOptions","msg","dirtyTargetGroupList","dirtyTargetGroupSection","newTargetGroupMapping","targetGroupInputs","CONTAINER_REACT","ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT","ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER","$controller","$uibModalStack","newVal","markClean","markComplete","markIncomplete","ECS_SERVER_GROUP_LOGGING","EcsNetworking","updateNetworkMode","newNetworkMode","updatedNetworkMode","networkMode","subnetTypesAvailable","updateSecurityGroups","newSecurityGroups","updatedSecurityGroups","Array","isArray","updateSubnetTypes","newSubnetTypes","updatedSubnetTypes","securityGroupsAvailable","updateAssociatePublicIpAddress","usePublicIp","associatePublicIpAddress","defaultSubnetTypes","networkModesAvailable","subnetTypeOptions","multi","securityGroupsOptions","awsVpcOptions","ECS_NETWORKING_REACT","ServiceDiscovery","getNameToRegistryMap","displayNameToRegistry","getEmptyRegistry","updateServiceDiscoveryRegistry","newRegistry","newServiceDiscoveryRegistry","currentAssociations","updateServiceDiscoveryPort","updateServiceDiscoveryContainerName","targetContainerName","pushServiceDiscoveryAssociation","registryAssociations","removeServiceDiscoveryAssociations","serviceDiscoveryRegistriesAvailable","serviceDiscoveryRegistryAssociation","removeServiceDiscoveryAssociation","registriesAvailable","serviceDiscoveryInputs","newServiceDiscoveryAssociation","SERVICE_DISCOVERY_REACT","TaskDefinition","excludedArtifactTypePatterns","ArtifactTypePatterns","KUBERNETES","DOCKER_IMAGE","FRONT50_PIPELINE_TEMPLATE","onExpectedArtifactSelected","expectedArtifactId","selectedArtifact","artifactId","taskDefArtifact","onArtifactEdited","artifact","newArtifact","pushMapping","conMaps","updateContainerMappingName","newName","updateTargetGroupMappingContainer","targetContainer","removeMapping","updateEvaluateTaskDefArtifactFlag","evaluateTaskDefinitionArtifactExpressions","taskDefArtifactAccount","taskDefinitionArtifactAccount","mappingInputs","StageArtifactSelectorDelegate","helpKey","StageConfigField","groupClassName","labelColumns","fieldColumns","CheckboxInput","text","TASK_DEFINITION_REACT","ECS_RESIZE_CAPACITY_COMPONENT","currentSize","ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER","newSize","copy","advancedMode","verified","resize","resizeServerGroup","reason","ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER","disabledServerGroups","allServerGroups","a","b","localeCompare","rollbackType","rollbackContext","rollbackServerGroupName","restoreServerGroupName","rollback","rollbackServerGroup","buildInfo","jenkins","number","ECS_SERVER_GROUP_TRANSFORMER","addComparator","alarm","comparisonOperator","comparator","addAdjustmentAttributes","policyOrStepAdjustment","operator","scalingAdjustment","absAdjustment","Math","abs","transformScalingPolicy","policy","view","upperBoundSorter","metricIntervalUpperBound","lowerBoundSorter","metricIntervalLowerBound","alarms","stepAdjustments","sa","sorter","normalizeServerGroupDetails","scalingPolicies","normalizeServerGroup","listVpcs","vpc","addVpcNameToServerGroup","vpcs","match","convertServerGroupCommandToDeployConfiguration","source","ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER","ecsServerGroupCommandBuilder","ecsServerGroupTransformer","firewallsLabel","cancelLoader","retrieveServerGroup","summary","toCheck","possibleServerGroup","ServerGroupReader","getServerGroup","applyAccountDetails","vpczoneIdentifier","subnetId","listSubnets","description","keyVal","baseImage","tags","baseAmiVersionTag","baseAmiVersion","changeConfig","catch","destroyServerGroup","stateParams","confirmationModalParams","askForReason","platformHealthType","ServerGroupWarningMessageService","addDestroyWarningMessage","disableServerGroup","addDisableWarningMessage","enableServerGroup","open","windowClass","clusters","buildJenkinsLink","buildInfoUrl","host","truncateCommitHash","commit","substring","getAccountDetails","accountDetails","SERVER_GROUP_DETAILS_MODULE","ServerGroupEventsReader","getEvents","error","$log","EventsController","events","$onInit","rawEvents","EVENTS_CTRL","ViewEventsLinkCtrl","showEvents","controllerAs","viewEventsLink","VIEW_EVENTS_LINK_COMPONENT","ECS_SERVERGROUP_MODULE","css","ref","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","ECS_MODULE","registerProvider","logo","transformer","detailsController","cloneServerGroupTemplateUrl","cloneServerGroupController","commandBuilder","scalingActivitiesEnabled","skipUpstreamStageCheck","ClusterContainer","targetGroupDetails","reader","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[52]}
1
+ {"version":3,"file":"index.js","sources":["../src/ecs.help.ts","../src/ecs.settings.ts","../src/instance/details/EcsInstanceDetails.tsx","../src/loadBalancer/TargetGroup.tsx","../src/loadBalancer/EcsLoadBalancerClusterContainer.tsx","../src/loadBalancer/listener.tsx","../src/loadBalancer/details/loadBalancerDetails.tsx","../src/loadBalancer/details/targetGroupDetails.tsx","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/targetGroup.states.ts","../src/pipeline/stages/common/EcsServerGroupStepLabel.tsx","../src/pipeline/stages/common/EcsStageConfigs.tsx","../src/pipeline/stages/findImageFromTags/EcsFindImageFromTagsExecutionDetails.tsx","../src/securityGroup/details/EcsSecurityGroupDetails.tsx","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/configure/serverGroupConfiguration.service.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/dockerImage.util.ts","../src/ecsCluster/ecsCluster.read.service.ts","../src/iamRoles/iamRole.read.service.ts","../src/metricAlarm/metricAlarm.read.service.ts","../src/serverGroup/configure/wizard/pages/AdvancedSettings.tsx","../src/serverGroup/configure/wizard/pages/BasicSettings.tsx","../src/serverGroup/configure/wizard/container/Container.tsx","../src/serverGroup/configure/wizard/pages/ContainerSettings.tsx","../src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx","../src/serverGroup/configure/wizard/pages/HorizontalScalingSettings.tsx","../src/serverGroup/configure/wizard/pages/LoggingSettings.tsx","../src/serverGroup/configure/wizard/networking/Networking.tsx","../src/serverGroup/configure/wizard/pages/NetworkingSettings.tsx","../src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx","../src/serverGroup/configure/wizard/pages/ServiceDiscoverySettings.tsx","../src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx","../src/serverGroup/configure/wizard/pages/TaskDefinitionSettings.tsx","../src/serverGroup/configure/wizard/pages/validation.tsx","../src/placementStrategy/placementStrategy.service.ts","../src/secrets/secret.read.service.ts","../src/serviceDiscovery/serviceDiscovery.read.service.ts","../src/serverGroup/configure/wizard/EcsCloneServerGroupModal.tsx","../src/serverGroup/details/resize/EcsResizeServerGroupModal.tsx","../src/serverGroup/details/rollback/EcsRollbackServerGroupModal.tsx","../src/serverGroup/details/EcsServerGroupActions.tsx","../src/serverGroup/serverGroup.transformer.ts","../src/serverGroup/details/ecsServerGroupDetailsGetter.ts","../src/serverGroup/details/sections/EcsServerGroupDetailsSections.tsx","../src/serverGroup/events/serverGroupEventsReader.service.ts","../src/serverGroup/events/EcsServerGroupEventsModal.tsx","../src/serverGroup/events/EventsLink.tsx","../src/serverGroup/details/sections/EcsServerGroupEventsSection.tsx","../src/serverGroup/details/sections/EcsServerGroupInformationSection.tsx","../src/ecs.module.ts","../src/logo/ecs.logo.svg","../src/pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage.js","../src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js","../src/pipeline/stages/disableAsg/ecsDisableAsgStage.js","../src/pipeline/stages/disableCluster/ecsDisableClusterStage.js","../src/pipeline/stages/enableAsg/ecsEnableAsgStage.js","../src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js","../src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'ecs.loadBalancer.targetGroup':\n '<p>A <em>target group</em> is attached to an application / network load balancer and is a target for load balancer traffic.</p> <p> You need to create both the application load balancer and target groups prior to being able to use them in your pipeline.</p>',\n 'ecs.serverGroup.clusterName':\n '<p>The name of the ECS cluster (group of underlying EC2 hosts) onto which your application will be deployed.</p><p>Note that suggestions here are dependent on the selected account and region combination.</p>',\n 'ecs.stage.findImageByTags.labelOrSha':\n \"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>\",\n 'ecs.serverGroup.stack':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>staging</i>, <i>prod</i>, etc. Keep this parameter short!</p>',\n 'ecs.serverGroup.detail':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>app</i>, <i>worker</i>, <i>migrator</i>, etc. Keep this parameter short!</p>',\n 'ecs.capacity.overwrite':\n \"<p>Checking this box will have the previous server group's capacity overwrite the new <i>min</i>, <i>max</i> and <i>desired capacity</i> parameters if a previous server group exists.</p>\",\n 'ecs.capacity.desired': '<p>The starting number of containers, before any autoscaling happens.</p>',\n 'ecs.capacity.minimum':\n '<p>The minimum number of containers you can reach as a result of autoscaling.</p> <p>Typically, this represents the bare minimum you can afford to run without impacting your capacity to meet your SLA (Service Level Agreement) objectives</p>',\n 'ecs.capacity.maximum': '<p>The maximal number of containers you can reach as a result of autoscaling.</p>',\n 'ecs.capacity.reserved.computeUnits':\n '<p>The assured minimal amount of computing capacity your container will be able to use. 1024 units are equal to 1 AWS virtual CPU</p> <p>If other containers on your underlying host are not using their reserved compute capacity, this container will be able to use it.</p>',\n 'ecs.capacity.reserved.memory':\n '<p>The maximal amount of memory that your container can use, in megabytes. Exceeding this amount may result in termination of your container.</p><p>1024 mb = 1 gb</p>',\n 'ecs.loadbalancing.targetPort': '<p>The port on which your application is listening for incoming traffic</p>',\n 'ecs.iamrole':\n '<p>The IAM role that your container (task, in AWS wording) will inherit. </p><p>Define a role only if your application needs to access AWS APIs</p>',\n 'ecs.dockerimage': 'Docker image for your container, such as nginx:latest',\n 'ecs.dockerimagecredentials':\n '<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>',\n 'ecs.placementConstraints':\n '<p>Rules for task placement. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.placementConstraintType':\n '<p>To ensure that each task in a particular group is running on a different container instance, use distinctInstance. To restrict the selection to a group of valid candidates, use memberOf. </p>',\n 'ecs.placementConstraintExpression':\n '<p>A cluster query language expression to apply to memberOf constraints. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\" target=\"_blank\">AWS documentation</a> for more details.</p>',\n 'ecs.placementStrategy':\n '<p>The strategy the container scheduler will be using. See <a href=\"http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html\" target=\"_blank\">AWS documentation</a> for more details. </p><p>You should at least balance across availability zones</p><p>Custom placement strategies have not been implemented yet.</p>',\n 'ecs.platformVersion': '<p>Defaults to the latest platform version.</p>',\n 'ecs.enableDeploymentCircuitBreaker': '<p>Enable circuit breaker for the ECS service.</p>',\n 'ecs.capacity.copySourceScalingPoliciesAndActions':\n '<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>',\n 'ecs.launchtype': '<p>Launch service tasks on your own EC2 instances or on Fargate.</p>',\n 'ecs.healthgraceperiod':\n '<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>',\n 'ecs.publicip': '<p>Assign a public IP address to each task.</p>',\n 'ecs.networkMode':\n '<p>awsvpc is the only networking mode that allows you to use Elastic Network Interfaces (ENI). The default value converts to Bridge on Linux, and NAT on Windows.</p>',\n 'ecs.subnet':\n '<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>',\n 'ecs.securityGroups': '<p>The security group(s) name(s) your containers are deployed with.</p>',\n 'ecs.dockerLabels':\n '<p>Additional labels applied to your Docker container. This metadata can be used to identify your containers, or in conjunction with logging options. Maps directly to the <a href=\"https://docs.docker.com/engine/reference/commandline/run/#set-metadata-on-container--l---label---label-file\"><b>--label</b> Docker flag</a>.</p> <p>Spinnaker will automatically add the spinnaker.servergroup, spinnaker.stack, spinnaker.detail labels for non-null values.</p>',\n 'ecs.logDriver':\n '<p>The container\\'s logging driver. This directly maps to the <a href=\"https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver\"><b>--log-driver</b> Docker flag.</a></p>',\n 'ecs.logOptions':\n '<p>A map of log options. This directly maps with the <a href=\"https://docs.docker.com/config/containers/logging/log_tags/\"><b>--log-opt</b> Docker flag </a></p>',\n 'ecs.taskDefinition':\n '<p>The source of the ECS Task Definition. Task Definition contents can either be entered manually via input fields or from a selected JSON file artifact. Artifact file contents should be structured as an ECS \"RegisterTaskDefinition\" request.</p>',\n 'ecs.taskDefinitionArtifact': '<p>The artifact containing the ECS Task Definition.</p>',\n 'ecs.containerMappings':\n '<p>The list of expected containers within the Task Definition and which container image they should use. Containers in the Task Definition which are not specified here will be registered as they appear in the artifact.</p>',\n 'ecs.containerMappingName':\n '<p>The name of the container. Name should match the <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html#ECS-Type-ContainerDefinition-name\"><b>containerDefinition.name</b></a> field as it appears in the Task Definition.</p>',\n 'ecs.containerMappingImage': '<p>The container image the named container should run.</p>',\n 'ecs.targetGroupMappings':\n '<p>The list of target groups through which the ECS service will receive load balancer traffic. Each target group is mapped to a container name and port within the Task Definition to specify which container should be registered to the target group.</p>',\n 'ecs.loadBalancedContainer':\n '<p>The container in the Task Definition that should receive traffic from the load balancer. Required if a load balancer target group has been specified.</p>',\n 'ecs.tags': '<p>The tags to apply to the task definition and the service',\n 'ecs.environmentVariables':\n '<p>The environment variable(s) your container are deployed with. SERVER_GROUP, CLOUD_STACK and CLOUD_DETAIL environment variables are used during deployment to identify the task and cannot be set here.</p>',\n 'ecs.serviceDiscovery': '<p>The AWS Cloud Map service discovery registries to assign to this service</p>',\n 'ecs.serviceDiscoveryRegistry': '<p>The AWS Cloud Map service to use for service discovery registration</p>',\n 'ecs.serviceDiscoveryContainerPort':\n '<p>The port to be used for your service discovery service. Required only for services using bridge or host network mode, and for services using awsvpc network mode and a type SRV DNS record',\n 'ecs.serviceDiscoveryContainerName':\n '<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>',\n 'ecs.computeOptions':\n '<p>Specify either a <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\" target=\"_blank\">launch type</a> (default) or <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html\" target=\"_blank\">capacity providers</a> for running your ECS service.</p>',\n 'ecs.capacityProviderStrategy':\n '<p>A capacity provider strategy gives you control over how your tasks use one or more capacity providers. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html#capacity-providers-concepts\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.capacityProviderName': '<p>The short name of the capacity provider.</p>',\n 'ecs.capacityProviderBase':\n '<p>Designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a <em>base</em> defined.</p>',\n 'ecs.capacityProviderWeight':\n '<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>',\n 'ecs.evaluateExpression':\n '<p>Whether to evaluate <a href=\"https://spinnaker.io/guides/user/pipeline/expressions/\" target=\"_blank\"><b>pipeline expressions</b></a> within the task definition artifact in this stage. Checking this box let\\'s you evaluate your task definition artifact coming from external sources.(e.g. GitHub) </p>',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IECSProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n zone?: string;\n };\n}\n\nexport const IECSProviderSettings: IECSProviderSettings = (SETTINGS.providers.ecs as IECSProviderSettings) || {\n defaults: {},\n};\nif (IECSProviderSettings) {\n IECSProviderSettings.resetToOriginal = SETTINGS.resetProvider('ecs');\n}\n","import React from 'react';\n\nimport type { IAmazonHealth } from '@spinnaker/amazon';\nimport { InstanceInformation, InstanceStatus, VpcTag } from '@spinnaker/amazon';\nimport type { Application, IInstanceDetailsProps, IMoniker, IRouterInjectedProps } from '@spinnaker/core';\nimport {\n CollapsibleSection,\n ConsoleOutputLink,\n CopyToClipboard,\n InstanceDetailsHeader,\n InstanceLinks,\n InstanceReader,\n LabeledValue,\n RecentHistoryService,\n SubnetTag,\n withRouter,\n} from '@spinnaker/core';\n\ninterface IEcsInstanceParams {\n account?: string;\n accountId?: string;\n instanceId: string;\n provider?: string;\n region?: string;\n [key: string]: any;\n}\n\nexport interface IEcsInstanceDetailsProps extends Partial<IInstanceDetailsProps> {\n accountId?: string;\n app: Application;\n environment?: string;\n instance?: IEcsInstanceParams;\n moniker?: IMoniker;\n $stateParams?: IInstanceDetailsProps['$stateParams'] & Partial<IEcsInstanceParams>;\n}\n\ninterface IEcsInstanceLookup {\n account?: string;\n loadBalancers?: string[];\n region?: string;\n serverGroup?: string;\n summary?: any;\n targetGroups?: string[];\n vpcId?: string;\n}\n\ninterface IEcsLoadedInstance {\n [key: string]: any;\n account?: string;\n baseIpAddress?: string;\n healthMetrics?: IAmazonHealth[];\n instanceId?: string;\n region?: string;\n}\n\ninterface IEcsInstanceDetailsState {\n instance?: IEcsLoadedInstance;\n instanceIdNotFound?: string;\n loading: boolean;\n}\n\nfunction matchesInstance(candidate: any, instanceId: string): boolean {\n return candidate === instanceId || candidate?.id === instanceId;\n}\n\nfunction matchesScope(candidate: any, instance: IEcsInstanceParams): boolean {\n return (\n (!instance.account || candidate.account === instance.account) &&\n (!instance.region || candidate.region === instance.region)\n );\n}\n\nfunction targetGroupNames(targetGroups: any): string[] {\n const groups = Array.isArray(targetGroups) ? targetGroups : targetGroups ? [targetGroups] : [];\n return groups\n .map((targetGroup) =>\n typeof targetGroup === 'string' ? targetGroup : targetGroup.targetGroupName || targetGroup.name,\n )\n .filter(Boolean);\n}\n\nfunction findInstance(app: Application, instance: IEcsInstanceParams): IEcsInstanceLookup | undefined {\n if (app.isStandalone || !app.serverGroups) {\n return {\n account: instance.account || instance.accountId,\n region: instance.region,\n summary: instance,\n };\n }\n\n for (const serverGroup of app.serverGroups.data || []) {\n if (!matchesScope(serverGroup, instance)) {\n continue;\n }\n const summary = (serverGroup.instances || []).find((candidate: any) =>\n matchesInstance(candidate, instance.instanceId),\n );\n if (summary) {\n return {\n account: serverGroup.account,\n loadBalancers: serverGroup.loadBalancers || [],\n region: serverGroup.region,\n serverGroup: serverGroup.name,\n summary,\n targetGroups: targetGroupNames(serverGroup.targetGroups || serverGroup.targetGroup),\n vpcId: serverGroup.vpcId,\n };\n }\n }\n\n for (const loadBalancer of app.loadBalancers?.data || []) {\n if (!matchesScope(loadBalancer, instance)) {\n continue;\n }\n const summary = (loadBalancer.instances || []).find((candidate: any) =>\n matchesInstance(candidate, instance.instanceId),\n );\n if (summary) {\n return {\n account: loadBalancer.account,\n loadBalancers: [loadBalancer.name],\n region: loadBalancer.region,\n summary,\n vpcId: loadBalancer.vpcId,\n };\n }\n\n for (const targetGroup of loadBalancer.targetGroups || loadBalancer.targetGroup || []) {\n if (!matchesScope({ account: loadBalancer.account, region: loadBalancer.region, ...targetGroup }, instance)) {\n continue;\n }\n const targetSummary = (targetGroup.instances || []).find((candidate: any) =>\n matchesInstance(candidate, instance.instanceId),\n );\n if (targetSummary) {\n return {\n account: targetGroup.account || loadBalancer.account,\n region: targetGroup.region || loadBalancer.region,\n summary: typeof targetSummary === 'string' ? { id: targetSummary } : targetSummary,\n targetGroups: targetGroupNames(targetGroup),\n vpcId: loadBalancer.vpcId,\n };\n }\n }\n\n for (const serverGroup of (loadBalancer.serverGroups || []).filter((candidate: any) => candidate.isDisabled)) {\n const disabledSummary = (serverGroup.instances || []).find((candidate: any) =>\n matchesInstance(candidate, instance.instanceId),\n );\n if (disabledSummary) {\n return {\n account: loadBalancer.account,\n loadBalancers: [loadBalancer.name],\n region: loadBalancer.region,\n serverGroup: serverGroup.name,\n summary: disabledSummary,\n vpcId: loadBalancer.vpcId,\n };\n }\n }\n }\n\n return undefined;\n}\n\nfunction addTargetGroupHealthDetails(\n healthMetrics: IAmazonHealth[],\n loadBalancers: any[],\n account: string,\n region: string,\n): IAmazonHealth[] {\n const targetGroups = loadBalancers.flatMap((loadBalancer) =>\n (loadBalancer.targetGroups || loadBalancer.targetGroup || []).map((targetGroup: any) => ({\n account: loadBalancer.account,\n region: loadBalancer.region,\n ...targetGroup,\n })),\n );\n\n return healthMetrics.map((metric) => {\n if (metric.type !== 'TargetGroup' || !metric.targetGroups) {\n return metric;\n }\n\n return {\n ...metric,\n targetGroups: metric.targetGroups.map((health: any) => {\n const name = health.targetGroupName || health.name;\n const targetGroup = targetGroups.find(\n (candidate: any) =>\n name &&\n (candidate.targetGroupName || candidate.name) === name &&\n candidate.account === account &&\n candidate.region === region,\n );\n if (!targetGroup) {\n return health;\n }\n\n const port =\n targetGroup.healthCheckPort === 'traffic-port' || targetGroup.healthCheckPort == null\n ? targetGroup.port\n : targetGroup.healthCheckPort;\n return {\n ...health,\n ...(port == null ? {} : { healthCheckPath: `:${port}${targetGroup.healthCheckPath || ''}` }),\n ...(targetGroup.healthCheckProtocol\n ? { healthCheckProtocol: targetGroup.healthCheckProtocol.toLowerCase() }\n : {}),\n };\n }),\n } as IAmazonHealth;\n });\n}\n\nfunction extractHealthMetrics(\n app: Application,\n summary: any,\n details: any,\n account: string,\n region: string,\n): IAmazonHealth[] {\n const summaryHealth = app.isStandalone ? details.health : summary.health;\n const healthMetrics = ((summaryHealth?.length ? summaryHealth : details.health) || [])\n .filter((metric: IAmazonHealth) => metric.type !== 'Ecs' || metric.state !== 'Unknown')\n .map((metric: IAmazonHealth) => {\n const latest = (details.health || []).find((candidate: IAmazonHealth) => candidate.type === metric.type);\n return latest ? { ...latest, ...metric } : { ...metric };\n });\n\n return app.isStandalone\n ? healthMetrics\n : addTargetGroupHealthDetails(healthMetrics, app.loadBalancers?.data || [], account, region);\n}\n\nasync function loadInstance(app: Application, params: IEcsInstanceParams): Promise<IEcsLoadedInstance | undefined> {\n const lookup = findInstance(app, params);\n if (!lookup?.summary || !lookup.account || !lookup.region) {\n return undefined;\n }\n\n RecentHistoryService.addExtraDataToLatest('instances', {\n account: lookup.account,\n region: lookup.region,\n ...(lookup.serverGroup ? { serverGroup: lookup.serverGroup } : {}),\n ...(lookup.vpcId ? { vpcId: lookup.vpcId } : {}),\n });\n\n const details = (await InstanceReader.getInstanceDetails(lookup.account, lookup.region, params.instanceId)) as any;\n const instanceId = params.instanceId;\n const baseIpAddress =\n details.publicDnsName ||\n details.privateIpAddress ||\n details.networkInterface?.privateIpv4Address ||\n details.privateAddress ||\n details.networkInterface?.ipv6Address;\n\n return {\n ...lookup.summary,\n ...details,\n account: lookup.account,\n baseIpAddress,\n cloudProvider: details.cloudProvider || lookup.summary.cloudProvider || 'ecs',\n healthMetrics: extractHealthMetrics(app, lookup.summary, details, lookup.account, lookup.region),\n instanceId,\n loadBalancers: lookup.loadBalancers || details.loadBalancers || lookup.summary.loadBalancers,\n provider: details.provider || lookup.summary.provider || 'ecs',\n region: lookup.region,\n serverGroup: lookup.serverGroup || details.serverGroup || lookup.summary.serverGroup,\n targetGroups: lookup.targetGroups || details.targetGroups || lookup.summary.targetGroups,\n vpcId: lookup.vpcId || details.vpcId || lookup.summary.vpcId,\n };\n}\n\nfunction NetworkAddress({ address, label }: { address?: string; label: string }): JSX.Element | null {\n if (!address) {\n return null;\n }\n\n const hrefAddress = address.includes(':') ? `[${address}]` : address;\n return (\n <>\n <dt>{label}</dt>\n <dd>\n <a href={`http://${hrefAddress}`} target=\"_blank\" rel=\"noopener noreferrer\">\n {address}\n </a>\n <CopyToClipboard text={address} toolTip=\"Copy to clipboard\" />\n </dd>\n </>\n );\n}\n\nexport class EcsInstanceDetailsComponent extends React.Component<\n IEcsInstanceDetailsProps & IRouterInjectedProps,\n IEcsInstanceDetailsState\n> {\n public state: IEcsInstanceDetailsState = {\n instance: undefined,\n instanceIdNotFound: undefined,\n loading: true,\n };\n\n private activeRequestId = 0;\n private dataReady = false;\n private isUnmounted = false;\n private unsubscribeFromRefresh?: () => void;\n\n public componentDidMount(): void {\n const { app } = this.props;\n const ready = app.isStandalone\n ? Promise.resolve()\n : Promise.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(() => undefined);\n\n ready.then(\n () => {\n if (this.isUnmounted) {\n return;\n }\n this.dataReady = true;\n this.retrieveInstance();\n if (!app.isStandalone && app.serverGroups?.onRefresh) {\n this.unsubscribeFromRefresh = app.serverGroups.onRefresh(() => this.retrieveInstance());\n }\n },\n () => {\n if (!this.isUnmounted) {\n this.closeDetails();\n }\n },\n );\n }\n\n public componentDidUpdate(previousProps: IEcsInstanceDetailsProps): void {\n const previous = this.getInstanceParams(previousProps);\n const current = this.getInstanceParams();\n if (\n this.dataReady &&\n (previous.account !== current.account ||\n previous.instanceId !== current.instanceId ||\n previous.region !== current.region)\n ) {\n this.retrieveInstance(true);\n }\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n this.activeRequestId += 1;\n this.unsubscribeFromRefresh?.();\n }\n\n private getInstanceParams(\n props: IEcsInstanceDetailsProps & Partial<IRouterInjectedProps> = this.props,\n ): IEcsInstanceParams {\n const params = props.instance || props.$stateParams || props.stateParams || ({} as IEcsInstanceParams);\n return {\n ...params,\n account: params.account || params.accountId || props.accountId,\n instanceId: params.instanceId,\n };\n }\n\n private closeDetails(): void {\n this.props.stateService.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n\n private retrieveInstance(clearInstance = false): void {\n const requestId = ++this.activeRequestId;\n const params = this.getInstanceParams();\n this.setState(\n clearInstance\n ? { instance: undefined, instanceIdNotFound: undefined, loading: true }\n : { instanceIdNotFound: undefined, loading: true },\n );\n\n loadInstance(this.props.app, params).then(\n (instance) => {\n if (this.isUnmounted || requestId !== this.activeRequestId) {\n return;\n }\n this.setState({ instance, instanceIdNotFound: instance ? undefined : params.instanceId, loading: false });\n },\n () => {\n if (this.isUnmounted || requestId !== this.activeRequestId) {\n return;\n }\n if (this.props.app.isStandalone) {\n RecentHistoryService.removeLastItem('instances');\n this.setState({ instance: undefined, instanceIdNotFound: params.instanceId, loading: false });\n } else {\n this.closeDetails();\n }\n },\n );\n }\n\n public render(): JSX.Element {\n const { app, environment, moniker } = this.props;\n const { instance, instanceIdNotFound, loading } = this.state;\n const instanceId = instance?.instanceId || instanceIdNotFound || this.getInstanceParams().instanceId;\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <InstanceDetailsHeader\n cloudProvider=\"ecs\"\n healthState={instance?.healthState}\n instanceId={instanceId}\n loading={loading}\n standalone={app.isStandalone}\n />\n </div>\n {!loading && instance && (\n <div className=\"content\" data-test-id=\"instanceDetails.content\">\n <CollapsibleSection heading=\"Instance Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <InstanceInformation\n account={instance.account}\n availabilityZone={instance.zone || instance.availabilityZone || instance.placement?.availabilityZone}\n instanceType={instance.instanceType}\n launchTime={instance.launchTime}\n provider={instance.provider}\n region={instance.region}\n serverGroup={instance.serverGroup}\n />\n {instance.imageId && <LabeledValue label=\"Image ID\" value={instance.imageId} />}\n </dl>\n </CollapsibleSection>\n <InstanceStatus\n healthMetrics={instance.healthMetrics || []}\n healthState={instance.healthState}\n metricTypes={['LoadBalancer', 'TargetGroup']}\n privateIpAddress={instance.privateIpAddress || instance.networkInterface?.privateIpv4Address}\n />\n <CollapsibleSection heading=\"Networking\">\n <dl className=\"horizontal-when-filters-collapsed\">\n {instance.vpcId && <LabeledValue label=\"VPC\" value={<VpcTag vpcId={instance.vpcId} />} />}\n {instance.subnetId && (\n <LabeledValue label=\"Subnet\" value={<SubnetTag subnetId={instance.subnetId} />} />\n )}\n <NetworkAddress address={instance.networkInterface?.privateIpv4Address} label=\"Private address (ENI)\" />\n <NetworkAddress address={instance.networkInterface?.ipv6Address} label=\"IPv6 address (ENI)\" />\n <NetworkAddress address={instance.privateAddress} label=\"Private address (Bridge)\" />\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Console Output\">\n <ConsoleOutputLink instance={instance as any} />\n </CollapsibleSection>\n <InstanceLinks\n address={instance.baseIpAddress}\n application={app}\n environment={environment}\n instance={instance as any}\n moniker={moniker}\n />\n </div>\n )}\n {!loading && !instance && instanceIdNotFound && (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Instance not found.</h3>\n <p>{instanceIdNotFound}</p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const EcsInstanceDetails = withRouter(EcsInstanceDetailsComponent);\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { IInstanceCounts } from '@spinnaker/core';\nimport { LoadBalancerServerGroup } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsTargetGroupProps {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n showServerGroups: boolean;\n showInstances: boolean;\n}\n\nexport class EcsTargetGroup extends React.Component<IEcsTargetGroupProps> {\n public render(): React.ReactElement<EcsTargetGroup> {\n const { targetGroup, loadBalancer, showServerGroups } = this.props;\n\n const params = {\n loadBalancerName: loadBalancer.name,\n region: targetGroup.region,\n accountId: targetGroup.account,\n name: targetGroup.targetGroupName,\n vpcId: targetGroup.vpcId,\n provider: targetGroup.cloudProvider,\n };\n\n // info not yet available; HealthCounts component requires it,\n // but will not render if no values are defined.\n const emptyInstanceCounts: IInstanceCounts = {\n up: undefined,\n down: undefined,\n starting: undefined,\n succeeded: undefined,\n failed: undefined,\n unknown: undefined,\n outOfService: undefined,\n };\n\n return (\n <div className=\"target-group-container container-fluid no-padding\">\n <UISrefActive class=\"active\">\n <UISref to=\".ecsTargetGroupDetails\" params={params}>\n <div className={`clickable clickable-row row no-margin-y target-group-header`}>\n <div className=\"col-md-8 target-group-title\">{targetGroup.targetGroupName}</div>\n </div>\n </UISref>\n </UISrefActive>\n {showServerGroups &&\n targetGroup.serverGroups.map((sgName) => {\n return (\n <LoadBalancerServerGroup\n key={sgName}\n account={targetGroup.account}\n region={targetGroup.region}\n serverGroup={{\n account: targetGroup.account,\n cloudProvider: targetGroup.cloudProvider,\n cluster: sgName,\n instanceCounts: emptyInstanceCounts,\n instances: targetGroup.instances,\n name: sgName,\n type: targetGroup.type,\n region: targetGroup.region,\n }}\n showInstances={false} // TODO: use prop when instanceCounts available\n />\n );\n })}\n </div>\n );\n }\n}\n","import { isEqual } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancerClusterContainerProps } from '@spinnaker/core';\n\nimport { EcsTargetGroup } from './TargetGroup';\nimport type { IEcsLoadBalancer } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerClusterContainer extends React.Component<ILoadBalancerClusterContainerProps> {\n public shouldComponentUpdate(nextProps: ILoadBalancerClusterContainerProps) {\n const serverGroupsDiffer = () =>\n !isEqual(\n (nextProps.serverGroups || []).map((g) => g.name),\n (this.props.serverGroups || []).map((g) => g.name),\n );\n const targetGroupsDiffer = () =>\n !isEqual(\n ((nextProps.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n ((this.props.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n );\n return (\n nextProps.showInstances !== this.props.showInstances ||\n nextProps.showServerGroups !== this.props.showServerGroups ||\n nextProps.loadBalancer !== this.props.loadBalancer ||\n serverGroupsDiffer() ||\n targetGroupsDiffer()\n );\n }\n\n public render(): React.ReactElement<EcsLoadBalancerClusterContainer> {\n const { loadBalancer, showInstances, showServerGroups } = this.props;\n const lb = loadBalancer as IEcsLoadBalancer;\n\n const TargetGroups = lb.targetGroups.map((targetGroup) => {\n return (\n <EcsTargetGroup\n key={targetGroup.targetGroupName}\n loadBalancer={loadBalancer as IEcsLoadBalancer}\n targetGroup={targetGroup}\n showInstances={showInstances}\n showServerGroups={showServerGroups}\n />\n );\n });\n\n return <div className=\"cluster-container\">{TargetGroups}</div>;\n }\n}\n","import React from 'react';\n\nimport type { IEcsListener } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsListenerProps {\n listener: IEcsListener;\n}\n\nexport class EcsListener extends React.Component<IEcsListenerProps> {\n constructor(props: IEcsListenerProps) {\n super(props);\n }\n\n private getTargetGroupNameFromArn(arn: string): string {\n const parts = arn.split('/');\n if (parts.length < 0) {\n return arn;\n }\n return parts[1];\n }\n\n public render(): React.ReactElement<EcsListener> {\n const { port, protocol, defaultActions } = this.props.listener;\n\n // TODO: retrieve and display 'rules' in addition to default actions\n return (\n <div>\n <h4>\n {protocol}:{port}\n </h4>\n <div style={{ paddingLeft: 10 }}>\n <i>default actions</i>\n <ul>\n {defaultActions.map((action, i) => {\n if (action.type == 'forward') {\n return (\n <li key={i}>\n &rarr;\n <i className=\"fa fa-fw fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <span>\n {action.targetGroupArn ||\n action.forwardConfig.targetGroups.map((tg) => {\n return this.getTargetGroupNameFromArn(tg.targetGroupArn);\n })}\n </span>\n </li>\n );\n } else {\n return (\n <li key={i}>\n {action.type}:{' '}\n {action.redirectConfig.statusCode ||\n action.fixedResponseConfig.statusCode ||\n action.authenticateOidcConfig.clientId ||\n action.authenticateCognitoActionConfig.userPoolDomain}\n </li>\n );\n }\n })}\n </ul>\n </div>\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer } from '../../domain/IEcsLoadBalancer';\nimport { EcsListener } from '../listener';\n\ninterface IEcsLoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n vpcId: string;\n}\n\ninterface IEcsLoadBalancerDetailsState {\n loadBalancer: IEcsLoadBalancer;\n loadBalancerNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsLoadBalancerDetailsProps {\n app: Application;\n accountId: string;\n loadBalancer: IEcsLoadBalancerFromStateParams;\n}\n\nexport class EcsLoadBalancerDetails extends React.Component<\n IEcsLoadBalancerDetailsProps,\n IEcsLoadBalancerDetailsState\n> {\n constructor(props: IEcsLoadBalancerDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractLoadBalancer(): void {\n const { name, region } = this.props.loadBalancer;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === name && test.account === this.props.loadBalancer.accountId && test.region === region;\n });\n\n this.setState({\n loading: false,\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (loadBalancer) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(() => this.extractLoadBalancer()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n\n public render(): React.ReactElement<EcsLoadBalancerDetails> {\n const loadBalancerName = this.props.loadBalancer.name;\n const { loadBalancer, loading } = this.state;\n const { accountId } = this.props;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Load balancer not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const loadBalancerHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"header-text horizontal middle\">\n <i className=\"fa icon-sitemap\" />\n <h3 className=\"horizontal middle space-between flex-1\">{loadBalancerName}</h3>\n </div>\n </div>\n );\n\n const loadBalancerContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(loadBalancer.createdTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId} />\n <br />\n {loadBalancer.region}\n </dd>\n <dt>VPC</dt>\n <dd>{loadBalancer.vpcId}</dd>\n <dt>Type</dt>\n <dd>{loadBalancer.loadBalancerType}</dd>\n <dt>IP Type</dt>\n <dd>{loadBalancer.ipAddressType}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Availability Zones</dt>\n <dd>\n <ul>\n {loadBalancer.availabilityZones.map((az) => {\n return <li key={az}>{az}</li>;\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target Groups</dt>\n <dd>\n <ul>\n {loadBalancer.targetGroups.map((tg) => {\n return (\n <li key={tg.targetGroupName}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.ecsTargetGroupDetails\"\n params={{\n loadBalancerName: loadBalancer.name,\n region: loadBalancer.region,\n accountId: loadBalancer.account,\n name: tg.targetGroupName,\n vpcId: tg.vpcId,\n provider: loadBalancer.cloudProvider,\n }}\n >\n <a>{tg.targetGroupName}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Status\" defaultExpanded={false}>\n <span>Select a target group to check the instance health status from the view of its server groups.</span>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Listeners\" defaultExpanded={false}>\n {loadBalancer.listeners ? (\n loadBalancer.listeners.map((listener, index) => {\n return (\n <div key={index}>\n <span>\n <EcsListener listener={listener}></EcsListener>\n </span>\n </div>\n );\n })\n ) : (\n <li>No listeners provided.</li>\n )}\n </CollapsibleSection>\n <CollapsibleSection heading=\"Firewalls\" defaultExpanded={false}>\n <ul>\n {loadBalancer.securityGroups ? (\n loadBalancer.securityGroups.map((sg) => {\n return <li key={sg}>{sg}</li>;\n })\n ) : (\n <li>No security groups provided.</li>\n )}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Subnets\" defaultExpanded={false}>\n <ul>\n {loadBalancer.subnets.map((subnet) => {\n return <li key={subnet}>{subnet}</li>;\n })}\n </ul>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && loadBalancerHeader()}\n {!loading && !loadBalancer && notFoundContent()}\n {!loading && loadBalancer && loadBalancerContent()}\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../../domain/IEcsLoadBalancer';\n\ninterface IEcsTargetGroupFromStateParams {\n loadBalancerName: string;\n targetGroupName: string;\n region: string;\n vpcId: string;\n}\n\ninterface IEcsTargetGroupDetailsState {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n targetGroupNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsTargetGroupProps {\n app: Application;\n accountId: string;\n name: string;\n targetGroup: IEcsTargetGroupFromStateParams;\n provider: string;\n}\n\nexport class EcsTargetGroupDetails extends React.Component<IEcsTargetGroupProps, IEcsTargetGroupDetailsState> {\n constructor(props: IEcsTargetGroupProps) {\n super(props);\n this.state = {\n loading: true,\n targetGroup: undefined,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractTargetGroup());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractTargetGroup(): void {\n const { loadBalancerName, region, targetGroupName } = this.props.targetGroup;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === loadBalancerName && test.account === this.props.accountId && test.region === region;\n });\n\n this.setState({\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (!loadBalancer) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n } else {\n const targetGroup: IEcsTargetGroup = loadBalancer.targetGroups.find(\n (tg) => tg.targetGroupName === targetGroupName,\n );\n if (!targetGroup) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n }\n\n if (targetGroup) {\n this.setState({\n loading: false,\n targetGroup,\n });\n\n if (targetGroup) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(() => this.extractTargetGroup()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n }\n }\n\n public render(): React.ReactElement<EcsTargetGroupDetails> {\n const { name, accountId } = this.props;\n const region = this.props.targetGroup.region;\n const { targetGroup, loadBalancer, loading } = this.state;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Target group not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const targetGroupHeader = () => (\n <div className=\"header\">\n <div className=\"header-text horizontal middle\">\n <i className=\"fa fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <h3 className=\"horizontal middle space-between flex-1\">{name}</h3>\n </div>\n </div>\n );\n\n const targetGroupContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Target Group Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId}></AccountTag>\n <br />\n {targetGroup.region}\n </dd>\n <dt>VPC</dt>\n <dd>{targetGroup.vpcId}</dd>\n <dt>Protocol</dt>\n <dd>{targetGroup.protocol}</dd>\n <dt>Port</dt>\n <dd>{targetGroup.port}</dd>\n <dt>Target Type</dt>\n <dd>{targetGroup.targetType.toUpperCase()}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancers</dt>\n <dd>\n {/* TODO: use UISref to display/highlight LBs in this app. See core/.../LoadBalancer.tsx */}\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.loadBalancerNames ? (\n targetGroup.loadBalancerNames.map((lb, i) => {\n return <li key={i}>{lb}</li>;\n })\n ) : (\n <li>No load balncers provided.</li>\n )}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancer DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Server Groups</dt>\n <dd>\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.serverGroups.map((sg, i) => {\n return (\n <li key={i}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: region,\n accountId: accountId,\n serverGroup: sg,\n provider: 'ecs',\n }}\n >\n <a>{sg}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Health Checks\" defaultExpanded={false}>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target</dt>\n <dd>\n {targetGroup.healthCheckProtocol}:{targetGroup.healthCheckPort}\n {targetGroup.healthCheckPath}\n </dd>\n <dt>Timeout</dt>\n <dd>{targetGroup.healthCheckTimeoutSeconds} seconds</dd>\n <dt>Interval</dt>\n <dd>{targetGroup.healthCheckIntervalSeconds} seconds</dd>\n <dt>Healthy Threshold</dt>\n <dd>{targetGroup.healthyThresholdCount}</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{targetGroup.unhealthyThresholdCount}</dd>\n <dt>Matcher</dt>\n <dd>HTTP Code(s): {targetGroup && targetGroup.matcher ? targetGroup.matcher.httpCode : 'None'}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Attributes\" defaultExpanded={false}>\n <dl>\n <dt>Deregistration Delay Timeout</dt>\n <dd>{targetGroup.attributes['deregistration_delay.timeout_seconds'] || 0} seconds</dd>\n <dt>Stickiness Enabled</dt>\n <dd>{targetGroup.attributes['stickiness.enabled'] || 'N/A'}</dd>\n </dl>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && targetGroupHeader()}\n {!loading && !targetGroup && notFoundContent()}\n {!loading && targetGroup && targetGroupContent()}\n </div>\n );\n }\n}\n","import type { IEcsLoadBalancer, IEcsLoadBalancerSourceData, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerTransformer {\n public normalizeLoadBalancer(loadBalancer: IEcsLoadBalancerSourceData): Promise<IEcsLoadBalancer> {\n loadBalancer.targetGroups.forEach((tg: IEcsTargetGroup) => {\n tg.region = loadBalancer.region;\n tg.account = loadBalancer.account;\n tg.cloudProvider = loadBalancer.cloudProvider;\n if (loadBalancer.targetGroupServices) {\n const tgServiceMap = loadBalancer.targetGroupServices;\n tg.serverGroups = tgServiceMap[tg.targetGroupArn];\n }\n });\n return Promise.resolve(loadBalancer);\n }\n}\n","import type { INestedState } from '@spinnaker/core';\nimport { registerApplicationState } from '@spinnaker/core';\n\nimport { EcsTargetGroupDetails } from '../loadBalancer/details/targetGroupDetails';\n//import { IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\ninterface IEcsTargetGroupStateParams {\n accountId: string;\n loadBalancerName: string;\n name: string;\n provider: string;\n region: string;\n vpcId: string;\n}\n\nexport const ECS_TARGET_GROUP_DETAILS_STATE: INestedState = {\n name: 'ecsTargetGroupDetails',\n url: '/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name',\n params: {\n vpcId: {\n value: null,\n squash: true,\n },\n },\n views: {\n 'detail@../insight': {\n component: EcsTargetGroupDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: IEcsTargetGroupStateParams) => $stateParams.accountId],\n name: ['$stateParams', ($stateParams: IEcsTargetGroupStateParams) => $stateParams.name],\n provider: ['$stateParams', ($stateParams: IEcsTargetGroupStateParams) => $stateParams.provider],\n // resolve flat params into an IEcsTargetGroup\n targetGroup: [\n '$stateParams',\n ($stateParams: IEcsTargetGroupStateParams) => {\n return {\n loadBalancerName: $stateParams.loadBalancerName,\n targetGroupName: $stateParams.name,\n accountId: $stateParams.accountId,\n region: $stateParams.region,\n vpcId: $stateParams.vpcId,\n };\n },\n ],\n },\n data: {\n pageTitleDetails: {\n title: 'Target Group Details',\n nameParam: 'name',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n },\n};\n\nregisterApplicationState((applicationStateProvider) => {\n applicationStateProvider.addInsightDetailState(ECS_TARGET_GROUP_DETAILS_STATE);\n});\n","import React from 'react';\n\nexport interface IEcsServerGroupStepLabelProps {\n action: string;\n step: any;\n useSource?: boolean;\n}\n\nexport function EcsServerGroupStepLabel({ action, step, useSource }: IEcsServerGroupStepLabelProps) {\n const serverGroupName = useSource ? step.context?.source?.serverGroupName : step.context?.serverGroupName;\n return (\n <span className=\"task-label\">\n {action}: {serverGroupName} ({step.context?.region})\n </span>\n );\n}\n","import { set } from 'lodash';\nimport React from 'react';\n\nimport type { IAccount, IStageConfigProps } from '@spinnaker/core';\nimport {\n AccountRegionClusterSelector,\n AccountService,\n DeploymentStrategySelector,\n HelpField,\n PlatformHealthOverride,\n StageConfigField,\n StageConstants,\n TargetSelect,\n} from '@spinnaker/core';\n\nconst ECS_HEALTH_PROVIDER = 'Ecs';\nconst ADD_TO_LOAD_BALANCER = 'AddToLoadBalancer';\n\nconst scaleActions = [\n { label: 'Scale by percentage or number', val: 'scale' },\n { label: 'Scale to an exact size', val: 'scale_exact' },\n { label: 'Scale to cluster size', val: 'scale_to_cluster' },\n];\n\nconst resizeTypes = [\n { label: 'Scale by number of instances', val: 'incr' },\n { label: 'Scale by percentage', val: 'pct' },\n];\n\nfunction useForceUpdate(): () => void {\n const [, setCounter] = React.useState(0);\n return () => setCounter((counter) => counter + 1);\n}\n\nfunction useEcsAccounts(): IAccount[] {\n const [accounts, setAccounts] = React.useState<IAccount[]>([]);\n\n React.useEffect(() => {\n let active = true;\n AccountService.listAccounts('ecs').then((loadedAccounts) => active && setAccounts(loadedAccounts));\n return () => {\n active = false;\n };\n }, []);\n\n return accounts;\n}\n\nfunction applyEcsDefaults(props: IStageConfigProps, defaults: Record<string, any> = {}, healthOverride = false): void {\n const { application, stage, updateStageField } = props;\n const changes: Record<string, any> = { cloudProvider: 'ecs', cloudProviderType: 'ecs' };\n const defaultCredentials = application.defaultCredentials?.ecs;\n const defaultRegion = application.defaultRegions?.ecs;\n\n if (!stage.credentials && defaultCredentials) {\n changes.credentials = defaultCredentials;\n }\n\n if (!stage.region && defaultRegion) {\n changes.region = defaultRegion;\n }\n\n if (!stage.regions?.length) {\n changes.regions = defaultRegion ? [defaultRegion] : [];\n }\n\n Object.keys(defaults).forEach((key) => {\n if (stage[key] === undefined) {\n changes[key] = defaults[key];\n }\n });\n\n if (\n healthOverride &&\n stage.isNew &&\n stage.interestingHealthProviderNames === undefined &&\n application.attributes.platformHealthOnlyShowOverride &&\n application.attributes.platformHealthOnly\n ) {\n changes.interestingHealthProviderNames = [ECS_HEALTH_PROVIDER];\n }\n\n updateStageField(changes);\n}\n\nfunction useEcsDefaults(props: IStageConfigProps, defaults: Record<string, any> = {}, healthOverride = false): void {\n React.useEffect(() => applyEcsDefaults(props, defaults, healthOverride), []);\n}\n\nfunction pluralize(str: string, val: string | number): string {\n return Number(val) === 1 ? str : `${str}s`;\n}\n\nfunction EcsClusterSelector(\n props: IStageConfigProps & { clusterField?: string; singleRegion?: boolean; showAllRegions?: boolean },\n) {\n const accounts = useEcsAccounts();\n const { application, clusterField, pipeline, showAllRegions, singleRegion, stage, stageFieldUpdated } = props;\n\n if (pipeline.strategy) {\n return null;\n }\n\n return (\n <AccountRegionClusterSelector\n accounts={accounts}\n application={application}\n clusterField={clusterField}\n component={stage}\n onComponentUpdate={stageFieldUpdated}\n showAllRegions={showAllRegions}\n singleRegion={singleRegion ? 'true' : undefined}\n />\n );\n}\n\nfunction EcsTargetSelect({ stage, updateStageField }: IStageConfigProps) {\n return (\n <StageConfigField label=\"Target\">\n <TargetSelect\n model={{ target: stage.target }}\n options={StageConstants.TARGET_LIST}\n onChange={(target: string) => updateStageField({ target })}\n />\n </StageConfigField>\n );\n}\n\nfunction EcsHealthOverride({ application, stage, updateStageField }: IStageConfigProps) {\n if (!application.attributes.platformHealthOnlyShowOverride) {\n return null;\n }\n\n return (\n <StageConfigField label=\"Task Completion\">\n <PlatformHealthOverride\n interestingHealthProviderNames={stage.interestingHealthProviderNames || []}\n onChange={(interestingHealthProviderNames) => updateStageField({ interestingHealthProviderNames })}\n platformHealthType={ECS_HEALTH_PROVIDER}\n />\n </StageConfigField>\n );\n}\n\nfunction setNestedStageField(props: IStageConfigProps, field: string, value: any, forceUpdate: () => void): void {\n set(props.stage, field, value);\n props.stageFieldUpdated();\n forceUpdate();\n}\n\nfunction EcsServerGroupTargetStageConfig(props: IStageConfigProps & { healthOverride?: boolean }) {\n useEcsDefaults(props, { target: StageConstants.TARGET_LIST[0].val }, props.healthOverride);\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} />\n <EcsTargetSelect {...props} />\n {props.healthOverride && <EcsHealthOverride {...props} />}\n </div>\n );\n}\n\nexport function EcsDestroyAsgStageConfig(props: IStageConfigProps) {\n return <EcsServerGroupTargetStageConfig {...props} />;\n}\n\nexport function EcsDisableAsgStageConfig(props: IStageConfigProps) {\n return <EcsServerGroupTargetStageConfig {...props} healthOverride />;\n}\n\nexport function EcsEnableAsgStageConfig(props: IStageConfigProps) {\n return <EcsServerGroupTargetStageConfig {...props} healthOverride />;\n}\n\nexport function EcsDisableClusterStageConfig(props: IStageConfigProps) {\n const { stage, updateStageField } = props;\n useEcsDefaults(props, { preferLargerOverNewer: 'false', remainingEnabledServerGroups: 1 }, true);\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} />\n <StageConfigField label=\"Disable Options\">\n <div className=\"form-inline\">\n Keep the{' '}\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => updateStageField({ remainingEnabledServerGroups: Number(event.target.value) })}\n required\n style={{ width: '50px' }}\n type=\"number\"\n value={stage.remainingEnabledServerGroups ?? 1}\n />{' '}\n <select\n className=\"form-control input-sm\"\n onChange={(event) => updateStageField({ preferLargerOverNewer: event.target.value })}\n style={{ width: '100px' }}\n value={stage.preferLargerOverNewer ?? 'false'}\n >\n <option value=\"true\">largest</option>\n <option value=\"false\">newest</option>\n </select>{' '}\n {pluralize('server group', stage.remainingEnabledServerGroups ?? 1)} enabled.\n </div>\n </StageConfigField>\n <EcsHealthOverride {...props} />\n </div>\n );\n}\n\nexport function EcsFindImageFromTagsStageConfig(props: IStageConfigProps) {\n const { stage, updateStageField } = props;\n useEcsDefaults(props);\n\n return (\n <div className=\"form-horizontal\">\n <StageConfigField label=\"Full Docker Image path (label or SHA-256)\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => updateStageField({ imageLabelOrSha: event.target.value })}\n type=\"text\"\n value={stage.imageLabelOrSha || ''}\n />\n </StageConfigField>\n <div>\n <h5>\n Example value: <i>12345678901.dkr.ecr.us-west-2.amazonaws.com/continuous-delivery:latest</i>\n </h5>\n </div>\n </div>\n );\n}\n\nexport function EcsScaleDownClusterStageConfig(props: IStageConfigProps) {\n const { stage, updateStageField } = props;\n useEcsDefaults(props, {\n allowScaleDownActive: false,\n preferLargerOverNewer: 'false',\n remainingFullSizeServerGroups: 1,\n });\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} />\n <StageConfigField label=\"Scale Down Options\">\n <div className=\"form-inline\">\n <p>\n Keep the{' '}\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => updateStageField({ remainingFullSizeServerGroups: Number(event.target.value) })}\n required\n style={{ width: '50px' }}\n type=\"number\"\n value={stage.remainingFullSizeServerGroups ?? 1}\n />{' '}\n <select\n className=\"form-control input-sm\"\n onChange={(event) => updateStageField({ preferLargerOverNewer: event.target.value })}\n style={{ width: '100px' }}\n value={stage.preferLargerOverNewer ?? 'false'}\n >\n <option value=\"true\">largest</option>\n <option value=\"false\">newest</option>\n </select>{' '}\n {pluralize('server group', stage.remainingFullSizeServerGroups ?? 1)} at current size.\n </p>\n <p>The remaining server groups will be scaled down to zero instances.</p>\n </div>\n </StageConfigField>\n <div className=\"form-group\">\n <div className=\"col-md-offset-3 col-md-6 checkbox\">\n <label>\n <input\n checked={Boolean(stage.allowScaleDownActive)}\n onChange={(event) => updateStageField({ allowScaleDownActive: event.target.checked })}\n type=\"checkbox\"\n />{' '}\n Allow scale down of active server groups\n </label>\n </div>\n </div>\n </div>\n );\n}\n\nexport function EcsShrinkClusterStageConfig(props: IStageConfigProps) {\n const { stage, updateStageField } = props;\n useEcsDefaults(props, { allowDeleteActive: false, retainLargerOverNewer: 'false', shrinkToSize: 1 }, true);\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} />\n <StageConfigField label=\"Shrink Options\">\n <div className=\"form-inline\">\n Shrink to{' '}\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => updateStageField({ shrinkToSize: Number(event.target.value) })}\n required\n style={{ width: '50px' }}\n type=\"number\"\n value={stage.shrinkToSize ?? 1}\n />{' '}\n {pluralize('server group', stage.shrinkToSize ?? 1)}, keeping the{' '}\n <select\n className=\"form-control input-sm\"\n onChange={(event) => updateStageField({ retainLargerOverNewer: event.target.value })}\n style={{ width: '100px' }}\n value={stage.retainLargerOverNewer ?? 'false'}\n >\n <option value=\"true\">largest</option>\n <option value=\"false\">newest</option>\n </select>\n </div>\n </StageConfigField>\n <div className=\"form-group\">\n <div className=\"col-md-offset-3 col-md-6 checkbox\">\n <label>\n <input\n checked={Boolean(stage.allowDeleteActive)}\n onChange={(event) => updateStageField({ allowDeleteActive: event.target.checked })}\n type=\"checkbox\"\n />{' '}\n Allow deletion of active server groups\n </label>\n </div>\n </div>\n <EcsHealthOverride {...props} />\n </div>\n );\n}\n\nexport function EcsCloneServerGroupStageConfig(props: IStageConfigProps) {\n const { stage, stageFieldUpdated, updateStageField } = props;\n const forceUpdate = useForceUpdate();\n const capacity = stage.capacity || { desired: 1, max: 1, min: 1 };\n const suspendedProcesses = stage.suspendedProcesses || [];\n const addToLoadBalancerSuspended = suspendedProcesses.includes(ADD_TO_LOAD_BALANCER);\n useEcsDefaults(\n props,\n {\n capacity,\n suspendedProcesses,\n target: StageConstants.TARGET_LIST[0].val,\n useSourceCapacity: true,\n },\n true,\n );\n\n const updateCapacity = (field: string, value: number) => {\n updateStageField({ capacity: { ...capacity, [field]: value } });\n };\n\n const setUseSourceCapacity = (value: boolean) => {\n if (value) {\n delete stage.capacity;\n stageFieldUpdated();\n forceUpdate();\n } else if (!stage.capacity) {\n updateStageField({ capacity });\n }\n updateStageField({ useSourceCapacity: value });\n };\n\n const toggleAddToLoadBalancer = () => {\n updateStageField({\n suspendedProcesses: addToLoadBalancerSuspended\n ? suspendedProcesses.filter((process: string) => process !== ADD_TO_LOAD_BALANCER)\n : [...suspendedProcesses, ADD_TO_LOAD_BALANCER],\n });\n };\n\n const deploymentFieldChanged = (key: string, value: any) => setNestedStageField(props, key, value, forceUpdate);\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} clusterField=\"targetCluster\" singleRegion />\n <EcsTargetSelect {...props} />\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Capacity</div>\n <div className=\"col-md-9 radio\">\n <label>\n <input\n checked={stage.useSourceCapacity !== false}\n id=\"useSourceCapacityTrue\"\n onChange={() => setUseSourceCapacity(true)}\n type=\"radio\"\n />{' '}\n Copy the capacity from the current server group <HelpField id=\"serverGroupCapacity.useSourceCapacityTrue\" />\n </label>\n </div>\n <div className=\"col-md-9 col-md-offset-3 radio\">\n <label>\n <input\n checked={stage.useSourceCapacity === false}\n id=\"useSourceCapacityFalse\"\n onChange={() => setUseSourceCapacity(false)}\n type=\"radio\"\n />{' '}\n Let me specify the capacity <HelpField id=\"serverGroupCapacity.useSourceCapacityFalse\" />\n </label>\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-2 col-md-offset-3\">Min</div>\n <div className=\"col-md-2\">Max</div>\n <div className=\"col-md-2\">Desired</div>\n </div>\n <div className=\"form-group\">\n {(['min', 'max', 'desired'] as const).map((field) => (\n <div className={field === 'min' ? 'col-md-2 col-md-offset-3' : 'col-md-2'} key={field}>\n <input\n className=\"form-control input-sm\"\n disabled={stage.useSourceCapacity !== false}\n max={field === 'min' || field === 'desired' ? capacity.max : undefined}\n min={field === 'max' ? capacity.min : 0}\n onChange={(event) => updateCapacity(field, Number(event.target.value))}\n required\n type=\"number\"\n value={capacity[field] ?? 1}\n />\n </div>\n ))}\n </div>\n <StageConfigField label=\"Traffic\">\n <div className=\"checkbox\">\n <label>\n <input checked={!addToLoadBalancerSuspended} onChange={toggleAddToLoadBalancer} type=\"checkbox\" /> Send\n client requests to new instances\n </label>\n </div>\n </StageConfigField>\n <EcsHealthOverride {...props} />\n <DeploymentStrategySelector\n command={stage as any}\n labelColumns=\"3\"\n fieldColumns=\"6\"\n onFieldChange={deploymentFieldChanged}\n onStrategyChange={(command) => updateStageField({ strategy: command.strategy })}\n />\n </div>\n );\n}\n\nexport function EcsResizeAsgStageConfig(props: IStageConfigProps) {\n const { stage, updateStageField } = props;\n const capacity = stage.capacity || {};\n useEcsDefaults(\n props,\n {\n action: scaleActions[0].val,\n capacity,\n resizeType: resizeTypes[0].val,\n target: StageConstants.TARGET_LIST[0].val,\n targetHealthyDeployPercentage: 100,\n },\n true,\n );\n\n const updateResizeType = (action: string, resizeType = stage.resizeType || resizeTypes[0].val) => {\n if (action === 'scale_exact') {\n delete stage.scaleNum;\n delete stage.scalePct;\n updateStageField({ action, resizeType: 'exact' });\n return;\n }\n\n const nextResizeType = resizeType === 'pct' ? 'pct' : 'incr';\n const changes: Record<string, any> = { action, capacity: {}, resizeType: nextResizeType };\n if (nextResizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n delete stage.scalePct;\n changes.scaleNum = stage.scaleNum || 0;\n }\n updateStageField(changes);\n };\n\n const updateCapacity = (field: string, value: number) => {\n updateStageField({ capacity: { ...capacity, [field]: value } });\n };\n\n return (\n <div className=\"form-horizontal\">\n <EcsClusterSelector {...props} />\n <EcsTargetSelect {...props} />\n <StageConfigField label=\"Action\" helpKey=\"pipeline.config.resizeAsg.action\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => updateResizeType(event.target.value)}\n required\n value={stage.action ?? scaleActions[0].val}\n >\n {scaleActions.map((action) => (\n <option key={action.val} value={action.val}>\n {action.label}\n </option>\n ))}\n </select>\n </StageConfigField>\n {stage.action !== 'scale_exact' && (\n <>\n <StageConfigField label={stage.action === 'scale_to_cluster' ? 'Additional Capacity' : 'Type'}>\n <select\n className=\"form-control input-sm\"\n onChange={(event) => updateResizeType(stage.action ?? scaleActions[0].val, event.target.value)}\n required\n value={stage.resizeType === 'exact' ? resizeTypes[0].val : stage.resizeType ?? resizeTypes[0].val}\n >\n {resizeTypes.map((type) => (\n <option key={type.val} value={type.val}>\n {type.label}\n </option>\n ))}\n </select>\n </StageConfigField>\n {stage.resizeType === 'pct' && (\n <StageConfigField label=\"Resize Percentage\">\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => updateStageField({ scalePct: Number(event.target.value) })}\n style={{ width: '80px' }}\n type=\"number\"\n value={stage.scalePct ?? 0}\n />\n <div>\n <em className=\"subinput-note\">\n This is the percentage by which the target server group's capacity will be increased\n </em>\n </div>\n </StageConfigField>\n )}\n {stage.resizeType !== 'pct' && (\n <StageConfigField label=\"Resize-by Amount\">\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => updateStageField({ scaleNum: Number(event.target.value) })}\n style={{ width: '80px' }}\n type=\"number\"\n value={stage.scaleNum ?? 0}\n />\n <div>\n <em className=\"subinput-note\">\n This is the exact amount by which the target server group's capacity will be increased\n </em>\n </div>\n </StageConfigField>\n )}\n </>\n )}\n {stage.action === 'scale_exact' && (\n <>\n <StageConfigField label=\"Capacity\">\n <div className=\"row\">\n <div className=\"col-md-3\">Min</div>\n <div className=\"col-md-3\">Max</div>\n <div className=\"col-md-3\">Desired</div>\n </div>\n </StageConfigField>\n <StageConfigField label=\"Match Capacity\">\n <div className=\"row\">\n {(['min', 'max', 'desired'] as const).map((field) => (\n <div className=\"col-md-3\" key={field}>\n <input\n className=\"form-control input-sm\"\n onChange={(event) => updateCapacity(field, Number(event.target.value))}\n type=\"number\"\n value={capacity[field] ?? 0}\n />\n </div>\n ))}\n </div>\n </StageConfigField>\n <StageConfigField label=\"\">\n <em className=\"subinput-note\">This is the exact amount to which the target server group will be scaled</em>\n </StageConfigField>\n </>\n )}\n <EcsHealthOverride {...props} />\n </div>\n );\n}\n","import React from 'react';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nexport function EcsFindImageFromTagsExecutionDetails(props: any) {\n const { stage } = props;\n return (\n <ExecutionDetailsSection name={props.name} current={props.current}>\n <div className=\"row\">\n <div className=\"col-md-12\">\n <dl className=\"dl-narrow dl-horizontal\">\n <dt>Provider</dt>\n <dd>ECS</dd>\n </dl>\n </div>\n </div>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {stage.context?.amiDetails && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n <h4>Results</h4>\n {stage.context.amiDetails.map((image: any, index: number) => (\n <dl key={index} className=\"dl-narrow dl-horizontal\">\n <dt>Region</dt>\n <dd>{image.region}</dd>\n <dt>Image ID</dt>\n <dd>{image.imageId}</dd>\n <dt>Unique ID</dt>\n <dd>{image.imageName}</dd>\n </dl>\n ))}\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n}\n\nEcsFindImageFromTagsExecutionDetails.title = 'findImageConfig';\n","import { UISref } from '@uirouter/react';\nimport { isEmpty } from 'lodash';\nimport React from 'react';\n\nimport { buildIpRulesModel, buildSecurityGroupRulesModel, IPRangeRules, VpcReader } from '@spinnaker/amazon';\nimport type {\n Application,\n IRouterInjectedProps,\n ISecurityGroup,\n ISecurityGroupDetail,\n SecurityGroupReader,\n} from '@spinnaker/core';\nimport {\n AccountTag,\n CloudProviderLogo,\n CollapsibleSection,\n DeckRuntimeContext,\n FirewallLabels,\n RecentHistoryService,\n Spinner,\n withRouter,\n} from '@spinnaker/core';\n\ninterface IEcsResolvedSecurityGroup {\n accountId: string;\n name: string;\n provider?: string;\n region: string;\n vpcId?: string;\n}\n\ninterface IEcsSecurityGroupDetailsProps {\n app: Application;\n autoClose?: () => void;\n resolvedSecurityGroup: IEcsResolvedSecurityGroup;\n securityGroupReader?: SecurityGroupReader;\n vpcReader?: Pick<typeof VpcReader, 'getVpcName'>;\n}\n\ninterface IEcsSecurityGroupDetailsState {\n loading: boolean;\n notFound?: boolean;\n securityGroup?: ISecurityGroupDetail & ISecurityGroup & Record<string, any>;\n}\n\nexport class EcsSecurityGroupDetailsComponent extends React.Component<\n IEcsSecurityGroupDetailsProps & IRouterInjectedProps,\n IEcsSecurityGroupDetailsState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public state: IEcsSecurityGroupDetailsState = { loading: true };\n\n private isUnmounted = false;\n private loadRequestId = 0;\n private unsubscribeFromRefresh: () => void;\n\n public componentDidMount(): void {\n const dataSource = this.props.app.getDataSource?.('securityGroups');\n if (!dataSource) {\n this.loadSecurityGroup();\n return;\n }\n\n dataSource.ready().then(() => {\n if (this.isUnmounted) {\n return;\n }\n this.loadSecurityGroup();\n this.unsubscribeFromRefresh = dataSource.onRefresh(this.loadSecurityGroup);\n });\n }\n\n public componentDidUpdate(prevProps: IEcsSecurityGroupDetailsProps): void {\n if (this.getCoordinatesKey(prevProps) !== this.getCoordinatesKey(this.props)) {\n this.loadSecurityGroup();\n }\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n this.unsubscribeFromRefresh?.();\n }\n\n private getCoordinatesKey(props: IEcsSecurityGroupDetailsProps): string {\n const { accountId, name, region, vpcId } = props.resolvedSecurityGroup;\n return [accountId, region, vpcId || '', name].join(':');\n }\n\n private getSecurityGroupReader(): SecurityGroupReader {\n return this.props.securityGroupReader || this.context.services.securityGroupReader;\n }\n\n private getVpcReader(): Pick<typeof VpcReader, 'getVpcName'> {\n return this.props.vpcReader || VpcReader;\n }\n\n private showNotFound = (): void => {\n if (this.isUnmounted) {\n return;\n }\n if (this.props.autoClose) {\n this.props.autoClose();\n return;\n }\n if (this.props.app.isStandalone) {\n RecentHistoryService.removeLastItem('securityGroups');\n this.setState({ loading: false, notFound: true, securityGroup: undefined });\n return;\n }\n this.props.stateService.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n };\n\n private loadSecurityGroup = (): void => {\n const { app, resolvedSecurityGroup } = this.props;\n const requestId = ++this.loadRequestId;\n this.setState({ loading: true, notFound: false, securityGroup: undefined });\n\n this.getSecurityGroupReader()\n .getSecurityGroupDetails(\n app,\n resolvedSecurityGroup.accountId,\n 'ecs',\n resolvedSecurityGroup.region,\n resolvedSecurityGroup.vpcId || '',\n resolvedSecurityGroup.name,\n )\n .then((details: ISecurityGroupDetail & ISecurityGroup & Record<string, any>) => {\n if (this.isUnmounted || requestId !== this.loadRequestId) {\n return;\n }\n if (!details || isEmpty(details)) {\n this.showNotFound();\n return;\n }\n\n Promise.resolve(this.getVpcReader().getVpcName(details.vpcId)).then(\n (vpcName) => {\n if (this.isUnmounted || requestId !== this.loadRequestId) {\n return;\n }\n const applicationSecurityGroup = this.getSecurityGroupReader().getApplicationSecurityGroup?.(\n app,\n resolvedSecurityGroup.accountId,\n resolvedSecurityGroup.region,\n resolvedSecurityGroup.name,\n );\n this.setState({\n loading: false,\n securityGroup: {\n ...(applicationSecurityGroup || {}),\n ...details,\n accountId: details.accountId || resolvedSecurityGroup.accountId,\n name: details.name || resolvedSecurityGroup.name,\n region: details.region || resolvedSecurityGroup.region,\n vpcId: details.vpcId || resolvedSecurityGroup.vpcId,\n vpcName,\n },\n });\n },\n () => {\n if (!this.isUnmounted && requestId === this.loadRequestId) {\n this.showNotFound();\n }\n },\n );\n })\n .catch(() => {\n if (!this.isUnmounted && requestId === this.loadRequestId) {\n this.showNotFound();\n }\n });\n };\n\n private closeDetails = (): void => {\n this.props.stateService.go('^');\n };\n\n public render(): JSX.Element {\n const { app, resolvedSecurityGroup } = this.props;\n const { loading, notFound, securityGroup } = this.state;\n\n if (notFound) {\n return (\n <div className=\"text-center\">\n <h3>\n Could not find {FirewallLabels.get('firewall')} {resolvedSecurityGroup.name}.\n </h3>\n <UISref to=\"home.infrastructure\">\n <a>Back to search results</a>\n </UISref>\n </div>\n );\n }\n\n const ipRules = securityGroup ? buildIpRulesModel(securityGroup) : [];\n const securityGroupRules = securityGroup ? buildSecurityGroupRulesModel(securityGroup) : [];\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n {!app.isStandalone && (\n <div className=\"close-button\">\n <a className=\"btn btn-link\" onClick={this.closeDetails}>\n <span className=\"glyphicon glyphicon-remove\" />\n </a>\n </div>\n )}\n {loading && (\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n )}\n {!loading && securityGroup && (\n <div className=\"header-text horizontal middle\">\n <CloudProviderLogo provider=\"ecs\" height=\"36px\" width=\"36px\" />\n <h3>{securityGroup.name || '(not found)'}</h3>\n </div>\n )}\n </div>\n {!loading && securityGroup && (\n <div className=\"content\">\n <CollapsibleSection heading={`${FirewallLabels.get('Firewall')} Details`} defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-medium\">\n <dt>ID</dt>\n <dd>{securityGroup.id}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={securityGroup.accountName || securityGroup.accountId} />\n </dd>\n <dt>Region</dt>\n <dd>{securityGroup.region}</dd>\n <dt>VPC</dt>\n <dd>{securityGroup.vpcName || securityGroup.vpcId}</dd>\n <dt>Description</dt>\n <dd>{securityGroup.description}</dd>\n </dl>\n </CollapsibleSection>\n <IPRangeRules ipRules={ipRules} />\n {!ipRules.length && <div data-test-id=\"ecs-ip-rules-empty\">None</div>}\n <CollapsibleSection\n heading={`${FirewallLabels.get('Firewall')} Rules (${securityGroupRules.length})`}\n defaultExpanded={securityGroupRules.length > 0}\n >\n {!securityGroupRules.length && <div data-test-id=\"ecs-security-group-rules-empty\">None</div>}\n {securityGroupRules.map((rule) => (\n <dl className=\"dl-horizontal dl-medium\" key={rule.securityGroup.id || rule.securityGroup.name}>\n <dt>{FirewallLabels.get('Firewall')}</dt>\n <dd>\n <UISref\n to=\"^.firewallDetails\"\n params={{\n accountId: rule.securityGroup.accountName || rule.securityGroup.accountId,\n name: rule.securityGroup.name,\n provider: 'ecs',\n region: rule.securityGroup.region,\n vpcId: rule.securityGroup.vpcId,\n }}\n >\n <a>\n {rule.securityGroup.accountName !== securityGroup.accountName && (\n <AccountTag account={rule.securityGroup.accountName || rule.securityGroup.accountId} />\n )}{' '}\n {rule.securityGroup.name} ({rule.securityGroup.id})\n </a>\n </UISref>\n </dd>\n <dt>Port Ranges</dt>\n {rule.rules.map((portRange) => (\n <dd key={`${portRange.protocol}-${portRange.startPort}-${portRange.endPort}`}>\n {portRange.protocol}: {portRange.startPort} &rarr; {portRange.endPort}\n </dd>\n ))}\n </dl>\n ))}\n </CollapsibleSection>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const EcsSecurityGroupDetails = withRouter(EcsSecurityGroupDetailsComponent);\n","import type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class EcsSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n","export class EcsSecurityGroupTransformer {\n normalizeSecurityGroup(securityGroup) {\n return Promise.resolve(securityGroup);\n }\n}\n","import type { IArtifact, IPipeline, IServerGroupCommandResult, IStage } from '@spinnaker/core';\nimport type { IDockerImage } from '@spinnaker/docker';\n\nimport type { IEcsCapacityProviderDetails } from '../../ecsCluster/IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from '../../ecsCluster/IEcsCluster';\nimport type { IRoleDescriptor } from '../../iamRoles/IRole';\nimport type { IMetricAlarmDescriptor } from '../../metricAlarm/MetricAlarm';\nimport type { IPlacementStrategy } from '../../placementStrategy/IPlacementStrategy';\nimport type { ISecretDescriptor } from '../../secrets/ISecret';\nimport type { IServiceDiscoveryRegistryDescriptor } from '../../serviceDiscovery/IServiceDiscovery';\n\nexport interface IEcsServerGroupCommandDirty {\n [key: string]: any;\n}\n\nexport interface IEcsServerGroupCommandResult extends IServerGroupCommandResult {\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsDockerImage extends IDockerImage {\n [key: string]: any;\n imageId: string;\n message: string;\n fromTrigger: boolean;\n fromContext: boolean;\n stageId: string;\n imageLabelOrSha: string;\n}\n\nexport interface IEcsServerGroupCommandViewState {\n [key: string]: any;\n contextImages: IEcsDockerImage[];\n pipeline: IPipeline;\n currentStage: IStage;\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsServerGroupCommandBackingDataFiltered {\n [key: string]: any;\n targetGroups: string[];\n iamRoles: string[];\n ecsClusters: string[];\n availableCapacityProviders: string[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n metricAlarms: IMetricAlarmDescriptor[];\n subnetTypes: any[];\n securityGroupNames: string[];\n secrets: string[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsServerGroupCommandBackingData {\n [key: string]: any;\n filtered: IEcsServerGroupCommandBackingDataFiltered;\n targetGroups: string[];\n ecsClusters: IEcsClusterDescriptor[];\n capacityProviderDetails: IEcsCapacityProviderDetails[];\n iamRoles: IRoleDescriptor[];\n metricAlarms: IMetricAlarmDescriptor[];\n launchTypes: string[];\n networkModes: string[];\n secrets: ISecretDescriptor[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsTaskDefinitionArtifact {\n artifact?: IArtifact;\n artifactId?: string;\n}\n\nexport interface IEcsContainerMapping {\n containerName: string;\n imageDescription: IEcsDockerImage;\n}\n\nexport interface IEcsTargetGroupMapping {\n containerName: string;\n containerPort: number;\n targetGroup: string;\n}\n\nexport interface IEcsServiceDiscoveryRegistryAssociation {\n registry: IServiceDiscoveryRegistryDescriptor;\n containerPort: number;\n containerName: string;\n}\n\nexport interface IEcsCapacityProviderStrategyItem {\n capacityProvider: string;\n base: number;\n weight: number;\n}\n\nexport interface IEcsServerGroupCommand {\n [key: string]: any;\n associatePublicIpAddress: boolean;\n backingData: IEcsServerGroupCommandBackingData;\n computeUnits: number;\n reservedMemory: number;\n targetHealthyDeployPercentage: number;\n targetGroup: string;\n containerPort: number;\n placementStrategyName: string;\n placementStrategySequence: IPlacementStrategy[];\n imageDescription: IEcsDockerImage;\n networkMode: string;\n subnetType: string;\n subnetTypes: string[];\n securityGroups: string[];\n securityGroupNames: string[];\n viewState: IEcsServerGroupCommandViewState;\n taskDefinitionArtifact: IEcsTaskDefinitionArtifact;\n taskDefinitionArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n loadBalancedContainer: string;\n targetGroupMappings: IEcsTargetGroupMapping[];\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n useTaskDefinitionArtifact: boolean;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n useDefaultCapacityProviders: boolean;\n ecsClusterName: string;\n}\n\nexport class EcsServerGroupConfigurationService {\n public configureUpdateCommand(command: IEcsServerGroupCommand): void {\n command.backingData = {\n filtered: {} as IEcsServerGroupCommandBackingDataFiltered,\n launchTypes: ['EC2', 'FARGATE'],\n networkModes: ['bridge', 'host', 'awsvpc', 'none', 'default'],\n } as IEcsServerGroupCommandBackingData;\n }\n}\n","import _ from 'lodash';\n\nimport { AccountService } from '@spinnaker/core';\n\nimport { EcsServerGroupConfigurationService } from './serverGroupConfiguration.service';\n\nfunction reconcileUpstreamImages(image, upstreamImages) {\n if (image.fromContext) {\n const matchingImage = upstreamImages.find((otherImage) => image.stageId === otherImage.stageId);\n if (matchingImage) {\n image.cluster = matchingImage.cluster;\n image.pattern = matchingImage.pattern;\n image.repository = matchingImage.repository;\n return image;\n }\n return null;\n }\n if (image.fromTrigger) {\n const matchingImage = upstreamImages.find(\n (otherImage) =>\n image.registry === otherImage.registry &&\n image.repository === otherImage.repository &&\n image.tag === otherImage.tag,\n );\n return matchingImage ? image : null;\n }\n return image;\n}\n\nfunction findUpstreamImages(current, all, visited = {}) {\n if (visited[current.refId]) {\n return [];\n }\n visited[current.refId] = true;\n let result = [];\n if (current.type === 'findImageFromTags') {\n result.push({ fromContext: true, imageLabelOrSha: current.imageLabelOrSha, stageId: current.refId });\n }\n current.requisiteStageRefIds.forEach((id) => {\n const next = all.find((stage) => stage.refId === id);\n if (next) {\n result = result.concat(findUpstreamImages(next, all, visited));\n }\n });\n return result;\n}\n\nfunction findTriggerImages(triggers) {\n return triggers\n .filter((trigger) => trigger.type === 'docker')\n .map((trigger) => ({\n fromTrigger: true,\n repository: trigger.repository,\n account: trigger.account,\n organization: trigger.organization,\n registry: trigger.registry,\n tag: trigger.tag,\n }));\n}\n\nfunction buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n const defaultCredentials = defaults.account || application.defaultCredentials.ecs;\n const defaultRegion = defaults.region || application.defaultRegions.ecs;\n\n return Promise.all([\n AccountService.getAvailabilityZonesForAccountAndRegion('ecs', defaultCredentials, defaultRegion),\n AccountService.getCredentialsKeyedByAccount('ecs'),\n ]).then(([availabilityZones]) => {\n const command = {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n strategy: '',\n capacity: { min: 1, max: 1, desired: 1 },\n launchType: 'EC2',\n healthCheckType: 'EC2',\n selectedProvider: 'ecs',\n iamRole: 'None (No IAM role)',\n dockerImageCredentialsSecret: 'None (No registry credentials)',\n availabilityZones,\n subnetType: '',\n securityGroupNames: [],\n healthCheckGracePeriodSeconds: '',\n placementConstraints: [],\n placementStrategyName: '',\n taskDefinitionArtifact: {},\n useTaskDefinitionArtifact: false,\n placementStrategySequence: [],\n serviceDiscoveryAssociations: [],\n ecsClusterName: '',\n targetGroup: '',\n copySourceScalingPoliciesAndActions: true,\n preferSourceCapacity: true,\n useSourceCapacity: true,\n enableDeploymentCircuitBreaker: false,\n viewState: {\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n dirty: {},\n },\n };\n\n if (application.attributes?.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n command.interestingHealthProviderNames = ['ecs'];\n }\n\n return command;\n });\n}\n\nfunction buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const availabilityZonesByRegion = pipelineCluster.availabilityZones || {};\n const region = Object.keys(availabilityZonesByRegion)[0] || pipelineCluster.region || application.defaultRegions?.ecs;\n const commandOptions = { account: pipelineCluster.account, region };\n return buildNewServerGroupCommand(application, commandOptions).then((command) => {\n const zones = availabilityZonesByRegion[region] || command.availabilityZones || [];\n const usePreferredZones = zones.join(',') === (command.availabilityZones || []).join(',');\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n if (command.docker?.image) {\n command.docker.image = reconcileUpstreamImages(command.docker.image, contextImages);\n }\n\n const viewState = {\n instanceProfile: undefined,\n disableImageSelection: true,\n useSimpleCapacity:\n !!pipelineCluster.capacity &&\n pipelineCluster.capacity.min === pipelineCluster.capacity.max &&\n pipelineCluster.useSourceCapacity !== true,\n usePreferredZones,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n existingPipelineCluster: true,\n dirty: {},\n contextImages,\n pipeline,\n currentStage: current,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n return Object.assign({}, command, pipelineCluster, {\n region,\n credentials: pipelineCluster.account,\n availabilityZones: zones,\n viewState,\n });\n });\n}\n\nfunction buildNewServerGroupCommandForPipeline(current, pipeline) {\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n return Promise.resolve({\n viewState: {\n requiresTemplateSelection: true,\n overrides: { viewState: { mode: 'editPipeline', contextImages, pipeline, currentStage: current } },\n },\n });\n}\n\nfunction buildUpdateServerGroupCommand(serverGroup, configurationService) {\n const command = {\n type: 'modifyAsg',\n asgs: [{ asgName: serverGroup.name, region: serverGroup.region }],\n healthCheckType: serverGroup.asg?.healthCheckType,\n credentials: serverGroup.account,\n };\n configurationService.configureUpdateCommand(command);\n return command;\n}\n\nfunction buildServerGroupCommandFromExisting(application, serverGroup, mode = 'clone') {\n const commandOptions = { account: serverGroup.account, region: serverGroup.region };\n return buildNewServerGroupCommand(application, commandOptions).then((command) => {\n command.credentials = serverGroup.account;\n command.app = serverGroup.moniker.app;\n command.stack = serverGroup.moniker.stack;\n command.region = serverGroup.region;\n command.ecsClusterName = serverGroup.ecsCluster;\n command.capacity = serverGroup.capacity;\n command.viewState.mode = mode;\n return command;\n });\n}\n\nexport class EcsServerGroupCommandBuilder {\n constructor() {\n this.configurationService = new EcsServerGroupConfigurationService();\n }\n\n buildNewServerGroupCommand(application, defaults) {\n return buildNewServerGroupCommand(application, defaults);\n }\n\n buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n return buildServerGroupCommandFromExisting(application, serverGroup, mode);\n }\n\n buildNewServerGroupCommandForPipeline(current, pipeline) {\n return buildNewServerGroupCommandForPipeline(current, pipeline);\n }\n\n buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline) {\n return buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline);\n }\n\n buildUpdateServerGroupCommand(serverGroup) {\n return buildUpdateServerGroupCommand(serverGroup, this.configurationService);\n }\n}\n","import type { IEcsDockerImage } from './serverGroupConfiguration.service';\n\nexport function buildEcsImageId(image: any): string {\n if (image.imageId) {\n return image.imageId;\n }\n if (image.fromContext) {\n return image.imageLabelOrSha;\n }\n if (image.fromTrigger && !image.tag) {\n return `${image.registry}/${image.repository} (Tag resolved at runtime)`;\n }\n if (image.registry && image.repository && image.tag) {\n return `${image.registry}/${image.repository}:${image.tag}`;\n }\n return image.reference || image.repository || '';\n}\n\nexport function normalizeEcsDockerImage(image: any): IEcsDockerImage {\n return {\n ...image,\n imageId: buildEcsImageId(image),\n message: image.message || '',\n fromTrigger: !!image.fromTrigger,\n fromContext: !!image.fromContext,\n stageId: image.stageId || '',\n imageLabelOrSha: image.imageLabelOrSha || '',\n };\n}\n","import { REST } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderDetails } from './IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from './IEcsCluster';\n\nexport class EcsClusterReader {\n public listClusters(): Promise<IEcsClusterDescriptor[]> {\n return REST('/ecs/ecsClusters').get();\n }\n\n public describeClusters(account: string, region: string): Promise<IEcsCapacityProviderDetails[]> {\n if (account != null && region != null) {\n return REST('/ecs/ecsClusterDescriptions').path(account).path(region).get();\n }\n return Promise.resolve([]);\n }\n}\n","import { REST } from '@spinnaker/core';\nimport type { IRoleDescriptor } from './IRole';\n\nexport class IamRoleReader {\n public listRoles(provider: string): Promise<IRoleDescriptor[]> {\n return REST('/roles').path(provider).get();\n }\n}\n","import { REST } from '@spinnaker/core';\nimport type { IMetricAlarmDescriptor } from './MetricAlarm';\n\nexport class MetricAlarmReader {\n public listMetricAlarms(): Promise<IMetricAlarmDescriptor[]> {\n return REST('/ecs/cloudMetrics/alarms').get();\n }\n}\n","import React from 'react';\n\nimport { HelpField, MapEditor } from '@spinnaker/core';\n\nimport type { IEcsWizardPageProps } from './common';\n\nconst placementStrategies = [\n 'AZ Balanced Spread',\n 'AZ Balanced BinPack CPU',\n 'AZ Balanced BinPack Memory',\n 'BinPack CPU',\n 'BinPack Memory',\n 'One Task Per Host',\n 'None',\n];\n\nexport const AdvancedSettings = ({ command, onFieldChange }: IEcsWizardPageProps) => {\n const placementConstraints = command.placementConstraints || [];\n const iamRoles = Array.from(new Set([...(command.backingData.filtered.iamRoles || []), command.iamRole])).filter(\n Boolean,\n );\n const secrets = Array.from(\n new Set([...(command.backingData.filtered.secrets || []), command.dockerImageCredentialsSecret]),\n ).filter(Boolean);\n const updateConstraint = (index: number, field: string, value: string) => {\n const constraints = placementConstraints.map((constraint: any, constraintIndex: number) =>\n constraintIndex === index ? { ...constraint, [field]: value } : constraint,\n );\n onFieldChange('placementConstraints', constraints);\n };\n\n return (\n <div className=\"container-fluid form-horizontal\" data-test-id=\"EcsServerGroupWizard.advancedSettings\">\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n Health Check Grace Period <HelpField id=\"ecs.healthgraceperiod\" />\n </div>\n <div className=\"col-md-2\">\n <input\n aria-label=\"Health check grace period\"\n className=\"form-control input-sm no-spel\"\n data-test-id=\"Advanced.healthCheckGracePeriodSeconds\"\n onChange={(event) =>\n onFieldChange(\n 'healthCheckGracePeriodSeconds',\n event.target.value === '' ? '' : Number(event.target.value),\n )\n }\n type=\"number\"\n value={command.healthCheckGracePeriodSeconds ?? ''}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n <b>ECS IAM Instance Profile</b> <HelpField id=\"ecs.iamrole\" />\n </div>\n <div className=\"col-md-7\">\n {iamRoles.length ? (\n <select\n aria-label=\"ECS IAM instance profile\"\n className=\"form-control input-sm\"\n data-test-id=\"Advanced.iamRole\"\n onChange={(event) => onFieldChange('iamRole', event.target.value)}\n value={command.iamRole || ''}\n >\n {iamRoles.map((iamRole) => (\n <option key={iamRole} value={iamRole}>\n {iamRole}\n </option>\n ))}\n </select>\n ) : (\n 'No account was selected, or no IAM roles are available for ECS tasks in this account.'\n )}\n </div>\n </div>\n\n {!command.useTaskDefinitionArtifact && (\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n <b>Docker Image Credentials</b> <HelpField id=\"ecs.dockerimagecredentials\" />\n </div>\n <div className=\"col-md-7\">\n {secrets.length ? (\n <select\n aria-label=\"Docker image credentials\"\n className=\"form-control input-sm\"\n data-test-id=\"Advanced.dockerImageCredentialsSecret\"\n onChange={(event) => onFieldChange('dockerImageCredentialsSecret', event.target.value)}\n value={command.dockerImageCredentialsSecret || ''}\n >\n {secrets.map((secret) => (\n <option key={secret} value={secret}>\n {secret}\n </option>\n ))}\n </select>\n ) : (\n 'No account or region was selected, or no AWS Secrets Manager secrets are available in this account and region.'\n )}\n </div>\n </div>\n )}\n\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n Fargate platform version <HelpField id=\"ecs.platformVersion\" />\n </div>\n <div className=\"col-md-3\">\n <input\n aria-label=\"Fargate platform version\"\n className=\"form-control input-sm\"\n data-test-id=\"Advanced.platformVersion\"\n onChange={(event) => onFieldChange('platformVersion', event.target.value)}\n type=\"text\"\n value={command.platformVersion || ''}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n Enable Deployment Circuit Breaker <HelpField id=\"ecs.enableDeploymentCircuitBreaker\" />\n </div>\n <div className=\"col-md-3\">\n <input\n aria-label=\"Enable deployment circuit breaker\"\n checked={!!command.enableDeploymentCircuitBreaker}\n data-test-id=\"Advanced.enableDeploymentCircuitBreaker\"\n onChange={(event) => onFieldChange('enableDeploymentCircuitBreaker', event.target.checked)}\n type=\"checkbox\"\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n <b>Placement Strategy</b> <HelpField id=\"ecs.placementStrategy\" />\n </div>\n <div className=\"col-md-7\">\n <select\n aria-label=\"Placement strategy\"\n className=\"form-control input-sm\"\n data-test-id=\"Advanced.placementStrategyName\"\n onChange={(event) => onFieldChange('placementStrategyName', event.target.value)}\n value={command.placementStrategyName || ''}\n >\n <option value=\"\">Select...</option>\n {placementStrategies.map((strategy) => (\n <option key={strategy} value={strategy}>\n {strategy}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Placement Constraints</b> <HelpField id=\"ecs.placementConstraints\" />\n </div>\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th style={{ width: '25%' }}>Type</th>\n <th style={{ width: '68%' }}>Expression</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {placementConstraints.map((constraint: any, index: number) => (\n <tr key={index}>\n <td>\n <select\n aria-label={`Placement constraint type ${index + 1}`}\n className=\"form-control input-sm\"\n data-test-id={`Advanced.placementConstraint.type.${index}`}\n onChange={(event) => updateConstraint(index, 'type', event.target.value)}\n value={constraint.type || ''}\n >\n <option value=\"\">Select...</option>\n <option value=\"distinctInstance\">distinctInstance</option>\n <option value=\"memberOf\">memberOf</option>\n </select>\n </td>\n <td>\n <input\n aria-label={`Placement constraint expression ${index + 1}`}\n className=\"form-control input-sm no-spel\"\n data-test-id={`Advanced.placementConstraint.expression.${index}`}\n onChange={(event) => updateConstraint(index, 'expression', event.target.value)}\n type=\"text\"\n value={constraint.expression || ''}\n />\n </td>\n <td>\n <button\n aria-label={`Remove placement constraint ${index + 1}`}\n className=\"btn btn-link sm-label\"\n onClick={() =>\n onFieldChange(\n 'placementConstraints',\n placementConstraints.filter(\n (_constraint: any, constraintIndex: number) => constraintIndex !== index,\n ),\n )\n }\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" /> <span className=\"sr-only\">Remove</span>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n <tr>\n <td colSpan={3}>\n <button\n className=\"btn btn-block btn-sm add-new\"\n onClick={() => onFieldChange('placementConstraints', [...placementConstraints, {}])}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add New Placement Constraint\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n {!command.useTaskDefinitionArtifact && (\n <>\n <div className=\"form-group\" data-test-id=\"Advanced.dockerLabels\">\n <div className=\"sm-label-left\">\n <b>Docker labels (optional)</b> <HelpField id=\"ecs.dockerLabels\" />\n </div>\n <MapEditor\n allowEmpty={true}\n keyLabel=\"Docker label name\"\n model={command.dockerLabels || {}}\n onChange={(dockerLabels) => onFieldChange('dockerLabels', dockerLabels)}\n valueLabel=\"Docker label value\"\n />\n </div>\n <div className=\"form-group\" data-test-id=\"Advanced.environmentVariables\">\n <div className=\"sm-label-left\">\n <b>Environment Variables (optional)</b> <HelpField id=\"ecs.environmentVariables\" />\n </div>\n <MapEditor\n allowEmpty={true}\n keyLabel=\"Environment variable name\"\n model={command.environmentVariables || {}}\n onChange={(environmentVariables) => onFieldChange('environmentVariables', environmentVariables)}\n valueLabel=\"Environment variable value\"\n />\n </div>\n </>\n )}\n\n <div className=\"form-group\" data-test-id=\"Advanced.tags\">\n <div className=\"sm-label-left\">\n <b>Tags (optional)</b> <HelpField id=\"ecs.tags\" />\n </div>\n <MapEditor\n allowEmpty={true}\n keyLabel=\"Tag name\"\n model={command.tags || {}}\n onChange={(tags) => onFieldChange('tags', tags)}\n valueLabel=\"Tag value\"\n />\n </div>\n\n {command.useTaskDefinitionArtifact && (\n <div style={{ color: '#666' }}>\n <hr />\n <p>\n <em>\n <strong>Docker Image Credentials, Docker labels</strong>, and <strong>Environment Variables</strong>{' '}\n cannot be individually set when using a Task Definition artifact. Please include them in their respective\n container definition in that file.\n </em>\n </p>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\n\nimport { AccountSelectInput, DeploymentStrategySelector, NameUtils, RegionSelectInput } from '@spinnaker/core';\n\nimport type { IEcsWizardPageProps } from './common';\n\nconst fieldValue = (value: any) => value?.target?.value ?? value;\n\nexport const BasicSettings = ({ application, command, onFieldChange }: IEcsWizardPageProps) => {\n const accounts = command.backingData.accounts || Object.keys(command.backingData.credentialsKeyedByAccount || {});\n const regions = command.backingData.filtered.regions || [];\n const clusters = command.backingData.filtered.ecsClusters || [];\n\n return (\n <div className=\"container-fluid form-horizontal\" data-test-id=\"EcsServerGroupWizard.basicSettings\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <AccountSelectInput\n aria-label=\"Account\"\n accounts={accounts}\n onChange={(value) => onFieldChange('credentials', fieldValue(value))}\n provider=\"ecs\"\n readOnly={command.viewState.readOnlyFields?.credentials}\n value={command.credentials || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Region</div>\n <div className=\"col-md-7\">\n <RegionSelectInput\n aria-label=\"Region\"\n account={command.credentials}\n onChange={(value) => onFieldChange('region', fieldValue(value))}\n readOnly={command.viewState.readOnlyFields?.region}\n regions={regions}\n value={command.region || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">ECS Cluster name</div>\n <div className=\"col-md-7\">\n <select\n aria-label=\"ECS Cluster name\"\n className=\"form-control input-sm\"\n data-test-id=\"ServerGroup.clusterName\"\n onChange={(event) => onFieldChange('ecsClusterName', event.target.value)}\n required\n value={command.ecsClusterName || ''}\n >\n <option value=\"\">Select...</option>\n {clusters.map((cluster) => (\n <option key={cluster} value={cluster}>\n {cluster}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Stack</div>\n <div className=\"col-md-7\">\n <input\n aria-label=\"Stack\"\n className=\"form-control input-sm no-spel\"\n data-test-id=\"ServerGroup.stack\"\n onChange={(event) => onFieldChange('stack', event.target.value)}\n value={command.stack || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Detail</div>\n <div className=\"col-md-7\">\n <input\n aria-label=\"Detail\"\n className=\"form-control input-sm no-spel\"\n data-test-id=\"ServerGroup.details\"\n onChange={(event) => onFieldChange('freeFormDetails', event.target.value)}\n value={command.freeFormDetails || ''}\n />\n </div>\n </div>\n {!command.viewState.disableStrategySelection && command.selectedProvider && (\n <DeploymentStrategySelector\n command={command as any}\n onFieldChange={onFieldChange}\n onStrategyChange={(_updatedCommand, strategy) => onFieldChange('strategy', strategy.key)}\n />\n )}\n {!command.viewState.hideClusterNamePreview && (\n <div className=\"well-compact well text-center\">\n Your server group will be in the cluster:{' '}\n <strong>{NameUtils.getClusterName(application.name, command.stack, command.freeFormDetails)}</strong>\n </div>\n )}\n </div>\n );\n};\n","import { isEqual, uniq, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails } from '@spinnaker/core';\nimport { AccountService, HelpField, TetheredSelect } from '@spinnaker/core';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport { normalizeEcsDockerImage } from '../../dockerImage.util';\nimport type {\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IContainerProps {\n command: IEcsServerGroupCommand;\n onFieldChange: (key: string, value: any) => void;\n configureCommand: (query: string) => Promise<void>;\n}\n\ninterface IContainerState {\n imageDescription: IEcsDockerImage;\n computeUnits: number;\n reservedMemory: number;\n dockerImages: IEcsDockerImage[];\n dockerRegistryAccounts: IAccountDetails[];\n selectedDockerAccount: string;\n targetGroupsAvailable: string[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n}\n\nexport class Container extends React.Component<IContainerProps, IContainerState> {\n constructor(props: IContainerProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n cmd.containerMappings = null;\n\n this.state = {\n imageDescription: cmd.imageDescription ? cmd.imageDescription : this.getEmptyImageDescription(),\n computeUnits: cmd.computeUnits,\n reservedMemory: cmd.reservedMemory,\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n dockerRegistryAccounts: [],\n selectedDockerAccount: cmd.imageDescription?.account ?? '',\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.targetGroups || []),\n ...cmd.targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n };\n\n this.state.targetGroupMappings.forEach((targetGroupMapping) => {\n targetGroupMapping.containerName = '';\n });\n }\n\n public componentDidMount() {\n AccountService.listAccounts('dockerRegistry').then((accounts: IAccountDetails[]) => {\n this.setState({ dockerRegistryAccounts: accounts });\n });\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: uniq([\n ...(this.props.command.backingData.filtered.targetGroups || []),\n ...this.state.targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n });\n });\n }\n\n public componentDidUpdate() {\n const cmd = this.props.command;\n const targetGroupMappings = cmd.targetGroupMappings || [];\n const nextState: IContainerState = {\n imageDescription: cmd.imageDescription || this.getEmptyImageDescription(),\n computeUnits: cmd.computeUnits,\n reservedMemory: cmd.reservedMemory,\n dockerImages: cmd.backingData?.filtered?.images || [],\n dockerRegistryAccounts: this.state.dockerRegistryAccounts,\n selectedDockerAccount: this.state.selectedDockerAccount,\n targetGroupMappings,\n targetGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.targetGroups || []),\n ...targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n };\n if (!isEqual(this.state, nextState)) {\n this.setState(nextState);\n }\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private updateDockerRegistryAccount = (newAccount: Option<string>) => {\n const account = newAccount.value;\n this.props.command.backingData.filtered.images = [];\n this.setState({ selectedDockerAccount: account, dockerImages: [] });\n DockerImageReader.findImages({ provider: 'dockerRegistry', account, count: 50 }).then((images) => {\n const ecsImages = images.map((image) => normalizeEcsDockerImage(image));\n this.props.command.backingData.filtered.images = ecsImages;\n this.setState({ dockerImages: ecsImages });\n });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingImage = (newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n\n this.props.onFieldChange('imageDescription', newImageDescription);\n this.setState({ imageDescription: newImageDescription });\n };\n\n private updateComputeUnits = (newComputeUnits: number) => {\n this.props.onFieldChange('computeUnits', newComputeUnits);\n this.setState({ computeUnits: newComputeUnits });\n };\n\n private updateReservedMemory = (newReservedMemory: number) => {\n this.props.onFieldChange('reservedMemory', newReservedMemory);\n this.setState({ reservedMemory: newReservedMemory });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n this.updateDirtyTargetGroups();\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateDirtyTargetGroups = () => {\n this.props.command.viewState.dirty.targetGroups = [];\n };\n\n public render(): React.ReactElement<Container> {\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateComputeUnits = this.updateComputeUnits;\n const updateReservedMemory = this.updateReservedMemory;\n const dirtyTagetGroups =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.targetGroups\n ? this.props.command.viewState.dirty.targetGroups\n : [];\n\n const dockerRegistryAccountOptions = this.state.dockerRegistryAccounts.map((account) => ({\n label: account.name,\n value: account.name,\n }));\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const dirtyTargetGroupList = dirtyTagetGroups\n ? dirtyTagetGroups.map(function (targetGroup: string, index: number) {\n return <li key={index}>{targetGroup}</li>;\n })\n : '';\n\n const dirtyTargetGroupSection = (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following target groups could not be found in the selected account/region/VPC and were removed:\n </p>\n <ul>{dirtyTargetGroupList}</ul>\n <br />\n <p className=\"text-left\">Please select the target group(s) from the dropdown to resolve this error.</p>\n </div>\n );\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"ContainerInputs.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td data-test-id=\"ContainerInputs.targetGroup\">\n <TetheredSelect\n inputProps={{ 'aria-label': `Target group ${index + 1}` }}\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n aria-label={`Target port ${index + 1}`}\n data-test-id=\"ContainerInputs.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <button\n aria-label={`Remove target group mapping ${index + 1}`}\n className=\"btn-link sm-label\"\n data-test-id=\"ContainerInputs.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n </div>\n </td>\n </tr>\n );\n });\n\n return (\n <div className=\"container-fluid form-horizontal\">\n {dirtyTagetGroups.length > 0 ? <div>{dirtyTargetGroupSection}</div> : ''}\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Docker Registry Account</b>\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.dockerRegistryAccount\">\n <TetheredSelect\n placeholder=\"Select a Docker registry account...\"\n options={dockerRegistryAccountOptions}\n value={this.state.selectedDockerAccount}\n onChange={(e: Option) => this.updateDockerRegistryAccount(e as Option<string>)}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Container Image</b>\n <HelpField id=\"ecs.containerMappingImage\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.containerImage\">\n <TetheredSelect\n inputProps={{ 'aria-label': 'Container image' }}\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={this.state.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(e as Option<string>);\n }}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Compute Units</b>\n <HelpField id=\"ecs.capacity.reserved.computeUnits\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n aria-label=\"Compute units\"\n data-test-id=\"ContainerInputs.computeUnits\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.computeUnits}\n onChange={(e) => updateComputeUnits(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Reserved Memory</b>\n <HelpField id=\"ecs.capacity.reserved.memory\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n aria-label=\"Reserved memory\"\n data-test-id=\"ContainerInputs.reservedMemory\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.reservedMemory}\n onChange={(e) => updateReservedMemory(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsContainerTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '80%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '20%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { IEcsWizardPageProps } from './common';\nimport { Container } from '../container/Container';\n\nexport const ContainerSettings = ({ command, configureCommand, onFieldChange }: IEcsWizardPageProps) => (\n <div data-test-id=\"EcsServerGroupWizard.container\">\n <Container command={command} configureCommand={configureCommand} onFieldChange={onFieldChange} />\n </div>\n);\n","import { isEqual } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\n\nimport { HelpField } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderStrategyItem, IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsCapacityProviderProps {\n command: IEcsServerGroupCommand;\n onFieldChange: (key: string, value: any) => void;\n configureCommand: (query: string) => Promise<void>;\n}\n\ninterface IEcsCapacityProviderState {\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n availableCapacityProviders: string[];\n ecsClusterName: string;\n useDefaultCapacityProviders: boolean;\n capacityProviderLoadedFlag: boolean;\n activeCapacityProviderIndex: number | null;\n}\n\nexport class EcsCapacityProvider extends React.Component<IEcsCapacityProviderProps, IEcsCapacityProviderState> {\n constructor(props: IEcsCapacityProviderProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n ecsClusterName: cmd.ecsClusterName,\n useDefaultCapacityProviders: cmd.useDefaultCapacityProviders !== false,\n capacityProviderStrategy:\n cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length > 0 ? cmd.capacityProviderStrategy : [],\n capacityProviderLoadedFlag: false,\n activeCapacityProviderIndex: null,\n };\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n const cmd = this.props.command;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n const capacityProviderStrategy = this.getCapacityProviderStrategy(useDefaultCapacityProviders, cmd);\n this.setState(\n {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n capacityProviderStrategy,\n capacityProviderLoadedFlag: true,\n },\n () => {\n this.props.onFieldChange('useDefaultCapacityProviders', useDefaultCapacityProviders);\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n },\n );\n });\n }\n\n public componentDidUpdate() {\n const cmd = this.props.command;\n const useDefaultCapacityProviders = cmd.useDefaultCapacityProviders !== false;\n const commandState = {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n ecsClusterName: cmd.ecsClusterName,\n useDefaultCapacityProviders,\n capacityProviderStrategy: useDefaultCapacityProviders\n ? this.getDefaultCapacityProviderStrategy(cmd)\n : cmd.capacityProviderStrategy || [],\n };\n const currentState = {\n availableCapacityProviders: this.state.availableCapacityProviders,\n defaultCapacityProviderStrategy: this.state.defaultCapacityProviderStrategy,\n ecsClusterName: this.state.ecsClusterName,\n useDefaultCapacityProviders: this.state.useDefaultCapacityProviders,\n capacityProviderStrategy: this.state.capacityProviderStrategy,\n };\n if (!isEqual(currentState, commandState)) {\n const strategyChanged = !isEqual(cmd.capacityProviderStrategy || [], commandState.capacityProviderStrategy);\n this.setState(commandState, () => {\n if (strategyChanged) {\n this.props.onFieldChange('capacityProviderStrategy', commandState.capacityProviderStrategy);\n }\n });\n }\n }\n\n private getAvailableCapacityProviders = (cmd: IEcsServerGroupCommand) => {\n const available = cmd.backingData?.filtered?.availableCapacityProviders || [];\n const persisted = (cmd.capacityProviderStrategy || []).map((strategy) => strategy.capacityProvider);\n return Array.from(new Set([...available, ...persisted])).filter(Boolean);\n };\n\n private getDefaultCapacityProviderStrategy = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : [];\n };\n\n private getCapacityProviderStrategy = (useDefaultCapacityProviders: boolean, cmd: IEcsServerGroupCommand) => {\n return useDefaultCapacityProviders &&\n cmd.backingData &&\n cmd.backingData.filtered &&\n cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : this.state.capacityProviderStrategy;\n };\n\n private addCapacityProviderStrategy = () => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.push({ capacityProvider: '', base: null, weight: null });\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private removeCapacityProviderStrategy = (index: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.splice(index, 1);\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderName = (index: number, targetCapacityProviderName: string) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.capacityProvider = targetCapacityProviderName;\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.command.viewState.dirty.customCapacityProviders = [];\n };\n\n private updateCapacityProviderBase = (index: number, targetCapacityProviderBase: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.base = targetCapacityProviderBase;\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderWeight = (index: number, targetCapacityProviderWeight: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.weight = targetCapacityProviderWeight;\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderType = (targetCapacityProviderType: boolean) => {\n this.setState({ useDefaultCapacityProviders: targetCapacityProviderType });\n this.props.onFieldChange('useDefaultCapacityProviders', targetCapacityProviderType);\n this.props.command.viewState.dirty.customCapacityProviders = [];\n\n const capacityProviderStrategy =\n targetCapacityProviderType && this.state.defaultCapacityProviderStrategy.length > 0\n ? this.state.defaultCapacityProviderStrategy\n : [];\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.onFieldChange('capacityProviderStrategy', capacityProviderStrategy);\n };\n\n render(): React.ReactElement<EcsCapacityProvider> {\n const updateCapacityProviderName = this.updateCapacityProviderName;\n const updateCapacityProviderBase = this.updateCapacityProviderBase;\n const updateCapacityProviderWeight = this.updateCapacityProviderWeight;\n const addCapacityProviderStrategy = this.addCapacityProviderStrategy;\n const removeCapacityProviderStrategy = this.removeCapacityProviderStrategy;\n const updateCapacityProviderType = this.updateCapacityProviderType;\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n const capacityProviderLoadedFlag = this.state.capacityProviderLoadedFlag;\n const customDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.customCapacityProviders\n ? this.props.command.viewState.dirty.customCapacityProviders\n : [];\n const defaultDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.defaulCapacityProviders\n ? this.props.command.viewState.dirty.defaulCapacityProviders\n : [];\n\n const capacityProviderNames =\n this.state.availableCapacityProviders && this.state.availableCapacityProviders.length > 0\n ? this.state.availableCapacityProviders.map((capacityProviderNames) => {\n return { label: `${capacityProviderNames}`, value: capacityProviderNames };\n })\n : [];\n\n const defaultCPError =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p className=\"text-left\">\n <i className=\"fa fa-exclamation-triangle\"></i>\n Invalid capacity providers are a part of default capacity provider strategy.\n <br />\n Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a\n custom strategy.\n </p>\n </div>\n ) : (\n ''\n );\n\n const dirtyCapacityProviderList = customDirtyCapacityProviders\n ? customDirtyCapacityProviders.map(function (capacityProvider: string, index: number) {\n return <li key={index}>{capacityProvider}</li>;\n })\n : '';\n\n const dirtyCapacityProviderSection =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders.length > 0 ? (\n defaultCPError\n ) : customDirtyCapacityProviders.length > 0 && !useDefaultCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following capacity providers could not be found in the selected account/region/cluster and were removed:\n </p>\n <ul>{dirtyCapacityProviderList}</ul>\n <br />\n <p className=\"text-left\">Please select the capacity provider(s) from the dropdown to resolve this error.</p>\n </div>\n ) : (\n ''\n );\n\n const capacityProviderInputs =\n capacityProviderStrategy.length > 0 ? (\n capacityProviderStrategy.map((mapping, index) => {\n return (\n <tr key={index}>\n {useDefaultCapacityProviders ? (\n <td>\n <input\n aria-label={`Capacity provider name ${index + 1}`}\n data-test-id={'ServerGroup.defaultCapacityProvider.name.' + index}\n type=\"string\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.capacityProvider}\n disabled={true}\n />\n </td>\n ) : (\n <td>\n <input\n aria-label={`Capacity provider name ${index + 1}`}\n className=\"form-control input-sm\"\n data-test-id={'ServerGroup.customCapacityProvider.name.' + index}\n onChange={(event) => {\n this.setState({ activeCapacityProviderIndex: index });\n updateCapacityProviderName(index, event.target.value);\n }}\n onFocus={() => this.setState({ activeCapacityProviderIndex: index })}\n type=\"text\"\n value={mapping.capacityProvider || ''}\n />\n {this.state.activeCapacityProviderIndex === index &&\n capacityProviderNames.map((capacityProvider) => (\n <button\n className=\"Select-option\"\n key={capacityProvider.value}\n onClick={() => {\n updateCapacityProviderName(index, capacityProvider.value);\n this.setState({ activeCapacityProviderIndex: null });\n }}\n type=\"button\"\n >\n {capacityProvider.label}\n </button>\n ))}\n </td>\n )}\n <td>\n <input\n aria-label={`Capacity provider base ${index + 1}`}\n data-test-id={'ServerGroup.capacityProvider.base.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n value={mapping.base}\n onChange={(e) => updateCapacityProviderBase(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <input\n aria-label={`Capacity provider weight ${index + 1}`}\n data-test-id={'ServerGroup.capacityProvider.weight.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.weight}\n onChange={(e) => updateCapacityProviderWeight(index, e.target.valueAsNumber)}\n />\n </td>\n {!useDefaultCapacityProviders ? (\n <td>\n <div className=\"form-control-static\">\n <button\n aria-label={`Remove capacity provider ${index + 1}`}\n className=\"btn-link sm-label\"\n onClick={() => removeCapacityProviderStrategy(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n </div>\n </td>\n ) : (\n ''\n )}\n </tr>\n );\n })\n ) : useDefaultCapacityProviders && this.state.capacityProviderStrategy.length == 0 ? (\n <tr>\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\">\n {' '}\n The cluster does not have a default capacity provider strategy defined. Set a default capacity provider\n strategy or use a custom strategy.\n </Alert>\n </div>\n </tr>\n ) : (\n ''\n );\n\n const newCapacityProviderStrategy =\n this.state.ecsClusterName &&\n this.props.command.credentials &&\n this.props.command.region &&\n !useDefaultCapacityProviders &&\n capacityProviderNames.length > 0 ? (\n <button\n data-test-id=\"ServerGroup.addCapacityProvider\"\n className=\"btn btn-block btn-sm add-new\"\n onClick={addCapacityProviderStrategy}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Capacity Provider\n </button>\n ) : !useDefaultCapacityProviders && capacityProviderLoadedFlag && capacityProviderNames.length == 0 ? (\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\"> The cluster does not have capacity providers defined. </Alert>\n </div>\n ) : (\n ''\n );\n\n return (\n <div>\n {(customDirtyCapacityProviders.length > 0 || defaultDirtyCapacityProviders.length > 0) &&\n capacityProviderLoadedFlag ? (\n <div>{dirtyCapacityProviderSection}</div>\n ) : (\n ''\n )}\n <div className=\"sm-label-left\">\n <b>Capacity Provider Strategy</b>\n <HelpField id=\"ecs.capacityProviderStrategy\" /> <br />\n <span>({this.state.ecsClusterName})</span>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.default\"\n type=\"radio\"\n checked={useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(true)}\n id=\"computeOptionsLaunchType1\"\n />\n Use cluster default\n </label>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.custom\"\n type=\"radio\"\n checked={!useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(false)}\n id=\"computeOptionsCapacityProviders2\"\n />\n Use custom (Advanced)\n </label>\n </div>\n {capacityProviderLoadedFlag ? (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th style={{ width: '50%' }}>\n Provider name\n <HelpField id=\"ecs.capacityProviderName\" />\n </th>\n <th style={{ width: '25%' }}>\n Base\n <HelpField id=\"ecs.capacityProviderBase\" />\n </th>\n <th style={{ width: '25%' }}>\n Weight\n <HelpField id=\"ecs.capacityProviderWeight\" />\n </th>\n </tr>\n </thead>\n <tbody>{capacityProviderInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newCapacityProviderStrategy}</td>\n </tr>\n </tfoot>\n </table>\n ) : (\n <div className=\"load medium\">\n <div className=\"message\">Loading capacity providers...</div>\n <div className=\"bars\">\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { HelpField } from '@spinnaker/core';\n\nimport { EcsCapacityProvider } from '../capacityProvider/CapacityProvider';\nimport type { IEcsWizardPageProps } from './common';\n\nexport const HorizontalScalingSettings = ({ command, configureCommand, onFieldChange }: IEcsWizardPageProps) => {\n const useCapacityProviders =\n command.computeOption === 'capacityProviders' ||\n (!command.computeOption && (command.capacityProviderStrategy || []).length > 0);\n const capacity = command.capacity || {};\n const updateCapacity = (field: string, value: number) => onFieldChange('capacity', { ...capacity, [field]: value });\n\n return (\n <div className=\"container-fluid form-horizontal\" data-test-id=\"EcsServerGroupWizard.horizontalScaling\">\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">\n <b>Compute options</b> <HelpField id=\"ecs.computeOptions\" />\n </div>\n <div className=\"col-md-2 radio\">\n <label>\n <input\n checked={!useCapacityProviders}\n data-test-id=\"ServerGroup.computeOptionsLaunchType\"\n id=\"computeOptionsLaunchType\"\n onChange={() => {\n onFieldChange('computeOption', 'launchType');\n onFieldChange('capacityProviderStrategy', []);\n }}\n type=\"radio\"\n />{' '}\n Launch type\n </label>\n </div>\n <div className=\"col-md-3 radio\">\n <label>\n <input\n checked={useCapacityProviders}\n data-test-id=\"ServerGroup.computeOptionsCapacityProviders\"\n id=\"computeOptionsCapacityProviders\"\n onChange={() => {\n onFieldChange('computeOption', 'capacityProviders');\n onFieldChange('launchType', '');\n }}\n type=\"radio\"\n />{' '}\n Capacity Providers\n </label>\n </div>\n </div>\n\n {useCapacityProviders ? (\n <div className=\"form-group\">\n <EcsCapacityProvider command={command} configureCommand={configureCommand} onFieldChange={onFieldChange} />\n </div>\n ) : (\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n Launch Type <HelpField id=\"ecs.launchtype\" />\n </div>\n <div className=\"col-md-3\">\n <select\n aria-label=\"Launch type\"\n className=\"form-control input-sm\"\n data-test-id=\"ServerGroup.launchType\"\n onChange={(event) => onFieldChange('launchType', event.target.value)}\n value={command.launchType || ''}\n >\n <option value=\"\">Select...</option>\n {(command.backingData.launchTypes || []).map((launchType) => (\n <option key={launchType} value={launchType}>\n {launchType}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n\n <hr />\n {[\n ['desired', 'Desired capacity', 'ecs.capacity.desired'],\n ['min', 'Minimum', 'ecs.capacity.minimum'],\n ['max', 'Maximum', 'ecs.capacity.maximum'],\n ].map(([field, label, help]) => (\n <div className=\"form-group\" key={field}>\n <div className=\"col-md-5 sm-label-right\">\n {label} <HelpField id={help} />\n </div>\n <div className=\"col-md-2\">\n <input\n aria-label={`${label === 'Minimum' || label === 'Maximum' ? `${label} capacity` : label}`}\n className=\"form-control input-sm no-spel\"\n data-test-id={`ServerGroup.capacity.${field}`}\n onChange={(event) => updateCapacity(field, event.target.valueAsNumber)}\n type=\"number\"\n value={capacity[field] ?? ''}\n />\n </div>\n </div>\n ))}\n\n <div className=\"form-group\">\n <div className=\"col-md-12 checkbox\">\n <label>\n <input\n checked={!!command.useSourceCapacity}\n data-test-id=\"ServerGroup.useSourceCapacity\"\n onChange={(event) => {\n onFieldChange('useSourceCapacity', event.target.checked);\n onFieldChange('preferSourceCapacity', event.target.checked);\n }}\n type=\"checkbox\"\n />{' '}\n <b>If available, use the previous server group's capacity</b>\n </label>{' '}\n <HelpField id=\"ecs.capacity.overwrite\" />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-12 checkbox\">\n <label>\n <input\n checked={!!command.copySourceScalingPoliciesAndActions}\n data-test-id=\"ServerGroup.copySourceScalingPoliciesAndActions\"\n onChange={(event) => onFieldChange('copySourceScalingPoliciesAndActions', event.target.checked)}\n type=\"checkbox\"\n />{' '}\n <b>If available, copy the previous server group's autoscaling policies</b>\n </label>{' '}\n <HelpField id=\"ecs.capacity.copySourceScalingPoliciesAndActions\" />\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { HelpField, MapEditor } from '@spinnaker/core';\n\nimport type { IEcsWizardPageProps } from './common';\n\nconst logDrivers = [\n 'None',\n 'awslogs',\n 'fluentd',\n 'gelf',\n 'journald',\n 'json-file',\n 'logentries',\n 'splunk',\n 'sumologic',\n 'syslog',\n];\n\nexport const LoggingSettings = ({ command, onFieldChange }: IEcsWizardPageProps) => (\n <div className=\"container-fluid form-horizontal\" data-test-id=\"EcsServerGroupWizard.logging\">\n <div className=\"form-group\">\n <div className=\"col-md-5 sm-label-right\">\n <b>Log driver (Optional)</b> <HelpField id=\"ecs.logDriver\" />\n </div>\n <div className=\"col-md-7\">\n <select\n aria-label=\"Log driver\"\n className=\"form-control input-sm\"\n data-test-id=\"Logging.logDriver\"\n onChange={(event) => onFieldChange('logDriver', event.target.value)}\n value={command.logDriver || ''}\n >\n <option value=\"\">Select...</option>\n {logDrivers.map((driver) => (\n <option key={driver} value={driver}>\n {driver}\n </option>\n ))}\n </select>\n </div>\n </div>\n {command.logDriver && command.logDriver !== 'None' ? (\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Logging options (optional)</b> <HelpField id=\"ecs.logOptions\" />\n </div>\n <MapEditor\n allowEmpty={true}\n keyLabel=\"Logging option\"\n model={command.logOptions || {}}\n onChange={(logOptions) => onFieldChange('logOptions', logOptions)}\n valueLabel=\"Logging option value\"\n />\n </div>\n ) : (\n <div className=\"form-group\">Logging options are not available for your log driver selection.</div>\n )}\n </div>\n);\n","import { isEqual, uniq, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\n\nimport type { ISubnet } from '@spinnaker/core';\nimport { HelpField, TetheredSelect } from '@spinnaker/core';\n\nimport type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsNetworkingProps {\n command: IEcsServerGroupCommand;\n onFieldChange: (key: string, value: any) => void;\n configureCommand: (query: string) => Promise<void>;\n}\n\ninterface IEcsNetworkingState {\n associatePublicIpAddress: boolean;\n networkMode: string;\n networkModesAvailable: string[];\n securityGroupNames: string[];\n securityGroupsAvailable: string[];\n subnetTypes: string[];\n subnetTypesAvailable: ISubnet[];\n}\n\nexport class EcsNetworking extends React.Component<IEcsNetworkingProps, IEcsNetworkingState> {\n constructor(props: IEcsNetworkingProps) {\n super(props);\n const cmd = this.props.command;\n\n let defaultSubnetTypes: string[] = [];\n if (cmd.subnetTypes && cmd.subnetTypes.length > 0) {\n defaultSubnetTypes = cmd.subnetTypes;\n }\n\n if (cmd.subnetType && cmd.subnetType.length > 0) {\n defaultSubnetTypes.push(cmd.subnetType);\n cmd.subnetType = '';\n }\n\n cmd.subnetTypes = uniqWith(defaultSubnetTypes, isEqual);\n\n const availableSubnetTypes = cmd.backingData?.filtered?.subnetTypes || [];\n const persistedSubnetTypes = cmd.subnetTypes\n .filter((purpose) => !availableSubnetTypes.some((subnet) => subnet.purpose === purpose))\n .map((purpose) => ({ purpose, vpcId: cmd.vpcId || 'unavailable' } as ISubnet));\n\n this.state = {\n associatePublicIpAddress: cmd.associatePublicIpAddress,\n networkMode: cmd.networkMode,\n networkModesAvailable: uniq([...(cmd.backingData?.networkModes || []), cmd.networkMode]).filter(Boolean),\n securityGroupNames: cmd.securityGroupNames,\n securityGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.securityGroupNames || []),\n ...(cmd.securityGroupNames || []),\n ]),\n subnetTypes: cmd.subnetTypes,\n subnetTypesAvailable: [...availableSubnetTypes, ...persistedSubnetTypes],\n };\n }\n\n public componentDidMount() {\n const cmd = this.props.command;\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n networkModesAvailable: uniq([...(cmd.backingData?.networkModes || []), cmd.networkMode]).filter(Boolean),\n securityGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.securityGroupNames || []),\n ...(cmd.securityGroupNames || []),\n ]),\n subnetTypesAvailable: [\n ...(cmd.backingData?.filtered?.subnetTypes || []),\n ...(cmd.subnetTypes || [])\n .filter(\n (purpose) => !(cmd.backingData?.filtered?.subnetTypes || []).some((subnet) => subnet.purpose === purpose),\n )\n .map((purpose) => ({ purpose, vpcId: cmd.vpcId || 'unavailable' } as ISubnet)),\n ],\n });\n });\n }\n\n public componentDidUpdate() {\n const cmd = this.props.command;\n const availableSubnetTypes = cmd.backingData?.filtered?.subnetTypes || [];\n const nextState: IEcsNetworkingState = {\n associatePublicIpAddress: cmd.associatePublicIpAddress,\n networkMode: cmd.networkMode,\n networkModesAvailable: uniq([...(cmd.backingData?.networkModes || []), cmd.networkMode]).filter(Boolean),\n securityGroupNames: cmd.securityGroupNames || [],\n securityGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.securityGroupNames || []),\n ...(cmd.securityGroupNames || []),\n ]),\n subnetTypes: cmd.subnetTypes || [],\n subnetTypesAvailable: [\n ...availableSubnetTypes,\n ...(cmd.subnetTypes || [])\n .filter((purpose) => !availableSubnetTypes.some((subnet) => subnet.purpose === purpose))\n .map((purpose) => ({ purpose, vpcId: cmd.vpcId || 'unavailable' } as ISubnet)),\n ],\n };\n if (!isEqual(this.state, nextState)) {\n this.setState(nextState);\n }\n }\n\n private updateNetworkMode = (newNetworkMode: Option<string>) => {\n const updatedNetworkMode = newNetworkMode.value;\n const cmd = this.props.command;\n this.props.onFieldChange('networkMode', updatedNetworkMode);\n this.setState({\n networkMode: updatedNetworkMode,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n };\n\n private updateSecurityGroups = (newSecurityGroups: Option<string>) => {\n const updatedSecurityGroups = Array.isArray(newSecurityGroups)\n ? newSecurityGroups.map((securityGroups) => securityGroups.value)\n : [];\n this.props.onFieldChange('securityGroupNames', updatedSecurityGroups);\n this.setState({ securityGroupNames: updatedSecurityGroups });\n };\n\n private updateSubnetTypes = (newSubnetTypes: Option<string>) => {\n const cmd = this.props.command;\n const updatedSubnetTypes = Array.isArray(newSubnetTypes)\n ? newSubnetTypes.map((subnetType) => subnetType.value)\n : [];\n this.props.onFieldChange('subnetTypes', updatedSubnetTypes);\n cmd.subnetTypeChanged(cmd);\n this.setState({\n subnetTypes: updatedSubnetTypes,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n });\n };\n\n private updateAssociatePublicIpAddress = (usePublicIp: boolean) => {\n this.props.onFieldChange('associatePublicIpAddress', usePublicIp);\n this.setState({ associatePublicIpAddress: usePublicIp });\n };\n\n public render(): React.ReactElement<EcsNetworking> {\n const updateAssociatePublicIpAddress = this.updateAssociatePublicIpAddress;\n const updateNetworkMode = this.updateNetworkMode;\n const updateSecurityGroups = this.updateSecurityGroups;\n const updateSubnetTypes = this.updateSubnetTypes;\n\n const networkModesAvailable = this.state.networkModesAvailable.map(function (networkMode) {\n return { label: `${networkMode}`, value: networkMode };\n });\n\n const securityGroupsAvailable = this.state.securityGroupsAvailable.map(function (securityGroup) {\n return { label: `${securityGroup}`, value: securityGroup };\n });\n\n const subnetTypesAvailable = this.state.subnetTypesAvailable.map(function (subnetType) {\n return { label: `${subnetType.purpose} (${subnetType.vpcId})`, value: subnetType.purpose };\n });\n\n const subnetTypeOptions = this.state.subnetTypesAvailable.length ? (\n <TetheredSelect\n inputProps={{ 'aria-label': 'VPC subnet' }}\n multi={true}\n options={subnetTypesAvailable}\n value={this.state.subnetTypes}\n onChange={(e: Option) => {\n updateSubnetTypes(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No account was selected, or no subnet types are available for this account</Alert>\n );\n\n const securityGroupsOptions = this.state.securityGroupsAvailable.length ? (\n <TetheredSelect\n inputProps={{ 'aria-label': 'Security groups' }}\n multi={true}\n options={securityGroupsAvailable}\n value={this.state.securityGroupNames}\n onChange={(e: Option) => {\n updateSecurityGroups(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No security groups found in the selected account/region</Alert>\n );\n\n const awsVpcOptions =\n this.state.networkMode === 'awsvpc' ? (\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>VPC Subnet</b>\n <HelpField key=\"ecs.subnet\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.subnetType\">\n {subnetTypeOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Security Groups</b>\n <HelpField key=\"ecs.securityGroups\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.securityGroups\">\n {securityGroupsOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Associate Public IP Address</b>\n <HelpField key=\"ecs.publicip\" />\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressTrue\"\n type=\"radio\"\n value=\"true\"\n id=\"associatePublicIpAddressTrue\"\n checked={this.state.associatePublicIpAddress === true}\n onChange={() => updateAssociatePublicIpAddress(true)}\n />\n Yes\n </label>\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressFalse\"\n type=\"radio\"\n value=\"false\"\n id=\"associatePublicIpAddressFalse\"\n checked={this.state.associatePublicIpAddress === false}\n onChange={() => updateAssociatePublicIpAddress(false)}\n />\n No\n </label>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"col-md-3 sm-label-right\"></div>\n );\n\n return (\n <div className=\"networking-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Network Mode</b>\n <HelpField id=\"ecs.networkMode\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.networkMode\">\n <TetheredSelect\n inputProps={{ 'aria-label': 'Network mode' }}\n placeholder=\"Select a network mode to use ...\"\n options={networkModesAvailable}\n value={this.state.networkMode}\n onChange={(e: Option) => {\n updateNetworkMode(e as Option<string>);\n }}\n />\n </div>\n </div>\n </div>\n {awsVpcOptions}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { IEcsWizardPageProps } from './common';\nimport { EcsNetworking } from '../networking/Networking';\n\nexport const NetworkingSettings = ({ command, configureCommand, onFieldChange }: IEcsWizardPageProps) => (\n <div data-test-id=\"EcsServerGroupWizard.networking\">\n <EcsNetworking command={command} configureCommand={configureCommand} onFieldChange={onFieldChange} />\n </div>\n);\n","import { isEqual } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\n\nimport { HelpField, TetheredSelect } from '@spinnaker/core';\n\nimport type {\n IEcsServerGroupCommand,\n IEcsServiceDiscoveryRegistryAssociation,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IServiceDiscoveryProps {\n command: IEcsServerGroupCommand;\n onFieldChange: (key: string, value: any) => void;\n configureCommand: (query: string) => Promise<void>;\n}\n\nexport interface IEcsServiceDiscoveryRegistry {\n account: string;\n region: string;\n name: string;\n id: string;\n arn: string;\n displayName: string;\n}\n\ninterface IServiceDiscoveryState {\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n serviceDiscoveryRegistriesAvailable: IEcsServiceDiscoveryRegistry[];\n useTaskDefinitionArtifact: boolean;\n}\n\nexport class ServiceDiscovery extends React.Component<IServiceDiscoveryProps, IServiceDiscoveryState> {\n constructor(props: IServiceDiscoveryProps) {\n super(props);\n const cmd = this.props.command;\n\n const serviceDiscoveryAssociations = this.normalizeContainerNames(\n cmd.serviceDiscoveryAssociations || [],\n cmd.useTaskDefinitionArtifact,\n );\n cmd.serviceDiscoveryAssociations = serviceDiscoveryAssociations;\n this.state = {\n serviceDiscoveryAssociations,\n serviceDiscoveryRegistriesAvailable: this.mergeRegistries(\n cmd.backingData?.filtered?.serviceDiscoveryRegistries || [],\n serviceDiscoveryAssociations,\n ),\n useTaskDefinitionArtifact: cmd.useTaskDefinitionArtifact,\n };\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n serviceDiscoveryRegistriesAvailable: this.mergeRegistries(\n this.props.command.backingData.filtered.serviceDiscoveryRegistries || [],\n this.state.serviceDiscoveryAssociations,\n ),\n });\n });\n }\n\n public componentDidUpdate() {\n const cmd = this.props.command;\n const currentAssociations = cmd.serviceDiscoveryAssociations || [];\n const serviceDiscoveryAssociations = this.normalizeContainerNames(\n currentAssociations,\n cmd.useTaskDefinitionArtifact,\n );\n if (!isEqual(currentAssociations, serviceDiscoveryAssociations)) {\n cmd.serviceDiscoveryAssociations = serviceDiscoveryAssociations;\n this.props.onFieldChange('serviceDiscoveryAssociations', serviceDiscoveryAssociations);\n }\n const nextState: IServiceDiscoveryState = {\n serviceDiscoveryAssociations,\n serviceDiscoveryRegistriesAvailable: this.mergeRegistries(\n cmd.backingData?.filtered?.serviceDiscoveryRegistries || [],\n serviceDiscoveryAssociations,\n ),\n useTaskDefinitionArtifact: cmd.useTaskDefinitionArtifact,\n };\n if (!isEqual(this.state, nextState)) {\n this.setState(nextState);\n }\n }\n\n private normalizeContainerNames = (\n associations: IEcsServiceDiscoveryRegistryAssociation[],\n useTaskDefinitionArtifact: boolean,\n ): IEcsServiceDiscoveryRegistryAssociation[] => {\n const normalized = associations.map((association) => ({\n ...association,\n containerName: useTaskDefinitionArtifact ? association.containerName || '' : null,\n }));\n return isEqual(associations, normalized) ? associations : normalized;\n };\n\n private getNameToRegistryMap = (): Map<string, IEcsServiceDiscoveryRegistry> => {\n const displayNameToRegistry = new Map<string, IEcsServiceDiscoveryRegistry>();\n this.state.serviceDiscoveryRegistriesAvailable.forEach((e) => {\n displayNameToRegistry.set(e.displayName, e);\n });\n\n return displayNameToRegistry;\n };\n\n private mergeRegistries = (\n available: IEcsServiceDiscoveryRegistry[],\n associations: IEcsServiceDiscoveryRegistryAssociation[],\n ): IEcsServiceDiscoveryRegistry[] => {\n const registries = new Map<string, IEcsServiceDiscoveryRegistry>();\n [...available, ...associations.map((association) => association.registry)].filter(Boolean).forEach((registry) => {\n registries.set(registry.displayName, registry as IEcsServiceDiscoveryRegistry);\n });\n return Array.from(registries.values());\n };\n\n private getEmptyRegistry = (): IEcsServiceDiscoveryRegistry => {\n return {\n account: '',\n region: '',\n name: '',\n id: '',\n arn: '',\n displayName: '',\n };\n };\n\n private updateServiceDiscoveryRegistry = (index: number, newRegistry: Option<string>) => {\n const registryMap = this.getNameToRegistryMap();\n let newServiceDiscoveryRegistry = registryMap.get(newRegistry.value);\n\n if (!newServiceDiscoveryRegistry) {\n newServiceDiscoveryRegistry = this.getEmptyRegistry();\n }\n\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociation = currentAssociations[index];\n targetAssociation.registry = newServiceDiscoveryRegistry;\n this.props.onFieldChange('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryPort = (index: number, targetPort: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerPort = targetPort;\n this.props.onFieldChange('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryContainerName = (index: number, targetContainerName: string) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerName = targetContainerName;\n this.props.onFieldChange('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private pushServiceDiscoveryAssociation = () => {\n const registryAssociations = this.state.serviceDiscoveryAssociations;\n registryAssociations.push({ registry: this.getEmptyRegistry(), containerPort: 80, containerName: '' });\n this.setState({ serviceDiscoveryAssociations: registryAssociations });\n };\n\n private removeServiceDiscoveryAssociations = (index: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n currentAssociations.splice(index, 1);\n this.props.onFieldChange('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n public render(): React.ReactElement<ServiceDiscovery> {\n const removeServiceDiscoveryAssociation = this.removeServiceDiscoveryAssociations;\n const updateServiceDiscoveryRegistry = this.updateServiceDiscoveryRegistry;\n const updateServiceDiscoveryPort = this.updateServiceDiscoveryPort;\n const updateServiceDiscoveryContainerName = this.updateServiceDiscoveryContainerName;\n\n const registriesAvailable = this.state.serviceDiscoveryRegistriesAvailable.map(function (registry) {\n return { label: `${registry.displayName}`, value: registry.displayName };\n });\n\n const useTaskDefinitionArtifact = this.state.useTaskDefinitionArtifact;\n const serviceDiscoveryInputs = this.state.serviceDiscoveryAssociations.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useTaskDefinitionArtifact && (\n <td>\n <input\n aria-label={`Container name ${index + 1}`}\n className=\"form-control input-sm\"\n data-test-id=\"ServiceDiscovery.containerName\"\n placeholder=\"Enter a container name ...\"\n required={true}\n value={mapping.containerName}\n onChange={(e) => updateServiceDiscoveryContainerName(index, e.target.value)}\n />\n </td>\n )}\n <td data-test-id=\"ServiceDiscovery.registry\">\n <TetheredSelect\n inputProps={{ 'aria-label': `Service registry ${index + 1}` }}\n placeholder=\"Select a registry...\"\n options={registriesAvailable}\n value={mapping.registry.displayName.toString()}\n onChange={(e: Option) => updateServiceDiscoveryRegistry(index, e as Option<string>)}\n clearable={false}\n required={true}\n />\n </td>\n <td>\n <input\n aria-label={`Container port ${index + 1}`}\n data-test-id=\"ServiceDiscovery.containerPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort}\n onChange={(e) => updateServiceDiscoveryPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <button\n aria-label={`Remove service registry ${index + 1}`}\n className=\"btn-link sm-label\"\n onClick={() => removeServiceDiscoveryAssociation(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n </div>\n </td>\n </tr>\n );\n });\n\n const newServiceDiscoveryAssociation = this.state.serviceDiscoveryRegistriesAvailable.length ? (\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.pushServiceDiscoveryAssociation} type=\"button\">\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Service Registry\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No registries found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Service Registries (optional)</b>\n <HelpField id=\"ecs.serviceDiscovery\" />\n </div>\n <form name=\"ecsServiceDiscoveryRegistryMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n {useTaskDefinitionArtifact && (\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.serviceDiscoveryContainerName\" />\n </th>\n )}\n {useTaskDefinitionArtifact ? (\n <th style={{ width: '55%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n ) : (\n <th style={{ width: '80%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n )}\n <th style={{ width: '15%' }}>\n Port\n <HelpField id=\"ecs.serviceDiscoveryContainerPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{serviceDiscoveryInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newServiceDiscoveryAssociation}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { IEcsWizardPageProps } from './common';\nimport { ServiceDiscovery } from '../serviceDiscovery/ServiceDiscovery';\n\nexport const ServiceDiscoverySettings = ({ command, configureCommand, onFieldChange }: IEcsWizardPageProps) => (\n <div data-test-id=\"EcsServerGroupWizard.serviceDiscovery\">\n <ServiceDiscovery command={command} configureCommand={configureCommand} onFieldChange={onFieldChange} />\n </div>\n);\n","import { isEqual, uniq, uniqWith } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact } from '@spinnaker/core';\nimport {\n AccountService,\n ArtifactTypePatterns,\n CheckboxInput,\n HelpField,\n StageArtifactSelectorDelegate,\n StageConfigField,\n TetheredSelect,\n} from '@spinnaker/core';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport { normalizeEcsDockerImage } from '../../dockerImage.util';\nimport type {\n IEcsContainerMapping,\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n IEcsTaskDefinitionArtifact,\n} from '../../serverGroupConfiguration.service';\n\nexport interface ITaskDefinitionProps {\n command: IEcsServerGroupCommand;\n onFieldChange: (key: string, value: any) => void;\n configureCommand: (query: string) => Promise<void>;\n}\n\ninterface ITaskDefinitionState {\n taskDefArtifact: IEcsTaskDefinitionArtifact;\n taskDefArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n dockerImages: IEcsDockerImage[];\n dockerRegistryAccounts: IAccountDetails[];\n selectedDockerAccount: string;\n targetGroupsAvailable: string[];\n loadBalancedContainer: string;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n}\n\nexport class TaskDefinition extends React.Component<ITaskDefinitionProps, ITaskDefinitionState> {\n constructor(props: ITaskDefinitionProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n\n this.state = {\n taskDefArtifact: cmd.taskDefinitionArtifact,\n containerMappings: cmd.containerMappings ? cmd.containerMappings : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.targetGroups || []),\n ...cmd.targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n dockerRegistryAccounts: [],\n selectedDockerAccount: cmd.imageDescription?.account ?? '',\n loadBalancedContainer: cmd.loadBalancedContainer || defaultContainer,\n taskDefArtifactAccount: cmd.taskDefinitionArtifactAccount,\n evaluateTaskDefinitionArtifactExpressions: cmd.evaluateTaskDefinitionArtifactExpressions,\n };\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n public componentDidMount() {\n AccountService.listAccounts('dockerRegistry').then((accounts: IAccountDetails[]) => {\n this.setState({ dockerRegistryAccounts: accounts });\n });\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: uniq([\n ...(this.props.command.backingData.filtered.targetGroups || []),\n ...this.state.targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n });\n });\n }\n\n private updateDockerRegistryAccount = (newAccount: Option<string>) => {\n const account = newAccount.value;\n this.props.command.backingData.filtered.images = [];\n this.setState({ selectedDockerAccount: account, dockerImages: [] });\n DockerImageReader.findImages({ provider: 'dockerRegistry', account, count: 50 }).then((images) => {\n const ecsImages = images.map((image) => normalizeEcsDockerImage(image));\n this.props.command.backingData.filtered.images = ecsImages;\n this.setState({ dockerImages: ecsImages });\n });\n };\n\n public componentDidUpdate() {\n const cmd = this.props.command;\n const containerMappings = cmd.containerMappings || [];\n const targetGroupMappings = cmd.targetGroupMappings || [];\n const nextState: ITaskDefinitionState = {\n taskDefArtifact: cmd.taskDefinitionArtifact,\n taskDefArtifactAccount: cmd.taskDefinitionArtifactAccount,\n containerMappings,\n targetGroupMappings,\n dockerImages: cmd.backingData?.filtered?.images || [],\n targetGroupsAvailable: uniq([\n ...(cmd.backingData?.filtered?.targetGroups || []),\n ...targetGroupMappings.map((mapping) => mapping.targetGroup).filter(Boolean),\n ]),\n loadBalancedContainer: cmd.loadBalancedContainer || containerMappings[0]?.containerName || '',\n evaluateTaskDefinitionArtifactExpressions: cmd.evaluateTaskDefinitionArtifactExpressions,\n dockerRegistryAccounts: this.state.dockerRegistryAccounts,\n selectedDockerAccount: this.state.selectedDockerAccount,\n };\n if (!isEqual(this.state, nextState)) {\n this.setState(nextState);\n }\n }\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private excludedArtifactTypePatterns = [\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ];\n\n private onExpectedArtifactSelected = (expectedArtifactId: string): void => {\n const selectedArtifact = { artifactId: expectedArtifactId };\n this.props.onFieldChange('taskDefinitionArtifact', selectedArtifact);\n this.setState({ taskDefArtifact: selectedArtifact });\n };\n\n private onArtifactEdited = (artifact: IArtifact): void => {\n const newArtifact = { artifact: artifact };\n this.props.onFieldChange('taskDefinitionArtifact', newArtifact);\n this.setState({ taskDefArtifact: newArtifact });\n };\n\n private pushMapping = () => {\n const conMaps = this.state.containerMappings;\n conMaps.push({ containerName: '', imageDescription: this.getEmptyImageDescription() });\n this.setState({ containerMappings: conMaps });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingName = (index: number, newName: string) => {\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = newName;\n this.props.onFieldChange('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateContainerMappingImage = (index: number, newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.imageDescription = newImageDescription;\n this.props.onFieldChange('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingContainer = (index: number, targetContainer: string) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = targetContainer;\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeMapping = (index: number) => {\n const currentMappings = this.state.containerMappings;\n currentMappings.splice(index, 1);\n this.props.onFieldChange('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.onFieldChange('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateEvaluateTaskDefArtifactFlag = () => {\n this.props.onFieldChange(\n 'evaluateTaskDefinitionArtifactExpressions',\n !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n );\n this.setState({\n evaluateTaskDefinitionArtifactExpressions: !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n });\n };\n\n public render(): React.ReactElement<TaskDefinition> {\n const { command } = this.props;\n const removeMapping = this.removeMapping;\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingName = this.updateContainerMappingName;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingContainer = this.updateTargetGroupMappingContainer;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateEvaluateTaskDefArtifactFlag = this.updateEvaluateTaskDefArtifactFlag;\n\n const dockerRegistryAccountOptions = this.state.dockerRegistryAccounts.map((account) => ({\n label: account.name,\n value: account.name,\n }));\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const mappingInputs = this.state.containerMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n aria-label={`Container name ${index + 1}`}\n data-test-id=\"Artifacts.containerName\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"enter container name...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateContainerMappingName(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.containerImage\">\n <TetheredSelect\n inputProps={{ 'aria-label': `Container image ${index + 1}` }}\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={mapping.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(index, e as Option<string>);\n }}\n clearable={false}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <button\n aria-label={`Remove container mapping ${index + 1}`}\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.containerRemove\"\n onClick={() => removeMapping(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n </div>\n </td>\n </tr>\n );\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n aria-label={`Target group container name ${index + 1}`}\n data-test-id=\"Artifacts.targetGroupContainer\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"Enter a container name ...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateTargetGroupMappingContainer(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.targetGroup\">\n <TetheredSelect\n inputProps={{ 'aria-label': `Target group ${index + 1}` }}\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n aria-label={`Target port ${index + 1}`}\n data-test-id=\"Artifacts.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <button\n aria-label={`Remove target group mapping ${index + 1}`}\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n </div>\n </td>\n </tr>\n );\n });\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-12\">\n <StageArtifactSelectorDelegate\n artifact={this.state.taskDefArtifact.artifact}\n excludedArtifactTypePatterns={this.excludedArtifactTypePatterns}\n expectedArtifactId={this.state.taskDefArtifact.artifactId}\n label=\"Artifact\"\n helpKey=\"ecs.taskDefinitionArtifact\"\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onExpectedArtifactSelected(artifact.id)}\n onArtifactEdited={this.onArtifactEdited}\n pipeline={command.viewState.pipeline}\n stage={command.viewState.currentStage}\n />\n </div>\n </div>\n\n <StageConfigField\n groupClassName=\"form-group evaluateTaskDef\"\n label=\"Expression Evaluation\"\n helpKey=\"ecs.evaluateExpression\"\n labelColumns={5}\n fieldColumns={7}\n >\n <CheckboxInput\n checked={command.evaluateTaskDefinitionArtifactExpressions === true}\n onChange={() => {\n updateEvaluateTaskDefArtifactFlag();\n }}\n text=\"Evaluate SpEL expressions in artifact\"\n />\n </StageConfigField>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Docker Registry Account</b>\n </div>\n <div className=\"col-md-9\" data-test-id=\"Artifacts.dockerRegistryAccount\">\n <TetheredSelect\n placeholder=\"Select a Docker registry account...\"\n options={dockerRegistryAccountOptions}\n value={this.state.selectedDockerAccount}\n onChange={(e: Option) => this.updateDockerRegistryAccount(e as Option<string>)}\n clearable={false}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Container Mappings</b>\n <HelpField id=\"ecs.containerMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionContainerMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.containerMappingName\" />\n </th>\n <th style={{ width: '70%' }}>\n Container image\n <HelpField id=\"ecs.containerMappingImage\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{mappingInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={3}>\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.containerAdd\"\n onClick={this.pushMapping}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Container Mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.loadBalancedContainer\" />\n </th>\n <th style={{ width: '55%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '15%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { HelpField } from '@spinnaker/core';\n\nimport type { IEcsWizardPageProps } from './common';\nimport { TaskDefinition } from '../taskDefinition/TaskDefinition';\n\nexport const TaskDefinitionSettings = ({ command, configureCommand, onFieldChange }: IEcsWizardPageProps) => (\n <div className=\"clearfix\" data-test-id=\"EcsServerGroupWizard.taskDefinition\">\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">\n <b>Task Definition source</b> <HelpField id=\"ecs.taskDefinition\" />\n </div>\n <div className=\"col-md-2 radio\">\n <label>\n <input\n checked={!command.useTaskDefinitionArtifact}\n data-test-id=\"ServerGroup.useInputs\"\n id=\"taskDefinitionSourceInputs\"\n onChange={() => onFieldChange('useTaskDefinitionArtifact', false)}\n type=\"radio\"\n />{' '}\n Inputs\n </label>\n </div>\n <div className=\"col-md-2 radio\">\n <label>\n <input\n checked={command.useTaskDefinitionArtifact}\n data-test-id=\"ServerGroup.useArtifacts\"\n disabled={command.viewState.mode === 'create'}\n id=\"taskDefinitionSourceArtifact\"\n onChange={() => onFieldChange('useTaskDefinitionArtifact', true)}\n type=\"radio\"\n />{' '}\n Artifact\n </label>\n </div>\n </div>\n {command.viewState.mode === 'create' && (\n <div className=\"color-text-caption\">\n <hr />\n <em>Artifacts not supported outside of pipelines.</em>\n </div>\n )}\n </div>\n </div>\n {command.useTaskDefinitionArtifact && (\n <div className=\"col-md-12\">\n <hr />\n <TaskDefinition command={command} configureCommand={configureCommand} onFieldChange={onFieldChange} />\n </div>\n )}\n </div>\n </div>\n);\n","import React from 'react';\n\nimport type { IWizardPageComponent } from '@spinnaker/core';\n\nimport type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\ntype ValidationErrors = { [key: string]: any };\ntype Validator = (values: IEcsServerGroupCommand) => ValidationErrors;\n\nconst required = (value: any): boolean => value !== undefined && value !== null && value !== '';\nconst validInteger = (value: any): boolean => Number.isFinite(value) && Number.isInteger(value) && value >= 0;\nconst usableCapacityProviderStrategyItem = (item: any): boolean =>\n required(item?.capacityProvider) && validInteger(item?.base) && validInteger(item?.weight);\nconst hasRowErrors = (errors: ValidationErrors[]): boolean => errors.some((error) => Object.keys(error).length > 0);\nconst isExpressionLanguage = (value: string): boolean => value?.includes('${');\nconst isStackPattern = (value = ''): boolean =>\n isExpressionLanguage(value) || /^([a-zA-Z_0-9._${}]*(\\${.+})*)*$/.test(value);\nconst isDetailPattern = (value = ''): boolean =>\n isExpressionLanguage(value) || /^([a-zA-Z_0-9._${}-]*(\\${.+})*)*$/.test(value);\n\nconst validateTargetGroupMappings = (values: IEcsServerGroupCommand): ValidationErrors => {\n const targetGroupMappings = (values.targetGroupMappings || []).map((mapping) => {\n const errors: ValidationErrors = {};\n if (values.useTaskDefinitionArtifact && !required(mapping.containerName)) {\n errors.containerName = 'Container name is required.';\n }\n if (!required(mapping.targetGroup)) {\n errors.targetGroup = 'Target group is required.';\n }\n if (!validInteger(mapping.containerPort)) {\n errors.containerPort = 'Container port must be a non-negative integer.';\n }\n return errors;\n });\n return hasRowErrors(targetGroupMappings) ? { targetGroupMappings } : {};\n};\n\nexport const validateEcsBasicSettings: Validator = (values) => {\n const errors: ValidationErrors = {};\n if (!required(values.credentials)) {\n errors.credentials = 'Account is required.';\n }\n if (!required(values.region)) {\n errors.region = 'Region is required.';\n }\n if (!required(values.ecsClusterName)) {\n errors.ecsClusterName = 'ECS cluster is required.';\n }\n if (!isStackPattern(values.stack)) {\n errors.stack = 'Only dot(.) and underscore(_) special characters are allowed in the Stack field.';\n }\n if (!isDetailPattern(values.freeFormDetails)) {\n errors.freeFormDetails =\n 'Only dot(.), underscore(_), and dash(-) special characters are allowed in the Detail field.';\n }\n return errors;\n};\n\nexport const validateEcsTaskDefinition: Validator = (values) => {\n if (!values.useTaskDefinitionArtifact) {\n return {};\n }\n const errors: ValidationErrors = validateTargetGroupMappings(values);\n if (!values.taskDefinitionArtifact?.artifact && !values.taskDefinitionArtifact?.artifactId) {\n errors.taskDefinitionArtifact = 'Task definition artifact is required.';\n }\n const containerMappings = (values.containerMappings || []).map((mapping) => {\n const mappingErrors: ValidationErrors = {};\n if (!required(mapping.containerName)) {\n mappingErrors.containerName = 'Container name is required.';\n }\n if (!required(mapping.imageDescription?.imageId)) {\n mappingErrors.imageDescription = 'Container image is required.';\n }\n return mappingErrors;\n });\n if (hasRowErrors(containerMappings)) {\n errors.containerMappings = containerMappings;\n }\n return errors;\n};\n\nexport const validateEcsContainer: Validator = (values) => {\n if (values.useTaskDefinitionArtifact) {\n return {};\n }\n const errors: ValidationErrors = validateTargetGroupMappings(values);\n if (!required(values.imageDescription?.imageId)) {\n errors.imageDescription = { imageId: 'Container image is required.' };\n }\n return errors;\n};\n\nexport const validateEcsServiceDiscovery: Validator = (values) => {\n const serviceDiscoveryAssociations = (values.serviceDiscoveryAssociations || []).map((association) => {\n const errors: ValidationErrors = {};\n if (values.useTaskDefinitionArtifact && !required(association.containerName)) {\n errors.containerName = 'Container name is required.';\n }\n if (!required(association.registry?.id) && !required(association.registry?.displayName)) {\n errors.registry = 'Service registry is required.';\n }\n if (!validInteger(association.containerPort)) {\n errors.containerPort = 'Container port must be a non-negative integer.';\n }\n return errors;\n });\n return hasRowErrors(serviceDiscoveryAssociations) ? { serviceDiscoveryAssociations } : {};\n};\n\nexport const validateEcsCapacity: Validator = (values) => {\n const capacity = values.capacity || {};\n const useCapacityProviders =\n values.computeOption === 'capacityProviders' ||\n (!values.computeOption && (values.capacityProviderStrategy || []).length > 0);\n const validationErrors: ValidationErrors = {};\n const errors: ValidationErrors = {};\n ['min', 'desired', 'max'].forEach((field) => {\n if (!validInteger(capacity[field])) {\n errors[field] = 'Capacity must be a non-negative integer.';\n }\n });\n if (Object.keys(errors).length === 0) {\n if (capacity.min > capacity.max) {\n errors.min = 'Minimum capacity cannot exceed maximum capacity.';\n }\n if (capacity.desired < capacity.min || capacity.desired > capacity.max) {\n errors.desired = 'Desired capacity must be between minimum and maximum capacity.';\n }\n }\n if (!useCapacityProviders && !required(values.launchType)) {\n validationErrors.launchType = 'Launch type is required.';\n }\n if (useCapacityProviders && values.useDefaultCapacityProviders !== false) {\n const defaultStrategy = values.backingData?.filtered?.defaultCapacityProviderStrategy || [];\n if (!defaultStrategy.length || !defaultStrategy.every(usableCapacityProviderStrategyItem)) {\n validationErrors.capacityProviderStrategy = 'A usable default capacity provider strategy is required.';\n }\n }\n if (useCapacityProviders && values.useDefaultCapacityProviders === false) {\n const strategy = values.capacityProviderStrategy || [];\n if (!strategy.length) {\n validationErrors.capacityProviderStrategy = 'At least one capacity provider is required.';\n } else {\n const strategyErrors = strategy.map((item) => {\n const itemErrors: ValidationErrors = {};\n if (!required(item.capacityProvider)) {\n itemErrors.capacityProvider = 'Capacity provider is required.';\n }\n if (!validInteger(item.base)) {\n itemErrors.base = 'Base must be a non-negative integer.';\n }\n if (!validInteger(item.weight)) {\n itemErrors.weight = 'Weight must be a non-negative integer.';\n }\n return itemErrors;\n });\n if (hasRowErrors(strategyErrors)) {\n validationErrors.capacityProviderStrategy = strategyErrors;\n }\n }\n }\n if (Object.keys(errors).length) {\n validationErrors.capacity = errors;\n }\n return validationErrors;\n};\n\nexport const validateEcsServerGroup: Validator = (values) => ({\n ...validateEcsBasicSettings(values),\n ...validateEcsTaskDefinition(values),\n ...validateEcsContainer(values),\n ...validateEcsServiceDiscovery(values),\n ...validateEcsCapacity(values),\n});\n\ninterface IEcsWizardPageValidationProps {\n children: React.ReactElement;\n validator: Validator;\n}\n\nexport class EcsWizardPageValidation\n extends React.Component<IEcsWizardPageValidationProps>\n implements IWizardPageComponent<IEcsServerGroupCommand> {\n public validate = (values: IEcsServerGroupCommand) => this.props.validator(values);\n\n public render() {\n return React.Children.only(this.props.children);\n }\n}\n","import type { IPlacementStrategy } from './IPlacementStrategy';\n\nexport class PlacementStrategyService {\n public getPredefinedStrategy(strategyName: string): IPlacementStrategy[] {\n if (strategyName === 'AZ Balanced Spread') {\n return this.getAzBalancedSpreadStrategy();\n } else if (strategyName === 'AZ Balanced BinPack' || strategyName === 'AZ Balanced BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getAzBalancedMemoryBinPackStrategy();\n } else if (strategyName === 'BinPack' || strategyName === 'BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getBinPackMemoryStrategy();\n } else if (strategyName === 'AZ Balanced BinPack CPU') {\n return this.getAzBalancedCpuBinPackStrategy();\n } else if (strategyName === 'BinPack CPU') {\n return this.getBinPackCpuStrategy();\n } else if (strategyName === 'One Task Per Host') {\n return this.getOneTaskPerHostStrategy();\n } else {\n // TODO: Add support for custom placement strategy.\n return [];\n }\n }\n\n public getAzBalancedSpreadStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'spread', field: 'instanceId' },\n ];\n }\n\n public getAzBalancedMemoryBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'memory' },\n ];\n }\n\n public getBinPackMemoryStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'memory' }];\n }\n\n public getAzBalancedCpuBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'cpu' },\n ];\n }\n\n public getBinPackCpuStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'cpu' }];\n }\n\n public getOneTaskPerHostStrategy(): IPlacementStrategy[] {\n return [{ type: 'spread', field: 'instanceId' }];\n }\n}\n","import { REST } from '@spinnaker/core';\nimport type { ISecretDescriptor } from './ISecret';\n\nexport class SecretReader {\n public listSecrets(): Promise<ISecretDescriptor[]> {\n return REST('/ecs/secrets').get();\n }\n}\n","import { REST } from '@spinnaker/core';\nimport type { IServiceDiscoveryRegistryDescriptor } from './IServiceDiscovery';\n\nexport class ServiceDiscoveryReader {\n public static listServiceDiscoveryRegistries(): Promise<IServiceDiscoveryRegistryDescriptor[]> {\n return REST('/ecs/serviceDiscoveryRegistries').get();\n }\n}\n","import { get, uniq, uniqBy } from 'lodash';\nimport React from 'react';\n\nimport type {\n Application,\n DeckRuntimeServices,\n IModalComponentProps,\n IRouterInjectedProps,\n ISubnet,\n IWizardPageInjectedProps,\n} from '@spinnaker/core';\nimport {\n AccountService,\n DeckRuntimeContext,\n DeployInitializer,\n NameUtils,\n noop,\n ReactModal,\n REST,\n TaskMonitor,\n withRouter,\n WizardModal,\n WizardPage,\n} from '@spinnaker/core';\n\nimport { normalizeEcsDockerImage } from '../dockerImage.util';\nimport { EcsClusterReader } from '../../../ecsCluster/ecsCluster.read.service';\nimport { IamRoleReader } from '../../../iamRoles/iamRole.read.service';\nimport { MetricAlarmReader } from '../../../metricAlarm/metricAlarm.read.service';\nimport { AdvancedSettings } from './pages/AdvancedSettings';\nimport { BasicSettings } from './pages/BasicSettings';\nimport { ContainerSettings } from './pages/ContainerSettings';\nimport { HorizontalScalingSettings } from './pages/HorizontalScalingSettings';\nimport { LoggingSettings } from './pages/LoggingSettings';\nimport { NetworkingSettings } from './pages/NetworkingSettings';\nimport { ServiceDiscoverySettings } from './pages/ServiceDiscoverySettings';\nimport { TaskDefinitionSettings } from './pages/TaskDefinitionSettings';\nimport {\n EcsWizardPageValidation,\n validateEcsBasicSettings,\n validateEcsCapacity,\n validateEcsContainer,\n validateEcsServerGroup,\n validateEcsServiceDiscovery,\n validateEcsTaskDefinition,\n} from './pages/validation';\nimport { PlacementStrategyService } from '../../../placementStrategy/placementStrategy.service';\nimport { SecretReader } from '../../../secrets/secret.read.service';\nimport type {\n IEcsCapacityProviderStrategyItem,\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n} from '../serverGroupConfiguration.service';\nimport { ServiceDiscoveryReader } from '../../../serviceDiscovery/serviceDiscovery.read.service';\n\ntype EcsFormikProps = IWizardPageInjectedProps<IEcsServerGroupCommand>['formik'];\n\nexport interface IEcsCloneServerGroupModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: IEcsServerGroupCommand;\n}\n\ninterface IEcsCloneServerGroupModalState {\n command: IEcsServerGroupCommand;\n loaded: boolean;\n requiresTemplateSelection: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class EcsCloneServerGroupModalComponent extends React.Component<\n IEcsCloneServerGroupModalProps & IRouterInjectedProps,\n IEcsCloneServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n private command: IEcsServerGroupCommand;\n private configureRequest = 0;\n private formik: EcsFormikProps = null;\n private unmounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n\n public static defaultProps: Partial<IEcsCloneServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private ecsClusterReader = new EcsClusterReader();\n private iamRoleReader = new IamRoleReader();\n private metricAlarmReader = new MetricAlarmReader();\n private placementStrategyService = new PlacementStrategyService();\n private secretReader = new SecretReader();\n\n public static show(\n props: IEcsCloneServerGroupModalProps,\n runtimeServices: DeckRuntimeServices,\n ): Promise<IEcsServerGroupCommand> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(EcsCloneServerGroupModal, props, modalProps, runtimeServices);\n }\n\n constructor(props: IEcsCloneServerGroupModalProps & IRouterInjectedProps) {\n super(props);\n this.ensureCommandShape(props.command);\n this.command = props.command;\n this.state = {\n command: props.command,\n loaded: false,\n requiresTemplateSelection: get(props, 'command.viewState.requiresTemplateSelection', false),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: 'Creating your server group',\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n public componentDidMount(): void {\n if (this.state.requiresTemplateSelection) {\n this.setState({ loaded: true });\n return;\n }\n this.configureCommand();\n }\n\n public componentWillUnmount(): void {\n this.unmounted = true;\n this.clearApplicationRefreshSubscription();\n }\n\n private onTaskComplete = () => {\n this.clearApplicationRefreshSubscription();\n this.applicationRefreshUnsubscribe = this.props.application.serverGroups.onNextRefresh(this.onApplicationRefresh);\n this.props.application.serverGroups.refresh();\n };\n\n private onApplicationRefresh = (): void => {\n this.clearApplicationRefreshSubscription();\n if (this.unmounted) {\n return;\n }\n\n const { command, taskMonitor } = this.state;\n const cloneStage = taskMonitor.task?.execution?.stages?.find((stage: any) => stage.type === 'cloneServerGroup');\n const newServerGroupName = cloneStage?.context?.['deploy.server.groups']?.[command.region];\n if (!newServerGroupName) {\n return;\n }\n\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (this.props.stateService.includes('**.clusters.serverGroup')) {\n transitionTo = '^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters.cluster.serverGroup')) {\n transitionTo = '^.^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters')) {\n transitionTo = '.serverGroup';\n }\n this.props.stateService.go(transitionTo, {\n accountId: command.credentials,\n provider: 'ecs',\n region: command.region,\n serverGroup: newServerGroupName,\n });\n };\n\n private clearApplicationRefreshSubscription = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n };\n\n private templateSelected = () => {\n this.ensureCommandShape(this.props.command);\n this.setState(\n {\n command: this.props.command,\n loaded: false,\n requiresTemplateSelection: false,\n },\n () => {\n this.configureCommand();\n },\n );\n };\n\n private configureCommand = (imageQuery = '', command = this.state.command): Promise<void> => {\n const request = ++this.configureRequest;\n this.ensureCommandShape(command);\n this.command = command;\n return this.loadBackingData(command, imageQuery, request).then(() => {\n if (!this.unmounted && request === this.configureRequest) {\n const configuredCommand = this.command;\n configuredCommand.availabilityZones = command.availabilityZones;\n configuredCommand.backingData = command.backingData;\n configuredCommand.region = command.region;\n this.attachEventHandlers(configuredCommand);\n this.syncCommand(configuredCommand);\n this.setState({ loaded: true });\n }\n });\n };\n\n private safe<T>(promise: PromiseLike<T>, fallback: T): Promise<T> {\n return Promise.resolve(promise).catch(() => fallback);\n }\n\n private loadBackingData(\n command: IEcsServerGroupCommand,\n imageQuery: string,\n request = this.configureRequest,\n ): Promise<void> {\n return Promise.all([\n this.safe(AccountService.getCredentialsKeyedByAccount('ecs'), {}),\n this.safe(REST('/loadBalancers').query({ provider: 'ecs' }).get(), []),\n this.safe(REST('/subnets/ecs').get(), []),\n this.safe(this.iamRoleReader.listRoles('ecs'), []),\n this.safe(this.ecsClusterReader.listClusters(), []),\n this.safe(this.ecsClusterReader.describeClusters(command.credentials, command.region), []),\n this.safe(this.metricAlarmReader.listMetricAlarms(), []),\n this.safe(REST('/securityGroups').get(), {}),\n this.safe(this.secretReader.listSecrets(), []),\n this.safe(ServiceDiscoveryReader.listServiceDiscoveryRegistries(), []),\n imageQuery\n ? this.safe(REST('/images/find').query({ provider: 'dockerRegistry', count: 50, q: imageQuery }).get(), [])\n : command.backingData.images || [],\n ]).then(\n ([\n credentialsKeyedByAccount,\n loadBalancers,\n subnets,\n iamRoles,\n ecsClusters,\n capacityProviderDetails,\n metricAlarms,\n securityGroups,\n secrets,\n serviceDiscoveryRegistries,\n images,\n ]) => {\n if (this.unmounted || request !== this.configureRequest) {\n return;\n }\n const loadBalancerList = Array.isArray(loadBalancers) ? loadBalancers : [];\n const subnetList = Array.isArray(subnets) ? subnets : [];\n const iamRoleList = Array.isArray(iamRoles) ? iamRoles : [];\n const clusterList = Array.isArray(ecsClusters) ? ecsClusters : [];\n const capacityProviderList = Array.isArray(capacityProviderDetails) ? capacityProviderDetails : [];\n const metricAlarmList = Array.isArray(metricAlarms) ? metricAlarms : [];\n const securityGroupData = securityGroups || {};\n const secretList = Array.isArray(secrets) ? secrets : [];\n const serviceDiscoveryRegistryList = Array.isArray(serviceDiscoveryRegistries)\n ? serviceDiscoveryRegistries\n : [];\n const imageList = Array.isArray(images) ? images : [];\n const backingData: any = command.backingData;\n backingData.credentialsKeyedByAccount = credentialsKeyedByAccount;\n backingData.loadBalancers = loadBalancerList;\n backingData.subnets = subnetList;\n backingData.iamRoles = iamRoleList;\n backingData.ecsClusters = clusterList;\n backingData.capacityProviderDetails = capacityProviderList;\n backingData.metricAlarms = metricAlarmList;\n backingData.securityGroups = securityGroupData;\n backingData.launchTypes = ['EC2', 'FARGATE'];\n backingData.networkModes = ['bridge', 'host', 'awsvpc', 'none', 'default'];\n backingData.secrets = secretList;\n backingData.serviceDiscoveryRegistries = serviceDiscoveryRegistryList;\n backingData.images = this.normalizeImages(command, imageList as IEcsDockerImage[]);\n backingData.filtered = {\n ...backingData.filtered,\n availableCapacityProviders: this.getAvailableCapacityProviders(command, capacityProviderList),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(command, capacityProviderList),\n ecsClusters: this.getClusterNames(command, clusterList),\n iamRoles: this.getIamRoles(command, iamRoleList),\n images: backingData.images,\n metricAlarms: metricAlarmList,\n securityGroupNames: this.getSecurityGroupNames(command, securityGroupData, subnetList),\n secrets: this.getSecrets(command, secretList),\n serviceDiscoveryRegistries: this.getServiceDiscoveryRegistries(command, serviceDiscoveryRegistryList),\n subnetTypes: this.getSubnetTypes(command, subnetList),\n targetGroups: this.getTargetGroups(command, loadBalancerList),\n };\n this.reconcileLocation(command);\n this.attachEventHandlers(command);\n },\n );\n }\n\n private ensureCommandShape(command: IEcsServerGroupCommand): void {\n command.backingData = command.backingData || ({} as any);\n command.backingData.filtered = command.backingData.filtered || ({} as any);\n command.backingData.filtered.availableCapacityProviders =\n command.backingData.filtered.availableCapacityProviders || [];\n command.backingData.filtered.defaultCapacityProviderStrategy =\n command.backingData.filtered.defaultCapacityProviderStrategy || [];\n command.backingData.filtered.ecsClusters = command.backingData.filtered.ecsClusters || [];\n command.backingData.filtered.iamRoles = command.backingData.filtered.iamRoles || [];\n command.backingData.filtered.images = command.backingData.filtered.images || [];\n command.backingData.filtered.metricAlarms = command.backingData.filtered.metricAlarms || [];\n command.backingData.filtered.securityGroupNames = command.backingData.filtered.securityGroupNames || [];\n command.backingData.filtered.secrets = command.backingData.filtered.secrets || [];\n command.backingData.filtered.serviceDiscoveryRegistries =\n command.backingData.filtered.serviceDiscoveryRegistries || [];\n command.backingData.filtered.subnetTypes = command.backingData.filtered.subnetTypes || [];\n command.backingData.filtered.targetGroups = command.backingData.filtered.targetGroups || [];\n command.backingData.iamRoles = command.backingData.iamRoles || [];\n command.backingData.launchTypes = command.backingData.launchTypes || ['EC2', 'FARGATE'];\n command.backingData.metricAlarms = command.backingData.metricAlarms || [];\n command.backingData.networkModes = command.backingData.networkModes || [\n 'bridge',\n 'host',\n 'awsvpc',\n 'none',\n 'default',\n ];\n command.backingData.secrets = command.backingData.secrets || [];\n command.backingData.serviceDiscoveryRegistries = command.backingData.serviceDiscoveryRegistries || [];\n command.containerMappings = command.containerMappings || [];\n command.serviceDiscoveryAssociations = command.serviceDiscoveryAssociations || [];\n command.targetGroupMappings = command.targetGroupMappings || [];\n command.taskDefinitionArtifact = command.taskDefinitionArtifact || {};\n command.viewState = command.viewState || ({} as any);\n command.viewState.dirty = command.viewState.dirty || {};\n command.useTaskDefinitionArtifact = command.useTaskDefinitionArtifact === true;\n }\n\n private attachEventHandlers(command: IEcsServerGroupCommand): void {\n command.subnetTypeChanged = (changedCommand: IEcsServerGroupCommand = command) => {\n changedCommand.backingData.filtered.securityGroupNames = this.getSecurityGroupNames(\n changedCommand,\n changedCommand.backingData.securityGroups || {},\n changedCommand.backingData.subnets || [],\n );\n return { dirty: {} };\n };\n command.regionChanged = (changedCommand: IEcsServerGroupCommand = command) => {\n this.reconcileLocation(changedCommand);\n this.syncCommand(changedCommand);\n this.configureCommand('', changedCommand);\n return { dirty: {} };\n };\n command.credentialsChanged = (changedCommand: IEcsServerGroupCommand = command) => {\n this.reconcileLocation(changedCommand);\n this.syncCommand(changedCommand);\n this.configureCommand('', changedCommand);\n return { dirty: {} };\n };\n command.placementStrategyNameChanged = (changedCommand: IEcsServerGroupCommand = command) => {\n changedCommand.placementStrategySequence = this.placementStrategyService.getPredefinedStrategy(\n changedCommand.placementStrategyName,\n );\n return { dirty: {} };\n };\n command.clusterChanged = () => {\n command.moniker = NameUtils.getMoniker(command.application, command.stack, command.freeFormDetails);\n };\n }\n\n private reconcileLocation(command: IEcsServerGroupCommand): void {\n const account = command.backingData.credentialsKeyedByAccount?.[command.credentials];\n const regions = account?.regions || [];\n command.backingData.filtered.regions = regions;\n\n const selectedRegion = regions.find((region: any) => region.name === command.region);\n if (!selectedRegion) {\n command.region = null;\n }\n const availabilityZones = selectedRegion?.availabilityZones || [];\n command.backingData.filtered.availabilityZones = availabilityZones;\n command.availabilityZones = availabilityZones;\n }\n\n private normalizeImages(command: IEcsServerGroupCommand, images: IEcsDockerImage[]): IEcsDockerImage[] {\n const commandImages = [\n ...(command.viewState.contextImages || []),\n command.imageDescription,\n ...command.containerMappings.map((mapping) => mapping.imageDescription),\n ].filter(Boolean);\n return uniqBy(\n [...images, ...commandImages].map((image) => normalizeEcsDockerImage(image)),\n (image) => image.imageId || image.id || image.name,\n ).filter(Boolean);\n }\n\n private getSubnetTypes(command: IEcsServerGroupCommand, subnets: ISubnet[]): ISubnet[] {\n return subnets.filter((subnet) => {\n const matchesAccount = !command.credentials || subnet.account === command.credentials;\n const matchesRegion = !command.region || subnet.region === command.region;\n return matchesAccount && matchesRegion && subnet.purpose;\n });\n }\n\n private getClusterNames(command: IEcsServerGroupCommand, clusters: any[]): string[] {\n return uniq(\n clusters\n .filter((cluster) => {\n const matchesAccount = !command.credentials || cluster.account === command.credentials;\n const matchesRegion = !command.region || cluster.region === command.region;\n return matchesAccount && matchesRegion;\n })\n .map((cluster) => cluster.name)\n .concat(command.ecsClusterName || []),\n ).filter(Boolean);\n }\n\n private getIamRoles(command: IEcsServerGroupCommand, iamRoles: any[]): string[] {\n const roleNames = iamRoles\n .filter((role) => role.accountName === command.credentials)\n .map((role) => role.name)\n .filter(Boolean);\n return roleNames.length ? ['None (No IAM role)', ...roleNames] : roleNames;\n }\n\n private getSecrets(command: IEcsServerGroupCommand, secrets: any[]): string[] {\n return secrets\n .filter((secret) => secret.account === command.credentials && secret.region === command.region)\n .map((secret) => secret.name)\n .filter(Boolean);\n }\n\n private getServiceDiscoveryRegistries(command: IEcsServerGroupCommand, registries: any[]): any[] {\n return registries\n .filter((registry) => registry.account === command.credentials && registry.region === command.region)\n .map((registry) => ({\n ...registry,\n displayName: registry.displayName || `${registry.name} (${registry.id})`,\n }));\n }\n\n private getSecurityGroupNames(command: IEcsServerGroupCommand, securityGroups: any, subnets: ISubnet[]): string[] {\n const subnetPurpose = command.subnetTypes?.[0] || command.subnetType;\n if (!subnetPurpose) {\n return [];\n }\n\n const subnet = subnets.find(\n (candidate) =>\n candidate.account === command.credentials &&\n candidate.region === command.region &&\n candidate.purpose === subnetPurpose,\n );\n const vpcId = subnet?.vpcId;\n if (!vpcId) {\n return [];\n }\n\n return (securityGroups?.[command.credentials]?.ecs?.[command.region] || [])\n .filter((securityGroup: any) => securityGroup.vpcId === vpcId)\n .map((securityGroup: any) => securityGroup.name)\n .filter(Boolean);\n }\n\n private getTargetGroups(command: IEcsServerGroupCommand, loadBalancers: any[]): string[] {\n const fromLoadBalancers = loadBalancers.flatMap((loadBalancer) =>\n (loadBalancer.accounts || [])\n .filter((account: any) => account.name === command.credentials)\n .flatMap((account: any) =>\n (account.regions || [])\n .filter((region: any) => region.name === command.region)\n .flatMap((region: any) =>\n (region.loadBalancers || []).flatMap((regionLoadBalancer: any) =>\n (regionLoadBalancer.targetGroups || []).map((targetGroup: any) =>\n typeof targetGroup === 'string' ? targetGroup : targetGroup.targetGroupName,\n ),\n ),\n ),\n ),\n );\n const fromCommand = (command.targetGroupMappings || []).map(\n (mapping: IEcsTargetGroupMapping) => mapping.targetGroup,\n );\n return uniq([...fromLoadBalancers, ...fromCommand, command.targetGroup]).filter(Boolean);\n }\n\n private getAvailableCapacityProviders(command: IEcsServerGroupCommand, capacityProviderDetails: any[]): string[] {\n return uniq(\n capacityProviderDetails\n .filter((details) => !command.ecsClusterName || details.clusterName === command.ecsClusterName)\n .flatMap((details) => details.capacityProviders || []),\n );\n }\n\n private getDefaultCapacityProviderStrategy(\n command: IEcsServerGroupCommand,\n capacityProviderDetails: any[],\n ): IEcsCapacityProviderStrategyItem[] {\n return capacityProviderDetails\n .filter((details) => !command.ecsClusterName || details.clusterName === command.ecsClusterName)\n .flatMap((details) => details.defaultCapacityProviderStrategy || []);\n }\n\n private syncCommand(command: IEcsServerGroupCommand, formik = this.formik): void {\n this.command = command;\n formik?.setValues(command);\n this.setState({ command });\n }\n\n private updateCommand = (formik: EcsFormikProps, field: string, value: any) => {\n if (field === 'credentials' || field === 'region' || field === 'ecsClusterName' || field === 'subnetTypes') {\n this.configureRequest += 1;\n }\n formik.setFieldValue(field, value);\n const command = { ...this.command, [field]: value };\n if (field === 'stack' || field === 'freeFormDetails') {\n command.clusterChanged(command);\n }\n if (field === 'credentials') {\n command.credentialsChanged(command);\n }\n if (field === 'region') {\n command.regionChanged(command);\n }\n if (field === 'subnetTypes') {\n command.subnetTypeChanged(command);\n }\n if (field === 'placementStrategyName') {\n command.placementStrategyNameChanged(command);\n }\n if (field === 'useTaskDefinitionArtifact') {\n command.serviceDiscoveryAssociations = (command.serviceDiscoveryAssociations || []).map((association) => ({\n ...association,\n containerName: value ? association.containerName || '' : null,\n }));\n }\n if (field !== 'credentials' && field !== 'region') {\n this.syncCommand(command, formik);\n }\n this.setState({ command }, () => {\n if (field === 'ecsClusterName' || field === 'subnetTypes') {\n this.configureCommand('', command);\n }\n });\n };\n\n private submit = (command: IEcsServerGroupCommand = this.state.command) => {\n const { taskMonitor } = this.state;\n this.setState({ command });\n const mode = command.viewState?.mode;\n if (mode === 'editPipeline' || mode === 'createPipeline') {\n return this.props.closeModal(command);\n }\n return taskMonitor.submit(() =>\n this.context.services.serverGroupWriter.cloneServerGroup(command as any, this.props.application),\n );\n };\n\n public render() {\n const { application, dismissModal, title } = this.props;\n const { command, loaded, requiresTemplateSelection } = this.state;\n\n if (requiresTemplateSelection) {\n return (\n <DeployInitializer\n application={application}\n cloudProvider=\"ecs\"\n command={command as any}\n onDismiss={dismissModal}\n onTemplateSelected={this.templateSelected}\n />\n );\n }\n\n return (\n <WizardModal<IEcsServerGroupCommand>\n closeModal={this.submit}\n dismissModal={dismissModal}\n heading={title}\n initialValues={command}\n loading={!loaded}\n submitButtonLabel={command.viewState?.submitButtonLabel || 'Done'}\n taskMonitor={this.state.taskMonitor}\n validate={validateEcsServerGroup}\n render={({ formik, nextIdx, wizard }) => {\n this.formik = formik;\n const configureFormikCommand = (query = '') => this.configureCommand(query, formik.values);\n const updateFormikCommand = (field: string, value: any) => this.updateCommand(formik, field, value);\n return (\n <>\n <WizardPage\n label=\"Basic Settings\"\n order={nextIdx()}\n render={({ innerRef }) => (\n <EcsWizardPageValidation ref={innerRef} validator={validateEcsBasicSettings}>\n <BasicSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n </EcsWizardPageValidation>\n )}\n wizard={wizard}\n />\n <WizardPage\n label=\"Networking\"\n order={nextIdx()}\n render={() => (\n <NetworkingSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n )}\n wizard={wizard}\n />\n <WizardPage\n label=\"Task Definition\"\n order={nextIdx()}\n render={({ innerRef }) => (\n <EcsWizardPageValidation ref={innerRef} validator={validateEcsTaskDefinition}>\n <TaskDefinitionSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n </EcsWizardPageValidation>\n )}\n wizard={wizard}\n />\n {!formik.values.useTaskDefinitionArtifact && (\n <WizardPage\n label=\"Container\"\n order={nextIdx()}\n render={({ innerRef }) => (\n <EcsWizardPageValidation ref={innerRef} validator={validateEcsContainer}>\n <ContainerSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n </EcsWizardPageValidation>\n )}\n wizard={wizard}\n />\n )}\n <WizardPage\n label=\"Horizontal Scaling\"\n order={nextIdx()}\n render={({ innerRef }) => (\n <EcsWizardPageValidation ref={innerRef} validator={validateEcsCapacity}>\n <HorizontalScalingSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n </EcsWizardPageValidation>\n )}\n wizard={wizard}\n />\n {!formik.values.useTaskDefinitionArtifact && (\n <WizardPage\n label=\"Logging\"\n order={nextIdx()}\n render={() => (\n <LoggingSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n )}\n wizard={wizard}\n />\n )}\n <WizardPage\n label=\"Service Discovery\"\n order={nextIdx()}\n render={({ innerRef }) => (\n <EcsWizardPageValidation ref={innerRef} validator={validateEcsServiceDiscovery}>\n <ServiceDiscoverySettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n </EcsWizardPageValidation>\n )}\n wizard={wizard}\n />\n <WizardPage\n label=\"Advanced Settings\"\n order={nextIdx()}\n render={() => (\n <AdvancedSettings\n application={application}\n command={formik.values}\n configureCommand={configureFormikCommand}\n onFieldChange={updateFormikCommand}\n />\n )}\n wizard={wizard}\n />\n </>\n );\n }}\n />\n );\n }\n}\n\nexport const EcsCloneServerGroupModal = Object.assign(\n withRouter<IEcsCloneServerGroupModalProps & IRouterInjectedProps>(EcsCloneServerGroupModalComponent),\n { show: EcsCloneServerGroupModalComponent.show },\n);\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport type {\n Application,\n DeckRuntimeServices,\n IModalComponentProps,\n IServerGroup,\n IServerGroupJob,\n} from '@spinnaker/core';\nimport {\n DeckRuntimeContext,\n FormikFormField,\n MinMaxDesiredChanges,\n ModalClose,\n noop,\n NumberInput,\n PlatformHealthOverride,\n ReactModal,\n SpinFormik,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n UserVerification,\n ValidationMessage,\n} from '@spinnaker/core';\n\nexport interface IEcsResizeServerGroupModalProps extends IModalComponentProps {\n application: Application;\n serverGroup: IServerGroup;\n}\n\nexport interface IEcsResizeCapacity {\n desired: number;\n max: number;\n min: number;\n}\n\nexport interface IEcsResizeServerGroupValues {\n capacity: IEcsResizeCapacity;\n interestingHealthProviderNames?: string[];\n reason?: string;\n}\n\nexport interface IEcsResizeServerGroupJob extends IServerGroupJob {\n capacity: IEcsResizeCapacity;\n interestingHealthProviderNames?: string[];\n reason?: string;\n}\n\nexport interface IEcsResizeServerGroupErrors {\n capacity?: Partial<Record<keyof IEcsResizeCapacity, string>>;\n}\n\ninterface IEcsResizeServerGroupModalState {\n initialValues: IEcsResizeServerGroupValues;\n taskMonitor: TaskMonitor;\n verified: boolean;\n}\n\nexport function validateEcsResizeValues(values: IEcsResizeServerGroupValues): IEcsResizeServerGroupErrors {\n const { desired, max, min } = values.capacity;\n const capacity: IEcsResizeServerGroupErrors['capacity'] = {};\n\n if (!Number.isFinite(min) || min < 0) {\n capacity.min = 'Min cannot be negative';\n }\n if (!Number.isFinite(max) || max < 0) {\n capacity.max = 'Max cannot be negative';\n }\n if (!Number.isFinite(desired) || desired < 0) {\n capacity.desired = 'Desired cannot be negative';\n }\n if (Object.keys(capacity).length > 0) {\n return { capacity };\n }\n\n if (min > max) {\n capacity.min = 'Min cannot be larger than Max';\n capacity.max = 'Max cannot be smaller than Min';\n } else if (desired < min) {\n capacity.desired = 'Desired cannot be smaller than Min';\n } else if (desired > max) {\n capacity.desired = 'Desired cannot be larger than Max';\n }\n\n return Object.keys(capacity).length > 0 ? { capacity } : {};\n}\n\nexport class EcsResizeServerGroupModal extends React.Component<\n IEcsResizeServerGroupModalProps,\n IEcsResizeServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public static defaultProps: Partial<IEcsResizeServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(\n props: IEcsResizeServerGroupModalProps,\n runtimeServices: DeckRuntimeServices,\n ): Promise<IEcsResizeServerGroupJob> {\n return ReactModal.show(EcsResizeServerGroupModal, props, undefined, runtimeServices);\n }\n\n public constructor(props: IEcsResizeServerGroupModalProps) {\n super(props);\n const { application, serverGroup } = props;\n const attributes = application.attributes || {};\n this.state = {\n initialValues: {\n capacity: {\n desired: Number(serverGroup.capacity.desired),\n max: Number(serverGroup.capacity.max),\n min: Number(serverGroup.capacity.min),\n },\n interestingHealthProviderNames:\n attributes.platformHealthOnlyShowOverride && attributes.platformHealthOnly ? ['Ecs'] : undefined,\n },\n taskMonitor: new TaskMonitor({\n application,\n title: `Resizing ${serverGroup.name}`,\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: () => application.serverGroups.refresh(),\n }),\n verified: false,\n };\n }\n\n private close = (): void => this.props.dismissModal();\n\n private submit = (values: IEcsResizeServerGroupValues): void => {\n if (!this.state.verified || Object.keys(validateEcsResizeValues(values)).length > 0) {\n return;\n }\n\n const { application, serverGroup } = this.props;\n const command: IEcsResizeServerGroupJob = {\n capacity: values.capacity,\n interestingHealthProviderNames: values.interestingHealthProviderNames,\n reason: values.reason,\n };\n this.state.taskMonitor.submit(() =>\n this.context.services.serverGroupWriter.resizeServerGroup(serverGroup, application, command),\n );\n };\n\n private capacityError(errors: IEcsResizeServerGroupErrors): string | undefined {\n const capacity = errors.capacity;\n return capacity && ([capacity.min, capacity.max, capacity.desired].find(Boolean) as string);\n }\n\n public render(): JSX.Element {\n const { application, serverGroup } = this.props;\n\n return (\n <>\n <TaskMonitorWrapper monitor={this.state.taskMonitor} />\n <SpinFormik<IEcsResizeServerGroupValues>\n initialValues={this.state.initialValues}\n onSubmit={this.submit}\n validate={validateEcsResizeValues}\n render={(formik) => {\n const error = this.capacityError(formik.errors as IEcsResizeServerGroupErrors);\n return (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Resize {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\">\n <div className=\"form-group bold\">\n <div className=\"col-sm-2 col-sm-offset-3\">Min</div>\n <div className=\"col-sm-2\">Max</div>\n <div className=\"col-sm-2\">Desired</div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-sm-3 sm-label-right\">Current</div>\n {(['min', 'max', 'desired'] as Array<keyof IEcsResizeCapacity>).map((field) => (\n <div className=\"col-sm-2\" key={field}>\n <input\n className=\"form-control input-sm\"\n disabled={true}\n type=\"number\"\n value={serverGroup.capacity[field]}\n />\n </div>\n ))}\n </div>\n <div className=\"form-group\">\n <div className=\"col-sm-3 sm-label-right\">Resize to</div>\n {(['min', 'max', 'desired'] as Array<keyof IEcsResizeCapacity>).map((field) => (\n <div className=\"col-sm-2\" key={field}>\n <FormikFormField\n name={`capacity.${field}`}\n input={(props) => <NumberInput {...props} min={0} />}\n layout={({ input }) => <>{input}</>}\n touched={true}\n />\n </div>\n ))}\n </div>\n {error && (\n <div className=\"col-sm-9 col-sm-offset-3\">\n <ValidationMessage message={error} type=\"error\" />\n </div>\n )}\n\n <div className=\"form-group\">\n <div className=\"col-sm-3 sm-label-right\">Changes</div>\n <div className=\"col-sm-9 sm-control-field\">\n <MinMaxDesiredChanges current={serverGroup.capacity} next={formik.values.capacity} />\n </div>\n </div>\n\n {application.attributes?.platformHealthOnlyShowOverride && (\n <div className=\"form-group\">\n <div className=\"col-sm-10 col-sm-offset-1\">\n <PlatformHealthOverride\n interestingHealthProviderNames={formik.values.interestingHealthProviderNames}\n onChange={(names) => formik.setFieldValue('interestingHealthProviderNames', names)}\n platformHealthType=\"Ecs\"\n showHelpDetails={true}\n />\n </div>\n </div>\n )}\n\n <TaskReason\n reason={formik.values.reason}\n onChange={(reason) => formik.setFieldValue('reason', reason)}\n />\n </form>\n </Modal.Body>\n <Modal.Footer>\n <UserVerification\n account={serverGroup.account}\n onValidChange={(verified) => this.setState({ verified })}\n />\n <button className=\"btn btn-default\" onClick={this.close} type=\"button\">\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n disabled={!this.state.verified || !formik.isValid}\n onClick={() => this.submit(formik.values)}\n type=\"submit\"\n >\n Submit\n </button>\n </Modal.Footer>\n </>\n );\n }}\n />\n </>\n );\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport type {\n Application,\n DeckRuntimeServices,\n IModalComponentProps,\n IServerGroup,\n IServerGroupJob,\n} from '@spinnaker/core';\nimport {\n DeckRuntimeContext,\n FormikFormField,\n ModalClose,\n noop,\n PlatformHealthOverride,\n ReactModal,\n ReactSelectInput,\n SpinFormik,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n UserVerification,\n ValidationMessage,\n} from '@spinnaker/core';\n\nexport interface IEcsRollbackServerGroupModalProps extends IModalComponentProps {\n application: Application;\n serverGroup: IServerGroup;\n}\n\nexport interface IEcsRollbackServerGroupValues {\n interestingHealthProviderNames?: string[];\n reason?: string;\n restoreServerGroupName?: string;\n targetHealthyRollbackPercentage: number;\n}\n\nexport interface IEcsRollbackServerGroupJob extends IServerGroupJob {\n interestingHealthProviderNames?: string[];\n platformHealthOnlyShowOverride?: boolean;\n reason?: string;\n rollbackContext: {\n restoreServerGroupName: string;\n rollbackServerGroupName: string;\n targetHealthyRollbackPercentage: number;\n };\n rollbackType: 'EXPLICIT';\n}\n\nexport interface IEcsRollbackServerGroupErrors {\n restoreServerGroupName?: string;\n targetHealthyRollbackPercentage?: string;\n}\n\ninterface IEcsRollbackServerGroupModalState {\n initialValues: IEcsRollbackServerGroupValues;\n taskMonitor: TaskMonitor;\n verified: boolean;\n}\n\nfunction coordinate(serverGroup: any, key: 'account' | 'cluster'): string | undefined {\n if (key === 'account') {\n return serverGroup.account || serverGroup.accountId;\n }\n return serverGroup.cluster || serverGroup.moniker?.cluster;\n}\n\nexport function getEcsRollbackTargets(application: Application, serverGroup: IServerGroup): IServerGroup[] {\n const app = application as any;\n const appName = (serverGroup as any).moniker?.app || app.name;\n const candidates: IServerGroup[] = app.serverGroups?.data || app.getDataSource?.('serverGroups')?.data || [];\n\n return candidates\n .filter((candidate: any) => {\n const candidateApp = candidate.moniker?.app || candidate.application || appName;\n return (\n candidate.isDisabled &&\n candidateApp === appName &&\n coordinate(candidate, 'cluster') === coordinate(serverGroup, 'cluster') &&\n coordinate(candidate, 'account') === coordinate(serverGroup, 'account') &&\n candidate.region === serverGroup.region\n );\n })\n .sort((a, b) => b.name.localeCompare(a.name));\n}\n\nexport function validateEcsRollbackValues(\n values: IEcsRollbackServerGroupValues,\n eligibleTargetNames?: string[],\n): IEcsRollbackServerGroupErrors {\n const errors: IEcsRollbackServerGroupErrors = {};\n if (!values.restoreServerGroupName) {\n errors.restoreServerGroupName = 'Select a server group to restore';\n } else if (eligibleTargetNames && !eligibleTargetNames.includes(values.restoreServerGroupName)) {\n errors.restoreServerGroupName = 'Select an eligible server group to restore';\n }\n if (\n !Number.isFinite(values.targetHealthyRollbackPercentage) ||\n values.targetHealthyRollbackPercentage < 0 ||\n values.targetHealthyRollbackPercentage > 100\n ) {\n errors.targetHealthyRollbackPercentage = 'Healthy threshold must be between 0 and 100';\n }\n return errors;\n}\n\nexport class EcsRollbackServerGroupModal extends React.Component<\n IEcsRollbackServerGroupModalProps,\n IEcsRollbackServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public static defaultProps: Partial<IEcsRollbackServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(\n props: IEcsRollbackServerGroupModalProps,\n runtimeServices: DeckRuntimeServices,\n ): Promise<IEcsRollbackServerGroupJob> {\n return ReactModal.show(EcsRollbackServerGroupModal, props, undefined, runtimeServices);\n }\n\n public constructor(props: IEcsRollbackServerGroupModalProps) {\n super(props);\n const { application, serverGroup } = props;\n const attributes = application.attributes || {};\n this.state = {\n initialValues: {\n interestingHealthProviderNames:\n attributes.platformHealthOnlyShowOverride && attributes.platformHealthOnly ? ['Ecs'] : undefined,\n targetHealthyRollbackPercentage: 100,\n },\n taskMonitor: new TaskMonitor({\n application,\n title: `Rollback ${serverGroup.name}`,\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: () => application.serverGroups.refresh(),\n }),\n verified: false,\n };\n }\n\n private close = (): void => this.props.dismissModal();\n\n private submit = (values: IEcsRollbackServerGroupValues): void => {\n const eligibleTargetNames = getEcsRollbackTargets(this.props.application, this.props.serverGroup).map(\n ({ name }) => name,\n );\n if (!this.state.verified || Object.keys(validateEcsRollbackValues(values, eligibleTargetNames)).length > 0) {\n return;\n }\n\n const { application, serverGroup } = this.props;\n const command: IEcsRollbackServerGroupJob = {\n interestingHealthProviderNames: values.interestingHealthProviderNames,\n platformHealthOnlyShowOverride: application.attributes?.platformHealthOnlyShowOverride,\n reason: values.reason,\n rollbackContext: {\n restoreServerGroupName: values.restoreServerGroupName,\n rollbackServerGroupName: serverGroup.name,\n targetHealthyRollbackPercentage: values.targetHealthyRollbackPercentage,\n },\n rollbackType: 'EXPLICIT',\n };\n\n this.state.taskMonitor.submit(() =>\n this.context.services.serverGroupWriter.rollbackServerGroup(serverGroup, application, command),\n );\n };\n\n public render(): JSX.Element {\n const { application, serverGroup } = this.props;\n const targets = getEcsRollbackTargets(application, serverGroup);\n\n return (\n <>\n <TaskMonitorWrapper monitor={this.state.taskMonitor} />\n <SpinFormik<IEcsRollbackServerGroupValues>\n initialValues={this.state.initialValues}\n onSubmit={this.submit}\n validate={(values) =>\n validateEcsRollbackValues(\n values,\n targets.map(({ name }) => name),\n )\n }\n render={(formik) => (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Rollback {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-sm-3 sm-label-right\">Restore to</div>\n <div className=\"col-sm-7\">\n <FormikFormField\n name=\"restoreServerGroupName\"\n fastField={true}\n input={(props) => (\n <ReactSelectInput\n {...props}\n clearable={false}\n stringOptions={targets.map(({ name }) => name)}\n />\n )}\n required={true}\n />\n </div>\n </div>\n\n {application.attributes?.platformHealthOnlyShowOverride && (\n <div className=\"form-group\">\n <div className=\"col-sm-10 col-sm-offset-1\">\n <PlatformHealthOverride\n interestingHealthProviderNames={formik.values.interestingHealthProviderNames}\n onChange={(names) => formik.setFieldValue('interestingHealthProviderNames', names)}\n platformHealthType=\"Ecs\"\n showHelpDetails={true}\n />\n </div>\n </div>\n )}\n\n <TaskReason\n reason={formik.values.reason}\n onChange={(reason) => formik.setFieldValue('reason', reason)}\n />\n\n <div className=\"form-group\">\n <div className=\"col-sm-3 sm-label-right\">Healthy threshold</div>\n <div className=\"col-sm-3\">\n <input\n className=\"form-control input-sm\"\n max={100}\n min={0}\n name=\"targetHealthyRollbackPercentage\"\n onChange={(event) =>\n formik.setFieldValue('targetHealthyRollbackPercentage', Number(event.target.value))\n }\n type=\"number\"\n value={formik.values.targetHealthyRollbackPercentage}\n />\n </div>\n <div className=\"col-sm-2 sm-control-field\">percent</div>\n </div>\n {formik.errors.targetHealthyRollbackPercentage && (\n <div className=\"col-sm-7 col-sm-offset-3\">\n <ValidationMessage\n message={formik.errors.targetHealthyRollbackPercentage as string}\n type=\"error\"\n />\n </div>\n )}\n </form>\n </Modal.Body>\n <Modal.Footer>\n <UserVerification\n account={serverGroup.account}\n onValidChange={(verified) => this.setState({ verified })}\n />\n <button className=\"btn btn-default\" onClick={this.close} type=\"button\">\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n disabled={!this.state.verified || !formik.isValid}\n onClick={() => this.submit(formik.values)}\n type=\"submit\"\n >\n Submit\n </button>\n </Modal.Footer>\n </>\n )}\n />\n </>\n );\n }\n}\n","import React from 'react';\nimport { Dropdown, Tooltip } from 'react-bootstrap';\n\nimport { AWSProviderSettings } from '@spinnaker/amazon';\nimport type { IOwnerOption, IRouterInjectedProps, IServerGroupActionsProps, IServerGroupJob } from '@spinnaker/core';\nimport {\n AddEntityTagLinks,\n ClusterTargetBuilder,\n ConfirmationModalService,\n ManagedMenuItem,\n ServerGroupWarningMessageService,\n SETTINGS,\n useDeckRuntimeServices,\n withRouter,\n} from '@spinnaker/core';\n\nimport { EcsResizeServerGroupModal } from './resize/EcsResizeServerGroupModal';\nimport { EcsRollbackServerGroupModal } from './rollback/EcsRollbackServerGroupModal';\n\ntype ConfirmedAction = 'destroy' | 'disable' | 'enable';\n\nconst actionLabels: Record<ConfirmedAction, { present: string; progressive: string }> = {\n destroy: { present: 'Destroy', progressive: 'Destroying' },\n disable: { present: 'Disable', progressive: 'Disabling' },\n enable: { present: 'Enable', progressive: 'Enabling' },\n};\n\nexport function EcsServerGroupActionsComponent({\n app,\n serverGroup,\n stateService,\n}: IServerGroupActionsProps & IRouterInjectedProps) {\n const runtimeServices = useDeckRuntimeServices();\n const { serverGroupWriter } = runtimeServices;\n if (!AWSProviderSettings.adHocInfraWritesEnabled) {\n return null;\n }\n\n const showEntityTags = SETTINGS.feature && SETTINGS.feature.entityTags;\n const entityTagTargets: IOwnerOption[] = ClusterTargetBuilder.buildClusterTargets(serverGroup);\n const enableLocked =\n serverGroup.isDisabled &&\n (serverGroup.runningTasks || []).some((task: any) =>\n (task.execution?.stages || []).some((stage: any) => stage.type === 'resizeServerGroup'),\n );\n\n const confirmAction = (action: ConfirmedAction): void => {\n const label = actionLabels[action];\n const stateParams = { name: serverGroup.name, accountId: serverGroup.account, region: serverGroup.region };\n const confirmationModalParams = {\n header: `Really ${action} ${serverGroup.name}?`,\n buttonText: `${label.present} ${serverGroup.name}`,\n account: serverGroup.account,\n taskMonitorConfig: {\n application: app,\n title: `${label.progressive} ${serverGroup.name}`,\n ...(action === 'destroy'\n ? {\n onTaskComplete: () => {\n if (stateService.includes('**.serverGroup', stateParams)) {\n stateService.go('^');\n }\n },\n }\n : {}),\n },\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n interestingHealthProviderNames:\n app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly ? ['Ecs'] : undefined,\n submitMethod: (params: IServerGroupJob) => {\n if (action === 'destroy') {\n return serverGroupWriter.destroyServerGroup(serverGroup, app, params);\n }\n if (action === 'disable') {\n return serverGroupWriter.disableServerGroup(serverGroup, app.name, params);\n }\n return serverGroupWriter.enableServerGroup(serverGroup, app, params);\n },\n askForReason: true,\n };\n\n if (action === 'destroy') {\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n } else if (action === 'disable') {\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"server-group-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Server Group Actions</Dropdown.Toggle>\n <Dropdown.Menu className=\"dropdown-menu\">\n {!serverGroup.isDisabled && (\n <ManagedMenuItem\n resource={serverGroup}\n application={app}\n onClick={() => EcsRollbackServerGroupModal.show({ application: app, serverGroup }, runtimeServices)}\n >\n Rollback\n </ManagedMenuItem>\n )}\n <ManagedMenuItem\n resource={serverGroup}\n application={app}\n onClick={() => EcsResizeServerGroupModal.show({ application: app, serverGroup }, runtimeServices)}\n >\n Resize\n </ManagedMenuItem>\n {!serverGroup.isDisabled && (\n <ManagedMenuItem resource={serverGroup} application={app} onClick={() => confirmAction('disable')}>\n Disable\n </ManagedMenuItem>\n )}\n {serverGroup.isDisabled && !enableLocked && (\n <ManagedMenuItem resource={serverGroup} application={app} onClick={() => confirmAction('enable')}>\n Enable\n </ManagedMenuItem>\n )}\n {enableLocked && (\n <li className=\"disabled\">\n <Tooltip\n id=\"ecs-enable-locked-tooltip\"\n value=\"Cannot enable this server group until resize operation completes\"\n placement=\"left\"\n >\n <a>\n <span className=\"small glyphicon glyphicon-lock\" /> Enable\n </a>\n </Tooltip>\n </li>\n )}\n <ManagedMenuItem resource={serverGroup} application={app} onClick={() => confirmAction('destroy')}>\n Destroy\n </ManagedMenuItem>\n {showEntityTags && (\n <AddEntityTagLinks\n component={serverGroup}\n application={app}\n entityType=\"serverGroup\"\n ownerOptions={entityTagTargets}\n onUpdate={() => app.serverGroups.refresh()}\n />\n )}\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nexport const EcsServerGroupActions = withRouter(EcsServerGroupActionsComponent);\n","import { defaults } from 'lodash';\n\nimport type {\n IAmazonServerGroup,\n IAmazonServerGroupView,\n IScalingAdjustmentView,\n IScalingPolicyAlarmView,\n IScalingPolicyView,\n IStepAdjustment,\n IStepAdjustmentView,\n} from '@spinnaker/amazon';\nimport { VpcReader } from '@spinnaker/amazon';\nimport type { IInstance, IVpc } from '@spinnaker/core';\n\nexport class EcsServerGroupTransformer {\n private addComparator(alarm: IScalingPolicyAlarmView): void {\n if (!alarm.comparisonOperator) {\n return;\n }\n\n switch (alarm.comparisonOperator) {\n case 'LessThanThreshold':\n alarm.comparator = '&lt;';\n break;\n case 'GreaterThanThreshold':\n alarm.comparator = '&gt;';\n break;\n case 'LessThanOrEqualToThreshold':\n alarm.comparator = '&le;';\n break;\n case 'GreaterThanOrEqualToThreshold':\n alarm.comparator = '&ge;';\n break;\n }\n }\n\n private addAdjustmentAttributes(policyOrStepAdjustment: IScalingAdjustmentView): void {\n policyOrStepAdjustment.operator = policyOrStepAdjustment.scalingAdjustment < 0 ? 'decrease' : 'increase';\n policyOrStepAdjustment.absAdjustment = Math.abs(policyOrStepAdjustment.scalingAdjustment);\n }\n\n private transformScalingPolicy(policy: IScalingPolicyView): IScalingPolicyView {\n const view: IScalingPolicyView = { ...policy };\n const upperBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n b.metricIntervalUpperBound - a.metricIntervalUpperBound;\n const lowerBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n a.metricIntervalLowerBound - b.metricIntervalLowerBound;\n\n view.alarms = policy.alarms || [];\n view.alarms.forEach((alarm: IScalingPolicyAlarmView) => this.addComparator(alarm));\n this.addAdjustmentAttributes(view); // simple policies\n if (view.stepAdjustments && view.stepAdjustments.length) {\n view.stepAdjustments.forEach((sa: IStepAdjustmentView) => this.addAdjustmentAttributes(sa)); // step policies\n const sorter = policy.stepAdjustments.every((a: IStepAdjustment) => a.metricIntervalUpperBound !== undefined)\n ? upperBoundSorter\n : lowerBoundSorter;\n view.stepAdjustments.sort((a: IStepAdjustmentView, b: IStepAdjustmentView) => sorter(a, b));\n }\n return view;\n }\n\n public normalizeServerGroupDetails(serverGroup: IAmazonServerGroup): IAmazonServerGroupView {\n const view: IAmazonServerGroupView = { ...serverGroup } as IAmazonServerGroupView;\n if (serverGroup.scalingPolicies) {\n view.scalingPolicies = serverGroup.scalingPolicies.map((policy: IScalingPolicyView) =>\n this.transformScalingPolicy(policy),\n );\n }\n return view;\n }\n\n public normalizeServerGroup(serverGroup: IAmazonServerGroup): Promise<IAmazonServerGroup> {\n serverGroup.instances.forEach((instance: IInstance) => {\n instance.vpcId = serverGroup.vpcId;\n });\n return VpcReader.listVpcs().then(\n (vpc: IVpc[]): IAmazonServerGroup => this.addVpcNameToServerGroup(serverGroup)(vpc),\n );\n }\n\n private addVpcNameToServerGroup(serverGroup: IAmazonServerGroup): (vpc: IVpc[]) => IAmazonServerGroup {\n return (vpcs: IVpc[]) => {\n const match = vpcs.find((test) => test.id === serverGroup.vpcId);\n serverGroup.vpcName = match ? match.name : '';\n return serverGroup;\n };\n }\n\n public convertServerGroupCommandToDeployConfiguration(base: any): any {\n // use _.defaults to avoid copying the backingData, which is huge and expensive to copy over\n const command = defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = 'ecs';\n command.availabilityZones = {};\n command.availabilityZones[command.region] = base.availabilityZones;\n command.loadBalancers = (base.loadBalancers || []).concat(base.vpcLoadBalancers || []);\n command.targetGroup = base.targetGroup || '';\n command.account = command.credentials;\n command.subnetType = command.subnetType || '';\n\n if (base.viewState.mode !== 'clone') {\n delete command.source;\n }\n\n delete command.region;\n delete command.viewState;\n delete command.backingData;\n delete command.selectedProvider;\n delete command.instanceProfile;\n delete command.vpcId;\n\n return command;\n }\n}\n","import { isEmpty } from 'lodash';\nimport { Observable } from 'rxjs';\n\nimport type { IServerGroup, IServerGroupDetailsProps } from '@spinnaker/core';\nimport { ServerGroupReader } from '@spinnaker/core';\n\nimport { EcsServerGroupTransformer } from '../serverGroup.transformer';\n\nexport function ecsServerGroupDetailsGetter(\n props: IServerGroupDetailsProps,\n autoClose: () => void,\n): Observable<IServerGroup> {\n const { app, serverGroup: serverGroupInfo } = props;\n return new Observable<IServerGroup>((observer) => {\n let cancelled = false;\n let summary: IServerGroup;\n\n app\n .ready()\n .then(() => {\n if (cancelled) {\n return null;\n }\n\n summary = app.serverGroups.data.find(\n (candidate: IServerGroup) =>\n candidate.name === serverGroupInfo.name &&\n candidate.account === serverGroupInfo.accountId &&\n candidate.region === serverGroupInfo.region,\n );\n if (!summary) {\n const loadBalancer = app.loadBalancers.data.find(\n (candidate: any) =>\n candidate.account === serverGroupInfo.accountId && candidate.region === serverGroupInfo.region,\n );\n summary = loadBalancer?.serverGroups.find(\n (candidate: IServerGroup) => candidate.name === serverGroupInfo.name,\n );\n }\n\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroupInfo.accountId,\n serverGroupInfo.region,\n serverGroupInfo.name,\n );\n })\n .then((serverGroup: IServerGroup) => {\n if (cancelled || serverGroup === null) {\n return;\n }\n if (isEmpty(serverGroup)) {\n autoClose();\n observer.complete();\n return;\n }\n\n const merged = { ...serverGroup, ...summary, account: serverGroupInfo.accountId } as IServerGroup;\n observer.next(new EcsServerGroupTransformer().normalizeServerGroupDetails(merged as any) as IServerGroup);\n observer.complete();\n })\n .catch(() => {\n if (!cancelled) {\n autoClose();\n observer.complete();\n }\n });\n\n return () => {\n cancelled = true;\n };\n });\n}\n","import React from 'react';\n\nimport type { IServerGroupDetailsSectionProps } from '@spinnaker/core';\nimport { CollapsibleSection, FirewallLabels, HealthCounts } from '@spinnaker/core';\n\nexport function EcsTaskDefinitionSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const taskDefinition = (serverGroup as any).taskDefinition || {};\n return (\n <CollapsibleSection heading=\"Task Definition\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Task Name</dt>\n <dd>{taskDefinition.taskName}</dd>\n <dt>Container URL</dt>\n <dd>{taskDefinition.containerImage}</dd>\n <dt>Container IAM Profile</dt>\n <dd>{taskDefinition.iamRole}</dd>\n {taskDefinition.containerPort != null && (\n <>\n <dt>Container Port</dt>\n <dd>{taskDefinition.containerPort}</dd>\n </>\n )}\n <dt>Container CPU Units</dt>\n <dd>{taskDefinition.cpuUnits}</dd>\n {taskDefinition.memoryReservation != null && (\n <>\n <dt>Container Reserved Memory</dt>\n <dd>{taskDefinition.memoryReservation} MB</dd>\n </>\n )}\n {taskDefinition.memoryLimit != null && (\n <>\n <dt>Container Memory Limit</dt>\n <dd>{taskDefinition.memoryLimit} MB</dd>\n </>\n )}\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function EcsEnvironmentVariablesSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const environmentVariables = (serverGroup as any).taskDefinition?.environmentVariables || [];\n return (\n <CollapsibleSection heading=\"Environment Variables\">\n {environmentVariables.length === 0 ? (\n <div>This server group has no environment variables</div>\n ) : (\n <dl className=\"dl-horizontal dl-narrow\">\n {environmentVariables.map((variable: any) => (\n <React.Fragment key={variable.name}>\n <dt>{variable.name}</dt>\n <dd>{variable.value}</dd>\n </React.Fragment>\n ))}\n </dl>\n )}\n </CollapsibleSection>\n );\n}\n\nexport function EcsHealthSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n if (!serverGroup.instanceCounts || serverGroup.instanceCounts.total <= 0) {\n return null;\n }\n return (\n <CollapsibleSection heading=\"Health\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Instances</dt>\n <dd>\n <HealthCounts container={serverGroup.instanceCounts} className=\"pull-left\" />\n </dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function EcsFirewallsSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const securityGroups = (serverGroup as any).securityGroups || [];\n return (\n <CollapsibleSection heading={FirewallLabels.get('Firewalls')}>\n <ul>\n {securityGroups.map((securityGroup: string) => (\n <li key={securityGroup}>{securityGroup}</li>\n ))}\n </ul>\n </CollapsibleSection>\n );\n}\n\nexport function EcsCapacitySection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const capacity = (serverGroup as any).capacity || {};\n return (\n <CollapsibleSection heading=\"Capacity\">\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Current</dt>\n <dd>{serverGroup.instances?.length || 0}</dd>\n <dt>Desired</dt>\n <dd>{capacity.desired}</dd>\n <dt>Min</dt>\n <dd>{capacity.min}</dd>\n <dt>Max</dt>\n <dd>{capacity.max}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function EcsScalingPoliciesSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const metricAlarms = (serverGroup as any).metricAlarms || [];\n return (\n <CollapsibleSection heading=\"Scaling Policies\">\n {metricAlarms.length ? (\n <ul>\n {metricAlarms.map((alarm: string) => (\n <li key={alarm}>{alarm}</li>\n ))}\n </ul>\n ) : (\n <i>There are no scaling policies assigned.</i>\n )}\n </CollapsibleSection>\n );\n}\n\nfunction getBuildLink(buildInfo: any): string {\n if (buildInfo.buildInfoUrl) {\n return buildInfo.buildInfoUrl;\n }\n if (buildInfo.jenkins) {\n return `${buildInfo.jenkins.host.replace(/\\/?$/, '/')}job/${buildInfo.jenkins.name}/${buildInfo.jenkins.number}`;\n }\n return null;\n}\n\nexport function EcsBuildInfoSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const buildInfo = (serverGroup as any).buildInfo;\n if (!buildInfo) {\n return null;\n }\n const buildLink = getBuildLink(buildInfo);\n return (\n <CollapsibleSection heading=\"Build Data\">\n <dl className=\"dl-horizontal dl-narrow\">\n {buildInfo.jenkins && (\n <>\n <dt>Job</dt>\n <dd>{buildInfo.jenkins.name}</dd>\n <dt>Build</dt>\n <dd>{buildInfo.jenkins.number}</dd>\n </>\n )}\n <dt>Package</dt>\n <dd>{buildInfo.package_name}</dd>\n <dt>Commit</dt>\n <dd>{buildInfo.commit?.substring(0, 8)}</dd>\n <dt>Version</dt>\n <dd>{buildInfo.version}</dd>\n {buildLink && (\n <>\n <dt>Build Link</dt>\n <dd>\n <a target=\"_blank\" rel=\"noopener noreferrer\" href={buildLink}>\n {buildLink}\n </a>\n </dd>\n </>\n )}\n </dl>\n </CollapsibleSection>\n );\n}\n","import type { IServerGroup } from '@spinnaker/core';\nimport { REST } from '@spinnaker/core';\n\nexport interface IEventDescription {\n createdAt: number;\n message: string;\n id: string;\n status: string;\n}\n\nexport class ServerGroupEventsReader {\n public static getEvents(serverGroup: IServerGroup): Promise<IEventDescription[]> {\n return REST('/applications')\n .path(serverGroup.app, 'serverGroups', serverGroup.account, serverGroup.name, 'events')\n .query({\n region: serverGroup.region,\n provider: serverGroup.cloudProvider,\n })\n .get();\n }\n}\n","import React from 'react';\n\nimport type { IModalComponentProps, IServerGroup } from '@spinnaker/core';\nimport { ModalBody, ModalFooter, ModalHeader, Spinner, timestamp } from '@spinnaker/core';\n\nimport type { IEventDescription } from './serverGroupEventsReader.service';\nimport { ServerGroupEventsReader } from './serverGroupEventsReader.service';\n\nexport interface IEcsServerGroupEventsModalProps extends IModalComponentProps {\n serverGroup: IServerGroup;\n}\n\ninterface IEcsServerGroupEventsModalState {\n loading: boolean;\n error: boolean;\n events: IEventDescription[];\n}\n\nexport class EcsServerGroupEventsModal extends React.Component<\n IEcsServerGroupEventsModalProps,\n IEcsServerGroupEventsModalState\n> {\n public state: IEcsServerGroupEventsModalState = { loading: true, error: false, events: [] };\n\n private mounted = false;\n private requestId = 0;\n\n public componentDidMount(): void {\n this.mounted = true;\n this.loadEvents();\n }\n\n public componentDidUpdate(previousProps: IEcsServerGroupEventsModalProps): void {\n if (previousProps.serverGroup !== this.props.serverGroup) {\n this.loadEvents();\n }\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n this.requestId++;\n }\n\n private loadEvents(): void {\n const requestId = ++this.requestId;\n this.setState({ loading: true, error: false, events: [] });\n ServerGroupEventsReader.getEvents(this.props.serverGroup).then(\n (events) => {\n if (this.mounted && requestId === this.requestId) {\n this.setState({ loading: false, error: false, events });\n }\n },\n () => {\n if (this.mounted && requestId === this.requestId) {\n this.setState({ loading: false, error: true, events: [] });\n }\n },\n );\n }\n\n public render() {\n const { dismissModal, serverGroup } = this.props;\n const { loading, error, events } = this.state;\n return (\n <>\n <ModalHeader>{`Server Group Events for ${serverGroup.name}`}</ModalHeader>\n <ModalBody>\n {loading && (\n <div className=\"horizontal center middle sp-margin-xl-yaxis\">\n <Spinner size=\"small\" />\n </div>\n )}\n {!loading && error && (\n <div className=\"text-center\">\n <p>{`There was an error loading events for ${serverGroup.name}. Please try again later.`}</p>\n </div>\n )}\n {!loading && !error && events.length === 0 && (\n <div className=\"text-center\">\n <p>{`No ECS events found for ${serverGroup.name}.`}</p>\n </div>\n )}\n {!loading &&\n !error &&\n events.map((event, index) => (\n <div key={event.id || index}>\n <p className=\"clearfix\">\n <span\n className={`label label-${\n event.status === 'Success' ? 'success' : event.status === 'Transition' ? 'info' : 'danger'\n } pull-left`}\n >\n {event.status}\n </span>\n <span className=\"label label-default pull-right\">{timestamp(event.createdAt)}</span>\n </p>\n <div>{event.message}</div>\n {index < events.length - 1 && <hr />}\n </div>\n ))}\n </ModalBody>\n <ModalFooter\n primaryActions={\n <button className=\"btn btn-primary\" onClick={dismissModal}>\n Close\n </button>\n }\n />\n </>\n );\n }\n}\n","import React from 'react';\n\nimport type { IServerGroup } from '@spinnaker/core';\nimport { ReactModal } from '@spinnaker/core';\n\nimport { EcsServerGroupEventsModal } from './EcsServerGroupEventsModal';\n\nexport interface IViewScalingActivitiesLinkProps {\n serverGroup: IServerGroup;\n}\n\nexport function EventsLink({ serverGroup }: IViewScalingActivitiesLinkProps) {\n const showEvents = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n ReactModal.show(EcsServerGroupEventsModal, { serverGroup });\n };\n\n return (\n <a href=\"#\" onClick={showEvents}>\n View Events\n </a>\n );\n}\n","import React from 'react';\n\nimport type { IServerGroupDetailsSectionProps } from '@spinnaker/core';\nimport { CollapsibleSection } from '@spinnaker/core';\n\nimport { EventsLink } from '../../events/EventsLink';\n\nexport function EcsServerGroupEventsSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"ECS Events\">\n <EventsLink serverGroup={serverGroup} />\n </CollapsibleSection>\n );\n}\n","import React from 'react';\n\nimport type { IServerGroupDetailsSectionProps } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, timestamp } from '@spinnaker/core';\n\nexport function EcsServerGroupInformationSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Server Group Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Account</dt>\n <dd>\n <AccountTag account={serverGroup.account} />\n </dd>\n <dt>Region</dt>\n <dd>{serverGroup.region}</dd>\n <dt>Created</dt>\n <dd>{serverGroup.createdTime ? timestamp(serverGroup.createdTime) : 'Unknown'}</dd>\n <dt>ECS Cluster</dt>\n <dd>{(serverGroup as any).ecsCluster}</dd>\n <dt>VPC ID</dt>\n <dd>{(serverGroup as any).vpcId}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n","import { AWSProviderSettings } from '@spinnaker/amazon';\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './ecs.help';\nimport './ecs.settings';\nimport { EcsInstanceDetails } from './instance/details/EcsInstanceDetails';\nimport { EcsLoadBalancerClusterContainer } from './loadBalancer/EcsLoadBalancerClusterContainer';\nimport { EcsLoadBalancerDetails } from './loadBalancer/details/loadBalancerDetails';\nimport { EcsTargetGroupDetails } from './loadBalancer/details/targetGroupDetails';\nimport { EcsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';\nimport './loadBalancer/targetGroup.states';\nimport ecsLogo from './logo/ecs.logo.svg';\nimport { registerEcsCloneServerGroupStage } from './pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage';\nimport { registerEcsDestroyServerGroupStage } from './pipeline/stages/destroyAsg/ecsDestroyAsgStage';\nimport { registerEcsDisableServerGroupStage } from './pipeline/stages/disableAsg/ecsDisableAsgStage';\nimport { registerEcsDisableClusterStage } from './pipeline/stages/disableCluster/ecsDisableClusterStage';\nimport { registerEcsEnableServerGroupStage } from './pipeline/stages/enableAsg/ecsEnableAsgStage';\nimport { registerEcsFindImageFromTagsStage } from './pipeline/stages/findImageFromTags/ecsFindImageFromTagStage';\nimport { registerEcsResizeServerGroupStage } from './pipeline/stages/resizeAsg/ecsResizeAsgStage';\nimport { registerEcsScaleDownClusterStage } from './pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage';\nimport { registerEcsShrinkClusterStage } from './pipeline/stages/shrinkCluster/ecsShrinkClusterStage';\nimport { EcsSecurityGroupDetails } from './securityGroup/details/EcsSecurityGroupDetails';\nimport { EcsSecurityGroupReader } from './securityGroup/securityGroup.reader';\nimport { EcsSecurityGroupTransformer } from './securityGroup/securityGroup.transformer';\nimport { EcsServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { EcsCloneServerGroupModal } from './serverGroup/configure/wizard/EcsCloneServerGroupModal';\nimport { EcsServerGroupActions } from './serverGroup/details/EcsServerGroupActions';\nimport { ecsServerGroupDetailsGetter } from './serverGroup/details/ecsServerGroupDetailsGetter';\nimport {\n EcsBuildInfoSection,\n EcsCapacitySection,\n EcsEnvironmentVariablesSection,\n EcsFirewallsSection,\n EcsHealthSection,\n EcsScalingPoliciesSection,\n EcsTaskDefinitionSection,\n} from './serverGroup/details/sections/EcsServerGroupDetailsSections';\nimport { EcsServerGroupEventsSection } from './serverGroup/details/sections/EcsServerGroupEventsSection';\nimport { EcsServerGroupInformationSection } from './serverGroup/details/sections/EcsServerGroupInformationSection';\nimport { EcsServerGroupTransformer } from './serverGroup/serverGroup.transformer';\n\nimport './logo/ecs.logo.less';\n\nexport function registerEcsProvider(): void {\n CloudProviderRegistry.registerProvider('ecs', {\n name: 'EC2 Container Service',\n adHocInfrastructureWritesEnabled: AWSProviderSettings.adHocInfraWritesEnabled,\n logo: { path: ecsLogo },\n serverGroup: {\n transformer: EcsServerGroupTransformer,\n detailsActions: EcsServerGroupActions,\n detailsGetter: ecsServerGroupDetailsGetter,\n detailsSections: [\n EcsServerGroupInformationSection,\n EcsTaskDefinitionSection,\n EcsEnvironmentVariablesSection,\n EcsHealthSection,\n EcsFirewallsSection,\n EcsCapacitySection,\n EcsScalingPoliciesSection,\n EcsBuildInfoSection,\n EcsServerGroupEventsSection,\n ],\n CloneServerGroupModal: EcsCloneServerGroupModal,\n commandBuilder: EcsServerGroupCommandBuilder,\n scalingActivitiesEnabled: false,\n skipUpstreamStageCheck: true,\n },\n loadBalancer: {\n transformer: EcsLoadBalancerTransformer,\n ClusterContainer: EcsLoadBalancerClusterContainer,\n targetGroupDetails: EcsTargetGroupDetails,\n details: EcsLoadBalancerDetails,\n },\n instance: {\n details: EcsInstanceDetails,\n },\n securityGroup: {\n transformer: EcsSecurityGroupTransformer,\n reader: EcsSecurityGroupReader,\n details: EcsSecurityGroupDetails,\n },\n });\n}\n\nexport function registerEcsPipelineStages(): void {\n registerEcsCloneServerGroupStage();\n registerEcsDestroyServerGroupStage();\n registerEcsDisableServerGroupStage();\n registerEcsDisableClusterStage();\n registerEcsEnableServerGroupStage();\n registerEcsFindImageFromTagsStage();\n registerEcsResizeServerGroupStage();\n registerEcsScaleDownClusterStage();\n registerEcsShrinkClusterStage();\n}\n\nregisterEcsProvider();\nregisterEcsPipelineStages();\nDeploymentStrategyRegistry.registerProvider('ecs', ['redblack']);\n","export default \"data:image/svg+xml,%3Csvg%20id%3D%22Layer_1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%3E%20%20%3Ctitle%3ECompute%3C%2Ftitle%3E%20%20%3Cg%3E%20%20%20%20%3Cpolygon%20points%3D%2219.64%2022.51%2016%2024.32%2016%2075.68%2019.64%2077.49%2033.98%2051.07%2019.64%2022.51%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2230.72%2031.78%2036.08%2024.19%2060.1%2034.87%2054.5%2035.76%2030.72%2031.78%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2226.56%2068.77%2032.46%2076.88%2060.1%2064.95%2054.76%2064.12%2026.56%2068.77%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2228.12%2075.5%2019.64%2077.49%2019.64%2022.51%2028.12%2024.44%2028.12%2075.5%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2223.66%2020.5%2028.12%2018.27%2036.52%2053.56%2028.12%2081.73%2023.66%2079.5%2023.66%2020.5%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2254.46%2064.08%2060.1%2064.95%2065.26%2050.58%2060.1%2034.87%2054.46%2035.76%2054.46%2064.08%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2236.8%2079.28%2028.12%2081.73%2028.12%2018.27%2036.8%2020.73%2036.8%2079.28%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.01%2063.84%2028.12%2070.88%2028.12%2081.73%2066.01%2071.03%2066.01%2063.84%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.08%2036%2028.12%2028.79%2028.12%2018.27%2066.08%2029.04%2066.08%2036%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2260.1%2027.34%2066.19%2029.02%2066.19%2071.03%2060.1%2072.7%2060.1%2027.34%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2044.45%2067.7%2045.22%2061.94%2044.83%2078.42%2031.55%2084%2044.45%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2044.83%2078.42%2043.9%2078.42%2031.55%2061.94%2034.22%2061.94%2044.83%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2026.96%2071.62%2043.22%2054.31%2044.32%2046.43%2043.79%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2042.37%2063.13%2026.96%2046.43%2030.87%2046.43%2043.79%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2055.39%2084%2055.77%2078.42%2068.67%2061.94%2066%2061.94%2055.39%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2071.62%2057.01%2063.13%2073.26%2046.43%2069.36%2046.43%2056.43%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2063.13%2057.86%2071.62%2057.01%2054.31%2055.9%2046.43%2056.43%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2055.77%2067.7%2055.01%2061.94%2055.39%2078.42%2056.33%2084%2055.77%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2043.9%2084%2044.45%2084%2033.22%2078.42%2031.55%2078.42%2043.9%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2043.22%2063.13%2042.37%2063.13%2026.96%2071.62%2029.51%2071.62%2043.22%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2056.33%2084%2055.77%2084%2067%2078.42%2068.67%2078.42%2056.33%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2057.01%2063.13%2057.86%2063.13%2073.26%2071.62%2070.72%2071.62%2057.01%22%20fill%3D%22%23f58536%22%2F%3E%20%20%3C%2Fg%3E%3C%2Fsvg%3E\"","import React from 'react';\nimport { Registry } from '@spinnaker/core';\n\nimport { EcsServerGroupStepLabel } from '../common/EcsServerGroupStepLabel';\nimport { EcsCloneServerGroupStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsCloneServerGroupStage() {\n Registry.pipeline.registerStage({\n provides: 'cloneServerGroup',\n cloudProvider: 'ecs',\n component: EcsCloneServerGroupStageConfig,\n executionStepLabelComponent: (props) =>\n React.createElement(EcsServerGroupStepLabel, { action: 'Clone Server Group', useSource: true, ...props }),\n accountExtractor: (stage) => [stage.context.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'targetCluster', fieldLabel: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'region' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import React from 'react';\nimport { Registry } from '@spinnaker/core';\n\nimport { EcsServerGroupStepLabel } from '../common/EcsServerGroupStepLabel';\nimport { EcsDestroyAsgStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsDestroyServerGroupStage() {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n alias: 'destroyAsg',\n cloudProvider: 'ecs',\n component: EcsDestroyAsgStageConfig,\n executionStepLabelComponent: (props) =>\n React.createElement(EcsServerGroupStepLabel, { action: 'Destroy Server Group', ...props }),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import React from 'react';\nimport { Registry } from '@spinnaker/core';\n\nimport { EcsServerGroupStepLabel } from '../common/EcsServerGroupStepLabel';\nimport { EcsDisableAsgStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsDisableServerGroupStage() {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'ecs',\n component: EcsDisableAsgStageConfig,\n executionStepLabelComponent: (props) =>\n React.createElement(EcsServerGroupStepLabel, { action: 'Disable Server Group', ...props }),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import { Registry } from '@spinnaker/core';\n\nimport { EcsDisableClusterStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsDisableClusterStage() {\n Registry.pipeline.registerStage({\n provides: 'disableCluster',\n cloudProvider: 'ecs',\n component: EcsDisableClusterStageConfig,\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingEnabledServerGroups',\n fieldLabel: 'Keep [X] enabled Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import React from 'react';\nimport { Registry } from '@spinnaker/core';\n\nimport { EcsServerGroupStepLabel } from '../common/EcsServerGroupStepLabel';\nimport { EcsEnableAsgStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsEnableServerGroupStage() {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'ecs',\n component: EcsEnableAsgStageConfig,\n executionStepLabelComponent: (props) =>\n React.createElement(EcsServerGroupStepLabel, { action: 'Enable Server Group', ...props }),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { EcsFindImageFromTagsExecutionDetails } from './EcsFindImageFromTagsExecutionDetails';\nimport { EcsFindImageFromTagsStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsFindImageFromTagsStage() {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'ecs',\n component: EcsFindImageFromTagsStageConfig,\n executionDetailsSections: [EcsFindImageFromTagsExecutionDetails, ExecutionDetailsTasks],\n validators: [{ type: 'requiredField', fieldName: 'imageLabelOrSha' }],\n });\n}\n","import React from 'react';\nimport { Registry } from '@spinnaker/core';\n\nimport { EcsServerGroupStepLabel } from '../common/EcsServerGroupStepLabel';\nimport { EcsResizeAsgStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsResizeServerGroupStage() {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n alias: 'resizeAsg',\n cloudProvider: 'ecs',\n component: EcsResizeAsgStageConfig,\n executionStepLabelComponent: (props) =>\n React.createElement(EcsServerGroupStepLabel, { action: 'Resize Server Group', ...props }),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","import { Registry } from '@spinnaker/core';\n\nimport { EcsScaleDownClusterStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsScaleDownClusterStage() {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'ecs',\n component: EcsScaleDownClusterStageConfig,\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n}\n","import { Registry } from '@spinnaker/core';\n\nimport { EcsShrinkClusterStageConfig } from '../common/EcsStageConfigs';\n\nexport function registerEcsShrinkClusterStage() {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'ecs',\n component: EcsShrinkClusterStageConfig,\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":["helpContents","Object","keys","forEach","key","HelpContentsRegistry","register","IECSProviderSettings","SETTINGS","providers","ecs","matchesInstance","candidate","instanceId","id","matchesScope","instance","account","region","targetGroupNames","targetGroups","Array","isArray","map","targetGroup","targetGroupName","name","filter","Boolean","extractHealthMetrics","app","summary","details","_a","summaryHealth","isStandalone","health","healthMetrics","length","metric","type","state","latest","find","loadBalancers","flatMap","loadBalancer","port","healthCheckPort","healthCheckPath","healthCheckProtocol","toLowerCase","addTargetGroupHealthDetails","data","async","loadInstance","params","_b","lookup","serverGroups","accountId","serverGroup","instances","vpcId","targetSummary","isDisabled","disabledSummary","findInstance","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","baseIpAddress","publicDnsName","privateIpAddress","networkInterface","privateIpv4Address","privateAddress","ipv6Address","cloudProvider","provider","NetworkAddress","address","label","hrefAddress","includes","React","createElement","Fragment","href","target","rel","CopyToClipboard","text","toolTip","resetToOriginal","resetProvider","EcsInstanceDetailsComponent","Component","constructor","super","arguments","this","instanceIdNotFound","loading","activeRequestId","dataReady","isUnmounted","componentDidMount","props","Promise","resolve","all","ready","then","retrieveInstance","onRefresh","unsubscribeFromRefresh","closeDetails","componentDidUpdate","previousProps","previous","getInstanceParams","current","componentWillUnmount","call","$stateParams","stateParams","stateService","go","allowModalToStayOpen","location","clearInstance","requestId","setState","removeLastItem","render","_c","_d","environment","moniker","className","InstanceDetailsHeader","healthState","standalone","CollapsibleSection","heading","defaultExpanded","InstanceInformation","availabilityZone","zone","placement","instanceType","launchTime","imageId","LabeledValue","value","InstanceStatus","metricTypes","VpcTag","subnetId","SubnetTag","ConsoleOutputLink","InstanceLinks","application","EcsInstanceDetails","withRouter","EcsTargetGroup","showServerGroups","loadBalancerName","emptyInstanceCounts","up","down","starting","succeeded","failed","unknown","outOfService","UISrefActive","class","UISref","to","sgName","LoadBalancerServerGroup","cluster","instanceCounts","showInstances","EcsLoadBalancerClusterContainer","shouldComponentUpdate","nextProps","isEqual","g","serverGroupsDiffer","t","targetGroupsDiffer","TargetGroups","EcsListener","getTargetGroupNameFromArn","arn","parts","split","protocol","defaultActions","listener","style","paddingLeft","action","i","targetGroupArn","forwardConfig","tg","redirectConfig","statusCode","fixedResponseConfig","authenticateOidcConfig","clientId","authenticateCognitoActionConfig","userPoolDomain","EcsLoadBalancerDetails","refreshListenerUnsubscribe","getDataSource","extractLoadBalancer","test","CloseButton","Spinner","size","timestamp","createdTime","AccountTag","loadBalancerType","ipAddressType","availabilityZones","az","dnsname","listeners","index","securityGroups","sg","subnets","subnet","EcsTargetGroupDetails","extractTargetGroup","targetType","toUpperCase","loadBalancerNames","lb","healthCheckTimeoutSeconds","healthCheckIntervalSeconds","healthyThresholdCount","unhealthyThresholdCount","matcher","httpCode","attributes","EcsLoadBalancerTransformer","normalizeLoadBalancer","targetGroupServices","tgServiceMap","ECS_TARGET_GROUP_DETAILS_STATE","url","squash","views","component","$type","pageTitleDetails","title","nameParam","accountParam","regionParam","registerApplicationState","applicationStateProvider","addInsightDetailState","EcsServerGroupStepLabel","step","useSource","serverGroupName","context","source","ADD_TO_LOAD_BALANCER","scaleActions","val","resizeTypes","useEcsDefaults","defaults","healthOverride","useEffect","stage","updateStageField","changes","cloudProviderType","defaultCredentials","defaultRegion","defaultRegions","credentials","regions","isNew","interestingHealthProviderNames","platformHealthOnlyShowOverride","platformHealthOnly","applyEcsDefaults","pluralize","str","Number","EcsClusterSelector","accounts","setAccounts","useState","active","AccountService","listAccounts","loadedAccounts","useEcsAccounts","clusterField","pipeline","showAllRegions","singleRegion","stageFieldUpdated","strategy","AccountRegionClusterSelector","onComponentUpdate","EcsTargetSelect","StageConfigField","TargetSelect","model","options","StageConstants","TARGET_LIST","onChange","EcsHealthOverride","PlatformHealthOverride","platformHealthType","EcsServerGroupTargetStageConfig","EcsDestroyAsgStageConfig","EcsDisableAsgStageConfig","EcsEnableAsgStageConfig","EcsDisableClusterStageConfig","preferLargerOverNewer","remainingEnabledServerGroups","min","event","required","width","EcsFindImageFromTagsStageConfig","imageLabelOrSha","EcsScaleDownClusterStageConfig","allowScaleDownActive","remainingFullSizeServerGroups","checked","EcsShrinkClusterStageConfig","allowDeleteActive","retainLargerOverNewer","shrinkToSize","EcsCloneServerGroupStageConfig","forceUpdate","setCounter","counter","useForceUpdate","capacity","desired","max","suspendedProcesses","addToLoadBalancerSuspended","useSourceCapacity","setUseSourceCapacity","HelpField","field","disabled","updateCapacity","process","DeploymentStrategySelector","command","labelColumns","fieldColumns","onFieldChange","set","setNestedStageField","onStrategyChange","EcsResizeAsgStageConfig","resizeType","targetHealthyDeployPercentage","updateResizeType","scaleNum","scalePct","nextResizeType","helpKey","EcsFindImageFromTagsExecutionDetails","ExecutionDetailsSection","StageFailureMessage","message","failureMessage","amiDetails","image","imageName","EcsSecurityGroupDetailsComponent","loadRequestId","showNotFound","autoClose","notFound","securityGroup","loadSecurityGroup","resolvedSecurityGroup","getSecurityGroupReader","getSecurityGroupDetails","isEmpty","getVpcReader","getVpcName","vpcName","applicationSecurityGroup","getApplicationSecurityGroup","catch","dataSource","prevProps","getCoordinatesKey","join","securityGroupReader","services","vpcReader","VpcReader","FirewallLabels","get","ipRules","buildIpRulesModel","securityGroupRules","buildSecurityGroupRulesModel","onClick","CloudProviderLogo","height","accountName","description","IPRangeRules","rule","rules","portRange","startPort","endPort","contextType","DeckRuntimeContext","EcsSecurityGroupDetails","EcsSecurityGroupReader","resolveIndexedSecurityGroup","indexedSecurityGroups","container","securityGroupId","EcsSecurityGroupTransformer","normalizeSecurityGroup","EcsServerGroupConfigurationService","configureUpdateCommand","backingData","filtered","launchTypes","networkModes","findUpstreamImages","visited","refId","result","push","fromContext","stageId","requisiteStageRefIds","next","concat","findTriggerImages","triggers","trigger","fromTrigger","repository","organization","registry","tag","buildNewServerGroupCommand","getAvailabilityZonesForAccountAndRegion","getCredentialsKeyedByAccount","launchType","healthCheckType","selectedProvider","iamRole","dockerImageCredentialsSecret","subnetType","securityGroupNames","healthCheckGracePeriodSeconds","placementConstraints","placementStrategyName","taskDefinitionArtifact","useTaskDefinitionArtifact","placementStrategySequence","serviceDiscoveryAssociations","ecsClusterName","copySourceScalingPoliciesAndActions","preferSourceCapacity","enableDeploymentCircuitBreaker","viewState","useAllImageSelection","useSimpleCapacity","usePreferredZones","mode","disableStrategySelection","dirty","EcsServerGroupCommandBuilder","configurationService","buildServerGroupCommandFromExisting","stack","ecsCluster","buildNewServerGroupCommandForPipeline","contextImages","stages","requiresTemplateSelection","overrides","currentStage","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","_","cloneDeep","availabilityZonesByRegion","zones","docker","upstreamImages","matchingImage","otherImage","pattern","reconcileUpstreamImages","instanceProfile","disableImageSelection","submitButtonLabel","templatingEnabled","existingPipelineCluster","assign","buildUpdateServerGroupCommand","asgs","asgName","asg","buildEcsImageId","reference","normalizeEcsDockerImage","EcsClusterReader","listClusters","REST","describeClusters","path","IamRoleReader","listRoles","MetricAlarmReader","listMetricAlarms","placementStrategies","AdvancedSettings","iamRoles","from","Set","secrets","updateConstraint","constraints","constraint","constraintIndex","secret","platformVersion","expression","_constraint","colSpan","MapEditor","allowEmpty","keyLabel","dockerLabels","valueLabel","environmentVariables","tags","color","fieldValue","BasicSettings","credentialsKeyedByAccount","clusters","ecsClusters","AccountSelectInput","readOnly","readOnlyFields","RegionSelectInput","freeFormDetails","_updatedCommand","hideClusterNamePreview","NameUtils","getClusterName","Container","getIdToImageMap","imageIdToDescription","Map","images","e","getEmptyImageDescription","updateDockerRegistryAccount","newAccount","selectedDockerAccount","dockerImages","DockerImageReader","findImages","count","ecsImages","pushTargetGroupMapping","targetMaps","targetGroupMappings","containerName","containerPort","updateContainerMappingImage","newImage","newImageDescription","imageDescription","updateComputeUnits","newComputeUnits","computeUnits","updateReservedMemory","newReservedMemory","reservedMemory","updateTargetGroupMappingTargetGroup","newTargetGroup","currentMappings","updateDirtyTargetGroups","updateTargetGroupMappingPort","targetPort","removeTargetGroupMapping","splice","cmd","defaultContainer","containerMappings","defaultTargetGroup","loadBalancedContainer","uniqWith","dockerRegistryAccounts","targetGroupsAvailable","uniq","mapping","targetGroupMapping","configureCommand","nextState","dirtyTagetGroups","dockerRegistryAccountOptions","dockerImageOptions","msg","dirtyTargetGroupList","dirtyTargetGroupSection","newTargetGroupMapping","Alert","targetGroupInputs","TetheredSelect","inputProps","placeholder","toString","clearable","valueAsNumber","ContainerSettings","EcsCapacityProvider","getAvailableCapacityProviders","available","availableCapacityProviders","persisted","capacityProviderStrategy","capacityProvider","getDefaultCapacityProviderStrategy","defaultCapacityProviderStrategy","getCapacityProviderStrategy","useDefaultCapacityProviders","addCapacityProviderStrategy","base","weight","removeCapacityProviderStrategy","updateCapacityProviderName","targetCapacityProviderName","customCapacityProviders","updateCapacityProviderBase","targetCapacityProviderBase","updateCapacityProviderWeight","targetCapacityProviderWeight","updateCapacityProviderType","targetCapacityProviderType","capacityProviderLoadedFlag","activeCapacityProviderIndex","commandState","currentState","strategyChanged","customDirtyCapacityProviders","defaultDirtyCapacityProviders","defaulCapacityProviders","capacityProviderNames","defaultCPError","dirtyCapacityProviderList","dirtyCapacityProviderSection","capacityProviderInputs","onFocus","newCapacityProviderStrategy","HorizontalScalingSettings","useCapacityProviders","computeOption","help","logDrivers","LoggingSettings","logDriver","driver","logOptions","EcsNetworking","_e","updateNetworkMode","newNetworkMode","updatedNetworkMode","networkMode","subnetTypesAvailable","subnetTypes","updateSecurityGroups","newSecurityGroups","updatedSecurityGroups","updateSubnetTypes","newSubnetTypes","updatedSubnetTypes","subnetTypeChanged","securityGroupsAvailable","updateAssociatePublicIpAddress","usePublicIp","associatePublicIpAddress","defaultSubnetTypes","availableSubnetTypes","persistedSubnetTypes","purpose","some","networkModesAvailable","subnetTypeOptions","multi","securityGroupsOptions","awsVpcOptions","NetworkingSettings","ServiceDiscovery","normalizeContainerNames","associations","normalized","association","getNameToRegistryMap","displayNameToRegistry","serviceDiscoveryRegistriesAvailable","displayName","mergeRegistries","registries","values","getEmptyRegistry","updateServiceDiscoveryRegistry","newRegistry","newServiceDiscoveryRegistry","currentAssociations","updateServiceDiscoveryPort","updateServiceDiscoveryContainerName","targetContainerName","pushServiceDiscoveryAssociation","registryAssociations","removeServiceDiscoveryAssociations","serviceDiscoveryRegistries","removeServiceDiscoveryAssociation","registriesAvailable","serviceDiscoveryInputs","newServiceDiscoveryAssociation","ServiceDiscoverySettings","TaskDefinition","excludedArtifactTypePatterns","ArtifactTypePatterns","KUBERNETES","DOCKER_IMAGE","FRONT50_PIPELINE_TEMPLATE","onExpectedArtifactSelected","expectedArtifactId","selectedArtifact","artifactId","taskDefArtifact","onArtifactEdited","artifact","newArtifact","pushMapping","conMaps","updateContainerMappingName","newName","updateTargetGroupMappingContainer","targetContainer","removeMapping","updateEvaluateTaskDefArtifactFlag","evaluateTaskDefinitionArtifactExpressions","taskDefArtifactAccount","taskDefinitionArtifactAccount","mappingInputs","StageArtifactSelectorDelegate","groupClassName","CheckboxInput","TaskDefinitionSettings","validInteger","isFinite","isInteger","usableCapacityProviderStrategyItem","item","hasRowErrors","errors","error","isExpressionLanguage","validateTargetGroupMappings","validateEcsBasicSettings","isStackPattern","isDetailPattern","validateEcsTaskDefinition","mappingErrors","validateEcsContainer","validateEcsServiceDiscovery","validateEcsCapacity","validationErrors","defaultStrategy","every","strategyErrors","itemErrors","validateEcsServerGroup","EcsWizardPageValidation","validate","validator","Children","only","children","PlacementStrategyService","getPredefinedStrategy","strategyName","getAzBalancedSpreadStrategy","getAzBalancedMemoryBinPackStrategy","getBinPackMemoryStrategy","getAzBalancedCpuBinPackStrategy","getBinPackCpuStrategy","getOneTaskPerHostStrategy","SecretReader","listSecrets","ServiceDiscoveryReader","listServiceDiscoveryRegistries","EcsCloneServerGroupModalComponent","configureRequest","formik","unmounted","ecsClusterReader","iamRoleReader","metricAlarmReader","placementStrategyService","secretReader","onTaskComplete","clearApplicationRefreshSubscription","applicationRefreshUnsubscribe","onNextRefresh","onApplicationRefresh","refresh","taskMonitor","cloneStage","task","execution","newServerGroupName","transitionTo","templateSelected","ensureCommandShape","loaded","imageQuery","request","loadBackingData","configuredCommand","attachEventHandlers","syncCommand","updateCommand","setFieldValue","clusterChanged","credentialsChanged","regionChanged","placementStrategyNameChanged","submit","closeModal","serverGroupWriter","cloneServerGroup","TaskMonitor","onDismiss","dismissModal","show","runtimeServices","ReactModal","EcsCloneServerGroupModal","dialogClassName","safe","promise","fallback","query","q","capacityProviderDetails","metricAlarms","loadBalancerList","subnetList","iamRoleList","clusterList","capacityProviderList","metricAlarmList","securityGroupData","secretList","serviceDiscoveryRegistryList","imageList","normalizeImages","getClusterNames","getIamRoles","getSecurityGroupNames","getSecrets","getServiceDiscoveryRegistries","getSubnetTypes","getTargetGroups","reconcileLocation","changedCommand","getMoniker","selectedRegion","commandImages","uniqBy","matchesAccount","matchesRegion","roleNames","role","subnetPurpose","fromLoadBalancers","regionLoadBalancer","fromCommand","clusterName","capacityProviders","setValues","DeployInitializer","onTemplateSelected","WizardModal","initialValues","nextIdx","wizard","configureFormikCommand","updateFormikCommand","WizardPage","order","innerRef","ref","defaultProps","noop","validateEcsResizeValues","_EcsResizeServerGroupModal","close","verified","reason","resizeServerGroup","capacityError","TaskMonitorWrapper","monitor","SpinFormik","onSubmit","ModalClose","dismiss","Modal","Header","Title","Body","FormikFormField","input","NumberInput","layout","touched","ValidationMessage","MinMaxDesiredChanges","names","showHelpDetails","TaskReason","Footer","UserVerification","onValidChange","isValid","EcsResizeServerGroupModal","coordinate","getEcsRollbackTargets","appName","candidateApp","sort","a","b","localeCompare","validateEcsRollbackValues","eligibleTargetNames","restoreServerGroupName","targetHealthyRollbackPercentage","_EcsRollbackServerGroupModal","rollbackContext","rollbackServerGroupName","rollbackType","rollbackServerGroup","targets","fastField","ReactSelectInput","stringOptions","EcsRollbackServerGroupModal","actionLabels","destroy","present","progressive","disable","enable","EcsServerGroupActions","useDeckRuntimeServices","AWSProviderSettings","adHocInfraWritesEnabled","showEntityTags","feature","entityTags","entityTagTargets","ClusterTargetBuilder","buildClusterTargets","enableLocked","runningTasks","confirmAction","confirmationModalParams","header","buttonText","taskMonitorConfig","submitMethod","destroyServerGroup","disableServerGroup","enableServerGroup","askForReason","ServerGroupWarningMessageService","addDestroyWarningMessage","addDisableWarningMessage","ConfirmationModalService","confirm","Dropdown","Toggle","Menu","ManagedMenuItem","resource","Tooltip","AddEntityTagLinks","entityType","ownerOptions","onUpdate","EcsServerGroupTransformer","addComparator","alarm","comparisonOperator","comparator","addAdjustmentAttributes","policyOrStepAdjustment","operator","scalingAdjustment","absAdjustment","Math","abs","transformScalingPolicy","policy","view","upperBoundSorter","metricIntervalUpperBound","lowerBoundSorter","metricIntervalLowerBound","alarms","stepAdjustments","sa","sorter","normalizeServerGroupDetails","scalingPolicies","normalizeServerGroup","listVpcs","vpc","addVpcNameToServerGroup","vpcs","match","convertServerGroupCommandToDeployConfiguration","vpcLoadBalancers","ecsServerGroupDetailsGetter","serverGroupInfo","Observable","observer","cancelled","ServerGroupReader","getServerGroup","complete","merged","EcsTaskDefinitionSection","taskDefinition","taskName","containerImage","cpuUnits","memoryReservation","memoryLimit","EcsEnvironmentVariablesSection","variable","EcsHealthSection","total","HealthCounts","EcsFirewallsSection","EcsCapacitySection","EcsScalingPoliciesSection","EcsBuildInfoSection","buildInfo","buildLink","buildInfoUrl","jenkins","host","replace","number","getBuildLink","package_name","commit","substring","version","ServerGroupEventsReader","getEvents","EcsServerGroupEventsModal","events","mounted","loadEvents","ModalHeader","ModalBody","status","createdAt","ModalFooter","primaryActions","EventsLink","preventDefault","EcsServerGroupEventsSection","EcsServerGroupInformationSection","registerEcsProvider","CloudProviderRegistry","registerProvider","adHocInfrastructureWritesEnabled","logo","transformer","detailsActions","detailsGetter","detailsSections","CloneServerGroupModal","commandBuilder","scalingActivitiesEnabled","skipUpstreamStageCheck","ClusterContainer","targetGroupDetails","reader","registerEcsPipelineStages","Registry","registerStage","provides","executionStepLabelComponent","accountExtractor","validators","fieldName","fieldLabel","alias","configAccountExtractor","executionDetailsSections","ExecutionDetailsTasks","css","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[62]}