@spinnaker/ecs 2026.2.2 → 2026.3.0

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 CHANGED
@@ -1,2 +1,2 @@
1
- import*as e from"angular";import{module as t}from"angular";import{HelpContentsRegistry as n,SETTINGS as a,REST as r,CloudProviderRegistry as i,ConfirmationModalService as s,InstanceWriter as o,RecentHistoryService as l,InstanceReader as c,LoadBalancerServerGroup as d,Spinner as p,CollapsibleSection as u,timestamp as m,AccountTag as g,APPLICATION_STATE_PROVIDER as v,Registry as h,AccountService as f,StageConstants as y,PipelineTemplates as b,SECURITY_GROUP_READER as S,MANAGED_RESOURCE_DETAILS_INDICATOR as k,FirewallLabels as C,LOAD_BALANCER_READ_SERVICE as w,CACHE_INITIALIZER_SERVICE as D,SERVER_GROUP_COMMAND_REGISTRY_PROVIDER as E,SubnetReader as G,NameUtils as A,INSTANCE_TYPE_SERVICE as T,SERVER_GROUP_WRITER as N,OVERRIDE_REGISTRY as P,STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT as I,TaskMonitor as z,ModalWizard as x,TetheredSelect as R,HelpField as M,withErrorBoundary as $,ArtifactTypePatterns as B,StageArtifactSelectorDelegate as F,StageConfigField as L,CheckboxInput as O,ServerGroupWarningMessageService as U,ServerGroupReader as q,DeploymentStrategyRegistry as H}from"@spinnaker/core";import V from"@uirouter/angularjs";import _ from"angular-ui-bootstrap";import j,{isEqual as W,clone as Z,has as K,flatten as J,keys as Y,chain as X,find as Q,intersection as ee,xor as te,extend as ne,some as ae,uniqWith as re,defaults as ie,filter as se,isEmpty as oe}from"lodash";import{getAllTargetGroups as le,applyHealthCheckInfoToTargetGroups as ce,VpcReader as de}from"@spinnaker/amazon";import*as pe from"react";import ue from"react";import{UISrefActive as me,UISref as ge}from"@uirouter/react";import{DockerImageReader as ve}from"@spinnaker/docker";import{Alert as he}from"react-bootstrap";import{react2angular as fe}from"react2angular";import{$log as ye}from"ngimport";const be={bindings:{action:"&",isValid:"&",cancel:"&",account:"=?",verification:"=?"},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> \x3c!-- Allows form submission via enter keypress--\x3e\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 ',controller:()=>{}},Se="spinnaker.ecs.footer";t(Se,[]).component("ecsFooter",be);const ke="spinnaker.ecs.common";t(ke,[Se]);const Ce={"ecs.loadBalancer.targetGroup":"<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>","ecs.serverGroup.clusterName":"<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>","ecs.stage.findImageByTags.labelOrSha":"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>","ecs.serverGroup.stack":"<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>","ecs.serverGroup.detail":"<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>","ecs.capacity.overwrite":"<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>","ecs.capacity.desired":"<p>The starting number of containers, before any autoscaling happens.</p>","ecs.capacity.minimum":"<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>","ecs.capacity.maximum":"<p>The maximal number of containers you can reach as a result of autoscaling.</p>","ecs.capacity.reserved.computeUnits":"<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>","ecs.capacity.reserved.memory":"<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>","ecs.loadbalancing.targetPort":"<p>The port on which your application is listening for incoming traffic</p>","ecs.iamrole":"<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>","ecs.dockerimage":"Docker image for your container, such as nginx:latest","ecs.dockerimagecredentials":"<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>","ecs.placementConstraints":'<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>',"ecs.placementConstraintType":"<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>","ecs.placementConstraintExpression":'<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>',"ecs.placementStrategy":'<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>',"ecs.platformVersion":"<p>Defaults to the latest platform version.</p>","ecs.enableDeploymentCircuitBreaker":"<p>Enable circuit breaker for the ECS service.</p>","ecs.capacity.copySourceScalingPoliciesAndActions":"<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>","ecs.launchtype":"<p>Launch service tasks on your own EC2 instances or on Fargate.</p>","ecs.healthgraceperiod":"<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>","ecs.publicip":"<p>Assign a public IP address to each task.</p>","ecs.networkMode":"<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>","ecs.subnet":"<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>","ecs.securityGroups":"<p>The security group(s) name(s) your containers are deployed with.</p>","ecs.dockerLabels":'<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>',"ecs.logDriver":'<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>',"ecs.logOptions":'<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>',"ecs.taskDefinition":'<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>',"ecs.taskDefinitionArtifact":"<p>The artifact containing the ECS Task Definition.</p>","ecs.containerMappings":"<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>","ecs.containerMappingName":'<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>',"ecs.containerMappingImage":"<p>The container image the named container should run.</p>","ecs.targetGroupMappings":"<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>","ecs.loadBalancedContainer":"<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>","ecs.tags":"<p>The tags to apply to the task definition and the service","ecs.environmentVariables":"<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>","ecs.serviceDiscovery":"<p>The AWS Cloud Map service discovery registries to assign to this service</p>","ecs.serviceDiscoveryRegistry":"<p>The AWS Cloud Map service to use for service discovery registration</p>","ecs.serviceDiscoveryContainerPort":"<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","ecs.serviceDiscoveryContainerName":"<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>","ecs.computeOptions":'<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>',"ecs.capacityProviderStrategy":'<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>',"ecs.capacityProviderName":"<p>The short name of the capacity provider.</p>","ecs.capacityProviderBase":"<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>","ecs.capacityProviderWeight":"<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>","ecs.evaluateExpression":'<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>'};Object.keys(Ce).forEach(e=>n.register(e,Ce[e]));const we=a.providers.ecs||{};we&&(we.resetToOriginal=a.resetProvider("ecs"));const De="spinnaker.ecs.ecsCluster.read.service";t(De,[]).service("ecsClusterReader",class{listClusters(){return r("/ecs/ecsClusters").get()}describeClusters(e,t){return null!=e&&null!=t?r("/ecs/ecsClusterDescriptions").path(e).path(t).get():{}}});const Ee="spinnaker.ecs.iamRole.read.service";t(Ee,[]).service("iamRoleReader",class{listRoles(e){return r("/roles").path(e).get()}});const Ge="spinnaker.ecs.instance.details.controller";t(Ge,[V,_]).controller("ecsInstanceDetailsCtrl",["$scope","$state","$uibModal","instance","app","moniker","environment","$q","overrides",function(e,t,n,r,d,p,u,m,g){e.detailsTemplateUrl=i.getValue("ecs","instance.detailsTemplateUrl"),e.state={loading:!0,standalone:d.isStandalone,instancePort:j.get(d,"attributes.instancePort")||a.defaultInstancePort||80},e.application=d,e.moniker=p,e.environment=u;const v={cloudProvider:"ecs"};function h(){const t={};let n,a,i,s,o,p;return d.serverGroups?(d.serverGroups.data.some(function(e){return e.instances.some(function(l){if(l.id===r.instanceId)return n=l,a=e.loadBalancers,i=e.targetGroup,s=e.account,o=e.region,p=e.vpcId,t.serverGroup=e.name,t.vpcId=e.vpcId,!0})}),n||(d.loadBalancers.data.some(function(e){return e.instances.some(function(t){if(t.id===r.instanceId)return n=t,a=[e.name],s=e.account,o=e.region,p=e.vpcId,!0})||e.targetGroup.some(function(t){return t.instances.some(function(a){if(a.id===r.instanceId)return n=a,t=t.name,s=e.account,o=e.region,p=e.vpcId,!0})})}),n||d.loadBalancers.data.some(function(e){return e.serverGroups.some(function(t){return!!t.isDisabled&&t.instances.some(function(t){if(t.id===r.instanceId)return n=t,a=[e.name],s=e.account,o=e.region,p=e.vpcId,!0})})||e.targetGroup.some(function(t){t.serverGroups.some(function(t){return!!t.isDisabled&&t.instances.some(function(t){if(t.id===r.instanceId)return n=t,a=[e.name],s=e.account,o=e.region,p=e.vpcId,!0})})})}))):(n={},a=[],i=[],s=r.account,o=r.region),n&&s&&o?(n.account=s,t.account=s,t.region=o,l.addExtraDataToLatest("instances",t),c.getInstanceDetails(s,o,r.instanceId).then(t=>{if(!e.$$destroyed){if(e.state.loading=!1,function(t,n){d.isStandalone&&(t.health=n.health),t.health=t.health||[];const a=t.health.filter(function(e){return"Ecs"!==e.type||"Unknown"!==e.state}),r=le(d.loadBalancers.data);ce(a,r,t.account),n.health&&a.forEach(function(e){const t=n.health.filter(function(t){return t.type===e.type});t.length&&j.defaults(e,t[0])}),e.healthMetrics=a}(n,t),e.instance=j.defaults(t,n),e.instance.account=s,e.instance.region=o,e.instance.vpcId=p,e.instance.loadBalancers=a,e.instance.targetGroup=i,e.instance.networkInterfaces){const t=e.instance.networkInterfaces.filter(e=>!1===e.attachment.deleteOnTermination);t.length&&(e.instance.permanentIps=t.map(e=>e.privateIpAddress))}e.baseIpAddress=t.publicDnsName||t.privateIpAddress,g.instanceDetailsLoaded&&g.instanceDetailsLoaded()}},f)):(n||(e.instanceIdNotFound=r.instanceId,e.state.loading=!1),m.when(null))}function f(){e.$$destroyed||(d.isStandalone?(e.state.loading=!1,e.instanceIdNotFound=r.instanceId,e.state.notFoundStandalone=!0,l.removeLastItem("instances")):t.go("^",{allowModalToStayOpen:!0},{location:"replace"}))}this.canRegisterWithDiscovery=function(){const t=(e.instance.health||[]).filter(function(e){return"Discovery"===e.type});return!!t.length&&"OutOfService"===t[0].state},this.terminateInstance=function(){const n=e.instance,a={application:d,title:"Terminating "+n.instanceId,onTaskComplete:function(){t.includes("**.instanceDetails",{instanceId:n.instanceId})&&t.go("^")}};s.confirm({header:"Really terminate "+n.instanceId+"?",buttonText:"Terminate "+n.instanceId,account:n.account,taskMonitorConfig:a,submitMethod:function(){return o.terminateInstance(n,d,v)}})},this.terminateInstanceAndShrinkServerGroup=function(){const n=e.instance,a={application:d,title:"Terminating "+n.instanceId+" and shrinking server group",onTaskComplete:function(){t.includes("**.instanceDetails",{instanceId:n.instanceId})&&t.go("^")}};s.confirm({header:"Really terminate "+n.instanceId+" and shrink "+n.serverGroup+"?",buttonText:"Terminate "+n.instanceId+" and shrink "+n.serverGroup,account:n.account,taskMonitorConfig:a,submitMethod:function(){return o.terminateInstanceAndShrinkServerGroup(n,d,v)}})},this.enableInstanceInDiscovery=function(){const t=e.instance,n={application:d,title:"Enabling "+t.instanceId+" in discovery"};s.confirm({header:"Really enable "+t.instanceId+" in discovery?",buttonText:"Enable "+t.instanceId,account:t.account,taskMonitorConfig:n,submitMethod:function(){return o.enableInstanceInDiscovery(t,d,v)}})},this.disableInstanceInDiscovery=function(){const t=e.instance,n={application:d,title:"Disabling "+t.instanceId+" in discovery"};s.confirm({header:"Really disable "+t.instanceId+" in discovery?",buttonText:"Disable "+t.instanceId,account:t.account,taskMonitorConfig:n,submitMethod:function(){return o.disableInstanceInDiscovery(t,d,v)}})},this.hasHealthState=function(t,n){return(e.instance.health||[]).some(function(e){return e.type===t&&e.state===n})};(d.isStandalone?h():m.all([d.serverGroups.ready(),d.loadBalancers.ready()]).then(h)).then(()=>{e.$$destroyed||d.isStandalone||d.serverGroups.onRefresh(e,h)}),e.account=r.account}]);class Ae extends ue.Component{render(){const{targetGroup:e,loadBalancer:t,showServerGroups:n}=this.props,a={loadBalancerName:t.name,region:e.region,accountId:e.account,name:e.targetGroupName,vpcId:e.vpcId,provider:e.cloudProvider},r={up:void 0,down:void 0,starting:void 0,succeeded:void 0,failed:void 0,unknown:void 0,outOfService:void 0};return ue.createElement("div",{className:"target-group-container container-fluid no-padding"},ue.createElement(me,{class:"active"},ue.createElement(ge,{to:".ecsTargetGroupDetails",params:a},ue.createElement("div",{className:"clickable clickable-row row no-margin-y target-group-header"},ue.createElement("div",{className:"col-md-8 target-group-title"},e.targetGroupName)))),n&&e.serverGroups.map(t=>ue.createElement(d,{key:t,account:e.account,region:e.region,serverGroup:{account:e.account,cloudProvider:e.cloudProvider,cluster:t,instanceCounts:r,instances:e.instances,name:t,type:e.type,region:e.region},showInstances:!1})))}}class Te extends ue.Component{shouldComponentUpdate(e){return e.showInstances!==this.props.showInstances||e.showServerGroups!==this.props.showServerGroups||e.loadBalancer!==this.props.loadBalancer||(()=>!W((e.serverGroups||[]).map(e=>e.name),(this.props.serverGroups||[]).map(e=>e.name)))()||(()=>!W((e.loadBalancer.targetGroups||[]).map(e=>e.targetGroupName),(this.props.loadBalancer.targetGroups||[]).map(e=>e.targetGroupName)))()}render(){const{loadBalancer:e,showInstances:t,showServerGroups:n}=this.props,a=e.targetGroups.map(a=>ue.createElement(Ae,{key:a.targetGroupName,loadBalancer:e,targetGroup:a,showInstances:t,showServerGroups:n}));return ue.createElement("div",{className:"cluster-container"},a)}}class Ne extends ue.Component{constructor(e){super(e)}getTargetGroupNameFromArn(e){const t=e.split("/");return t.length<0?e:t[1]}render(){const{port:e,protocol:t,defaultActions:n}=this.props.listener;return ue.createElement("div",null,ue.createElement("h4",null,t,":",e),ue.createElement("div",{style:{paddingLeft:10}},ue.createElement("i",null,"default actions"),ue.createElement("ul",null,n.map((e,t)=>"forward"==e.type?ue.createElement("li",{key:t},"→",ue.createElement("i",{className:"fa fa-fw fa-crosshairs icon","aria-hidden":"true"}),ue.createElement("span",null,e.targetGroupArn||e.forwardConfig.targetGroups.map(e=>this.getTargetGroupNameFromArn(e.targetGroupArn)))):ue.createElement("li",{key:t},e.type,":"," ",e.redirectConfig.statusCode||e.fixedResponseConfig.statusCode||e.authenticateOidcConfig.clientId||e.authenticateCognitoActionConfig.userPoolDomain)))))}}class Pe extends ue.Component{constructor(e){super(e),this.state={loading:!0,loadBalancer:void 0,refreshListenerUnsubscribe:()=>{}},e.app.getDataSource("loadBalancers").ready().then(()=>this.extractLoadBalancer())}componentWillUnmount(){this.state.refreshListenerUnsubscribe()}extractLoadBalancer(){const{name:e,region:t}=this.props.loadBalancer,n=this.props.app.getDataSource("loadBalancers").data.find(n=>n.name===e&&n.account===this.props.loadBalancer.accountId&&n.region===t);this.setState({loading:!1,loadBalancer:n}),this.state.refreshListenerUnsubscribe(),n?this.setState({refreshListenerUnsubscribe:this.props.app.getDataSource("loadBalancers").onRefresh(null,()=>this.extractLoadBalancer())}):this.setState({refreshListenerUnsubscribe:()=>{}})}render(){const e=this.props.loadBalancer.name,{loadBalancer:t,loading:n}=this.state,{accountId:a}=this.props,r=ue.createElement("div",{className:"close-button"},ue.createElement(ge,{to:"^"},ue.createElement("span",{className:"glyphicon glyphicon-remove"})));return ue.createElement("div",{className:"details-panel"},n&&ue.createElement("div",{className:"header"},r,ue.createElement("div",{className:"horizontal center middle"},ue.createElement(p,{size:"small"}))),!n&&ue.createElement("div",{className:"header"},r,ue.createElement("div",{className:"header-text horizontal middle"},ue.createElement("i",{className:"fa icon-sitemap"}),ue.createElement("h3",{className:"horizontal middle space-between flex-1"},e))),!n&&!t&&ue.createElement("div",{className:"content"},ue.createElement("div",{className:"content-section"},ue.createElement("div",{className:"content-body text-center"},ue.createElement("h3",null,"Load balancer not found.")))),!n&&t&&ue.createElement("div",{className:"content"},ue.createElement(u,{heading:"Load Balancer Details",defaultExpanded:!0},ue.createElement("dl",{className:"dl-horizontal dl-narrow"},ue.createElement("dt",null,"Created"),ue.createElement("dd",null,m(t.createdTime)),ue.createElement("dt",null,"In"),ue.createElement("dd",null,ue.createElement(g,{account:a}),ue.createElement("br",null),t.region),ue.createElement("dt",null,"VPC"),ue.createElement("dd",null,t.vpcId),ue.createElement("dt",null,"Type"),ue.createElement("dd",null,t.loadBalancerType),ue.createElement("dt",null,"IP Type"),ue.createElement("dd",null,t.ipAddressType)),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Availability Zones"),ue.createElement("dd",null,ue.createElement("ul",null,t.availabilityZones.map(e=>ue.createElement("li",{key:e},e))))),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Target Groups"),ue.createElement("dd",null,ue.createElement("ul",null,t.targetGroups.map(e=>ue.createElement("li",{key:e.targetGroupName},ue.createElement(me,{class:"active"},ue.createElement(ge,{to:"^.ecsTargetGroupDetails",params:{loadBalancerName:t.name,region:t.region,accountId:t.account,name:e.targetGroupName,vpcId:e.vpcId,provider:t.cloudProvider}},ue.createElement("a",null,e.targetGroupName)))))))),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"DNS Name"),ue.createElement("dd",null,ue.createElement("a",{target:"_blank",href:"http://"+t.dnsname},t.dnsname)))),ue.createElement(u,{heading:"Status",defaultExpanded:!1},ue.createElement("span",null,"Select a target group to check the instance health status from the view of its server groups.")),ue.createElement(u,{heading:"Listeners",defaultExpanded:!1},t.listeners?t.listeners.map((e,t)=>ue.createElement("div",{key:t},ue.createElement("span",null,ue.createElement(Ne,{listener:e})))):ue.createElement("li",null,"No listeners provided.")),ue.createElement(u,{heading:"Firewalls",defaultExpanded:!1},ue.createElement("ul",null,t.securityGroups?t.securityGroups.map(e=>ue.createElement("li",{key:e},e)):ue.createElement("li",null,"No security groups provided."))),ue.createElement(u,{heading:"Subnets",defaultExpanded:!1},ue.createElement("ul",null,t.subnets.map(e=>ue.createElement("li",{key:e},e))))))}}class Ie extends ue.Component{constructor(e){super(e),this.state={loading:!0,targetGroup:void 0,loadBalancer:void 0,refreshListenerUnsubscribe:()=>{}},e.app.getDataSource("loadBalancers").ready().then(()=>this.extractTargetGroup())}componentWillUnmount(){this.state.refreshListenerUnsubscribe()}extractTargetGroup(){const{loadBalancerName:e,region:t,targetGroupName:n}=this.props.targetGroup,a=this.props.app.getDataSource("loadBalancers").data.find(n=>n.name===e&&n.account===this.props.accountId&&n.region===t);if(this.setState({loadBalancer:a}),this.state.refreshListenerUnsubscribe(),a){const e=a.targetGroups.find(e=>e.targetGroupName===n);e||this.setState({loading:!1,targetGroup:null}),e&&(this.setState({loading:!1,targetGroup:e}),e?this.setState({refreshListenerUnsubscribe:this.props.app.getDataSource("loadBalancers").onRefresh(null,()=>this.extractTargetGroup())}):this.setState({refreshListenerUnsubscribe:()=>{}}))}else this.setState({loading:!1,targetGroup:null})}render(){const{name:e,accountId:t}=this.props,n=this.props.targetGroup.region,{targetGroup:a,loadBalancer:r,loading:i}=this.state,s=ue.createElement("div",{className:"close-button"},ue.createElement(ge,{to:"^"},ue.createElement("span",{className:"glyphicon glyphicon-remove"})));return ue.createElement("div",{className:"details-panel"},i&&ue.createElement("div",{className:"header"},s,ue.createElement("div",{className:"horizontal center middle"},ue.createElement(p,{size:"small"}))),!i&&ue.createElement("div",{className:"header"},ue.createElement("div",{className:"header-text horizontal middle"},ue.createElement("i",{className:"fa fa-crosshairs icon","aria-hidden":"true"}),ue.createElement("h3",{className:"horizontal middle space-between flex-1"},e))),!i&&!a&&ue.createElement("div",{className:"content"},ue.createElement("div",{className:"content-section"},ue.createElement("div",{className:"content-body text-center"},ue.createElement("h3",null,"Target group not found.")))),!i&&a&&ue.createElement("div",{className:"content"},ue.createElement(u,{heading:"Target Group Details",defaultExpanded:!0},ue.createElement("dl",{className:"dl-horizontal dl-narrow"},ue.createElement("dt",null,"In"),ue.createElement("dd",null,ue.createElement(g,{account:t}),ue.createElement("br",null),a.region),ue.createElement("dt",null,"VPC"),ue.createElement("dd",null,a.vpcId),ue.createElement("dt",null,"Protocol"),ue.createElement("dd",null,a.protocol),ue.createElement("dt",null,"Port"),ue.createElement("dd",null,a.port),ue.createElement("dt",null,"Target Type"),ue.createElement("dd",null,a.targetType.toUpperCase())),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Load Balancers"),ue.createElement("dd",null,ue.createElement("ul",{className:"collapse-margin-on-filter-collapse"},a.loadBalancerNames?a.loadBalancerNames.map((e,t)=>ue.createElement("li",{key:t},e)):ue.createElement("li",null,"No load balncers provided.")))),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Load Balancer DNS Name"),ue.createElement("dd",null,ue.createElement("a",{target:"_blank",href:"http://"+r.dnsname},r.dnsname))),ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Server Groups"),ue.createElement("dd",null,ue.createElement("ul",{className:"collapse-margin-on-filter-collapse"},a.serverGroups.map((e,a)=>ue.createElement("li",{key:a},ue.createElement(me,{class:"active"},ue.createElement(ge,{to:"^.serverGroup",params:{region:n,accountId:t,serverGroup:e,provider:"ecs"}},ue.createElement("a",null,e))))))))),ue.createElement(u,{heading:"Health Checks",defaultExpanded:!1},ue.createElement("dl",{className:"horizontal-when-filters-collapsed"},ue.createElement("dt",null,"Target"),ue.createElement("dd",null,a.healthCheckProtocol,":",a.healthCheckPort,a.healthCheckPath),ue.createElement("dt",null,"Timeout"),ue.createElement("dd",null,a.healthCheckTimeoutSeconds," seconds"),ue.createElement("dt",null,"Interval"),ue.createElement("dd",null,a.healthCheckIntervalSeconds," seconds"),ue.createElement("dt",null,"Healthy Threshold"),ue.createElement("dd",null,a.healthyThresholdCount),ue.createElement("dt",null,"Unhealthy Threshold"),ue.createElement("dd",null,a.unhealthyThresholdCount),ue.createElement("dt",null,"Matcher"),ue.createElement("dd",null,"HTTP Code(s): ",a&&a.matcher?a.matcher.httpCode:"None"))),ue.createElement(u,{heading:"Attributes",defaultExpanded:!1},ue.createElement("dl",null,ue.createElement("dt",null,"Deregistration Delay Timeout"),ue.createElement("dd",null,a.attributes["deregistration_delay.timeout_seconds"]||0," seconds"),ue.createElement("dt",null,"Stickiness Enabled"),ue.createElement("dd",null,a.attributes["stickiness.enabled"]||"N/A")))))}}class ze{constructor(e){this.$q=e}normalizeLoadBalancer(e){return e.targetGroups.forEach(t=>{if(t.region=e.region,t.account=e.account,t.cloudProvider=e.cloudProvider,e.targetGroupServices){const n=e.targetGroupServices;t.serverGroups=n[t.targetGroupArn]}}),this.$q.resolve(e)}}ze.$inject=["$q"];const xe="spinnaker.ecs.loadBalancer.targetGroup.states";t(xe,[v]).config(["applicationStateProvider",e=>{const t={name:"ecsTargetGroupDetails",url:"/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name",params:{vpcId:{value:null,squash:!0}},views:{"detail@../insight":{component:Ie,$type:"react"}},resolve:{accountId:["$stateParams",e=>e.accountId],name:["$stateParams",e=>e.name],provider:["$stateParams",e=>e.provider],targetGroup:["$stateParams",e=>({loadBalancerName:e.loadBalancerName,targetGroupName:e.name,accountId:e.accountId,region:e.region,vpcId:e.vpcId})]},data:{pageTitleDetails:{title:"Target Group Details",nameParam:"name",accountParam:"accountId",regionParam:"region"}}};e.addInsightDetailState(t)}]);const Re="spinnaker.ecs.metricAlarm.read.service";t(Re,[]).service("metricAlarmReader",class{listMetricAlarms(){return r("/ecs/cloudMetrics/alarms").get()}});const Me="spinnaker.ecs.pipeline.stage.ecs.destroyAsgStage";t(Me,[]).config(function(){h.pipeline.registerStage({provides:"destroyServerGroup",alias:"destroyAsg",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/destroyAsg/destroyAsgStage.html",executionStepLabelUrl:"ecs/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to destroy a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsDestroyAsgStageCtrl",["$scope",function(e){const t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),e.regions=["us-east-1","us-west-1","eu-west-1","us-west-2"],e.targets=y.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="ecs",!t.credentials&&e.application.defaultCredentials.ecs&&(t.credentials=e.application.defaultCredentials.ecs),!t.regions.length&&e.application.defaultRegions.ecs&&t.regions.push(e.application.defaultRegions.ecs),t.target||(t.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/destroyAsg/destroyAsgStage.html",'<div ng-controller="ecsDestroyAsgStageCtrl as destroyAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",'<span class="task-label"> Destroy Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const $e="spinnaker.ecs.pipeline.stage.disableAsgStage";t($e,[]).config(function(){h.pipeline.registerStage({provides:"disableServerGroup",alias:"disableAsg",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/disableAsg/disableAsgStage.html",executionDetailsUrl:b.disableAsgExecutionDetails,executionStepLabelUrl:"ecs/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",validators:[{type:"targetImpedance",message:"This pipeline will attempt to disable a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsDisableAsgStageCtrl",["$scope",function(e){const t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),e.targets=y.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="ecs",t.isNew&&e.application.attributes.platformHealthOnlyShowOverride&&e.application.attributes.platformHealthOnly&&(t.interestingHealthProviderNames=["Ecs"]),!t.credentials&&e.application.defaultCredentials.ecs&&(t.credentials=e.application.defaultCredentials.ecs),!t.regions.length&&e.application.defaultRegions.ecs&&t.regions.push(e.application.defaultRegions.ecs),t.target||(t.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/disableAsg/disableAsgStage.html",'<div ng-controller="ecsDisableAsgStageCtrl as disableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'Ecs\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",'<span class="task-label"> Disable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const Be="spinnaker.ecs.pipeline.stage.disableClusterStage";t(Be,[]).config(function(){h.pipeline.registerStage({provides:"disableCluster",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/disableCluster/disableClusterStage.html",validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"remainingEnabledServerGroups",fieldLabel:"Keep [X] enabled Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsDisableClusterStageCtrl",["$scope",function(e){const t=this,n=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),t.reset=()=>{t.accountUpdated(),t.resetSelectedCluster()},n.regions=n.regions||[],n.cloudProvider="ecs",n.isNew&&e.application.attributes.platformHealthOnlyShowOverride&&e.application.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=["Ecs"]),!n.credentials&&e.application.defaultCredentials.ecs&&(n.credentials=e.application.defaultCredentials.ecs),!n.regions.length&&e.application.defaultRegions.ecs&&n.regions.push(e.application.defaultRegions.ecs),void 0===n.remainingEnabledServerGroups&&(n.remainingEnabledServerGroups=1),t.pluralize=function(e,t){return 1===t?e:e+"s"},void 0===n.preferLargerOverNewer&&(n.preferLargerOverNewer="false"),n.preferLargerOverNewer=n.preferLargerOverNewer.toString()}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/disableCluster/disableClusterStage.html",'<div ng-controller="ecsDisableClusterStageCtrl as disableClusterStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Disable Options">\n <div class="form-inline">\n Keep the\n <input\n type="number"\n min="0"\n required\n ng-model="stage.remainingEnabledServerGroups"\n class="form-control input-sm"\n style="width: 50px"\n />\n <select class="form-control input-sm" ng-model="stage.preferLargerOverNewer" style="width: 100px">\n <option value="true">largest</option>\n <option value="false">newest</option>\n </select>\n {{disableClusterStageCtrl.pluralize(\'server group\', stage.remainingEnabledServerGroups)}} enabled.\n </div>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'Ecs\'">\n </stage-platform-health-override>\n</div>\n')}]);const Fe="spinnaker.ecs.pipeline.stage.enableAsgStage";t(Fe,[]).config(function(){h.pipeline.registerStage({provides:"enableServerGroup",alias:"enableAsg",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/enableAsg/enableAsgStage.html",executionStepLabelUrl:"ecs/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsEnableAsgStageCtrl",["$scope",function(e){const t=this,n=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),t.reset=()=>{t.accountUpdated(),t.resetSelectedCluster()},e.targets=y.TARGET_LIST,n.regions=n.regions||[],n.cloudProvider="ecs",n.isNew&&e.application.attributes.platformHealthOnlyShowOverride&&e.application.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=["Ecs"]),!n.credentials&&e.application.defaultCredentials.ecs&&(n.credentials=e.application.defaultCredentials.ecs),!n.regions.length&&e.application.defaultRegions.ecs&&n.regions.push(e.application.defaultRegions.ecs),n.target||(n.target=e.targets[0].val),e.$watch("stage.credentials",e.accountUpdated)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/enableAsg/enableAsgStage.html",'<div ng-controller="ecsEnableAsgStageCtrl as enableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'Ecs\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",'<span class="task-label"> Enable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const Le="spinnaker.ecs.pipeline.stage.findImageFromTagsStage";t(Le,[]).config(function(){h.pipeline.registerStage({provides:"findImageFromTags",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html",executionDetailsUrl:"ecs/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html",executionConfigSections:["findImageConfig","taskStatus"],validators:[{type:"requiredField",fieldName:"imageLabelOrSha"}]})}).controller("ecsFindImageFromTagsStageCtrl",["$scope",function(e){e.stage.cloudProvider=e.stage.cloudProvider||"ecs"}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html",'<div ng-controller="ecsFindImageFromTagsStageCtrl as findImageFromTagsCtrl" class="form-horizontal">\n <stage-config-field label="Full Docker Image path (label or SHA-256)">\n <input type="text" class="form-control input-sm" ng-model="stage.imageLabelOrSha" />\n </stage-config-field>\n</div>\n\n<div>\n <h5>Example value: <i>12345678901.dkr.ecr.us-west-2.amazonaws.com/continuous-delivery:latest</i></h5>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html",'<div ng-controller="BaseExecutionDetailsCtrl">\n <execution-details-section-nav sections="configSections"></execution-details-section-nav>\n <div class="step-section-details" ng-if="detailsSection === \'findImageConfig\'">\n <div class="row">\n <div class="col-md-12">\n <dl class="dl-narrow dl-horizontal">\n <dt if-multiple-providers>Provider</dt>\n <dd if-multiple-providers>ECS</dd>\n </dl>\n </div>\n </div>\n <stage-failure-message stage="stage" message="stage.failureMessage"></stage-failure-message>\n\n <div class="row" ng-if="stage.context.amiDetails">\n <div class="col-md-12">\n <div class="well alert alert-info">\n <h4>Results</h4>\n <dl ng-repeat="image in stage.context.amiDetails" class="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 </div>\n </div>\n </div>\n </div>\n\n <div class="step-section-details" ng-if="detailsSection === \'taskStatus\'">\n <div class="row">\n <execution-step-details item="stage"></execution-step-details>\n </div>\n </div>\n</div>\n')}]);const Oe="spinnaker.ecs.pipeline.stage.ecs.resizeAsgStage";t(Oe,[]).config(function(){h.pipeline.registerStage({provides:"resizeServerGroup",alias:"resizeAsg",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/resizeAsg/resizeAsgStage.html",executionConfigSections:["resizeServerGroupConfig","taskStatus"],executionStepLabelUrl:"ecs/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to resize a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"action"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsResizeAsgStageCtrl",["$scope",function(e){const t=e.stage;e.viewState={accountsLoaded:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.viewState.accountsLoaded=!0}),e.resizeTargets=y.TARGET_LIST,e.scaleActions=[{label:"Scale Up",val:"scale_up"},{label:"Scale Down",val:"scale_down"},{label:"Scale to Cluster Size",val:"scale_to_cluster"},{label:"Scale to Exact Size",val:"scale_exact"}],e.resizeTypes=[{label:"Percentage",val:"pct"},{label:"Incremental",val:"incr"}],t.capacity=t.capacity||{},t.regions=t.regions||[],t.target=t.target||e.resizeTargets[0].val,t.action=t.action||e.scaleActions[0].val,t.resizeType=t.resizeType||e.resizeTypes[0].val,void 0===t.targetHealthyDeployPercentage&&(t.targetHealthyDeployPercentage=100),t.action||"exact"!==t.resizeType||(t.action="scale_exact"),t.cloudProvider="ecs",t.isNew&&e.application.attributes.platformHealthOnlyShowOverride&&e.application.attributes.platformHealthOnly&&(t.interestingHealthProviderNames=["Ecs"]),!t.credentials&&e.application.defaultCredentials.ecs&&(t.credentials=e.application.defaultCredentials.ecs),!t.regions.length&&e.application.defaultRegions.ecs&&t.regions.push(e.application.defaultRegions.ecs),this.updateResizeType=function(){"scale_exact"===t.action?(t.resizeType="exact",delete t.scalePct,delete t.scaleNum):(t.capacity={},"pct"===t.resizeType?delete t.scaleNum:(t.resizeType="incr",delete t.scalePct,t.scaleNum=t.scaleNum||0))}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/resizeAsg/resizeAsgStage.html",'<div ng-controller="ecsResizeAsgStageCtrl as resizeAsgStageCtrl">\n <div ng-if="!pipeline.strategy">\n <div ng-if="!viewState.accountsLoaded">\n <h4 class="text-center">\n <span us-spinner="{radius:20, width:6, length: 12}"></span>\n </h4>\n </div>\n <div ng-if="viewState.accountsLoaded">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="resizeTargets"></target-select>\n </stage-config-field>\n <stage-config-field label="Action" help-key="pipeline.config.resizeAsg.action">\n <select\n class="form-control input-sm"\n required\n ng-model="stage.action"\n ng-change="resizeAsgStageCtrl.updateResizeType()"\n ng-options="a.val as a.label for a in scaleActions"\n >\n <option>Select an action...</option>\n </select>\n </stage-config-field>\n <div ng-if="stage.action !== \'scale_exact\'">\n <stage-config-field label="{{stage.action === \'scale_to_cluster\' ? \'Additional Capacity\' : \'Type\'}}">\n <select\n class="form-control input-sm"\n required\n ng-model="stage.resizeType"\n ng-change="resizeAsgStageCtrl.updateResizeType()"\n ng-options="t.val as t.label for t in resizeTypes"\n >\n <option>Select an action...</option>\n </select>\n </stage-config-field>\n <div ng-if="stage.resizeType === \'pct\'">\n <stage-config-field label="Resize Percentage">\n <input type="number" min="0" ng-model="stage.scalePct" class="form-control input-sm" style="width: 80px" />\n <div>\n <em class="subinput-note"\n >This is the percentage by which the target server group\'s capacity will be increased</em\n >\n </div>\n </stage-config-field>\n </div>\n <div ng-if="stage.resizeType === \'incr\'">\n <stage-config-field label="Resize-by Amount">\n <input type="number" min="0" ng-model="stage.scaleNum" class="form-control input-sm" style="width: 80px" />\n <div>\n <em class="subinput-note"\n >This is the exact amount by which the target server group\'s capacity will be increased</em\n >\n </div>\n </stage-config-field>\n </div>\n </div>\n <div ng-if="stage.action === \'scale_exact\'">\n <stage-config-field class="small">\n <div class="row">\n <div class="col-md-3">Min</div>\n <div class="col-md-3">Max</div>\n <div class="col-md-3">Desired</div>\n </div>\n </stage-config-field>\n <stage-config-field label="Match Capacity">\n <div class="row">\n <div class="col-md-3">\n <input type="number" ng-model="stage.capacity.min" class="form-control input-sm" />\n </div>\n <div class="col-md-3">\n <input type="number" ng-model="stage.capacity.max" class="form-control input-sm" />\n </div>\n <div class="col-md-3">\n <input type="number" ng-model="stage.capacity.desired" class="form-control input-sm" />\n </div>\n </div>\n </stage-config-field>\n <stage-config-field>\n <em class="subinput-note">This is the exact amount to which the target server group will be scaled</em>\n </stage-config-field>\n </div>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'Ecs\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html",'<span class="task-label"> Resize Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const Ue="spinnaker.ecs.pipeline.stage.scaleDownClusterStage";t(Ue,[]).config(function(){h.pipeline.registerStage({provides:"scaleDownCluster",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"remainingFullSizeServerGroups",fieldLabel:"Keep [X] full size Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}],strategy:!0})}).controller("ecsScaleDownClusterStageCtrl",["$scope",function(e){const t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),t.regions=t.regions||[],t.cloudProvider="ecs",!t.credentials&&e.application.defaultCredentials.ecs&&(t.credentials=e.application.defaultCredentials.ecs),!t.regions.length&&e.application.defaultRegions.ecs&&t.regions.push(e.application.defaultRegions.ecs),void 0===t.remainingFullSizeServerGroups&&(t.remainingFullSizeServerGroups=1),void 0===t.allowScaleDownActive&&(t.allowScaleDownActive=!1),this.pluralize=function(e,t){return 1===t?e:e+"s"},void 0===t.preferLargerOverNewer&&(t.preferLargerOverNewer="false"),t.preferLargerOverNewer=t.preferLargerOverNewer.toString()}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html",'<div ng-controller="ecsScaleDownClusterStageCtrl as scaleDownClusterStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Scale Down Options">\n <div class="form-inline">\n <p>\n Keep the\n <input\n type="number"\n min="0"\n required\n ng-model="stage.remainingFullSizeServerGroups"\n class="form-control input-sm"\n style="width: 50px"\n />\n <select class="form-control input-sm" ng-model="stage.preferLargerOverNewer" style="width: 100px">\n <option value="true">largest</option>\n <option value="false">newest</option>\n </select>\n {{scaleDownClusterStageCtrl.pluralize(\'server group\', stage.remainingFullSizeServerGroups)}} at current size.\n </p>\n <p>The remaining server groups will be scaled down to zero instances.</p>\n </div>\n </stage-config-field>\n <div class="form-group">\n <div class="col-md-offset-3 col-md-6 checkbox">\n <label>\n <input type="checkbox" ng-model="stage.allowScaleDownActive" />\n Allow scale down of active server groups\n </label>\n </div>\n </div>\n</div>\n')}]);const qe="spinnaker.ecs.pipeline.stage.ecs.shrinkClusterStage";t(qe,[]).config(function(){h.pipeline.registerStage({provides:"shrinkCluster",cloudProvider:"ecs",templateUrl:"ecs/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"shrinkToSize",fieldLabel:"shrink to [X] Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("ecsShrinkClusterStageCtrl",["$scope",function(e){const t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("ecs").then(function(t){e.accounts=t,e.state.accounts=!0}),t.regions=t.regions||[],t.cloudProvider="ecs",!t.credentials&&e.application.defaultCredentials.ecs&&(t.credentials=e.application.defaultCredentials.ecs),!t.regions.length&&e.application.defaultRegions.ecs&&t.regions.push(e.application.defaultRegions.ecs),void 0===t.shrinkToSize&&(t.shrinkToSize=1),void 0===t.allowDeleteActive&&(t.allowDeleteActive=!1),this.pluralize=function(e,t){return 1===t?e:e+"s"},void 0===t.retainLargerOverNewer&&(t.retainLargerOverNewer="false"),t.retainLargerOverNewer=t.retainLargerOverNewer.toString()}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html",'<div ng-controller="ecsShrinkClusterStageCtrl as shrinkClusterStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Shrink Options">\n <div class="form-inline">\n Shrink to\n <input\n type="number"\n min="0"\n required\n ng-model="stage.shrinkToSize"\n class="form-control input-sm"\n style="width: 50px"\n />\n {{shrinkClusterStageCtrl.pluralize(\'server group\', stage.shrinkToSize)}}, keeping the\n <select class="form-control input-sm" ng-model="stage.retainLargerOverNewer" style="width: 100px">\n <option value="true">largest</option>\n <option value="false">newest</option>\n </select>\n </div>\n </stage-config-field>\n <div class="form-group">\n <div class="col-md-offset-3 col-md-6 checkbox">\n <label>\n <input type="checkbox" ng-model="stage.allowDeleteActive" />\n Allow deletion of active server groups\n </label>\n </div>\n </div>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'Ecs\'">\n </stage-platform-health-override>\n</div>\n')}]);const He="spinnaker.ecs.placementStrategyService.service";t(He,[]).service("placementStrategyService",class{getPredefinedStrategy(e){return"AZ Balanced Spread"===e?this.getAzBalancedSpreadStrategy():"AZ Balanced BinPack"===e||"AZ Balanced BinPack Memory"===e?this.getAzBalancedMemoryBinPackStrategy():"BinPack"===e||"BinPack Memory"===e?this.getBinPackMemoryStrategy():"AZ Balanced BinPack CPU"===e?this.getAzBalancedCpuBinPackStrategy():"BinPack CPU"===e?this.getBinPackCpuStrategy():"One Task Per Host"===e?this.getOneTaskPerHostStrategy():[]}getAzBalancedSpreadStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"spread",field:"instanceId"}]}getAzBalancedMemoryBinPackStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"binpack",field:"memory"}]}getBinPackMemoryStrategy(){return[{type:"binpack",field:"memory"}]}getAzBalancedCpuBinPackStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"binpack",field:"cpu"}]}getBinPackCpuStrategy(){return[{type:"binpack",field:"cpu"}]}getOneTaskPerHostStrategy(){return[{type:"spread",field:"instanceId"}]}});const Ve="spinnaker.ecs.secret.read.service";t(Ve,[]).service("secretReader",class{listSecrets(){return r("/ecs/secrets").get()}});const _e="spinnaker.ecs.securityGroup.details.controller";e.module(_e,[V,S,k]).controller("ecsSecurityGroupDetailsCtrl",["$scope","$state","resolvedSecurityGroup","app","securityGroupReader",function(t,n,a,r,s){this.application=r;const o=r,c=a;function d(){return s.getSecurityGroupDetails(o,c.accountId,c.provider,c.region,c.vpcId,c.name).then(function(e){return de.getVpcName(e.vpcId).then(t=>(e.vpcName=t,e))}).then(function(n){if(t.state.loading=!1,!n||j.isEmpty(n))u();else{const a=s.getApplicationSecurityGroup(o,c.accountId,c.region,c.name);e.extend(c,a,n),t.securityGroup=c,t.ipRules=function(e){const t=j.groupBy(e.ipRangeRules,e=>e.range.ip+e.range.cidr);return Object.keys(t).map(e=>({address:e,rules:p(t,e)})).filter(e=>e.rules.length)}(c),t.securityGroupRules=function(e){const t=j.groupBy(e.securityGroupRules,e=>e.securityGroup.id);return Object.keys(t).map(e=>({securityGroup:t[e][0].securityGroup,rules:p(t,e)})).filter(e=>e.rules.length)}(c)}},u)}function p(e,t){const n=[];return e[t].forEach(e=>{(e.portRanges||[]).forEach(t=>{("-1"===e.protocol||void 0!==t.startPort&&void 0!==t.endPort)&&n.push({startPort:t.startPort,endPort:t.endPort,protocol:e.protocol})})}),n}function u(){t.$$destroyed||(r.isStandalone?(t.group=c.name,t.state.notFound=!0,t.state.loading=!1,l.removeLastItem("securityGroups")):n.go("^",{allowModalToStayOpen:!0},{location:"replace"}))}this.firewallLabel=C.get("Firewall"),t.detailsTemplateUrl=i.getValue("ecs","securityGroup.detailsTemplateUrl"),t.state={loading:!0,standalone:r.isStandalone},d().then(()=>{t.$$destroyed||r.isStandalone||r.securityGroups.onRefresh(t,d)}),r.isStandalone&&(r.securityGroups={refresh:d})}]);const je="spinnaker.ecs.securityGroup.reader";t(je,[]).service("ecsSecurityGroupReader",class{resolveIndexedSecurityGroup(e,t,n){return e[t.account][t.region][n]}});const We="spinnaker.ecs.securityGroup.transformer";t(We,[]).factory("ecsSecurityGroupTransformer",function(){return{normalizeSecurityGroup:function(){}}});const Ze="spinnaker.ecs.securityGroup";t(Ze,[je,We,_e]);class Ke{static listServiceDiscoveryRegistries(){return r("/ecs/serviceDiscoveryRegistries").get()}}class Je{constructor(e,t,n,a,r,i,s,o,l){this.$q=e,this.loadBalancerReader=t,this.serverGroupCommandRegistry=n,this.iamRoleReader=a,this.ecsClusterReader=r,this.metricAlarmReader=i,this.placementStrategyService=s,this.securityGroupReader=o,this.secretReader=l,this.launchTypes=["EC2","FARGATE"],this.networkModes=["bridge","host","awsvpc","none","default"]}configureUpdateCommand(e){e.backingData={launchTypes:Z(this.launchTypes),networkModes:Z(this.networkModes)}}configureCommand(e,t=""){var n;this.applyOverrides("beforeConfiguration",e),e.toggleSuspendedProcess=(e,t)=>{e.suspendedProcesses=e.suspendedProcesses||[];const n=e.suspendedProcesses.indexOf(t);-1===n?e.suspendedProcesses.push(t):e.suspendedProcesses.splice(n,1)},e.processIsSuspended=(e,t)=>e.suspendedProcesses.includes(t),e.onStrategyChange=(e,t)=>{""!==t.key&&"custom"!==t.key&&(e.suspendedProcesses=(e.suspendedProcesses||[]).filter(e=>"AddToLoadBalancer"!==e))},e.regionIsDeprecated=e=>K(e,"backingData.filtered.regions")&&e.backingData.filtered.regions.some(t=>t.name===e.region&&t.deprecated);const a=e.imageDescription?[this.grabImageAndTag(e.imageDescription.imageId)]:[];t&&a.push(t);const r=null==(n=e.imageDescription)?void 0:n.account;let i;return i=a.length&&r?this.$q.all(a.map(e=>ve.findImages({provider:"dockerRegistry",account:r,count:50,q:e}))).then(e=>J(e)):this.$q.when([]),this.$q.all({credentialsKeyedByAccount:f.getCredentialsKeyedByAccount("ecs"),loadBalancers:this.loadBalancerReader.listLoadBalancers("ecs"),subnets:G.listSubnetsByProvider("ecs"),iamRoles:this.iamRoleReader.listRoles("ecs"),ecsClusters:this.ecsClusterReader.listClusters(),capacityProviderDetails:this.ecsClusterReader.describeClusters(e.credentials,e.region),metricAlarms:this.metricAlarmReader.listMetricAlarms(),securityGroups:this.securityGroupReader.getAllSecurityGroups(),launchTypes:this.$q.when(Z(this.launchTypes)),networkModes:this.$q.when(Z(this.networkModes)),secrets:this.secretReader.listSecrets(),serviceDiscoveryRegistries:Ke.listServiceDiscoveryRegistries(),images:i}).then(t=>{t.accounts=Y(t.credentialsKeyedByAccount),t.filtered={},e.viewState.contextImages&&(t.images=t.images.concat(e.viewState.contextImages)),e.backingData=t,this.configureVpcId(e),this.configureAvailableIamRoles(e),this.configureAvailableSubnetTypes(e),this.configureAvailableSecurityGroups(e),this.configureAvailableEcsClusters(e),this.setCapacityProviderDetails(e),this.configureAvailableSecrets(e),this.configureAvailableServiceDiscoveryRegistries(e),this.configureAvailableImages(e),this.configureAvailableRegions(e),this.configureLoadBalancerOptions(e),this.applyOverrides("afterConfiguration",e),this.attachEventHandlers(e)})}setCapacityProviderDetails(e){this.$q.all({capacityProviderDetails:this.ecsClusterReader.describeClusters(e.credentials,e.region)}).then(t=>{e.backingData.capacityProviderDetails=X(t.capacityProviderDetails).map(e=>this.mapCapacityProviderDetails(e)).value()}),null!=e.ecsClusterName&&e.ecsClusterName.length>0?this.configureAvailableCapacityProviders(e):(e.backingData.filtered.availableCapacityProviders=[],e.backingData.filtered.defaultCapacityProviderStrategy=[]),this.checkDirtyCapacityProviders(e)}configureAvailableCapacityProviders(e){e.backingData.filtered.availableCapacityProviders=X(e.backingData.capacityProviderDetails).filter({clusterName:e.ecsClusterName}).map(e=>e.capacityProviders).flattenDeep().value(),e.backingData.filtered.defaultCapacityProviderStrategy=X(e.backingData.capacityProviderDetails).filter({clusterName:e.ecsClusterName}).map(e=>e.defaultCapacityProviderStrategy).flattenDeep().value()}mapCapacityProviderDetails(e){return{capacityProviders:e.capacityProviders,clusterName:e.clusterName,defaultCapacityProviderStrategy:e.defaultCapacityProviderStrategy}}applyOverrides(e,t){this.serverGroupCommandRegistry.getCommandOverrides("ecs").forEach(n=>{n[e]&&n[e](t)})}grabImageAndTag(e){return e.split("/").pop()}buildImageId(e){return e.fromContext?`${e.imageLabelOrSha}`:e.fromTrigger&&!e.tag?`${e.registry}/${e.repository} (Tag resolved at runtime)`:`${e.registry}/${e.repository}:${e.tag}`}mapImage(e){return void 0!==e.message?e:{repository:e.repository,tag:e.tag,imageId:this.buildImageId(e),registry:e.registry,fromContext:e.fromContext,fromTrigger:e.fromTrigger,account:e.account,imageLabelOrSha:e.imageLabelOrSha,stageId:e.stageId,message:e.message}}configureAvailableImages(e){e.backingData.filtered.images=e.backingData.images.map(e=>this.mapImage(e))}configureAvailabilityZones(e){e.backingData.filtered.availabilityZones=Q(e.backingData.credentialsKeyedByAccount[e.credentials].regions,{name:e.region}).availabilityZones,e.availabilityZones=e.backingData.filtered.availabilityZones}configureAvailableSecurityGroups(e){if(null==e.subnetType&&(null==e.subnetTypes||0==e.subnetTypes.length))return void(e.backingData.filtered.securityGroups=[]);const t=X(e.backingData.subnets).filter({account:e.credentials,region:e.region,purpose:e.subnetTypes?e.subnetTypes[0]:e.subnetType}).compact().uniqBy("purpose").map("vpcId").value()[0];if(e.backingData.securityGroups[e.credentials]&&e.backingData.securityGroups[e.credentials].ecs&&e.backingData.securityGroups[e.credentials].ecs[e.region]){const n=e.backingData.securityGroups[e.credentials].ecs[e.region];e.backingData.filtered.securityGroupNames=X(n).filter({vpcId:t}).map("name").value()}}configureAvailableSubnetTypes(e){e.backingData.filtered.subnetTypes=X(e.backingData.subnets).filter({account:e.credentials,region:e.region}).compact().uniqBy("purpose").value().filter(function(e){return e.purpose&&e.purpose.length>0})}configureAvailableEcsClusters(e){e.backingData.filtered.ecsClusters=X(e.backingData.ecsClusters).filter({account:e.credentials,region:e.region}).map("name").value()}configureAvailableSecrets(e){e.backingData.filtered.secrets=X(e.backingData.secrets).filter({account:e.credentials,region:e.region}).map("name").value()}buildServiceRegistryDisplayName(e){return`${e.name} (${e.id})`}mapServiceRegistry(e){return{account:e.account,region:e.region,name:e.name,id:e.id,arn:e.arn,displayName:this.buildServiceRegistryDisplayName(e)}}configureAvailableServiceDiscoveryRegistries(e){e.backingData.filtered.serviceDiscoveryRegistries=X(e.backingData.serviceDiscoveryRegistries).filter({account:e.credentials,region:e.region}).map(e=>this.mapServiceRegistry(e)).value()}configureAvailableRegions(e){const t=e.backingData.credentialsKeyedByAccount[e.credentials]||{regions:[]};e.backingData.filtered.regions=t.regions}configureAvailableIamRoles(e){e.backingData.filtered.iamRoles=X(e.backingData.iamRoles).filter({accountName:e.credentials}).map("name").value(),e.backingData.filtered.iamRoles.length>0&&e.backingData.filtered.iamRoles.splice(0,0,"None (No IAM role)")}configureSubnetPurposes(e){const t={dirty:{}},n=e.backingData.filtered;return null===e.region||(n.subnetPurposes=X(e.backingData.subnets).filter({account:e.credentials,region:e.region}).reject({target:"elb"}).reject({purpose:null}).uniqBy("purpose").value(),e.subnetTypes?t.dirty.subnetType=!e.subnetTypes.every(e=>X(n.subnetPurposes).some({purpose:e}).value()):X(n.subnetPurposes).some({purpose:e.subnetType}).value()||(t.dirty.subnetType=!0),t.dirty.subnetType&&(e.subnetTypes=null,e.subnetType=null)),t}getLoadBalancerMap(e){return X(e.backingData.loadBalancers).map("accounts").flattenDeep().filter({name:e.credentials}).map("regions").flattenDeep().filter({name:e.region}).map("loadBalancers").flattenDeep().value()}getLoadBalancerNames(e){return this.getLoadBalancerMap(e).filter(t=>(!t.loadBalancerType||"classic"===t.loadBalancerType)&&t.vpcId===e.vpcId).map(e=>e.name).sort()}getVpcLoadBalancerNames(e){return this.getLoadBalancerMap(e).filter(e=>(!e.loadBalancerType||"classic"===e.loadBalancerType)&&e.vpcId).map(e=>e.name).sort()}getTargetGroupNames(e){const t=this.getLoadBalancerMap(e).filter(e=>"classic"!==e.loadBalancerType);return J(t.map(e=>e.targetGroups)).sort()}configureLoadBalancerOptions(e){const t={dirty:{}},n=(e.loadBalancers||[]).concat(e.vpcLoadBalancers||[]),a=this.getLoadBalancerNames(e),r=this.getVpcLoadBalancerNames(e),i=this.getTargetGroupNames(e),s=e.targetGroupMappings.map(e=>e.targetGroup);if(n&&e.loadBalancers){const i=e.vpcId?a:a.concat(r),s=ee(i,n),o=te(s,n);e.loadBalancers=ee(a,s),e.vpcId?delete e.vpcLoadBalancers:e.vpcLoadBalancers=ee(r,s),o.length&&(t.dirty.loadBalancers=o)}if(s){const t=ee(i,s),n=te(t,s);n&&n.length>0?e.viewState.dirty.targetGroups=n:e.viewState.dirty&&e.viewState.dirty.targetGroups&&(e.viewState.dirty.targetGroups=[])}return e.backingData.filtered.loadBalancers=a,e.backingData.filtered.vpcLoadBalancers=r,e.backingData.filtered.targetGroups=i,t}refreshLoadBalancers(e,t){return this.loadBalancerReader.listLoadBalancers("ecs").then(n=>{e.backingData.loadBalancers=n,t||this.configureLoadBalancerOptions(e)})}configureVpcId(e){const t={dirty:{}};if(null!=e.subnetType||null!=e.subnetTypes&&0!=e.subnetTypes.length)if(null!=e.subnetTypes&&e.subnetTypes.length>0)e.subnetTypes.forEach(function(t){const n=Q(e.backingData.subnets,{purpose:t,account:e.credentials,region:e.region});e.vpcId=n?n.vpcId:null});else{const t=Q(e.backingData.subnets,{purpose:e.subnetType,account:e.credentials,region:e.region});e.vpcId=t?t.vpcId:null}else e.vpcId=null,t.dirty.vpcId=!0;return t}checkDirtyCapacityProviders(e){if(e.capacityProviderStrategy){const t=e.backingData.filtered.availableCapacityProviders,n=e.capacityProviderStrategy.map(e=>e.capacityProvider),a=ee(t,n),r=te(a,n);if(r&&r.length>0?e.viewState.dirty.customCapacityProviders=r:e.viewState.dirty&&e.viewState.dirty.customCapacityProviders&&(e.viewState.dirty.customCapacityProviders=[]),e.useDefaultCapacityProviders){const t=e.backingData.filtered.defaultCapacityProviderStrategy.map(e=>e.capacityProvider),a=ee(t,n),r=te(a,n);r&&r.length>0&&(e.viewState.dirty.defaulCapacityProviders=r)}}}attachEventHandlers(e){e.subnetChanged=e=>{const t=this.configureVpcId(e);return ne(t.dirty,this.configureLoadBalancerOptions(e).dirty),e.viewState.dirty=e.viewState.dirty||{},ne(e.viewState.dirty,t.dirty),t},e.regionChanged=e=>{const t={dirty:{}};return ne(t.dirty,this.configureSubnetPurposes(e).dirty),e.region&&(ne(t.dirty,e.subnetChanged(e).dirty),this.configureAvailabilityZones(e),this.configureAvailableEcsClusters(e),this.configureAvailableSubnetTypes(e),this.configureAvailableSecurityGroups(e),this.configureAvailableSecrets(e),this.configureAvailableServiceDiscoveryRegistries(e),this.setCapacityProviderDetails(e)),t},e.subnetTypeChanged=e=>(this.configureAvailableSecurityGroups(e),{dirty:{}}),e.clusterChanged=e=>{e.moniker=A.getMoniker(e.application,e.stack,e.freeFormDetails)},e.credentialsChanged=e=>{const t={dirty:{}},n=e.backingData;return e.credentials?(this.configureAvailableIamRoles(e),this.configureAvailableEcsClusters(e),this.configureAvailableSubnetTypes(e),this.configureAvailableSecurityGroups(e),this.configureAvailableSecrets(e),this.configureAvailableServiceDiscoveryRegistries(e),this.configureAvailableRegions(e),this.setCapacityProviderDetails(e),ae(n.filtered.regions,{name:e.region})?ne(t.dirty,e.regionChanged(e).dirty):(e.region=null,t.dirty.region=!0)):e.region=null,t},e.placementStrategyNameChanged=e=>(e.placementStrategySequence=this.placementStrategyService.getPredefinedStrategy(e.placementStrategyName),{dirty:{}}),this.applyOverrides("attachEventHandlers",e)}}Je.$inject=["$q","loadBalancerReader","serverGroupCommandRegistry","iamRoleReader","ecsClusterReader","metricAlarmReader","placementStrategyService","securityGroupReader","secretReader"];const Ye="spinnaker.ecs.serverGroup.configure.service";t(Ye,[w,S,D,E]).service("ecsServerGroupConfigurationService",Je);const Xe="spinnaker.ecs.serverGroupCommandBuilder.service";e.module(Xe,[T,Ye]).factory("ecsServerGroupCommandBuilder",["$q","instanceTypeService","ecsServerGroupConfigurationService",function(t,n,a){function r(e,t,n={}){if(n[e.refId])return[];n[e.refId]=!0;let a=[];return"findImageFromTags"===e.type&&a.push({fromContext:!0,imageLabelOrSha:e.imageLabelOrSha,stageId:e.refId}),e.requisiteStageRefIds.forEach(function(e){const i=t.find(t=>t.refId===e);i&&(a=a.concat(r(i,t,n)))}),a}function i(e){return e.filter(e=>"docker"===e.type).map(e=>({fromTrigger:!0,repository:e.repository,account:e.account,organization:e.organization,registry:e.registry,tag:e.tag}))}function s(e,n){n=n||{};const a=f.getCredentialsKeyedByAccount("ecs"),r=n.account||e.defaultCredentials.ecs,i=n.region||e.defaultRegions.ecs,s=f.getAvailabilityZonesForAccountAndRegion("ecs",r,i);return t.all({preferredZones:s,credentialsKeyedByAccount:a}).then(function(t){const a=t.preferredZones;let s="None (No IAM role)";s=s.replace("{{application}}",e.name);const o={application:e.name,credentials:r,region:i,strategy:"",capacity:{min:1,max:1,desired:1},launchType:"EC2",healthCheckType:"EC2",selectedProvider:"ecs",iamRole:s,dockerImageCredentialsSecret:"None (No registry credentials)",availabilityZones:a,subnetType:"",securityGroupNames:[],healthCheckGracePeriodSeconds:"",placementConstraints:[],placementStrategyName:"",taskDefinitionArtifact:{},useTaskDefinitionArtifact:!1,placementStrategySequence:[],serviceDiscoveryAssociations:[],ecsClusterName:"",targetGroup:"",copySourceScalingPoliciesAndActions:!0,preferSourceCapacity:!0,useSourceCapacity:!0,enableDeploymentCircuitBreaker:!1,viewState:{useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!0,mode:n.mode||"create",disableStrategySelection:!0,dirty:{}}};return e.attributes&&e.attributes.platformHealthOnlyShowOverride&&e.attributes.platformHealthOnly&&(o.interestingHealthProviderNames=["ecs"]),o})}return{buildNewServerGroupCommand:s,buildServerGroupCommandFromExisting:function(e,t,n="clone"){return s(e,{account:t.account,region:t.region}).then(function(e){return e.credentials=t.account,e.app=t.moniker.app,e.stack=t.moniker.stack,e.region=t.region,e.ecsClusterName=t.ecsCluster,e.capacity=t.capacity,e.viewState.mode=n,e})},buildNewServerGroupCommandForPipeline:function(e,n){let a=r(e,n.stages)||[];return a=a.concat(i(n.triggers)),t.when({viewState:{requiresTemplateSelection:!0,overrides:{viewState:{mode:"editPipeline",contextImages:a,pipeline:n,currentStage:e}}}})},buildServerGroupCommandFromPipeline:function(t,n,a,o){const l=j.cloneDeep(n),c=Object.keys(l.availabilityZones)[0];return s(t,{account:l.account,region:c}).then(function(t){const n=l.availabilityZones[c].join(",")===t.availabilityZones.join(",");let s=r(a,o.stages)||[];s=s.concat(i(o.triggers)),t.docker&&t.docker.image&&(t.docker.image=function(e,t){if(e.fromContext){const n=t.find(t=>e.stageId===t.stageId);return n?(e.cluster=n.cluster,e.pattern=n.pattern,e.repository=n.repository,e):null}if(e.fromTrigger)return t.find(t=>e.registry===t.registry&&e.repository===t.repository&&e.tag===t.tag)?e:null;return e}(t.docker.image,s));const d={instanceProfile:void 0,disableImageSelection:!0,useSimpleCapacity:l.capacity.min===l.capacity.max&&!0!==l.useSourceCapacity,usePreferredZones:n,mode:"editPipeline",submitButtonLabel:"Done",templatingEnabled:!0,existingPipelineCluster:!0,dirty:{},contextImages:s,pipeline:o,currentStage:a},p={region:c,credentials:l.account,availabilityZones:l.availabilityZones[c],viewState:d};return l.strategy=l.strategy||"",e.extend({},t,l,p)})},buildUpdateServerGroupCommand:function(e){const t={type:"modifyAsg",asgs:[{asgName:e.name,region:e.region}],healthCheckType:e.asg.healthCheckType,credentials:e.account};return a.configureUpdateCommand(t),t}}}]);const Qe="spinnaker.ecs.cloneServerGroup.controller";t(Qe,[V,Ye,N,P,E,Ee,De,Ve,I]).controller("ecsCloneServerGroupCtrl",["$scope","$uibModalInstance","$q","$state","serverGroupWriter","overrideRegistry","ecsServerGroupConfigurationService","serverGroupCommandRegistry","serverGroupCommand","iamRoleReader","ecsClusterReader","secretReader","application","title",function(e,t,n,a,r,i,s,o,l,c,d,p,u,m){function g(){if(e.$$destroyed)return;const t=e.taskMonitor.task.execution.stages.find(e=>"cloneServerGroup"===e.type);if(t&&t.context["deploy.server.groups"]){const n=t.context["deploy.server.groups"][e.command.region];if(n){const t={serverGroup:n,accountId:e.command.credentials,region:e.command.region,provider:"ecs"};let r="^.^.^.clusters.serverGroup";a.includes("**.clusters.serverGroup")&&(r="^.serverGroup"),a.includes("**.clusters.cluster.serverGroup")&&(r="^.^.serverGroup"),a.includes("**.clusters")&&(r=".serverGroup"),a.go(r,t)}}}function v(){s.configureCommand(e.command).then(function(){e.state.loaded=!0,e.command.credentialsChanged(l),e.command.regionChanged(l),e.$watch("command.subnetType",h(e.command.subnetTypeChanged)),e.$watch("command.credentials",h(e.command.credentialsChanged)),e.$watch("command.region",h(e.command.regionChanged)),e.$watch("command.placementStrategyName",h(e.command.placementStrategyNameChanged)),e.$watch("command.stack",()=>e.command.clusterChanged(e.command)),e.$watch("command.freeFormDetails",()=>e.command.clusterChanged(e.command))})}function h(e){return function(){e(l)}}e.pages={templateSelection:i.getTemplate("ecs.serverGroup.templateSelection","ecs/src/serverGroup/configure/wizard/templateSelection/templateSelection.html"),basicSettings:i.getTemplate("ecs.serverGroup.basicSettings","ecs/src/serverGroup/configure/wizard/location/basicSettings.html"),container:i.getTemplate("ecs.serverGroup.container","ecs/src/serverGroup/configure/wizard/container/container.html"),horizontalScaling:i.getTemplate("ecs.serverGroup.horizontalScaling","ecs/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.html"),networking:i.getTemplate("ecs.serverGroup.networking","ecs/src/serverGroup/configure/wizard/networking/networking.html"),logging:i.getTemplate("ecs.serverGroup.logging","ecs/src/serverGroup/configure/wizard/logging/logging.html"),serviceDiscovery:i.getTemplate("ecs.serverGroup.serviceDiscovery","ecs/src/serverGroup/configure/wizard/serviceDiscovery/serviceDiscovery.html"),advancedSettings:i.getTemplate("ecs.serverGroup.advancedSettings","ecs/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html"),taskDefinition:i.getTemplate("ecs.taskDefinition","ecs/src/serverGroup/configure/wizard/taskDefinition/taskDefinition.html")},e.title=m,e.applicationName=u.name,e.application=u,e.command=l,e.state={loaded:!1,requiresTemplateSelection:!!l.viewState.requiresTemplateSelection},this.templateSelectionText={copied:["account, region, ecs cluster, stack","capacity"],notCopied:["launch type, target group, network mode"]},e.command.viewState.disableStrategySelection||this.templateSelectionText.notCopied.push("the deployment strategy (if any) used to deploy the most recent server group"),e.taskMonitor=new z({application:u,title:"Creating your server group",modalInstance:t,onTaskComplete:function(){u.serverGroups.refresh(),u.serverGroups.onNextRefresh(e,g)}}),this.isValid=function(){return!0},this.showSubmitButton=function(){return x.allPagesVisited()},this.submit=function(){if("editPipeline"===e.command.viewState.mode||"createPipeline"===e.command.viewState.mode)return t.close(e.command);e.taskMonitor.submit(function(){return r.cloneServerGroup(e.command,u)})},this.cancel=function(){t.dismiss()},e.state.requiresTemplateSelection?e.state.loaded=!0:v(),this.templateSelected=()=>{e.state.requiresTemplateSelection=!1,v()},e.notifyAngular=function(t,n){"pipeline"==t?e.command.viewState.pipeline=n:e.command[t]=n},e.configureCommand=function(t){return s.configureCommand(e.command,t)},e.capacityProviderState={useCapacityProviders:e.command.capacityProviderStrategy&&e.command.capacityProviderStrategy.length>0,updateComputeOption:function(t){"launchType"==t?e.command.capacityProviderStrategy=[]:"capacityProviders"==t&&(e.command.launchType="",e.command.capacityProviderStrategy=e.command.capacityProviderStrategy||[])}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/templateSelection/templateSelection.html",'<deploy-initializer\n cloud-provider="ecs"\n command="command"\n application="application"\n parent-state="state"\n dismiss="ctrl.cancel()"\n template-selection-text="ctrl.templateSelectionText"\n on-template-selected="ctrl.templateSelected()"\n></deploy-initializer>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/location/basicSettings.html",'<div class="container-fluid form-horizontal" ng-controller="ecsServerGroupBasicSettingsCtrl as basicSettingsCtrl">\n <ng-form name="basicSettings">\n <div class="form-group row" ng-if="command.regionIsDeprecated(command)">\n <div class="col-md-12 error-message">\n <div class="alert alert-danger">\n You are deploying into a deprecated region within the {{ command.credentials }} account!\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Account</div>\n <div class="col-md-7">\n <account-select-field\n read-only="command.viewState.readOnlyFields.credentials"\n component="command"\n field="credentials"\n accounts="command.backingData.accounts"\n provider="\'ecs\'"\n ></account-select-field>\n </div>\n </div>\n <region-select-field\n read-only="command.viewState.readOnlyFields.region"\n label-columns="3"\n component="command"\n field="region"\n account="command.credentials"\n provider="\'ecs\'"\n regions="command.backingData.filtered.regions"\n ></region-select-field>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n ECS Cluster name <help-field key="ecs.serverGroup.clusterName"></help-field>\n </div>\n <div class="col-md-7">\n <div class="form-control-static" ng-if="!command.backingData.filtered.ecsClusters.length">\n No ECS clusters found in the selected account/region\n </div>\n <ui-select\n data-test-id="ServerGroup.clusterName"\n ng-model="command.ecsClusterName"\n ng-if="command.backingData.filtered.ecsClusters.length"\n class="form-control input-sm"\n required\n on-select="fieldChanged()"\n >\n <ui-select-match>{{$select.selected}}</ui-select-match>\n <ui-select-choices\n repeat="ecsClusterName in command.backingData.filtered.ecsClusters | filter: $select.search"\n >\n <span ng-bind-html="ecsClusterName"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Stack\n <help-field key="ecs.serverGroup.stack"></help-field>\n </div>\n <div class="col-md-7">\n <input\n data-test-id="ServerGroup.stack"\n type="text"\n class="form-control input-sm no-spel"\n ng-pattern="basicSettingsCtrl.stackPattern"\n name="stack"\n ng-model="command.stack"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.stack.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Only dot(.) and underscore(_) special characters are allowed in the Stack field.</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Detail\n <help-field key="ecs.serverGroup.detail"></help-field>\n </div>\n <div class="col-md-7">\n <input\n data-test-id="ServerGroup.details"\n type="text"\n class="form-control input-sm no-spel"\n ng-pattern="basicSettingsCtrl.detailPattern"\n name="details"\n ng-model="command.freeFormDetails"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.details.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Only dot(.), underscore(_), and dash(-) special characters are allowed in the Detail field.</span>\n </div>\n </div>\n <deployment-strategy-selector\n ng-if="!command.viewState.disableStrategySelection && command.selectedProvider"\n command="command"\n ></deployment-strategy-selector>\n <div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">\n <div class="col-md-12">\n <div class="well-compact" ng-class="basicSettingsCtrl.showPreviewAsWarning() ? \'alert alert-warning\' : \'well\'">\n <h5 class="text-center">\n <p>Your server group will be in the cluster:</p>\n <p>\n <strong>\n {{basicSettingsCtrl.getNamePreview()}}\n <span ng-if="basicSettingsCtrl.createsNewCluster()"> (new cluster)</span>\n </strong>\n </p>\n <div\n class="text-left"\n ng-if="!basicSettingsCtrl.createsNewCluster() && command.viewState.mode === \'create\' && latestServerGroup"\n >\n <p>There is already a server group in this cluster. Do you want to clone it?</p>\n <p>\n Cloning copies the entire configuration from the selected server group, allowing you to modify whichever\n fields (e.g. image) you need to change in the new server group.\n </p>\n <p>\n To clone a server group, select "Clone" from the "Server Group Actions" menu in the details view of the\n server group.\n </p>\n <p>\n <a href ng-click="basicSettingsCtrl.navigateToLatestServerGroup()">\n Go to details for {{latestServerGroup.name}}\n </a>\n </p>\n </div>\n </h5>\n </div>\n </div>\n </div>\n </ng-form>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/container/container.html",'<div class="clearfix">\n <div class="col-md-12">\n <container-react\n command="command"\n notify-angular="notifyAngular"\n configure-command="configureCommand"\n ></container-react>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.html",'<div class="clearfix">\n <div class="row">\n <div class="col-md-12">\n <ecs-server-group-horizontal-scaling\n command="command"\n application="application"\n capacity-provider-state="capacityProviderState"\n notify-angular="notifyAngular"\n configure-command="configureCommand"\n ></ecs-server-group-horizontal-scaling>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/networking/networking.html",'<div class="clearfix">\n <div class="col-md-12">\n <ecs-networking-react\n command="command"\n notify-angular="notifyAngular"\n configure-command="configureCommand"\n ></ecs-networking-react>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/logging/logging.html",'<div class="clearfix">\n <div class="row">\n <div class="col-md-12">\n <ecs-server-group-logging command="command" application="application"></ecs-server-group-logging>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/serviceDiscovery/serviceDiscovery.html",'<div class="clearfix">\n <div class="row">\n <div class="col-md-12">\n <service-discovery-react\n command="command"\n notify-angular="notifyAngular"\n configure-command="configureCommand"\n ></service-discovery-react>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html",'<div class="clearfix">\n <div class="row">\n <div class="col-md-12">\n <ecs-server-group-advanced-settings\n command="command"\n application="application"\n ></ecs-server-group-advanced-settings>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/taskDefinition/taskDefinition.html",'<div class="clearfix">\n <div class="row">\n <div class="col-md-12">\n <div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Task Definition source</b>\n <help-field key="ecs.taskDefinition"></help-field>\n </div>\n <div class="col-md-2 radio">\n <label>\n <input\n data-test-id="ServerGroup.useInputs"\n type="radio"\n ng-model="command.useTaskDefinitionArtifact"\n ng-value="false"\n id="taskDefinitionSourceInputs"\n />\n Inputs\n </label>\n </div>\n <div class="col-md-1 radio">\n <label>\n <input\n data-test-id="ServerGroup.useArtifacts"\n type="radio"\n ng-model="command.useTaskDefinitionArtifact"\n ng-value="true"\n ng-disabled="command.viewState.mode === \'create\'"\n id="taskDefinitionSourceArtifact"\n />\n Artifact\n </label>\n </div>\n </div>\n <div ng-if="command.viewState.mode === \'create\'" class="color-text-caption">\n <hr />\n <span><em>Artifacts not supported outside of pipelines.</em></span>\n </div>\n </div>\n </div>\n <div class="col-md-12" ng-if="command.useTaskDefinitionArtifact">\n <hr />\n <task-definition-react\n command="command"\n notify-angular="notifyAngular"\n configure-command="configureCommand"\n ></task-definition-react>\n </div>\n </div>\n</div>\n')}]);const et="spinnaker.ecs.serverGroup.configure.wizard.advancedSettings.component";t(et,[]).component("ecsServerGroupAdvancedSettings",{bindings:{command:"=",application:"="},templateUrl:"ecs/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.html"}),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Health Check Grace Period\n <help-field key="ecs.healthgraceperiod"></help-field>\n </div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm no-spel"\n ng-model="$ctrl.command.healthCheckGracePeriodSeconds"\n />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n <b>ECS IAM Instance Profile</b> <help-field key="ecs.iamrole"></help-field>\n </div>\n \x3c!-- TODO - Add a help box that explains that the container does not share profiles with the host --\x3e\n\n <div class="col-md-7" ng-if="!$ctrl.command.backingData.filtered.iamRoles.length">\n No account was selected, or no IAM roles are available for ECS tasks in this account.\n </div>\n\n <div class="col-md-7" ng-if="$ctrl.command.backingData.filtered.iamRoles.length">\n <ui-select\n ng-model="$ctrl.command.iamRole"\n class="form-control input-sm"\n required\n on-select="$ctrl.fieldChanged()"\n >\n <ui-select-match>{{ $select.selected }}</ui-select-match>\n <ui-select-choices repeat="iamRole in $ctrl.command.backingData.filtered.iamRoles | filter: $select.search">\n <span ng-bind-html="iamRole"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div ng-if="!$ctrl.command.useTaskDefinitionArtifact">\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n <b>Docker Image Credentials</b> <help-field key="ecs.dockerimagecredentials"></help-field>\n </div>\n <div class="col-md-7" ng-if="!$ctrl.command.backingData.filtered.secrets.length">\n No account or region was selected, or no AWS Secrets Manager secrets are available in this account and region.\n </div>\n\n <div class="col-md-7" ng-if="$ctrl.command.backingData.filtered.secrets.length">\n <ui-select\n ng-model="$ctrl.command.dockerImageCredentialsSecret"\n class="form-control input-sm"\n required\n on-select="$ctrl.fieldChanged()"\n >\n <ui-select-match>{{ $select.selected }}</ui-select-match>\n <ui-select-choices repeat="secret in $ctrl.command.backingData.filtered.secrets | filter: $select.search">\n <span ng-bind-html="secret"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Fargate platform version\n <help-field key="ecs.platformVersion"></help-field>\n </div>\n <div class="col-md-3">\n <input\n type="text"\n class="form-control input-sm"\n name="platformVersion"\n ng-model="$ctrl.command.platformVersion"\n />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Enable Deployment Circuit Breaker\n <help-field key="ecs.enableDeploymentCircuitBreaker"></help-field>\n </div>\n <div class="col-md-3">\n <input type="checkbox" ng-model="$ctrl.command.enableDeploymentCircuitBreaker" />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n <b>Placement Strategy</b> <help-field key="ecs.placementStrategy"></help-field>\n </div>\n <div class="col-md-7">\n <ui-select ng-model="$ctrl.command.placementStrategyName" class="form-control input-sm">\n <ui-select-match>{{ $select.selected }}</ui-select-match>\n <ui-select-choices\n repeat="item in [\'AZ Balanced Spread\', \'AZ Balanced BinPack CPU\', \'AZ Balanced BinPack Memory\', \'BinPack CPU\', \'BinPack Memory\', \'One Task Per Host\', \'None\'] | filter: $select.search"\n >\n <span ng-bind-html="item"></span>\n </ui-select-choices>\n </ui-select>\n \x3c!-- TODO - implement handling of custom placement strategies and constraints --\x3e\n </div>\n </div>\n\n <div class="form-group">\n <div class="sm-label-left">\n <b>Placement Constraints</b>\n <help-field key="ecs.placementConstraints"></help-field>\n </div>\n <form name="ecsPlacementConstraints">\n <table class="table table-condensed packed tags">\n <thead>\n <tr>\n <th style="width: 25%">Type <help-field key="ecs.placementConstraintType"></help-field></th>\n <th style="width: 68%">Expression <help-field key="ecs.placementConstraintExpression"></help-field></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="constraint in $ctrl.command.placementConstraints">\n <td>\n <select\n class="form-control input-sm"\n ng-model="constraint.type"\n ng-options="type for type in [\'distinctInstance\', \'memberOf\']"\n ></select>\n </td>\n <td>\n <input type="text" class="form-control input-sm no-spel" ng-model="constraint.expression" />\n </td>\n <td>\n <div class="form-control-static">\n <a class="btn-link sm-label" ng-click="$ctrl.command.placementConstraints.splice($index, 1)">\n <span class="glyphicon glyphicon-trash"></span>\n <span class="sr-only">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="3">\n <button class="btn btn-block btn-sm add-new" ng-click="$ctrl.command.placementConstraints.push({})">\n <span class="glyphicon glyphicon-plus-sign"></span>\n Add New Placement Constraint\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n\n <div ng-if="!$ctrl.command.useTaskDefinitionArtifact">\n <div class="form-group">\n <div class="sm-label-left">\n <b>Docker labels (optional)</b>\n <help-field key="ecs.dockerLabels"></help-field>\n </div>\n <map-editor model="$ctrl.command.dockerLabels" allow-empty="true"></map-editor>\n </div>\n\n <div class="form-group">\n <div class="sm-label-left">\n <b>Environment Variables (optional)</b>\n <help-field key="ecs.environmentVariables"></help-field>\n </div>\n <map-editor model="$ctrl.command.environmentVariables" allow-empty="true"></map-editor>\n </div>\n </div>\n\n <div class="form-group">\n <div class="sm-label-left">\n <b>Tags (optional)</b>\n <help-field key="ecs.tags"></help-field>\n </div>\n <map-editor model="$ctrl.command.tags" allow-empty="true"></map-editor>\n </div>\n\n <div ng-if="$ctrl.command.useTaskDefinitionArtifact" style="color: #666">\n <hr />\n <p>\n <em\n ><strong>Docker Image Credentials, Docker labels</strong>, and <strong>Environment Variables</strong> cannot be\n individually set when using a Task Definition artifact. Please include them in their respective container\n definition in that file.\n </em>\n </p>\n </div>\n</div>\n')}]);class tt extends ue.Component{constructor(e){super(e),this.getAvailableCapacityProviders=e=>e.backingData&&e.backingData.filtered&&e.backingData.filtered.availableCapacityProviders?e.backingData.filtered.availableCapacityProviders:[],this.getDefaultCapacityProviderStrategy=e=>e.backingData&&e.backingData.filtered&&e.backingData.filtered.defaultCapacityProviderStrategy?e.backingData.filtered.defaultCapacityProviderStrategy:[],this.getCapacityProviderStrategy=(e,t)=>e&&t.backingData&&t.backingData.filtered&&t.backingData.filtered.defaultCapacityProviderStrategy?t.backingData.filtered.defaultCapacityProviderStrategy:this.state.capacityProviderStrategy,this.addCapacityProviderStrategy=()=>{const e=this.state.capacityProviderStrategy;e.push({capacityProvider:"",base:null,weight:null}),this.props.notifyAngular("capacityProviderStrategy",e),this.setState({capacityProviderStrategy:e})},this.removeCapacityProviderStrategy=e=>{const t=this.state.capacityProviderStrategy;t.splice(e,1),this.props.notifyAngular("capacityProviderStrategy",t),this.setState({capacityProviderStrategy:t})},this.updateCapacityProviderName=(e,t)=>{const n=this.state.capacityProviderStrategy;n[e].capacityProvider=t,this.props.notifyAngular("capacityProviderStrategy",n),this.setState({capacityProviderStrategy:n}),this.props.command.viewState.dirty.customCapacityProviders=[]},this.updateCapacityProviderBase=(e,t)=>{const n=this.state.capacityProviderStrategy;n[e].base=t,this.props.notifyAngular("capacityProviderStrategy",n),this.setState({capacityProviderStrategy:n})},this.updateCapacityProviderWeight=(e,t)=>{const n=this.state.capacityProviderStrategy;n[e].weight=t,this.props.notifyAngular("capacityProviderStrategy",n),this.setState({capacityProviderStrategy:n})},this.updateCapacityProviderType=e=>{this.setState({useDefaultCapacityProviders:e}),this.props.notifyAngular("useDefaultCapacityProviders",e),this.props.command.viewState.dirty.customCapacityProviders=[];const t=e&&this.state.defaultCapacityProviderStrategy.length>0?this.state.defaultCapacityProviderStrategy:[];this.setState({capacityProviderStrategy:t}),this.props.notifyAngular("capacityProviderStrategy",t)};const t=this.props.command;this.state={availableCapacityProviders:this.getAvailableCapacityProviders(t),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(t),ecsClusterName:t.ecsClusterName,useDefaultCapacityProviders:t.useDefaultCapacityProviders||t.capacityProviderStrategy&&0==t.capacityProviderStrategy.length,capacityProviderStrategy:t.capacityProviderStrategy&&t.capacityProviderStrategy.length>0?t.capacityProviderStrategy:[],capacityProviderLoadedFlag:!1}}componentDidMount(){this.props.configureCommand("1").then(()=>{const e=this.props.command,t=this.state.useDefaultCapacityProviders;this.setState({availableCapacityProviders:this.getAvailableCapacityProviders(e),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(e),capacityProviderStrategy:this.getCapacityProviderStrategy(t,e),capacityProviderLoadedFlag:!0}),this.props.notifyAngular("useDefaultCapacityProviders",this.state.useDefaultCapacityProviders),this.props.notifyAngular("capacityProviderStrategy",this.state.capacityProviderStrategy)})}render(){const e=this.updateCapacityProviderName,t=this.updateCapacityProviderBase,n=this.updateCapacityProviderWeight,a=this.addCapacityProviderStrategy,r=this.removeCapacityProviderStrategy,i=this.updateCapacityProviderType,s=this.state.capacityProviderStrategy,o=this.state.useDefaultCapacityProviders,l=this.state.capacityProviderLoadedFlag,c=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.customCapacityProviders?this.props.command.viewState.dirty.customCapacityProviders:[],d=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.defaulCapacityProviders?this.props.command.viewState.dirty.defaulCapacityProviders:[],p=this.state.availableCapacityProviders&&this.state.availableCapacityProviders.length>0?this.state.availableCapacityProviders.map(e=>({label:`${e}`,value:e})):[],u=o&&d?ue.createElement("div",{className:"alert alert-warning"},ue.createElement("p",{className:"text-left"},ue.createElement("i",{className:"fa fa-exclamation-triangle"}),"Invalid capacity providers are a part of default capacity provider strategy.",ue.createElement("br",null),"Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a custom strategy.")):"",m=c?c.map(function(e,t){return ue.createElement("li",{key:t},e)}):"",g=o&&d.length>0?u:c.length>0&&!o?ue.createElement("div",{className:"alert alert-warning"},ue.createElement("p",null,ue.createElement("i",{className:"fa fa-exclamation-triangle"}),"The following capacity providers could not be found in the selected account/region/cluster and were removed:"),ue.createElement("ul",null,m),ue.createElement("br",null),ue.createElement("p",{className:"text-left"},"Please select the capacity provider(s) from the dropdown to resolve this error.")):"",v=s.length>0?s.map(function(a,i){return ue.createElement("tr",{key:i},o?ue.createElement("td",null,ue.createElement("input",{"data-test-id":"ServerGroup.defaultCapacityProvider.name."+i,type:"string",className:"form-control input-sm no-spel",required:!0,value:a.capacityProvider,disabled:!0})):ue.createElement("td",{"data-test-id":"ServerGroup.customCapacityProvider.name."+i},ue.createElement(R,{placeholder:"Select capacity provider",options:p,value:a.capacityProvider,onChange:t=>{e(i,t.label)},clearable:!1})),ue.createElement("td",null,ue.createElement("input",{"data-test-id":"ServerGroup.capacityProvider.base."+i,disabled:o,type:"number",className:"form-control input-sm no-spel",value:a.base,onChange:e=>t(i,e.target.valueAsNumber)})),ue.createElement("td",null,ue.createElement("input",{"data-test-id":"ServerGroup.capacityProvider.weight."+i,disabled:o,type:"number",className:"form-control input-sm no-spel",required:!0,value:a.weight,onChange:e=>n(i,e.target.valueAsNumber)})),o?"":ue.createElement("td",null,ue.createElement("div",{className:"form-control-static"},ue.createElement("a",{className:"btn-link sm-label",onClick:()=>r(i)},ue.createElement("span",{className:"glyphicon glyphicon-trash"}),ue.createElement("span",{className:"sr-only"},"Remove")))))}):o&&0==this.state.capacityProviderStrategy.length?ue.createElement("tr",null,ue.createElement("div",{className:"sm-label-left",style:{width:"200%"}},ue.createElement(he,{color:"warning"}," ","The cluster does not have a default capacity provider strategy defined. Set a default capacity provider strategy or use a custom strategy."))):"",h=this.state.ecsClusterName&&this.props.command.credentials&&this.props.command.region&&!o&&p.length>0?ue.createElement("button",{"data-test-id":"ServerGroup.addCapacityProvider",className:"btn btn-block btn-sm add-new",onClick:a},ue.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Capacity Provider"):!o&&l&&0==p.length?ue.createElement("div",{className:"sm-label-left",style:{width:"200%"}},ue.createElement(he,{color:"warning"}," The cluster does not have capacity providers defined. ")):"";return ue.createElement("div",null,(c.length>0||d.length>0)&&l?ue.createElement("div",null,g):"",ue.createElement("div",{className:"sm-label-left"},ue.createElement("b",null,"Capacity Provider Strategy"),ue.createElement(M,{id:"ecs.capacityProviderStrategy"})," ",ue.createElement("br",null),ue.createElement("span",null,"(",this.state.ecsClusterName,")")),ue.createElement("div",{className:"radio"},ue.createElement("label",null,ue.createElement("input",{"data-test-id":"ServerGroup.capacityProviders.default",type:"radio",checked:o,onClick:()=>i(!0),id:"computeOptionsLaunchType1"}),"Use cluster default")),ue.createElement("div",{className:"radio"},ue.createElement("label",null,ue.createElement("input",{"data-test-id":"ServerGroup.capacityProviders.custom",type:"radio",checked:!o,onClick:()=>i(!1),id:"computeOptionsCapacityProviders2"}),"Use custom (Advanced)")),l?ue.createElement("table",{className:"table table-condensed packed tags"},ue.createElement("thead",null,ue.createElement("tr",null,ue.createElement("th",{style:{width:"50%"}},"Provider name",ue.createElement(M,{id:"ecs.capacityProviderName"})),ue.createElement("th",{style:{width:"25%"}},"Base",ue.createElement(M,{id:"ecs.capacityProviderBase"})),ue.createElement("th",{style:{width:"25%"}},"Weight",ue.createElement(M,{id:"ecs.capacityProviderWeight"})))),ue.createElement("tbody",null,v),ue.createElement("tfoot",null,ue.createElement("tr",null,ue.createElement("td",{colSpan:4},h)))):ue.createElement("div",{className:"load medium"},ue.createElement("div",{className:"message"},"Loading capacity providers..."),ue.createElement("div",{className:"bars"},ue.createElement("div",{className:"bar"}),ue.createElement("div",{className:"bar"}),ue.createElement("div",{className:"bar"}))))}}const nt="spinnaker.ecs.serverGroup.configure.wizard.capacityProvider.react";t(nt,[]).component("ecsCapacityProviderReact",fe($(tt,"ecsCapacityProviderReact"),["command","notifyAngular","configureCommand"]));class at extends pe.Component{constructor(e){var t,n;super(e),this.getIdToImageMap=()=>{const e=new Map;return this.props.command.backingData.filtered.images.forEach(t=>{e.set(t.imageId,t)}),e},this.getEmptyImageDescription=()=>({imageId:"",message:"",fromTrigger:!1,fromContext:!1,stageId:"",imageLabelOrSha:"",account:"",registry:"",repository:"",tag:""}),this.updateDockerRegistryAccount=e=>{const t=e.value;this.setState({selectedDockerAccount:t,dockerImages:[]}),ve.findImages({provider:"dockerRegistry",account:t,count:50}).then(e=>{const t=e;this.props.command.backingData.filtered.images=t,this.setState({dockerImages:t})})},this.pushTargetGroupMapping=()=>{const e=this.state.targetGroupMappings;e.push({containerName:"",targetGroup:"",containerPort:80}),this.setState({targetGroupMappings:e})},this.updateContainerMappingImage=e=>{let t=this.getIdToImageMap().get(e.value);t||(t=this.getEmptyImageDescription()),this.props.notifyAngular("imageDescription",t),this.setState({imageDescription:t})},this.updateComputeUnits=e=>{this.props.notifyAngular("computeUnits",e),this.setState({computeUnits:e})},this.updateReservedMemory=e=>{this.props.notifyAngular("reservedMemory",e),this.setState({reservedMemory:e})},this.updateTargetGroupMappingTargetGroup=(e,t)=>{const n=this.state.targetGroupMappings;n[e].targetGroup=t.value,this.props.notifyAngular("targetGroupMappings",n),this.setState({targetGroupMappings:n}),this.updateDirtyTargetGroups()},this.updateTargetGroupMappingPort=(e,t)=>{const n=this.state.targetGroupMappings;n[e].containerPort=t,this.props.notifyAngular("targetGroupMappings",n),this.setState({targetGroupMappings:n})},this.removeTargetGroupMapping=e=>{const t=this.state.targetGroupMappings;t.splice(e,1),this.props.notifyAngular("targetGroupMappings",t),this.setState({targetGroupMappings:t})},this.updateDirtyTargetGroups=()=>{this.props.command.viewState.dirty.targetGroups=[]};const a=this.props.command;let r="";a.containerMappings&&a.containerMappings.length>0&&(r=a.containerMappings[0].containerName);let i=[];a.targetGroupMappings&&a.targetGroupMappings.length>0&&(i=a.targetGroupMappings),a.targetGroup&&a.targetGroup.length>0&&(i.push({containerName:a.loadBalancedContainer||r,targetGroup:a.targetGroup,containerPort:a.containerPort}),a.targetGroup="",a.loadBalancedContainer=""),a.targetGroupMappings=re(i,W),a.containerMappings=null,this.state={imageDescription:a.imageDescription?a.imageDescription:this.getEmptyImageDescription(),computeUnits:a.computeUnits,reservedMemory:a.reservedMemory,dockerImages:a.backingData&&a.backingData.filtered?a.backingData.filtered.images:[],dockerRegistryAccounts:[],selectedDockerAccount:null!=(n=null==(t=a.imageDescription)?void 0:t.account)?n:"",targetGroupMappings:a.targetGroupMappings,targetGroupsAvailable:a.backingData&&a.backingData.filtered?a.backingData.filtered.targetGroups:[]},this.state.targetGroupMappings.forEach(e=>{e.containerName=""})}componentDidMount(){f.listAccounts("dockerRegistry").then(e=>{this.setState({dockerRegistryAccounts:e})}),this.props.configureCommand("1").then(()=>{this.setState({dockerImages:this.props.command.backingData.filtered.images,targetGroupsAvailable:this.props.command.backingData.filtered.targetGroups})})}render(){const e=this.removeTargetGroupMapping,t=this.updateContainerMappingImage,n=this.updateTargetGroupMappingTargetGroup,a=this.updateTargetGroupMappingPort,r=this.updateComputeUnits,i=this.updateReservedMemory,s=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.targetGroups?this.props.command.viewState.dirty.targetGroups:[],o=this.state.dockerRegistryAccounts.map(e=>({label:e.name,value:e.name})),l=this.state.dockerImages.map(function(e){let t="";return(e.fromTrigger||e.fromContext)&&(t=e.fromTrigger?"(TRIGGER) ":"(FIND IMAGE RESULT) "),{label:`${t} (${e.imageId})`,value:e.imageId}}),c=s?s.map(function(e,t){return pe.createElement("li",{key:t},e)}):"",d=pe.createElement("div",{className:"alert alert-warning"},pe.createElement("p",null,pe.createElement("i",{className:"fa fa-exclamation-triangle"}),"The following target groups could not be found in the selected account/region/VPC and were removed:"),pe.createElement("ul",null,c),pe.createElement("br",null),pe.createElement("p",{className:"text-left"},"Please select the target group(s) from the dropdown to resolve this error.")),p=this.state.targetGroupsAvailable.length?pe.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"ContainerInputs.targetGroupAdd",onClick:this.pushTargetGroupMapping},pe.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Target Group Mapping"):pe.createElement("div",{className:"sm-label-left"},pe.createElement(he,{color:"warning"},"No target groups found in the selected account/region/VPC")),u=this.state.targetGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),m=this.state.targetGroupMappings.map(function(t,r){return pe.createElement("tr",{key:r},pe.createElement("td",{"data-test-id":"ContainerInputs.targetGroup"},pe.createElement(R,{placeholder:"Select a target group to use...",options:u,value:t.targetGroup.toString(),onChange:e=>n(r,e),clearable:!1})),pe.createElement("td",null,pe.createElement("input",{"data-test-id":"ContainerInputs.targetGroupPort",type:"number",className:"form-control input-sm no-spel",required:!0,value:t.containerPort.toString(),onChange:e=>a(r,e.target.valueAsNumber)})),pe.createElement("td",null,pe.createElement("div",{className:"form-control-static"},pe.createElement("a",{className:"btn-link sm-label","data-test-id":"ContainerInputs.targetGroupRemove",onClick:()=>e(r)},pe.createElement("span",{className:"glyphicon glyphicon-trash"}),pe.createElement("span",{className:"sr-only"},"Remove")))))});return pe.createElement("div",{className:"container-fluid form-horizontal"},s.length>0?pe.createElement("div",null,d):"",pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Docker Registry Account")),pe.createElement("div",{className:"col-md-9","data-test-id":"ContainerInputs.dockerRegistryAccount"},pe.createElement(R,{placeholder:"Select a Docker registry account...",options:o,value:this.state.selectedDockerAccount,onChange:e=>this.updateDockerRegistryAccount(e),clearable:!1}))),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Container Image"),pe.createElement(M,{id:"ecs.containerMappingImage"})),pe.createElement("div",{className:"col-md-9","data-test-id":"ContainerInputs.containerImage"},pe.createElement(R,{placeholder:"Select an image to use...",options:l,value:this.state.imageDescription.imageId,onChange:e=>{t(e)},clearable:!1}))),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Compute Units"),pe.createElement(M,{id:"ecs.capacity.reserved.computeUnits"})),pe.createElement("div",{className:"col-md-9",style:{width:"100px"}},pe.createElement("input",{"data-test-id":"ContainerInputs.computeUnits",type:"number",className:"form-control input-sm no-spel",required:!1,value:this.state.computeUnits,onChange:e=>r(e.target.valueAsNumber)}))),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Reserved Memory"),pe.createElement(M,{id:"ecs.capacity.reserved.memory"})),pe.createElement("div",{className:"col-md-9",style:{width:"100px"}},pe.createElement("input",{"data-test-id":"ContainerInputs.reservedMemory",type:"number",className:"form-control input-sm no-spel",required:!1,value:this.state.reservedMemory,onChange:e=>i(e.target.valueAsNumber)}))),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"sm-label-left"},pe.createElement("b",null,"Target Group Mappings"),pe.createElement(M,{id:"ecs.targetGroupMappings"})),pe.createElement("form",{name:"ecsContainerTargetGroupMappings"},pe.createElement("table",{className:"table table-condensed packed tags"},pe.createElement("thead",null,pe.createElement("tr",{key:"header"},pe.createElement("th",{style:{width:"80%"}},"Target group",pe.createElement(M,{id:"ecs.loadBalancer.targetGroup"})),pe.createElement("th",{style:{width:"20%"}},"Target port",pe.createElement(M,{id:"ecs.loadbalancing.targetPort"})),pe.createElement("th",null))),pe.createElement("tbody",null,m),pe.createElement("tfoot",null,pe.createElement("tr",null,pe.createElement("td",{colSpan:4},p)))))))}}const rt="spinnaker.ecs.serverGroup.configure.wizard.container.react";t(rt,[]).component("containerReact",fe($(at,"containerReact"),["command","notifyAngular","configureCommand"]));const it="spinnaker.ecs.serverGroup.configure.wizard.horizontalScaling.component";t(it,[]).component("ecsServerGroupHorizontalScaling",{bindings:{command:"=",application:"=",capacityProviderState:"=",notifyAngular:"=",configureCommand:"="},templateUrl:"ecs/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.html"}),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Compute options</b>\n <help-field key="ecs.computeOptions"></help-field>\n </div>\n <div class="col-md-2 radio">\n <label>\n <input\n data-test-id="ServerGroup.computeOptionsLaunchType"\n type="radio"\n ng-model="$ctrl.capacityProviderState.useCapacityProviders"\n ng-value="false"\n ng-click="$ctrl.capacityProviderState.updateComputeOption(\'launchType\')"\n id="computeOptionsLaunchType"\n />\n Launch type\n </label>\n </div>\n <div class="col-md-1 radio">\n <label>\n <input\n data-test-id="ServerGroup.computeOptionsCapacityProviders"\n type="radio"\n ng-model="$ctrl.capacityProviderState.useCapacityProviders"\n ng-value="true"\n ng-click="$ctrl.capacityProviderState.updateComputeOption(\'capacityProviders\')"\n id="computeOptionsCapacityProviders"\n />\n Capacity Providers\n </label>\n </div>\n </div>\n\n <div class="form-group" ng-if="$ctrl.capacityProviderState.useCapacityProviders">\n <ecs-capacity-provider-react\n command="$ctrl.command"\n notify-angular="$ctrl.notifyAngular"\n configure-command="$ctrl.configureCommand"\n ></ecs-capacity-provider-react>\n </div>\n\n <div class="form-group" ng-if="!$ctrl.capacityProviderState.useCapacityProviders" style="padding-top: 10px">\n <div class="col-md-5 sm-label-right">\n Launch Type\n <help-field key="ecs.launchtype"></help-field>\n </div>\n <div class="col-md-3" data-test-id="ServerGroup.launchType">\n <ui-select ng-model="$ctrl.command.launchType" class="form-control input-sm">\n <ui-select-match placeholder="Select...">{{ $select.selected }}</ui-select-match>\n <ui-select-choices repeat="launchType in $ctrl.command.backingData.launchTypes | filter: $select.search">\n <span ng-bind-html="launchType | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <hr />\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Desired capacity\n <help-field key="ecs.capacity.desired"></help-field>\n </div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm no-spel"\n name="capacity"\n ng-model="$ctrl.command.capacity.desired"\n />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Minimum\n <help-field key="ecs.capacity.minimum"></help-field>\n </div>\n <div class="col-md-2">\n <input type="number" class="form-control input-sm no-spel" name="min" ng-model="$ctrl.command.capacity.min" />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n Maximum\n <help-field key="ecs.capacity.maximum"></help-field>\n </div>\n <div class="col-md-2">\n <input type="number" class="form-control input-sm no-spel" name="max" ng-model="$ctrl.command.capacity.max" />\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-12 checkbox">\n <label>\n <input\n type="checkbox"\n ng-model="$ctrl.command.useSourceCapacity"\n ng-change="$ctrl.command.preferSourceCapacity=$ctrl.command.useSourceCapacity"\n />\n <b>If available, use the previous server group\'s capacity</b>\n </label>\n <help-field key="ecs.capacity.overwrite"></help-field>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-12 checkbox">\n <label>\n <input type="checkbox" ng-model="$ctrl.command.copySourceScalingPoliciesAndActions" />\n <b>If available, copy the previous server group\'s autoscaling policies</b>\n </label>\n <help-field key="ecs.capacity.copySourceScalingPoliciesAndActions"></help-field>\n </div>\n </div>\n</div>\n')}]);const st="spinnaker.ecs.serverGroup.configure.basicSettings";e.module(st,[V,_]).controller("ecsServerGroupBasicSettingsCtrl",["$scope","$controller","$uibModalStack","$state",function(t,n,a,r){e.extend(this,n("BasicSettingsMixin",{$scope:t,$uibModalStack:a,$state:r})),t.$watch("form.$valid",function(e){e?(x.markClean("basicSettings"),x.markComplete("basicSettings")):x.markIncomplete("basicSettings")})}]);const ot="spinnaker.ecs.serverGroup.configure.wizard.logging.component";t(ot,[]).component("ecsServerGroupLogging",{bindings:{command:"=",application:"="},templateUrl:"ecs/src/serverGroup/configure/wizard/logging/logging.component.html"}),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/logging/logging.component.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-5 sm-label-right">\n <b>Log driver (Optional)</b> <help-field key="ecs.logDriver"></help-field>\n </div>\n <div class="col-md-7">\n <ui-select ng-model="$ctrl.command.logDriver" class="form-control input-sm" data-test-id="Logging.logDriver">\n <ui-select-match>{{ $select.selected }}</ui-select-match>\n <ui-select-choices\n repeat="item in [\'None\', \'awslogs\', \'fluentd\', \'gelf\', \'journald\', \'json-file\', \'logentries\', \'splunk\', \'sumologic\', \'syslog\'] | filter: $select.search"\n >\n <span ng-bind-html="item"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-if="$ctrl.command.logDriver && $ctrl.command.logDriver !== \'None\'">\n <div class="sm-label-left">\n <b>Logging options (optional)</b>\n <help-field key="ecs.logOptions"></help-field>\n </div>\n <map-editor model="$ctrl.command.logOptions" allow-empty="true"></map-editor>\n </div>\n\n <div class="form-group" ng-if="!$ctrl.command.logDriver || $ctrl.command.logDriver == \'None\'">\n Logging options are not available for your log driver selection.\n </div>\n</div>\n')}]);class lt extends pe.Component{constructor(e){super(e),this.updateNetworkMode=e=>{const t=e.value,n=this.props.command;this.props.notifyAngular("networkMode",t),this.setState({networkMode:t,subnetTypesAvailable:n.backingData&&n.backingData.filtered&&n.backingData.filtered.subnetTypes?n.backingData.filtered.subnetTypes:[]})},this.updateSecurityGroups=e=>{const t=Array.isArray(e)?e.map(e=>e.value):[];this.props.notifyAngular("securityGroupNames",t),this.setState({securityGroupNames:t})},this.updateSubnetTypes=e=>{const t=this.props.command,n=Array.isArray(e)?e.map(e=>e.value):[];this.props.notifyAngular("subnetTypes",n),t.subnetTypeChanged(t),this.setState({subnetTypes:n,securityGroupsAvailable:t.backingData&&t.backingData.filtered&&t.backingData.filtered.securityGroupNames?t.backingData.filtered.securityGroupNames:[]})},this.updateAssociatePublicIpAddress=e=>{this.props.notifyAngular("associatePublicIpAddress",e),this.setState({associatePublicIpAddress:e})};const t=this.props.command;let n=[];t.subnetTypes&&t.subnetTypes.length>0&&(n=t.subnetTypes),t.subnetType&&t.subnetType.length>0&&(n.push(t.subnetType),t.subnetType=""),t.subnetTypes=re(n,W),this.state={associatePublicIpAddress:t.associatePublicIpAddress,networkMode:t.networkMode,networkModesAvailable:t.backingData&&t.backingData.networkModes?t.backingData.networkModes:[],securityGroupNames:t.securityGroupNames,securityGroupsAvailable:t.backingData&&t.backingData.filtered&&t.backingData.filtered.securityGroupNames?t.backingData.filtered.securityGroupNames:[],subnetTypes:t.subnetTypes,subnetTypesAvailable:t.backingData&&t.backingData.filtered&&t.backingData.filtered.subnetTypes?t.backingData.filtered.subnetTypes:[]}}componentDidMount(){const e=this.props.command;this.props.configureCommand("1").then(()=>{this.setState({networkModesAvailable:e.backingData&&e.backingData.networkModes?e.backingData.networkModes:[],securityGroupsAvailable:e.backingData&&e.backingData.filtered&&e.backingData.filtered.securityGroupNames?e.backingData.filtered.securityGroupNames:[],subnetTypesAvailable:e.backingData&&e.backingData.filtered&&e.backingData.filtered.subnetTypes?e.backingData.filtered.subnetTypes:[]})})}render(){const e=this.updateAssociatePublicIpAddress,t=this.updateNetworkMode,n=this.updateSecurityGroups,a=this.updateSubnetTypes,r=this.state.networkModesAvailable.map(function(e){return{label:`${e}`,value:e}}),i=this.state.securityGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),s=this.state.subnetTypesAvailable.map(function(e){return{label:`${e.purpose} (${e.vpcId})`,value:e.purpose}}),o=this.state.subnetTypesAvailable.length?pe.createElement(R,{multi:!0,options:s,value:this.state.subnetTypes,onChange:e=>{a(e)}}):pe.createElement(he,{color:"warning"},"No account was selected, or no subnet types are available for this account"),l=this.state.securityGroupsAvailable.length?pe.createElement(R,{multi:!0,options:i,value:this.state.securityGroupNames,onChange:e=>{n(e)}}):pe.createElement(he,{color:"warning"},"No security groups found in the selected account/region"),c="awsvpc"===this.state.networkMode?pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"VPC Subnet"),pe.createElement(M,{key:"ecs.subnet"})),pe.createElement("div",{className:"col-md-9","data-test-id":"Networking.subnetType"},o)),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Security Groups"),pe.createElement(M,{key:"ecs.securityGroups"})),pe.createElement("div",{className:"col-md-9","data-test-id":"Networking.securityGroups"},l)),pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Associate Public IP Address"),pe.createElement(M,{key:"ecs.publicip"})),pe.createElement("div",{className:"col-md-1 radio"},pe.createElement("label",null,pe.createElement("input",{"data-test-id":"Networking.associatePublicIpAddressTrue",type:"radio",value:"true",id:"associatePublicIpAddressTrue",checked:!0===this.state.associatePublicIpAddress,onChange:()=>e(!0)}),"Yes")),pe.createElement("div",{className:"col-md-1 radio"},pe.createElement("label",null,pe.createElement("input",{"data-test-id":"Networking.associatePublicIpAddressFalse",type:"radio",value:"false",id:"associatePublicIpAddressFalse",checked:!1===this.state.associatePublicIpAddress,onChange:()=>e(!1)}),"No")))):pe.createElement("div",{className:"col-md-3 sm-label-right"});return pe.createElement("div",{className:"networking-fluid form-horizontal"},pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"form-group"},pe.createElement("div",{className:"col-md-3 sm-label-right"},pe.createElement("b",null,"Network Mode"),pe.createElement(M,{id:"ecs.networkMode"})),pe.createElement("div",{className:"col-md-9","data-test-id":"Networking.networkMode"},pe.createElement(R,{placeholder:"Select a network mode to use ...",options:r,value:this.state.networkMode,onChange:e=>{t(e)}})))),c)}}const ct="spinnaker.ecs.serverGroup.configure.wizard.networking.react";t(ct,[]).component("ecsNetworkingReact",fe($(lt,"ecsNetworkingReact"),["command","notifyAngular","configureCommand"]));class dt extends ue.Component{constructor(e){super(e),this.getNameToRegistryMap=()=>{const e=new Map;return this.props.command.backingData.filtered.serviceDiscoveryRegistries.forEach(t=>{e.set(t.displayName,t)}),e},this.getEmptyRegistry=()=>({account:"",region:"",name:"",id:"",arn:"",displayName:""}),this.updateServiceDiscoveryRegistry=(e,t)=>{let n=this.getNameToRegistryMap().get(t.value);n||(n=this.getEmptyRegistry());const a=this.state.serviceDiscoveryAssociations;a[e].registry=n,this.props.notifyAngular("serviceDiscoveryAssociations",a),this.setState({serviceDiscoveryAssociations:a})},this.updateServiceDiscoveryPort=(e,t)=>{const n=this.state.serviceDiscoveryAssociations;n[e].containerPort=t,this.props.notifyAngular("serviceDiscoveryAssociations",n),this.setState({serviceDiscoveryAssociations:n})},this.updateServiceDiscoveryContainerName=(e,t)=>{const n=this.state.serviceDiscoveryAssociations;n[e].containerName=t,this.props.notifyAngular("serviceDiscoveryAssociations",n),this.setState({serviceDiscoveryAssociations:n})},this.pushServiceDiscoveryAssociation=()=>{const e=this.state.serviceDiscoveryAssociations;e.push({registry:this.getEmptyRegistry(),containerPort:80,containerName:""}),this.setState({serviceDiscoveryAssociations:e})},this.removeServiceDiscoveryAssociations=e=>{const t=this.state.serviceDiscoveryAssociations;t.splice(e,1),this.props.notifyAngular("serviceDiscoveryAssociations",t),this.setState({serviceDiscoveryAssociations:t})};const t=this.props.command;this.state={serviceDiscoveryAssociations:t.serviceDiscoveryAssociations,serviceDiscoveryRegistriesAvailable:t.backingData&&t.backingData.filtered?t.backingData.filtered.serviceDiscoveryRegistries:[],useTaskDefinitionArtifact:t.useTaskDefinitionArtifact},this.state.useTaskDefinitionArtifact||this.state.serviceDiscoveryAssociations.forEach(e=>{e.containerName=null})}componentDidMount(){this.props.configureCommand("1").then(()=>{this.setState({serviceDiscoveryRegistriesAvailable:this.props.command.backingData.filtered.serviceDiscoveryRegistries})})}render(){const e=this.removeServiceDiscoveryAssociations,t=this.updateServiceDiscoveryRegistry,n=this.updateServiceDiscoveryPort,a=this.updateServiceDiscoveryContainerName,r=this.state.serviceDiscoveryRegistriesAvailable.map(function(e){return{label:`${e.displayName}`,value:e.displayName}}),i=this.state.useTaskDefinitionArtifact,s=this.state.serviceDiscoveryAssociations.map(function(s,o){return ue.createElement("tr",{key:o},i&&ue.createElement("td",null,ue.createElement("input",{className:"form-control input-sm",placeholder:"Enter a container name ...",required:!0,value:s.containerName,onChange:e=>a(o,e.target.value)})),ue.createElement("td",null,ue.createElement(R,{placeholder:"Select a registry...",options:r,value:s.registry.displayName.toString(),onChange:e=>t(o,e),clearable:!1,required:!0})),ue.createElement("td",null,ue.createElement("input",{type:"number",className:"form-control input-sm no-spel",required:!0,value:s.containerPort,onChange:e=>n(o,e.target.valueAsNumber)})),ue.createElement("td",null,ue.createElement("div",{className:"form-control-static"},ue.createElement("a",{className:"btn-link sm-label",onClick:()=>e(o)},ue.createElement("span",{className:"glyphicon glyphicon-trash"}),ue.createElement("span",{className:"sr-only"},"Remove")))))}),o=this.state.serviceDiscoveryRegistriesAvailable.length?ue.createElement("button",{className:"btn btn-block btn-sm add-new",onClick:this.pushServiceDiscoveryAssociation},ue.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Service Registry"):ue.createElement("div",{className:"sm-label-left"},ue.createElement(he,{color:"warning"},"No registries found in the selected account/region/VPC"));return ue.createElement("div",{className:"container-fluid form-horizontal"},ue.createElement("div",{className:"form-group"},ue.createElement("div",{className:"sm-label-left"},ue.createElement("b",null,"Service Registries (optional)"),ue.createElement(M,{id:"ecs.serviceDiscovery"})),ue.createElement("form",{name:"ecsServiceDiscoveryRegistryMappings"},ue.createElement("table",{className:"table table-condensed packed tags"},ue.createElement("thead",null,ue.createElement("tr",null,i&&ue.createElement("th",{style:{width:"30%"}},"Container name",ue.createElement(M,{id:"ecs.serviceDiscoveryContainerName"})),i?ue.createElement("th",{style:{width:"55%"}},"Registry",ue.createElement(M,{id:"ecs.serviceDiscoveryRegistry"})):ue.createElement("th",{style:{width:"80%"}},"Registry",ue.createElement(M,{id:"ecs.serviceDiscoveryRegistry"})),ue.createElement("th",{style:{width:"15%"}},"Port",ue.createElement(M,{id:"ecs.serviceDiscoveryContainerPort"})),ue.createElement("th",null))),ue.createElement("tbody",null,s),ue.createElement("tfoot",null,ue.createElement("tr",null,ue.createElement("td",{colSpan:4},o)))))))}}const pt="spinnaker.ecs.serverGroup.configure.wizard.serviceDiscovery.react";t(pt,[]).component("serviceDiscoveryReact",fe($(dt,"serviceDiscoveryReact"),["command","notifyAngular","configureCommand"]));class ut extends ue.Component{constructor(e){var t,n;super(e),this.updateDockerRegistryAccount=e=>{const t=e.value;this.setState({selectedDockerAccount:t,dockerImages:[]}),ve.findImages({provider:"dockerRegistry",account:t,count:50}).then(e=>{const t=e;this.props.command.backingData.filtered.images=t,this.setState({dockerImages:t})})},this.getIdToImageMap=()=>{const e=new Map;return this.props.command.backingData.filtered.images.forEach(t=>{e.set(t.imageId,t)}),e},this.getEmptyImageDescription=()=>({imageId:"",message:"",fromTrigger:!1,fromContext:!1,stageId:"",imageLabelOrSha:"",account:"",registry:"",repository:"",tag:""}),this.excludedArtifactTypePatterns=[B.KUBERNETES,B.DOCKER_IMAGE,B.FRONT50_PIPELINE_TEMPLATE],this.onExpectedArtifactSelected=e=>{const t={artifactId:e};this.props.notifyAngular("taskDefinitionArtifact",t),this.setState({taskDefArtifact:t})},this.onArtifactEdited=e=>{const t={artifact:e};this.props.notifyAngular("taskDefinitionArtifact",t),this.setState({taskDefArtifact:t})},this.pushMapping=()=>{const e=this.state.containerMappings;e.push({containerName:"",imageDescription:this.getEmptyImageDescription()}),this.setState({containerMappings:e})},this.pushTargetGroupMapping=()=>{const e=this.state.targetGroupMappings;e.push({containerName:"",targetGroup:"",containerPort:80}),this.setState({targetGroupMappings:e})},this.updateContainerMappingName=(e,t)=>{const n=this.state.containerMappings;n[e].containerName=t,this.props.notifyAngular("containerMappings",n),this.setState({containerMappings:n})},this.updateContainerMappingImage=(e,t)=>{let n=this.getIdToImageMap().get(t.value);n||(n=this.getEmptyImageDescription());const a=this.state.containerMappings;a[e].imageDescription=n,this.props.notifyAngular("containerMappings",a),this.setState({containerMappings:a})},this.updateTargetGroupMappingTargetGroup=(e,t)=>{const n=this.state.targetGroupMappings;n[e].targetGroup=t.value,this.props.notifyAngular("targetGroupMappings",n),this.setState({targetGroupMappings:n})},this.updateTargetGroupMappingContainer=(e,t)=>{const n=this.state.targetGroupMappings;n[e].containerName=t,this.props.notifyAngular("targetGroupMappings",n),this.setState({targetGroupMappings:n})},this.updateTargetGroupMappingPort=(e,t)=>{const n=this.state.targetGroupMappings;n[e].containerPort=t,this.props.notifyAngular("targetGroupMappings",n),this.setState({targetGroupMappings:n})},this.removeMapping=e=>{const t=this.state.containerMappings;t.splice(e,1),this.props.notifyAngular("containerMappings",t),this.setState({containerMappings:t})},this.removeTargetGroupMapping=e=>{const t=this.state.targetGroupMappings;t.splice(e,1),this.props.notifyAngular("targetGroupMappings",t),this.setState({targetGroupMappings:t})},this.updateEvaluateTaskDefArtifactFlag=()=>{this.props.notifyAngular("evaluateTaskDefinitionArtifactExpressions",!this.props.command.evaluateTaskDefinitionArtifactExpressions),this.setState({evaluateTaskDefinitionArtifactExpressions:!this.props.command.evaluateTaskDefinitionArtifactExpressions})};const a=this.props.command;let r="";a.containerMappings&&a.containerMappings.length>0&&(r=a.containerMappings[0].containerName);let i=[];a.targetGroupMappings&&a.targetGroupMappings.length>0&&(i=a.targetGroupMappings),a.targetGroup&&a.targetGroup.length>0&&(i.push({containerName:a.loadBalancedContainer||r,targetGroup:a.targetGroup,containerPort:a.containerPort}),a.targetGroup="",a.loadBalancedContainer=""),a.targetGroupMappings=re(i,W),this.state={taskDefArtifact:a.taskDefinitionArtifact,containerMappings:a.containerMappings?a.containerMappings:[],targetGroupMappings:a.targetGroupMappings,targetGroupsAvailable:a.backingData&&a.backingData.filtered?a.backingData.filtered.targetGroups:[],dockerImages:a.backingData&&a.backingData.filtered?a.backingData.filtered.images:[],dockerRegistryAccounts:[],selectedDockerAccount:null!=(n=null==(t=a.imageDescription)?void 0:t.account)?n:"",loadBalancedContainer:a.loadBalancedContainer||r,taskDefArtifactAccount:a.taskDefinitionArtifactAccount,evaluateTaskDefinitionArtifactExpressions:a.evaluateTaskDefinitionArtifactExpressions}}componentDidMount(){f.listAccounts("dockerRegistry").then(e=>{this.setState({dockerRegistryAccounts:e})}),this.props.configureCommand("1").then(()=>{this.setState({dockerImages:this.props.command.backingData.filtered.images,targetGroupsAvailable:this.props.command.backingData.filtered.targetGroups})})}render(){const{command:e}=this.props,t=this.removeMapping,n=this.removeTargetGroupMapping,a=this.updateContainerMappingName,r=this.updateContainerMappingImage,i=this.updateTargetGroupMappingContainer,s=this.updateTargetGroupMappingTargetGroup,o=this.updateTargetGroupMappingPort,l=this.updateEvaluateTaskDefArtifactFlag,c=this.state.dockerRegistryAccounts.map(e=>({label:e.name,value:e.name})),d=this.state.dockerImages.map(function(e){let t="";return(e.fromTrigger||e.fromContext)&&(t=e.fromTrigger?"(TRIGGER) ":"(FIND IMAGE RESULT) "),{label:`${t} (${e.imageId})`,value:e.imageId}}),p=this.state.targetGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),u=this.state.containerMappings.map(function(e,n){return ue.createElement("tr",{key:n},ue.createElement("td",null,ue.createElement("input",{"data-test-id":"Artifacts.containerName",className:"form-control input-sm",required:!0,placeholder:"enter container name...",value:e.containerName.toString(),onChange:e=>a(n,e.target.value)})),ue.createElement("td",{"data-test-id":"Artifacts.containerImage"},ue.createElement(R,{placeholder:"Select an image to use...",options:d,value:e.imageDescription.imageId,onChange:e=>{r(n,e)},clearable:!1})),ue.createElement("td",null,ue.createElement("div",{className:"form-control-static"},ue.createElement("a",{className:"btn-link sm-label","data-test-id":"Artifacts.containerRemove",onClick:()=>t(n)},ue.createElement("span",{className:"glyphicon glyphicon-trash"}),ue.createElement("span",{className:"sr-only"},"Remove")))))}),m=this.state.targetGroupMappings.map(function(e,t){return ue.createElement("tr",{key:t},ue.createElement("td",null,ue.createElement("input",{"data-test-id":"Artifacts.targetGroupContainer",className:"form-control input-sm",required:!0,placeholder:"Enter a container name ...",value:e.containerName.toString(),onChange:e=>i(t,e.target.value)})),ue.createElement("td",{"data-test-id":"Artifacts.targetGroup"},ue.createElement(R,{placeholder:"Select a target group to use...",options:p,value:e.targetGroup.toString(),onChange:e=>s(t,e),clearable:!1})),ue.createElement("td",null,ue.createElement("input",{"data-test-id":"Artifacts.targetGroupPort",type:"number",className:"form-control input-sm no-spel",required:!0,value:e.containerPort.toString(),onChange:e=>o(t,e.target.valueAsNumber)})),ue.createElement("td",null,ue.createElement("div",{className:"form-control-static"},ue.createElement("a",{className:"btn-link sm-label","data-test-id":"Artifacts.targetGroupRemove",onClick:()=>n(t)},ue.createElement("span",{className:"glyphicon glyphicon-trash"}),ue.createElement("span",{className:"sr-only"},"Remove")))))}),g=this.state.targetGroupsAvailable.length?ue.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"Artifacts.targetGroupAdd",onClick:this.pushTargetGroupMapping},ue.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Target Group Mapping"):ue.createElement("div",{className:"sm-label-left"},ue.createElement(he,{color:"warning"},"No target groups found in the selected account/region/VPC"));return ue.createElement("div",{className:"container-fluid form-horizontal"},ue.createElement("div",{className:"form-group"},ue.createElement("div",{className:"col-md-12"},ue.createElement(F,{artifact:this.state.taskDefArtifact.artifact,excludedArtifactTypePatterns:this.excludedArtifactTypePatterns,expectedArtifactId:this.state.taskDefArtifact.artifactId,label:"Artifact",helpKey:"ecs.taskDefinitionArtifact",onExpectedArtifactSelected:e=>this.onExpectedArtifactSelected(e.id),onArtifactEdited:this.onArtifactEdited,pipeline:e.viewState.pipeline,stage:e.viewState.currentStage}))),ue.createElement(L,{groupClassName:"form-group evaluateTaskDef",label:"Expression Evaluation",helpKey:"ecs.evaluateExpression",labelColumns:5,fieldColumns:7},ue.createElement(O,{checked:!0===e.evaluateTaskDefinitionArtifactExpressions,onChange:()=>{l()},text:"Evaluate SpEL expressions in artifact"})),ue.createElement("div",{className:"form-group"},ue.createElement("div",{className:"col-md-3 sm-label-right"},ue.createElement("b",null,"Docker Registry Account")),ue.createElement("div",{className:"col-md-9","data-test-id":"Artifacts.dockerRegistryAccount"},ue.createElement(R,{placeholder:"Select a Docker registry account...",options:c,value:this.state.selectedDockerAccount,onChange:e=>this.updateDockerRegistryAccount(e),clearable:!1}))),ue.createElement("div",{className:"form-group"},ue.createElement("div",{className:"sm-label-left"},ue.createElement("b",null,"Container Mappings"),ue.createElement(M,{id:"ecs.containerMappings"})),ue.createElement("form",{name:"ecsTaskDefinitionContainerMappings"},ue.createElement("table",{className:"table table-condensed packed tags"},ue.createElement("thead",null,ue.createElement("tr",{key:"header"},ue.createElement("th",{style:{width:"30%"}},"Container name",ue.createElement(M,{id:"ecs.containerMappingName"})),ue.createElement("th",{style:{width:"70%"}},"Container image",ue.createElement(M,{id:"ecs.containerMappingImage"})),ue.createElement("th",null))),ue.createElement("tbody",null,u),ue.createElement("tfoot",null,ue.createElement("tr",null,ue.createElement("td",{colSpan:3},ue.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"Artifacts.containerAdd",onClick:this.pushMapping},ue.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Container Mapping"))))))),ue.createElement("div",{className:"form-group"},ue.createElement("div",{className:"sm-label-left"},ue.createElement("b",null,"Target Group Mappings"),ue.createElement(M,{id:"ecs.targetGroupMappings"})),ue.createElement("form",{name:"ecsTaskDefinitionTargetGroupMappings"},ue.createElement("table",{className:"table table-condensed packed tags"},ue.createElement("thead",null,ue.createElement("tr",{key:"header"},ue.createElement("th",{style:{width:"30%"}},"Container name",ue.createElement(M,{id:"ecs.loadBalancedContainer"})),ue.createElement("th",{style:{width:"55%"}},"Target group",ue.createElement(M,{id:"ecs.loadBalancer.targetGroup"})),ue.createElement("th",{style:{width:"15%"}},"Target port",ue.createElement(M,{id:"ecs.loadbalancing.targetPort"})),ue.createElement("th",null))),ue.createElement("tbody",null,m),ue.createElement("tfoot",null,ue.createElement("tr",null,ue.createElement("td",{colSpan:4},g)))))))}}const mt="spinnaker.ecs.serverGroup.configure.wizard.taskDefinition.react";t(mt,[]).component("taskDefinitionReact",fe($(ut,"taskDefinitionReact"),["command","notifyAngular","configureCommand"]));const gt="spinnaker.ecs.serverGroup.resize";t(gt,[]).component("ecsResizeCapacity",{bindings:{command:"=",currentSize:"="},templateUrl:"ecs/src/serverGroup/details/resize/resizeCapacity.component.html",controller:()=>{}}),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/details/resize/resizeCapacity.component.html",'<div ng-if="$ctrl.command.advancedMode">\n <div class="form-group">\n <div class="col-md-12">\n <p>Sets up auto-scaling for this server group.</p>\n <p>To disable auto-scaling, use the <a href ng-click="$ctrl.command.advancedMode = false">Simple Mode</a>.</p>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-2 col-md-offset-3"><b>Min</b></div>\n <div class="col-md-2"><b>Max</b></div>\n <div class="col-md-2"><b>Desired</b></div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Current</div>\n <div class="col-md-2">\n <input type="number" class="form-control input-sm" ng-model="$ctrl.currentSize.min" readonly />\n </div>\n <div class="col-md-2">\n <input type="number" class="form-control input-sm" ng-model="$ctrl.currentSize.max" readonly />\n </div>\n <div class="col-md-2">\n <input type="number" class="form-control input-sm" ng-model="$ctrl.currentSize.desired" readonly />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Resize to</div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="$ctrl.command.min"\n min="0"\n required\n max="{{ $ctrl.command.max }}"\n />\n </div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="$ctrl.command.max"\n required\n min="{{ $ctrl.command.min }}"\n />\n </div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="$ctrl.command.desired"\n required\n min="{{ $ctrl.command.min }}"\n max="{{ $ctrl.command.max }}"\n />\n </div>\n </div>\n</div>\n<div ng-if="!$ctrl.command.advancedMode">\n <div class="form-group">\n <div class="col-md-12">\n <p>\n To modify min and max instance counts, use the\n <a href ng-click="$ctrl.command.advancedMode = true">Advanced Mode</a>.\n </p>\n </div>\n </div>\n <div class="form-group form-inline">\n <div class="col-md-3 sm-label-right">Current size</div>\n <div class="col-md-6">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="$ctrl.currentSize.desired"\n style="width: 60px"\n readonly\n />\n instance<span ng-if="$ctrl.currentSize.desired > 1">s</span>\n </div>\n </div>\n <div class="form-group form-inline">\n <div class="col-md-3 sm-label-right">Resize to</div>\n <div class="col-md-6">\n <input\n type="number"\n class="form-control input-sm highlight-pristine"\n ng-model="$ctrl.command.newSize"\n min="0"\n required\n style="width: 60px"\n />\n instances\n </div>\n </div>\n</div>\n')}]);const vt="spinnaker.ecs.serverGroup.details.resize.controller";e.module(vt,[N,gt]).controller("ecsResizeServerGroupCtrl",["$scope","$uibModalInstance","serverGroupWriter","application","serverGroup",function(t,n,a,r,i){t.serverGroup=i,t.currentSize={min:i.capacity.min,max:i.capacity.max,desired:i.capacity.desired,newSize:null},t.verification={},t.command=e.copy(t.currentSize),t.command.advancedMode=i.capacity.min!==i.capacity.max,r&&r.attributes&&(r.attributes.platformHealthOnlyShowOverride&&r.attributes.platformHealthOnly&&(t.command.interestingHealthProviderNames=["Ecs"]),t.command.platformHealthOnlyShowOverride=r.attributes.platformHealthOnlyShowOverride),this.isValid=function(){const e=t.command;return!!t.verification.verified&&(e.advancedMode?e.min<=e.max&&e.desired>=e.min&&e.desired<=e.max:null!==e.newSize)},t.taskMonitor=new z({application:r,title:"Resizing "+i.name,modalInstance:n}),this.resize=function(){if(!this.isValid())return;let e={min:t.command.min,max:t.command.max,desired:t.command.desired};t.command.advancedMode||(e={min:t.command.newSize,max:t.command.newSize,desired:t.command.newSize});t.taskMonitor.submit(function(){return a.resizeServerGroup(i,r,{capacity:e,interestingHealthProviderNames:t.command.interestingHealthProviderNames,reason:t.command.reason})})},this.cancel=function(){n.dismiss()}}]);const ht="spinnaker.ecs.serverGroup.details.rollback.controller";t(ht,[N]).controller("ecsRollbackServerGroupCtrl",["$scope","$uibModalInstance","serverGroupWriter","application","serverGroup","disabledServerGroups","allServerGroups",function(e,t,n,a,r,i,s){e.serverGroup=r,e.disabledServerGroups=i.sort((e,t)=>t.name.localeCompare(e.name)),e.allServerGroups=s.sort((e,t)=>t.name.localeCompare(e.name)),e.verification={},e.command={rollbackType:"EXPLICIT",rollbackContext:{rollbackServerGroupName:r.name}},a&&a.attributes&&(a.attributes.platformHealthOnlyShowOverride&&a.attributes.platformHealthOnly&&(e.command.interestingHealthProviderNames=["Ecs"]),e.command.platformHealthOnlyShowOverride=a.attributes.platformHealthOnlyShowOverride),this.isValid=function(){const t=e.command;return!!e.verification.verified&&void 0!==t.rollbackContext.restoreServerGroupName},e.taskMonitor=new z({application:a,title:"Rollback "+r.name,modalInstance:t}),this.rollback=function(){if(!this.isValid())return;e.taskMonitor.submit(function(){return n.rollbackServerGroup(r,a,e.command)})},this.cancel=function(){t.dismiss()},this.label=function(e){return e?e.buildInfo&&e.buildInfo.jenkins&&e.buildInfo.jenkins.number?e.name+" (build #"+e.buildInfo.jenkins.number+")":e.name:""},this.group=function(e){return e.isDisabled?"Disabled Server Groups":"Enabled Server Groups"}}]);const ft="spinnaker.ecs.serverGroup.transformer";t(ft,[]).service("ecsServerGroupTransformer",class{addComparator(e){if(e.comparisonOperator)switch(e.comparisonOperator){case"LessThanThreshold":e.comparator="&lt;";break;case"GreaterThanThreshold":e.comparator="&gt;";break;case"LessThanOrEqualToThreshold":e.comparator="&le;";break;case"GreaterThanOrEqualToThreshold":e.comparator="&ge;"}}addAdjustmentAttributes(e){e.operator=e.scalingAdjustment<0?"decrease":"increase",e.absAdjustment=Math.abs(e.scalingAdjustment)}transformScalingPolicy(e){const t={...e},n=(e,t)=>t.metricIntervalUpperBound-e.metricIntervalUpperBound,a=(e,t)=>e.metricIntervalLowerBound-t.metricIntervalLowerBound;if(t.alarms=e.alarms||[],t.alarms.forEach(e=>this.addComparator(e)),this.addAdjustmentAttributes(t),t.stepAdjustments&&t.stepAdjustments.length){t.stepAdjustments.forEach(e=>this.addAdjustmentAttributes(e));const r=e.stepAdjustments.every(e=>void 0!==e.metricIntervalUpperBound)?n:a;t.stepAdjustments.sort((e,t)=>r(e,t))}return t}normalizeServerGroupDetails(e){const t={...e};return e.scalingPolicies&&(t.scalingPolicies=e.scalingPolicies.map(e=>this.transformScalingPolicy(e))),t}normalizeServerGroup(e){return e.instances.forEach(t=>{t.vpcId=e.vpcId}),de.listVpcs().then(t=>this.addVpcNameToServerGroup(e)(t))}addVpcNameToServerGroup(e){return t=>{const n=t.find(t=>t.id===e.vpcId);return e.vpcName=n?n.name:"",e}}convertServerGroupCommandToDeployConfiguration(e){const t=ie({backingData:[],viewState:[]},e);return t.cloudProvider="ecs",t.availabilityZones={},t.availabilityZones[t.region]=e.availabilityZones,t.loadBalancers=(e.loadBalancers||[]).concat(e.vpcLoadBalancers||[]),t.targetGroup=e.targetGroup||"",t.account=t.credentials,t.subnetType=t.subnetType||"","clone"!==e.viewState.mode&&delete t.source,delete t.region,delete t.viewState,delete t.backingData,delete t.selectedProvider,delete t.instanceProfile,delete t.vpcId,t}});const yt="spinnaker.ecs.serverGroup.details.controller";e.module(yt,[V,ft,P,N,Xe,vt,ht]).controller("ecsServerGroupDetailsCtrl",["$scope","$state","app","serverGroup","ecsServerGroupCommandBuilder","$uibModal","serverGroupWriter","ecsServerGroupTransformer","overrideRegistry",function(t,n,a,r,i,o,l,c,d){this.state={loading:!0},this.firewallsLabel=C.get("Firewalls"),this.application=a;const p=()=>{t.$$destroyed||n.go("^",{allowModalToStayOpen:!0},{location:"replace"})},u=()=>{this.state.loading=!1},m=()=>a.ready().then(()=>{let e=Q(a.serverGroups.data,e=>e.name===r.name&&e.account===r.accountId&&e.region===r.region);return e||a.loadBalancers.data.some(t=>{if(t.account===r.accountId&&t.region===r.region)return t.serverGroups.some(t=>{if(t.name===r.name)return e=t,!0})}),e}).then(t=>q.getServerGroup(a.name,r.accountId,r.region,r.name).then(n=>{if(u(),e.extend(n,t,{account:r.accountId}),this.serverGroup=c.normalizeServerGroupDetails(n),this.applyAccountDetails(this.serverGroup),oe(this.serverGroup))p();else{this.image=n.image?n.image:void 0;const e=this.serverGroup.asg?this.serverGroup.asg.vpczoneIdentifier:"";if(""!==e){const t=e.split(",")[0];G.listSubnets().then(e=>{const n=X(e).find({id:t}).value();this.serverGroup.subnetType=n.purpose})}if(n.image&&n.image.description){n.image.description.split(", ").forEach(e=>{const t=e.split("=");2===t.length&&"ancestor_name"===t[0]&&(n.image.baseImage=t[1])})}if(n.image&&n.image.tags){const e=n.image.tags.find(e=>"base_ami_version"===e.key);e&&(n.baseAmiVersion=e.value)}this.scalingPolicies=this.serverGroup.scalingPolicies,K(this.serverGroup,"buildInfo.jenkins")&&(this.changeConfig.buildInfo={jenkins:this.serverGroup.buildInfo.jenkins})}})).catch(p);m().then(()=>{t.$$destroyed||a.serverGroups.onRefresh(t,m)}),this.destroyServerGroup=()=>{const e=this.serverGroup,t={application:a,title:"Destroying "+e.name,onTaskComplete:()=>{n.includes("**.serverGroup",r)&&n.go("^")}},r={name:e.name,accountId:e.account,region:e.region},i={header:"Really destroy "+e.name+"?",buttonText:"Destroy "+e.name,account:e.account,taskMonitorConfig:t,submitMethod:t=>l.destroyServerGroup(e,a,t),askForReason:!0,platformHealthOnlyShowOverride:a.attributes.platformHealthOnlyShowOverride,platformHealthType:"Ecs"};U.addDestroyWarningMessage(a,e,i),a.attributes.platformHealthOnlyShowOverride&&a.attributes.platformHealthOnly&&(i.interestingHealthProviderNames=["Ecs"]),s.confirm(i)},this.disableServerGroup=()=>{const e=this.serverGroup,t={application:a,title:"Disabling "+e.name},n={header:"Really disable "+e.name+"?",buttonText:"Disable "+e.name,account:e.account,taskMonitorConfig:t,platformHealthOnlyShowOverride:a.attributes.platformHealthOnlyShowOverride,platformHealthType:"Ecs",submitMethod:t=>l.disableServerGroup(e,a,t),askForReason:!0};U.addDisableWarningMessage(a,e,n),a.attributes.platformHealthOnlyShowOverride&&a.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=["Ecs"]),s.confirm(n)},this.enableServerGroup=()=>{const e=this.serverGroup,t={application:a,title:"Enabling "+e.name},n={header:"Really enable "+e.name+"?",buttonText:"Enable "+e.name,account:e.account,taskMonitorConfig:t,platformHealthOnlyShowOverride:a.attributes.platformHealthOnlyShowOverride,platformHealthType:"Ecs",submitMethod:t=>l.enableServerGroup(e,a,t),askForReason:!0};a.attributes.platformHealthOnlyShowOverride&&a.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=["Ecs"]),s.confirm(n)},this.rollbackServerGroup=()=>{o.open({templateUrl:d.getTemplate("ecs.rollback.modal","ecs/src/serverGroup/details/rollback/rollbackServerGroup.html"),windowClass:"modal-z-index",controller:"ecsRollbackServerGroupCtrl as ctrl",resolve:{serverGroup:()=>this.serverGroup,disabledServerGroups:()=>{const e=Q(a.clusters,{name:this.serverGroup.cluster,account:this.serverGroup.account});return se(e.serverGroups,{isDisabled:!0,region:this.serverGroup.region})},allServerGroups:()=>a.getDataSource("serverGroups").data.filter(e=>e.cluster===this.serverGroup.cluster&&e.region===this.serverGroup.region&&e.account===this.serverGroup.account&&e.name!==this.serverGroup.name),application:()=>a}})},this.resizeServerGroup=()=>{o.open({templateUrl:d.getTemplate("ecs.resize.modal","ecs/src/serverGroup/details/resize/resizeServerGroup.html"),controller:"ecsResizeServerGroupCtrl as ctrl",windowClass:"modal-z-index",resolve:{serverGroup:()=>this.serverGroup,application:()=>a}})},this.cloneServerGroup=e=>{o.open({templateUrl:"ecs/src/serverGroup/configure/wizard/serverGroupWizard.html",controller:"ecsCloneServerGroupCtrl as ctrl",size:"lg",windowClass:"modal-z-index",resolve:{title:()=>"Clone "+e.name,application:()=>a,serverGroupCommand:()=>i.buildServerGroupCommandFromExisting(a,e)}})},this.buildJenkinsLink=()=>{if(K(this,"serverGroup.buildInfo.buildInfoUrl"))return this.serverGroup.buildInfo.buildInfoUrl;if(K(this,"serverGroup.buildInfo.jenkins")){const e=this.serverGroup.buildInfo.jenkins;return e.host+"job/"+e.name+"/"+e.number}return null},this.truncateCommitHash=()=>this.serverGroup&&this.serverGroup.buildInfo&&this.serverGroup.buildInfo.commit?this.serverGroup.buildInfo.commit.substring(0,8):null,this.applyAccountDetails=e=>f.getAccountDetails(e.account).then(t=>{e.accountDetails=t})}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/details/rollback/rollbackServerGroup.html",'<div modal-page class="confirmation-modal">\n <task-monitor monitor="taskMonitor"></task-monitor>\n <form role="form">\n <modal-close dismiss="$dismiss()"></modal-close>\n <div class="modal-header">\n <h4 class="modal-title">Rollback {{serverGroup.name}}</h4>\n </div>\n <div class="modal-body confirmation-modal">\n <div class="row">\n <div class="col-sm-3 sm-label-right">Restore to</div>\n <div class="col-sm-6">\n <ui-select ng-model="command.rollbackContext.restoreServerGroupName" class="form-control input-sm">\n <ui-select-match placeholder="Select...">{{ctrl.label($select.selected)}}</ui-select-match>\n <ui-select-choices group-by="ctrl.group" repeat="serverGroup.name as serverGroup in allServerGroups">\n <span ng-bind-html="ctrl.label(serverGroup)"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="row" ng-if="command.platformHealthOnlyShowOverride">\n <div class="col-sm-10 col-sm-offset-1">\n <platform-health-override\n command="command"\n platform-health-type="\'Ecs\'"\n show-help-details="true"\n field-columns="12"\n >\n </platform-health-override>\n </div>\n </div>\n\n <task-reason command="command"></task-reason>\n\n <div class="row">\n <div class="col-sm-4 sm-label-right">Rollback Operations</div>\n </div>\n <div class="row">\n <div class="col-sm-11 col-sm-offset-1">\n <ol>\n <li>Enable <em>{{ command.rollbackContext.restoreServerGroupName || \'previous server group\' }}</em></li>\n <li>\n Resize <em>{{ command.rollbackContext.restoreServerGroupName || \'previous server group\' }}</em> to [\n <strong>min</strong>: {{serverGroup.capacity.desired}}, <strong>max</strong>: {{ serverGroup.capacity.max\n }}, <strong>desired</strong>: {{ serverGroup.capacity.desired }} ]<br />(minimum capacity pinned at\n {{serverGroup.capacity.desired}} to prevent autoscaling down during rollback)\n </li>\n <li>Disable {{ serverGroup.name }}</li>\n <li>\n Restore minimum capacity of\n <em>{{ command.rollbackContext.restoreServerGroupName || \'previous server group\' }}</em> [\n <strong>min</strong>: {{ serverGroup.capacity.min }} ]\n </li>\n </ol>\n <p>This rollback will affect server groups in {{ serverGroup.account }} ({{ serverGroup.region }}).</p>\n </div>\n </div>\n </div>\n <ecs-footer\n action="ctrl.rollback()"\n cancel="ctrl.cancel()"\n is-valid="ctrl.isValid()"\n account="serverGroup.account"\n verification="verification"\n ></ecs-footer>\n </form>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/details/resize/resizeServerGroup.html",'<div modal-page class="confirmation-modal">\n <task-monitor monitor="taskMonitor"></task-monitor>\n <form role="form">\n <modal-close dismiss="$dismiss()"></modal-close>\n <div class="modal-header">\n <h4 class="modal-title">Resize {{serverGroup.name}}</h4>\n </div>\n <div class="modal-body confirmation-modal">\n <div class="form-horizontal">\n <ecs-resize-capacity command="command" current-size="currentSize"></ecs-resize-capacity>\n </div>\n <div class="row" ng-if="command.platformHealthOnlyShowOverride">\n <div class="col-sm-10 col-sm-offset-1">\n <platform-health-override command="command" platform-health-type="\'Ecs\'" show-help-details="true">\n </platform-health-override>\n </div>\n </div>\n <task-reason command="command"></task-reason>\n </div>\n <ecs-footer\n action="ctrl.resize()"\n cancel="ctrl.cancel()"\n is-valid="ctrl.isValid()"\n account="serverGroup.account"\n verification="verification"\n ></ecs-footer>\n </form>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/serverGroupWizard.html",'<form name="form" class="form-horizontal" novalidate>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px">\n <h3 us-spinner="{radius:30, width:8, length: 16}"></h3>\n </div>\n <div ng-if="!state.requiresTemplateSelection">\n <v2-modal-wizard ng-show="state.loaded" heading="{{title}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="basicSettings" label="Basic Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="networking" label="Networking" done="true">\n <ng-include src="pages.networking"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="taskDefinition" label="Task Definition" done="true">\n <ng-include src="pages.taskDefinition"></ng-include>\n </v2-wizard-page>\n <div ng-if="!command.useTaskDefinitionArtifact">\n <v2-wizard-page key="container" label="Container" done="true">\n <ng-include src="pages.container"></ng-include>\n </v2-wizard-page>\n </div>\n <v2-wizard-page key="horizontalScaling" label="Horizontal Scaling" done="true">\n <ng-include src="pages.horizontalScaling"></ng-include>\n </v2-wizard-page>\n <div ng-if="!command.useTaskDefinitionArtifact">\n <v2-wizard-page key="logging" label="Logging" done="true">\n <ng-include src="pages.logging"></ng-include>\n </v2-wizard-page>\n </div>\n <v2-wizard-page key="serviceDiscovery" label="Service Discovery" done="true">\n <ng-include ng-if="!command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>\n <ng-include ng-if="command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n data-test-id="ServerGroupWizard.submitButton"\n ng-if="ctrl.showSubmitButton()"\n is-disabled="!ctrl.isValid() || taskMonitor.submitting"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </div>\n</form>\n')}]);const bt="spinnaker.ecs.serverGroup.details";t(bt,[yt]);class St{static getEvents(e){return r("/applications").path(e.app,"serverGroups",e.account,e.name,"events").query({region:e.region,provider:e.cloudProvider}).get().catch(e=>(ye.error(e,"error retrieving events"),[]))}}class kt{constructor(e,t){this.$uibModalInstance=e,this.serverGroup=t,this.events=[]}$onInit(){this.viewState={loading:!0,error:!1},St.getEvents(this.serverGroup).then(e=>{this.viewState.loading=!1,this.events=e},()=>{this.viewState.error=!0})}close(){this.$uibModalInstance.close()}}kt.$inject=["$uibModalInstance","serverGroup"];const Ct="spinnaker.ecs.serverGroup.events.controller";t(Ct,[]).controller("EventsController",kt);class wt{constructor(e){this.$uibModal=e}showEvents(){this.$uibModal.open({templateUrl:"ecs/src/serverGroup/events/events.html",controller:kt,controllerAs:"$ctrl",windowClass:"modal-z-index",resolve:{serverGroup:()=>this.serverGroup}})}}wt.$inject=["$uibModal"];const Dt={bindings:{serverGroup:"<"},controller:wt,template:'<a href ng-click="$ctrl.showEvents()">View Events</a>'},Et="spinnaker.ecs.serverGroup.details.viewEvents.link";t(Et,[Ct]).component("viewEventsLink",Dt),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/events/events.html",'<div modal-page>\n <modal-close dismiss="$ctrl.close()"></modal-close>\n <div class="modal-header">\n <h4 class="modal-title">Server Group Events for {{$ctrl.serverGroup.name}}</h4>\n </div>\n <div class="modal-body">\n <div class="loading" ng-if="$ctrl.viewState.loading">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div ng-if="$ctrl.viewState.error" class="text-center">\n <p>There was an error loading events for {{$ctrl.serverGroup.name}}. Please try again later.</p>\n </div>\n <div ng-if="!$ctrl.viewState.loading && !$ctrl.viewState.error && !$ctrl.events.length" class="text-center">\n <p>No scaling events found for {{$ctrl.serverGroup.name}}.</p>\n </div>\n\n <div ng-repeat="event in $ctrl.events" ng-if="!$ctrl.viewState.loading">\n <p class="clearfix"></p>\n <div ng-if="event.status === \'Success\'">\n <span class="label label-success pull-left">{{event.status}}</span>\n </div>\n <div ng-if="event.status !== \'Success\'">\n <span class="label label-{{event.status === \'Transition\' ? \'info\' : \'danger\'}} pull-left"\n >{{event.status}}</span\n >\n </div>\n\n <span class="label label-default pull-right">{{event.createdAt | timestamp}}</span>\n <div>{{event.message}}</div>\n <hr ng-if="!$last" />\n </div>\n </div>\n <div class="modal-footer">\n <button class="btn btn-primary" ng-click="$ctrl.close()">Close</button>\n </div>\n</div>\n')}]);const Gt="spinnaker.ecs.serverGroup";t(Gt,[Et]);!function(e,t){void 0===t&&(t={});var n=t.insertAt;if("undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===n&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}('.cloud-provider-logo .icon-ecs {\n -webkit-mask-image: url("data:image/svg+xml,%3Csvg id%3D%22Layer_1%22 data-name%3D%22Layer 1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%22100%22 height%3D%22100%22 viewBox%3D%220 0 100 100%22%3E %3Ctitle%3ECompute%3C%2Ftitle%3E %3Cg%3E %3Cpolygon points%3D%2219.64 22.51 16 24.32 16 75.68 19.64 77.49 33.98 51.07 19.64 22.51%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2230.72 31.78 36.08 24.19 60.1 34.87 54.5 35.76 30.72 31.78%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2226.56 68.77 32.46 76.88 60.1 64.95 54.76 64.12 26.56 68.77%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2228.12 75.5 19.64 77.49 19.64 22.51 28.12 24.44 28.12 75.5%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2223.66 20.5 28.12 18.27 36.52 53.56 28.12 81.73 23.66 79.5 23.66 20.5%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2254.46 64.08 60.1 64.95 65.26 50.58 60.1 34.87 54.46 35.76 54.46 64.08%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2236.8 79.28 28.12 81.73 28.12 18.27 36.8 20.73 36.8 79.28%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.01 63.84 28.12 70.88 28.12 81.73 66.01 71.03 66.01 63.84%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.08 36 28.12 28.79 28.12 18.27 66.08 29.04 66.08 36%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2260.1 27.34 66.19 29.02 66.19 71.03 60.1 72.7 60.1 27.34%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2284 44.45 67.7 45.22 61.94 44.83 78.42 31.55 84 44.45%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2261.94 44.83 78.42 43.9 78.42 31.55 61.94 34.22 61.94 44.83%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 26.96 71.62 43.22 54.31 44.32 46.43 43.79%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 42.37 63.13 26.96 46.43 30.87 46.43 43.79%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2261.94 55.39 84 55.77 78.42 68.67 61.94 66 61.94 55.39%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 71.62 57.01 63.13 73.26 46.43 69.36 46.43 56.43%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 63.13 57.86 71.62 57.01 54.31 55.9 46.43 56.43%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2284 55.77 67.7 55.01 61.94 55.39 78.42 56.33 84 55.77%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2278.42 43.9 84 44.45 84 33.22 78.42 31.55 78.42 43.9%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 43.22 63.13 42.37 63.13 26.96 71.62 29.51 71.62 43.22%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2278.42 56.33 84 55.77 84 67 78.42 68.67 78.42 56.33%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 57.01 63.13 57.86 63.13 73.26 71.62 70.72 71.62 57.01%22 fill%3D%22%23f58536%22%2F%3E %3C%2Fg%3E%3C%2Fsvg%3E");\n mask-image: url("data:image/svg+xml,%3Csvg id%3D%22Layer_1%22 data-name%3D%22Layer 1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%22100%22 height%3D%22100%22 viewBox%3D%220 0 100 100%22%3E %3Ctitle%3ECompute%3C%2Ftitle%3E %3Cg%3E %3Cpolygon points%3D%2219.64 22.51 16 24.32 16 75.68 19.64 77.49 33.98 51.07 19.64 22.51%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2230.72 31.78 36.08 24.19 60.1 34.87 54.5 35.76 30.72 31.78%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2226.56 68.77 32.46 76.88 60.1 64.95 54.76 64.12 26.56 68.77%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2228.12 75.5 19.64 77.49 19.64 22.51 28.12 24.44 28.12 75.5%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2223.66 20.5 28.12 18.27 36.52 53.56 28.12 81.73 23.66 79.5 23.66 20.5%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2254.46 64.08 60.1 64.95 65.26 50.58 60.1 34.87 54.46 35.76 54.46 64.08%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2236.8 79.28 28.12 81.73 28.12 18.27 36.8 20.73 36.8 79.28%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.01 63.84 28.12 70.88 28.12 81.73 66.01 71.03 66.01 63.84%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.08 36 28.12 28.79 28.12 18.27 66.08 29.04 66.08 36%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2260.1 27.34 66.19 29.02 66.19 71.03 60.1 72.7 60.1 27.34%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2284 44.45 67.7 45.22 61.94 44.83 78.42 31.55 84 44.45%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2261.94 44.83 78.42 43.9 78.42 31.55 61.94 34.22 61.94 44.83%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 26.96 71.62 43.22 54.31 44.32 46.43 43.79%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 42.37 63.13 26.96 46.43 30.87 46.43 43.79%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2261.94 55.39 84 55.77 78.42 68.67 61.94 66 61.94 55.39%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 71.62 57.01 63.13 73.26 46.43 69.36 46.43 56.43%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 63.13 57.86 71.62 57.01 54.31 55.9 46.43 56.43%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2284 55.77 67.7 55.01 61.94 55.39 78.42 56.33 84 55.77%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2278.42 43.9 84 44.45 84 33.22 78.42 31.55 78.42 43.9%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 43.22 63.13 42.37 63.13 26.96 71.62 29.51 71.62 43.22%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2278.42 56.33 84 55.77 84 67 78.42 68.67 78.42 56.33%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 57.01 63.13 57.86 63.13 73.26 71.62 70.72 71.62 57.01%22 fill%3D%22%23f58536%22%2F%3E %3C%2Fg%3E%3C%2Fsvg%3E");\n}\n');const At="spinnaker.ecs";t(At,[Qe,bt,Ee,ft,et,it,mt,rt,ct,pt,nt,ot,De,Ve,Re,He,ke,st,Xe,Ge,Le,Me,$e,Be,Fe,Oe,Ue,qe,Ze,Gt,xe]).config(function(){i.registerProvider("ecs",{name:"EC2 Container Service",logo:{path:"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"},serverGroup:{transformer:"ecsServerGroupTransformer",detailsTemplateUrl:"ecs/src/serverGroup/details/serverGroupDetails.html",detailsController:"ecsServerGroupDetailsCtrl",cloneServerGroupTemplateUrl:"ecs/src/serverGroup/configure/wizard/serverGroupWizard.html",cloneServerGroupController:"ecsCloneServerGroupCtrl",commandBuilder:"ecsServerGroupCommandBuilder",scalingActivitiesEnabled:!1,skipUpstreamStageCheck:!0},loadBalancer:{transformer:ze,ClusterContainer:Te,targetGroupDetails:Ie,details:Pe},instance:{detailsTemplateUrl:"ecs/src/instance/details/instanceDetails.html",detailsController:"ecsInstanceDetailsCtrl"},securityGroup:{transformer:"ecsSecurityGroupTransformer",reader:"ecsSecurityGroupReader",detailsTemplateUrl:"ecs/src/securityGroup/details/securityGroupDetail.html",detailsController:"ecsSecurityGroupDetailsCtrl"}})}),H.registerProvider("ecs",["redblack"]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/details/serverGroupDetails.html",'<div class="details-panel" ng-class="{ disabled: ctrl.serverGroup.isDisabled }">\n <div class="header" ng-if="ctrl.state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <h4 class="text-center">\n <span us-spinner="{radius:20, width:6, length: 12}"></span>\n </h4>\n </div>\n\n <div class="header" ng-if="!ctrl.state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="header-text horizontal middle">\n <cloud-provider-logo provider="ctrl.serverGroup.type" height="\'36px\'" width="\'36px\'"></cloud-provider-logo>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>\n {{ctrl.serverGroup.name}}\n <render-if-feature feature="entityTags">\n <entity-notifications\n entity="ctrl.serverGroup"\n application="ctrl.application"\n placement="bottom"\n h-offset-percent="90%"\n entity-type="serverGroup"\n page-location="details"\n on-update="ctrl.application.serverGroups.refresh()"\n ></entity-notifications>\n </render-if-feature>\n </h3>\n </div>\n <div>\n <div class="actions" ng-class="{ insights: ctrl.serverGroup.insightActions.length > 0 }">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>\n Server Group Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li><a href ng-if=" !ctrl.serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>\n <li role="presentation" class="divider" ng-if=" !ctrl.serverGroup.isDisabled"></li>\n <li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>\n <li><a href ng-if=" !ctrl.serverGroup.isDisabled" ng-click="ctrl.disableServerGroup()">Disable</a></li>\n <li>\n <a href ng-if="ctrl.serverGroup.isDisabled && !ctrl.isEnableLocked()" ng-click="ctrl.enableServerGroup()"\n >Enable</a\n >\n </li>\n <li class="disabled" ng-if="ctrl.isEnableLocked()">\n <a\n uib-tooltip="Cannot enable this server group until resize operation completes"\n tooltip-placement="left"\n >\n <span class="small glyphicon glyphicon-lock"></span>\n Enable\n </a>\n </li>\n <li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>\n <li><migrator application="ctrl.application" server-group="ctrl.serverGroup"></migrator></li>\n <render-if-feature feature="entityTags">\n <add-entity-tag-links\n component="ctrl.serverGroup"\n application="ctrl.application"\n entity-type="serverGroup"\n owner-options="ctrl.entityTagTargets"\n on-update="ctrl.application.serverGroups.refresh"\n ></add-entity-tag-links>\n </render-if-feature>\n </ul>\n </div>\n <div class="dropdown" ng-if="ctrl.serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>\n Insight <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li ng-repeat="action in ctrl.serverGroup.insightActions">\n <a target="_blank" href="{{action.url}}">{{action.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class="band band-info" ng-if="ctrl.serverGroup.isDisabled">Disabled {{ctrl.disabledDate | timestamp}}</div>\n <div class="content" ng-if="!ctrl.state.loading">\n <server-group-running-tasks-details\n server-group="ctrl.serverGroup"\n application="ctrl.application"\n ></server-group-running-tasks-details>\n <collapsible-section heading="General" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Created</dt>\n <dd>{{ctrl.serverGroup.createdTime | timestamp}}</dd>\n <render-if-feature feature="entityTags">\n <entity-source metadata="ctrl.serverGroup.entityTags.creationMetadata"></entity-source>\n <view-changes-link\n change-config="ctrl.changeConfig"\n jar-diffs="ctrl.jarDiffs"\n link-text="view changes"\n name-item="ctrl.serverGroup"\n ></view-changes-link>\n </render-if-feature>\n <dt>In</dt>\n <dd>\n <account-tag account="ctrl.serverGroup.account" pad="right"></account-tag>\n <br />\n {{ctrl.serverGroup.region}}\n </dd>\n <dt>ECS Cluster</dt>\n <dd>{{ctrl.serverGroup.ecsCluster}}</dd>\n <dt>VPC ID</dt>\n <dd>{{ctrl.serverGroup.vpcId}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Definitions" expanded="true">\n <dl class="horizontal-when-filters-collapsed">\n <dt>Task Name</dt>\n <dd>{{ctrl.serverGroup.taskDefinition.taskName}}</dd>\n\n <dt>Container URL</dt>\n <dd>{{ctrl.serverGroup.taskDefinition.containerImage}}</dd>\n\n <dt>Container IAM Profile</dt>\n <dd>{{ctrl.serverGroup.taskDefinition.iamRole}}</dd>\n\n <dt ng-if="ctrl.serverGroup.taskDefinition.containerPort">Container Port</dt>\n <dd ng-if="ctrl.serverGroup.taskDefinition.containerPort">{{ctrl.serverGroup.taskDefinition.containerPort}}</dd>\n\n <dt>Container CPU Units</dt>\n <dd>{{ctrl.serverGroup.taskDefinition.cpuUnits}}</dd>\n\n <dt ng-if="ctrl.serverGroup.taskDefinition.memoryReservation">Container Reserved Memory</dt>\n <dd ng-if="ctrl.serverGroup.taskDefinition.memoryReservation">\n {{ctrl.serverGroup.taskDefinition.memoryReservation}} mb\n </dd>\n\n <dt ng-if="ctrl.serverGroup.taskDefinition.memoryLimit">Container Memory Limit</dt>\n <dd ng-if="ctrl.serverGroup.taskDefinition.memoryLimit">{{ctrl.serverGroup.taskDefinition.memoryLimit}} mb</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Environment Variables" expanded="false">\n <div ng-if="!ctrl.serverGroup.taskDefinition.environmentVariables.length">\n This server group has no environment variables\n </div>\n <dl ng-if="ctrl.serverGroup.taskDefinition.environmentVariables.length">\n <dt ng-repeat-start="variable in ctrl.serverGroup.taskDefinition.environmentVariables">{{variable.name}}</dt>\n <dd ng-repeat-end>{{variable.value}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Health" expanded="true" ng-if="ctrl.serverGroup.instanceCounts.total > 0">\n <dl class="dl-horizontal dl-narrow" ng-if="ctrl.serverGroup">\n <dt>Instances</dt>\n <dd>\n <health-counts container="ctrl.serverGroup.instanceCounts" class="pull-left"></health-counts>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="{{ctrl.firewallsLabel}}" expanded="false">\n <ul>\n <li ng-repeat="securityGroup in ctrl.serverGroup.securityGroups">{{securityGroup}}</li>\n </ul>\n </collapsible-section>\n <collapsible-section heading="Capacity" expanded="false">\n <dl class="dl-horizontal dl-narrow">\n <dt>Current</dt>\n <dd>{{ctrl.serverGroup.instances.length}}</dd>\n\n <dt>Desired</dt>\n <dd>{{ctrl.serverGroup.capacity.desired}}</dd>\n\n <dt>Min</dt>\n <dd>{{ctrl.serverGroup.capacity.min}}</dd>\n\n <dt>Max</dt>\n <dd>{{ctrl.serverGroup.capacity.max}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Scaling Policies" expanded="false">\n <dl class="horizontal-when-filters-collapsed">\n <dd\n ng-if="ctrl.serverGroup.metricAlarms.length > 0"\n ng-repeat="metricAlarmName in ctrl.serverGroup.metricAlarms"\n >\n {{metricAlarmName}}\n </dd>\n <dd ng-if="ctrl.serverGroup.metricAlarms.length <= 0"><i>There are no scaling policies assigned.</i></dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Build data" ng-if="ctrl.serverGroup.buildInfo && ctrl.serverGroup.buildInfo.jenkins">\n <dl class="horizontal-when-filters-collapsed">\n <dt>Job</dt>\n <dd>{{ctrl.serverGroup.buildInfo.jenkins.name}}</dd>\n <dt>Package</dt>\n <dd>{{ctrl.serverGroup.buildInfo.package_name}}</dd>\n <dt>Build</dt>\n <dd>{{ctrl.serverGroup.buildInfo.jenkins.number}}</dd>\n <dt>Commit</dt>\n <dd>{{ctrl.truncateCommitHash()}}</dd>\n <dt>Version</dt>\n <dd>{{ctrl.serverGroup.buildInfo.version}}</dd>\n <dt>Build Link</dt>\n <dd><a target="_blank" href="{{ctrl.buildJenkinsLink()}}">{{ctrl.buildJenkinsLink()}}</a></dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Server Group Logs">\n <ul>\n <li>\n <view-events-link server-group="ctrl.serverGroup"></view-events-link>\n </li>\n </ul>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/serverGroup/configure/wizard/serverGroupWizard.html",'<form name="form" class="form-horizontal" novalidate>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px">\n <h3 us-spinner="{radius:30, width:8, length: 16}"></h3>\n </div>\n <div ng-if="!state.requiresTemplateSelection">\n <v2-modal-wizard ng-show="state.loaded" heading="{{title}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="basicSettings" label="Basic Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="networking" label="Networking" done="true">\n <ng-include src="pages.networking"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="taskDefinition" label="Task Definition" done="true">\n <ng-include src="pages.taskDefinition"></ng-include>\n </v2-wizard-page>\n <div ng-if="!command.useTaskDefinitionArtifact">\n <v2-wizard-page key="container" label="Container" done="true">\n <ng-include src="pages.container"></ng-include>\n </v2-wizard-page>\n </div>\n <v2-wizard-page key="horizontalScaling" label="Horizontal Scaling" done="true">\n <ng-include src="pages.horizontalScaling"></ng-include>\n </v2-wizard-page>\n <div ng-if="!command.useTaskDefinitionArtifact">\n <v2-wizard-page key="logging" label="Logging" done="true">\n <ng-include src="pages.logging"></ng-include>\n </v2-wizard-page>\n </div>\n <v2-wizard-page key="serviceDiscovery" label="Service Discovery" done="true">\n <ng-include ng-if="!command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>\n <ng-include ng-if="command.useTaskDefinitionArtifact" src="pages.serviceDiscovery"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n data-test-id="ServerGroupWizard.submitButton"\n ng-if="ctrl.showSubmitButton()"\n is-disabled="!ctrl.isValid() || taskMonitor.submitting"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </div>\n</form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/instance/details/instanceDetails.html",'<div class="text-center" ng-if="state.notFoundStandalone">\n <h3>Could not find instance {{instanceIdNotFound}}.</h3>\n <a ui-sref="home.infrastructure">Back to search results</a>\n</div>\n<div class="details-panel" ng-if="!state.notFoundStandalone">\n <div class="header">\n <instance-details-header\n health-state="instance.healthState"\n instance-id="instance ? instance.name : instanceIdNotFound"\n loading="state.loading"\n standalone="state.standalone"\n ></instance-details-header>\n <div ng-if="!state.loading">\n <div class="actions" ng-class="{ insights: instance.insightActions.length > 0 }">\n \x3c!-- TODO - find out what I should do with ng-if="instance.placement" --\x3e\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button\n type="button"\n class="btn btn-sm btn-primary dropdown-toggle"\n ng-disabled="disabled"\n uib-dropdown-toggle\n >\n Instance Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li>\n <a href ng-click="ctrl.enableInstanceInDiscovery()" ng-if="ctrl.canRegisterWithDiscovery()"\n >Enable in Discovery</a\n >\n </li>\n <li>\n <a\n href\n ng-click="ctrl.disableInstanceInDiscovery()"\n ng-if="ctrl.hasHealthState(\'Discovery\', \'Up\') || ctrl.hasHealthState(\'Discovery\', \'Down\')"\n >Disable in Discovery</a\n >\n </li>\n <li>\n <a href ng-click="ctrl.registerInstanceWithLoadBalancer()" ng-if="ctrl.canRegisterWithLoadBalancer()"\n >Register with Load Balancer</a\n >\n </li>\n <li>\n <a href ng-click="ctrl.deregisterInstanceFromLoadBalancer()" ng-if="ctrl.canDeregisterFromLoadBalancer()"\n >Deregister from Load Balancer</a\n >\n </li>\n <li>\n <a href ng-click="ctrl.registerInstanceWithTargetGroup()" ng-if="ctrl.canRegisterWithTargetGroup()"\n >Register with Target Group</a\n >\n </li>\n <li>\n <a href ng-click="ctrl.deregisterInstanceFromTargetGroup()" ng-if="ctrl.canDeregisterFromTargetGroup()"\n >Deregister from Target Group</a\n >\n </li>\n \x3c!--<li role="presentation" class="divider" ng-if="instance.health.length > 0"></li>--\x3e\n </ul>\n </div>\n <div class="dropdown" ng-if="instance.insightActions.length > 0" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>\n Insight <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li ng-repeat="action in instance.insightActions">\n <a target="_blank" href="{{action.url}}">{{action.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class="content" data-test-id="instanceDetails.content" ng-if="!state.loading && instance">\n <collapsible-section heading="Instance Information" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Launched</dt>\n <dd ng-if="instance.launchTime">{{instance.launchTime | timestamp}}</dd>\n <dd ng-if="!instance.launchTime">(Unknown)</dd>\n <dt ng-if="instance.serverGroup">Server Group</dt>\n <dd ng-if="instance.serverGroup">\n <a\n ui-sref="^.serverGroup({region: instance.region,\n accountId: instance.account,\n serverGroup: instance.serverGroup,\n provider: instance.provider})"\n >{{instance.serverGroup}}</a\n >\n </dd>\n <dt ng-if="instance.imageId">Image ID</dt>\n <dd ng-if="instance.imageId">{{instance.imageId}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Status" expanded="true">\n <p ng-if="instance.healthState !== \'Starting\' && !healthMetrics.length">\n No health metrics found for this instance\n </p>\n <p ng-if="instance.healthState === \'Starting\' && !healthMetrics.length">\n <span class="glyphicon glyphicon-Starting-triangle"></span> <strong>Starting</strong>\n </p>\n\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-repeat-start="metric in healthMetrics | orderBy: \'type\'">{{metric.type | robotToHuman}}</dt>\n <dd ng-repeat-end>\n <div ng-if="metric.type !== \'LoadBalancer\' && metric.type !== \'TargetGroup\'">\n <span\n uib-tooltip="{{metric.state.toLowerCase() === \'down\' ? metric.description : \'\'}}"\n tooltip-placement="left"\n >\n <span class="glyphicon glyphicon-{{metric.state}}-triangle"></span>\n {{metric.state | robotToHuman}}\n </span>\n <span class="pad-left small">\n <a ng-if="metric.healthCheckUrl" target="_blank" href="{{metric.healthCheckUrl}}">Health Check</a>\n <span ng-if="metric.healthCheckUrl && metric.statusPageUrl"> | </span>\n <a ng-if="metric.statusPageUrl" target="_blank" href="{{metric.statusPageUrl}}">Status</a>\n </span>\n </div>\n <div\n ng-if="metric.type === \'LoadBalancer\' && metric.loadBalancers.length"\n ng-repeat="loadBalancer in metric.loadBalancers"\n >\n <instance-load-balancer-health load-balancer="loadBalancer"></instance-load-balancer-health>\n </div>\n <div\n ng-if="metric.type === \'TargetGroup\' && metric.targetGroups.length"\n ng-repeat="targetGroup in metric.targetGroups"\n >\n <instance-load-balancer-health\n load-balancer="targetGroup"\n ip-address="baseIpAddress"\n ></instance-load-balancer-health>\n </div>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Networking">\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-if="instance.vpcId">VPC</dt>\n <dd ng-if="instance.vpcId"><vpc-tag vpc-id="instance.vpcId"></vpc-tag></dd>\n <dt ng-if="instance.subnetId">Subnet</dt>\n <dd ng-if="instance.subnetId"><subnet-tag subnet-id="instance.subnetId"></subnet-tag></dd>\n\n <dt ng-if="instance.privateAddress || instance.networkInterface">IP</dt>\n <dd ng-if="instance.networkInterface.privateIpv4Address">\n Private address (ENI):\n <a href="http://{{instance.networkInterface.privateIpv4Address}}" target="_blank"\n >{{instance.networkInterface.privateIpv4Address}}</a\n >\n <copy-to-clipboard\n class="copy-to-clipboard copy-to-clipboard-sm"\n text="instance.networkInterface.privateIpv4Address"\n tool-tip="\'Copy to clipboard\'"\n >\n </copy-to-clipboard>\n </dd>\n <dd ng-if="instance.networkInterface.ipv6Address">\n Private address (ENI):\n <a href="http://{{instance.networkInterface.ipv6Address}}" target="_blank"\n >{{instance.networkInterface.ipv6Address}}</a\n >\n <copy-to-clipboard\n class="copy-to-clipboard copy-to-clipboard-sm"\n text="instance.networkInterface.ipv6Address"\n tool-tip="\'Copy to clipboard\'"\n >\n </copy-to-clipboard>\n </dd>\n <dd ng-if="instance.privateAddress">\n Private address (Bridge):\n <a href="http://{{instance.privateAddress}}" target="_blank">{{instance.privateAddress}}</a>\n <copy-to-clipboard\n class="copy-to-clipboard copy-to-clipboard-sm"\n text="instance.privateAddress"\n tool-tip="\'Copy to clipboard\'"\n >\n </copy-to-clipboard>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Console Output" ng-if="baseIpAddress">\n <ul>\n <li>\n <console-output-link instance="instance"></console-output-link>\n </li>\n </ul>\n </collapsible-section>\n <instance-links\n address="baseIpAddress"\n application="application"\n instance="instance"\n moniker="moniker"\n environment="environment"\n ></instance-links>\n </div>\n <div class="content" ng-if="!state.loading && !instance">\n <div class="content-section">\n <div class="content-body text-center">\n <h3>Instance not found.</h3>\n </div>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("ecs/src/securityGroup/details/securityGroupDetail.html",'<div class="text-center" ng-if="state.notFound">\n <h3>Could not find <firewall-label label="firewall"></firewall-label> {{group}}.</h3>\n <a ui-sref="home.infrastructure">Back to search results</a>\n</div>\n<div class="details-panel" ng-if="!state.notFound">\n <div class="header">\n <div class="close-button" ng-if="!state.standalone">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div ng-if="state.loading" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div class="header-text horizontal middle" ng-if="!state.loading">\n <span class="glyphicon glyphicon-transfer"></span>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>\n {{securityGroup.name || \'(not found)\'}}\n <render-if-feature feature="entityTags">\n <entity-notifications\n entity="securityGroup"\n application="ctrl.application"\n placement="bottom"\n h-offset-percent="90%"\n entity-type="securityGroup"\n page-location="details"\n on-update="ctrl.application.securityGroups.refresh()"\n ></entity-notifications>\n </render-if-feature>\n </h3>\n </div>\n </div>\n <div class="content" ng-if="!state.loading">\n <collapsible-section heading="{{ctrl.firewallLabel}} Details" expanded="true">\n <dl class="dl-horizontal dl-medium">\n <dt>ID</dt>\n <dd>{{securityGroup.id}}</dd>\n <dt>Account</dt>\n <dd>\n <account-tag account="securityGroup.accountName"></account-tag>\n </dd>\n <dt>Region</dt>\n <dd>{{securityGroup.region}}</dd>\n <dt>VPC</dt>\n <dd>\n <vpc-tag vpc-id="securityGroup.vpcId"></vpc-tag>\n </dd>\n <dt>Description</dt>\n <dd>{{securityGroup.description}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="IP Range Rules ({{ipRules.length}})" expanded="{{ipRules.length > 0}}">\n <div ng-if="!ipRules.length">None</div>\n\n <dl\n ng-class="insightCtrl.vm.filtersExpanded ? \'\' : \'dl-horizontal dl-medium\'"\n ng-repeat="ipRangeRule in ipRules | orderBy: \'range.address\'"\n >\n <dt>IP Range</dt>\n <dd>{{ipRangeRule.address}}</dd>\n <dt>Port Ranges</dt>\n <dd ng-repeat="rule in ipRangeRule.rules">\n <span ng-if="rule.protocol === \'-1\'">\n All ports and protocols\n <div ng-if="ipRangeRule.rules.length > 1">\n <em>Additional port ranges are specified, but redundant:</em>\n </div>\n </span>\n <span ng-if="rule.protocol !== \'-1\'"> {{rule.protocol}}: {{rule.startPort}} &rarr; {{rule.endPort}} </span>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section\n heading="{{ctrl.firewallLabel}} Rules ({{securityGroupRules.length || 0}})"\n expanded="{{securityGroupRules.length > 0}}"\n >\n <div ng-if="!securityGroupRules.length">None</div>\n\n <dl\n ng-class="insightCtrl.vm.filtersExpanded ? \'\' : \'dl-horizontal dl-medium\'"\n ng-repeat="rule in securityGroupRules | orderBy: \'securityGroup.name\' "\n >\n <dt>\n <firewall-label label="Firewall"></firewall-label>\n </dt>\n <dd ng-if="rule.securityGroup.name">\n <a\n ui-sref="^.firewallDetails({name: rule.securityGroup.name, accountId: rule.securityGroup.accountName, region: rule.securityGroup.region, vpcId: rule.securityGroup.vpcId, provider: \'ecs\'})"\n >\n <account-tag\n account="rule.securityGroup.accountName || rule.securityGroup.accountId"\n ng-if="rule.securityGroup.accountName !== securityGroup.accountName"\n ></account-tag>\n {{rule.securityGroup.name}} ({{rule.securityGroup.id}})\n </a>\n </dd>\n <dt>Port Ranges</dt>\n <dd ng-repeat="portRange in rule.rules">\n {{portRange.protocol}}: {{portRange.startPort}} &rarr; {{portRange.endPort}}\n </dd>\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]);export{At as ECS_MODULE};
1
+ import{InstanceInformation as e,InstanceStatus as t,VpcTag as a,VpcReader as r,buildIpRulesModel as n,buildSecurityGroupRulesModel as i,IPRangeRules as s,AWSProviderSettings as l}from"@spinnaker/amazon";import{HelpContentsRegistry as o,SETTINGS as c,RecentHistoryService as d,InstanceDetailsHeader as m,CollapsibleSection as p,LabeledValue as u,SubnetTag as g,ConsoleOutputLink as h,InstanceLinks as v,withRouter as y,InstanceReader as f,CopyToClipboard as E,LoadBalancerServerGroup as b,Spinner as C,timestamp as N,AccountTag as k,registerApplicationState as S,StageConstants as D,HelpField as G,StageConfigField as A,DeploymentStrategySelector as P,AccountRegionClusterSelector as w,TargetSelect as T,PlatformHealthOverride as I,AccountService as F,Registry as M,ExecutionDetailsSection as x,StageFailureMessage as R,ExecutionDetailsTasks as B,FirewallLabels as z,CloudProviderLogo as L,DeckRuntimeContext as O,REST as q,MapEditor as U,AccountSelectInput as $,RegionSelectInput as H,NameUtils as V,TetheredSelect as _,ArtifactTypePatterns as W,StageArtifactSelectorDelegate as j,CheckboxInput as Z,TaskMonitor as K,ReactModal as X,DeployInitializer as Y,WizardModal as J,WizardPage as Q,noop as ee,TaskMonitorWrapper as te,SpinFormik as ae,ModalClose as re,FormikFormField as ne,NumberInput as ie,ValidationMessage as se,MinMaxDesiredChanges as le,TaskReason as oe,UserVerification as ce,ReactSelectInput as de,useDeckRuntimeServices as me,ClusterTargetBuilder as pe,ManagedMenuItem as ue,AddEntityTagLinks as ge,ServerGroupWarningMessageService as he,ConfirmationModalService as ve,ServerGroupReader as ye,HealthCounts as fe,ModalHeader as Ee,ModalBody as be,ModalFooter as Ce,DeploymentStrategyRegistry as Ne,CloudProviderRegistry as ke}from"@spinnaker/core";import*as Se from"react";import De from"react";import Ge,{isEqual as Ae,set as Pe,isEmpty as we,uniqWith as Te,uniq as Ie,get as Fe,uniqBy as Me,defaults as xe}from"lodash";import{UISrefActive as Re,UISref as Be}from"@uirouter/react";import{Alert as ze,Modal as Le,Dropdown as Oe,Tooltip as qe}from"react-bootstrap";import{DockerImageReader as Ue}from"@spinnaker/docker";import{Observable as $e}from"rxjs";const He={"ecs.loadBalancer.targetGroup":"<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>","ecs.serverGroup.clusterName":"<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>","ecs.stage.findImageByTags.labelOrSha":"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>","ecs.serverGroup.stack":"<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>","ecs.serverGroup.detail":"<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>","ecs.capacity.overwrite":"<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>","ecs.capacity.desired":"<p>The starting number of containers, before any autoscaling happens.</p>","ecs.capacity.minimum":"<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>","ecs.capacity.maximum":"<p>The maximal number of containers you can reach as a result of autoscaling.</p>","ecs.capacity.reserved.computeUnits":"<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>","ecs.capacity.reserved.memory":"<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>","ecs.loadbalancing.targetPort":"<p>The port on which your application is listening for incoming traffic</p>","ecs.iamrole":"<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>","ecs.dockerimage":"Docker image for your container, such as nginx:latest","ecs.dockerimagecredentials":"<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>","ecs.placementConstraints":'<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>',"ecs.placementConstraintType":"<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>","ecs.placementConstraintExpression":'<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>',"ecs.placementStrategy":'<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>',"ecs.platformVersion":"<p>Defaults to the latest platform version.</p>","ecs.enableDeploymentCircuitBreaker":"<p>Enable circuit breaker for the ECS service.</p>","ecs.capacity.copySourceScalingPoliciesAndActions":"<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>","ecs.launchtype":"<p>Launch service tasks on your own EC2 instances or on Fargate.</p>","ecs.healthgraceperiod":"<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>","ecs.publicip":"<p>Assign a public IP address to each task.</p>","ecs.networkMode":"<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>","ecs.subnet":"<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>","ecs.securityGroups":"<p>The security group(s) name(s) your containers are deployed with.</p>","ecs.dockerLabels":'<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>',"ecs.logDriver":'<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>',"ecs.logOptions":'<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>',"ecs.taskDefinition":'<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>',"ecs.taskDefinitionArtifact":"<p>The artifact containing the ECS Task Definition.</p>","ecs.containerMappings":"<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>","ecs.containerMappingName":'<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>',"ecs.containerMappingImage":"<p>The container image the named container should run.</p>","ecs.targetGroupMappings":"<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>","ecs.loadBalancedContainer":"<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>","ecs.tags":"<p>The tags to apply to the task definition and the service","ecs.environmentVariables":"<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>","ecs.serviceDiscovery":"<p>The AWS Cloud Map service discovery registries to assign to this service</p>","ecs.serviceDiscoveryRegistry":"<p>The AWS Cloud Map service to use for service discovery registration</p>","ecs.serviceDiscoveryContainerPort":"<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","ecs.serviceDiscoveryContainerName":"<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>","ecs.computeOptions":'<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>',"ecs.capacityProviderStrategy":'<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>',"ecs.capacityProviderName":"<p>The short name of the capacity provider.</p>","ecs.capacityProviderBase":"<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>","ecs.capacityProviderWeight":"<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>","ecs.evaluateExpression":'<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>'};Object.keys(He).forEach(e=>o.register(e,He[e]));const Ve=c.providers.ecs||{};function _e(e,t){return e===t||(null==e?void 0:e.id)===t}function We(e,t){return!(t.account&&e.account!==t.account||t.region&&e.region!==t.region)}function je(e){return(Array.isArray(e)?e:e?[e]:[]).map(e=>"string"==typeof e?e:e.targetGroupName||e.name).filter(Boolean)}function Ze(e,t,a,r,n){var i;const s=e.isStandalone?a.health:t.health,l=(((null==s?void 0:s.length)?s:a.health)||[]).filter(e=>"Ecs"!==e.type||"Unknown"!==e.state).map(e=>{const t=(a.health||[]).find(t=>t.type===e.type);return t?{...t,...e}:{...e}});return e.isStandalone?l:function(e,t,a,r){const n=t.flatMap(e=>(e.targetGroups||e.targetGroup||[]).map(t=>({account:e.account,region:e.region,...t})));return e.map(e=>"TargetGroup"===e.type&&e.targetGroups?{...e,targetGroups:e.targetGroups.map(e=>{const t=e.targetGroupName||e.name,i=n.find(e=>t&&(e.targetGroupName||e.name)===t&&e.account===a&&e.region===r);if(!i)return e;const s="traffic-port"===i.healthCheckPort||null==i.healthCheckPort?i.port:i.healthCheckPort;return{...e,...null==s?{}:{healthCheckPath:`:${s}${i.healthCheckPath||""}`},...i.healthCheckProtocol?{healthCheckProtocol:i.healthCheckProtocol.toLowerCase()}:{}}})}:e)}(l,(null==(i=e.loadBalancers)?void 0:i.data)||[],r,n)}async function Ke(e,t){var a,r;const n=function(e,t){var a;if(e.isStandalone||!e.serverGroups)return{account:t.account||t.accountId,region:t.region,summary:t};for(const a of e.serverGroups.data||[]){if(!We(a,t))continue;const e=(a.instances||[]).find(e=>_e(e,t.instanceId));if(e)return{account:a.account,loadBalancers:a.loadBalancers||[],region:a.region,serverGroup:a.name,summary:e,targetGroups:je(a.targetGroups||a.targetGroup),vpcId:a.vpcId}}for(const r of(null==(a=e.loadBalancers)?void 0:a.data)||[]){if(!We(r,t))continue;const e=(r.instances||[]).find(e=>_e(e,t.instanceId));if(e)return{account:r.account,loadBalancers:[r.name],region:r.region,summary:e,vpcId:r.vpcId};for(const e of r.targetGroups||r.targetGroup||[]){if(!We({account:r.account,region:r.region,...e},t))continue;const a=(e.instances||[]).find(e=>_e(e,t.instanceId));if(a)return{account:e.account||r.account,region:e.region||r.region,summary:"string"==typeof a?{id:a}:a,targetGroups:je(e),vpcId:r.vpcId}}for(const e of(r.serverGroups||[]).filter(e=>e.isDisabled)){const a=(e.instances||[]).find(e=>_e(e,t.instanceId));if(a)return{account:r.account,loadBalancers:[r.name],region:r.region,serverGroup:e.name,summary:a,vpcId:r.vpcId}}}}(e,t);if(!(null==n?void 0:n.summary)||!n.account||!n.region)return;d.addExtraDataToLatest("instances",{account:n.account,region:n.region,...n.serverGroup?{serverGroup:n.serverGroup}:{},...n.vpcId?{vpcId:n.vpcId}:{}});const i=await f.getInstanceDetails(n.account,n.region,t.instanceId),s=t.instanceId,l=i.publicDnsName||i.privateIpAddress||(null==(a=i.networkInterface)?void 0:a.privateIpv4Address)||i.privateAddress||(null==(r=i.networkInterface)?void 0:r.ipv6Address);return{...n.summary,...i,account:n.account,baseIpAddress:l,cloudProvider:i.cloudProvider||n.summary.cloudProvider||"ecs",healthMetrics:Ze(e,n.summary,i,n.account,n.region),instanceId:s,loadBalancers:n.loadBalancers||i.loadBalancers||n.summary.loadBalancers,provider:i.provider||n.summary.provider||"ecs",region:n.region,serverGroup:n.serverGroup||i.serverGroup||n.summary.serverGroup,targetGroups:n.targetGroups||i.targetGroups||n.summary.targetGroups,vpcId:n.vpcId||i.vpcId||n.summary.vpcId}}function Xe({address:e,label:t}){if(!e)return null;const a=e.includes(":")?`[${e}]`:e;return De.createElement(De.Fragment,null,De.createElement("dt",null,t),De.createElement("dd",null,De.createElement("a",{href:`http://${a}`,target:"_blank",rel:"noopener noreferrer"},e),De.createElement(E,{text:e,toolTip:"Copy to clipboard"})))}Ve&&(Ve.resetToOriginal=c.resetProvider("ecs"));class Ye extends De.Component{constructor(){super(...arguments),this.state={instance:void 0,instanceIdNotFound:void 0,loading:!0},this.activeRequestId=0,this.dataReady=!1,this.isUnmounted=!1}componentDidMount(){const{app:e}=this.props;(e.isStandalone?Promise.resolve():Promise.all([e.serverGroups.ready(),e.loadBalancers.ready()]).then(()=>{})).then(()=>{var t;this.isUnmounted||(this.dataReady=!0,this.retrieveInstance(),!e.isStandalone&&(null==(t=e.serverGroups)?void 0:t.onRefresh)&&(this.unsubscribeFromRefresh=e.serverGroups.onRefresh(()=>this.retrieveInstance())))},()=>{this.isUnmounted||this.closeDetails()})}componentDidUpdate(e){const t=this.getInstanceParams(e),a=this.getInstanceParams();!this.dataReady||t.account===a.account&&t.instanceId===a.instanceId&&t.region===a.region||this.retrieveInstance(!0)}componentWillUnmount(){var e;this.isUnmounted=!0,this.activeRequestId+=1,null==(e=this.unsubscribeFromRefresh)||e.call(this)}getInstanceParams(e=this.props){const t=e.instance||e.$stateParams||e.stateParams||{};return{...t,account:t.account||t.accountId||e.accountId,instanceId:t.instanceId}}closeDetails(){this.props.stateService.go("^",{allowModalToStayOpen:!0},{location:"replace"})}retrieveInstance(e=!1){const t=++this.activeRequestId,a=this.getInstanceParams();this.setState(e?{instance:void 0,instanceIdNotFound:void 0,loading:!0}:{instanceIdNotFound:void 0,loading:!0}),Ke(this.props.app,a).then(e=>{this.isUnmounted||t!==this.activeRequestId||this.setState({instance:e,instanceIdNotFound:e?void 0:a.instanceId,loading:!1})},()=>{this.isUnmounted||t!==this.activeRequestId||(this.props.app.isStandalone?(d.removeLastItem("instances"),this.setState({instance:void 0,instanceIdNotFound:a.instanceId,loading:!1})):this.closeDetails())})}render(){var r,n,i,s;const{app:l,environment:o,moniker:c}=this.props,{instance:d,instanceIdNotFound:y,loading:f}=this.state,E=(null==d?void 0:d.instanceId)||y||this.getInstanceParams().instanceId;return De.createElement("div",{className:"details-panel"},De.createElement("div",{className:"header"},De.createElement(m,{cloudProvider:"ecs",healthState:null==d?void 0:d.healthState,instanceId:E,loading:f,standalone:l.isStandalone})),!f&&d&&De.createElement("div",{className:"content","data-test-id":"instanceDetails.content"},De.createElement(p,{heading:"Instance Information",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement(e,{account:d.account,availabilityZone:d.zone||d.availabilityZone||(null==(r=d.placement)?void 0:r.availabilityZone),instanceType:d.instanceType,launchTime:d.launchTime,provider:d.provider,region:d.region,serverGroup:d.serverGroup}),d.imageId&&De.createElement(u,{label:"Image ID",value:d.imageId}))),De.createElement(t,{healthMetrics:d.healthMetrics||[],healthState:d.healthState,metricTypes:["LoadBalancer","TargetGroup"],privateIpAddress:d.privateIpAddress||(null==(n=d.networkInterface)?void 0:n.privateIpv4Address)}),De.createElement(p,{heading:"Networking"},De.createElement("dl",{className:"horizontal-when-filters-collapsed"},d.vpcId&&De.createElement(u,{label:"VPC",value:De.createElement(a,{vpcId:d.vpcId})}),d.subnetId&&De.createElement(u,{label:"Subnet",value:De.createElement(g,{subnetId:d.subnetId})}),De.createElement(Xe,{address:null==(i=d.networkInterface)?void 0:i.privateIpv4Address,label:"Private address (ENI)"}),De.createElement(Xe,{address:null==(s=d.networkInterface)?void 0:s.ipv6Address,label:"IPv6 address (ENI)"}),De.createElement(Xe,{address:d.privateAddress,label:"Private address (Bridge)"}))),De.createElement(p,{heading:"Console Output"},De.createElement(h,{instance:d})),De.createElement(v,{address:d.baseIpAddress,application:l,environment:o,instance:d,moniker:c})),!f&&!d&&y&&De.createElement("div",{className:"content"},De.createElement("div",{className:"content-section"},De.createElement("div",{className:"content-body text-center"},De.createElement("h3",null,"Instance not found."),De.createElement("p",null,y)))))}}const Je=y(Ye);class Qe extends De.Component{render(){const{targetGroup:e,loadBalancer:t,showServerGroups:a}=this.props,r={loadBalancerName:t.name,region:e.region,accountId:e.account,name:e.targetGroupName,vpcId:e.vpcId,provider:e.cloudProvider},n={up:void 0,down:void 0,starting:void 0,succeeded:void 0,failed:void 0,unknown:void 0,outOfService:void 0};return De.createElement("div",{className:"target-group-container container-fluid no-padding"},De.createElement(Re,{class:"active"},De.createElement(Be,{to:".ecsTargetGroupDetails",params:r},De.createElement("div",{className:"clickable clickable-row row no-margin-y target-group-header"},De.createElement("div",{className:"col-md-8 target-group-title"},e.targetGroupName)))),a&&e.serverGroups.map(t=>De.createElement(b,{key:t,account:e.account,region:e.region,serverGroup:{account:e.account,cloudProvider:e.cloudProvider,cluster:t,instanceCounts:n,instances:e.instances,name:t,type:e.type,region:e.region},showInstances:!1})))}}class et extends De.Component{shouldComponentUpdate(e){return e.showInstances!==this.props.showInstances||e.showServerGroups!==this.props.showServerGroups||e.loadBalancer!==this.props.loadBalancer||(()=>!Ae((e.serverGroups||[]).map(e=>e.name),(this.props.serverGroups||[]).map(e=>e.name)))()||(()=>!Ae((e.loadBalancer.targetGroups||[]).map(e=>e.targetGroupName),(this.props.loadBalancer.targetGroups||[]).map(e=>e.targetGroupName)))()}render(){const{loadBalancer:e,showInstances:t,showServerGroups:a}=this.props,r=e.targetGroups.map(r=>De.createElement(Qe,{key:r.targetGroupName,loadBalancer:e,targetGroup:r,showInstances:t,showServerGroups:a}));return De.createElement("div",{className:"cluster-container"},r)}}class tt extends De.Component{constructor(e){super(e)}getTargetGroupNameFromArn(e){const t=e.split("/");return t.length<0?e:t[1]}render(){const{port:e,protocol:t,defaultActions:a}=this.props.listener;return De.createElement("div",null,De.createElement("h4",null,t,":",e),De.createElement("div",{style:{paddingLeft:10}},De.createElement("i",null,"default actions"),De.createElement("ul",null,a.map((e,t)=>"forward"==e.type?De.createElement("li",{key:t},"→",De.createElement("i",{className:"fa fa-fw fa-crosshairs icon","aria-hidden":"true"}),De.createElement("span",null,e.targetGroupArn||e.forwardConfig.targetGroups.map(e=>this.getTargetGroupNameFromArn(e.targetGroupArn)))):De.createElement("li",{key:t},e.type,":"," ",e.redirectConfig.statusCode||e.fixedResponseConfig.statusCode||e.authenticateOidcConfig.clientId||e.authenticateCognitoActionConfig.userPoolDomain)))))}}class at extends De.Component{constructor(e){super(e),this.state={loading:!0,loadBalancer:void 0,refreshListenerUnsubscribe:()=>{}},e.app.getDataSource("loadBalancers").ready().then(()=>this.extractLoadBalancer())}componentWillUnmount(){this.state.refreshListenerUnsubscribe()}extractLoadBalancer(){const{name:e,region:t}=this.props.loadBalancer,a=this.props.app.getDataSource("loadBalancers").data.find(a=>a.name===e&&a.account===this.props.loadBalancer.accountId&&a.region===t);this.setState({loading:!1,loadBalancer:a}),this.state.refreshListenerUnsubscribe(),a?this.setState({refreshListenerUnsubscribe:this.props.app.getDataSource("loadBalancers").onRefresh(()=>this.extractLoadBalancer())}):this.setState({refreshListenerUnsubscribe:()=>{}})}render(){const e=this.props.loadBalancer.name,{loadBalancer:t,loading:a}=this.state,{accountId:r}=this.props,n=De.createElement("div",{className:"close-button"},De.createElement(Be,{to:"^"},De.createElement("span",{className:"glyphicon glyphicon-remove"})));return De.createElement("div",{className:"details-panel"},a&&De.createElement("div",{className:"header"},n,De.createElement("div",{className:"horizontal center middle"},De.createElement(C,{size:"small"}))),!a&&De.createElement("div",{className:"header"},n,De.createElement("div",{className:"header-text horizontal middle"},De.createElement("i",{className:"fa icon-sitemap"}),De.createElement("h3",{className:"horizontal middle space-between flex-1"},e))),!a&&!t&&De.createElement("div",{className:"content"},De.createElement("div",{className:"content-section"},De.createElement("div",{className:"content-body text-center"},De.createElement("h3",null,"Load balancer not found.")))),!a&&t&&De.createElement("div",{className:"content"},De.createElement(p,{heading:"Load Balancer Details",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"Created"),De.createElement("dd",null,N(t.createdTime)),De.createElement("dt",null,"In"),De.createElement("dd",null,De.createElement(k,{account:r}),De.createElement("br",null),t.region),De.createElement("dt",null,"VPC"),De.createElement("dd",null,t.vpcId),De.createElement("dt",null,"Type"),De.createElement("dd",null,t.loadBalancerType),De.createElement("dt",null,"IP Type"),De.createElement("dd",null,t.ipAddressType)),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Availability Zones"),De.createElement("dd",null,De.createElement("ul",null,t.availabilityZones.map(e=>De.createElement("li",{key:e},e))))),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Target Groups"),De.createElement("dd",null,De.createElement("ul",null,t.targetGroups.map(e=>De.createElement("li",{key:e.targetGroupName},De.createElement(Re,{class:"active"},De.createElement(Be,{to:"^.ecsTargetGroupDetails",params:{loadBalancerName:t.name,region:t.region,accountId:t.account,name:e.targetGroupName,vpcId:e.vpcId,provider:t.cloudProvider}},De.createElement("a",null,e.targetGroupName)))))))),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"DNS Name"),De.createElement("dd",null,De.createElement("a",{target:"_blank",href:"http://"+t.dnsname},t.dnsname)))),De.createElement(p,{heading:"Status",defaultExpanded:!1},De.createElement("span",null,"Select a target group to check the instance health status from the view of its server groups.")),De.createElement(p,{heading:"Listeners",defaultExpanded:!1},t.listeners?t.listeners.map((e,t)=>De.createElement("div",{key:t},De.createElement("span",null,De.createElement(tt,{listener:e})))):De.createElement("li",null,"No listeners provided.")),De.createElement(p,{heading:"Firewalls",defaultExpanded:!1},De.createElement("ul",null,t.securityGroups?t.securityGroups.map(e=>De.createElement("li",{key:e},e)):De.createElement("li",null,"No security groups provided."))),De.createElement(p,{heading:"Subnets",defaultExpanded:!1},De.createElement("ul",null,t.subnets.map(e=>De.createElement("li",{key:e},e))))))}}class rt extends De.Component{constructor(e){super(e),this.state={loading:!0,targetGroup:void 0,loadBalancer:void 0,refreshListenerUnsubscribe:()=>{}},e.app.getDataSource("loadBalancers").ready().then(()=>this.extractTargetGroup())}componentWillUnmount(){this.state.refreshListenerUnsubscribe()}extractTargetGroup(){const{loadBalancerName:e,region:t,targetGroupName:a}=this.props.targetGroup,r=this.props.app.getDataSource("loadBalancers").data.find(a=>a.name===e&&a.account===this.props.accountId&&a.region===t);if(this.setState({loadBalancer:r}),this.state.refreshListenerUnsubscribe(),r){const e=r.targetGroups.find(e=>e.targetGroupName===a);e||this.setState({loading:!1,targetGroup:null}),e&&(this.setState({loading:!1,targetGroup:e}),e?this.setState({refreshListenerUnsubscribe:this.props.app.getDataSource("loadBalancers").onRefresh(()=>this.extractTargetGroup())}):this.setState({refreshListenerUnsubscribe:()=>{}}))}else this.setState({loading:!1,targetGroup:null})}render(){const{name:e,accountId:t}=this.props,a=this.props.targetGroup.region,{targetGroup:r,loadBalancer:n,loading:i}=this.state,s=De.createElement("div",{className:"close-button"},De.createElement(Be,{to:"^"},De.createElement("span",{className:"glyphicon glyphicon-remove"})));return De.createElement("div",{className:"details-panel"},i&&De.createElement("div",{className:"header"},s,De.createElement("div",{className:"horizontal center middle"},De.createElement(C,{size:"small"}))),!i&&De.createElement("div",{className:"header"},De.createElement("div",{className:"header-text horizontal middle"},De.createElement("i",{className:"fa fa-crosshairs icon","aria-hidden":"true"}),De.createElement("h3",{className:"horizontal middle space-between flex-1"},e))),!i&&!r&&De.createElement("div",{className:"content"},De.createElement("div",{className:"content-section"},De.createElement("div",{className:"content-body text-center"},De.createElement("h3",null,"Target group not found.")))),!i&&r&&De.createElement("div",{className:"content"},De.createElement(p,{heading:"Target Group Details",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"In"),De.createElement("dd",null,De.createElement(k,{account:t}),De.createElement("br",null),r.region),De.createElement("dt",null,"VPC"),De.createElement("dd",null,r.vpcId),De.createElement("dt",null,"Protocol"),De.createElement("dd",null,r.protocol),De.createElement("dt",null,"Port"),De.createElement("dd",null,r.port),De.createElement("dt",null,"Target Type"),De.createElement("dd",null,r.targetType.toUpperCase())),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Load Balancers"),De.createElement("dd",null,De.createElement("ul",{className:"collapse-margin-on-filter-collapse"},r.loadBalancerNames?r.loadBalancerNames.map((e,t)=>De.createElement("li",{key:t},e)):De.createElement("li",null,"No load balncers provided.")))),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Load Balancer DNS Name"),De.createElement("dd",null,De.createElement("a",{target:"_blank",href:"http://"+n.dnsname},n.dnsname))),De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Server Groups"),De.createElement("dd",null,De.createElement("ul",{className:"collapse-margin-on-filter-collapse"},r.serverGroups.map((e,r)=>De.createElement("li",{key:r},De.createElement(Re,{class:"active"},De.createElement(Be,{to:"^.serverGroup",params:{region:a,accountId:t,serverGroup:e,provider:"ecs"}},De.createElement("a",null,e))))))))),De.createElement(p,{heading:"Health Checks",defaultExpanded:!1},De.createElement("dl",{className:"horizontal-when-filters-collapsed"},De.createElement("dt",null,"Target"),De.createElement("dd",null,r.healthCheckProtocol,":",r.healthCheckPort,r.healthCheckPath),De.createElement("dt",null,"Timeout"),De.createElement("dd",null,r.healthCheckTimeoutSeconds," seconds"),De.createElement("dt",null,"Interval"),De.createElement("dd",null,r.healthCheckIntervalSeconds," seconds"),De.createElement("dt",null,"Healthy Threshold"),De.createElement("dd",null,r.healthyThresholdCount),De.createElement("dt",null,"Unhealthy Threshold"),De.createElement("dd",null,r.unhealthyThresholdCount),De.createElement("dt",null,"Matcher"),De.createElement("dd",null,"HTTP Code(s): ",r&&r.matcher?r.matcher.httpCode:"None"))),De.createElement(p,{heading:"Attributes",defaultExpanded:!1},De.createElement("dl",null,De.createElement("dt",null,"Deregistration Delay Timeout"),De.createElement("dd",null,r.attributes["deregistration_delay.timeout_seconds"]||0," seconds"),De.createElement("dt",null,"Stickiness Enabled"),De.createElement("dd",null,r.attributes["stickiness.enabled"]||"N/A")))))}}class nt{normalizeLoadBalancer(e){return e.targetGroups.forEach(t=>{if(t.region=e.region,t.account=e.account,t.cloudProvider=e.cloudProvider,e.targetGroupServices){const a=e.targetGroupServices;t.serverGroups=a[t.targetGroupArn]}}),Promise.resolve(e)}}const it={name:"ecsTargetGroupDetails",url:"/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name",params:{vpcId:{value:null,squash:!0}},views:{"detail@../insight":{component:rt,$type:"react"}},resolve:{accountId:["$stateParams",e=>e.accountId],name:["$stateParams",e=>e.name],provider:["$stateParams",e=>e.provider],targetGroup:["$stateParams",e=>({loadBalancerName:e.loadBalancerName,targetGroupName:e.name,accountId:e.accountId,region:e.region,vpcId:e.vpcId})]},data:{pageTitleDetails:{title:"Target Group Details",nameParam:"name",accountParam:"accountId",regionParam:"region"}}};S(e=>{e.addInsightDetailState(it)});function st({action:e,step:t,useSource:a}){var r,n,i,s;const l=a?null==(n=null==(r=t.context)?void 0:r.source)?void 0:n.serverGroupName:null==(i=t.context)?void 0:i.serverGroupName;return De.createElement("span",{className:"task-label"},e,": ",l," (",null==(s=t.context)?void 0:s.region,")")}const lt="AddToLoadBalancer",ot=[{label:"Scale by percentage or number",val:"scale"},{label:"Scale to an exact size",val:"scale_exact"},{label:"Scale to cluster size",val:"scale_to_cluster"}],ct=[{label:"Scale by number of instances",val:"incr"},{label:"Scale by percentage",val:"pct"}];function dt(e,t={},a=!1){De.useEffect(()=>function(e,t={},a=!1){var r,n,i;const{application:s,stage:l,updateStageField:o}=e,c={cloudProvider:"ecs",cloudProviderType:"ecs"},d=null==(r=s.defaultCredentials)?void 0:r.ecs,m=null==(n=s.defaultRegions)?void 0:n.ecs;!l.credentials&&d&&(c.credentials=d),!l.region&&m&&(c.region=m),(null==(i=l.regions)?void 0:i.length)||(c.regions=m?[m]:[]),Object.keys(t).forEach(e=>{void 0===l[e]&&(c[e]=t[e])}),a&&l.isNew&&void 0===l.interestingHealthProviderNames&&s.attributes.platformHealthOnlyShowOverride&&s.attributes.platformHealthOnly&&(c.interestingHealthProviderNames=["Ecs"]),o(c)}(e,t,a),[])}function mt(e,t){return 1===Number(t)?e:`${e}s`}function pt(e){const t=function(){const[e,t]=De.useState([]);return De.useEffect(()=>{let e=!0;return F.listAccounts("ecs").then(a=>e&&t(a)),()=>{e=!1}},[]),e}(),{application:a,clusterField:r,pipeline:n,showAllRegions:i,singleRegion:s,stage:l,stageFieldUpdated:o}=e;return n.strategy?null:De.createElement(w,{accounts:t,application:a,clusterField:r,component:l,onComponentUpdate:o,showAllRegions:i,singleRegion:s?"true":void 0})}function ut({stage:e,updateStageField:t}){return De.createElement(A,{label:"Target"},De.createElement(T,{model:{target:e.target},options:D.TARGET_LIST,onChange:e=>t({target:e})}))}function gt({application:e,stage:t,updateStageField:a}){return e.attributes.platformHealthOnlyShowOverride?De.createElement(A,{label:"Task Completion"},De.createElement(I,{interestingHealthProviderNames:t.interestingHealthProviderNames||[],onChange:e=>a({interestingHealthProviderNames:e}),platformHealthType:"Ecs"})):null}function ht(e){return dt(e,{target:D.TARGET_LIST[0].val},e.healthOverride),De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e}),De.createElement(ut,{...e}),e.healthOverride&&De.createElement(gt,{...e}))}function vt(e){return De.createElement(ht,{...e})}function yt(e){return De.createElement(ht,{...e,healthOverride:!0})}function ft(e){return De.createElement(ht,{...e,healthOverride:!0})}function Et(e){var t,a,r;const{stage:n,updateStageField:i}=e;return dt(e,{preferLargerOverNewer:"false",remainingEnabledServerGroups:1},!0),De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e}),De.createElement(A,{label:"Disable Options"},De.createElement("div",{className:"form-inline"},"Keep the"," ",De.createElement("input",{className:"form-control input-sm",min:"0",onChange:e=>i({remainingEnabledServerGroups:Number(e.target.value)}),required:!0,style:{width:"50px"},type:"number",value:null!=(t=n.remainingEnabledServerGroups)?t:1})," ",De.createElement("select",{className:"form-control input-sm",onChange:e=>i({preferLargerOverNewer:e.target.value}),style:{width:"100px"},value:null!=(a=n.preferLargerOverNewer)?a:"false"},De.createElement("option",{value:"true"},"largest"),De.createElement("option",{value:"false"},"newest"))," ",mt("server group",null!=(r=n.remainingEnabledServerGroups)?r:1)," enabled.")),De.createElement(gt,{...e}))}function bt(e){const{stage:t,updateStageField:a}=e;return dt(e),De.createElement("div",{className:"form-horizontal"},De.createElement(A,{label:"Full Docker Image path (label or SHA-256)"},De.createElement("input",{className:"form-control input-sm",onChange:e=>a({imageLabelOrSha:e.target.value}),type:"text",value:t.imageLabelOrSha||""})),De.createElement("div",null,De.createElement("h5",null,"Example value: ",De.createElement("i",null,"12345678901.dkr.ecr.us-west-2.amazonaws.com/continuous-delivery:latest"))))}function Ct(e){var t,a,r;const{stage:n,updateStageField:i}=e;return dt(e,{allowScaleDownActive:!1,preferLargerOverNewer:"false",remainingFullSizeServerGroups:1}),De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e}),De.createElement(A,{label:"Scale Down Options"},De.createElement("div",{className:"form-inline"},De.createElement("p",null,"Keep the"," ",De.createElement("input",{className:"form-control input-sm",min:"0",onChange:e=>i({remainingFullSizeServerGroups:Number(e.target.value)}),required:!0,style:{width:"50px"},type:"number",value:null!=(t=n.remainingFullSizeServerGroups)?t:1})," ",De.createElement("select",{className:"form-control input-sm",onChange:e=>i({preferLargerOverNewer:e.target.value}),style:{width:"100px"},value:null!=(a=n.preferLargerOverNewer)?a:"false"},De.createElement("option",{value:"true"},"largest"),De.createElement("option",{value:"false"},"newest"))," ",mt("server group",null!=(r=n.remainingFullSizeServerGroups)?r:1)," at current size."),De.createElement("p",null,"The remaining server groups will be scaled down to zero instances."))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-offset-3 col-md-6 checkbox"},De.createElement("label",null,De.createElement("input",{checked:Boolean(n.allowScaleDownActive),onChange:e=>i({allowScaleDownActive:e.target.checked}),type:"checkbox"})," ","Allow scale down of active server groups"))))}function Nt(e){var t,a,r;const{stage:n,updateStageField:i}=e;return dt(e,{allowDeleteActive:!1,retainLargerOverNewer:"false",shrinkToSize:1},!0),De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e}),De.createElement(A,{label:"Shrink Options"},De.createElement("div",{className:"form-inline"},"Shrink to"," ",De.createElement("input",{className:"form-control input-sm",min:"0",onChange:e=>i({shrinkToSize:Number(e.target.value)}),required:!0,style:{width:"50px"},type:"number",value:null!=(t=n.shrinkToSize)?t:1})," ",mt("server group",null!=(a=n.shrinkToSize)?a:1),", keeping the"," ",De.createElement("select",{className:"form-control input-sm",onChange:e=>i({retainLargerOverNewer:e.target.value}),style:{width:"100px"},value:null!=(r=n.retainLargerOverNewer)?r:"false"},De.createElement("option",{value:"true"},"largest"),De.createElement("option",{value:"false"},"newest")))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-offset-3 col-md-6 checkbox"},De.createElement("label",null,De.createElement("input",{checked:Boolean(n.allowDeleteActive),onChange:e=>i({allowDeleteActive:e.target.checked}),type:"checkbox"})," ","Allow deletion of active server groups"))),De.createElement(gt,{...e}))}function kt(e){const{stage:t,stageFieldUpdated:a,updateStageField:r}=e,n=function(){const[,e]=De.useState(0);return()=>e(e=>e+1)}(),i=t.capacity||{desired:1,max:1,min:1},s=t.suspendedProcesses||[],l=s.includes(lt);dt(e,{capacity:i,suspendedProcesses:s,target:D.TARGET_LIST[0].val,useSourceCapacity:!0},!0);const o=e=>{e?(delete t.capacity,a(),n()):t.capacity||r({capacity:i}),r({useSourceCapacity:e})};return De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e,clusterField:"targetCluster",singleRegion:!0}),De.createElement(ut,{...e}),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"Capacity"),De.createElement("div",{className:"col-md-9 radio"},De.createElement("label",null,De.createElement("input",{checked:!1!==t.useSourceCapacity,id:"useSourceCapacityTrue",onChange:()=>o(!0),type:"radio"})," ","Copy the capacity from the current server group ",De.createElement(G,{id:"serverGroupCapacity.useSourceCapacityTrue"}))),De.createElement("div",{className:"col-md-9 col-md-offset-3 radio"},De.createElement("label",null,De.createElement("input",{checked:!1===t.useSourceCapacity,id:"useSourceCapacityFalse",onChange:()=>o(!1),type:"radio"})," ","Let me specify the capacity ",De.createElement(G,{id:"serverGroupCapacity.useSourceCapacityFalse"})))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-2 col-md-offset-3"},"Min"),De.createElement("div",{className:"col-md-2"},"Max"),De.createElement("div",{className:"col-md-2"},"Desired")),De.createElement("div",{className:"form-group"},["min","max","desired"].map(e=>{var a;return De.createElement("div",{className:"min"===e?"col-md-2 col-md-offset-3":"col-md-2",key:e},De.createElement("input",{className:"form-control input-sm",disabled:!1!==t.useSourceCapacity,max:"min"===e||"desired"===e?i.max:void 0,min:"max"===e?i.min:0,onChange:t=>((e,t)=>{r({capacity:{...i,[e]:t}})})(e,Number(t.target.value)),required:!0,type:"number",value:null!=(a=i[e])?a:1}))})),De.createElement(A,{label:"Traffic"},De.createElement("div",{className:"checkbox"},De.createElement("label",null,De.createElement("input",{checked:!l,onChange:()=>{r({suspendedProcesses:l?s.filter(e=>e!==lt):[...s,lt]})},type:"checkbox"})," Send client requests to new instances"))),De.createElement(gt,{...e}),De.createElement(P,{command:t,labelColumns:"3",fieldColumns:"6",onFieldChange:(t,a)=>function(e,t,a,r){Pe(e.stage,t,a),e.stageFieldUpdated(),r()}(e,t,a,n),onStrategyChange:e=>r({strategy:e.strategy})}))}function St(e){var t,a,r,n;const{stage:i,updateStageField:s}=e,l=i.capacity||{};dt(e,{action:ot[0].val,capacity:l,resizeType:ct[0].val,target:D.TARGET_LIST[0].val,targetHealthyDeployPercentage:100},!0);const o=(e,t=i.resizeType||ct[0].val)=>{if("scale_exact"===e)return delete i.scaleNum,delete i.scalePct,void s({action:e,resizeType:"exact"});const a="pct"===t?"pct":"incr",r={action:e,capacity:{},resizeType:a};"pct"===a?delete i.scaleNum:(delete i.scalePct,r.scaleNum=i.scaleNum||0),s(r)};return De.createElement("div",{className:"form-horizontal"},De.createElement(pt,{...e}),De.createElement(ut,{...e}),De.createElement(A,{label:"Action",helpKey:"pipeline.config.resizeAsg.action"},De.createElement("select",{className:"form-control input-sm",onChange:e=>o(e.target.value),required:!0,value:null!=(t=i.action)?t:ot[0].val},ot.map(e=>De.createElement("option",{key:e.val,value:e.val},e.label)))),"scale_exact"!==i.action&&De.createElement(De.Fragment,null,De.createElement(A,{label:"scale_to_cluster"===i.action?"Additional Capacity":"Type"},De.createElement("select",{className:"form-control input-sm",onChange:e=>{var t;return o(null!=(t=i.action)?t:ot[0].val,e.target.value)},required:!0,value:"exact"===i.resizeType?ct[0].val:null!=(a=i.resizeType)?a:ct[0].val},ct.map(e=>De.createElement("option",{key:e.val,value:e.val},e.label)))),"pct"===i.resizeType&&De.createElement(A,{label:"Resize Percentage"},De.createElement("input",{className:"form-control input-sm",min:"0",onChange:e=>s({scalePct:Number(e.target.value)}),style:{width:"80px"},type:"number",value:null!=(r=i.scalePct)?r:0}),De.createElement("div",null,De.createElement("em",{className:"subinput-note"},"This is the percentage by which the target server group's capacity will be increased"))),"pct"!==i.resizeType&&De.createElement(A,{label:"Resize-by Amount"},De.createElement("input",{className:"form-control input-sm",min:"0",onChange:e=>s({scaleNum:Number(e.target.value)}),style:{width:"80px"},type:"number",value:null!=(n=i.scaleNum)?n:0}),De.createElement("div",null,De.createElement("em",{className:"subinput-note"},"This is the exact amount by which the target server group's capacity will be increased")))),"scale_exact"===i.action&&De.createElement(De.Fragment,null,De.createElement(A,{label:"Capacity"},De.createElement("div",{className:"row"},De.createElement("div",{className:"col-md-3"},"Min"),De.createElement("div",{className:"col-md-3"},"Max"),De.createElement("div",{className:"col-md-3"},"Desired"))),De.createElement(A,{label:"Match Capacity"},De.createElement("div",{className:"row"},["min","max","desired"].map(e=>{var t;return De.createElement("div",{className:"col-md-3",key:e},De.createElement("input",{className:"form-control input-sm",onChange:t=>((e,t)=>{s({capacity:{...l,[e]:t}})})(e,Number(t.target.value)),type:"number",value:null!=(t=l[e])?t:0}))}))),De.createElement(A,{label:""},De.createElement("em",{className:"subinput-note"},"This is the exact amount to which the target server group will be scaled"))),De.createElement(gt,{...e}))}function Dt(e){var t;const{stage:a}=e;return De.createElement(x,{name:e.name,current:e.current},De.createElement("div",{className:"row"},De.createElement("div",{className:"col-md-12"},De.createElement("dl",{className:"dl-narrow dl-horizontal"},De.createElement("dt",null,"Provider"),De.createElement("dd",null,"ECS")))),De.createElement(R,{stage:a,message:a.failureMessage}),(null==(t=a.context)?void 0:t.amiDetails)&&De.createElement("div",{className:"row"},De.createElement("div",{className:"col-md-12"},De.createElement("div",{className:"well alert alert-info"},De.createElement("h4",null,"Results"),a.context.amiDetails.map((e,t)=>De.createElement("dl",{key:t,className:"dl-narrow dl-horizontal"},De.createElement("dt",null,"Region"),De.createElement("dd",null,e.region),De.createElement("dt",null,"Image ID"),De.createElement("dd",null,e.imageId),De.createElement("dt",null,"Unique ID"),De.createElement("dd",null,e.imageName)))))))}Dt.title="findImageConfig";class Gt extends De.Component{constructor(){super(...arguments),this.state={loading:!0},this.isUnmounted=!1,this.loadRequestId=0,this.showNotFound=()=>{if(!this.isUnmounted){if(!this.props.autoClose)return this.props.app.isStandalone?(d.removeLastItem("securityGroups"),void this.setState({loading:!1,notFound:!0,securityGroup:void 0})):void this.props.stateService.go("^",{allowModalToStayOpen:!0},{location:"replace"});this.props.autoClose()}},this.loadSecurityGroup=()=>{const{app:e,resolvedSecurityGroup:t}=this.props,a=++this.loadRequestId;this.setState({loading:!0,notFound:!1,securityGroup:void 0}),this.getSecurityGroupReader().getSecurityGroupDetails(e,t.accountId,"ecs",t.region,t.vpcId||"",t.name).then(r=>{this.isUnmounted||a!==this.loadRequestId||(r&&!we(r)?Promise.resolve(this.getVpcReader().getVpcName(r.vpcId)).then(n=>{var i,s;if(this.isUnmounted||a!==this.loadRequestId)return;const l=null==(s=(i=this.getSecurityGroupReader()).getApplicationSecurityGroup)?void 0:s.call(i,e,t.accountId,t.region,t.name);this.setState({loading:!1,securityGroup:{...l||{},...r,accountId:r.accountId||t.accountId,name:r.name||t.name,region:r.region||t.region,vpcId:r.vpcId||t.vpcId,vpcName:n}})},()=>{this.isUnmounted||a!==this.loadRequestId||this.showNotFound()}):this.showNotFound())}).catch(()=>{this.isUnmounted||a!==this.loadRequestId||this.showNotFound()})},this.closeDetails=()=>{this.props.stateService.go("^")}}componentDidMount(){var e,t;const a=null==(t=(e=this.props.app).getDataSource)?void 0:t.call(e,"securityGroups");a?a.ready().then(()=>{this.isUnmounted||(this.loadSecurityGroup(),this.unsubscribeFromRefresh=a.onRefresh(this.loadSecurityGroup))}):this.loadSecurityGroup()}componentDidUpdate(e){this.getCoordinatesKey(e)!==this.getCoordinatesKey(this.props)&&this.loadSecurityGroup()}componentWillUnmount(){var e;this.isUnmounted=!0,null==(e=this.unsubscribeFromRefresh)||e.call(this)}getCoordinatesKey(e){const{accountId:t,name:a,region:r,vpcId:n}=e.resolvedSecurityGroup;return[t,r,n||"",a].join(":")}getSecurityGroupReader(){return this.props.securityGroupReader||this.context.services.securityGroupReader}getVpcReader(){return this.props.vpcReader||r}render(){const{app:e,resolvedSecurityGroup:t}=this.props,{loading:a,notFound:r,securityGroup:l}=this.state;if(r)return De.createElement("div",{className:"text-center"},De.createElement("h3",null,"Could not find ",z.get("firewall")," ",t.name,"."),De.createElement(Be,{to:"home.infrastructure"},De.createElement("a",null,"Back to search results")));const o=l?n(l):[],c=l?i(l):[];return De.createElement("div",{className:"details-panel"},De.createElement("div",{className:"header"},!e.isStandalone&&De.createElement("div",{className:"close-button"},De.createElement("a",{className:"btn btn-link",onClick:this.closeDetails},De.createElement("span",{className:"glyphicon glyphicon-remove"}))),a&&De.createElement("div",{className:"horizontal center middle"},De.createElement(C,{size:"small"})),!a&&l&&De.createElement("div",{className:"header-text horizontal middle"},De.createElement(L,{provider:"ecs",height:"36px",width:"36px"}),De.createElement("h3",null,l.name||"(not found)"))),!a&&l&&De.createElement("div",{className:"content"},De.createElement(p,{heading:`${z.get("Firewall")} Details`,defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-medium"},De.createElement("dt",null,"ID"),De.createElement("dd",null,l.id),De.createElement("dt",null,"Account"),De.createElement("dd",null,De.createElement(k,{account:l.accountName||l.accountId})),De.createElement("dt",null,"Region"),De.createElement("dd",null,l.region),De.createElement("dt",null,"VPC"),De.createElement("dd",null,l.vpcName||l.vpcId),De.createElement("dt",null,"Description"),De.createElement("dd",null,l.description))),De.createElement(s,{ipRules:o}),!o.length&&De.createElement("div",{"data-test-id":"ecs-ip-rules-empty"},"None"),De.createElement(p,{heading:`${z.get("Firewall")} Rules (${c.length})`,defaultExpanded:c.length>0},!c.length&&De.createElement("div",{"data-test-id":"ecs-security-group-rules-empty"},"None"),c.map(e=>De.createElement("dl",{className:"dl-horizontal dl-medium",key:e.securityGroup.id||e.securityGroup.name},De.createElement("dt",null,z.get("Firewall")),De.createElement("dd",null,De.createElement(Be,{to:"^.firewallDetails",params:{accountId:e.securityGroup.accountName||e.securityGroup.accountId,name:e.securityGroup.name,provider:"ecs",region:e.securityGroup.region,vpcId:e.securityGroup.vpcId}},De.createElement("a",null,e.securityGroup.accountName!==l.accountName&&De.createElement(k,{account:e.securityGroup.accountName||e.securityGroup.accountId})," ",e.securityGroup.name," (",e.securityGroup.id,")"))),De.createElement("dt",null,"Port Ranges"),e.rules.map(e=>De.createElement("dd",{key:`${e.protocol}-${e.startPort}-${e.endPort}`},e.protocol,": ",e.startPort," → ",e.endPort)))))))}}Gt.contextType=O;const At=y(Gt);class Pt{resolveIndexedSecurityGroup(e,t,a){return e[t.account][t.region][a]}}class wt{normalizeSecurityGroup(e){return Promise.resolve(e)}}class Tt{configureUpdateCommand(e){e.backingData={filtered:{},launchTypes:["EC2","FARGATE"],networkModes:["bridge","host","awsvpc","none","default"]}}}function It(e,t,a={}){if(a[e.refId])return[];a[e.refId]=!0;let r=[];return"findImageFromTags"===e.type&&r.push({fromContext:!0,imageLabelOrSha:e.imageLabelOrSha,stageId:e.refId}),e.requisiteStageRefIds.forEach(e=>{const n=t.find(t=>t.refId===e);n&&(r=r.concat(It(n,t,a)))}),r}function Ft(e){return e.filter(e=>"docker"===e.type).map(e=>({fromTrigger:!0,repository:e.repository,account:e.account,organization:e.organization,registry:e.registry,tag:e.tag}))}function Mt(e,t){const a=(t=t||{}).account||e.defaultCredentials.ecs,r=t.region||e.defaultRegions.ecs;return Promise.all([F.getAvailabilityZonesForAccountAndRegion("ecs",a,r),F.getCredentialsKeyedByAccount("ecs")]).then(([n])=>{var i;const s={application:e.name,credentials:a,region:r,strategy:"",capacity:{min:1,max:1,desired:1},launchType:"EC2",healthCheckType:"EC2",selectedProvider:"ecs",iamRole:"None (No IAM role)",dockerImageCredentialsSecret:"None (No registry credentials)",availabilityZones:n,subnetType:"",securityGroupNames:[],healthCheckGracePeriodSeconds:"",placementConstraints:[],placementStrategyName:"",taskDefinitionArtifact:{},useTaskDefinitionArtifact:!1,placementStrategySequence:[],serviceDiscoveryAssociations:[],ecsClusterName:"",targetGroup:"",copySourceScalingPoliciesAndActions:!0,preferSourceCapacity:!0,useSourceCapacity:!0,enableDeploymentCircuitBreaker:!1,viewState:{useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!0,mode:t.mode||"create",disableStrategySelection:!0,dirty:{}}};return(null==(i=e.attributes)?void 0:i.platformHealthOnlyShowOverride)&&e.attributes.platformHealthOnly&&(s.interestingHealthProviderNames=["ecs"]),s})}class xt{constructor(){this.configurationService=new Tt}buildNewServerGroupCommand(e,t){return Mt(e,t)}buildServerGroupCommandFromExisting(e,t,a){return function(e,t,a="clone"){return Mt(e,{account:t.account,region:t.region}).then(e=>(e.credentials=t.account,e.app=t.moniker.app,e.stack=t.moniker.stack,e.region=t.region,e.ecsClusterName=t.ecsCluster,e.capacity=t.capacity,e.viewState.mode=a,e))}(e,t,a)}buildNewServerGroupCommandForPipeline(e,t){return function(e,t){let a=It(e,t.stages)||[];return a=a.concat(Ft(t.triggers)),Promise.resolve({viewState:{requiresTemplateSelection:!0,overrides:{viewState:{mode:"editPipeline",contextImages:a,pipeline:t,currentStage:e}}}})}(e,t)}buildServerGroupCommandFromPipeline(e,t,a,r){return function(e,t,a,r){var n;const i=Ge.cloneDeep(t),s=i.availabilityZones||{},l=Object.keys(s)[0]||i.region||(null==(n=e.defaultRegions)?void 0:n.ecs);return Mt(e,{account:i.account,region:l}).then(e=>{var t;const n=s[l]||e.availabilityZones||[],o=n.join(",")===(e.availabilityZones||[]).join(",");let c=It(a,r.stages)||[];c=c.concat(Ft(r.triggers)),(null==(t=e.docker)?void 0:t.image)&&(e.docker.image=function(e,t){if(e.fromContext){const a=t.find(t=>e.stageId===t.stageId);return a?(e.cluster=a.cluster,e.pattern=a.pattern,e.repository=a.repository,e):null}return e.fromTrigger?t.find(t=>e.registry===t.registry&&e.repository===t.repository&&e.tag===t.tag)?e:null:e}(e.docker.image,c));const d={instanceProfile:void 0,disableImageSelection:!0,useSimpleCapacity:!!i.capacity&&i.capacity.min===i.capacity.max&&!0!==i.useSourceCapacity,usePreferredZones:o,mode:"editPipeline",submitButtonLabel:"Done",templatingEnabled:!0,existingPipelineCluster:!0,dirty:{},contextImages:c,pipeline:r,currentStage:a};return i.strategy=i.strategy||"",Object.assign({},e,i,{region:l,credentials:i.account,availabilityZones:n,viewState:d})})}(e,t,a,r)}buildUpdateServerGroupCommand(e){return function(e,t){var a;const r={type:"modifyAsg",asgs:[{asgName:e.name,region:e.region}],healthCheckType:null==(a=e.asg)?void 0:a.healthCheckType,credentials:e.account};return t.configureUpdateCommand(r),r}(e,this.configurationService)}}function Rt(e){return e.imageId?e.imageId:e.fromContext?e.imageLabelOrSha:e.fromTrigger&&!e.tag?`${e.registry}/${e.repository} (Tag resolved at runtime)`:e.registry&&e.repository&&e.tag?`${e.registry}/${e.repository}:${e.tag}`:e.reference||e.repository||""}function Bt(e){return{...e,imageId:Rt(e),message:e.message||"",fromTrigger:!!e.fromTrigger,fromContext:!!e.fromContext,stageId:e.stageId||"",imageLabelOrSha:e.imageLabelOrSha||""}}class zt{listClusters(){return q("/ecs/ecsClusters").get()}describeClusters(e,t){return null!=e&&null!=t?q("/ecs/ecsClusterDescriptions").path(e).path(t).get():Promise.resolve([])}}class Lt{listRoles(e){return q("/roles").path(e).get()}}class Ot{listMetricAlarms(){return q("/ecs/cloudMetrics/alarms").get()}}const qt=["AZ Balanced Spread","AZ Balanced BinPack CPU","AZ Balanced BinPack Memory","BinPack CPU","BinPack Memory","One Task Per Host","None"],Ut=({command:e,onFieldChange:t})=>{var a;const r=e.placementConstraints||[],n=Array.from(new Set([...e.backingData.filtered.iamRoles||[],e.iamRole])).filter(Boolean),i=Array.from(new Set([...e.backingData.filtered.secrets||[],e.dockerImageCredentialsSecret])).filter(Boolean),s=(e,a,n)=>{const i=r.map((t,r)=>r===e?{...t,[a]:n}:t);t("placementConstraints",i)};return De.createElement("div",{className:"container-fluid form-horizontal","data-test-id":"EcsServerGroupWizard.advancedSettings"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},"Health Check Grace Period ",De.createElement(G,{id:"ecs.healthgraceperiod"})),De.createElement("div",{className:"col-md-2"},De.createElement("input",{"aria-label":"Health check grace period",className:"form-control input-sm no-spel","data-test-id":"Advanced.healthCheckGracePeriodSeconds",onChange:e=>t("healthCheckGracePeriodSeconds",""===e.target.value?"":Number(e.target.value)),type:"number",value:null!=(a=e.healthCheckGracePeriodSeconds)?a:""}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},De.createElement("b",null,"ECS IAM Instance Profile")," ",De.createElement(G,{id:"ecs.iamrole"})),De.createElement("div",{className:"col-md-7"},n.length?De.createElement("select",{"aria-label":"ECS IAM instance profile",className:"form-control input-sm","data-test-id":"Advanced.iamRole",onChange:e=>t("iamRole",e.target.value),value:e.iamRole||""},n.map(e=>De.createElement("option",{key:e,value:e},e))):"No account was selected, or no IAM roles are available for ECS tasks in this account.")),!e.useTaskDefinitionArtifact&&De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},De.createElement("b",null,"Docker Image Credentials")," ",De.createElement(G,{id:"ecs.dockerimagecredentials"})),De.createElement("div",{className:"col-md-7"},i.length?De.createElement("select",{"aria-label":"Docker image credentials",className:"form-control input-sm","data-test-id":"Advanced.dockerImageCredentialsSecret",onChange:e=>t("dockerImageCredentialsSecret",e.target.value),value:e.dockerImageCredentialsSecret||""},i.map(e=>De.createElement("option",{key:e,value:e},e))):"No account or region was selected, or no AWS Secrets Manager secrets are available in this account and region.")),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},"Fargate platform version ",De.createElement(G,{id:"ecs.platformVersion"})),De.createElement("div",{className:"col-md-3"},De.createElement("input",{"aria-label":"Fargate platform version",className:"form-control input-sm","data-test-id":"Advanced.platformVersion",onChange:e=>t("platformVersion",e.target.value),type:"text",value:e.platformVersion||""}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},"Enable Deployment Circuit Breaker ",De.createElement(G,{id:"ecs.enableDeploymentCircuitBreaker"})),De.createElement("div",{className:"col-md-3"},De.createElement("input",{"aria-label":"Enable deployment circuit breaker",checked:!!e.enableDeploymentCircuitBreaker,"data-test-id":"Advanced.enableDeploymentCircuitBreaker",onChange:e=>t("enableDeploymentCircuitBreaker",e.target.checked),type:"checkbox"}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},De.createElement("b",null,"Placement Strategy")," ",De.createElement(G,{id:"ecs.placementStrategy"})),De.createElement("div",{className:"col-md-7"},De.createElement("select",{"aria-label":"Placement strategy",className:"form-control input-sm","data-test-id":"Advanced.placementStrategyName",onChange:e=>t("placementStrategyName",e.target.value),value:e.placementStrategyName||""},De.createElement("option",{value:""},"Select..."),qt.map(e=>De.createElement("option",{key:e,value:e},e))))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Placement Constraints")," ",De.createElement(G,{id:"ecs.placementConstraints"})),De.createElement("table",{className:"table table-condensed packed tags"},De.createElement("thead",null,De.createElement("tr",null,De.createElement("th",{style:{width:"25%"}},"Type"),De.createElement("th",{style:{width:"68%"}},"Expression"),De.createElement("th",null))),De.createElement("tbody",null,r.map((e,a)=>De.createElement("tr",{key:a},De.createElement("td",null,De.createElement("select",{"aria-label":`Placement constraint type ${a+1}`,className:"form-control input-sm","data-test-id":`Advanced.placementConstraint.type.${a}`,onChange:e=>s(a,"type",e.target.value),value:e.type||""},De.createElement("option",{value:""},"Select..."),De.createElement("option",{value:"distinctInstance"},"distinctInstance"),De.createElement("option",{value:"memberOf"},"memberOf"))),De.createElement("td",null,De.createElement("input",{"aria-label":`Placement constraint expression ${a+1}`,className:"form-control input-sm no-spel","data-test-id":`Advanced.placementConstraint.expression.${a}`,onChange:e=>s(a,"expression",e.target.value),type:"text",value:e.expression||""})),De.createElement("td",null,De.createElement("button",{"aria-label":`Remove placement constraint ${a+1}`,className:"btn btn-link sm-label",onClick:()=>t("placementConstraints",r.filter((e,t)=>t!==a)),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-trash"})," ",De.createElement("span",{className:"sr-only"},"Remove")))))),De.createElement("tfoot",null,De.createElement("tr",null,De.createElement("td",{colSpan:3},De.createElement("button",{className:"btn btn-block btn-sm add-new",onClick:()=>t("placementConstraints",[...r,{}]),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-plus-sign"})," Add New Placement Constraint")))))),!e.useTaskDefinitionArtifact&&De.createElement(De.Fragment,null,De.createElement("div",{className:"form-group","data-test-id":"Advanced.dockerLabels"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Docker labels (optional)")," ",De.createElement(G,{id:"ecs.dockerLabels"})),De.createElement(U,{allowEmpty:!0,keyLabel:"Docker label name",model:e.dockerLabels||{},onChange:e=>t("dockerLabels",e),valueLabel:"Docker label value"})),De.createElement("div",{className:"form-group","data-test-id":"Advanced.environmentVariables"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Environment Variables (optional)")," ",De.createElement(G,{id:"ecs.environmentVariables"})),De.createElement(U,{allowEmpty:!0,keyLabel:"Environment variable name",model:e.environmentVariables||{},onChange:e=>t("environmentVariables",e),valueLabel:"Environment variable value"}))),De.createElement("div",{className:"form-group","data-test-id":"Advanced.tags"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Tags (optional)")," ",De.createElement(G,{id:"ecs.tags"})),De.createElement(U,{allowEmpty:!0,keyLabel:"Tag name",model:e.tags||{},onChange:e=>t("tags",e),valueLabel:"Tag value"})),e.useTaskDefinitionArtifact&&De.createElement("div",{style:{color:"#666"}},De.createElement("hr",null),De.createElement("p",null,De.createElement("em",null,De.createElement("strong",null,"Docker Image Credentials, Docker labels"),", and ",De.createElement("strong",null,"Environment Variables")," ","cannot be individually set when using a Task Definition artifact. Please include them in their respective container definition in that file."))))},$t=e=>{var t,a;return null!=(a=null==(t=null==e?void 0:e.target)?void 0:t.value)?a:e},Ht=({application:e,command:t,onFieldChange:a})=>{var r,n;const i=t.backingData.accounts||Object.keys(t.backingData.credentialsKeyedByAccount||{}),s=t.backingData.filtered.regions||[],l=t.backingData.filtered.ecsClusters||[];return De.createElement("div",{className:"container-fluid form-horizontal","data-test-id":"EcsServerGroupWizard.basicSettings"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"Account"),De.createElement("div",{className:"col-md-7"},De.createElement($,{"aria-label":"Account",accounts:i,onChange:e=>a("credentials",$t(e)),provider:"ecs",readOnly:null==(r=t.viewState.readOnlyFields)?void 0:r.credentials,value:t.credentials||""}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"Region"),De.createElement("div",{className:"col-md-7"},De.createElement(H,{"aria-label":"Region",account:t.credentials,onChange:e=>a("region",$t(e)),readOnly:null==(n=t.viewState.readOnlyFields)?void 0:n.region,regions:s,value:t.region||""}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"ECS Cluster name"),De.createElement("div",{className:"col-md-7"},De.createElement("select",{"aria-label":"ECS Cluster name",className:"form-control input-sm","data-test-id":"ServerGroup.clusterName",onChange:e=>a("ecsClusterName",e.target.value),required:!0,value:t.ecsClusterName||""},De.createElement("option",{value:""},"Select..."),l.map(e=>De.createElement("option",{key:e,value:e},e))))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"Stack"),De.createElement("div",{className:"col-md-7"},De.createElement("input",{"aria-label":"Stack",className:"form-control input-sm no-spel","data-test-id":"ServerGroup.stack",onChange:e=>a("stack",e.target.value),value:t.stack||""}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},"Detail"),De.createElement("div",{className:"col-md-7"},De.createElement("input",{"aria-label":"Detail",className:"form-control input-sm no-spel","data-test-id":"ServerGroup.details",onChange:e=>a("freeFormDetails",e.target.value),value:t.freeFormDetails||""}))),!t.viewState.disableStrategySelection&&t.selectedProvider&&De.createElement(P,{command:t,onFieldChange:a,onStrategyChange:(e,t)=>a("strategy",t.key)}),!t.viewState.hideClusterNamePreview&&De.createElement("div",{className:"well-compact well text-center"},"Your server group will be in the cluster:"," ",De.createElement("strong",null,V.getClusterName(e.name,t.stack,t.freeFormDetails))))};class Vt extends Se.Component{constructor(e){var t,a,r,n;super(e),this.getIdToImageMap=()=>{const e=new Map;return this.props.command.backingData.filtered.images.forEach(t=>{e.set(t.imageId,t)}),e},this.getEmptyImageDescription=()=>({imageId:"",message:"",fromTrigger:!1,fromContext:!1,stageId:"",imageLabelOrSha:"",account:"",registry:"",repository:"",tag:""}),this.updateDockerRegistryAccount=e=>{const t=e.value;this.props.command.backingData.filtered.images=[],this.setState({selectedDockerAccount:t,dockerImages:[]}),Ue.findImages({provider:"dockerRegistry",account:t,count:50}).then(e=>{const t=e.map(e=>Bt(e));this.props.command.backingData.filtered.images=t,this.setState({dockerImages:t})})},this.pushTargetGroupMapping=()=>{const e=this.state.targetGroupMappings;e.push({containerName:"",targetGroup:"",containerPort:80}),this.setState({targetGroupMappings:e})},this.updateContainerMappingImage=e=>{let t=this.getIdToImageMap().get(e.value);t||(t=this.getEmptyImageDescription()),this.props.onFieldChange("imageDescription",t),this.setState({imageDescription:t})},this.updateComputeUnits=e=>{this.props.onFieldChange("computeUnits",e),this.setState({computeUnits:e})},this.updateReservedMemory=e=>{this.props.onFieldChange("reservedMemory",e),this.setState({reservedMemory:e})},this.updateTargetGroupMappingTargetGroup=(e,t)=>{const a=this.state.targetGroupMappings;a[e].targetGroup=t.value,this.props.onFieldChange("targetGroupMappings",a),this.setState({targetGroupMappings:a}),this.updateDirtyTargetGroups()},this.updateTargetGroupMappingPort=(e,t)=>{const a=this.state.targetGroupMappings;a[e].containerPort=t,this.props.onFieldChange("targetGroupMappings",a),this.setState({targetGroupMappings:a})},this.removeTargetGroupMapping=e=>{const t=this.state.targetGroupMappings;t.splice(e,1),this.props.onFieldChange("targetGroupMappings",t),this.setState({targetGroupMappings:t})},this.updateDirtyTargetGroups=()=>{this.props.command.viewState.dirty.targetGroups=[]};const i=this.props.command;let s="";i.containerMappings&&i.containerMappings.length>0&&(s=i.containerMappings[0].containerName);let l=[];i.targetGroupMappings&&i.targetGroupMappings.length>0&&(l=i.targetGroupMappings),i.targetGroup&&i.targetGroup.length>0&&(l.push({containerName:i.loadBalancedContainer||s,targetGroup:i.targetGroup,containerPort:i.containerPort}),i.targetGroup="",i.loadBalancedContainer=""),i.targetGroupMappings=Te(l,Ae),i.containerMappings=null,this.state={imageDescription:i.imageDescription?i.imageDescription:this.getEmptyImageDescription(),computeUnits:i.computeUnits,reservedMemory:i.reservedMemory,dockerImages:i.backingData&&i.backingData.filtered?i.backingData.filtered.images:[],dockerRegistryAccounts:[],selectedDockerAccount:null!=(a=null==(t=i.imageDescription)?void 0:t.account)?a:"",targetGroupMappings:i.targetGroupMappings,targetGroupsAvailable:Ie([...(null==(n=null==(r=i.backingData)?void 0:r.filtered)?void 0:n.targetGroups)||[],...i.targetGroupMappings.map(e=>e.targetGroup).filter(Boolean)])},this.state.targetGroupMappings.forEach(e=>{e.containerName=""})}componentDidMount(){F.listAccounts("dockerRegistry").then(e=>{this.setState({dockerRegistryAccounts:e})}),this.props.configureCommand("1").then(()=>{this.setState({dockerImages:this.props.command.backingData.filtered.images,targetGroupsAvailable:Ie([...this.props.command.backingData.filtered.targetGroups||[],...this.state.targetGroupMappings.map(e=>e.targetGroup).filter(Boolean)])})})}componentDidUpdate(){var e,t,a,r;const n=this.props.command,i=n.targetGroupMappings||[],s={imageDescription:n.imageDescription||this.getEmptyImageDescription(),computeUnits:n.computeUnits,reservedMemory:n.reservedMemory,dockerImages:(null==(t=null==(e=n.backingData)?void 0:e.filtered)?void 0:t.images)||[],dockerRegistryAccounts:this.state.dockerRegistryAccounts,selectedDockerAccount:this.state.selectedDockerAccount,targetGroupMappings:i,targetGroupsAvailable:Ie([...(null==(r=null==(a=n.backingData)?void 0:a.filtered)?void 0:r.targetGroups)||[],...i.map(e=>e.targetGroup).filter(Boolean)])};Ae(this.state,s)||this.setState(s)}render(){const e=this.removeTargetGroupMapping,t=this.updateContainerMappingImage,a=this.updateTargetGroupMappingTargetGroup,r=this.updateTargetGroupMappingPort,n=this.updateComputeUnits,i=this.updateReservedMemory,s=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.targetGroups?this.props.command.viewState.dirty.targetGroups:[],l=this.state.dockerRegistryAccounts.map(e=>({label:e.name,value:e.name})),o=this.state.dockerImages.map(function(e){let t="";return(e.fromTrigger||e.fromContext)&&(t=e.fromTrigger?"(TRIGGER) ":"(FIND IMAGE RESULT) "),{label:`${t} (${e.imageId})`,value:e.imageId}}),c=s?s.map(function(e,t){return Se.createElement("li",{key:t},e)}):"",d=Se.createElement("div",{className:"alert alert-warning"},Se.createElement("p",null,Se.createElement("i",{className:"fa fa-exclamation-triangle"}),"The following target groups could not be found in the selected account/region/VPC and were removed:"),Se.createElement("ul",null,c),Se.createElement("br",null),Se.createElement("p",{className:"text-left"},"Please select the target group(s) from the dropdown to resolve this error.")),m=this.state.targetGroupsAvailable.length?Se.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"ContainerInputs.targetGroupAdd",onClick:this.pushTargetGroupMapping,type:"button"},Se.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Target Group Mapping"):Se.createElement("div",{className:"sm-label-left"},Se.createElement(ze,{color:"warning"},"No target groups found in the selected account/region/VPC")),p=this.state.targetGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),u=this.state.targetGroupMappings.map(function(t,n){return Se.createElement("tr",{key:n},Se.createElement("td",{"data-test-id":"ContainerInputs.targetGroup"},Se.createElement(_,{inputProps:{"aria-label":`Target group ${n+1}`},placeholder:"Select a target group to use...",options:p,value:t.targetGroup.toString(),onChange:e=>a(n,e),clearable:!1})),Se.createElement("td",null,Se.createElement("input",{"aria-label":`Target port ${n+1}`,"data-test-id":"ContainerInputs.targetGroupPort",type:"number",className:"form-control input-sm no-spel",required:!0,value:t.containerPort.toString(),onChange:e=>r(n,e.target.valueAsNumber)})),Se.createElement("td",null,Se.createElement("div",{className:"form-control-static"},Se.createElement("button",{"aria-label":`Remove target group mapping ${n+1}`,className:"btn-link sm-label","data-test-id":"ContainerInputs.targetGroupRemove",onClick:()=>e(n),type:"button"},Se.createElement("span",{className:"glyphicon glyphicon-trash"}),Se.createElement("span",{className:"sr-only"},"Remove")))))});return Se.createElement("div",{className:"container-fluid form-horizontal"},s.length>0?Se.createElement("div",null,d):"",Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Docker Registry Account")),Se.createElement("div",{className:"col-md-9","data-test-id":"ContainerInputs.dockerRegistryAccount"},Se.createElement(_,{placeholder:"Select a Docker registry account...",options:l,value:this.state.selectedDockerAccount,onChange:e=>this.updateDockerRegistryAccount(e),clearable:!1}))),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Container Image"),Se.createElement(G,{id:"ecs.containerMappingImage"})),Se.createElement("div",{className:"col-md-9","data-test-id":"ContainerInputs.containerImage"},Se.createElement(_,{inputProps:{"aria-label":"Container image"},placeholder:"Select an image to use...",options:o,value:this.state.imageDescription.imageId,onChange:e=>{t(e)},clearable:!1}))),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Compute Units"),Se.createElement(G,{id:"ecs.capacity.reserved.computeUnits"})),Se.createElement("div",{className:"col-md-9",style:{width:"100px"}},Se.createElement("input",{"aria-label":"Compute units","data-test-id":"ContainerInputs.computeUnits",type:"number",className:"form-control input-sm no-spel",required:!1,value:this.state.computeUnits,onChange:e=>n(e.target.valueAsNumber)}))),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Reserved Memory"),Se.createElement(G,{id:"ecs.capacity.reserved.memory"})),Se.createElement("div",{className:"col-md-9",style:{width:"100px"}},Se.createElement("input",{"aria-label":"Reserved memory","data-test-id":"ContainerInputs.reservedMemory",type:"number",className:"form-control input-sm no-spel",required:!1,value:this.state.reservedMemory,onChange:e=>i(e.target.valueAsNumber)}))),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"sm-label-left"},Se.createElement("b",null,"Target Group Mappings"),Se.createElement(G,{id:"ecs.targetGroupMappings"})),Se.createElement("form",{name:"ecsContainerTargetGroupMappings"},Se.createElement("table",{className:"table table-condensed packed tags"},Se.createElement("thead",null,Se.createElement("tr",{key:"header"},Se.createElement("th",{style:{width:"80%"}},"Target group",Se.createElement(G,{id:"ecs.loadBalancer.targetGroup"})),Se.createElement("th",{style:{width:"20%"}},"Target port",Se.createElement(G,{id:"ecs.loadbalancing.targetPort"})),Se.createElement("th",null))),Se.createElement("tbody",null,u),Se.createElement("tfoot",null,Se.createElement("tr",null,Se.createElement("td",{colSpan:4},m)))))))}}const _t=({command:e,configureCommand:t,onFieldChange:a})=>De.createElement("div",{"data-test-id":"EcsServerGroupWizard.container"},De.createElement(Vt,{command:e,configureCommand:t,onFieldChange:a}));class Wt extends De.Component{constructor(e){super(e),this.getAvailableCapacityProviders=e=>{var t,a;const r=(null==(a=null==(t=e.backingData)?void 0:t.filtered)?void 0:a.availableCapacityProviders)||[],n=(e.capacityProviderStrategy||[]).map(e=>e.capacityProvider);return Array.from(new Set([...r,...n])).filter(Boolean)},this.getDefaultCapacityProviderStrategy=e=>e.backingData&&e.backingData.filtered&&e.backingData.filtered.defaultCapacityProviderStrategy?e.backingData.filtered.defaultCapacityProviderStrategy:[],this.getCapacityProviderStrategy=(e,t)=>e&&t.backingData&&t.backingData.filtered&&t.backingData.filtered.defaultCapacityProviderStrategy?t.backingData.filtered.defaultCapacityProviderStrategy:this.state.capacityProviderStrategy,this.addCapacityProviderStrategy=()=>{const e=this.state.capacityProviderStrategy;e.push({capacityProvider:"",base:null,weight:null}),this.props.onFieldChange("capacityProviderStrategy",e),this.setState({capacityProviderStrategy:e})},this.removeCapacityProviderStrategy=e=>{const t=this.state.capacityProviderStrategy;t.splice(e,1),this.props.onFieldChange("capacityProviderStrategy",t),this.setState({capacityProviderStrategy:t})},this.updateCapacityProviderName=(e,t)=>{const a=this.state.capacityProviderStrategy;a[e].capacityProvider=t,this.props.onFieldChange("capacityProviderStrategy",a),this.setState({capacityProviderStrategy:a}),this.props.command.viewState.dirty.customCapacityProviders=[]},this.updateCapacityProviderBase=(e,t)=>{const a=this.state.capacityProviderStrategy;a[e].base=t,this.props.onFieldChange("capacityProviderStrategy",a),this.setState({capacityProviderStrategy:a})},this.updateCapacityProviderWeight=(e,t)=>{const a=this.state.capacityProviderStrategy;a[e].weight=t,this.props.onFieldChange("capacityProviderStrategy",a),this.setState({capacityProviderStrategy:a})},this.updateCapacityProviderType=e=>{this.setState({useDefaultCapacityProviders:e}),this.props.onFieldChange("useDefaultCapacityProviders",e),this.props.command.viewState.dirty.customCapacityProviders=[];const t=e&&this.state.defaultCapacityProviderStrategy.length>0?this.state.defaultCapacityProviderStrategy:[];this.setState({capacityProviderStrategy:t}),this.props.onFieldChange("capacityProviderStrategy",t)};const t=this.props.command;this.state={availableCapacityProviders:this.getAvailableCapacityProviders(t),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(t),ecsClusterName:t.ecsClusterName,useDefaultCapacityProviders:!1!==t.useDefaultCapacityProviders,capacityProviderStrategy:t.capacityProviderStrategy&&t.capacityProviderStrategy.length>0?t.capacityProviderStrategy:[],capacityProviderLoadedFlag:!1,activeCapacityProviderIndex:null}}componentDidMount(){this.props.configureCommand("1").then(()=>{const e=this.props.command,t=this.state.useDefaultCapacityProviders,a=this.getCapacityProviderStrategy(t,e);this.setState({availableCapacityProviders:this.getAvailableCapacityProviders(e),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(e),capacityProviderStrategy:a,capacityProviderLoadedFlag:!0},()=>{this.props.onFieldChange("useDefaultCapacityProviders",t),this.props.onFieldChange("capacityProviderStrategy",a)})})}componentDidUpdate(){const e=this.props.command,t=!1!==e.useDefaultCapacityProviders,a={availableCapacityProviders:this.getAvailableCapacityProviders(e),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(e),ecsClusterName:e.ecsClusterName,useDefaultCapacityProviders:t,capacityProviderStrategy:t?this.getDefaultCapacityProviderStrategy(e):e.capacityProviderStrategy||[]},r={availableCapacityProviders:this.state.availableCapacityProviders,defaultCapacityProviderStrategy:this.state.defaultCapacityProviderStrategy,ecsClusterName:this.state.ecsClusterName,useDefaultCapacityProviders:this.state.useDefaultCapacityProviders,capacityProviderStrategy:this.state.capacityProviderStrategy};if(!Ae(r,a)){const t=!Ae(e.capacityProviderStrategy||[],a.capacityProviderStrategy);this.setState(a,()=>{t&&this.props.onFieldChange("capacityProviderStrategy",a.capacityProviderStrategy)})}}render(){const e=this.updateCapacityProviderName,t=this.updateCapacityProviderBase,a=this.updateCapacityProviderWeight,r=this.addCapacityProviderStrategy,n=this.removeCapacityProviderStrategy,i=this.updateCapacityProviderType,s=this.state.capacityProviderStrategy,l=this.state.useDefaultCapacityProviders,o=this.state.capacityProviderLoadedFlag,c=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.customCapacityProviders?this.props.command.viewState.dirty.customCapacityProviders:[],d=this.props.command.viewState.dirty&&this.props.command.viewState.dirty.defaulCapacityProviders?this.props.command.viewState.dirty.defaulCapacityProviders:[],m=this.state.availableCapacityProviders&&this.state.availableCapacityProviders.length>0?this.state.availableCapacityProviders.map(e=>({label:`${e}`,value:e})):[],p=l&&d?De.createElement("div",{className:"alert alert-warning"},De.createElement("p",{className:"text-left"},De.createElement("i",{className:"fa fa-exclamation-triangle"}),"Invalid capacity providers are a part of default capacity provider strategy.",De.createElement("br",null),"Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a custom strategy.")):"",u=c?c.map(function(e,t){return De.createElement("li",{key:t},e)}):"",g=l&&d.length>0?p:c.length>0&&!l?De.createElement("div",{className:"alert alert-warning"},De.createElement("p",null,De.createElement("i",{className:"fa fa-exclamation-triangle"}),"The following capacity providers could not be found in the selected account/region/cluster and were removed:"),De.createElement("ul",null,u),De.createElement("br",null),De.createElement("p",{className:"text-left"},"Please select the capacity provider(s) from the dropdown to resolve this error.")):"",h=s.length>0?s.map((r,i)=>De.createElement("tr",{key:i},l?De.createElement("td",null,De.createElement("input",{"aria-label":`Capacity provider name ${i+1}`,"data-test-id":"ServerGroup.defaultCapacityProvider.name."+i,type:"string",className:"form-control input-sm no-spel",required:!0,value:r.capacityProvider,disabled:!0})):De.createElement("td",null,De.createElement("input",{"aria-label":`Capacity provider name ${i+1}`,className:"form-control input-sm","data-test-id":"ServerGroup.customCapacityProvider.name."+i,onChange:t=>{this.setState({activeCapacityProviderIndex:i}),e(i,t.target.value)},onFocus:()=>this.setState({activeCapacityProviderIndex:i}),type:"text",value:r.capacityProvider||""}),this.state.activeCapacityProviderIndex===i&&m.map(t=>De.createElement("button",{className:"Select-option",key:t.value,onClick:()=>{e(i,t.value),this.setState({activeCapacityProviderIndex:null})},type:"button"},t.label))),De.createElement("td",null,De.createElement("input",{"aria-label":`Capacity provider base ${i+1}`,"data-test-id":"ServerGroup.capacityProvider.base."+i,disabled:l,type:"number",className:"form-control input-sm no-spel",value:r.base,onChange:e=>t(i,e.target.valueAsNumber)})),De.createElement("td",null,De.createElement("input",{"aria-label":`Capacity provider weight ${i+1}`,"data-test-id":"ServerGroup.capacityProvider.weight."+i,disabled:l,type:"number",className:"form-control input-sm no-spel",required:!0,value:r.weight,onChange:e=>a(i,e.target.valueAsNumber)})),l?"":De.createElement("td",null,De.createElement("div",{className:"form-control-static"},De.createElement("button",{"aria-label":`Remove capacity provider ${i+1}`,className:"btn-link sm-label",onClick:()=>n(i),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-trash"}),De.createElement("span",{className:"sr-only"},"Remove")))))):l&&0==this.state.capacityProviderStrategy.length?De.createElement("tr",null,De.createElement("div",{className:"sm-label-left",style:{width:"200%"}},De.createElement(ze,{color:"warning"}," ","The cluster does not have a default capacity provider strategy defined. Set a default capacity provider strategy or use a custom strategy."))):"",v=this.state.ecsClusterName&&this.props.command.credentials&&this.props.command.region&&!l&&m.length>0?De.createElement("button",{"data-test-id":"ServerGroup.addCapacityProvider",className:"btn btn-block btn-sm add-new",onClick:r,type:"button"},De.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Capacity Provider"):!l&&o&&0==m.length?De.createElement("div",{className:"sm-label-left",style:{width:"200%"}},De.createElement(ze,{color:"warning"}," The cluster does not have capacity providers defined. ")):"";return De.createElement("div",null,(c.length>0||d.length>0)&&o?De.createElement("div",null,g):"",De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Capacity Provider Strategy"),De.createElement(G,{id:"ecs.capacityProviderStrategy"})," ",De.createElement("br",null),De.createElement("span",null,"(",this.state.ecsClusterName,")")),De.createElement("div",{className:"radio"},De.createElement("label",null,De.createElement("input",{"data-test-id":"ServerGroup.capacityProviders.default",type:"radio",checked:l,onClick:()=>i(!0),id:"computeOptionsLaunchType1"}),"Use cluster default")),De.createElement("div",{className:"radio"},De.createElement("label",null,De.createElement("input",{"data-test-id":"ServerGroup.capacityProviders.custom",type:"radio",checked:!l,onClick:()=>i(!1),id:"computeOptionsCapacityProviders2"}),"Use custom (Advanced)")),o?De.createElement("table",{className:"table table-condensed packed tags"},De.createElement("thead",null,De.createElement("tr",null,De.createElement("th",{style:{width:"50%"}},"Provider name",De.createElement(G,{id:"ecs.capacityProviderName"})),De.createElement("th",{style:{width:"25%"}},"Base",De.createElement(G,{id:"ecs.capacityProviderBase"})),De.createElement("th",{style:{width:"25%"}},"Weight",De.createElement(G,{id:"ecs.capacityProviderWeight"})))),De.createElement("tbody",null,h),De.createElement("tfoot",null,De.createElement("tr",null,De.createElement("td",{colSpan:4},v)))):De.createElement("div",{className:"load medium"},De.createElement("div",{className:"message"},"Loading capacity providers..."),De.createElement("div",{className:"bars"},De.createElement("div",{className:"bar"}),De.createElement("div",{className:"bar"}),De.createElement("div",{className:"bar"}))))}}const jt=({command:e,configureCommand:t,onFieldChange:a})=>{const r="capacityProviders"===e.computeOption||!e.computeOption&&(e.capacityProviderStrategy||[]).length>0,n=e.capacity||{};return De.createElement("div",{className:"container-fluid form-horizontal","data-test-id":"EcsServerGroupWizard.horizontalScaling"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-4 sm-label-right"},De.createElement("b",null,"Compute options")," ",De.createElement(G,{id:"ecs.computeOptions"})),De.createElement("div",{className:"col-md-2 radio"},De.createElement("label",null,De.createElement("input",{checked:!r,"data-test-id":"ServerGroup.computeOptionsLaunchType",id:"computeOptionsLaunchType",onChange:()=>{a("computeOption","launchType"),a("capacityProviderStrategy",[])},type:"radio"})," ","Launch type")),De.createElement("div",{className:"col-md-3 radio"},De.createElement("label",null,De.createElement("input",{checked:r,"data-test-id":"ServerGroup.computeOptionsCapacityProviders",id:"computeOptionsCapacityProviders",onChange:()=>{a("computeOption","capacityProviders"),a("launchType","")},type:"radio"})," ","Capacity Providers"))),r?De.createElement("div",{className:"form-group"},De.createElement(Wt,{command:e,configureCommand:t,onFieldChange:a})):De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},"Launch Type ",De.createElement(G,{id:"ecs.launchtype"})),De.createElement("div",{className:"col-md-3"},De.createElement("select",{"aria-label":"Launch type",className:"form-control input-sm","data-test-id":"ServerGroup.launchType",onChange:e=>a("launchType",e.target.value),value:e.launchType||""},De.createElement("option",{value:""},"Select..."),(e.backingData.launchTypes||[]).map(e=>De.createElement("option",{key:e,value:e},e))))),De.createElement("hr",null),[["desired","Desired capacity","ecs.capacity.desired"],["min","Minimum","ecs.capacity.minimum"],["max","Maximum","ecs.capacity.maximum"]].map(([e,t,r])=>{var i;return De.createElement("div",{className:"form-group",key:e},De.createElement("div",{className:"col-md-5 sm-label-right"},t," ",De.createElement(G,{id:r})),De.createElement("div",{className:"col-md-2"},De.createElement("input",{"aria-label":`${"Minimum"===t||"Maximum"===t?`${t} capacity`:t}`,className:"form-control input-sm no-spel","data-test-id":`ServerGroup.capacity.${e}`,onChange:t=>((e,t)=>a("capacity",{...n,[e]:t}))(e,t.target.valueAsNumber),type:"number",value:null!=(i=n[e])?i:""})))}),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-12 checkbox"},De.createElement("label",null,De.createElement("input",{checked:!!e.useSourceCapacity,"data-test-id":"ServerGroup.useSourceCapacity",onChange:e=>{a("useSourceCapacity",e.target.checked),a("preferSourceCapacity",e.target.checked)},type:"checkbox"})," ",De.createElement("b",null,"If available, use the previous server group's capacity"))," ",De.createElement(G,{id:"ecs.capacity.overwrite"}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-12 checkbox"},De.createElement("label",null,De.createElement("input",{checked:!!e.copySourceScalingPoliciesAndActions,"data-test-id":"ServerGroup.copySourceScalingPoliciesAndActions",onChange:e=>a("copySourceScalingPoliciesAndActions",e.target.checked),type:"checkbox"})," ",De.createElement("b",null,"If available, copy the previous server group's autoscaling policies"))," ",De.createElement(G,{id:"ecs.capacity.copySourceScalingPoliciesAndActions"}))))},Zt=["None","awslogs","fluentd","gelf","journald","json-file","logentries","splunk","sumologic","syslog"],Kt=({command:e,onFieldChange:t})=>De.createElement("div",{className:"container-fluid form-horizontal","data-test-id":"EcsServerGroupWizard.logging"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-5 sm-label-right"},De.createElement("b",null,"Log driver (Optional)")," ",De.createElement(G,{id:"ecs.logDriver"})),De.createElement("div",{className:"col-md-7"},De.createElement("select",{"aria-label":"Log driver",className:"form-control input-sm","data-test-id":"Logging.logDriver",onChange:e=>t("logDriver",e.target.value),value:e.logDriver||""},De.createElement("option",{value:""},"Select..."),Zt.map(e=>De.createElement("option",{key:e,value:e},e))))),e.logDriver&&"None"!==e.logDriver?De.createElement("div",{className:"form-group"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Logging options (optional)")," ",De.createElement(G,{id:"ecs.logOptions"})),De.createElement(U,{allowEmpty:!0,keyLabel:"Logging option",model:e.logOptions||{},onChange:e=>t("logOptions",e),valueLabel:"Logging option value"})):De.createElement("div",{className:"form-group"},"Logging options are not available for your log driver selection."));class Xt extends Se.Component{constructor(e){var t,a,r,n,i;super(e),this.updateNetworkMode=e=>{const t=e.value,a=this.props.command;this.props.onFieldChange("networkMode",t),this.setState({networkMode:t,subnetTypesAvailable:a.backingData&&a.backingData.filtered&&a.backingData.filtered.subnetTypes?a.backingData.filtered.subnetTypes:[]})},this.updateSecurityGroups=e=>{const t=Array.isArray(e)?e.map(e=>e.value):[];this.props.onFieldChange("securityGroupNames",t),this.setState({securityGroupNames:t})},this.updateSubnetTypes=e=>{const t=this.props.command,a=Array.isArray(e)?e.map(e=>e.value):[];this.props.onFieldChange("subnetTypes",a),t.subnetTypeChanged(t),this.setState({subnetTypes:a,securityGroupsAvailable:t.backingData&&t.backingData.filtered&&t.backingData.filtered.securityGroupNames?t.backingData.filtered.securityGroupNames:[]})},this.updateAssociatePublicIpAddress=e=>{this.props.onFieldChange("associatePublicIpAddress",e),this.setState({associatePublicIpAddress:e})};const s=this.props.command;let l=[];s.subnetTypes&&s.subnetTypes.length>0&&(l=s.subnetTypes),s.subnetType&&s.subnetType.length>0&&(l.push(s.subnetType),s.subnetType=""),s.subnetTypes=Te(l,Ae);const o=(null==(a=null==(t=s.backingData)?void 0:t.filtered)?void 0:a.subnetTypes)||[],c=s.subnetTypes.filter(e=>!o.some(t=>t.purpose===e)).map(e=>({purpose:e,vpcId:s.vpcId||"unavailable"}));this.state={associatePublicIpAddress:s.associatePublicIpAddress,networkMode:s.networkMode,networkModesAvailable:Ie([...(null==(r=s.backingData)?void 0:r.networkModes)||[],s.networkMode]).filter(Boolean),securityGroupNames:s.securityGroupNames,securityGroupsAvailable:Ie([...(null==(i=null==(n=s.backingData)?void 0:n.filtered)?void 0:i.securityGroupNames)||[],...s.securityGroupNames||[]]),subnetTypes:s.subnetTypes,subnetTypesAvailable:[...o,...c]}}componentDidMount(){const e=this.props.command;this.props.configureCommand("1").then(()=>{var t,a,r,n,i;this.setState({networkModesAvailable:Ie([...(null==(t=e.backingData)?void 0:t.networkModes)||[],e.networkMode]).filter(Boolean),securityGroupsAvailable:Ie([...(null==(r=null==(a=e.backingData)?void 0:a.filtered)?void 0:r.securityGroupNames)||[],...e.securityGroupNames||[]]),subnetTypesAvailable:[...(null==(i=null==(n=e.backingData)?void 0:n.filtered)?void 0:i.subnetTypes)||[],...(e.subnetTypes||[]).filter(t=>{var a,r;return!((null==(r=null==(a=e.backingData)?void 0:a.filtered)?void 0:r.subnetTypes)||[]).some(e=>e.purpose===t)}).map(t=>({purpose:t,vpcId:e.vpcId||"unavailable"}))]})})}componentDidUpdate(){var e,t,a,r,n;const i=this.props.command,s=(null==(t=null==(e=i.backingData)?void 0:e.filtered)?void 0:t.subnetTypes)||[],l={associatePublicIpAddress:i.associatePublicIpAddress,networkMode:i.networkMode,networkModesAvailable:Ie([...(null==(a=i.backingData)?void 0:a.networkModes)||[],i.networkMode]).filter(Boolean),securityGroupNames:i.securityGroupNames||[],securityGroupsAvailable:Ie([...(null==(n=null==(r=i.backingData)?void 0:r.filtered)?void 0:n.securityGroupNames)||[],...i.securityGroupNames||[]]),subnetTypes:i.subnetTypes||[],subnetTypesAvailable:[...s,...(i.subnetTypes||[]).filter(e=>!s.some(t=>t.purpose===e)).map(e=>({purpose:e,vpcId:i.vpcId||"unavailable"}))]};Ae(this.state,l)||this.setState(l)}render(){const e=this.updateAssociatePublicIpAddress,t=this.updateNetworkMode,a=this.updateSecurityGroups,r=this.updateSubnetTypes,n=this.state.networkModesAvailable.map(function(e){return{label:`${e}`,value:e}}),i=this.state.securityGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),s=this.state.subnetTypesAvailable.map(function(e){return{label:`${e.purpose} (${e.vpcId})`,value:e.purpose}}),l=this.state.subnetTypesAvailable.length?Se.createElement(_,{inputProps:{"aria-label":"VPC subnet"},multi:!0,options:s,value:this.state.subnetTypes,onChange:e=>{r(e)}}):Se.createElement(ze,{color:"warning"},"No account was selected, or no subnet types are available for this account"),o=this.state.securityGroupsAvailable.length?Se.createElement(_,{inputProps:{"aria-label":"Security groups"},multi:!0,options:i,value:this.state.securityGroupNames,onChange:e=>{a(e)}}):Se.createElement(ze,{color:"warning"},"No security groups found in the selected account/region"),c="awsvpc"===this.state.networkMode?Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"VPC Subnet"),Se.createElement(G,{key:"ecs.subnet"})),Se.createElement("div",{className:"col-md-9","data-test-id":"Networking.subnetType"},l)),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Security Groups"),Se.createElement(G,{key:"ecs.securityGroups"})),Se.createElement("div",{className:"col-md-9","data-test-id":"Networking.securityGroups"},o)),Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Associate Public IP Address"),Se.createElement(G,{key:"ecs.publicip"})),Se.createElement("div",{className:"col-md-1 radio"},Se.createElement("label",null,Se.createElement("input",{"data-test-id":"Networking.associatePublicIpAddressTrue",type:"radio",value:"true",id:"associatePublicIpAddressTrue",checked:!0===this.state.associatePublicIpAddress,onChange:()=>e(!0)}),"Yes")),Se.createElement("div",{className:"col-md-1 radio"},Se.createElement("label",null,Se.createElement("input",{"data-test-id":"Networking.associatePublicIpAddressFalse",type:"radio",value:"false",id:"associatePublicIpAddressFalse",checked:!1===this.state.associatePublicIpAddress,onChange:()=>e(!1)}),"No")))):Se.createElement("div",{className:"col-md-3 sm-label-right"});return Se.createElement("div",{className:"networking-fluid form-horizontal"},Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"form-group"},Se.createElement("div",{className:"col-md-3 sm-label-right"},Se.createElement("b",null,"Network Mode"),Se.createElement(G,{id:"ecs.networkMode"})),Se.createElement("div",{className:"col-md-9","data-test-id":"Networking.networkMode"},Se.createElement(_,{inputProps:{"aria-label":"Network mode"},placeholder:"Select a network mode to use ...",options:n,value:this.state.networkMode,onChange:e=>{t(e)}})))),c)}}const Yt=({command:e,configureCommand:t,onFieldChange:a})=>De.createElement("div",{"data-test-id":"EcsServerGroupWizard.networking"},De.createElement(Xt,{command:e,configureCommand:t,onFieldChange:a}));class Jt extends De.Component{constructor(e){var t,a;super(e),this.normalizeContainerNames=(e,t)=>{const a=e.map(e=>({...e,containerName:t?e.containerName||"":null}));return Ae(e,a)?e:a},this.getNameToRegistryMap=()=>{const e=new Map;return this.state.serviceDiscoveryRegistriesAvailable.forEach(t=>{e.set(t.displayName,t)}),e},this.mergeRegistries=(e,t)=>{const a=new Map;return[...e,...t.map(e=>e.registry)].filter(Boolean).forEach(e=>{a.set(e.displayName,e)}),Array.from(a.values())},this.getEmptyRegistry=()=>({account:"",region:"",name:"",id:"",arn:"",displayName:""}),this.updateServiceDiscoveryRegistry=(e,t)=>{let a=this.getNameToRegistryMap().get(t.value);a||(a=this.getEmptyRegistry());const r=this.state.serviceDiscoveryAssociations;r[e].registry=a,this.props.onFieldChange("serviceDiscoveryAssociations",r),this.setState({serviceDiscoveryAssociations:r})},this.updateServiceDiscoveryPort=(e,t)=>{const a=this.state.serviceDiscoveryAssociations;a[e].containerPort=t,this.props.onFieldChange("serviceDiscoveryAssociations",a),this.setState({serviceDiscoveryAssociations:a})},this.updateServiceDiscoveryContainerName=(e,t)=>{const a=this.state.serviceDiscoveryAssociations;a[e].containerName=t,this.props.onFieldChange("serviceDiscoveryAssociations",a),this.setState({serviceDiscoveryAssociations:a})},this.pushServiceDiscoveryAssociation=()=>{const e=this.state.serviceDiscoveryAssociations;e.push({registry:this.getEmptyRegistry(),containerPort:80,containerName:""}),this.setState({serviceDiscoveryAssociations:e})},this.removeServiceDiscoveryAssociations=e=>{const t=this.state.serviceDiscoveryAssociations;t.splice(e,1),this.props.onFieldChange("serviceDiscoveryAssociations",t),this.setState({serviceDiscoveryAssociations:t})};const r=this.props.command,n=this.normalizeContainerNames(r.serviceDiscoveryAssociations||[],r.useTaskDefinitionArtifact);r.serviceDiscoveryAssociations=n,this.state={serviceDiscoveryAssociations:n,serviceDiscoveryRegistriesAvailable:this.mergeRegistries((null==(a=null==(t=r.backingData)?void 0:t.filtered)?void 0:a.serviceDiscoveryRegistries)||[],n),useTaskDefinitionArtifact:r.useTaskDefinitionArtifact}}componentDidMount(){this.props.configureCommand("1").then(()=>{this.setState({serviceDiscoveryRegistriesAvailable:this.mergeRegistries(this.props.command.backingData.filtered.serviceDiscoveryRegistries||[],this.state.serviceDiscoveryAssociations)})})}componentDidUpdate(){var e,t;const a=this.props.command,r=a.serviceDiscoveryAssociations||[],n=this.normalizeContainerNames(r,a.useTaskDefinitionArtifact);Ae(r,n)||(a.serviceDiscoveryAssociations=n,this.props.onFieldChange("serviceDiscoveryAssociations",n));const i={serviceDiscoveryAssociations:n,serviceDiscoveryRegistriesAvailable:this.mergeRegistries((null==(t=null==(e=a.backingData)?void 0:e.filtered)?void 0:t.serviceDiscoveryRegistries)||[],n),useTaskDefinitionArtifact:a.useTaskDefinitionArtifact};Ae(this.state,i)||this.setState(i)}render(){const e=this.removeServiceDiscoveryAssociations,t=this.updateServiceDiscoveryRegistry,a=this.updateServiceDiscoveryPort,r=this.updateServiceDiscoveryContainerName,n=this.state.serviceDiscoveryRegistriesAvailable.map(function(e){return{label:`${e.displayName}`,value:e.displayName}}),i=this.state.useTaskDefinitionArtifact,s=this.state.serviceDiscoveryAssociations.map(function(s,l){return De.createElement("tr",{key:l},i&&De.createElement("td",null,De.createElement("input",{"aria-label":`Container name ${l+1}`,className:"form-control input-sm","data-test-id":"ServiceDiscovery.containerName",placeholder:"Enter a container name ...",required:!0,value:s.containerName,onChange:e=>r(l,e.target.value)})),De.createElement("td",{"data-test-id":"ServiceDiscovery.registry"},De.createElement(_,{inputProps:{"aria-label":`Service registry ${l+1}`},placeholder:"Select a registry...",options:n,value:s.registry.displayName.toString(),onChange:e=>t(l,e),clearable:!1,required:!0})),De.createElement("td",null,De.createElement("input",{"aria-label":`Container port ${l+1}`,"data-test-id":"ServiceDiscovery.containerPort",type:"number",className:"form-control input-sm no-spel",required:!0,value:s.containerPort,onChange:e=>a(l,e.target.valueAsNumber)})),De.createElement("td",null,De.createElement("div",{className:"form-control-static"},De.createElement("button",{"aria-label":`Remove service registry ${l+1}`,className:"btn-link sm-label",onClick:()=>e(l),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-trash"}),De.createElement("span",{className:"sr-only"},"Remove")))))}),l=this.state.serviceDiscoveryRegistriesAvailable.length?De.createElement("button",{className:"btn btn-block btn-sm add-new",onClick:this.pushServiceDiscoveryAssociation,type:"button"},De.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Service Registry"):De.createElement("div",{className:"sm-label-left"},De.createElement(ze,{color:"warning"},"No registries found in the selected account/region/VPC"));return De.createElement("div",{className:"container-fluid form-horizontal"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Service Registries (optional)"),De.createElement(G,{id:"ecs.serviceDiscovery"})),De.createElement("form",{name:"ecsServiceDiscoveryRegistryMappings"},De.createElement("table",{className:"table table-condensed packed tags"},De.createElement("thead",null,De.createElement("tr",null,i&&De.createElement("th",{style:{width:"30%"}},"Container name",De.createElement(G,{id:"ecs.serviceDiscoveryContainerName"})),i?De.createElement("th",{style:{width:"55%"}},"Registry",De.createElement(G,{id:"ecs.serviceDiscoveryRegistry"})):De.createElement("th",{style:{width:"80%"}},"Registry",De.createElement(G,{id:"ecs.serviceDiscoveryRegistry"})),De.createElement("th",{style:{width:"15%"}},"Port",De.createElement(G,{id:"ecs.serviceDiscoveryContainerPort"})),De.createElement("th",null))),De.createElement("tbody",null,s),De.createElement("tfoot",null,De.createElement("tr",null,De.createElement("td",{colSpan:4},l)))))))}}const Qt=({command:e,configureCommand:t,onFieldChange:a})=>De.createElement("div",{"data-test-id":"EcsServerGroupWizard.serviceDiscovery"},De.createElement(Jt,{command:e,configureCommand:t,onFieldChange:a}));class ea extends De.Component{constructor(e){var t,a,r,n;super(e),this.updateDockerRegistryAccount=e=>{const t=e.value;this.props.command.backingData.filtered.images=[],this.setState({selectedDockerAccount:t,dockerImages:[]}),Ue.findImages({provider:"dockerRegistry",account:t,count:50}).then(e=>{const t=e.map(e=>Bt(e));this.props.command.backingData.filtered.images=t,this.setState({dockerImages:t})})},this.getIdToImageMap=()=>{const e=new Map;return this.props.command.backingData.filtered.images.forEach(t=>{e.set(t.imageId,t)}),e},this.getEmptyImageDescription=()=>({imageId:"",message:"",fromTrigger:!1,fromContext:!1,stageId:"",imageLabelOrSha:"",account:"",registry:"",repository:"",tag:""}),this.excludedArtifactTypePatterns=[W.KUBERNETES,W.DOCKER_IMAGE,W.FRONT50_PIPELINE_TEMPLATE],this.onExpectedArtifactSelected=e=>{const t={artifactId:e};this.props.onFieldChange("taskDefinitionArtifact",t),this.setState({taskDefArtifact:t})},this.onArtifactEdited=e=>{const t={artifact:e};this.props.onFieldChange("taskDefinitionArtifact",t),this.setState({taskDefArtifact:t})},this.pushMapping=()=>{const e=this.state.containerMappings;e.push({containerName:"",imageDescription:this.getEmptyImageDescription()}),this.setState({containerMappings:e})},this.pushTargetGroupMapping=()=>{const e=this.state.targetGroupMappings;e.push({containerName:"",targetGroup:"",containerPort:80}),this.setState({targetGroupMappings:e})},this.updateContainerMappingName=(e,t)=>{const a=this.state.containerMappings;a[e].containerName=t,this.props.onFieldChange("containerMappings",a),this.setState({containerMappings:a})},this.updateContainerMappingImage=(e,t)=>{let a=this.getIdToImageMap().get(t.value);a||(a=this.getEmptyImageDescription());const r=this.state.containerMappings;r[e].imageDescription=a,this.props.onFieldChange("containerMappings",r),this.setState({containerMappings:r})},this.updateTargetGroupMappingTargetGroup=(e,t)=>{const a=this.state.targetGroupMappings;a[e].targetGroup=t.value,this.props.onFieldChange("targetGroupMappings",a),this.setState({targetGroupMappings:a})},this.updateTargetGroupMappingContainer=(e,t)=>{const a=this.state.targetGroupMappings;a[e].containerName=t,this.props.onFieldChange("targetGroupMappings",a),this.setState({targetGroupMappings:a})},this.updateTargetGroupMappingPort=(e,t)=>{const a=this.state.targetGroupMappings;a[e].containerPort=t,this.props.onFieldChange("targetGroupMappings",a),this.setState({targetGroupMappings:a})},this.removeMapping=e=>{const t=this.state.containerMappings;t.splice(e,1),this.props.onFieldChange("containerMappings",t),this.setState({containerMappings:t})},this.removeTargetGroupMapping=e=>{const t=this.state.targetGroupMappings;t.splice(e,1),this.props.onFieldChange("targetGroupMappings",t),this.setState({targetGroupMappings:t})},this.updateEvaluateTaskDefArtifactFlag=()=>{this.props.onFieldChange("evaluateTaskDefinitionArtifactExpressions",!this.props.command.evaluateTaskDefinitionArtifactExpressions),this.setState({evaluateTaskDefinitionArtifactExpressions:!this.props.command.evaluateTaskDefinitionArtifactExpressions})};const i=this.props.command;let s="";i.containerMappings&&i.containerMappings.length>0&&(s=i.containerMappings[0].containerName);let l=[];i.targetGroupMappings&&i.targetGroupMappings.length>0&&(l=i.targetGroupMappings),i.targetGroup&&i.targetGroup.length>0&&(l.push({containerName:i.loadBalancedContainer||s,targetGroup:i.targetGroup,containerPort:i.containerPort}),i.targetGroup="",i.loadBalancedContainer=""),i.targetGroupMappings=Te(l,Ae),this.state={taskDefArtifact:i.taskDefinitionArtifact,containerMappings:i.containerMappings?i.containerMappings:[],targetGroupMappings:i.targetGroupMappings,targetGroupsAvailable:Ie([...(null==(a=null==(t=i.backingData)?void 0:t.filtered)?void 0:a.targetGroups)||[],...i.targetGroupMappings.map(e=>e.targetGroup).filter(Boolean)]),dockerImages:i.backingData&&i.backingData.filtered?i.backingData.filtered.images:[],dockerRegistryAccounts:[],selectedDockerAccount:null!=(n=null==(r=i.imageDescription)?void 0:r.account)?n:"",loadBalancedContainer:i.loadBalancedContainer||s,taskDefArtifactAccount:i.taskDefinitionArtifactAccount,evaluateTaskDefinitionArtifactExpressions:i.evaluateTaskDefinitionArtifactExpressions}}componentDidMount(){F.listAccounts("dockerRegistry").then(e=>{this.setState({dockerRegistryAccounts:e})}),this.props.configureCommand("1").then(()=>{this.setState({dockerImages:this.props.command.backingData.filtered.images,targetGroupsAvailable:Ie([...this.props.command.backingData.filtered.targetGroups||[],...this.state.targetGroupMappings.map(e=>e.targetGroup).filter(Boolean)])})})}componentDidUpdate(){var e,t,a,r,n;const i=this.props.command,s=i.containerMappings||[],l=i.targetGroupMappings||[],o={taskDefArtifact:i.taskDefinitionArtifact,taskDefArtifactAccount:i.taskDefinitionArtifactAccount,containerMappings:s,targetGroupMappings:l,dockerImages:(null==(t=null==(e=i.backingData)?void 0:e.filtered)?void 0:t.images)||[],targetGroupsAvailable:Ie([...(null==(r=null==(a=i.backingData)?void 0:a.filtered)?void 0:r.targetGroups)||[],...l.map(e=>e.targetGroup).filter(Boolean)]),loadBalancedContainer:i.loadBalancedContainer||(null==(n=s[0])?void 0:n.containerName)||"",evaluateTaskDefinitionArtifactExpressions:i.evaluateTaskDefinitionArtifactExpressions,dockerRegistryAccounts:this.state.dockerRegistryAccounts,selectedDockerAccount:this.state.selectedDockerAccount};Ae(this.state,o)||this.setState(o)}render(){const{command:e}=this.props,t=this.removeMapping,a=this.removeTargetGroupMapping,r=this.updateContainerMappingName,n=this.updateContainerMappingImage,i=this.updateTargetGroupMappingContainer,s=this.updateTargetGroupMappingTargetGroup,l=this.updateTargetGroupMappingPort,o=this.updateEvaluateTaskDefArtifactFlag,c=this.state.dockerRegistryAccounts.map(e=>({label:e.name,value:e.name})),d=this.state.dockerImages.map(function(e){let t="";return(e.fromTrigger||e.fromContext)&&(t=e.fromTrigger?"(TRIGGER) ":"(FIND IMAGE RESULT) "),{label:`${t} (${e.imageId})`,value:e.imageId}}),m=this.state.targetGroupsAvailable.map(function(e){return{label:`${e}`,value:e}}),p=this.state.containerMappings.map(function(e,a){return De.createElement("tr",{key:a},De.createElement("td",null,De.createElement("input",{"aria-label":`Container name ${a+1}`,"data-test-id":"Artifacts.containerName",className:"form-control input-sm",required:!0,placeholder:"enter container name...",value:e.containerName.toString(),onChange:e=>r(a,e.target.value)})),De.createElement("td",{"data-test-id":"Artifacts.containerImage"},De.createElement(_,{inputProps:{"aria-label":`Container image ${a+1}`},placeholder:"Select an image to use...",options:d,value:e.imageDescription.imageId,onChange:e=>{n(a,e)},clearable:!1})),De.createElement("td",null,De.createElement("div",{className:"form-control-static"},De.createElement("button",{"aria-label":`Remove container mapping ${a+1}`,className:"btn-link sm-label","data-test-id":"Artifacts.containerRemove",onClick:()=>t(a),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-trash"}),De.createElement("span",{className:"sr-only"},"Remove")))))}),u=this.state.targetGroupMappings.map(function(e,t){return De.createElement("tr",{key:t},De.createElement("td",null,De.createElement("input",{"aria-label":`Target group container name ${t+1}`,"data-test-id":"Artifacts.targetGroupContainer",className:"form-control input-sm",required:!0,placeholder:"Enter a container name ...",value:e.containerName.toString(),onChange:e=>i(t,e.target.value)})),De.createElement("td",{"data-test-id":"Artifacts.targetGroup"},De.createElement(_,{inputProps:{"aria-label":`Target group ${t+1}`},placeholder:"Select a target group to use...",options:m,value:e.targetGroup.toString(),onChange:e=>s(t,e),clearable:!1})),De.createElement("td",null,De.createElement("input",{"aria-label":`Target port ${t+1}`,"data-test-id":"Artifacts.targetGroupPort",type:"number",className:"form-control input-sm no-spel",required:!0,value:e.containerPort.toString(),onChange:e=>l(t,e.target.valueAsNumber)})),De.createElement("td",null,De.createElement("div",{className:"form-control-static"},De.createElement("button",{"aria-label":`Remove target group mapping ${t+1}`,className:"btn-link sm-label","data-test-id":"Artifacts.targetGroupRemove",onClick:()=>a(t),type:"button"},De.createElement("span",{className:"glyphicon glyphicon-trash"}),De.createElement("span",{className:"sr-only"},"Remove")))))}),g=this.state.targetGroupsAvailable.length?De.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"Artifacts.targetGroupAdd",onClick:this.pushTargetGroupMapping,type:"button"},De.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Target Group Mapping"):De.createElement("div",{className:"sm-label-left"},De.createElement(ze,{color:"warning"},"No target groups found in the selected account/region/VPC"));return De.createElement("div",{className:"container-fluid form-horizontal"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-12"},De.createElement(j,{artifact:this.state.taskDefArtifact.artifact,excludedArtifactTypePatterns:this.excludedArtifactTypePatterns,expectedArtifactId:this.state.taskDefArtifact.artifactId,label:"Artifact",helpKey:"ecs.taskDefinitionArtifact",onExpectedArtifactSelected:e=>this.onExpectedArtifactSelected(e.id),onArtifactEdited:this.onArtifactEdited,pipeline:e.viewState.pipeline,stage:e.viewState.currentStage}))),De.createElement(A,{groupClassName:"form-group evaluateTaskDef",label:"Expression Evaluation",helpKey:"ecs.evaluateExpression",labelColumns:5,fieldColumns:7},De.createElement(Z,{checked:!0===e.evaluateTaskDefinitionArtifactExpressions,onChange:()=>{o()},text:"Evaluate SpEL expressions in artifact"})),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-3 sm-label-right"},De.createElement("b",null,"Docker Registry Account")),De.createElement("div",{className:"col-md-9","data-test-id":"Artifacts.dockerRegistryAccount"},De.createElement(_,{placeholder:"Select a Docker registry account...",options:c,value:this.state.selectedDockerAccount,onChange:e=>this.updateDockerRegistryAccount(e),clearable:!1}))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Container Mappings"),De.createElement(G,{id:"ecs.containerMappings"})),De.createElement("form",{name:"ecsTaskDefinitionContainerMappings"},De.createElement("table",{className:"table table-condensed packed tags"},De.createElement("thead",null,De.createElement("tr",{key:"header"},De.createElement("th",{style:{width:"30%"}},"Container name",De.createElement(G,{id:"ecs.containerMappingName"})),De.createElement("th",{style:{width:"70%"}},"Container image",De.createElement(G,{id:"ecs.containerMappingImage"})),De.createElement("th",null))),De.createElement("tbody",null,p),De.createElement("tfoot",null,De.createElement("tr",null,De.createElement("td",{colSpan:3},De.createElement("button",{className:"btn btn-block btn-sm add-new","data-test-id":"Artifacts.containerAdd",onClick:this.pushMapping,type:"button"},De.createElement("span",{className:"glyphicon glyphicon-plus-sign"}),"Add New Container Mapping"))))))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"sm-label-left"},De.createElement("b",null,"Target Group Mappings"),De.createElement(G,{id:"ecs.targetGroupMappings"})),De.createElement("form",{name:"ecsTaskDefinitionTargetGroupMappings"},De.createElement("table",{className:"table table-condensed packed tags"},De.createElement("thead",null,De.createElement("tr",{key:"header"},De.createElement("th",{style:{width:"30%"}},"Container name",De.createElement(G,{id:"ecs.loadBalancedContainer"})),De.createElement("th",{style:{width:"55%"}},"Target group",De.createElement(G,{id:"ecs.loadBalancer.targetGroup"})),De.createElement("th",{style:{width:"15%"}},"Target port",De.createElement(G,{id:"ecs.loadbalancing.targetPort"})),De.createElement("th",null))),De.createElement("tbody",null,u),De.createElement("tfoot",null,De.createElement("tr",null,De.createElement("td",{colSpan:4},g)))))))}}const ta=({command:e,configureCommand:t,onFieldChange:a})=>De.createElement("div",{className:"clearfix","data-test-id":"EcsServerGroupWizard.taskDefinition"},De.createElement("div",{className:"row"},De.createElement("div",{className:"col-md-12"},De.createElement("div",{className:"container-fluid form-horizontal"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-md-4 sm-label-right"},De.createElement("b",null,"Task Definition source")," ",De.createElement(G,{id:"ecs.taskDefinition"})),De.createElement("div",{className:"col-md-2 radio"},De.createElement("label",null,De.createElement("input",{checked:!e.useTaskDefinitionArtifact,"data-test-id":"ServerGroup.useInputs",id:"taskDefinitionSourceInputs",onChange:()=>a("useTaskDefinitionArtifact",!1),type:"radio"})," ","Inputs")),De.createElement("div",{className:"col-md-2 radio"},De.createElement("label",null,De.createElement("input",{checked:e.useTaskDefinitionArtifact,"data-test-id":"ServerGroup.useArtifacts",disabled:"create"===e.viewState.mode,id:"taskDefinitionSourceArtifact",onChange:()=>a("useTaskDefinitionArtifact",!0),type:"radio"})," ","Artifact"))),"create"===e.viewState.mode&&De.createElement("div",{className:"color-text-caption"},De.createElement("hr",null),De.createElement("em",null,"Artifacts not supported outside of pipelines.")))),e.useTaskDefinitionArtifact&&De.createElement("div",{className:"col-md-12"},De.createElement("hr",null),De.createElement(ea,{command:e,configureCommand:t,onFieldChange:a})))),aa=e=>null!=e&&""!==e,ra=e=>Number.isFinite(e)&&Number.isInteger(e)&&e>=0,na=e=>aa(null==e?void 0:e.capacityProvider)&&ra(null==e?void 0:e.base)&&ra(null==e?void 0:e.weight),ia=e=>e.some(e=>Object.keys(e).length>0),sa=e=>null==e?void 0:e.includes("${"),la=e=>{const t=(e.targetGroupMappings||[]).map(t=>{const a={};return e.useTaskDefinitionArtifact&&!aa(t.containerName)&&(a.containerName="Container name is required."),aa(t.targetGroup)||(a.targetGroup="Target group is required."),ra(t.containerPort)||(a.containerPort="Container port must be a non-negative integer."),a});return ia(t)?{targetGroupMappings:t}:{}},oa=e=>{const t={};return aa(e.credentials)||(t.credentials="Account is required."),aa(e.region)||(t.region="Region is required."),aa(e.ecsClusterName)||(t.ecsClusterName="ECS cluster is required."),((e="")=>sa(e)||/^([a-zA-Z_0-9._${}]*(\${.+})*)*$/.test(e))(e.stack)||(t.stack="Only dot(.) and underscore(_) special characters are allowed in the Stack field."),((e="")=>sa(e)||/^([a-zA-Z_0-9._${}-]*(\${.+})*)*$/.test(e))(e.freeFormDetails)||(t.freeFormDetails="Only dot(.), underscore(_), and dash(-) special characters are allowed in the Detail field."),t},ca=e=>{var t,a;if(!e.useTaskDefinitionArtifact)return{};const r=la(e);(null==(t=e.taskDefinitionArtifact)?void 0:t.artifact)||(null==(a=e.taskDefinitionArtifact)?void 0:a.artifactId)||(r.taskDefinitionArtifact="Task definition artifact is required.");const n=(e.containerMappings||[]).map(e=>{var t;const a={};return aa(e.containerName)||(a.containerName="Container name is required."),aa(null==(t=e.imageDescription)?void 0:t.imageId)||(a.imageDescription="Container image is required."),a});return ia(n)&&(r.containerMappings=n),r},da=e=>{var t;if(e.useTaskDefinitionArtifact)return{};const a=la(e);return aa(null==(t=e.imageDescription)?void 0:t.imageId)||(a.imageDescription={imageId:"Container image is required."}),a},ma=e=>{const t=(e.serviceDiscoveryAssociations||[]).map(t=>{var a,r;const n={};return e.useTaskDefinitionArtifact&&!aa(t.containerName)&&(n.containerName="Container name is required."),aa(null==(a=t.registry)?void 0:a.id)||aa(null==(r=t.registry)?void 0:r.displayName)||(n.registry="Service registry is required."),ra(t.containerPort)||(n.containerPort="Container port must be a non-negative integer."),n});return ia(t)?{serviceDiscoveryAssociations:t}:{}},pa=e=>{var t,a;const r=e.capacity||{},n="capacityProviders"===e.computeOption||!e.computeOption&&(e.capacityProviderStrategy||[]).length>0,i={},s={};if(["min","desired","max"].forEach(e=>{ra(r[e])||(s[e]="Capacity must be a non-negative integer.")}),0===Object.keys(s).length&&(r.min>r.max&&(s.min="Minimum capacity cannot exceed maximum capacity."),(r.desired<r.min||r.desired>r.max)&&(s.desired="Desired capacity must be between minimum and maximum capacity.")),n||aa(e.launchType)||(i.launchType="Launch type is required."),n&&!1!==e.useDefaultCapacityProviders){const r=(null==(a=null==(t=e.backingData)?void 0:t.filtered)?void 0:a.defaultCapacityProviderStrategy)||[];r.length&&r.every(na)||(i.capacityProviderStrategy="A usable default capacity provider strategy is required.")}if(n&&!1===e.useDefaultCapacityProviders){const t=e.capacityProviderStrategy||[];if(t.length){const e=t.map(e=>{const t={};return aa(e.capacityProvider)||(t.capacityProvider="Capacity provider is required."),ra(e.base)||(t.base="Base must be a non-negative integer."),ra(e.weight)||(t.weight="Weight must be a non-negative integer."),t});ia(e)&&(i.capacityProviderStrategy=e)}else i.capacityProviderStrategy="At least one capacity provider is required."}return Object.keys(s).length&&(i.capacity=s),i},ua=e=>({...oa(e),...ca(e),...da(e),...ma(e),...pa(e)});class ga extends De.Component{constructor(){super(...arguments),this.validate=e=>this.props.validator(e)}render(){return De.Children.only(this.props.children)}}class ha{getPredefinedStrategy(e){return"AZ Balanced Spread"===e?this.getAzBalancedSpreadStrategy():"AZ Balanced BinPack"===e||"AZ Balanced BinPack Memory"===e?this.getAzBalancedMemoryBinPackStrategy():"BinPack"===e||"BinPack Memory"===e?this.getBinPackMemoryStrategy():"AZ Balanced BinPack CPU"===e?this.getAzBalancedCpuBinPackStrategy():"BinPack CPU"===e?this.getBinPackCpuStrategy():"One Task Per Host"===e?this.getOneTaskPerHostStrategy():[]}getAzBalancedSpreadStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"spread",field:"instanceId"}]}getAzBalancedMemoryBinPackStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"binpack",field:"memory"}]}getBinPackMemoryStrategy(){return[{type:"binpack",field:"memory"}]}getAzBalancedCpuBinPackStrategy(){return[{type:"spread",field:"attribute:ecs.availability-zone"},{type:"binpack",field:"cpu"}]}getBinPackCpuStrategy(){return[{type:"binpack",field:"cpu"}]}getOneTaskPerHostStrategy(){return[{type:"spread",field:"instanceId"}]}}class va{listSecrets(){return q("/ecs/secrets").get()}}class ya{static listServiceDiscoveryRegistries(){return q("/ecs/serviceDiscoveryRegistries").get()}}class fa extends De.Component{constructor(e){super(e),this.configureRequest=0,this.formik=null,this.unmounted=!1,this.ecsClusterReader=new zt,this.iamRoleReader=new Lt,this.metricAlarmReader=new Ot,this.placementStrategyService=new ha,this.secretReader=new va,this.onTaskComplete=()=>{this.clearApplicationRefreshSubscription(),this.applicationRefreshUnsubscribe=this.props.application.serverGroups.onNextRefresh(this.onApplicationRefresh),this.props.application.serverGroups.refresh()},this.onApplicationRefresh=()=>{var e,t,a,r,n;if(this.clearApplicationRefreshSubscription(),this.unmounted)return;const{command:i,taskMonitor:s}=this.state,l=null==(a=null==(t=null==(e=s.task)?void 0:e.execution)?void 0:t.stages)?void 0:a.find(e=>"cloneServerGroup"===e.type),o=null==(n=null==(r=null==l?void 0:l.context)?void 0:r["deploy.server.groups"])?void 0:n[i.region];if(!o)return;let c="^.^.^.clusters.serverGroup";this.props.stateService.includes("**.clusters.serverGroup")&&(c="^.serverGroup"),this.props.stateService.includes("**.clusters.cluster.serverGroup")&&(c="^.^.serverGroup"),this.props.stateService.includes("**.clusters")&&(c=".serverGroup"),this.props.stateService.go(c,{accountId:i.credentials,provider:"ecs",region:i.region,serverGroup:o})},this.clearApplicationRefreshSubscription=()=>{var e;null==(e=this.applicationRefreshUnsubscribe)||e.call(this),this.applicationRefreshUnsubscribe=void 0},this.templateSelected=()=>{this.ensureCommandShape(this.props.command),this.setState({command:this.props.command,loaded:!1,requiresTemplateSelection:!1},()=>{this.configureCommand()})},this.configureCommand=(e="",t=this.state.command)=>{const a=++this.configureRequest;return this.ensureCommandShape(t),this.command=t,this.loadBackingData(t,e,a).then(()=>{if(!this.unmounted&&a===this.configureRequest){const e=this.command;e.availabilityZones=t.availabilityZones,e.backingData=t.backingData,e.region=t.region,this.attachEventHandlers(e),this.syncCommand(e),this.setState({loaded:!0})}})},this.updateCommand=(e,t,a)=>{"credentials"!==t&&"region"!==t&&"ecsClusterName"!==t&&"subnetTypes"!==t||(this.configureRequest+=1),e.setFieldValue(t,a);const r={...this.command,[t]:a};"stack"!==t&&"freeFormDetails"!==t||r.clusterChanged(r),"credentials"===t&&r.credentialsChanged(r),"region"===t&&r.regionChanged(r),"subnetTypes"===t&&r.subnetTypeChanged(r),"placementStrategyName"===t&&r.placementStrategyNameChanged(r),"useTaskDefinitionArtifact"===t&&(r.serviceDiscoveryAssociations=(r.serviceDiscoveryAssociations||[]).map(e=>({...e,containerName:a?e.containerName||"":null}))),"credentials"!==t&&"region"!==t&&this.syncCommand(r,e),this.setState({command:r},()=>{"ecsClusterName"!==t&&"subnetTypes"!==t||this.configureCommand("",r)})},this.submit=(e=this.state.command)=>{var t;const{taskMonitor:a}=this.state;this.setState({command:e});const r=null==(t=e.viewState)?void 0:t.mode;return"editPipeline"===r||"createPipeline"===r?this.props.closeModal(e):a.submit(()=>this.context.services.serverGroupWriter.cloneServerGroup(e,this.props.application))},this.ensureCommandShape(e.command),this.command=e.command,this.state={command:e.command,loaded:!1,requiresTemplateSelection:Fe(e,"command.viewState.requiresTemplateSelection",!1),taskMonitor:new K({application:e.application,title:"Creating your server group",onDismiss:()=>this.props.dismissModal(),onTaskComplete:this.onTaskComplete})}}static show(e,t){return X.show(Ea,e,{dialogClassName:"wizard-modal modal-lg"},t)}componentDidMount(){this.state.requiresTemplateSelection?this.setState({loaded:!0}):this.configureCommand()}componentWillUnmount(){this.unmounted=!0,this.clearApplicationRefreshSubscription()}safe(e,t){return Promise.resolve(e).catch(()=>t)}loadBackingData(e,t,a=this.configureRequest){return Promise.all([this.safe(F.getCredentialsKeyedByAccount("ecs"),{}),this.safe(q("/loadBalancers").query({provider:"ecs"}).get(),[]),this.safe(q("/subnets/ecs").get(),[]),this.safe(this.iamRoleReader.listRoles("ecs"),[]),this.safe(this.ecsClusterReader.listClusters(),[]),this.safe(this.ecsClusterReader.describeClusters(e.credentials,e.region),[]),this.safe(this.metricAlarmReader.listMetricAlarms(),[]),this.safe(q("/securityGroups").get(),{}),this.safe(this.secretReader.listSecrets(),[]),this.safe(ya.listServiceDiscoveryRegistries(),[]),t?this.safe(q("/images/find").query({provider:"dockerRegistry",count:50,q:t}).get(),[]):e.backingData.images||[]]).then(([t,r,n,i,s,l,o,c,d,m,p])=>{if(this.unmounted||a!==this.configureRequest)return;const u=Array.isArray(r)?r:[],g=Array.isArray(n)?n:[],h=Array.isArray(i)?i:[],v=Array.isArray(s)?s:[],y=Array.isArray(l)?l:[],f=Array.isArray(o)?o:[],E=c||{},b=Array.isArray(d)?d:[],C=Array.isArray(m)?m:[],N=Array.isArray(p)?p:[],k=e.backingData;k.credentialsKeyedByAccount=t,k.loadBalancers=u,k.subnets=g,k.iamRoles=h,k.ecsClusters=v,k.capacityProviderDetails=y,k.metricAlarms=f,k.securityGroups=E,k.launchTypes=["EC2","FARGATE"],k.networkModes=["bridge","host","awsvpc","none","default"],k.secrets=b,k.serviceDiscoveryRegistries=C,k.images=this.normalizeImages(e,N),k.filtered={...k.filtered,availableCapacityProviders:this.getAvailableCapacityProviders(e,y),defaultCapacityProviderStrategy:this.getDefaultCapacityProviderStrategy(e,y),ecsClusters:this.getClusterNames(e,v),iamRoles:this.getIamRoles(e,h),images:k.images,metricAlarms:f,securityGroupNames:this.getSecurityGroupNames(e,E,g),secrets:this.getSecrets(e,b),serviceDiscoveryRegistries:this.getServiceDiscoveryRegistries(e,C),subnetTypes:this.getSubnetTypes(e,g),targetGroups:this.getTargetGroups(e,u)},this.reconcileLocation(e),this.attachEventHandlers(e)})}ensureCommandShape(e){e.backingData=e.backingData||{},e.backingData.filtered=e.backingData.filtered||{},e.backingData.filtered.availableCapacityProviders=e.backingData.filtered.availableCapacityProviders||[],e.backingData.filtered.defaultCapacityProviderStrategy=e.backingData.filtered.defaultCapacityProviderStrategy||[],e.backingData.filtered.ecsClusters=e.backingData.filtered.ecsClusters||[],e.backingData.filtered.iamRoles=e.backingData.filtered.iamRoles||[],e.backingData.filtered.images=e.backingData.filtered.images||[],e.backingData.filtered.metricAlarms=e.backingData.filtered.metricAlarms||[],e.backingData.filtered.securityGroupNames=e.backingData.filtered.securityGroupNames||[],e.backingData.filtered.secrets=e.backingData.filtered.secrets||[],e.backingData.filtered.serviceDiscoveryRegistries=e.backingData.filtered.serviceDiscoveryRegistries||[],e.backingData.filtered.subnetTypes=e.backingData.filtered.subnetTypes||[],e.backingData.filtered.targetGroups=e.backingData.filtered.targetGroups||[],e.backingData.iamRoles=e.backingData.iamRoles||[],e.backingData.launchTypes=e.backingData.launchTypes||["EC2","FARGATE"],e.backingData.metricAlarms=e.backingData.metricAlarms||[],e.backingData.networkModes=e.backingData.networkModes||["bridge","host","awsvpc","none","default"],e.backingData.secrets=e.backingData.secrets||[],e.backingData.serviceDiscoveryRegistries=e.backingData.serviceDiscoveryRegistries||[],e.containerMappings=e.containerMappings||[],e.serviceDiscoveryAssociations=e.serviceDiscoveryAssociations||[],e.targetGroupMappings=e.targetGroupMappings||[],e.taskDefinitionArtifact=e.taskDefinitionArtifact||{},e.viewState=e.viewState||{},e.viewState.dirty=e.viewState.dirty||{},e.useTaskDefinitionArtifact=!0===e.useTaskDefinitionArtifact}attachEventHandlers(e){e.subnetTypeChanged=(t=e)=>(t.backingData.filtered.securityGroupNames=this.getSecurityGroupNames(t,t.backingData.securityGroups||{},t.backingData.subnets||[]),{dirty:{}}),e.regionChanged=(t=e)=>(this.reconcileLocation(t),this.syncCommand(t),this.configureCommand("",t),{dirty:{}}),e.credentialsChanged=(t=e)=>(this.reconcileLocation(t),this.syncCommand(t),this.configureCommand("",t),{dirty:{}}),e.placementStrategyNameChanged=(t=e)=>(t.placementStrategySequence=this.placementStrategyService.getPredefinedStrategy(t.placementStrategyName),{dirty:{}}),e.clusterChanged=()=>{e.moniker=V.getMoniker(e.application,e.stack,e.freeFormDetails)}}reconcileLocation(e){var t;const a=null==(t=e.backingData.credentialsKeyedByAccount)?void 0:t[e.credentials],r=(null==a?void 0:a.regions)||[];e.backingData.filtered.regions=r;const n=r.find(t=>t.name===e.region);n||(e.region=null);const i=(null==n?void 0:n.availabilityZones)||[];e.backingData.filtered.availabilityZones=i,e.availabilityZones=i}normalizeImages(e,t){const a=[...e.viewState.contextImages||[],e.imageDescription,...e.containerMappings.map(e=>e.imageDescription)].filter(Boolean);return Me([...t,...a].map(e=>Bt(e)),e=>e.imageId||e.id||e.name).filter(Boolean)}getSubnetTypes(e,t){return t.filter(t=>{const a=!e.credentials||t.account===e.credentials,r=!e.region||t.region===e.region;return a&&r&&t.purpose})}getClusterNames(e,t){return Ie(t.filter(t=>{const a=!e.credentials||t.account===e.credentials,r=!e.region||t.region===e.region;return a&&r}).map(e=>e.name).concat(e.ecsClusterName||[])).filter(Boolean)}getIamRoles(e,t){const a=t.filter(t=>t.accountName===e.credentials).map(e=>e.name).filter(Boolean);return a.length?["None (No IAM role)",...a]:a}getSecrets(e,t){return t.filter(t=>t.account===e.credentials&&t.region===e.region).map(e=>e.name).filter(Boolean)}getServiceDiscoveryRegistries(e,t){return t.filter(t=>t.account===e.credentials&&t.region===e.region).map(e=>({...e,displayName:e.displayName||`${e.name} (${e.id})`}))}getSecurityGroupNames(e,t,a){var r,n,i;const s=(null==(r=e.subnetTypes)?void 0:r[0])||e.subnetType;if(!s)return[];const l=a.find(t=>t.account===e.credentials&&t.region===e.region&&t.purpose===s),o=null==l?void 0:l.vpcId;return o?((null==(i=null==(n=null==t?void 0:t[e.credentials])?void 0:n.ecs)?void 0:i[e.region])||[]).filter(e=>e.vpcId===o).map(e=>e.name).filter(Boolean):[]}getTargetGroups(e,t){const a=t.flatMap(t=>(t.accounts||[]).filter(t=>t.name===e.credentials).flatMap(t=>(t.regions||[]).filter(t=>t.name===e.region).flatMap(e=>(e.loadBalancers||[]).flatMap(e=>(e.targetGroups||[]).map(e=>"string"==typeof e?e:e.targetGroupName))))),r=(e.targetGroupMappings||[]).map(e=>e.targetGroup);return Ie([...a,...r,e.targetGroup]).filter(Boolean)}getAvailableCapacityProviders(e,t){return Ie(t.filter(t=>!e.ecsClusterName||t.clusterName===e.ecsClusterName).flatMap(e=>e.capacityProviders||[]))}getDefaultCapacityProviderStrategy(e,t){return t.filter(t=>!e.ecsClusterName||t.clusterName===e.ecsClusterName).flatMap(e=>e.defaultCapacityProviderStrategy||[])}syncCommand(e,t=this.formik){this.command=e,null==t||t.setValues(e),this.setState({command:e})}render(){var e;const{application:t,dismissModal:a,title:r}=this.props,{command:n,loaded:i,requiresTemplateSelection:s}=this.state;return s?De.createElement(Y,{application:t,cloudProvider:"ecs",command:n,onDismiss:a,onTemplateSelected:this.templateSelected}):De.createElement(J,{closeModal:this.submit,dismissModal:a,heading:r,initialValues:n,loading:!i,submitButtonLabel:(null==(e=n.viewState)?void 0:e.submitButtonLabel)||"Done",taskMonitor:this.state.taskMonitor,validate:ua,render:({formik:e,nextIdx:a,wizard:r})=>{this.formik=e;const n=(t="")=>this.configureCommand(t,e.values),i=(t,a)=>this.updateCommand(e,t,a);return De.createElement(De.Fragment,null,De.createElement(Q,{label:"Basic Settings",order:a(),render:({innerRef:a})=>De.createElement(ga,{ref:a,validator:oa},De.createElement(Ht,{application:t,command:e.values,configureCommand:n,onFieldChange:i})),wizard:r}),De.createElement(Q,{label:"Networking",order:a(),render:()=>De.createElement(Yt,{application:t,command:e.values,configureCommand:n,onFieldChange:i}),wizard:r}),De.createElement(Q,{label:"Task Definition",order:a(),render:({innerRef:a})=>De.createElement(ga,{ref:a,validator:ca},De.createElement(ta,{application:t,command:e.values,configureCommand:n,onFieldChange:i})),wizard:r}),!e.values.useTaskDefinitionArtifact&&De.createElement(Q,{label:"Container",order:a(),render:({innerRef:a})=>De.createElement(ga,{ref:a,validator:da},De.createElement(_t,{application:t,command:e.values,configureCommand:n,onFieldChange:i})),wizard:r}),De.createElement(Q,{label:"Horizontal Scaling",order:a(),render:({innerRef:a})=>De.createElement(ga,{ref:a,validator:pa},De.createElement(jt,{application:t,command:e.values,configureCommand:n,onFieldChange:i})),wizard:r}),!e.values.useTaskDefinitionArtifact&&De.createElement(Q,{label:"Logging",order:a(),render:()=>De.createElement(Kt,{application:t,command:e.values,configureCommand:n,onFieldChange:i}),wizard:r}),De.createElement(Q,{label:"Service Discovery",order:a(),render:({innerRef:a})=>De.createElement(ga,{ref:a,validator:ma},De.createElement(Qt,{application:t,command:e.values,configureCommand:n,onFieldChange:i})),wizard:r}),De.createElement(Q,{label:"Advanced Settings",order:a(),render:()=>De.createElement(Ut,{application:t,command:e.values,configureCommand:n,onFieldChange:i}),wizard:r}))}})}}fa.contextType=O,fa.defaultProps={closeModal:ee,dismissModal:ee};const Ea=Object.assign(y(fa),{show:fa.show});function ba(e){const{desired:t,max:a,min:r}=e.capacity,n={};return(!Number.isFinite(r)||r<0)&&(n.min="Min cannot be negative"),(!Number.isFinite(a)||a<0)&&(n.max="Max cannot be negative"),(!Number.isFinite(t)||t<0)&&(n.desired="Desired cannot be negative"),Object.keys(n).length>0?{capacity:n}:(r>a?(n.min="Min cannot be larger than Max",n.max="Max cannot be smaller than Min"):t<r?n.desired="Desired cannot be smaller than Min":t>a&&(n.desired="Desired cannot be larger than Max"),Object.keys(n).length>0?{capacity:n}:{})}const Ca=class e extends De.Component{constructor(e){super(e),this.close=()=>this.props.dismissModal(),this.submit=e=>{if(!this.state.verified||Object.keys(ba(e)).length>0)return;const{application:t,serverGroup:a}=this.props,r={capacity:e.capacity,interestingHealthProviderNames:e.interestingHealthProviderNames,reason:e.reason};this.state.taskMonitor.submit(()=>this.context.services.serverGroupWriter.resizeServerGroup(a,t,r))};const{application:t,serverGroup:a}=e,r=t.attributes||{};this.state={initialValues:{capacity:{desired:Number(a.capacity.desired),max:Number(a.capacity.max),min:Number(a.capacity.min)},interestingHealthProviderNames:r.platformHealthOnlyShowOverride&&r.platformHealthOnly?["Ecs"]:void 0},taskMonitor:new K({application:t,title:`Resizing ${a.name}`,onDismiss:()=>this.props.dismissModal(),onTaskComplete:()=>t.serverGroups.refresh()}),verified:!1}}static show(t,a){return X.show(e,t,void 0,a)}capacityError(e){const t=e.capacity;return t&&[t.min,t.max,t.desired].find(Boolean)}render(){const{application:e,serverGroup:t}=this.props;return De.createElement(De.Fragment,null,De.createElement(te,{monitor:this.state.taskMonitor}),De.createElement(ae,{initialValues:this.state.initialValues,onSubmit:this.submit,validate:ba,render:a=>{var r;const n=this.capacityError(a.errors);return De.createElement(De.Fragment,null,De.createElement(re,{dismiss:this.close}),De.createElement(Le.Header,null,De.createElement(Le.Title,null,"Resize ",t.name)),De.createElement(Le.Body,null,De.createElement("form",{className:"form-horizontal"},De.createElement("div",{className:"form-group bold"},De.createElement("div",{className:"col-sm-2 col-sm-offset-3"},"Min"),De.createElement("div",{className:"col-sm-2"},"Max"),De.createElement("div",{className:"col-sm-2"},"Desired")),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-3 sm-label-right"},"Current"),["min","max","desired"].map(e=>De.createElement("div",{className:"col-sm-2",key:e},De.createElement("input",{className:"form-control input-sm",disabled:!0,type:"number",value:t.capacity[e]})))),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-3 sm-label-right"},"Resize to"),["min","max","desired"].map(e=>De.createElement("div",{className:"col-sm-2",key:e},De.createElement(ne,{name:`capacity.${e}`,input:e=>De.createElement(ie,{...e,min:0}),layout:({input:e})=>De.createElement(De.Fragment,null,e),touched:!0})))),n&&De.createElement("div",{className:"col-sm-9 col-sm-offset-3"},De.createElement(se,{message:n,type:"error"})),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-3 sm-label-right"},"Changes"),De.createElement("div",{className:"col-sm-9 sm-control-field"},De.createElement(le,{current:t.capacity,next:a.values.capacity}))),(null==(r=e.attributes)?void 0:r.platformHealthOnlyShowOverride)&&De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-10 col-sm-offset-1"},De.createElement(I,{interestingHealthProviderNames:a.values.interestingHealthProviderNames,onChange:e=>a.setFieldValue("interestingHealthProviderNames",e),platformHealthType:"Ecs",showHelpDetails:!0}))),De.createElement(oe,{reason:a.values.reason,onChange:e=>a.setFieldValue("reason",e)}))),De.createElement(Le.Footer,null,De.createElement(ce,{account:t.account,onValidChange:e=>this.setState({verified:e})}),De.createElement("button",{className:"btn btn-default",onClick:this.close,type:"button"},"Cancel"),De.createElement("button",{className:"btn btn-primary",disabled:!this.state.verified||!a.isValid,onClick:()=>this.submit(a.values),type:"submit"},"Submit")))}}))}};Ca.contextType=O,Ca.defaultProps={closeModal:ee,dismissModal:ee};let Na=Ca;function ka(e,t){var a;return"account"===t?e.account||e.accountId:e.cluster||(null==(a=e.moniker)?void 0:a.cluster)}function Sa(e,t){var a,r,n,i;const s=e,l=(null==(a=t.moniker)?void 0:a.app)||s.name;return((null==(r=s.serverGroups)?void 0:r.data)||(null==(i=null==(n=s.getDataSource)?void 0:n.call(s,"serverGroups"))?void 0:i.data)||[]).filter(e=>{var a;const r=(null==(a=e.moniker)?void 0:a.app)||e.application||l;return e.isDisabled&&r===l&&ka(e,"cluster")===ka(t,"cluster")&&ka(e,"account")===ka(t,"account")&&e.region===t.region}).sort((e,t)=>t.name.localeCompare(e.name))}function Da(e,t){const a={};return e.restoreServerGroupName?t&&!t.includes(e.restoreServerGroupName)&&(a.restoreServerGroupName="Select an eligible server group to restore"):a.restoreServerGroupName="Select a server group to restore",(!Number.isFinite(e.targetHealthyRollbackPercentage)||e.targetHealthyRollbackPercentage<0||e.targetHealthyRollbackPercentage>100)&&(a.targetHealthyRollbackPercentage="Healthy threshold must be between 0 and 100"),a}const Ga=class e extends De.Component{constructor(e){super(e),this.close=()=>this.props.dismissModal(),this.submit=e=>{var t;const a=Sa(this.props.application,this.props.serverGroup).map(({name:e})=>e);if(!this.state.verified||Object.keys(Da(e,a)).length>0)return;const{application:r,serverGroup:n}=this.props,i={interestingHealthProviderNames:e.interestingHealthProviderNames,platformHealthOnlyShowOverride:null==(t=r.attributes)?void 0:t.platformHealthOnlyShowOverride,reason:e.reason,rollbackContext:{restoreServerGroupName:e.restoreServerGroupName,rollbackServerGroupName:n.name,targetHealthyRollbackPercentage:e.targetHealthyRollbackPercentage},rollbackType:"EXPLICIT"};this.state.taskMonitor.submit(()=>this.context.services.serverGroupWriter.rollbackServerGroup(n,r,i))};const{application:t,serverGroup:a}=e,r=t.attributes||{};this.state={initialValues:{interestingHealthProviderNames:r.platformHealthOnlyShowOverride&&r.platformHealthOnly?["Ecs"]:void 0,targetHealthyRollbackPercentage:100},taskMonitor:new K({application:t,title:`Rollback ${a.name}`,onDismiss:()=>this.props.dismissModal(),onTaskComplete:()=>t.serverGroups.refresh()}),verified:!1}}static show(t,a){return X.show(e,t,void 0,a)}render(){const{application:e,serverGroup:t}=this.props,a=Sa(e,t);return De.createElement(De.Fragment,null,De.createElement(te,{monitor:this.state.taskMonitor}),De.createElement(ae,{initialValues:this.state.initialValues,onSubmit:this.submit,validate:e=>Da(e,a.map(({name:e})=>e)),render:r=>{var n;return De.createElement(De.Fragment,null,De.createElement(re,{dismiss:this.close}),De.createElement(Le.Header,null,De.createElement(Le.Title,null,"Rollback ",t.name)),De.createElement(Le.Body,null,De.createElement("form",{className:"form-horizontal"},De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-3 sm-label-right"},"Restore to"),De.createElement("div",{className:"col-sm-7"},De.createElement(ne,{name:"restoreServerGroupName",fastField:!0,input:e=>De.createElement(de,{...e,clearable:!1,stringOptions:a.map(({name:e})=>e)}),required:!0}))),(null==(n=e.attributes)?void 0:n.platformHealthOnlyShowOverride)&&De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-10 col-sm-offset-1"},De.createElement(I,{interestingHealthProviderNames:r.values.interestingHealthProviderNames,onChange:e=>r.setFieldValue("interestingHealthProviderNames",e),platformHealthType:"Ecs",showHelpDetails:!0}))),De.createElement(oe,{reason:r.values.reason,onChange:e=>r.setFieldValue("reason",e)}),De.createElement("div",{className:"form-group"},De.createElement("div",{className:"col-sm-3 sm-label-right"},"Healthy threshold"),De.createElement("div",{className:"col-sm-3"},De.createElement("input",{className:"form-control input-sm",max:100,min:0,name:"targetHealthyRollbackPercentage",onChange:e=>r.setFieldValue("targetHealthyRollbackPercentage",Number(e.target.value)),type:"number",value:r.values.targetHealthyRollbackPercentage})),De.createElement("div",{className:"col-sm-2 sm-control-field"},"percent")),r.errors.targetHealthyRollbackPercentage&&De.createElement("div",{className:"col-sm-7 col-sm-offset-3"},De.createElement(se,{message:r.errors.targetHealthyRollbackPercentage,type:"error"})))),De.createElement(Le.Footer,null,De.createElement(ce,{account:t.account,onValidChange:e=>this.setState({verified:e})}),De.createElement("button",{className:"btn btn-default",onClick:this.close,type:"button"},"Cancel"),De.createElement("button",{className:"btn btn-primary",disabled:!this.state.verified||!r.isValid,onClick:()=>this.submit(r.values),type:"submit"},"Submit")))}}))}};Ga.contextType=O,Ga.defaultProps={closeModal:ee,dismissModal:ee};let Aa=Ga;const Pa={destroy:{present:"Destroy",progressive:"Destroying"},disable:{present:"Disable",progressive:"Disabling"},enable:{present:"Enable",progressive:"Enabling"}};const wa=y(function({app:e,serverGroup:t,stateService:a}){const r=me(),{serverGroupWriter:n}=r;if(!l.adHocInfraWritesEnabled)return null;const i=c.feature&&c.feature.entityTags,s=pe.buildClusterTargets(t),o=t.isDisabled&&(t.runningTasks||[]).some(e=>{var t;return((null==(t=e.execution)?void 0:t.stages)||[]).some(e=>"resizeServerGroup"===e.type)}),d=r=>{const i=Pa[r],s={name:t.name,accountId:t.account,region:t.region},l={header:`Really ${r} ${t.name}?`,buttonText:`${i.present} ${t.name}`,account:t.account,taskMonitorConfig:{application:e,title:`${i.progressive} ${t.name}`,..."destroy"===r?{onTaskComplete:()=>{a.includes("**.serverGroup",s)&&a.go("^")}}:{}},platformHealthOnlyShowOverride:e.attributes.platformHealthOnlyShowOverride,platformHealthType:"Ecs",interestingHealthProviderNames:e.attributes.platformHealthOnlyShowOverride&&e.attributes.platformHealthOnly?["Ecs"]:void 0,submitMethod:a=>"destroy"===r?n.destroyServerGroup(t,e,a):"disable"===r?n.disableServerGroup(t,e.name,a):n.enableServerGroup(t,e,a),askForReason:!0};"destroy"===r?he.addDestroyWarningMessage(e,t,l):"disable"===r&&he.addDisableWarningMessage(e,t,l),ve.confirm(l)};return De.createElement(Oe,{className:"dropdown",id:"server-group-actions-dropdown"},De.createElement(Oe.Toggle,{className:"btn btn-sm btn-primary dropdown-toggle"},"Server Group Actions"),De.createElement(Oe.Menu,{className:"dropdown-menu"},!t.isDisabled&&De.createElement(ue,{resource:t,application:e,onClick:()=>Aa.show({application:e,serverGroup:t},r)},"Rollback"),De.createElement(ue,{resource:t,application:e,onClick:()=>Na.show({application:e,serverGroup:t},r)},"Resize"),!t.isDisabled&&De.createElement(ue,{resource:t,application:e,onClick:()=>d("disable")},"Disable"),t.isDisabled&&!o&&De.createElement(ue,{resource:t,application:e,onClick:()=>d("enable")},"Enable"),o&&De.createElement("li",{className:"disabled"},De.createElement(qe,{id:"ecs-enable-locked-tooltip",value:"Cannot enable this server group until resize operation completes",placement:"left"},De.createElement("a",null,De.createElement("span",{className:"small glyphicon glyphicon-lock"})," Enable"))),De.createElement(ue,{resource:t,application:e,onClick:()=>d("destroy")},"Destroy"),i&&De.createElement(ge,{component:t,application:e,entityType:"serverGroup",ownerOptions:s,onUpdate:()=>e.serverGroups.refresh()})))});class Ta{addComparator(e){if(e.comparisonOperator)switch(e.comparisonOperator){case"LessThanThreshold":e.comparator="&lt;";break;case"GreaterThanThreshold":e.comparator="&gt;";break;case"LessThanOrEqualToThreshold":e.comparator="&le;";break;case"GreaterThanOrEqualToThreshold":e.comparator="&ge;"}}addAdjustmentAttributes(e){e.operator=e.scalingAdjustment<0?"decrease":"increase",e.absAdjustment=Math.abs(e.scalingAdjustment)}transformScalingPolicy(e){const t={...e},a=(e,t)=>t.metricIntervalUpperBound-e.metricIntervalUpperBound,r=(e,t)=>e.metricIntervalLowerBound-t.metricIntervalLowerBound;if(t.alarms=e.alarms||[],t.alarms.forEach(e=>this.addComparator(e)),this.addAdjustmentAttributes(t),t.stepAdjustments&&t.stepAdjustments.length){t.stepAdjustments.forEach(e=>this.addAdjustmentAttributes(e));const n=e.stepAdjustments.every(e=>void 0!==e.metricIntervalUpperBound)?a:r;t.stepAdjustments.sort((e,t)=>n(e,t))}return t}normalizeServerGroupDetails(e){const t={...e};return e.scalingPolicies&&(t.scalingPolicies=e.scalingPolicies.map(e=>this.transformScalingPolicy(e))),t}normalizeServerGroup(e){return e.instances.forEach(t=>{t.vpcId=e.vpcId}),r.listVpcs().then(t=>this.addVpcNameToServerGroup(e)(t))}addVpcNameToServerGroup(e){return t=>{const a=t.find(t=>t.id===e.vpcId);return e.vpcName=a?a.name:"",e}}convertServerGroupCommandToDeployConfiguration(e){const t=xe({backingData:[],viewState:[]},e);return t.cloudProvider="ecs",t.availabilityZones={},t.availabilityZones[t.region]=e.availabilityZones,t.loadBalancers=(e.loadBalancers||[]).concat(e.vpcLoadBalancers||[]),t.targetGroup=e.targetGroup||"",t.account=t.credentials,t.subnetType=t.subnetType||"","clone"!==e.viewState.mode&&delete t.source,delete t.region,delete t.viewState,delete t.backingData,delete t.selectedProvider,delete t.instanceProfile,delete t.vpcId,t}}function Ia(e,t){const{app:a,serverGroup:r}=e;return new $e(e=>{let n,i=!1;return a.ready().then(()=>{if(i)return null;if(n=a.serverGroups.data.find(e=>e.name===r.name&&e.account===r.accountId&&e.region===r.region),!n){const e=a.loadBalancers.data.find(e=>e.account===r.accountId&&e.region===r.region);n=null==e?void 0:e.serverGroups.find(e=>e.name===r.name)}return ye.getServerGroup(a.name,r.accountId,r.region,r.name)}).then(a=>{if(i||null===a)return;if(we(a))return t(),void e.complete();const s={...a,...n,account:r.accountId};e.next((new Ta).normalizeServerGroupDetails(s)),e.complete()}).catch(()=>{i||(t(),e.complete())}),()=>{i=!0}})}function Fa({serverGroup:e}){const t=e.taskDefinition||{};return De.createElement(p,{heading:"Task Definition",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"Task Name"),De.createElement("dd",null,t.taskName),De.createElement("dt",null,"Container URL"),De.createElement("dd",null,t.containerImage),De.createElement("dt",null,"Container IAM Profile"),De.createElement("dd",null,t.iamRole),null!=t.containerPort&&De.createElement(De.Fragment,null,De.createElement("dt",null,"Container Port"),De.createElement("dd",null,t.containerPort)),De.createElement("dt",null,"Container CPU Units"),De.createElement("dd",null,t.cpuUnits),null!=t.memoryReservation&&De.createElement(De.Fragment,null,De.createElement("dt",null,"Container Reserved Memory"),De.createElement("dd",null,t.memoryReservation," MB")),null!=t.memoryLimit&&De.createElement(De.Fragment,null,De.createElement("dt",null,"Container Memory Limit"),De.createElement("dd",null,t.memoryLimit," MB"))))}function Ma({serverGroup:e}){var t;const a=(null==(t=e.taskDefinition)?void 0:t.environmentVariables)||[];return De.createElement(p,{heading:"Environment Variables"},0===a.length?De.createElement("div",null,"This server group has no environment variables"):De.createElement("dl",{className:"dl-horizontal dl-narrow"},a.map(e=>De.createElement(De.Fragment,{key:e.name},De.createElement("dt",null,e.name),De.createElement("dd",null,e.value)))))}function xa({serverGroup:e}){return!e.instanceCounts||e.instanceCounts.total<=0?null:De.createElement(p,{heading:"Health",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"Instances"),De.createElement("dd",null,De.createElement(fe,{container:e.instanceCounts,className:"pull-left"}))))}function Ra({serverGroup:e}){const t=e.securityGroups||[];return De.createElement(p,{heading:z.get("Firewalls")},De.createElement("ul",null,t.map(e=>De.createElement("li",{key:e},e))))}function Ba({serverGroup:e}){var t;const a=e.capacity||{};return De.createElement(p,{heading:"Capacity"},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"Current"),De.createElement("dd",null,(null==(t=e.instances)?void 0:t.length)||0),De.createElement("dt",null,"Desired"),De.createElement("dd",null,a.desired),De.createElement("dt",null,"Min"),De.createElement("dd",null,a.min),De.createElement("dt",null,"Max"),De.createElement("dd",null,a.max)))}function za({serverGroup:e}){const t=e.metricAlarms||[];return De.createElement(p,{heading:"Scaling Policies"},t.length?De.createElement("ul",null,t.map(e=>De.createElement("li",{key:e},e))):De.createElement("i",null,"There are no scaling policies assigned."))}function La({serverGroup:e}){var t;const a=e.buildInfo;if(!a)return null;const r=function(e){return e.buildInfoUrl?e.buildInfoUrl:e.jenkins?`${e.jenkins.host.replace(/\/?$/,"/")}job/${e.jenkins.name}/${e.jenkins.number}`:null}(a);return De.createElement(p,{heading:"Build Data"},De.createElement("dl",{className:"dl-horizontal dl-narrow"},a.jenkins&&De.createElement(De.Fragment,null,De.createElement("dt",null,"Job"),De.createElement("dd",null,a.jenkins.name),De.createElement("dt",null,"Build"),De.createElement("dd",null,a.jenkins.number)),De.createElement("dt",null,"Package"),De.createElement("dd",null,a.package_name),De.createElement("dt",null,"Commit"),De.createElement("dd",null,null==(t=a.commit)?void 0:t.substring(0,8)),De.createElement("dt",null,"Version"),De.createElement("dd",null,a.version),r&&De.createElement(De.Fragment,null,De.createElement("dt",null,"Build Link"),De.createElement("dd",null,De.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:r},r)))))}class Oa{static getEvents(e){return q("/applications").path(e.app,"serverGroups",e.account,e.name,"events").query({region:e.region,provider:e.cloudProvider}).get()}}class qa extends De.Component{constructor(){super(...arguments),this.state={loading:!0,error:!1,events:[]},this.mounted=!1,this.requestId=0}componentDidMount(){this.mounted=!0,this.loadEvents()}componentDidUpdate(e){e.serverGroup!==this.props.serverGroup&&this.loadEvents()}componentWillUnmount(){this.mounted=!1,this.requestId++}loadEvents(){const e=++this.requestId;this.setState({loading:!0,error:!1,events:[]}),Oa.getEvents(this.props.serverGroup).then(t=>{this.mounted&&e===this.requestId&&this.setState({loading:!1,error:!1,events:t})},()=>{this.mounted&&e===this.requestId&&this.setState({loading:!1,error:!0,events:[]})})}render(){const{dismissModal:e,serverGroup:t}=this.props,{loading:a,error:r,events:n}=this.state;return De.createElement(De.Fragment,null,De.createElement(Ee,null,`Server Group Events for ${t.name}`),De.createElement(be,null,a&&De.createElement("div",{className:"horizontal center middle sp-margin-xl-yaxis"},De.createElement(C,{size:"small"})),!a&&r&&De.createElement("div",{className:"text-center"},De.createElement("p",null,`There was an error loading events for ${t.name}. Please try again later.`)),!a&&!r&&0===n.length&&De.createElement("div",{className:"text-center"},De.createElement("p",null,`No ECS events found for ${t.name}.`)),!a&&!r&&n.map((e,t)=>De.createElement("div",{key:e.id||t},De.createElement("p",{className:"clearfix"},De.createElement("span",{className:`label label-${"Success"===e.status?"success":"Transition"===e.status?"info":"danger"} pull-left`},e.status),De.createElement("span",{className:"label label-default pull-right"},N(e.createdAt))),De.createElement("div",null,e.message),t<n.length-1&&De.createElement("hr",null)))),De.createElement(Ce,{primaryActions:De.createElement("button",{className:"btn btn-primary",onClick:e},"Close")}))}}function Ua({serverGroup:e}){return De.createElement("a",{href:"#",onClick:t=>{t.preventDefault(),X.show(qa,{serverGroup:e})}},"View Events")}function $a({serverGroup:e}){return De.createElement(p,{heading:"ECS Events"},De.createElement(Ua,{serverGroup:e}))}function Ha({serverGroup:e}){return De.createElement(p,{heading:"Server Group Information",defaultExpanded:!0},De.createElement("dl",{className:"dl-horizontal dl-narrow"},De.createElement("dt",null,"Account"),De.createElement("dd",null,De.createElement(k,{account:e.account})),De.createElement("dt",null,"Region"),De.createElement("dd",null,e.region),De.createElement("dt",null,"Created"),De.createElement("dd",null,e.createdTime?N(e.createdTime):"Unknown"),De.createElement("dt",null,"ECS Cluster"),De.createElement("dd",null,e.ecsCluster),De.createElement("dt",null,"VPC ID"),De.createElement("dd",null,e.vpcId)))}function Va(){ke.registerProvider("ecs",{name:"EC2 Container Service",adHocInfrastructureWritesEnabled:l.adHocInfraWritesEnabled,logo:{path:"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"},serverGroup:{transformer:Ta,detailsActions:wa,detailsGetter:Ia,detailsSections:[Ha,Fa,Ma,xa,Ra,Ba,za,La,$a],CloneServerGroupModal:Ea,commandBuilder:xt,scalingActivitiesEnabled:!1,skipUpstreamStageCheck:!0},loadBalancer:{transformer:nt,ClusterContainer:et,targetGroupDetails:rt,details:at},instance:{details:Je},securityGroup:{transformer:wt,reader:Pt,details:At}})}function _a(){M.pipeline.registerStage({provides:"cloneServerGroup",cloudProvider:"ecs",component:kt,executionStepLabelComponent:e=>De.createElement(st,{action:"Clone Server Group",useSource:!0,...e}),accountExtractor:e=>[e.context.credentials],validators:[{type:"requiredField",fieldName:"targetCluster",fieldLabel:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"region"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"destroyServerGroup",alias:"destroyAsg",cloudProvider:"ecs",component:vt,executionStepLabelComponent:e=>De.createElement(st,{action:"Destroy Server Group",...e}),accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to destroy a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"disableServerGroup",alias:"disableAsg",cloudProvider:"ecs",component:yt,executionStepLabelComponent:e=>De.createElement(st,{action:"Disable Server Group",...e}),validators:[{type:"targetImpedance",message:"This pipeline will attempt to disable a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"disableCluster",cloudProvider:"ecs",component:Et,validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"remainingEnabledServerGroups",fieldLabel:"Keep [X] enabled Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"enableServerGroup",alias:"enableAsg",cloudProvider:"ecs",component:ft,executionStepLabelComponent:e=>De.createElement(st,{action:"Enable Server Group",...e}),validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"findImageFromTags",cloudProvider:"ecs",component:bt,executionDetailsSections:[Dt,B],validators:[{type:"requiredField",fieldName:"imageLabelOrSha"}]}),M.pipeline.registerStage({provides:"resizeServerGroup",alias:"resizeAsg",cloudProvider:"ecs",component:St,executionStepLabelComponent:e=>De.createElement(st,{action:"Resize Server Group",...e}),accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to resize a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"action"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]}),M.pipeline.registerStage({provides:"scaleDownCluster",cloudProvider:"ecs",component:Ct,accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"remainingFullSizeServerGroups",fieldLabel:"Keep [X] full size Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}],strategy:!0}),M.pipeline.registerStage({provides:"shrinkCluster",cloudProvider:"ecs",component:Nt,accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"shrinkToSize",fieldLabel:"shrink to [X] Server Groups"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}!function(e,t){void 0===t&&(t={});var a=t.insertAt;if("undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css","top"===a&&r.firstChild?r.insertBefore(n,r.firstChild):r.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}}('.cloud-provider-logo .icon-ecs {\n -webkit-mask-image: url("data:image/svg+xml,%3Csvg id%3D%22Layer_1%22 data-name%3D%22Layer 1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%22100%22 height%3D%22100%22 viewBox%3D%220 0 100 100%22%3E %3Ctitle%3ECompute%3C%2Ftitle%3E %3Cg%3E %3Cpolygon points%3D%2219.64 22.51 16 24.32 16 75.68 19.64 77.49 33.98 51.07 19.64 22.51%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2230.72 31.78 36.08 24.19 60.1 34.87 54.5 35.76 30.72 31.78%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2226.56 68.77 32.46 76.88 60.1 64.95 54.76 64.12 26.56 68.77%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2228.12 75.5 19.64 77.49 19.64 22.51 28.12 24.44 28.12 75.5%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2223.66 20.5 28.12 18.27 36.52 53.56 28.12 81.73 23.66 79.5 23.66 20.5%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2254.46 64.08 60.1 64.95 65.26 50.58 60.1 34.87 54.46 35.76 54.46 64.08%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2236.8 79.28 28.12 81.73 28.12 18.27 36.8 20.73 36.8 79.28%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.01 63.84 28.12 70.88 28.12 81.73 66.01 71.03 66.01 63.84%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.08 36 28.12 28.79 28.12 18.27 66.08 29.04 66.08 36%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2260.1 27.34 66.19 29.02 66.19 71.03 60.1 72.7 60.1 27.34%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2284 44.45 67.7 45.22 61.94 44.83 78.42 31.55 84 44.45%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2261.94 44.83 78.42 43.9 78.42 31.55 61.94 34.22 61.94 44.83%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 26.96 71.62 43.22 54.31 44.32 46.43 43.79%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 42.37 63.13 26.96 46.43 30.87 46.43 43.79%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2261.94 55.39 84 55.77 78.42 68.67 61.94 66 61.94 55.39%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 71.62 57.01 63.13 73.26 46.43 69.36 46.43 56.43%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 63.13 57.86 71.62 57.01 54.31 55.9 46.43 56.43%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2284 55.77 67.7 55.01 61.94 55.39 78.42 56.33 84 55.77%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2278.42 43.9 84 44.45 84 33.22 78.42 31.55 78.42 43.9%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 43.22 63.13 42.37 63.13 26.96 71.62 29.51 71.62 43.22%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2278.42 56.33 84 55.77 84 67 78.42 68.67 78.42 56.33%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 57.01 63.13 57.86 63.13 73.26 71.62 70.72 71.62 57.01%22 fill%3D%22%23f58536%22%2F%3E %3C%2Fg%3E%3C%2Fsvg%3E");\n mask-image: url("data:image/svg+xml,%3Csvg id%3D%22Layer_1%22 data-name%3D%22Layer 1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%22100%22 height%3D%22100%22 viewBox%3D%220 0 100 100%22%3E %3Ctitle%3ECompute%3C%2Ftitle%3E %3Cg%3E %3Cpolygon points%3D%2219.64 22.51 16 24.32 16 75.68 19.64 77.49 33.98 51.07 19.64 22.51%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2230.72 31.78 36.08 24.19 60.1 34.87 54.5 35.76 30.72 31.78%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2226.56 68.77 32.46 76.88 60.1 64.95 54.76 64.12 26.56 68.77%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2228.12 75.5 19.64 77.49 19.64 22.51 28.12 24.44 28.12 75.5%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2223.66 20.5 28.12 18.27 36.52 53.56 28.12 81.73 23.66 79.5 23.66 20.5%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2254.46 64.08 60.1 64.95 65.26 50.58 60.1 34.87 54.46 35.76 54.46 64.08%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2236.8 79.28 28.12 81.73 28.12 18.27 36.8 20.73 36.8 79.28%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.01 63.84 28.12 70.88 28.12 81.73 66.01 71.03 66.01 63.84%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2266.08 36 28.12 28.79 28.12 18.27 66.08 29.04 66.08 36%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2260.1 27.34 66.19 29.02 66.19 71.03 60.1 72.7 60.1 27.34%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2284 44.45 67.7 45.22 61.94 44.83 78.42 31.55 84 44.45%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2261.94 44.83 78.42 43.9 78.42 31.55 61.94 34.22 61.94 44.83%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 26.96 71.62 43.22 54.31 44.32 46.43 43.79%22 fill%3D%22%236b3a19%22%2F%3E %3Cpolygon points%3D%2246.43 43.79 63.13 42.37 63.13 26.96 46.43 30.87 46.43 43.79%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2261.94 55.39 84 55.77 78.42 68.67 61.94 66 61.94 55.39%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 71.62 57.01 63.13 73.26 46.43 69.36 46.43 56.43%22 fill%3D%22%239d5025%22%2F%3E %3Cpolygon points%3D%2246.43 56.43 63.13 57.86 71.62 57.01 54.31 55.9 46.43 56.43%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2284 55.77 67.7 55.01 61.94 55.39 78.42 56.33 84 55.77%22 fill%3D%22%23fbbf93%22%2F%3E %3Cpolygon points%3D%2278.42 43.9 84 44.45 84 33.22 78.42 31.55 78.42 43.9%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 43.22 63.13 42.37 63.13 26.96 71.62 29.51 71.62 43.22%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2278.42 56.33 84 55.77 84 67 78.42 68.67 78.42 56.33%22 fill%3D%22%23f58536%22%2F%3E %3Cpolygon points%3D%2271.62 57.01 63.13 57.86 63.13 73.26 71.62 70.72 71.62 57.01%22 fill%3D%22%23f58536%22%2F%3E %3C%2Fg%3E%3C%2Fsvg%3E");\n}\n'),Va(),_a(),Ne.registerProvider("ecs",["redblack"]);export{Pt as EcsSecurityGroupReader,wt as EcsSecurityGroupTransformer,xt as EcsServerGroupCommandBuilder,Ta as EcsServerGroupTransformer,_a as registerEcsPipelineStages,Va as registerEcsProvider};
2
2
  //# sourceMappingURL=index.js.map