@spinnaker/amazon 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 (404) hide show
  1. package/dist/aws.module.d.ts +2 -1
  2. package/dist/aws.services.d.ts +8 -0
  3. package/dist/certificates/AmazonCertificateReader.d.ts +1 -1
  4. package/dist/domain/IAmazonServerGroup.d.ts +10 -0
  5. package/dist/function/CreateLambdaFunction.d.ts +10 -5
  6. package/dist/function/configure/Network.d.ts +3 -0
  7. package/dist/function/details/FunctionActions.d.ts +3 -0
  8. package/dist/function/function.transformer.d.ts +1 -0
  9. package/dist/image/image.reader.d.ts +2 -2
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/instance/amazon.instance.write.service.d.ts +5 -5
  14. package/dist/instance/awsInstanceType.service.d.ts +13 -2
  15. package/dist/instance/details/AmazonInstanceDetails.d.ts +67 -0
  16. package/dist/instance/index.d.ts +1 -0
  17. package/dist/keyPairs/KeyPairsReader.d.ts +1 -1
  18. package/dist/loadBalancer/AmazonLoadBalancersTag.d.ts +7 -4
  19. package/dist/loadBalancer/OidcConfigReader.d.ts +1 -1
  20. package/dist/loadBalancer/TargetGroupDetails.d.ts +37 -3
  21. package/dist/loadBalancer/amazonLoadBalancerDataUtils.d.ts +1 -1
  22. package/dist/loadBalancer/configure/AmazonLoadBalancerChoiceModal.d.ts +6 -2
  23. package/dist/loadBalancer/configure/LoadBalancerTypes.d.ts +4 -4
  24. package/dist/loadBalancer/configure/application/CreateApplicationLoadBalancer.d.ts +10 -5
  25. package/dist/loadBalancer/configure/classic/CreateClassicLoadBalancer.d.ts +12 -7
  26. package/dist/loadBalancer/configure/common/SecurityGroups.d.ts +4 -0
  27. package/dist/loadBalancer/configure/network/CreateNetworkLoadBalancer.d.ts +10 -5
  28. package/dist/loadBalancer/details/LoadBalancerActions.d.ts +9 -2
  29. package/dist/loadBalancer/details/amazonLoadBalancerDetails.d.ts +22 -0
  30. package/dist/loadBalancer/index.d.ts +1 -0
  31. package/dist/loadBalancer/loadBalancer.transformer.d.ts +1 -1
  32. package/dist/pipeline/stages/AmazonStageConfig.d.ts +11 -0
  33. package/dist/pipeline/stages/bake/AwsBakeStageConfig.d.ts +66 -0
  34. package/dist/pipeline/stages/cloneServerGroup/AwsCloneServerGroupStageConfig.d.ts +20 -0
  35. package/dist/pipeline/stages/deleteLambda/index.d.ts +1 -1
  36. package/dist/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.d.ts +5 -4
  37. package/dist/pipeline/stages/deployCloudFormation/DeployCloudFormationStackStageConfig.d.ts +3 -0
  38. package/dist/pipeline/stages/deployCloudFormation/deployCloudFormationStackStage.d.ts +1 -1
  39. package/dist/pipeline/stages/deployCloudFormation/evaluateCloudFormationChangeSetExecution.service.d.ts +1 -3
  40. package/dist/pipeline/stages/deployLambda/index.d.ts +1 -1
  41. package/dist/pipeline/stages/destroyAsg/awsDestroyAsgStage.d.ts +26 -2
  42. package/dist/pipeline/stages/disableAsg/AwsDisableAsgStageConfig.d.ts +27 -0
  43. package/dist/pipeline/stages/disableCluster/AwsDisableClusterStageConfig.d.ts +19 -0
  44. package/dist/pipeline/stages/enableAsg/AwsEnableAsgStageConfig.d.ts +20 -0
  45. package/dist/pipeline/stages/findAmi/awsFindAmiStage.d.ts +17 -2
  46. package/dist/pipeline/stages/findImageFromTags/AwsFindImageFromTagsStageConfig.d.ts +3 -0
  47. package/dist/pipeline/stages/findImageFromTags/awsFindImageFromTagsStage.d.ts +12 -2
  48. package/dist/pipeline/stages/invokeLambda/index.d.ts +1 -1
  49. package/dist/pipeline/stages/modifyScalingProcess/ModifyScalingProcessStageConfig.d.ts +3 -0
  50. package/dist/pipeline/stages/modifyScalingProcess/modifyScalingProcessStage.d.ts +20 -2
  51. package/dist/pipeline/stages/modifyWarmPool/ModifyWarmPoolStageConfig.d.ts +3 -0
  52. package/dist/pipeline/stages/modifyWarmPool/modifyWarmPoolStage.d.ts +20 -0
  53. package/dist/pipeline/stages/resizeAsg/AwsResizeAsgStageConfig.d.ts +17 -0
  54. package/dist/pipeline/stages/resizeAsg/awsResizeAsgStage.d.ts +40 -2
  55. package/dist/pipeline/stages/rollbackCluster/AwsRollbackClusterStageConfig.d.ts +19 -0
  56. package/dist/pipeline/stages/routeLambda/index.d.ts +1 -1
  57. package/dist/pipeline/stages/scaleDownCluster/AwsScaleDownClusterStageConfig.d.ts +22 -0
  58. package/dist/pipeline/stages/shrinkCluster/AwsShrinkClusterStageConfig.d.ts +21 -0
  59. package/dist/pipeline/stages/tagImage/awsTagImageStage.d.ts +5 -2
  60. package/dist/pipeline/stages/updateCodeLambda/index.d.ts +1 -1
  61. package/dist/search/searchResultFormatter.d.ts +4 -2
  62. package/dist/securityGroup/configure/AmazonSecurityGroupModal.d.ts +43 -0
  63. package/dist/securityGroup/details/AmazonSecurityGroupDetails.d.ts +62 -0
  64. package/dist/securityGroup/details/index.d.ts +1 -0
  65. package/dist/securityGroup/index.d.ts +1 -0
  66. package/dist/securityGroup/securityGroup.reader.d.ts +0 -1
  67. package/dist/securityGroup/securityGroup.transformer.d.ts +11 -2
  68. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +23 -7
  69. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +17 -13
  70. package/dist/serverGroup/configure/wizard/AmazonCloneServerGroupModal.d.ts +16 -6
  71. package/dist/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.d.ts +6 -3
  72. package/dist/serverGroup/configure/wizard/pages/ServerGroupLoadBalancers.d.ts +3 -0
  73. package/dist/serverGroup/configure/wizard/securityGroups/SecurityGroupSelector.d.ts +4 -0
  74. package/dist/serverGroup/details/AmazonServerGroupActions.d.ts +10 -2
  75. package/dist/serverGroup/details/advancedSettings/EditAsgAdvancedSettingsModal.d.ts +17 -0
  76. package/dist/serverGroup/details/advancedSettings/index.d.ts +1 -0
  77. package/dist/serverGroup/details/resize/AmazonResizeServerGroupModal.d.ts +5 -3
  78. package/dist/serverGroup/details/rollback/AmazonRollbackServerGroupModal.d.ts +67 -0
  79. package/dist/serverGroup/details/rollback/index.d.ts +2 -0
  80. package/dist/serverGroup/details/rollback/rollbackServerGroupSelection.d.ts +9 -0
  81. package/dist/serverGroup/details/scalingPolicy/ScalingPolicyWriter.d.ts +2 -2
  82. package/dist/serverGroup/details/scalingPolicy/upsert/alarm/DimensionsEditor.d.ts +0 -1
  83. package/dist/serverGroup/details/scalingProcesses/ModifyScalingProcessesModal.d.ts +24 -0
  84. package/dist/serverGroup/details/scalingProcesses/index.d.ts +2 -0
  85. package/dist/serverGroup/details/scheduledActions/EditScheduledActionsModal.d.ts +31 -0
  86. package/dist/serverGroup/details/scheduledActions/index.d.ts +1 -0
  87. package/dist/serverGroup/details/sections/AdvancedSettingsDetailsSection.d.ts +3 -0
  88. package/dist/serverGroup/details/sections/AmazonCapacityDetailsSection.d.ts +3 -0
  89. package/dist/serverGroup/details/sections/ScalingProcessesDetailsSection.d.ts +1 -1
  90. package/dist/serverGroup/details/sections/ScheduledActionsDetailsSection.d.ts +1 -1
  91. package/dist/serverGroup/details/sections/SecurityGroupsDetailsSection.d.ts +4 -1
  92. package/dist/serverGroup/details/sections/WarmPoolDetailsSection.d.ts +6 -0
  93. package/dist/serverGroup/details/sections/index.d.ts +1 -0
  94. package/dist/serverGroup/details/securityGroups/EditSecurityGroupsModal.d.ts +32 -0
  95. package/dist/serverGroup/details/securityGroups/index.d.ts +1 -0
  96. package/dist/serverGroup/details/warmPool/ModifyWarmPoolModal.d.ts +26 -0
  97. package/dist/serverGroup/details/warmPool/WarmPoolService.d.ts +6 -0
  98. package/dist/serverGroup/details/warmPool/index.d.ts +2 -0
  99. package/dist/serverGroup/serverGroup.transformer.d.ts +1 -2
  100. package/dist/vpc/VpcReader.d.ts +2 -2
  101. package/dist/vpc/index.d.ts +1 -0
  102. package/package.json +3 -12
  103. package/src/aws.module.spec.ts +296 -0
  104. package/src/aws.module.ts +107 -112
  105. package/src/aws.services.ts +21 -0
  106. package/src/certificates/AmazonCertificateReader.ts +1 -1
  107. package/src/domain/IAmazonServerGroup.ts +9 -0
  108. package/src/function/CreateLambdaFunction.tsx +29 -16
  109. package/src/function/configure/Network.tsx +8 -4
  110. package/src/function/details/AmazonFunctionDetails.tsx +4 -5
  111. package/src/function/details/FunctionActions.tsx +5 -1
  112. package/src/function/function.transformer.ts +4 -0
  113. package/src/image/image.reader.ts +3 -5
  114. package/src/index.ts +2 -2
  115. package/src/instance/amazon.instance.write.service.ts +15 -4
  116. package/src/instance/awsInstanceType.service.spec.js +172 -136
  117. package/src/instance/awsInstanceType.service.ts +142 -154
  118. package/src/instance/details/AmazonInstanceDetails.spec.tsx +79 -0
  119. package/src/instance/details/AmazonInstanceDetails.tsx +644 -0
  120. package/src/instance/details/InstanceInformation.tsx +11 -14
  121. package/src/instance/details/InstanceSecurityGroups.tsx +20 -23
  122. package/src/instance/details/InstanceTags.tsx +5 -3
  123. package/src/instance/index.ts +1 -0
  124. package/src/keyPairs/KeyPairsReader.ts +1 -1
  125. package/src/loadBalancer/AmazonLoadBalancersTag.spec.tsx +39 -0
  126. package/src/loadBalancer/AmazonLoadBalancersTag.tsx +21 -14
  127. package/src/loadBalancer/OidcConfigReader.ts +1 -1
  128. package/src/loadBalancer/TargetGroupDetails.spec.tsx +113 -0
  129. package/src/loadBalancer/TargetGroupDetails.tsx +287 -7
  130. package/src/loadBalancer/amazonLoadBalancerDataUtils.ts +21 -21
  131. package/src/loadBalancer/configure/AmazonLoadBalancerChoiceModal.tsx +17 -4
  132. package/src/loadBalancer/configure/LoadBalancerTypes.ts +7 -4
  133. package/src/loadBalancer/configure/application/ALBListeners.tsx +1 -2
  134. package/src/loadBalancer/configure/application/CreateApplicationLoadBalancer.tsx +28 -18
  135. package/src/loadBalancer/configure/classic/CreateClassicLoadBalancer.tsx +29 -19
  136. package/src/loadBalancer/configure/common/LoadBalancerLocation.tsx +1 -1
  137. package/src/loadBalancer/configure/common/SecurityGroups.spec.tsx +27 -0
  138. package/src/loadBalancer/configure/common/SecurityGroups.tsx +11 -5
  139. package/src/loadBalancer/configure/network/CreateNetworkLoadBalancer.tsx +28 -18
  140. package/src/loadBalancer/details/LoadBalancerActions.tsx +19 -5
  141. package/src/loadBalancer/details/amazonLoadBalancerDetails.spec.tsx +141 -0
  142. package/src/loadBalancer/details/amazonLoadBalancerDetails.tsx +599 -0
  143. package/src/loadBalancer/index.ts +1 -0
  144. package/src/loadBalancer/loadBalancer.transformer.ts +3 -4
  145. package/src/pipeline/stages/AmazonStageConfig.spec.tsx +103 -0
  146. package/src/pipeline/stages/AmazonStageConfig.tsx +259 -0
  147. package/src/pipeline/stages/bake/AwsBakeStageConfig.tsx +708 -0
  148. package/src/pipeline/stages/cloneServerGroup/AwsCloneServerGroupStageConfig.tsx +275 -0
  149. package/src/pipeline/stages/deleteLambda/index.ts +2 -6
  150. package/src/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.tsx +14 -33
  151. package/src/pipeline/stages/deployCloudFormation/DeployCloudFormationStackStageConfig.tsx +264 -0
  152. package/src/pipeline/stages/deployCloudFormation/deployCloudFormationStackStage.spec.tsx +403 -0
  153. package/src/pipeline/stages/deployCloudFormation/deployCloudFormationStackStage.ts +21 -29
  154. package/src/pipeline/stages/deployCloudFormation/evaluateCloudFormationChangeSetExecution.service.ts +1 -11
  155. package/src/pipeline/stages/deployCloudFormation/evaluateCloudFormationChangeSetExecutionApproval.tsx +4 -3
  156. package/src/pipeline/stages/deployLambda/components/NetworkForm.tsx +3 -6
  157. package/src/pipeline/stages/deployLambda/index.ts +2 -6
  158. package/src/pipeline/stages/destroyAsg/awsDestroyAsgStage.js +28 -65
  159. package/src/pipeline/stages/disableAsg/AwsDisableAsgStageConfig.tsx +103 -0
  160. package/src/pipeline/stages/disableCluster/AwsDisableClusterStageConfig.tsx +119 -0
  161. package/src/pipeline/stages/enableAsg/AwsEnableAsgStageConfig.tsx +98 -0
  162. package/src/pipeline/stages/findAmi/awsFindAmiStage.js +22 -79
  163. package/src/pipeline/stages/findImageFromTags/AwsFindImageFromTagsStageConfig.spec.tsx +122 -0
  164. package/src/pipeline/stages/findImageFromTags/AwsFindImageFromTagsStageConfig.tsx +71 -0
  165. package/src/pipeline/stages/findImageFromTags/awsFindImageFromTagsStage.js +17 -32
  166. package/src/pipeline/stages/invokeLambda/index.ts +2 -6
  167. package/src/pipeline/stages/modifyScalingProcess/ModifyScalingProcessStageConfig.tsx +146 -0
  168. package/src/pipeline/stages/modifyScalingProcess/modifyScalingProcessStage.js +27 -98
  169. package/src/pipeline/stages/modifyScalingProcess/modifyScalingProcessStage.spec.tsx +167 -0
  170. package/src/pipeline/stages/modifyWarmPool/ModifyWarmPoolStageConfig.tsx +157 -0
  171. package/src/pipeline/stages/modifyWarmPool/modifyWarmPoolStage.js +26 -0
  172. package/src/pipeline/stages/modifyWarmPool/modifyWarmPoolStage.spec.tsx +89 -0
  173. package/src/pipeline/stages/resizeAsg/AwsResizeAsgStageConfig.spec.tsx +617 -0
  174. package/src/pipeline/stages/resizeAsg/AwsResizeAsgStageConfig.tsx +340 -0
  175. package/src/pipeline/stages/resizeAsg/awsResizeAsgStage.js +34 -125
  176. package/src/pipeline/stages/rollbackCluster/AwsRollbackClusterStageConfig.tsx +129 -0
  177. package/src/pipeline/stages/routeLambda/index.ts +2 -6
  178. package/src/pipeline/stages/scaleDownCluster/AwsScaleDownClusterStageConfig.tsx +121 -0
  179. package/src/pipeline/stages/shrinkCluster/AwsShrinkClusterStageConfig.tsx +136 -0
  180. package/src/pipeline/stages/tagImage/awsTagImageStage.spec.tsx +167 -0
  181. package/src/pipeline/stages/tagImage/awsTagImageStage.tsx +94 -0
  182. package/src/pipeline/stages/updateCodeLambda/index.ts +2 -6
  183. package/src/routerConsumers.spec.tsx +207 -0
  184. package/src/search/searchResultFormatter.ts +9 -16
  185. package/src/securityGroup/configure/AmazonSecurityGroupModal.spec.tsx +170 -0
  186. package/src/securityGroup/configure/AmazonSecurityGroupModal.tsx +440 -0
  187. package/src/securityGroup/details/AmazonSecurityGroupDetails.spec.tsx +62 -0
  188. package/src/securityGroup/details/AmazonSecurityGroupDetails.tsx +444 -0
  189. package/src/securityGroup/details/IPRangeRules.tsx +1 -1
  190. package/src/securityGroup/details/index.ts +1 -0
  191. package/src/securityGroup/index.ts +1 -0
  192. package/src/securityGroup/securityGroup.reader.ts +0 -5
  193. package/src/securityGroup/securityGroup.transformer.ts +35 -0
  194. package/src/serverGroup/configure/AmazonImageSelectInput.spec.tsx +104 -80
  195. package/src/serverGroup/configure/AmazonImageSelectInput.tsx +37 -18
  196. package/src/serverGroup/configure/serverGroupCommandBuilder.aws.service.spec.js +28 -66
  197. package/src/serverGroup/configure/serverGroupCommandBuilder.service.ts +476 -465
  198. package/src/serverGroup/configure/serverGroupCommandBuilder.spec.js +76 -124
  199. package/src/serverGroup/configure/serverGroupConfiguration.service.ts +106 -103
  200. package/src/serverGroup/configure/wizard/AmazonCloneServerGroupModal.tsx +65 -25
  201. package/src/serverGroup/configure/wizard/instanceType/CpuCreditsToggle.tsx +3 -3
  202. package/src/serverGroup/configure/wizard/instanceType/advancedMode/AdvancedModeSelector.tsx +2 -2
  203. package/src/serverGroup/configure/wizard/instanceType/simpleMode/SimpleModeSelector.spec.tsx +105 -0
  204. package/src/serverGroup/configure/wizard/instanceType/simpleMode/SimpleModeSelector.tsx +20 -6
  205. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.spec.tsx +39 -0
  206. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.tsx +10 -9
  207. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.tsx +2 -2
  208. package/src/serverGroup/configure/wizard/pages/ServerGroupLoadBalancers.tsx +5 -2
  209. package/src/serverGroup/configure/wizard/pages/advancedSettings/ServerGroupAdvancedSettingsCommon.spec.tsx +53 -0
  210. package/src/serverGroup/configure/wizard/pages/advancedSettings/ServerGroupAdvancedSettingsCommon.tsx +35 -33
  211. package/src/serverGroup/configure/wizard/securityGroups/SecurityGroupSelector.spec.tsx +20 -0
  212. package/src/serverGroup/configure/wizard/securityGroups/SecurityGroupSelector.tsx +9 -4
  213. package/src/serverGroup/details/AmazonServerGroupActions.spec.tsx +186 -0
  214. package/src/serverGroup/details/AmazonServerGroupActions.tsx +37 -87
  215. package/src/serverGroup/details/advancedSettings/EditAsgAdvancedSettingsModal.spec.tsx +110 -0
  216. package/src/serverGroup/details/advancedSettings/EditAsgAdvancedSettingsModal.tsx +117 -0
  217. package/src/serverGroup/details/advancedSettings/index.ts +1 -0
  218. package/src/serverGroup/details/amazonServerGroupDetailsGetter.ts +4 -4
  219. package/src/serverGroup/details/resize/AmazonResizeServerGroupModal.tsx +16 -6
  220. package/src/serverGroup/details/rollback/AmazonRollbackServerGroupModal.spec.tsx +285 -0
  221. package/src/serverGroup/details/rollback/AmazonRollbackServerGroupModal.tsx +449 -0
  222. package/src/serverGroup/details/rollback/index.ts +2 -0
  223. package/src/serverGroup/details/rollback/rollbackServerGroupSelection.spec.ts +101 -0
  224. package/src/serverGroup/details/rollback/rollbackServerGroupSelection.ts +81 -0
  225. package/src/serverGroup/details/scalingPolicy/CreateScalingPolicyButton.tsx +4 -4
  226. package/src/serverGroup/details/scalingPolicy/ScalingPolicyWriter.ts +2 -5
  227. package/src/serverGroup/details/scalingPolicy/upsert/alarm/DimensionsEditor.tsx +0 -2
  228. package/src/serverGroup/details/scalingProcesses/ModifyScalingProcessesModal.spec.tsx +74 -0
  229. package/src/serverGroup/details/scalingProcesses/ModifyScalingProcessesModal.tsx +140 -0
  230. package/src/serverGroup/details/scalingProcesses/index.ts +2 -0
  231. package/src/serverGroup/details/scheduledActions/EditScheduledActionsModal.spec.tsx +115 -0
  232. package/src/serverGroup/details/scheduledActions/EditScheduledActionsModal.tsx +205 -0
  233. package/src/serverGroup/details/scheduledActions/index.ts +1 -0
  234. package/src/serverGroup/details/sections/AdvancedSettingsDetailsSection.tsx +7 -14
  235. package/src/serverGroup/details/sections/AmazonCapacityDetailsSection.tsx +14 -2
  236. package/src/serverGroup/details/sections/AmazonServerGroupMaintenanceActions.spec.tsx +148 -0
  237. package/src/serverGroup/details/sections/InstancesDistributionDetailsSection.spec.tsx +1 -5
  238. package/src/serverGroup/details/sections/LaunchTemplateDetailsSection.spec.tsx +1 -5
  239. package/src/serverGroup/details/sections/ScalingProcessesDetailsSection.tsx +8 -20
  240. package/src/serverGroup/details/sections/ScheduledActionsDetailsSection.tsx +7 -12
  241. package/src/serverGroup/details/sections/SecurityGroupsDetailsSection.tsx +14 -19
  242. package/src/serverGroup/details/sections/WarmPoolDetailsSection.tsx +44 -0
  243. package/src/serverGroup/details/sections/index.ts +1 -0
  244. package/src/serverGroup/details/securityGroups/EditSecurityGroupsModal.spec.tsx +161 -0
  245. package/src/serverGroup/details/securityGroups/EditSecurityGroupsModal.tsx +177 -0
  246. package/src/serverGroup/details/securityGroups/index.ts +1 -0
  247. package/src/serverGroup/details/warmPool/ModifyWarmPoolModal.spec.tsx +69 -0
  248. package/src/serverGroup/details/warmPool/ModifyWarmPoolModal.tsx +191 -0
  249. package/src/serverGroup/details/warmPool/WarmPoolService.spec.ts +30 -0
  250. package/src/serverGroup/details/warmPool/WarmPoolService.ts +15 -0
  251. package/src/serverGroup/details/warmPool/index.ts +2 -0
  252. package/src/serverGroup/serverGroup.transformer.ts +1 -6
  253. package/src/vpc/VpcReader.ts +2 -2
  254. package/src/vpc/index.ts +1 -0
  255. package/dist/common/common.module.d.ts +0 -1
  256. package/dist/common/footer.component.d.ts +0 -1
  257. package/dist/function/function.module.d.ts +0 -1
  258. package/dist/instance/details/amazonInstanceInformation.component.d.ts +0 -1
  259. package/dist/instance/details/instance.details.controller.d.ts +0 -2
  260. package/dist/instance/details/instanceDns.component.d.ts +0 -1
  261. package/dist/instance/details/instanceSecurityGroups.component.d.ts +0 -1
  262. package/dist/instance/details/instanceStatus.component.d.ts +0 -1
  263. package/dist/instance/details/instanceTags.component.d.ts +0 -1
  264. package/dist/loadBalancer/details/loadBalancerActions.component.d.ts +0 -1
  265. package/dist/loadBalancer/details/loadBalancerDetails.controller.d.ts +0 -41
  266. package/dist/loadBalancer/details/targetGroupDetails.controller.d.ts +0 -30
  267. package/dist/loadBalancer/loadBalancer.module.d.ts +0 -1
  268. package/dist/loadBalancer/targetGroup.states.d.ts +0 -1
  269. package/dist/pipeline/stages/bake/awsBakeStage.d.ts +0 -2
  270. package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +0 -2
  271. package/dist/pipeline/stages/cloneServerGroup/awsCloneServerGroupStage.d.ts +0 -2
  272. package/dist/pipeline/stages/deployCloudFormation/cloudFormationTemplateEntry.component.d.ts +0 -1
  273. package/dist/pipeline/stages/deployCloudFormation/deployCloudFormationStackConfig.controller.d.ts +0 -25
  274. package/dist/pipeline/stages/disableAsg/awsDisableAsgStage.d.ts +0 -2
  275. package/dist/pipeline/stages/disableCluster/awsDisableClusterStage.d.ts +0 -2
  276. package/dist/pipeline/stages/enableAsg/awsEnableAsgStage.d.ts +0 -2
  277. package/dist/pipeline/stages/rollbackCluster/awsRollbackClusterStage.d.ts +0 -2
  278. package/dist/pipeline/stages/scaleDownCluster/awsScaleDownClusterStage.d.ts +0 -2
  279. package/dist/pipeline/stages/shrinkCluster/awsShrinkClusterStage.d.ts +0 -2
  280. package/dist/reactShims/aws.react.injector.d.ts +0 -18
  281. package/dist/reactShims/aws.react.module.d.ts +0 -1
  282. package/dist/reactShims/index.d.ts +0 -1
  283. package/dist/securityGroup/clone/cloneSecurityGroup.controller.d.ts +0 -2
  284. package/dist/securityGroup/configure/CreateSecurityGroupCtrl.d.ts +0 -2
  285. package/dist/securityGroup/configure/EditSecurityGroupCtrl.d.ts +0 -2
  286. package/dist/securityGroup/configure/configSecurityGroup.mixin.controller.d.ts +0 -2
  287. package/dist/securityGroup/configure/ingressRuleGroupSelector.component.d.ts +0 -1
  288. package/dist/securityGroup/configure/securityGroupDetailsCustom.component.d.ts +0 -1
  289. package/dist/securityGroup/configure/securityGroupDetailsCustom.d.ts +0 -10
  290. package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +0 -2
  291. package/dist/securityGroup/details/securityGroupIpRangeRules.component.d.ts +0 -1
  292. package/dist/securityGroup/securityGroup.module.d.ts +0 -1
  293. package/dist/serverGroup/details/advancedSettings/editAsgAdvancedSettings.modal.controller.d.ts +0 -2
  294. package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +0 -2
  295. package/dist/serverGroup/details/scalingPolicy/createScalingPolicyButton.component.d.ts +0 -1
  296. package/dist/serverGroup/details/scalingPolicy/scalingPolicy.module.d.ts +0 -1
  297. package/dist/serverGroup/details/scalingPolicy/scalingPolicySummary.component.d.ts +0 -1
  298. package/dist/serverGroup/details/scalingProcesses/modifyScalingProcesses.controller.d.ts +0 -2
  299. package/dist/serverGroup/details/scheduledAction/editScheduledActions.modal.controller.d.ts +0 -2
  300. package/dist/serverGroup/details/securityGroup/editSecurityGroups.modal.controller.d.ts +0 -2
  301. package/dist/serverGroup/details/serverGroupDetails.module.d.ts +0 -1
  302. package/dist/subnet/subnet.renderer.d.ts +0 -5
  303. package/dist/vpc/vpc.module.d.ts +0 -1
  304. package/src/applicationProviderFields/awsFields.html +0 -13
  305. package/src/common/common.module.ts +0 -6
  306. package/src/common/footer.component.ts +0 -29
  307. package/src/function/function.module.ts +0 -5
  308. package/src/image/image.reader.spec.ts +0 -75
  309. package/src/instance/details/amazonInstanceInformation.component.ts +0 -13
  310. package/src/instance/details/instance.details.controller.js +0 -586
  311. package/src/instance/details/instance.details.controller.spec.js +0 -133
  312. package/src/instance/details/instanceDetails.html +0 -65
  313. package/src/instance/details/instanceDns.component.ts +0 -21
  314. package/src/instance/details/instanceSecurityGroups.component.ts +0 -13
  315. package/src/instance/details/instanceStatus.component.ts +0 -19
  316. package/src/instance/details/instanceTags.component.ts +0 -13
  317. package/src/loadBalancer/details/loadBalancerActions.component.ts +0 -16
  318. package/src/loadBalancer/details/loadBalancerDetails.controller.spec.ts +0 -76
  319. package/src/loadBalancer/details/loadBalancerDetails.controller.ts +0 -240
  320. package/src/loadBalancer/details/loadBalancerDetails.html +0 -266
  321. package/src/loadBalancer/details/targetGroupDetails.controller.ts +0 -95
  322. package/src/loadBalancer/details/targetGroupDetails.html +0 -138
  323. package/src/loadBalancer/loadBalancer.module.ts +0 -15
  324. package/src/loadBalancer/targetGroup.states.ts +0 -55
  325. package/src/pipeline/stages/bake/awsBakeStage.js +0 -219
  326. package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +0 -43
  327. package/src/pipeline/stages/bake/bakeExecutionDetails.html +0 -65
  328. package/src/pipeline/stages/bake/bakeStage.html +0 -205
  329. package/src/pipeline/stages/cloneServerGroup/awsCloneServerGroupStage.js +0 -143
  330. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStage.html +0 -143
  331. package/src/pipeline/stages/cloneServerGroup/cloneServerGroupStepLabel.html +0 -1
  332. package/src/pipeline/stages/deployCloudFormation/cloudFormationTemplateEntry.component.ts +0 -46
  333. package/src/pipeline/stages/deployCloudFormation/deployCloudFormationStackConfig.controller.ts +0 -84
  334. package/src/pipeline/stages/deployCloudFormation/deployCloudFormationStackConfig.html +0 -84
  335. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +0 -9
  336. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +0 -1
  337. package/src/pipeline/stages/disableAsg/awsDisableAsgStage.js +0 -69
  338. package/src/pipeline/stages/disableAsg/disableAsgStage.html +0 -11
  339. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +0 -1
  340. package/src/pipeline/stages/disableCluster/awsDisableClusterStage.js +0 -84
  341. package/src/pipeline/stages/disableCluster/disableClusterStage.html +0 -26
  342. package/src/pipeline/stages/enableAsg/awsEnableAsgStage.js +0 -73
  343. package/src/pipeline/stages/enableAsg/enableAsgStage.html +0 -11
  344. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +0 -1
  345. package/src/pipeline/stages/findAmi/findAmiStage.html +0 -24
  346. package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +0 -44
  347. package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +0 -11
  348. package/src/pipeline/stages/modifyScalingProcess/modifyScalingProcessExecutionDetails.html +0 -36
  349. package/src/pipeline/stages/modifyScalingProcess/modifyScalingProcessStage.html +0 -24
  350. package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +0 -90
  351. package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +0 -4
  352. package/src/pipeline/stages/rollbackCluster/awsRollbackClusterStage.js +0 -66
  353. package/src/pipeline/stages/rollbackCluster/rollbackClusterStage.html +0 -43
  354. package/src/pipeline/stages/scaleDownCluster/awsScaleDownClusterStage.js +0 -78
  355. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +0 -35
  356. package/src/pipeline/stages/shrinkCluster/awsShrinkClusterStage.js +0 -73
  357. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +0 -34
  358. package/src/pipeline/stages/tagImage/awsTagImageStage.js +0 -34
  359. package/src/pipeline/stages/tagImage/tagImageExecutionDetails.html +0 -38
  360. package/src/pipeline/stages/tagImage/tagImageStage.html +0 -10
  361. package/src/reactShims/aws.react.injector.ts +0 -25
  362. package/src/reactShims/aws.react.module.ts +0 -12
  363. package/src/reactShims/index.ts +0 -1
  364. package/src/securityGroup/clone/cloneSecurityGroup.controller.js +0 -106
  365. package/src/securityGroup/clone/cloneSecurityGroup.html +0 -19
  366. package/src/securityGroup/configure/CreateSecurityGroup.controller.spec.js +0 -307
  367. package/src/securityGroup/configure/CreateSecurityGroupCtrl.js +0 -47
  368. package/src/securityGroup/configure/EditSecurityGroupCtrl.js +0 -115
  369. package/src/securityGroup/configure/configSecurityGroup.mixin.controller.js +0 -366
  370. package/src/securityGroup/configure/createSecurityGroup.html +0 -19
  371. package/src/securityGroup/configure/createSecurityGroupIngress.html +0 -100
  372. package/src/securityGroup/configure/createSecurityGroupProperties.html +0 -123
  373. package/src/securityGroup/configure/editSecurityGroup.html +0 -20
  374. package/src/securityGroup/configure/ingressRuleGroupSelector.component.html +0 -77
  375. package/src/securityGroup/configure/ingressRuleGroupSelector.component.less +0 -6
  376. package/src/securityGroup/configure/ingressRuleGroupSelector.component.ts +0 -190
  377. package/src/securityGroup/configure/securityGroupDetailsCustom.component.ts +0 -16
  378. package/src/securityGroup/configure/securityGroupDetailsCustom.tsx +0 -16
  379. package/src/securityGroup/details/securityGroupDetail.controller.js +0 -249
  380. package/src/securityGroup/details/securityGroupDetail.html +0 -114
  381. package/src/securityGroup/details/securityGroupIpRangeRules.component.ts +0 -12
  382. package/src/securityGroup/securityGroup.module.ts +0 -26
  383. package/src/securityGroup/securityGroup.transformer.js +0 -48
  384. package/src/serverGroup/configure/serverGroupConfiguration.service.spec.ts +0 -478
  385. package/src/serverGroup/details/advancedSettings/editAsgAdvancedSettings.modal.controller.js +0 -47
  386. package/src/serverGroup/details/advancedSettings/editAsgAdvancedSettings.modal.html +0 -79
  387. package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +0 -146
  388. package/src/serverGroup/details/rollback/rollbackServerGroup.html +0 -139
  389. package/src/serverGroup/details/scalingPolicy/createScalingPolicyButton.component.ts +0 -15
  390. package/src/serverGroup/details/scalingPolicy/scalingPolicy.module.ts +0 -6
  391. package/src/serverGroup/details/scalingPolicy/scalingPolicySummary.component.ts +0 -14
  392. package/src/serverGroup/details/scalingPolicy/upsert/alarm/dimensionsEditor.less +0 -18
  393. package/src/serverGroup/details/scalingProcesses/modifyScalingProcesses.controller.js +0 -95
  394. package/src/serverGroup/details/scalingProcesses/modifyScalingProcesses.controller.spec.js +0 -106
  395. package/src/serverGroup/details/scalingProcesses/modifyScalingProcesses.html +0 -30
  396. package/src/serverGroup/details/scheduledAction/editScheduledActions.modal.controller.js +0 -70
  397. package/src/serverGroup/details/scheduledAction/editScheduledActions.modal.html +0 -89
  398. package/src/serverGroup/details/securityGroup/editSecurityGroups.modal.controller.js +0 -95
  399. package/src/serverGroup/details/securityGroup/editSecurityGroups.modal.html +0 -40
  400. package/src/serverGroup/details/serverGroupDetails.module.ts +0 -18
  401. package/src/serverGroup/serverGroup.transformer.spec.ts +0 -185
  402. package/src/subnet/SubnetSelectInput.spec.tsx +0 -91
  403. package/src/subnet/subnet.renderer.ts +0 -12
  404. package/src/vpc/vpc.module.ts +0 -9
@@ -0,0 +1,449 @@
1
+ import React from 'react';
2
+ import { Modal } from 'react-bootstrap';
3
+
4
+ import type { Application, DeckRuntimeServices, IModalComponentProps, IServerGroupJob } from '@spinnaker/core';
5
+ import {
6
+ DeckRuntimeContext,
7
+ ModalClose,
8
+ noop,
9
+ PlatformHealthOverride,
10
+ ReactModal,
11
+ SpinFormik,
12
+ TaskMonitor,
13
+ TaskMonitorWrapper,
14
+ TaskReason,
15
+ UserVerification,
16
+ ValidationMessage,
17
+ } from '@spinnaker/core';
18
+
19
+ import type { IAmazonServerGroup } from '../../../domain';
20
+
21
+ export type AmazonRollbackType = 'EXPLICIT' | 'PREVIOUS_IMAGE';
22
+
23
+ export interface IAmazonPreviousImageServerGroup {
24
+ buildNumber?: number | string;
25
+ imageId?: string;
26
+ imageName: string;
27
+ name: string;
28
+ }
29
+
30
+ export interface IAmazonRollbackValues {
31
+ delayBeforeDisableSeconds: number;
32
+ interestingHealthProviderNames?: string[];
33
+ reason?: string;
34
+ restoreServerGroupName?: string;
35
+ targetHealthyRollbackPercentage: number;
36
+ }
37
+
38
+ export interface IAmazonRollbackJob extends IServerGroupJob {
39
+ interestingHealthProviderNames?: string[];
40
+ platformHealthOnlyShowOverride?: boolean;
41
+ reason?: string;
42
+ rollbackContext: {
43
+ delayBeforeDisableSeconds: number;
44
+ restoreServerGroupName?: string;
45
+ rollbackServerGroupName: string;
46
+ targetHealthyRollbackPercentage: number;
47
+ };
48
+ rollbackType: AmazonRollbackType;
49
+ }
50
+
51
+ export interface IAmazonRollbackErrors {
52
+ delayBeforeDisableSeconds?: string;
53
+ restoreServerGroupName?: string;
54
+ targetHealthyRollbackPercentage?: string;
55
+ }
56
+
57
+ export interface IAmazonRollbackServerGroupModalProps extends IModalComponentProps {
58
+ allServerGroups: IAmazonServerGroup[];
59
+ application: Application;
60
+ previousServerGroup?: IAmazonServerGroup;
61
+ serverGroup: IAmazonServerGroup;
62
+ }
63
+
64
+ interface IAmazonRollbackServerGroupModalState {
65
+ initialValues: IAmazonRollbackValues;
66
+ taskMonitor: TaskMonitor;
67
+ verified: boolean;
68
+ }
69
+
70
+ export function getDefaultAmazonHealthyRollbackPercentage(desired: number): number {
71
+ if (desired < 10) {
72
+ return 100;
73
+ }
74
+ return desired < 20 ? 90 : 95;
75
+ }
76
+
77
+ export function getAmazonPreviousImageServerGroup(
78
+ serverGroup: IAmazonServerGroup,
79
+ ): IAmazonPreviousImageServerGroup | undefined {
80
+ const previousServerGroup = (serverGroup.entityTags as any)?.creationMetadata?.value?.previousServerGroup;
81
+ if (!previousServerGroup) {
82
+ return undefined;
83
+ }
84
+
85
+ const buildNumber = previousServerGroup.buildInfo?.jenkins?.number;
86
+ return {
87
+ ...(buildNumber !== undefined ? { buildNumber } : {}),
88
+ imageId:
89
+ previousServerGroup.imageId && previousServerGroup.imageId !== previousServerGroup.imageName
90
+ ? previousServerGroup.imageId
91
+ : undefined,
92
+ imageName: previousServerGroup.imageName,
93
+ name: previousServerGroup.name,
94
+ };
95
+ }
96
+
97
+ export function getAmazonRollbackType(
98
+ serverGroup: IAmazonServerGroup,
99
+ allServerGroups: IAmazonServerGroup[],
100
+ ): AmazonRollbackType {
101
+ return allServerGroups.length === 0 && getAmazonPreviousImageServerGroup(serverGroup) ? 'PREVIOUS_IMAGE' : 'EXPLICIT';
102
+ }
103
+
104
+ export function validateAmazonRollbackValues(
105
+ values: IAmazonRollbackValues,
106
+ rollbackType: AmazonRollbackType,
107
+ eligibleTargetNames?: string[],
108
+ ): IAmazonRollbackErrors {
109
+ const errors: IAmazonRollbackErrors = {};
110
+
111
+ if (rollbackType === 'EXPLICIT') {
112
+ if (!values.restoreServerGroupName) {
113
+ errors.restoreServerGroupName = 'Select a server group to restore';
114
+ } else if (eligibleTargetNames && !eligibleTargetNames.includes(values.restoreServerGroupName)) {
115
+ errors.restoreServerGroupName = 'Select an eligible server group to restore';
116
+ }
117
+ }
118
+
119
+ if (
120
+ !Number.isFinite(values.targetHealthyRollbackPercentage) ||
121
+ values.targetHealthyRollbackPercentage < 0 ||
122
+ values.targetHealthyRollbackPercentage > 100
123
+ ) {
124
+ errors.targetHealthyRollbackPercentage = 'Healthy threshold must be between 0 and 100';
125
+ }
126
+
127
+ if (
128
+ !Number.isFinite(values.delayBeforeDisableSeconds) ||
129
+ !Number.isInteger(values.delayBeforeDisableSeconds) ||
130
+ values.delayBeforeDisableSeconds < 0
131
+ ) {
132
+ errors.delayBeforeDisableSeconds = 'Delay must be a non-negative whole number';
133
+ }
134
+
135
+ return errors;
136
+ }
137
+
138
+ export function buildAmazonRollbackJob(
139
+ application: Application,
140
+ serverGroup: IAmazonServerGroup,
141
+ rollbackType: AmazonRollbackType,
142
+ values: IAmazonRollbackValues,
143
+ ): IAmazonRollbackJob {
144
+ return {
145
+ interestingHealthProviderNames: values.interestingHealthProviderNames,
146
+ platformHealthOnlyShowOverride: application.attributes?.platformHealthOnlyShowOverride,
147
+ reason: values.reason,
148
+ rollbackContext: {
149
+ delayBeforeDisableSeconds: values.delayBeforeDisableSeconds,
150
+ restoreServerGroupName: values.restoreServerGroupName,
151
+ rollbackServerGroupName: serverGroup.name,
152
+ targetHealthyRollbackPercentage: values.targetHealthyRollbackPercentage,
153
+ },
154
+ rollbackType,
155
+ };
156
+ }
157
+
158
+ export class AmazonRollbackServerGroupModal extends React.Component<
159
+ IAmazonRollbackServerGroupModalProps,
160
+ IAmazonRollbackServerGroupModalState
161
+ > {
162
+ public static contextType = DeckRuntimeContext;
163
+ public declare context: React.ContextType<typeof DeckRuntimeContext>;
164
+
165
+ public static defaultProps: Partial<IAmazonRollbackServerGroupModalProps> = {
166
+ allServerGroups: [],
167
+ closeModal: noop,
168
+ dismissModal: noop,
169
+ };
170
+
171
+ public static show(
172
+ props: IAmazonRollbackServerGroupModalProps,
173
+ runtimeServices: DeckRuntimeServices,
174
+ ): Promise<IAmazonRollbackJob> {
175
+ return ReactModal.show(AmazonRollbackServerGroupModal, props, undefined, runtimeServices);
176
+ }
177
+
178
+ public constructor(props: IAmazonRollbackServerGroupModalProps) {
179
+ super(props);
180
+ const { application, previousServerGroup, serverGroup } = props;
181
+ const desired = Number(serverGroup.capacity.desired);
182
+ this.state = {
183
+ initialValues: {
184
+ delayBeforeDisableSeconds: 0,
185
+ interestingHealthProviderNames:
186
+ application.attributes?.platformHealthOnlyShowOverride && application.attributes?.platformHealthOnly
187
+ ? ['Amazon']
188
+ : undefined,
189
+ restoreServerGroupName: previousServerGroup?.name,
190
+ targetHealthyRollbackPercentage: getDefaultAmazonHealthyRollbackPercentage(desired),
191
+ },
192
+ taskMonitor: new TaskMonitor({
193
+ application,
194
+ title: `Rollback ${serverGroup.name}`,
195
+ onDismiss: () => this.props.dismissModal(),
196
+ onTaskComplete: () => application.serverGroups.refresh(),
197
+ }),
198
+ verified: false,
199
+ };
200
+ }
201
+
202
+ private get rollbackType(): AmazonRollbackType {
203
+ return getAmazonRollbackType(this.props.serverGroup, this.props.allServerGroups);
204
+ }
205
+
206
+ private close = (): void => this.props.dismissModal();
207
+
208
+ private label(serverGroup: IAmazonServerGroup): string {
209
+ const buildNumber = serverGroup?.buildInfo?.jenkins?.number;
210
+ return buildNumber ? `${serverGroup.name} (build #${buildNumber})` : serverGroup?.name || '';
211
+ }
212
+
213
+ private minHealthy(percent: number): number {
214
+ return Math.ceil((Number(this.props.serverGroup.capacity.desired) * percent) / 100);
215
+ }
216
+
217
+ private submit = (values: IAmazonRollbackValues): void => {
218
+ const { allServerGroups, application, serverGroup } = this.props;
219
+ const errors = validateAmazonRollbackValues(
220
+ values,
221
+ this.rollbackType,
222
+ allServerGroups.map(({ name }) => name),
223
+ );
224
+ if (!this.state.verified || Object.keys(errors).length > 0) {
225
+ return;
226
+ }
227
+
228
+ const command = buildAmazonRollbackJob(application, serverGroup, this.rollbackType, values);
229
+ this.state.taskMonitor.submit(() =>
230
+ this.context.services.serverGroupWriter.rollbackServerGroup(serverGroup, application, command),
231
+ );
232
+ };
233
+
234
+ private renderRestoreTarget(values: IAmazonRollbackValues, setFieldValue: (name: string, value: any) => void) {
235
+ if (this.rollbackType === 'PREVIOUS_IMAGE') {
236
+ const previousImage = getAmazonPreviousImageServerGroup(this.props.serverGroup);
237
+ return (
238
+ <div style={{ marginTop: '5px' }}>
239
+ {previousImage.name} <span className="small">(no longer deployed)</span>
240
+ <br />
241
+ <span className="small">
242
+ <strong>Image</strong>: {previousImage.imageName}
243
+ {previousImage.imageId && <> ({previousImage.imageId})</>}
244
+ </span>
245
+ {previousImage.buildNumber !== undefined && (
246
+ <>
247
+ <br />
248
+ <span className="small">
249
+ <strong>Build</strong> #{previousImage.buildNumber}
250
+ </span>
251
+ </>
252
+ )}
253
+ </div>
254
+ );
255
+ }
256
+
257
+ const enabled = this.props.allServerGroups.filter(({ isDisabled }) => !isDisabled);
258
+ const disabled = this.props.allServerGroups.filter(({ isDisabled }) => isDisabled);
259
+ const options = (serverGroups: IAmazonServerGroup[]) =>
260
+ serverGroups.map((candidate) => (
261
+ <option key={candidate.name} value={candidate.name}>
262
+ {this.label(candidate)}
263
+ </option>
264
+ ));
265
+ return (
266
+ <select
267
+ className="form-control input-sm"
268
+ name="restoreServerGroupName"
269
+ onChange={(event) => setFieldValue('restoreServerGroupName', event.target.value || undefined)}
270
+ value={values.restoreServerGroupName || ''}
271
+ >
272
+ <option value="">Select...</option>
273
+ {enabled.length > 0 && <optgroup label="Enabled Server Groups">{options(enabled)}</optgroup>}
274
+ {disabled.length > 0 && <optgroup label="Disabled Server Groups">{options(disabled)}</optgroup>}
275
+ </select>
276
+ );
277
+ }
278
+
279
+ private renderOperations(values: IAmazonRollbackValues): JSX.Element {
280
+ const { serverGroup } = this.props;
281
+ const previousImage = getAmazonPreviousImageServerGroup(serverGroup);
282
+ const restoreName = values.restoreServerGroupName || 'previous server group';
283
+ return (
284
+ <div className="row">
285
+ <div className="col-sm-11 col-sm-offset-1">
286
+ <ol>
287
+ {this.rollbackType === 'EXPLICIT' ? (
288
+ <>
289
+ <li>
290
+ Enable <em>{restoreName}</em>
291
+ </li>
292
+ <li>
293
+ Resize <em>{restoreName}</em> to [<strong>min</strong>: {serverGroup.capacity.desired},{' '}
294
+ <strong>max</strong>: {serverGroup.capacity.max}, <strong>desired</strong>:{' '}
295
+ {serverGroup.capacity.desired}]
296
+ </li>
297
+ </>
298
+ ) : (
299
+ <li>
300
+ Deploy <em>{previousImage.imageId || previousImage.imageName}</em> [<strong>min</strong>:{' '}
301
+ {serverGroup.capacity.desired}, <strong>max</strong>: {serverGroup.capacity.max},{' '}
302
+ <strong>desired</strong>: {serverGroup.capacity.desired}]
303
+ </li>
304
+ )}
305
+ {values.targetHealthyRollbackPercentage < 100 && (
306
+ <li>
307
+ Wait for at least {this.minHealthy(values.targetHealthyRollbackPercentage)} instances to report as
308
+ healthy
309
+ </li>
310
+ )}
311
+ {values.delayBeforeDisableSeconds > 0 && <li>Wait {values.delayBeforeDisableSeconds} seconds</li>}
312
+ <li>
313
+ Disable <em>{serverGroup.name}</em>
314
+ </li>
315
+ <li>
316
+ Restore minimum capacity of <em>{this.rollbackType === 'EXPLICIT' ? restoreName : 'new server group'}</em>{' '}
317
+ [<strong>min</strong>: {serverGroup.capacity.min}]
318
+ </li>
319
+ </ol>
320
+ <p>
321
+ This rollback will affect server groups in {serverGroup.account} ({serverGroup.region}).
322
+ </p>
323
+ </div>
324
+ </div>
325
+ );
326
+ }
327
+
328
+ public render(): JSX.Element {
329
+ const { application, serverGroup } = this.props;
330
+ const eligibleTargetNames = this.props.allServerGroups.map(({ name }) => name);
331
+ return (
332
+ <>
333
+ <TaskMonitorWrapper monitor={this.state.taskMonitor} />
334
+ <SpinFormik<IAmazonRollbackValues>
335
+ initialValues={this.state.initialValues}
336
+ onSubmit={this.submit}
337
+ validate={(values) => validateAmazonRollbackValues(values, this.rollbackType, eligibleTargetNames)}
338
+ render={(formik) => (
339
+ <>
340
+ <ModalClose dismiss={this.close} />
341
+ <Modal.Header>
342
+ <Modal.Title>Rollback {serverGroup.name}</Modal.Title>
343
+ </Modal.Header>
344
+ <Modal.Body>
345
+ <form className="form-horizontal">
346
+ <div className="form-group row">
347
+ <div className="col-sm-3 sm-label-right">Restore to</div>
348
+ <div className="col-md-7">
349
+ {this.renderRestoreTarget(formik.values, formik.setFieldValue)}
350
+ {formik.errors.restoreServerGroupName && (
351
+ <ValidationMessage message={formik.errors.restoreServerGroupName as string} type="error" />
352
+ )}
353
+ </div>
354
+ </div>
355
+
356
+ {application.attributes?.platformHealthOnlyShowOverride && (
357
+ <div className="form-group row">
358
+ <div className="col-sm-10 col-sm-offset-1">
359
+ <PlatformHealthOverride
360
+ interestingHealthProviderNames={formik.values.interestingHealthProviderNames}
361
+ onChange={(names) => formik.setFieldValue('interestingHealthProviderNames', names)}
362
+ platformHealthType="Amazon"
363
+ showHelpDetails={true}
364
+ />
365
+ </div>
366
+ </div>
367
+ )}
368
+
369
+ <TaskReason
370
+ reason={formik.values.reason}
371
+ onChange={(reason) => formik.setFieldValue('reason', reason)}
372
+ />
373
+
374
+ <div className="form-group row">
375
+ <div className="col-sm-11 col-sm-offset-1">
376
+ Wait{' '}
377
+ <input
378
+ className="form-control input-sm inline-number"
379
+ min={0}
380
+ name="delayBeforeDisableSeconds"
381
+ onChange={(event) =>
382
+ formik.setFieldValue('delayBeforeDisableSeconds', Number(event.target.value))
383
+ }
384
+ placeholder="0"
385
+ step={1}
386
+ type="number"
387
+ value={formik.values.delayBeforeDisableSeconds}
388
+ />{' '}
389
+ seconds before disabling <em>{this.label(serverGroup)}</em>.
390
+ {formik.errors.delayBeforeDisableSeconds && (
391
+ <ValidationMessage message={formik.errors.delayBeforeDisableSeconds as string} type="error" />
392
+ )}
393
+ </div>
394
+ </div>
395
+
396
+ <div className="form-group row">
397
+ <div className="col-sm-11 col-sm-offset-1">
398
+ Consider rollback successful when{' '}
399
+ <input
400
+ className="form-control input-sm inline-number"
401
+ max={100}
402
+ min={0}
403
+ name="targetHealthyRollbackPercentage"
404
+ onChange={(event) =>
405
+ formik.setFieldValue('targetHealthyRollbackPercentage', Number(event.target.value))
406
+ }
407
+ type="number"
408
+ value={formik.values.targetHealthyRollbackPercentage}
409
+ />{' '}
410
+ percent of instances are healthy.
411
+ {formik.errors.targetHealthyRollbackPercentage && (
412
+ <ValidationMessage
413
+ message={formik.errors.targetHealthyRollbackPercentage as string}
414
+ type="error"
415
+ />
416
+ )}
417
+ </div>
418
+ </div>
419
+ </form>
420
+
421
+ <div className="row">
422
+ <div className="col-sm-4 sm-label-right">Rollback Operations</div>
423
+ </div>
424
+ {this.renderOperations(formik.values)}
425
+ </Modal.Body>
426
+ <Modal.Footer>
427
+ <UserVerification
428
+ account={serverGroup.account}
429
+ onValidChange={(verified) => this.setState({ verified })}
430
+ />
431
+ <button className="btn btn-default" onClick={this.close} type="button">
432
+ Cancel
433
+ </button>
434
+ <button
435
+ className="btn btn-primary"
436
+ disabled={!this.state.verified || !formik.isValid}
437
+ onClick={() => this.submit(formik.values)}
438
+ type="button"
439
+ >
440
+ Submit
441
+ </button>
442
+ </Modal.Footer>
443
+ </>
444
+ )}
445
+ />
446
+ </>
447
+ );
448
+ }
449
+ }
@@ -0,0 +1,2 @@
1
+ export * from './AmazonRollbackServerGroupModal';
2
+ export * from './rollbackServerGroupSelection';
@@ -0,0 +1,101 @@
1
+ import type { IAmazonServerGroup } from '../../../domain';
2
+
3
+ import { getAmazonRollbackCandidates, isAmazonRollbackAvailable, selectAmazonRollbackServerGroups } from './index';
4
+
5
+ describe('Amazon rollback selection', () => {
6
+ const applicationName = 'fnord';
7
+
8
+ function serverGroup(name: string, overrides: Partial<IAmazonServerGroup> = {}): IAmazonServerGroup {
9
+ return {
10
+ account: 'test',
11
+ app: applicationName,
12
+ cluster: 'fnord-main',
13
+ createdTime: Number(name.match(/\d+$/)?.[0] || 0),
14
+ instanceCounts: { total: 1 },
15
+ isDisabled: false,
16
+ name,
17
+ region: 'eu-west-1',
18
+ ...overrides,
19
+ } as IAmazonServerGroup;
20
+ }
21
+
22
+ it('keeps candidates in the same application, cluster, account, and region', () => {
23
+ const selected = serverGroup('fnord-main-v004');
24
+ const eligible = serverGroup('fnord-main-v003', { isDisabled: true });
25
+ const candidates = [
26
+ selected,
27
+ eligible,
28
+ serverGroup('other-app-main-v003', { app: 'other' }),
29
+ serverGroup('fnord-other-v003', { cluster: 'fnord-other' }),
30
+ serverGroup('fnord-main-v003-other-account', { account: 'other' }),
31
+ serverGroup('fnord-main-v003-other-region', { region: 'us-east-1' }),
32
+ ];
33
+
34
+ expect(getAmazonRollbackCandidates(applicationName, selected, candidates)).toEqual([eligible]);
35
+ });
36
+
37
+ it('uses moniker application identity and sorts candidates newest first', () => {
38
+ const selected = serverGroup('fnord-main-v004');
39
+ const candidates = [
40
+ serverGroup('fnord-main-v001', { app: undefined, moniker: { app: applicationName } as any }),
41
+ serverGroup('fnord-main-v003'),
42
+ serverGroup('fnord-main-v002'),
43
+ ];
44
+
45
+ expect(getAmazonRollbackCandidates(applicationName, selected, candidates).map(({ name }) => name)).toEqual([
46
+ 'fnord-main-v003',
47
+ 'fnord-main-v002',
48
+ 'fnord-main-v001',
49
+ ]);
50
+ });
51
+
52
+ it('defaults the only other server group as the explicit restore target', () => {
53
+ const selected = serverGroup('fnord-main-v004');
54
+ const previous = serverGroup('fnord-main-v003', { isDisabled: true });
55
+
56
+ expect(selectAmazonRollbackServerGroups(applicationName, selected, [selected, previous])).toEqual({
57
+ allServerGroups: [previous],
58
+ previousServerGroup: previous,
59
+ serverGroup: selected,
60
+ });
61
+ });
62
+
63
+ it('treats a disabled selection as the restore target and rolls back the largest newest enabled group', () => {
64
+ const selected = serverGroup('fnord-main-v001', { isDisabled: true });
65
+ const olderLarge = serverGroup('fnord-main-v003', {
66
+ createdTime: 100,
67
+ instanceCounts: { total: 5 } as any,
68
+ });
69
+ const newerLarge = serverGroup('fnord-main-v004', {
70
+ createdTime: 200,
71
+ instanceCounts: { total: 5 } as any,
72
+ });
73
+ const small = serverGroup('fnord-main-v002', {
74
+ createdTime: 300,
75
+ instanceCounts: { total: 2 } as any,
76
+ });
77
+
78
+ expect(
79
+ selectAmazonRollbackServerGroups(applicationName, selected, [selected, olderLarge, newerLarge, small]),
80
+ ).toEqual({
81
+ allServerGroups: [olderLarge, small, selected],
82
+ previousServerGroup: selected,
83
+ serverGroup: newerLarge,
84
+ });
85
+ });
86
+
87
+ it('allows enabled groups and requires an enabled source for disabled groups', () => {
88
+ const enabled = serverGroup('fnord-main-v004');
89
+ const disabled = serverGroup('fnord-main-v003', { isDisabled: true });
90
+
91
+ expect(isAmazonRollbackAvailable(applicationName, enabled, [enabled])).toBe(true);
92
+ expect(isAmazonRollbackAvailable(applicationName, disabled, [disabled])).toBe(false);
93
+ expect(isAmazonRollbackAvailable(applicationName, disabled, [disabled, enabled])).toBe(true);
94
+ expect(
95
+ isAmazonRollbackAvailable(applicationName, disabled, [
96
+ disabled,
97
+ serverGroup('fnord-main-v004', { app: 'other' }),
98
+ ]),
99
+ ).toBe(false);
100
+ });
101
+ });
@@ -0,0 +1,81 @@
1
+ import type { IAmazonServerGroup } from '../../../domain';
2
+
3
+ export interface IAmazonRollbackSelection {
4
+ allServerGroups: IAmazonServerGroup[];
5
+ previousServerGroup?: IAmazonServerGroup;
6
+ serverGroup: IAmazonServerGroup;
7
+ }
8
+
9
+ function applicationFor(serverGroup: IAmazonServerGroup): string | undefined {
10
+ return serverGroup.app || serverGroup.moniker?.app;
11
+ }
12
+
13
+ function inRollbackScope(
14
+ applicationName: string,
15
+ selectedServerGroup: IAmazonServerGroup,
16
+ candidate: IAmazonServerGroup,
17
+ ): boolean {
18
+ return (
19
+ applicationFor(candidate) === applicationName &&
20
+ candidate.cluster === selectedServerGroup.cluster &&
21
+ candidate.account === selectedServerGroup.account &&
22
+ candidate.region === selectedServerGroup.region
23
+ );
24
+ }
25
+
26
+ export function getAmazonRollbackCandidates(
27
+ applicationName: string,
28
+ selectedServerGroup: IAmazonServerGroup,
29
+ allServerGroups: IAmazonServerGroup[],
30
+ ): IAmazonServerGroup[] {
31
+ return allServerGroups
32
+ .filter(
33
+ (candidate) =>
34
+ candidate.name !== selectedServerGroup.name && inRollbackScope(applicationName, selectedServerGroup, candidate),
35
+ )
36
+ .sort((a, b) => b.name.localeCompare(a.name));
37
+ }
38
+
39
+ export function isAmazonRollbackAvailable(
40
+ applicationName: string,
41
+ selectedServerGroup: IAmazonServerGroup,
42
+ allServerGroups: IAmazonServerGroup[],
43
+ ): boolean {
44
+ return (
45
+ !selectedServerGroup.isDisabled ||
46
+ getAmazonRollbackCandidates(applicationName, selectedServerGroup, allServerGroups).some(
47
+ (candidate) => !candidate.isDisabled,
48
+ )
49
+ );
50
+ }
51
+
52
+ export function selectAmazonRollbackServerGroups(
53
+ applicationName: string,
54
+ selectedServerGroup: IAmazonServerGroup,
55
+ allServerGroups: IAmazonServerGroup[],
56
+ ): IAmazonRollbackSelection | undefined {
57
+ let serverGroup = selectedServerGroup;
58
+ let previousServerGroup: IAmazonServerGroup | undefined;
59
+
60
+ if (selectedServerGroup.isDisabled) {
61
+ previousServerGroup = selectedServerGroup;
62
+ serverGroup = getAmazonRollbackCandidates(applicationName, selectedServerGroup, allServerGroups)
63
+ .filter((candidate) => !candidate.isDisabled)
64
+ .sort(
65
+ (a, b) =>
66
+ (b.instanceCounts?.total || 0) - (a.instanceCounts?.total || 0) ||
67
+ (b.createdTime || 0) - (a.createdTime || 0),
68
+ )[0];
69
+
70
+ if (!serverGroup) {
71
+ return undefined;
72
+ }
73
+ }
74
+
75
+ const candidates = getAmazonRollbackCandidates(applicationName, serverGroup, allServerGroups);
76
+ if (candidates.length === 1 && !previousServerGroup) {
77
+ previousServerGroup = candidates[0];
78
+ }
79
+
80
+ return { allServerGroups: candidates, previousServerGroup, serverGroup };
81
+ }
@@ -2,9 +2,9 @@ import React from 'react';
2
2
 
3
3
  import type { Application } from '@spinnaker/core';
4
4
  import { ReactModal } from '@spinnaker/core';
5
- import type { IAmazonServerGroupView } from '../../../domain';
6
- import { AwsReactInjector } from '../../../reactShims';
7
5
 
6
+ import { AwsServices } from '../../../aws.services';
7
+ import type { IAmazonServerGroupView } from '../../../domain';
8
8
  import type { IUpsertTargetTrackingModalProps } from './targetTracking/UpsertTargetTrackingModal';
9
9
  import { UpsertTargetTrackingModal } from './targetTracking/UpsertTargetTrackingModal';
10
10
  import { PolicyTypeSelectionModal } from './upsert/PolicyTypeSelectionModal';
@@ -44,7 +44,7 @@ export class CreateScalingPolicyButton extends React.Component<
44
44
 
45
45
  const upsertProps = {
46
46
  app: application,
47
- policy: AwsReactInjector.awsServerGroupTransformer.constructNewStepScalingPolicyTemplate(serverGroup),
47
+ policy: AwsServices.awsServerGroupTransformer.constructNewStepScalingPolicyTemplate(serverGroup),
48
48
  serverGroup,
49
49
  } as IUpsertScalingPolicyModalProps;
50
50
  const modalProps = { dialogClassName: 'wizard-modal modal-lg' };
@@ -56,7 +56,7 @@ export class CreateScalingPolicyButton extends React.Component<
56
56
 
57
57
  const upsertProps = {
58
58
  app: application,
59
- policy: AwsReactInjector.awsServerGroupTransformer.constructNewTargetTrackingPolicyTemplate(),
59
+ policy: AwsServices.awsServerGroupTransformer.constructNewTargetTrackingPolicyTemplate(),
60
60
  serverGroup,
61
61
  } as IUpsertTargetTrackingModalProps;
62
62
  const modalProps = { dialogClassName: 'wizard-modal modal-lg' };
@@ -67,10 +67,7 @@ export interface IUpsertAlarmDescription extends IConfigurableMetric {
67
67
  }
68
68
 
69
69
  export class ScalingPolicyWriter {
70
- public static upsertScalingPolicy(
71
- application: Application,
72
- command: IUpsertScalingPolicyCommand,
73
- ): PromiseLike<ITask> {
70
+ public static upsertScalingPolicy(application: Application, command: IUpsertScalingPolicyCommand): Promise<ITask> {
74
71
  command.type = command.type || 'upsertScalingPolicy';
75
72
  return TaskExecutor.executeTask({
76
73
  application,
@@ -83,7 +80,7 @@ export class ScalingPolicyWriter {
83
80
  application: Application,
84
81
  serverGroup: IServerGroup,
85
82
  scalingPolicy: IScalingPolicy,
86
- ): PromiseLike<ITask> {
83
+ ): Promise<ITask> {
87
84
  return TaskExecutor.executeTask({
88
85
  application,
89
86
  description: 'Delete scaling policy ' + scalingPolicy.policyName,