@spinnaker/azure 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 (215) hide show
  1. package/dist/azure.module.d.ts +3 -1
  2. package/dist/image/image.reader.d.ts +4 -2
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/instance/azureInstanceType.service.d.ts +6 -2
  6. package/dist/instance/details/AzureInstanceDetails.d.ts +67 -0
  7. package/dist/loadBalancer/configure/AzureLoadBalancerChoiceModal.d.ts +10 -5
  8. package/dist/loadBalancer/configure/AzureLoadBalancerModal.d.ts +102 -0
  9. package/dist/loadBalancer/details/azureLoadBalancerDetails.d.ts +26 -0
  10. package/dist/loadBalancer/loadBalancer.transformer.d.ts +45 -2
  11. package/dist/pipeline/stages/AzureAccountRegionClusterSelector.d.ts +32 -0
  12. package/dist/pipeline/stages/bake/azureBakeStage.d.ts +46 -2
  13. package/dist/pipeline/stages/destroyAsg/azureDestroyAsgStage.d.ts +14 -2
  14. package/dist/pipeline/stages/disableAsg/azureDisableAsgStage.d.ts +4 -2
  15. package/dist/pipeline/stages/enableAsg/azureEnableAsgStage.d.ts +4 -2
  16. package/dist/securityGroup/configure/AzureSecurityGroupModal.d.ts +70 -0
  17. package/dist/securityGroup/details/AzureSecurityGroupDetails.d.ts +51 -0
  18. package/dist/securityGroup/securityGroup.reader.d.ts +3 -2
  19. package/dist/securityGroup/securityGroup.transformer.d.ts +3 -2
  20. package/dist/securityGroup/securityGroup.write.service.d.ts +9 -2
  21. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +88 -2
  22. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +30 -2
  23. package/dist/serverGroup/configure/wizard/AzureCloneServerGroupModal.d.ts +44 -0
  24. package/dist/serverGroup/configure/wizard/pages/ServerGroupAdvancedSettings.d.ts +8 -0
  25. package/dist/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.d.ts +12 -0
  26. package/dist/serverGroup/configure/wizard/pages/ServerGroupCapacityAndZones.d.ts +11 -0
  27. package/dist/serverGroup/configure/wizard/pages/ServerGroupHealthSettings.d.ts +10 -0
  28. package/dist/serverGroup/configure/wizard/pages/ServerGroupImageSettings.d.ts +12 -0
  29. package/dist/serverGroup/configure/wizard/pages/ServerGroupInstanceType.d.ts +9 -0
  30. package/dist/serverGroup/configure/wizard/pages/ServerGroupLoadBalancers.d.ts +14 -0
  31. package/dist/serverGroup/configure/wizard/pages/ServerGroupNetworkSettings.d.ts +10 -0
  32. package/dist/serverGroup/configure/wizard/pages/ServerGroupSecurityGroups.d.ts +6 -0
  33. package/dist/serverGroup/configure/wizard/pages/ServerGroupTags.d.ts +9 -0
  34. package/dist/serverGroup/configure/wizard/pages/common.d.ts +14 -0
  35. package/dist/serverGroup/configure/wizard/pages/index.d.ts +10 -0
  36. package/dist/serverGroup/details/azureServerGroupDetails.d.ts +13 -0
  37. package/dist/serverGroup/details/rollback/RollbackServerGroupModal.d.ts +6 -4
  38. package/dist/serverGroup/serverGroup.transformer.d.ts +61 -2
  39. package/dist/validation/applicationName.validator.d.ts +6 -2
  40. package/package.json +5 -8
  41. package/src/azure.module.spec.ts +921 -0
  42. package/src/azure.module.ts +56 -68
  43. package/src/image/image.reader.js +4 -15
  44. package/src/image/image.reader.spec.js +4 -7
  45. package/src/instance/azureInstanceType.service.js +8 -16
  46. package/src/instance/azureInstanceType.service.spec.js +5 -13
  47. package/src/instance/details/AzureInstanceDetails.spec.tsx +364 -0
  48. package/src/instance/details/AzureInstanceDetails.tsx +533 -0
  49. package/src/loadBalancer/configure/AzureLoadBalancerChoiceModal.spec.tsx +125 -0
  50. package/src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx +46 -26
  51. package/src/loadBalancer/configure/AzureLoadBalancerModal.spec.tsx +658 -0
  52. package/src/loadBalancer/configure/AzureLoadBalancerModal.tsx +960 -0
  53. package/src/loadBalancer/details/azureLoadBalancerDetails.spec.tsx +470 -0
  54. package/src/loadBalancer/details/azureLoadBalancerDetails.tsx +412 -0
  55. package/src/loadBalancer/loadBalancer.transformer.js +83 -93
  56. package/src/pipeline/stages/AzureAccountRegionClusterSelector.tsx +238 -0
  57. package/src/pipeline/stages/bake/azureBakeStage.tsx +723 -0
  58. package/src/pipeline/stages/destroyAsg/azureDestroyAsgStage.tsx +128 -0
  59. package/src/pipeline/stages/disableAsg/azureDisableAsgStage.tsx +92 -0
  60. package/src/pipeline/stages/enableAsg/azureEnableAsgStage.tsx +87 -0
  61. package/src/routerConsumers.spec.tsx +69 -0
  62. package/src/securityGroup/configure/AzureSecurityGroupModal.spec.tsx +558 -0
  63. package/src/securityGroup/configure/AzureSecurityGroupModal.tsx +782 -0
  64. package/src/securityGroup/details/AzureSecurityGroupDetails.spec.tsx +291 -0
  65. package/src/securityGroup/details/AzureSecurityGroupDetails.tsx +354 -0
  66. package/src/securityGroup/securityGroup.reader.js +3 -13
  67. package/src/securityGroup/securityGroup.transformer.js +3 -13
  68. package/src/securityGroup/securityGroup.write.service.spec.ts +105 -0
  69. package/src/securityGroup/securityGroup.write.service.ts +73 -0
  70. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +167 -166
  71. package/src/serverGroup/configure/serverGroupCommandBuilder.service.spec.js +63 -0
  72. package/src/serverGroup/configure/serverGroupConfiguration.service.js +325 -309
  73. package/src/serverGroup/configure/serverGroupConfiguration.service.spec.js +57 -53
  74. package/src/serverGroup/configure/wizard/AzureCloneServerGroupModal.spec.tsx +758 -0
  75. package/src/serverGroup/configure/wizard/AzureCloneServerGroupModal.tsx +349 -0
  76. package/src/serverGroup/configure/wizard/pages/ServerGroupAdvancedSettings.tsx +208 -0
  77. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.tsx +122 -0
  78. package/src/serverGroup/configure/wizard/pages/ServerGroupCapacityAndZones.tsx +80 -0
  79. package/src/serverGroup/configure/wizard/pages/ServerGroupHealthSettings.tsx +97 -0
  80. package/src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.tsx +151 -0
  81. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.tsx +41 -0
  82. package/src/serverGroup/configure/wizard/pages/ServerGroupLoadBalancers.tsx +214 -0
  83. package/src/serverGroup/configure/wizard/pages/ServerGroupNetworkSettings.tsx +119 -0
  84. package/src/serverGroup/configure/wizard/pages/ServerGroupSecurityGroups.tsx +54 -0
  85. package/src/serverGroup/configure/wizard/pages/ServerGroupTags.tsx +40 -0
  86. package/src/serverGroup/configure/wizard/pages/common.tsx +72 -0
  87. package/src/serverGroup/configure/wizard/pages/index.ts +10 -0
  88. package/src/serverGroup/details/azureServerGroupDetails.spec.tsx +263 -0
  89. package/src/serverGroup/details/azureServerGroupDetails.tsx +318 -0
  90. package/src/serverGroup/details/rollback/RollbackServerGroupModal.tsx +24 -30
  91. package/src/serverGroup/serverGroup.transformer.js +11 -19
  92. package/src/serverGroup/serverGroup.transformer.spec.js +2 -6
  93. package/src/validation/applicationName.validator.js +14 -29
  94. package/dist/instance/details/instance.details.controller.d.ts +0 -2
  95. package/dist/loadBalancer/configure/createLoadBalancer.controller.d.ts +0 -2
  96. package/dist/loadBalancer/details/loadBalancerDetail.controller.d.ts +0 -2
  97. package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +0 -2
  98. package/dist/securityGroup/clone/cloneSecurityGroup.controller.d.ts +0 -2
  99. package/dist/securityGroup/configure/CreateSecurityGroupCtrl.d.ts +0 -2
  100. package/dist/securityGroup/configure/EditSecurityGroupCtrl.d.ts +0 -2
  101. package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +0 -2
  102. package/dist/serverGroup/configure/serverGroup.configure.azure.module.d.ts +0 -2
  103. package/dist/serverGroup/configure/wizard/CloneServerGroup.azure.controller.d.ts +0 -2
  104. package/dist/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.d.ts +0 -2
  105. package/dist/serverGroup/configure/wizard/ServerGroupInstanceType.controller.d.ts +0 -2
  106. package/dist/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.d.ts +0 -2
  107. package/dist/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.d.ts +0 -2
  108. package/dist/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.d.ts +0 -2
  109. package/dist/serverGroup/configure/wizard/basicSettings/image.regional.filter.d.ts +0 -2
  110. package/dist/serverGroup/configure/wizard/capacity/capacitySelector.directive.d.ts +0 -2
  111. package/dist/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.d.ts +0 -2
  112. package/dist/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.d.ts +0 -2
  113. package/dist/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.d.ts +0 -2
  114. package/dist/serverGroup/configure/wizard/image/imageSettingsSelector.directive.d.ts +0 -2
  115. package/dist/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.d.ts +0 -2
  116. package/dist/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.d.ts +0 -2
  117. package/dist/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.d.ts +0 -2
  118. package/dist/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.d.ts +0 -2
  119. package/dist/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.d.ts +0 -2
  120. package/dist/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.d.ts +0 -2
  121. package/dist/serverGroup/configure/wizard/tags/tagsSelector.directive.d.ts +0 -2
  122. package/dist/serverGroup/configure/wizard/zones/zoneSelector.directive.d.ts +0 -2
  123. package/dist/serverGroup/details/serverGroup.details.module.d.ts +0 -2
  124. package/dist/serverGroup/details/serverGroupDetails.azure.controller.d.ts +0 -2
  125. package/src/instance/details/instance.details.controller.js +0 -371
  126. package/src/instance/details/instance.details.controller.spec.js +0 -129
  127. package/src/instance/details/instanceDetails.html +0 -43
  128. package/src/loadBalancer/configure/advancedSettings.html +0 -95
  129. package/src/loadBalancer/configure/createLoadBalancer.controller.js +0 -275
  130. package/src/loadBalancer/configure/createLoadBalancer.controller.spec.js +0 -39
  131. package/src/loadBalancer/configure/createLoadBalancer.html +0 -25
  132. package/src/loadBalancer/configure/createLoadBalancerProperties.html +0 -128
  133. package/src/loadBalancer/configure/editLoadBalancer.html +0 -26
  134. package/src/loadBalancer/configure/healthCheck.html +0 -74
  135. package/src/loadBalancer/configure/listeners.html +0 -50
  136. package/src/loadBalancer/details/loadBalancerDetail.controller.js +0 -181
  137. package/src/loadBalancer/details/loadBalancerDetail.controller.spec.js +0 -39
  138. package/src/loadBalancer/details/loadBalancerDetail.html +0 -128
  139. package/src/pipeline/stages/bake/azureBakeStage.js +0 -276
  140. package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +0 -40
  141. package/src/pipeline/stages/bake/bakeExecutionDetails.html +0 -50
  142. package/src/pipeline/stages/bake/bakeStage.html +0 -187
  143. package/src/pipeline/stages/destroyAsg/azureDestroyAsgStage.js +0 -73
  144. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +0 -9
  145. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +0 -1
  146. package/src/pipeline/stages/disableAsg/azureDisableAsgStage.js +0 -65
  147. package/src/pipeline/stages/disableAsg/disableAsgStage.html +0 -11
  148. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +0 -1
  149. package/src/pipeline/stages/enableAsg/azureEnableAsgStage.js +0 -70
  150. package/src/pipeline/stages/enableAsg/enableAsgStage.html +0 -11
  151. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +0 -1
  152. package/src/securityGroup/clone/cloneSecurityGroup.controller.js +0 -162
  153. package/src/securityGroup/clone/cloneSecurityGroup.html +0 -8
  154. package/src/securityGroup/configure/CreateSecurityGroup.controller.spec.js +0 -78
  155. package/src/securityGroup/configure/CreateSecurityGroupCtrl.js +0 -265
  156. package/src/securityGroup/configure/EditSecurityGroupCtrl.js +0 -222
  157. package/src/securityGroup/configure/configSecurityGroup.mixin.controller.js +0 -262
  158. package/src/securityGroup/configure/createSecurityGroup.html +0 -20
  159. package/src/securityGroup/configure/createSecurityGroupIngress.html +0 -75
  160. package/src/securityGroup/configure/createSecurityGroupProperties.html +0 -88
  161. package/src/securityGroup/configure/editSecurityGroup.html +0 -19
  162. package/src/securityGroup/details/securityGroupDetail.controller.js +0 -142
  163. package/src/securityGroup/details/securityGroupDetail.html +0 -78
  164. package/src/securityGroup/securityGroup.write.service.js +0 -57
  165. package/src/serverGroup/configure/serverGroup.configure.azure.module.js +0 -47
  166. package/src/serverGroup/configure/wizard/CloneServerGroup.azure.controller.js +0 -247
  167. package/src/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.js +0 -35
  168. package/src/serverGroup/configure/wizard/ServerGroupInstanceType.controller.js +0 -15
  169. package/src/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.js +0 -25
  170. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +0 -5
  171. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html +0 -138
  172. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.js +0 -43
  173. package/src/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.js +0 -71
  174. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.html +0 -131
  175. package/src/serverGroup/configure/wizard/basicSettings/image.regional.filter.js +0 -15
  176. package/src/serverGroup/configure/wizard/basicSettings/image.regional.filter.spec.js +0 -42
  177. package/src/serverGroup/configure/wizard/capacity/capacity.html +0 -5
  178. package/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html +0 -20
  179. package/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.js +0 -21
  180. package/src/serverGroup/configure/wizard/capacity/zones.html +0 -5
  181. package/src/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.js +0 -38
  182. package/src/serverGroup/configure/wizard/healthSettings/healthSettings.html +0 -5
  183. package/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html +0 -32
  184. package/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.js +0 -22
  185. package/src/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.js +0 -34
  186. package/src/serverGroup/configure/wizard/image/imageSettings.html +0 -5
  187. package/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html +0 -33
  188. package/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.js +0 -22
  189. package/src/serverGroup/configure/wizard/instanceArchetype.html +0 -33
  190. package/src/serverGroup/configure/wizard/instanceType/instanceType.html +0 -10
  191. package/src/serverGroup/configure/wizard/instanceType.html +0 -33
  192. package/src/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js +0 -137
  193. package/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html +0 -3
  194. package/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html +0 -41
  195. package/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.js +0 -22
  196. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.js +0 -44
  197. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html +0 -54
  198. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.js +0 -19
  199. package/src/serverGroup/configure/wizard/networkSettings/networkSettings.html +0 -3
  200. package/src/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.js +0 -28
  201. package/src/serverGroup/configure/wizard/securityGroup/securityGroups.html +0 -3
  202. package/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html +0 -40
  203. package/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.js +0 -38
  204. package/src/serverGroup/configure/wizard/serverGroupWizard.html +0 -61
  205. package/src/serverGroup/configure/wizard/tags/tags.html +0 -5
  206. package/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html +0 -16
  207. package/src/serverGroup/configure/wizard/tags/tagsSelector.directive.js +0 -30
  208. package/src/serverGroup/configure/wizard/templateSelection.html +0 -9
  209. package/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html +0 -21
  210. package/src/serverGroup/configure/wizard/zones/zoneSelector.directive.js +0 -28
  211. package/src/serverGroup/details/serverGroup.details.module.js +0 -11
  212. package/src/serverGroup/details/serverGroupDetails.azure.controller.js +0 -260
  213. package/src/serverGroup/details/serverGroupDetails.html +0 -98
  214. package/src/subnet/subnetSelectField.directive.html +0 -28
  215. package/src/subnet/subnetSelectField.directive.js +0 -35
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utility.ts","../src/help/azure.help.ts","../src/image/image.reader.js","../src/instance/azureInstanceType.service.js","../src/instance/details/instance.details.controller.js","../src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx","../src/azure.settings.ts","../src/loadBalancer/loadBalancer.transformer.js","../src/loadBalancer/configure/createLoadBalancer.controller.js","../src/loadBalancer/details/loadBalancerDetail.controller.js","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/serverGroup/serverGroup.transformer.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/pipeline/stages/bake/azureBakeStage.js","../src/pipeline/stages/destroyAsg/azureDestroyAsgStage.js","../src/pipeline/stages/disableAsg/azureDisableAsgStage.js","../src/pipeline/stages/enableAsg/azureEnableAsgStage.js","../src/securityGroup/securityGroup.write.service.js","../src/securityGroup/configure/CreateSecurityGroupCtrl.js","../src/securityGroup/configure/EditSecurityGroupCtrl.js","../src/securityGroup/clone/cloneSecurityGroup.controller.js","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.js","../src/serverGroup/configure/wizard/ServerGroupInstanceType.controller.js","../src/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.js","../src/serverGroup/configure/wizard/basicSettings/image.regional.filter.js","../src/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/capacity/capacitySelector.directive.js","../src/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.js","../src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.js","../src/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.js","../src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.js","../src/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js","../src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.js","../src/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.js","../src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.js","../src/serverGroup/configure/wizard/tags/tagsSelector.directive.js","../src/serverGroup/configure/wizard/zones/zoneSelector.directive.js","../src/serverGroup/configure/serverGroup.configure.azure.module.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.azure.controller.js","../src/common/AzureModalFooter.tsx","../src/serverGroup/details/rollback/RollbackServerGroupModal.tsx","../src/serverGroup/details/serverGroupDetails.azure.controller.js","../src/serverGroup/details/serverGroup.details.module.js","../src/validation/applicationName.validator.js","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/azure.module.ts","../src/logo/logo_azure.png"],"sourcesContent":["export interface ITagResult {\n isValid: boolean;\n error: TagError | null;\n errorMessage?: string;\n}\n\nexport enum TagError {\n TAG_NUMBER_EXCEED,\n TAG_KEY_LENGTH_EXCEED,\n TAG_VALUE_LENGTH_EXCEED,\n TAG_KEY_INVALID_CHARACTER,\n TAG_VALUE_INVALID_CHARACTER,\n TAG_OBJECT_UNDEFINED,\n}\n\nexport interface IAzureLoadBalancer {\n type: string;\n description: string;\n}\n\nexport const AzureLoadBalancerTypes: IAzureLoadBalancer[] = [\n {\n type: 'Azure Load Balancer',\n description: '',\n },\n {\n type: 'Azure Application Gateway',\n description: '',\n },\n];\n\nexport default class Utility {\n public static readonly TAG_LIMITATION: number = 8;\n public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512;\n public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256;\n public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\\\?/]/;\n\n public static checkTags(tagsObject: { [s: string]: string }): ITagResult {\n if (!tagsObject) {\n return {\n isValid: false,\n error: TagError.TAG_OBJECT_UNDEFINED,\n errorMessage: 'instanceTags is not defined',\n };\n }\n const length: number = Object.keys(tagsObject).length;\n if (!(length >= 0 && length <= Utility.TAG_LIMITATION)) {\n return {\n isValid: false,\n error: TagError.TAG_NUMBER_EXCEED,\n errorMessage: `Number of tags exceeds the limit: ${Utility.TAG_LIMITATION}`,\n };\n }\n\n for (const [k, v] of Object.entries(tagsObject)) {\n if (k.length > Utility.TAG_KEY_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_LENGTH_EXCEED,\n errorMessage: `Length of Tag key: ${k} exceeds the limit: ${Utility.TAG_KEY_LENGTH_LIMITATION}`,\n };\n }\n if (v.length > Utility.TAG_VALUE_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_LENGTH_EXCEED,\n errorMessage: `Length of Tag value: ${v} exceeds the limit: ${Utility.TAG_VALUE_LENGTH_LIMITATION}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(k)) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag key: ${k}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(v)) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag value: ${v}`,\n };\n }\n }\n return {\n isValid: true,\n error: null,\n };\n }\n\n public static getLoadBalancerType(typeString: string): IAzureLoadBalancer | null {\n typeString = typeString.toLowerCase().split('_').join(' ');\n return AzureLoadBalancerTypes.find((lb: IAzureLoadBalancer) => lb.type.toLowerCase() === typeString) || null;\n }\n}\n","import { HelpContentsRegistry } from '@spinnaker/core';\nimport Utility from '../utility';\n\nconst helpContents: { [key: string]: string } = {\n 'azure.securityGroup.ingress.description': 'Friendly description of the rule you want to enable (limit 80 chars.)',\n 'azure.securityGroup.ingress.priority':\n \"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.\",\n 'azure.securityGroup.ingress.source':\n \"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.sourcePortRange':\n 'The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.destination':\n \"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.destinationPortRange':\n 'The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.direction': 'Specifies whether the rule is for inbound or outbound traffic.',\n 'azure.securityGroup.ingress.actions':\n 'To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.',\n 'azure.securityGroup.ingress.destPortRanges':\n 'Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.',\n 'azure.securityGroup.ingress.sourceIPCIDRRanges':\n 'Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24',\n 'azure.serverGroup.imageName': '(Required) <b>Image</b> is the deployable Azure Machine Image.',\n 'azure.serverGroup.stack':\n '(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'azure.serverGroup.detail':\n '(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n 'azure.serverGroup.scriptLocation':\n 'The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2',\n 'azure.serverGroup.commandToExecute':\n 'Command(s) to execute custom scripts provided during provisioning of an instance.',\n 'azure.serverGroup.customData': 'Script or metadata to be injected into each instances.',\n 'azure.serverGroup.customTags': `Custom tags on Virtual Machine Scale Set. Allow ${Utility.TAG_LIMITATION} tags at most.`,\n 'azure.serverGroup.enableInboundNAT':\n 'An Azure load balancer of the basic sku will be created with adding inbound NAT port-forwarding rules to facilitate loggin on VM instances. There is no charge for creating an Azure load balancer of the basic sku. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.',\n 'azure.serverGroup.lun':\n 'Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.',\n 'azure.serverGroup.diskSizeGB':\n 'Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB',\n 'azure.serverGroup.managedDisk.storageAccountType':\n 'You can choose between Azure managed disks types to support your workload or scenario.',\n 'azure.serverGroup.caching':\n 'Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.',\n 'azure.serverGroup.userAssignedIdentities':\n 'Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview',\n 'azure.loadBalancer.dnsName':\n 'If there is no custom DNS label specified, a default DNS name will be created. The default value will be \"GeneratedText.cloudapp.net\" for Azure Application Gateway or \"GeneratedText.[region].cloudapp.azure.com\" for Azure Load Balancer.',\n 'azure.loadBalancer.probes.probeInterval':\n 'Probe interval in seconds. This value is the time interval between two consecutive probes.',\n 'azure.loadBalancer.probes.timeout':\n 'Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.',\n 'azure.loadBalancer.probes.unhealthyThreshold':\n 'Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.',\n 'azure.loadBalancer.loadBalancingRules.idleTimeout':\n 'Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.',\n 'azure.loadBalancer.loadBalancingRules.sessionPersistence':\n 'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. \"None\" specifies that successive requests from the same client may be handled by any virtual machine. \"Client IP\" specifies that successive requests from the same client IP address will be handled by the same virtual machine. \"Client IP and protocol\" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nexport const AZURE_IMAGE_IMAGE_READER = 'spinnaker.azure.image.reader';\nexport const name = AZURE_IMAGE_IMAGE_READER; // for backwards compatibility\nmodule(AZURE_IMAGE_IMAGE_READER, []).factory('azureImageReader', function () {\n function findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .then(\n function (results) {\n return results;\n },\n function () {\n return [];\n },\n );\n }\n\n function getImage(amiName, region, credentials) {\n return REST('/images')\n .path(credentials, region, amiName)\n .query({ provider: 'azure' })\n .get()\n .then(\n function (results) {\n return results && results.length ? results[0] : null;\n },\n function () {\n return null;\n },\n );\n }\n\n return {\n findImages: findImages,\n getImage: getImage,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE = 'spinnaker.azure.instanceType.service';\nexport const name = AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE; // for backwards compatibility\nmodule(AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE, []).factory('azureInstanceTypeService', [\n '$q',\n function ($q) {\n const B = {\n type: 'B-series',\n description:\n 'The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.',\n instanceTypes: [\n {\n name: 'Standard_B1ms',\n label: 'Standard_B1ms',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 4,\n },\n },\n {\n name: 'Standard_B1s',\n label: 'Standard_B1s',\n cpu: 1,\n memory: 1,\n storage: {\n type: 'SSD',\n count: 2,\n size: 2,\n },\n },\n {\n name: 'Standard_B2ms',\n label: 'Standard_B2ms',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_B2s',\n label: 'Standard_B2s',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 8,\n },\n },\n {\n name: 'Standard_B4ms',\n label: 'Standard_B4ms',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_B8ms',\n label: 'Standard_B8ms',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_B1ls',\n label: 'Standard_B1ls',\n cpu: 1,\n memory: 0.5,\n storage: {\n type: 'SSD',\n count: 2,\n size: 1,\n },\n },\n ],\n };\n\n const DSV3 = {\n type: 'Dsv3-series',\n description:\n 'The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2s_v3',\n label: 'Standard_D2s_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_D4s_v3',\n label: 'Standard_D4s_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_D8s_v3',\n label: 'Standard_D8s_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_D16s_v3',\n label: 'Standard_D16s_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 128,\n },\n },\n {\n name: 'Standard_D32s_v3',\n label: 'Standard_D32s_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 256,\n },\n },\n {\n name: 'Standard_D64s_v3',\n label: 'Standard_D64s_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 512,\n },\n },\n ],\n };\n\n const DV3 = {\n type: 'Dv3-series',\n description:\n 'The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2_v3',\n label: 'Standard_D2_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D4_v3',\n label: 'Standard_D4_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D8_v3',\n label: 'Standard_D8_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D16_v3',\n label: 'Standard_D16_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D32_v3',\n label: 'Standard_D32_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 800,\n },\n },\n {\n name: 'Standard_D64_v3',\n label: 'Standard_D64_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 1600,\n },\n },\n ],\n };\n\n const DSV2 = {\n type: 'DSv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DS1_v2',\n label: 'Standard_DS1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 7,\n },\n },\n {\n name: 'Standard_DS2_v2',\n label: 'Standard_DS2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 14,\n },\n },\n {\n name: 'Standard_DS3_v2',\n label: 'Standard_DS3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 28,\n },\n },\n {\n name: 'Standard_DS4_v2',\n label: 'Standard_DS4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 56,\n },\n },\n {\n name: 'Standard_DS5_v2',\n label: 'Standard_DS5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 112,\n },\n },\n {\n name: 'Standard_DS11_v2',\n label: 'Standard_DS11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 28,\n },\n },\n {\n name: 'Standard_DS12_v2',\n label: 'Standard_DS12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 56,\n },\n },\n {\n name: 'Standard_DS13_v2',\n label: 'Standard_DS13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 112,\n },\n },\n {\n name: 'Standard_DS14_v2',\n label: 'Standard_DS14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 224,\n },\n },\n {\n name: 'Standard_DS15_v2',\n label: 'Standard_DS15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const DV2 = {\n type: 'Dv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_D1_v2',\n label: 'Standard_D1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D2_v2',\n label: 'Standard_D2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D3_v2',\n label: 'Standard_D3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D4_v2',\n label: 'Standard_D4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D5_v2',\n label: 'Standard_D5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D11_v2',\n label: 'Standard_D11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D12_v2',\n label: 'Standard_D12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D13_v2',\n label: 'Standard_D13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D14_v2',\n label: 'Standard_D14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D15_v2',\n label: 'Standard_D15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const AV2 = {\n type: 'Av2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_A1_v2',\n label: 'Standard_A1_v2',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 10,\n },\n },\n {\n name: 'Standard_A2m_v2',\n label: 'Standard_A2m_v2',\n cpu: 2,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A2_v2',\n label: 'Standard_A2_v2',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A4m_v2',\n label: 'Standard_A4m_v2',\n cpu: 4,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A4_v2',\n label: 'Standard_A4_v2',\n cpu: 4,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A8m_v2',\n label: 'Standard_A8m_v2',\n cpu: 8,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n {\n name: 'Standard_A8_v2',\n label: 'Standard_A8_v2',\n cpu: 8,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n ],\n };\n\n const DC = {\n type: 'DC-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DC2s',\n label: 'Standard_DC2s',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 2,\n size: 100,\n },\n },\n {\n name: 'Standard_DC4s',\n label: 'Standard_DC4s',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 200,\n },\n },\n ],\n };\n\n const FSV2 = {\n type: 'Fsv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F2s_v2',\n label: 'Standard_F2s_v2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F4s_v2',\n label: 'Standard_F4s_v2',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F8s_v2',\n label: 'Standard_F8s_v2',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F16s_v2',\n label: 'Standard_F16s_v2',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F32s_v2',\n label: 'Standard_F32s_v2',\n cpu: 32,\n memory: 64,\n storage: { type: 'SSD', count: 32, size: 256 },\n },\n {\n name: 'Standard_F64s_v2',\n label: 'Standard_F64s_v2',\n cpu: 64,\n memory: 128,\n storage: { type: 'SSD', count: 32, size: 512 },\n },\n {\n name: 'Standard_F72s_v2',\n label: 'Standard_F72s_v2',\n cpu: 72,\n memory: 144,\n storage: { type: 'SSD', count: 32, size: 576 },\n },\n ],\n };\n\n const FS = {\n type: 'Fs-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1s',\n label: 'Standard_F1s',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 4 },\n },\n {\n name: 'Standard_F2s',\n label: 'Standard_F2s',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 8 },\n },\n {\n name: 'Standard_F4s',\n label: 'Standard_F4s',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 16 },\n },\n {\n name: 'Standard_F8s',\n label: 'Standard_F8s',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 32 },\n },\n {\n name: 'Standard_F16s',\n label: 'Standard_F16s',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 64 },\n },\n ],\n };\n\n const F = {\n type: 'F-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1',\n label: 'Standard_F1',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F2',\n label: 'Standard_F2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F4',\n label: 'Standard_F4',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F8',\n label: 'Standard_F8',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F16',\n label: 'Standard_F16',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 256 },\n },\n ],\n };\n\n const categories = [\n {\n type: 'general',\n label: 'General Purpose',\n description:\n 'Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.',\n families: [B, DSV3, DV3, DSV2, DV2, AV2, DC],\n icon: 'hdd',\n },\n {\n type: 'compute',\n label: 'Compute Optimized',\n description:\n 'High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.',\n families: [FSV2, FS, F],\n icon: 'hdd',\n },\n {\n type: 'custom',\n label: 'Custom Type',\n description: 'Select the instance type below.',\n families: [],\n icon: 'asterisk',\n },\n ];\n\n function calculateStorage(type) {\n if (!type || !type.storage) {\n return 0;\n }\n return type.storage.count * type.storage.size;\n }\n\n function buildStats(category) {\n const stats = {\n cpu: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n memory: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n storage: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n families: [],\n };\n\n if (category.families && category.families.length) {\n category.families.forEach(function (family) {\n stats.families.push(family.type);\n const cpuMin = _.minBy(family.instanceTypes, 'cpu').cpu || Number.MAX_VALUE;\n const cpuMax = _.maxBy(family.instanceTypes, 'cpu').cpu || -Number.MAX_VALUE;\n const memoryMin = _.minBy(family.instanceTypes, 'memory').memory || Number.MAX_VALUE;\n const memoryMax = _.maxBy(family.instanceTypes, 'memory').memory || -Number.MAX_VALUE;\n const storageMin = calculateStorage(_.minBy(family.instanceTypes, calculateStorage)) || Number.MAX_VALUE;\n const storageMax = calculateStorage(_.maxBy(family.instanceTypes, calculateStorage)) || -Number.MAX_VALUE;\n\n stats.cpu.min = Math.min(stats.cpu.min, cpuMin);\n stats.cpu.max = Math.max(stats.cpu.max, cpuMax);\n stats.memory.min = Math.min(stats.memory.min, memoryMin);\n stats.memory.max = Math.max(stats.memory.max, memoryMax);\n stats.storage.min = Math.min(stats.storage.min, storageMin);\n stats.storage.max = Math.max(stats.storage.max, storageMax);\n });\n }\n\n return stats;\n }\n\n function getCategories() {\n categories.map(function (category) {\n for (const family of category.families) {\n for (const inst of family.instanceTypes) {\n if (inst.costFactor == undefined) inst.costFactor = 0;\n }\n }\n category.stats = buildStats(category);\n });\n return $q.when(categories);\n }\n\n const getAllTypesByRegion = function getAllTypesByRegion() {\n return getCategories();\n };\n\n function getAvailableTypesForRegions(locationToInstanceTypesMap, selectedLocations) {\n // This function is only ever called with one location.\n const [location] = selectedLocations;\n return locationToInstanceTypesMap[location];\n }\n\n return {\n getCategories: getCategories,\n getAvailableTypesForRegions: getAvailableTypesForRegions,\n getAllTypesByRegion: getAllTypesByRegion,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n} from '@spinnaker/core';\n\nexport const AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.azure.instance.detail.controller';\nexport const name = AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'azureInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n '$q',\n function ($scope, $state, $uibModal, instance, app, $q) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('azure', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Azure' || metric.state !== 'Unknown';\n });\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then(\n function (details) {\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n const discoveryMetric = _.find($scope.healthMetrics, function (metric) {\n return metric.type === 'Discovery';\n });\n if (discoveryMetric && discoveryMetric.vipAddress) {\n const vipList = discoveryMetric.vipAddress;\n $scope.instance.vipAddress = vipList.includes(',') ? vipList.split(',') : [vipList];\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n },\n function () {\n // When an instance is first starting up, we may not have the details cached in oort yet, but we still\n // want to let the user see what details we have\n $scope.state.loading = false;\n $state.go('^');\n },\n );\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n this.canDeregisterFromLoadBalancer = function () {\n return $scope.instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n };\n\n this.canRegisterWithLoadBalancer = function () {\n const instance = $scope.instance;\n if (!instance.loadBalancers || !instance.loadBalancers.length) {\n return false;\n }\n const outOfService = instance.health.some(function (health) {\n return health.type === 'LoadBalancer' && health.state === 'OutOfService';\n });\n const hasLoadBalancerHealth = instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n return outOfService || !hasLoadBalancerHealth;\n };\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const discoveryHealth = instance.health.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rebootInstance = function rebootInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Rebooting ' + instance.instanceId,\n };\n\n const submitMethod = function () {\n return InstanceWriter.rebootInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really reboot ' + instance.instanceId + '?',\n buttonText: 'Reboot ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.registerInstanceWithLoadBalancer = function registerInstanceWithLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Registering ' + instance.instanceId + ' with ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.registerInstanceWithLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really register ' + instance.instanceId + ' with ' + loadBalancerNames + '?',\n buttonText: 'Register ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.deregisterInstanceFromLoadBalancer = function deregisterInstanceFromLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Deregistering ' + instance.instanceId + ' from ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.deregisterInstanceFromLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really deregister ' + instance.instanceId + ' from ' + loadBalancerNames + '?',\n buttonText: 'Deregister ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n return instance.health.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import React from 'react';\nimport { Button, Modal } from 'react-bootstrap';\n\nimport type { ILoadBalancerModalProps } from '@spinnaker/core';\nimport { CloudProviderRegistry, ModalClose, ModalInjector, noop, ReactModal } from '@spinnaker/core';\n\nimport type { IAzureLoadBalancer } from '../../utility';\nimport { AzureLoadBalancerTypes } from '../../utility';\n\nexport interface IAzureLoadBalancerChoiceModalState {\n choices: IAzureLoadBalancer[];\n selectedChoice: IAzureLoadBalancer;\n}\n\nexport class AzureLoadBalancerChoiceModal extends React.Component<\n ILoadBalancerModalProps,\n IAzureLoadBalancerChoiceModalState\n> {\n public static defaultProps: Partial<ILoadBalancerModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: ILoadBalancerModalProps): Promise<void> {\n return ReactModal.show(AzureLoadBalancerChoiceModal, {\n ...props,\n className: 'create-pipeline-modal-overflow-visible',\n });\n }\n\n constructor(props: ILoadBalancerModalProps) {\n super(props);\n this.state = {\n choices: AzureLoadBalancerTypes,\n selectedChoice: AzureLoadBalancerTypes[0],\n };\n }\n\n public choiceSelected(choice: IAzureLoadBalancer): void {\n this.setState({ selectedChoice: choice });\n }\n\n private choose = (): void => {\n this.close();\n const provider: any = CloudProviderRegistry.getValue('azure', 'loadBalancer');\n ModalInjector.modalService\n .open({\n templateUrl: provider.createLoadBalancerTemplateUrl,\n windowClass: 'modal-z-index',\n controller: `${provider.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.props.app,\n loadBalancer: (): any => null,\n isNew: () => true,\n forPipelineConfig: () => false,\n loadBalancerType: () => this.state.selectedChoice,\n },\n })\n .result.catch(() => {});\n };\n\n public close = (reason?: any): void => {\n this.props.dismissModal(reason);\n };\n\n public render() {\n const { choices, selectedChoice } = this.state;\n\n return (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Select Type of Load Balancer</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"modal-body\">\n <div className=\"card-choices\">\n {choices.map((choice) => (\n <div\n key={choice.type}\n className={`card ${selectedChoice === choice ? 'active' : ''}`}\n onClick={() => this.choiceSelected(choice)}\n >\n <h3 className=\"load-balancer-label\">{choice.type}</h3>\n <div>{choice.description}</div>\n </div>\n ))}\n </div>\n <div className=\"load-balancer-description\" />\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={this.choose}>\n Configure Load Balancer <span className=\"glyphicon glyphicon-chevron-right\" />\n </Button>\n </Modal.Footer>\n </>\n );\n }\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IAzureProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const AzureProviderSettings: IAzureProviderSettings = (SETTINGS.providers.azure as IAzureProviderSettings) || {\n defaults: {},\n};\nif (AzureProviderSettings) {\n AzureProviderSettings.resetToOriginal = SETTINGS.resetProvider('azure');\n}\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AzureProviderSettings } from '../azure.settings';\n\nexport const AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER = 'spinnaker.azure.loadBalancer.transformer';\nexport const name = AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER, []).factory('azureLoadBalancerTransformer', [\n '$q',\n function ($q) {\n function normalizeLoadBalancer(loadBalancer) {\n loadBalancer.serverGroups.forEach(function (serverGroup) {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {\n return { id: instanceId };\n });\n serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);\n } else {\n serverGroup.detachedInstances = [];\n }\n });\n const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();\n return $q.resolve(loadBalancer);\n }\n\n function convertLoadBalancerForEditing(loadBalancer) {\n const toEdit = {\n region: loadBalancer.region,\n credentials: loadBalancer.account,\n name: loadBalancer.name,\n stack: loadBalancer.stack,\n detail: loadBalancer.detail,\n vnet: loadBalancer.vnet,\n subnet: loadBalancer.subnet,\n probes: [],\n loadBalancingRules: [],\n };\n\n if (loadBalancer.elb) {\n const elb = loadBalancer.elb;\n\n toEdit.securityGroups = elb.securityGroups;\n toEdit.vnet = elb.vnet;\n\n if (elb.loadBalancingRules) {\n toEdit.loadBalancingRules = elb.loadBalancingRules;\n }\n\n toEdit.probes = elb.probes;\n if (elb.dnsName && elb.dnsName !== 'dns-not-found') {\n toEdit.dnsName = elb.dnsName.split('.')[0];\n }\n }\n return toEdit;\n }\n\n function constructNewLoadBalancerTemplate(application) {\n const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;\n const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;\n return {\n stack: '',\n detail: 'frontend',\n credentials: defaultCredentials,\n region: defaultRegion,\n cloudProvider: 'azure',\n vnet: null,\n subnet: null,\n probes: [\n {\n probeName: '',\n probeProtocol: 'HTTP',\n probePort: '80',\n probePath: '/',\n probeInterval: 30,\n unhealthyThreshold: 8,\n timeout: 120,\n },\n ],\n securityGroups: [],\n loadBalancingRules: [\n {\n ruleName: '',\n protocol: 'HTTP',\n externalPort: 80,\n backendPort: 80,\n probeName: '',\n persistence: 'None',\n idleTimeout: 4,\n },\n ],\n sku: 'Standard_v2',\n };\n }\n\n return {\n normalizeLoadBalancer: normalizeLoadBalancer,\n convertLoadBalancerForEditing: convertLoadBalancerForEditing,\n constructNewLoadBalancerTemplate: constructNewLoadBalancerTemplate,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, LoadBalancerWriter, NameUtils, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from '../loadBalancer.transformer';\n\nexport const AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER =\n 'spinnaker.azure.loadBalancer.create.controller';\nexport const name = AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n]).controller('azureCreateLoadBalancerCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n 'azureLoadBalancerTransformer',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'loadBalancerType',\n function (\n $scope,\n $uibModalInstance,\n $state,\n azureLoadBalancerTransformer,\n application,\n loadBalancer,\n isNew,\n loadBalancerType,\n ) {\n const ctrl = this;\n\n $scope.regions = [];\n\n $scope.pages = {\n location: require('./createLoadBalancerProperties.html'),\n listeners: require('./listeners.html'),\n healthCheck: require('./healthCheck.html'),\n advancedSettings: require('./advancedSettings.html'),\n };\n\n $scope.isNew = isNew;\n $scope.loadBalancerType = loadBalancerType.type;\n $scope.isALB = loadBalancerType.type === 'Azure Load Balancer';\n\n $scope.state = {\n accountsLoaded: false,\n submitting: false,\n };\n\n $scope.validSkus = ['Standard_v2', 'Standard_Small'];\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.loadBalancer.name,\n accountId: $scope.loadBalancer.credentials,\n region: $scope.loadBalancer.region,\n provider: 'azure',\n };\n\n if (!$state.includes('**.loadBalancerDetails')) {\n $state.go('.loadBalancerDetails', newStateParams);\n } else {\n $state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.loadBalancers.refresh();\n application.loadBalancers.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: (isNew ? 'Creating ' : 'Updating ') + 'your load balancer',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function initializeCreateMode() {\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accountsLoaded = true;\n ctrl.accountUpdated();\n });\n }\n\n function initializeController() {\n if (loadBalancer) {\n $scope.loadBalancer = azureLoadBalancerTransformer.convertLoadBalancerForEditing(loadBalancer);\n if (isNew) {\n const nameParts = NameUtils.parseLoadBalancerName($scope.loadBalancer.name);\n $scope.loadBalancer.stack = nameParts.stack;\n $scope.loadBalancer.detail = nameParts.freeFormDetails;\n delete $scope.loadBalancer.name;\n }\n } else {\n $scope.loadBalancer = azureLoadBalancerTransformer.constructNewLoadBalancerTemplate(application);\n }\n if (isNew) {\n updateLoadBalancerNames();\n initializeCreateMode();\n }\n }\n\n function updateLoadBalancerNames() {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n\n const accountLoadBalancersByRegion = {};\n application\n .getDataSource('loadBalancers')\n .refresh(true)\n .then(() => {\n application.getDataSource('loadBalancers').data.forEach((loadBalancer) => {\n if (loadBalancer.account === account) {\n accountLoadBalancersByRegion[loadBalancer.region] =\n accountLoadBalancersByRegion[loadBalancer.region] || [];\n accountLoadBalancersByRegion[loadBalancer.region].push(loadBalancer.name);\n }\n });\n\n $scope.existingLoadBalancerNames = accountLoadBalancersByRegion[region] || [];\n });\n }\n\n initializeController();\n\n this.requiresHealthCheckPath = function () {\n return (\n $scope.loadBalancer.probes[0].probeProtocol && $scope.loadBalancer.probes[0].probeProtocol.indexOf('HTTP') === 0\n );\n };\n\n this.updateName = function () {\n $scope.loadBalancer.name = this.getName();\n };\n\n this.getName = function () {\n const elb = $scope.loadBalancer;\n const elbName = [application.name, elb.stack || '', elb.detail || ''].join('-');\n return _.trimEnd(elbName, '-');\n };\n\n this.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.loadBalancer.credentials).then(function (regions) {\n $scope.regions = regions;\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n updateLoadBalancerNames();\n ctrl.updateName();\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n $scope.loadBalancer.selectedVnet = null;\n $scope.loadBalancer.vnet = null;\n $scope.loadBalancer.vnetResourceGroup = null;\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.loadBalancer.vnet = item.name;\n $scope.loadBalancer.vnetResourceGroup = item.resourceGroup;\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n if (device && device.type !== 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n ctrl.selectedSubnets.push(subnet);\n }\n });\n }\n };\n\n this.removeListener = function (index) {\n $scope.loadBalancer.loadBalancingRules.splice(index, 1);\n };\n\n this.addListener = function () {\n $scope.loadBalancer.loadBalancingRules.push({ protocol: 'HTTP' });\n };\n\n this.submit = function () {\n const descriptor = isNew ? 'Create' : 'Update';\n\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n clusterName: $scope.loadBalancer.clusterName,\n resourceGroupName: $scope.loadBalancer.clusterName,\n loadBalancerName: $scope.loadBalancer.name,\n };\n\n if ($scope.loadBalancer.selectedVnet) {\n $scope.loadBalancer.vnet = $scope.loadBalancer.selectedVnet.name;\n $scope.loadBalancer.vnetResourceGroup = $scope.loadBalancer.selectedVnet.resourceGroup;\n }\n\n if ($scope.loadBalancer.selectedSubnet) {\n $scope.loadBalancer.subnet = $scope.loadBalancer.selectedSubnet.name;\n }\n\n const name = $scope.loadBalancer.clusterName || $scope.loadBalancer.name;\n const probeName = name + '-probe';\n const ruleNameBase = name + '-rule';\n $scope.loadBalancer.type = 'upsertLoadBalancer';\n $scope.loadBalancer.loadBalancerType = $scope.loadBalancerType;\n if (!$scope.loadBalancer.vnet && !$scope.loadBalancer.subnetType) {\n $scope.loadBalancer.securityGroups = null;\n }\n\n $scope.loadBalancer.probes[0].probeName = probeName;\n\n $scope.loadBalancer.loadBalancingRules.forEach((rule, index) => {\n rule.ruleName = ruleNameBase + index;\n rule.probeName = probeName;\n });\n\n if ($scope.loadBalancer.probes[0].probeProtocol === 'TCP') {\n $scope.loadBalancer.probes[0].probePath = undefined;\n }\n\n return LoadBalancerWriter.upsertLoadBalancer($scope.loadBalancer, application, descriptor, params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n LOAD_BALANCER_READ_SERVICE,\n LoadBalancerWriter,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER =\n 'spinnaker.azure.loadBalancer.details.controller';\nexport const name = AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER, [\n ANGULAR_UI_BOOTSTRAP,\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n LOAD_BALANCER_READ_SERVICE,\n ])\n .controller('azureLoadBalancerDetailsCtrl', [\n '$scope',\n '$state',\n '$exceptionHandler',\n '$uibModal',\n 'loadBalancer',\n 'app',\n 'securityGroupReader',\n 'loadBalancerReader',\n '$q',\n function (\n $scope,\n $state,\n $exceptionHandler,\n $uibModal,\n loadBalancer,\n app,\n securityGroupReader,\n loadBalancerReader,\n $q,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n function extractLoadBalancer() {\n $scope.loadBalancer = app.loadBalancers.data.filter(function (test) {\n return (\n test.name === loadBalancer.name &&\n test.region === loadBalancer.region &&\n test.account === loadBalancer.accountId\n );\n })[0];\n\n if ($scope.loadBalancer) {\n const detailsLoader = loadBalancerReader.getLoadBalancerDetails(\n $scope.loadBalancer.provider,\n loadBalancer.accountId,\n loadBalancer.region,\n loadBalancer.name,\n );\n\n return detailsLoader.then(function (details) {\n $scope.state.loading = false;\n const securityGroups = [];\n\n const filtered = details.filter(function (test) {\n return test.name === loadBalancer.name;\n });\n\n if (filtered.length) {\n $scope.loadBalancer.elb = filtered[0];\n\n $scope.loadBalancer.account = loadBalancer.accountId;\n\n if ($scope.loadBalancer.elb.securityGroups) {\n $scope.loadBalancer.elb.securityGroups.forEach(function (securityGroupId) {\n const match = securityGroupReader.getApplicationSecurityGroup(\n app,\n loadBalancer.accountId,\n loadBalancer.region,\n securityGroupId,\n );\n if (match) {\n securityGroups.push(match);\n }\n });\n $scope.securityGroups = _.sortBy(securityGroups, 'name');\n }\n\n if ($scope.loadBalancer.loadBalancerType && $scope.loadBalancer.loadBalancerType.includes('_')) {\n const type = $scope.loadBalancer.loadBalancerType;\n $scope.loadBalancer.loadBalancerType = type\n .split('_')\n .map((s) => {\n const ss = s.toLowerCase();\n return ss.substring(0, 1).toUpperCase() + ss.substring(1);\n })\n .join(' ');\n }\n }\n });\n }\n if (!$scope.loadBalancer) {\n $state.go('^');\n }\n\n return $q.when(null);\n }\n\n app\n .ready()\n .then(extractLoadBalancer)\n .then(() => {\n // If the user navigates away from the view before the initial extractLoadBalancer call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.onRefresh($scope, extractLoadBalancer);\n }\n });\n\n this.editLoadBalancer = function editLoadBalancer() {\n $uibModal.open({\n templateUrl: require('../configure/editLoadBalancer.html'),\n controller: 'azureCreateLoadBalancerCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: function () {\n return app;\n },\n loadBalancer: function () {\n return angular.copy($scope.loadBalancer);\n },\n isNew: function () {\n return false;\n },\n loadBalancerType: function () {\n return { type: $scope.loadBalancer.loadBalancerType };\n },\n },\n });\n };\n\n this.deleteLoadBalancer = function deleteLoadBalancer() {\n if ($scope.loadBalancer.instances && $scope.loadBalancer.instances.length) {\n return;\n }\n\n const taskMonitor = {\n application: app,\n title: 'Deleting ' + loadBalancer.name,\n };\n\n const command = {\n cloudProvider: 'azure',\n loadBalancerName: $scope.loadBalancer.name,\n loadBalancerType: $scope.loadBalancer.loadBalancerType,\n credentials: $scope.loadBalancer.account,\n region: loadBalancer.region,\n appName: app.name,\n };\n\n const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, app);\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + loadBalancer.name + '?',\n buttonText: 'Delete ' + loadBalancer.name,\n account: loadBalancer.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { SETTINGS } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.azure.pipeline.stage.bake.executionDetails.controller';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'azureBakeExecutionDetailsCtrl',\n [\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($scope, $stateParams, executionDetailsSectionService, $interpolate) {\n $scope.configSections = ['bakeConfig', 'taskStatus'];\n\n const initialized = () => {\n $scope.detailsSection = $stateParams.details;\n $scope.provider = $scope.stage.context.cloudProviderType || 'azure';\n $scope.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' &&\n SETTINGS.feature.roscoSelector($scope.stage.context));\n $scope.bakeryDetailUrl = $interpolate(\n $scope.roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl,\n );\n };\n\n const initialize = () => executionDetailsSectionService.synchronizeSection($scope.configSections, initialized);\n\n initialize();\n\n $scope.$on('$stateChangeSuccess', initialize);\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.azure.serverGroup.transformer';\nexport const name = AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('azureServerGroupTransformer', function () {\n function normalizeServerGroup(serverGroup) {\n return serverGroup;\n }\n\n function parseCustomScriptsSettings(command, configuration) {\n /*\n At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following\n occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios\n to assign the correct value to model.\n */\n if (Array.isArray(command.customScriptsSettings.fileUris)) {\n configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris;\n } else {\n const fileUrisTemp = command.customScriptsSettings.fileUris;\n if (fileUrisTemp.includes(',')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(',');\n } else if (fileUrisTemp.includes(';')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';');\n } else {\n configuration.customScriptsSettings.fileUris = [fileUrisTemp];\n }\n\n configuration.customScriptsSettings.fileUris.forEach(function (v, index) {\n configuration.customScriptsSettings.fileUris[index] = v.trim();\n });\n }\n }\n\n function convertServerGroupCommandToDeployConfiguration(command) {\n let tempImage;\n\n if (command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline') {\n tempImage = {\n imageName: '',\n isCustom: 'true',\n publisher: '',\n offer: '',\n sku: '',\n version: '',\n region: command.region,\n uri: '',\n ostype: '',\n };\n } else {\n tempImage = command.selectedImage;\n }\n\n const configuration = {\n name: command.application,\n cloudProvider: command.selectedProvider,\n application: command.application,\n stack: command.stack,\n strategy: command.strategy,\n rollback: {\n onFailure: command.rollback ? command.rollback.onFailure : null,\n },\n scaleDown: command.scaleDown,\n maxRemainingAsgs: command.maxRemainingAsgs,\n delayBeforeDisableSec: command.delayBeforeDisableSec,\n delayBeforeScaleDownSec: command.delayBeforeScaleDownSec,\n allowDeleteActive: command.strategy === 'redblack' ? true : null,\n allowScaleDownActive: command.strategy === 'redblack' ? true : null,\n detail: command.freeFormDetails,\n freeFormDetails: command.freeFormDetails,\n healthSettings: command.healthSettings,\n image: command.image,\n account: command.credentials,\n selectedProvider: 'azure',\n vnet: command.vnet,\n vnetResourceGroup: command.selectedVnet.resourceGroup,\n subnet: command.subnet,\n useSourceCapacity: false,\n capacity: {\n min: command.sku.capacity,\n max: command.sku.capacity,\n },\n credentials: command.credentials,\n region: command.region,\n securityGroupName: command.securityGroupName,\n loadBalancerName: command.loadBalancerName,\n loadBalancerType: command.loadBalancerType,\n user: '[anonymous]',\n upgradePolicy: 'Manual',\n type: 'createServerGroup',\n sku: {\n name: 'Standard_DS1_v2',\n tier: 'Standard',\n capacity: command.sku.capacity,\n },\n instanceTags: command.instanceTags,\n dataDisks: command.dataDisks,\n userAssignedIdentities: command.userAssignedIdentities,\n viewState: command.viewState,\n osConfig: {\n customData: command.osConfig ? command.osConfig.customData : null,\n },\n customScriptsSettings: {\n fileUris: null,\n commandToExecute: '',\n },\n zonesEnabled: command.zonesEnabled,\n zones: command.zonesEnabled ? command.zones : [],\n enableInboundNAT: command.enableInboundNAT,\n };\n\n if (command.image == null || command.image.isCustom == false) {\n configuration.image = tempImage;\n }\n\n if (typeof command.stack !== 'undefined') {\n configuration.name = configuration.name + '-' + command.stack;\n }\n if (typeof command.freeFormDetails !== 'undefined') {\n configuration.name = configuration.name + '-' + command.freeFormDetails;\n }\n\n if (typeof command.customScriptsSettings !== 'undefined') {\n configuration.customScriptsSettings.commandToExecute = command.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(command.customScriptsSettings.fileUris)) {\n parseCustomScriptsSettings(command, configuration);\n }\n }\n\n if (command.instanceType) {\n const vmsku = command.instanceType;\n configuration.instanceType = command.instanceType;\n configuration.sku.name = vmsku;\n configuration.sku.tier = vmsku.substring(0, vmsku.indexOf('_'));\n }\n\n // Default to an empty list of health provider names for now.\n configuration.interestingHealthProviderNames = [];\n\n return configuration;\n }\n\n return {\n convertServerGroupCommandToDeployConfiguration: convertServerGroupCommandToDeployConfiguration,\n normalizeServerGroup: normalizeServerGroup,\n parseCustomScriptsSettings: parseCustomScriptsSettings,\n };\n});\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.azure.serverGroupCommandBuilder.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n ])\n .factory('azureServerGroupCommandBuilder', [\n '$q',\n 'azureImageReader',\n 'azureServerGroupTransformer',\n function ($q, azureImageReader, azureServerGroupTransformer) {\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultCredentials = defaults.account || application.defaultCredentials.azure;\n const defaultRegion = defaults.region || application.defaultRegions.azure;\n\n return azureImageReader.findImages({ provider: 'azure' }).then(function (images) {\n return {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n images,\n loadBalancers: [],\n selectedVnetSubnets: [],\n strategy: '',\n sku: {\n capacity: 1,\n },\n zonesEnabled: false,\n zones: [],\n instanceTags: {},\n dataDisks: [],\n selectedProvider: 'azure',\n viewState: {\n instanceProfile: 'custom',\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n loadBalancersConfigured: false,\n networkSettingsConfigured: false,\n securityGroupsConfigured: false,\n },\n enableInboundNAT: false,\n };\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline() {\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n application: application.name,\n strategy: '',\n stack: serverGroupName.stack,\n freeFormDetails: serverGroupName.freeFormDetails,\n credentials: serverGroup.account,\n loadBalancers: serverGroup.loadBalancers,\n selectedSubnets: serverGroup.selectedVnetSubnets,\n selectedVnet: serverGroup.selectedVnet,\n securityGroups: serverGroup.securityGroups,\n loadBalancerName: serverGroup.loadBalancerName,\n loadBalancerType: serverGroup.loadBalancerType,\n securityGroupName: serverGroup.securityGroupName,\n region: serverGroup.region,\n vnet: serverGroup.vnet,\n vnetResourceGroup: serverGroup.vnetResourceGroup,\n subnet: serverGroup.subnet,\n zones: serverGroup.zones,\n zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,\n instanceTags: {},\n dataDisks: serverGroup.dataDisks,\n sku: serverGroup.sku,\n capacity: {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n },\n tags: [],\n instanceType: serverGroup.sku.name,\n selectedProvider: 'azure',\n source: {\n account: serverGroup.account,\n region: serverGroup.region,\n serverGroupName: serverGroup.name,\n asgName: serverGroup.name,\n },\n viewState: {\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: false,\n listImplicitSecurityGroups: false,\n mode: mode,\n disableStrategySelection: true,\n },\n enableInboundNAT: serverGroup.enableInboundNAT,\n };\n\n if (typeof serverGroup.customScriptsSettings !== 'undefined') {\n command.customScriptsSettings = {};\n command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {\n azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);\n }\n }\n\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = pipelineCluster.region;\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const viewState = {\n disableImageSelection: true,\n useSimpleCapacity: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n instanceProfile: originalCluster.viewState.instanceProfile,\n instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n viewState: viewState,\n };\n if (originalCluster.viewState.instanceTypeDetails) {\n viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;\n }\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n const extendedCommand = angular.extend({}, command, pipelineCluster, viewOverrides);\n\n return extendedCommand;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n AccountService,\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n PipelineTemplates,\n Registry,\n SETTINGS,\n} from '@spinnaker/core';\n\nimport { AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../../image/image.reader';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './../../../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE = 'spinnaker.azure.pipeline.stage.bakeStage';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE, [\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n AZURE_IMAGE_IMAGE_READER,\n AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER,\n])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'azure',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'package' },\n { type: 'requiredField', fieldName: 'regions' },\n {\n type: 'upstreamVersionProvided',\n checkParentTriggers: true,\n getMessage: (labels) =>\n 'Bake stages should always have a stage or trigger preceding them that provides version information: ' +\n '<ul>' +\n labels.map((label) => `<li>${label}</li>`).join('') +\n '</ul>' +\n 'Otherwise, Spinnaker will bake and deploy the most-recently built package.',\n },\n ],\n restartable: true,\n });\n })\n .controller('azureBakeStageCtrl', [\n '$scope',\n '$q',\n 'azureImageReader',\n '$uibModal',\n function ($scope, $q, azureImageReader, $uibModal) {\n $scope.stage.extendedAttributes = $scope.stage.extendedAttributes || {};\n $scope.stage.regions = $scope.stage.regions || [];\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n $scope.viewState = {\n loading: true,\n };\n\n function initialize() {\n $q.all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n BakeryReader.getRegions('azure'),\n BakeryReader.getBaseOsOptions('azure'),\n BakeryReader.getBaseLabelOptions(),\n ]).then(function ([credentialsKeyedByAccount, regions, baseOsOptions, baseLabelOptions]) {\n $scope.accounts = Object.keys(credentialsKeyedByAccount);\n $scope.regions = regions;\n if ($scope.regions.length === 1) {\n $scope.stage.region = $scope.regions[0];\n } else if (!$scope.regions.includes($scope.stage.region)) {\n delete $scope.stage.region;\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n $scope.baseOsOptions = baseOsOptions.baseImages;\n\n $scope.baseLabelOptions = baseLabelOptions;\n $scope.osTypeOptions = ['linux', 'windows'];\n $scope.packageTypeOptions = ['DEB', 'RPM'];\n\n $scope.viewState.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector($scope.stage));\n $scope.showAdvancedOptions = showAdvanced();\n $scope.viewState.loading = false;\n\n if ($scope.stage.managedImage != null) {\n $scope.managedImagesWasChosen = true;\n setManagedImages();\n }\n $scope.defaultImagesWasChosen = $scope.stage.baseOs != null;\n $scope.customImagesWasChosen = $scope.stage.publisher != null;\n });\n }\n\n function stageUpdated() {\n deleteEmptyProperties();\n // Since the selector computes using stage as an input, it needs to be able to recompute roscoMode on updates\n if (typeof SETTINGS.feature.roscoSelector === 'function') {\n $scope.viewState.roscoMode = SETTINGS.feature.roscoSelector($scope.stage);\n }\n }\n\n function showAdvanced() {\n const stg = $scope.stage;\n return !!(\n stg.templateFileName ||\n (stg.extendedAttributes && _.size(stg.extendedAttributes) > 0) ||\n stg.varFileName\n );\n }\n\n function deleteEmptyProperties() {\n _.forOwn($scope.stage, function (val, key) {\n if (val === '') {\n delete $scope.stage[key];\n }\n });\n }\n\n function setManagedImages() {\n azureImageReader\n .findImages({ provider: 'azure', managedImages: true, account: $scope.stage.account })\n .then(function (images) {\n let managedImageOptions = [];\n for (let i in images) {\n let image = images[i];\n let newImage = {\n id: image.imageName,\n osType: image.ostype,\n name: image.imageName,\n };\n managedImageOptions.push(newImage);\n }\n $scope.managedImageOptions = managedImageOptions;\n })\n .catch(() => {});\n }\n\n function setRegions() {\n AccountService.getRegionsForAccount($scope.stage.account)\n .then(function (regions) {\n $scope.regions = regions.map((r) => r.name);\n })\n .catch(() => {});\n }\n\n this.addExtendedAttribute = function () {\n if (!$scope.stage.extendedAttributes) {\n $scope.stage.extendedAttributes = {};\n }\n $uibModal\n .open({\n templateUrl: PipelineTemplates.addExtendedAttributes,\n controller: 'bakeStageAddExtendedAttributeController',\n controllerAs: 'addExtendedAttribute',\n resolve: {\n extendedAttribute: function () {\n return {\n key: '',\n value: '',\n };\n },\n },\n })\n .result.then(function (extendedAttribute) {\n $scope.stage.extendedAttributes[extendedAttribute.key] = extendedAttribute.value;\n })\n .catch(() => {});\n };\n\n this.removeExtendedAttribute = function (key) {\n delete $scope.stage.extendedAttributes[key];\n };\n\n this.showTemplateFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.templateFileName;\n };\n\n this.showExtendedAttributes = function () {\n return (\n $scope.viewState.roscoMode || ($scope.stage.extendedAttributes && _.size($scope.stage.extendedAttributes) > 0)\n );\n };\n\n this.showVarFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.varFileName;\n };\n\n this.showDefaultImages = function () {\n $scope.managedImagesWasChosen = false;\n $scope.defaultImagesWasChosen = true;\n $scope.customImagesWasChosen = false;\n\n $scope.stage.managedImage = null;\n $scope.stage.publisher = null;\n $scope.stage.offer = null;\n $scope.stage.sku = null;\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n };\n\n this.showManagedImages = function () {\n setManagedImages();\n\n $scope.managedImagesWasChosen = true;\n $scope.defaultImagesWasChosen = false;\n $scope.customImagesWasChosen = false;\n\n $scope.stage.osType = null;\n $scope.stage.baseOs = null;\n $scope.stage.publisher = null;\n $scope.stage.offer = null;\n $scope.stage.sku = null;\n $scope.stage.packageType = null;\n };\n\n this.showCustomImages = function () {\n $scope.managedImagesWasChosen = false;\n $scope.defaultImagesWasChosen = false;\n $scope.customImagesWasChosen = true;\n\n $scope.stage.baseOs = null;\n $scope.stage.managedImage = null;\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n };\n\n this.onChangeAccount = () => {\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n $scope.stage.managedImage = null;\n\n if ($scope.stage.account) {\n setRegions();\n }\n\n if ($scope.managedImagesWasChosen) {\n setManagedImages();\n }\n };\n\n $scope.onChangeManagedImage = () => {\n $scope.stage.packageType = null;\n const selectedManagedImage = _.find($scope.managedImageOptions, { id: $scope.stage.managedImage });\n $scope.stage.osType = selectedManagedImage.osType.toLowerCase();\n };\n\n this.onChangeOsType = function (e) {\n $scope.stage.packageType = null;\n };\n\n $scope.$watch('stage', stageUpdated, true);\n\n initialize();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE = 'spinnaker.azure.pipeline.stage.destroyAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n cloudProvider: 'azure',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getAccountDetails(stage.credentials).then(function (details) {\n stage.regions = [details.org];\n // stage.regions = ['eastus', 'westus'];\n });\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n\n if (stage.credentials) {\n ctrl.accountUpdated();\n }\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.disableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./disableAsgStage.html'),\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew && $scope.application.attributes.platformHealthOnly) {\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.enableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew) {\n // bypass the health check for now; will change this later to ['azureService'] and we will also add back the check for $scope.application.attributes.platformHealthOnly\n stage.interestingHealthProviderNames = [];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { FirewallLabels, InfrastructureCaches, TaskExecutor } from '@spinnaker/core';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE = 'spinnaker.azure.securityGroup.write.service';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE, [UIROUTER_ANGULARJS]).factory(\n 'azureSecurityGroupWriter',\n function () {\n function upsertSecurityGroup(securityGroup, application, descriptor, params = {}) {\n params.securityGroupName = securityGroup.name;\n\n // We want to extend params with all attributes from securityGroup, but only if they don't already exist.\n _.assignWith(params, securityGroup, function (value, other) {\n return _.isUndefined(value) ? other : value;\n });\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `${descriptor} ${FirewallLabels.get('Firewall')}: ${name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n function deleteSecurityGroup(securityGroup, application, params = {}) {\n params.type = 'deleteSecurityGroup';\n params.securityGroupName = securityGroup.name;\n params.regions = [securityGroup.region];\n params.credentials = securityGroup.accountId;\n //params.cloudProvider = securityGroup.providerType;\n params.appName = application.name;\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `Delete ${FirewallLabels.get('Firewalls')}: ${securityGroup.name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n return {\n deleteSecurityGroup: deleteSecurityGroup,\n upsertSecurityGroup: upsertSecurityGroup,\n };\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL = 'spinnaker.azure.securityGroup.create.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureCreateSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n '$controller',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function ($scope, $uibModalInstance, $state, $controller, application, securityGroup, azureSecurityGroupWriter) {\n $scope.pages = {\n location: require('./createSecurityGroupProperties.html'),\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n $scope.regions = [];\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n const ctrl = this;\n $scope.isNew = true;\n $scope.state = {\n submitting: false,\n infiniteScroll: {\n numToAdd: 20,\n currentItems: 20,\n },\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addMoreItems = function () {\n $scope.state.infiniteScroll.currentItems += $scope.state.infiniteScroll.numToAdd;\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.regions[0],\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Creating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n $scope.securityGroup = securityGroup;\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.securityGroup.credentials;\n const region = $scope.securityGroup.region;\n $scope.securityGroup.selectedVnet = null;\n $scope.securityGroup.vnet = null;\n $scope.securityGroup.vnetResourceGroup = null;\n\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.securityGroup.vnet = item.name;\n $scope.securityGroup.vnetResourceGroup = item.resourceGroup;\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n ctrl.selectedSubnets.push(subnet);\n });\n }\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n vpcId: 'null',\n };\n\n if ($scope.securityGroup.selectedVnet) {\n $scope.securityGroup.vnet = $scope.securityGroup.selectedVnet.name;\n $scope.securityGroup.vnetResourceGroup = $scope.securityGroup.selectedVnet.resourceGroup;\n }\n\n if ($scope.securityGroup.selectedSubnet) {\n $scope.securityGroup.subnet = $scope.securityGroup.selectedSubnet.name;\n }\n\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Create', params);\n });\n };\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length == 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n ctrl.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n ctrl.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n ctrl.protocolUpdated = function (ruleset, index) {\n ruleset[index].protocol = ruleset[index].protocolUI;\n };\n\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.securityGroup.securityRules = [];\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n CACHE_INITIALIZER_SERVICE,\n FirewallLabels,\n InfrastructureCaches,\n SECURITY_GROUP_READER,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL =\n 'spinnaker.azure.securityGroup.azure.edit.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n CACHE_INITIALIZER_SERVICE,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureEditSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$exceptionHandler',\n '$state',\n 'securityGroupReader',\n 'cacheInitializer',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function (\n $scope,\n $uibModalInstance,\n $exceptionHandler,\n $state,\n securityGroupReader,\n cacheInitializer,\n application,\n securityGroup,\n azureSecurityGroupWriter,\n ) {\n $scope.pages = {\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n if (!_.isEmpty(rule.protocol)) {\n rule.protocolUI = rule.protocol.toLowerCase();\n }\n\n rule.destPortRanges = rule.destinationPortRangeModel;\n rule.sourceIPCIDRRanges = rule.sourceAddressPrefixModel;\n\n return rule;\n });\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n this.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n this.refreshSecurityGroups = function () {\n $scope.state.refreshingSecurityGroups = true;\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n initializeSecurityGroups().then(function () {\n $scope.state.refreshingSecurityGroups = false;\n });\n });\n };\n\n function initializeSecurityGroups() {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n const account = securityGroup.accountName;\n const region = securityGroup.region;\n const availableGroups = _.filter(securityGroups[account].azure[region], {\n /*vpcId: vpcId*/\n });\n $scope.availableSecurityGroups = _.map(availableGroups, 'name');\n });\n }\n\n this.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n this.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n this.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n this.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n this.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n this.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.taskMonitor.onTaskComplete = $uibModalInstance.dismiss;\n\n this.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: null,\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Update', params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from '../configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER = 'spinnaker.azure.securityGroup.clone.controller';\nexport const name = AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER, [\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n]).controller('azureCloneSecurityGroupController', [\n '$scope',\n '$uibModalInstance',\n '$controller',\n '$state',\n 'azureSecurityGroupWriter',\n 'securityGroup',\n 'application',\n function ($scope, $uibModalInstance, $controller, $state, azureSecurityGroupWriter, securityGroup, application) {\n const ctrl = this;\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n $scope.pages = {\n location: require('../configure/createSecurityGroupProperties.html'),\n ingress: require('../configure/createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n const temp = rule.destinationPortRange.split('-');\n rule.startPort = Number(temp[0]);\n rule.endPort = Number(temp[1]);\n return rule;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n });\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '7001-7001',\n startPort: 7001,\n endPort: 7001,\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n ctrl.portUpdated = function (ruleset, index) {\n ruleset[index].destinationPortRange = ruleset[index].startPort + '-' + ruleset[index].endPort;\n };\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: 'none',\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Clone', params);\n });\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { ConfirmationModalService, FirewallLabels, SECURITY_GROUP_READER } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER } from '../clone/cloneSecurityGroup.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.azure.securityGroup.azure.details.controller';\nexport const name = AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER,\n ])\n .controller('azureSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'azureSecurityGroupWriter',\n 'securityGroupReader',\n '$uibModal',\n function ($scope, $state, resolvedSecurityGroup, app, azureSecurityGroupWriter, securityGroupReader, $uibModal) {\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(\n function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n $scope.securityGroup = details;\n }\n },\n function () {\n fourOhFour();\n },\n );\n }\n\n function fourOhFour() {\n $state.go('^');\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n this.editInboundRules = function editInboundRules() {\n $uibModal.open({\n templateUrl: require('../configure/editSecurityGroup.html'),\n controller: 'azureEditSecurityGroupCtrl as ctrl',\n resolve: {\n securityGroup: function () {\n return angular.copy($scope.securityGroup);\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.cloneSecurityGroup = function cloneSecurityGroup() {\n $uibModal.open({\n templateUrl: require('../clone/cloneSecurityGroup.html'),\n controller: 'azureCloneSecurityGroupController as ctrl',\n resolve: {\n securityGroup: function () {\n const securityGroup = angular.copy($scope.securityGroup);\n if (securityGroup.region) {\n securityGroup.regions = [securityGroup.region];\n }\n return securityGroup;\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.deleteSecurityGroup = function deleteSecurityGroup() {\n const taskMonitor = {\n application: application,\n title: 'Deleting ' + securityGroup.name,\n };\n\n const submitMethod = function () {\n $scope.securityGroup.type = 'deleteSecurityGroup';\n return azureSecurityGroupWriter.deleteSecurityGroup(securityGroup, application, {\n cloudProvider: 'azure',\n vpcId: $scope.securityGroup.vpcId,\n });\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + securityGroup.name + '?',\n buttonText: 'Delete ' + securityGroup.name,\n account: securityGroup.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_READER = 'spinnaker.azure.securityGroup.reader';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_READER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_READER, []).factory('azureSecurityGroupReader', function () {\n function resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n //hack to get around securityGroupId not matching id in indexedSecurityGroups.\n const temp = securityGroupId.split('/');\n return indexedSecurityGroups[container.account][container.region][temp[temp.length - 1]];\n }\n\n return {\n resolveIndexedSecurityGroup: resolveIndexedSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.azure.securityGroup.transformer';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('azureSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceArchetype.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER, []).controller(\n 'azureInstanceArchetypeCtrl',\n [\n '$scope',\n 'instanceTypeService',\n 'modalWizardService',\n function ($scope, instanceTypeService, modalWizardService) {\n const wizard = modalWizardService.getWizard();\n\n $scope.$watch('command.viewState.instanceProfile', function () {\n if (!$scope.command.viewState.instanceProfile || $scope.command.viewState.instanceProfile === 'custom') {\n wizard.excludePage('instance-type');\n } else {\n wizard.includePage('instance-type');\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n\n $scope.$watch('command.viewState.instanceType', function (newVal) {\n if (newVal) {\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceType.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER, []).controller('azureInstanceTypeCtrl', [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('instance-type');\n modalWizardService.getWizard().markClean('instance-type');\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.advancedSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupAdvancedSettingsCtrl',\n [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('advanced');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n modalWizardService.getWizard().markClean('advanced');\n } else {\n modalWizardService.getWizard().markDirty('advanced');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.advancedSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupAdvancedSettingsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./advancedSettingsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'adv',\n controller: 'azureServerGroupAdvancedSettingsSelectorCtrl',\n };\n })\n .controller('azureServerGroupAdvancedSettingsSelectorCtrl', function () {\n this.addDataDisk = () => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n this.command.dataDisks = newDataDisks.concat([\n {\n lun: 0,\n managedDisk: {\n storageAccountType: 'Standard_LRS',\n },\n diskSizeGB: 1,\n caching: 'None',\n createOption: 'Empty',\n },\n ]);\n };\n\n this.removeDataDisk = (index) => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n newDataDisks.splice(index, 1);\n this.command.dataDisks = newDataDisks;\n };\n });\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER =\n 'spinnaker.azure.serverGroup.configure.basicSettings.image.filter';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER, []).filter('regional', function () {\n return function (input, selectedRegion) {\n return _.filter(input, function (image) {\n return image.region === selectedRegion || image.region === null;\n });\n };\n});\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { IMAGE_READER, ModalWizard } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER } from './image.regional.filter';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.basicSettings';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER,\n IMAGE_READER,\n ])\n .controller('azureServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n 'imageReader',\n function ($scope, $controller, $uibModalStack, $state, imageReader) {\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basic-settings');\n ModalWizard.markComplete('basic-settings');\n } else {\n ModalWizard.markIncomplete('basic-settings');\n }\n });\n\n this.imageChanged = (image) => {\n $scope.command.imageName = image.imageName;\n $scope.command.selectedImage = image;\n ModalWizard.markClean('basic-settings');\n };\n\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n imageReader: imageReader,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n this.stackPattern = {\n test: function (stack) {\n const pattern = $scope.command.viewState.templatingEnabled ? /^([a-zA-Z0-9]*(\\${.+})*)*$/ : /^[a-zA-Z0-9]*$/;\n\n return pattern.test(stack);\n },\n };\n\n this.detailPattern = {\n test: function (detail) {\n const pattern = $scope.command.viewState.templatingEnabled\n ? /^([a-zA-Z0-9-]*(\\${.+})*)*$/\n : /^[a-zA-Z0-9-]*$/;\n\n return pattern.test(detail);\n },\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupCapacitySelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./capacitySelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'cap',\n controller: 'azureServerGroupCapacitySelectorCtrl',\n };\n })\n .controller('azureServerGroupCapacitySelectorCtrl', function () {});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.healthSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupHealthSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n if (typeof $scope.command.healthSettings === 'undefined') {\n $scope.command.healthSettings = {};\n }\n\n this.healthCheckProtocols = [\n { displayName: 'N/A', name: null },\n { displayName: 'HTTP', name: 'http' },\n { displayName: 'TCP', name: 'tcp' },\n ];\n\n this.requiresHealthCheckPath = function () {\n return $scope.command.healthSettings.protocol === 'http';\n };\n\n this.changeHealthCheckProtocol = function (newProtocol) {\n if (newProtocol == null) {\n $scope.command.healthSettings.protocol = null;\n $scope.command.healthSettings.port = null;\n $scope.command.healthSettings.requestPath = null;\n } else if (!this.requiresHealthCheckPath()) {\n $scope.command.healthSettings.requestPath = null;\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.healthSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupHealthSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./healthSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.imageSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupImageSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n this.clearImage = function () {\n if ($scope.command.image.isCustom == false) {\n $scope.command.image = { isCustom: false };\n } else {\n $scope.command.image.region = $scope.command.region;\n }\n };\n\n ModalWizard.markComplete('image-settings');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('image-settings');\n } else {\n ModalWizard.markDirty('image-settings');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.imageSettingsSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE, []).directive(\n 'azureServerGroupImageSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./imageSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { InfrastructureCaches, LOAD_BALANCER_READ_SERVICE, ModalWizard, NetworkReader } from '@spinnaker/core';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER, [\n LOAD_BALANCER_READ_SERVICE,\n]).controller('azureServerGroupLoadBalancersCtrl', [\n '$scope',\n 'loadBalancerReader',\n function ($scope, loadBalancerReader) {\n ModalWizard.markClean('load-balancers');\n\n function loadVnetSubnets(item, type) {\n loadBalancerReader\n .getLoadBalancerDetails('azure', $scope.command.credentials, $scope.command.region, item)\n .then(function (LBs) {\n if (!LBs || LBs.length === 0) {\n // load the subnet and vnets without a load balancer\n const attachedVnet = $scope.command.selectedVnet;\n const attachedSubnet = $scope.command.selectedSubnet;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n if (subnet.name === attachedSubnet) {\n $scope.command.selectedSubnet = attachedSubnet;\n }\n }\n });\n }\n });\n }\n });\n } else if (LBs && LBs.length === 1) {\n const selectedLoadBalancer = LBs[0];\n const attachedVnet = $scope.command.selectedVnet;\n $scope.command.selectedVnet = null;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n }\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region &&\n ((type === 'Azure Application Gateway' && selectedVnet.name == selectedLoadBalancer.vnet) ||\n (type === 'Azure Load Balancer' && selectedVnet.name === attachedVnet.name))\n ) {\n $scope.command.selectedVnet = selectedVnet;\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n }\n });\n }\n });\n }\n });\n }\n });\n }\n\n if ($scope.command.credentials && $scope.command.region) {\n $scope.command.viewState.networkSettingsConfigured = true;\n $scope.command.selectedVnetSubnets = [];\n if ($scope.command.loadBalancerName !== null && typeof $scope.command.loadBalancerName !== 'undefined') {\n $scope.useLoadBalancer = true;\n }\n loadVnetSubnets($scope.command.loadBalancerName, $scope.command.loadBalancerType);\n }\n\n this.loadBalancerChanged = function (item) {\n $scope.command.viewState.networkSettingsConfigured = true;\n ModalWizard.markComplete('load-balancers');\n\n const loadBalancers = $scope.command.backingData.loadBalancers;\n let loadBalancerType = null;\n\n if (loadBalancers) {\n const loadBalancerToFind = loadBalancers.find((lb) => lb.name === item);\n if (loadBalancerToFind) {\n loadBalancerType = Utility.getLoadBalancerType(loadBalancerToFind.loadBalancerType).type;\n }\n }\n\n if (item === null) {\n $scope.command.loadBalancerName = null;\n }\n\n $scope.command.selectedVnetSubnets = [];\n $scope.command.loadBalancerType = loadBalancerType;\n InfrastructureCaches.clearCache('networks');\n loadVnetSubnets(item, loadBalancerType);\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupLoadBalancersSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupLoadBalancersSelector.directive.html'),\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.networkSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupNetworkSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('network-settings');\n\n $scope.command.selectedVnet = {\n name: $scope.command.vnet,\n };\n\n $scope.command.selectedSubnet = $scope.command.subnet;\n\n this.vnetChanged = function (item) {\n $scope.command.vnet = item;\n $scope.command.subnet = $scope.command.selectedSubnet = null;\n $scope.command.selectedVnetSubnets = item.subnets.map((s) => s.name);\n };\n\n this.networkSettingsChanged = function (item) {\n $scope.command.vnet = $scope.command.selectedVnet.name;\n $scope.command.subnet = item;\n ModalWizard.markComplete('network-settings');\n };\n\n this.getVnetName = function () {\n if ($scope.command.selectedVnet) {\n return $scope.command.selectedVnet.name;\n } else {\n return 'Virtual network was not selected';\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.networkSettings.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupNetworkSettingsSelector',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./ServerGroupNetworkSettingsSelector.directive.html'),\n };\n },\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.securityGroups.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER, []).controller(\n 'azureServerGroupSecurityGroupsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('security-groups');\n ModalWizard.markComplete('security-groups');\n\n $scope.command.selectedSecurityGroup = {\n id: $scope.command.securityGroupName,\n };\n\n this.securityGroupChanged = function (securityGroup) {\n $scope.command.securityGroupName = securityGroup.id;\n ModalWizard.markComplete('security-groups');\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { FirewallLabels, InfrastructureCaches } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.securityGroupSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupSecurityGroupsSelector',\n [\n 'azureServerGroupConfigurationService',\n function (azureServerGroupConfigurationService) {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupSecurityGroupsSelector.directive.html'),\n link: function (scope) {\n scope.firewallLabel = FirewallLabels.get('firewall');\n\n scope.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n scope.refreshSecurityGroups = function () {\n scope.refreshing = true;\n azureServerGroupConfigurationService.refreshSecurityGroups(scope.command).then(function () {\n scope.refreshing = false;\n });\n };\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.tags.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE, [])\n .directive('azureTagsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./tagsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'tagsSelectorCtrl',\n controller: 'TagsSelectorCtrl',\n };\n })\n .controller('TagsSelectorCtrl', [\n '$scope',\n function () {\n this.getTagResult = function () {\n return Utility.checkTags(this.command.instanceTags);\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.zone.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE, []).directive('azureZoneSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./zoneSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'vm',\n controller: [\n '$scope',\n function ($scope) {\n this.updateEnableInboundNAT = () => {\n if ($scope.vm.command.zonesEnabled) {\n $scope.vm.command.enableInboundNAT = false;\n }\n };\n },\n ],\n };\n});\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER } from './wizard/ServerGroupInstanceArchetype.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER } from './wizard/ServerGroupInstanceType.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER } from './wizard/advancedSettings/ServerGroupAdvancedSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE } from './wizard/advancedSettings/advancedSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER } from './wizard/basicSettings/ServerGroupBasicSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE } from './wizard/capacity/capacitySelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER } from './wizard/healthSettings/ServerGroupHealthSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE } from './wizard/healthSettings/healthSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER } from './wizard/image/ServerGroupImageSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE } from './wizard/image/imageSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER } from './wizard/loadBalancers/ServerGroupLoadBalancers.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE } from './wizard/loadBalancers/serverGroupLoadBalancersSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER } from './wizard/networkSettings/ServerGroupNetworkSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE } from './wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER } from './wizard/securityGroup/ServerGroupSecurityGroups.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE } from './wizard/securityGroup/serverGroupSecurityGroupsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE } from './wizard/tags/tagsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE } from './wizard/zones/zoneSelector.directive';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE = 'spinnaker.azure.serverGroup.configure';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE, [\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE,\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from '../../instance/azureInstanceType.service';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE =\n 'spinnaker.azure.serverGroup.configure.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n ])\n .factory('azureServerGroupConfigurationService', [\n '$q',\n 'azureImageReader',\n 'securityGroupReader',\n 'cacheInitializer',\n 'loadBalancerReader',\n 'azureInstanceTypeService',\n function (\n $q,\n azureImageReader,\n securityGroupReader,\n cacheInitializer,\n loadBalancerReader,\n azureInstanceTypeService,\n ) {\n const dataDiskTypes = ['Standard_LRS', 'StandardSSD_LRS', 'Premium_LRS'];\n const dataDiskCachingTypes = ['None', 'ReadOnly', 'ReadWrite'];\n\n const healthCheckTypes = ['EC2', 'ELB'];\n const terminationPolicies = [\n 'OldestInstance',\n 'NewestInstance',\n 'OldestLaunchConfiguration',\n 'ClosestToNextInstanceHour',\n 'Default',\n ];\n\n function configureUpdateCommand(command) {\n command.backingData = {\n healthCheckTypes: angular.copy(healthCheckTypes),\n terminationPolicies: angular.copy(terminationPolicies),\n };\n }\n\n function configureCommand(application, command) {\n return $q\n .all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n securityGroupReader.loadSecurityGroups(),\n loadBalancerReader.loadLoadBalancers(application.name),\n ])\n .then(function ([credentialsKeyedByAccount, securityGroups, loadBalancers]) {\n command.backingData = {\n credentialsKeyedByAccount,\n securityGroups,\n loadBalancers,\n dataDiskTypes: angular.copy(dataDiskTypes),\n dataDiskCachingTypes: angular.copy(dataDiskCachingTypes),\n accounts: _.keys(credentialsKeyedByAccount),\n filtered: {},\n };\n attachEventHandlers(command);\n });\n }\n\n function configureInstanceTypes(command) {\n const result = {\n dirty: {},\n };\n if (command.region) {\n const results = [result.dirty];\n\n // results.push(configureCustomInstanceTypes(command).dirty);\n results.push(configureStandardInstanceTypes(command).dirty);\n\n angular.extend(...results);\n } else {\n command.backingData.filtered.instanceTypes = [];\n }\n return result;\n }\n\n function configureStandardInstanceTypes(command) {\n const c = command;\n const result = {\n dirty: {},\n };\n\n const locations = [c.region];\n const { credentialsKeyedByAccount } = c.backingData;\n const { locationToInstanceTypesMap } = credentialsKeyedByAccount[c.credentials];\n\n if (locations.every((l) => !l)) {\n return result;\n }\n\n const filtered = azureInstanceTypeService\n .getAvailableTypesForRegions(locationToInstanceTypesMap, locations)\n .map((type) => type.name);\n\n const instanceType = c.instanceType;\n if (_.every([instanceType, !_.startsWith(instanceType, 'custom'), !_.includes(filtered, instanceType)])) {\n result.dirty.instanceType = c.instanceType;\n c.instanceType = null;\n }\n c.backingData.filtered.instanceTypes = filtered;\n return result;\n }\n\n function configureImages(command) {\n const result = {\n dirty: {},\n };\n let regionalImages = null;\n if (command.viewState.disableImageSelection) {\n return result;\n }\n if (command.region) {\n regionalImages = command.backingData.packageImages\n .filter(function (image) {\n return image.amis && image.amis[command.region];\n })\n .map(function (image) {\n return {\n imageName: image.imageName,\n ami: image.amis ? image.amis[command.region][0] : null,\n };\n });\n if (\n command.amiName &&\n !regionalImages.some(function (image) {\n return image.imageName === command.amiName;\n })\n ) {\n result.dirty.amiName = true;\n command.amiName = null;\n }\n } else {\n command.amiName = null;\n }\n command.backingData.filtered.images = regionalImages;\n return result;\n }\n\n function configureZones(command) {\n const result = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (!command.region) {\n return result;\n }\n let { regionsSupportZones, availabilityZones } = command.backingData.credentialsKeyedByAccount[\n command.credentials\n ];\n regionsSupportZones = regionsSupportZones || [];\n availabilityZones = availabilityZones || [];\n filteredData.zones = regionsSupportZones.includes(command.region) ? availabilityZones : [];\n\n return result;\n }\n\n function getRegionalSecurityGroups(command) {\n const newSecurityGroups = command.backingData.securityGroups[command.credentials] || {\n azure: {},\n };\n return _.chain(newSecurityGroups[command.region]).sortBy('name').value();\n }\n\n function configureSecurityGroupOptions(command) {\n const result = {\n dirty: {},\n };\n let currentOptions;\n if (command.backingData.filtered.securityGroups) {\n currentOptions = command.backingData.filtered.securityGroups;\n }\n const newRegionalSecurityGroups = getRegionalSecurityGroups(command);\n if (command.selectedSecurityGroup) {\n // one has not been previously selected. We are either configuring for the\n //first time or they changed regions or account\n command.selectedSecurityGroup = null;\n result.dirty.securityGroups = true;\n }\n if (currentOptions != newRegionalSecurityGroups) {\n command.backingData.filtered.securityGroups = newRegionalSecurityGroups;\n result.dirty.securityGroups = true;\n }\n\n if (command.backingData.filtered.securityGroups.length === 0) {\n command.viewState.securityGroupsConfigured = false;\n } else {\n command.viewState.securityGroupsConfigured = true;\n }\n\n return result;\n }\n\n function refreshSecurityGroups(command, skipCommandReconfiguration) {\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n command.backingData.securityGroups = securityGroups;\n if (!skipCommandReconfiguration) {\n configureSecurityGroupOptions(command);\n }\n });\n });\n }\n\n function getLoadBalancerNames(loadBalancers) {\n return _.chain(loadBalancers).map('name').uniq().value().sort();\n }\n\n function configureLoadBalancerOptions(command) {\n const result = {\n dirty: {},\n };\n const current = command.loadBalancers;\n const newLoadBalancers = getLoadBalancerNames(command.backingData.loadBalancers);\n\n if (current && command.loadBalancers) {\n const matched = _.intersection(newLoadBalancers, command.loadBalancers);\n const removed = _.xor(matched, current);\n command.loadBalancers = matched;\n if (removed.length) {\n result.dirty.loadBalancers = removed;\n }\n }\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n return result;\n }\n\n function refreshLoadBalancers(command, skipCommandReconfiguration) {\n return loadBalancerReader.listLoadBalancers('azure').then(function (loadBalancers) {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n configureLoadBalancerOptions(command);\n }\n });\n }\n\n function configureLoadBalancers(command) {\n const result = {\n dirty: {},\n };\n const temp = command.backingData.loadBalancers;\n const filterlist = _.filter(temp, function (lb) {\n return lb.account === command.credentials && lb.region === command.region;\n });\n\n command.loadBalancers = getLoadBalancerNames(filterlist);\n command.viewState.loadBalancersConfigured = true;\n\n return result;\n }\n\n function attachEventHandlers(cmd) {\n cmd.regionChanged = function regionChanged(command, isInit = false) {\n const result = {\n dirty: {},\n };\n if (command.region && command.credentials) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n angular.extend(result.dirty, configureSecurityGroupOptions(command).dirty);\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n angular.extend(result.dirty, configureZones(command).dirty);\n }\n // reset previous set values\n if (!isInit) {\n command.loadBalancerName = null;\n command.loadBalancerType = null;\n command.vnet = null;\n command.vnetResourceGroup = null;\n command.subnet = null;\n command.selectedSubnet = null;\n command.selectedVnet = null;\n command.selectedVnetSubnets = [];\n command.viewState.networkSettingsConfigured = false;\n command.selectedSecurityGroup = null;\n command.securityGroupName = null;\n command.zonesEnabled = false;\n command.zones = [];\n }\n\n return result;\n };\n\n cmd.credentialsChanged = function credentialsChanged(command, isInit) {\n const result = {\n dirty: {},\n };\n const backingData = command.backingData;\n if (command.credentials) {\n const regionsForAccount = backingData.credentialsKeyedByAccount[command.credentials] || {\n regions: [],\n defaultKeyPair: null,\n };\n backingData.filtered.regions = regionsForAccount.regions;\n if (\n !_.chain(backingData.filtered.regions)\n .some({\n name: command.region,\n })\n .value()\n ) {\n command.region = null;\n result.dirty.region = true;\n } else {\n angular.extend(result.dirty, command.regionChanged(command, isInit).dirty);\n }\n if (command.region) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n }\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n } else {\n command.region = null;\n }\n return result;\n };\n }\n\n function refreshInstanceTypes(command) {\n return cacheInitializer.refreshCache('instanceTypes').then(function () {\n return azureInstanceTypeService.getAllTypesByRegion().then(function (instanceTypes) {\n command.backingData.instanceTypes = instanceTypes;\n configureInstanceTypes(command);\n });\n });\n }\n\n return {\n configureUpdateCommand: configureUpdateCommand,\n configureCommand: configureCommand,\n configureImages: configureImages,\n configureSecurityGroupOptions: configureSecurityGroupOptions,\n configureLoadBalancerOptions: configureLoadBalancerOptions,\n refreshLoadBalancers: refreshLoadBalancers,\n refreshSecurityGroups: refreshSecurityGroups,\n getRegionalSecurityGroups: getRegionalSecurityGroups,\n refreshInstanceTypes: refreshInstanceTypes,\n configureZones: configureZones,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { FirewallLabels, ModalWizard, SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\nimport Utility from '../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER =\n 'spinnaker.azure.cloneServerGroup.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n SERVER_GROUP_WRITER,\n]).controller('azureCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'azureServerGroupConfigurationService',\n 'serverGroupCommand',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n azureServerGroupConfigurationService,\n serverGroupCommand,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: require('./templateSelection.html'),\n basicSettings: require('./basicSettings/basicSettings.html'),\n imageSettings: require('./image/imageSettings.html'),\n healthSettings: require('./healthSettings/healthSettings.html'),\n loadBalancers: require('./loadBalancers/loadBalancers.html'),\n networkSettings: require('./networkSettings/networkSettings.html'),\n securityGroups: require('./securityGroup/securityGroups.html'),\n instanceType: require('./instanceType/instanceType.html'),\n zones: require('./capacity/zones.html'),\n tags: require('./tags/tags.html'),\n advancedSettings: require('./advancedSettings/advancedSettings.html'),\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n $scope.command = serverGroupCommand;\n\n // Give regions an init value to prevent it being undefined. If so, the React component RegionSelectField would get \"undefined\" for property regions\n // and then be unmounted so that the region selector would be hidden.\n $scope.command.backingData = $scope.command.backingData || {};\n $scope.command.backingData.filtered = $scope.command.backingData.filtered || {};\n $scope.command.backingData.filtered.regions = $scope.command.backingData.filtered.regions || [];\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: [\n 'account, region, subnet, cluster name (stack, details)',\n 'load balancers',\n FirewallLabels.get('firewalls'),\n 'instance type',\n 'all fields on the Advanced Settings page',\n ],\n notCopied: [],\n additionalCopyText:\n 'If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group.',\n };\n\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'azure',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n azureServerGroupConfigurationService.configureCommand(application, serverGroupCommand).then(function () {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'create') {\n serverGroupCommand.viewState.useAllImageSelection = true;\n }\n $scope.state.loaded = true;\n initializeWizardState();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWizardState() {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'editPipeline') {\n ModalWizard.markComplete('basic-settings');\n ModalWizard.markComplete('load-balancers');\n ModalWizard.markComplete('network-settings');\n ModalWizard.markComplete('security-groups');\n ModalWizard.markComplete('instance-type');\n ModalWizard.markComplete('zones');\n }\n }\n\n function initializeWatches() {\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged($scope.command, true));\n processCommandUpdateResult($scope.command.regionChanged($scope.command, true));\n }\n\n function createResultProcessor(method) {\n return function (newValue, oldValue) {\n if (newValue !== oldValue) {\n processCommandUpdateResult(method($scope.command));\n }\n };\n }\n\n function processCommandUpdateResult(result) {\n if (result.dirty.loadBalancers) {\n ModalWizard.markDirty('load-balancers');\n ModalWizard.markDirty('network-settings');\n }\n if (result.dirty.securityGroups) {\n ModalWizard.markDirty('security-groups');\n }\n if (result.dirty.instanceType) {\n ModalWizard.markDirty('instance-type');\n }\n if (result.dirty.zoneEnabled || result.dirty.zones) {\n ModalWizard.markDirty('zones');\n }\n }\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.toggleSuspendedProcess = function (process) {\n $scope.command.suspendedProcesses = $scope.command.suspendedProcesses || [];\n const processIndex = $scope.command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n $scope.command.suspendedProcesses.push(process);\n } else {\n $scope.command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n this.processIsSuspended = function (process) {\n return $scope.command.suspendedProcesses.includes(process);\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n this.isValid = function () {\n return (\n $scope.command &&\n $scope.command.application &&\n $scope.command.credentials &&\n $scope.command.instanceType &&\n $scope.command.region &&\n (!$scope.command.zonesEnabled || $scope.command.zones.length !== 0) &&\n Utility.checkTags($scope.command.instanceTags).isValid\n );\n };\n },\n]);\n","import React from 'react';\n\nimport { UserVerification } from '@spinnaker/core';\n\nexport interface IAzureModalFooterProps {\n onSubmit: () => void;\n onCancel: () => void;\n isValid: boolean;\n account: string;\n}\n\nexport interface IAzureModalFooterState {\n verified: boolean;\n}\n\nexport class AzureModalFooter extends React.Component<IAzureModalFooterProps, IAzureModalFooterState> {\n constructor(props: any) {\n super(props);\n }\n\n public state = { verified: false };\n\n private handleVerification = (verified: boolean) => {\n this.setState({ verified });\n };\n\n public render() {\n const { onSubmit, onCancel, isValid, account } = this.props;\n const { verified } = this.state;\n\n return (\n <div className=\"modal-footer\">\n {<UserVerification expectedValue={account} onValidChange={this.handleVerification} />}\n <button className=\"btn btn-default\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"submit\" className=\"btn btn-primary\" onClick={onSubmit} disabled={!isValid || !verified}>\n Submit\n </button>\n </div>\n );\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport Select from 'react-select';\n\nimport type { IModalComponentProps } from '@spinnaker/core';\nimport {\n ModalClose,\n noop,\n ReactInjector,\n ReactModal,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n} from '@spinnaker/core';\n\nimport { AzureModalFooter } from '../../../common/AzureModalFooter';\n\nexport interface IAzureRollbackServerGroupModalProps extends IModalComponentProps {\n application: any;\n serverGroup: any;\n disabledServerGroups: any;\n}\n\nexport interface IAzureRollbackServerGroupModalState {\n taskMonitor: TaskMonitor;\n submitting: boolean;\n command: any;\n}\n\nexport class AzureRollbackServerGroupModal extends React.Component<\n IAzureRollbackServerGroupModalProps,\n IAzureRollbackServerGroupModalState\n> {\n public static defaultProps: Partial<IAzureRollbackServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IAzureRollbackServerGroupModalProps) {\n const modalProps = {};\n return ReactModal.show(AzureRollbackServerGroupModal, props, modalProps);\n }\n\n constructor(props: IAzureRollbackServerGroupModalProps) {\n super(props);\n\n const { application, serverGroup } = props;\n\n this.state = {\n taskMonitor: new TaskMonitor({\n application: application,\n title: 'Rolling back your server group',\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n }),\n submitting: true,\n command: {\n interestingHealthProviderNames: [],\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n enableAndDisableOnly: true,\n },\n },\n };\n }\n\n private close = (args?: any) => {\n this.props.dismissModal.apply(null, args);\n };\n\n private submit = () => {\n const { command, taskMonitor } = this.state;\n const { serverGroup, application } = this.props;\n\n taskMonitor.submit(() => {\n return ReactInjector.serverGroupWriter.rollbackServerGroup(serverGroup, application, command);\n });\n };\n\n private filterServerGroups = (disabledServerGroups: any) => {\n const filteredDisabledServerGroups = disabledServerGroups\n .filter((disabledServerGroup: any) => disabledServerGroup.instanceCounts.total !== 0)\n .sort((a: any, b: any) => b.name.localeCompare(a.name));\n\n return filteredDisabledServerGroups;\n };\n\n private isValid = () => {\n const restoreServerGroupName = this.state.command.rollbackContext.restoreServerGroupName;\n return restoreServerGroupName !== undefined;\n };\n\n private handleServerGroupChange = (restoreServerGroupOption: any) => {\n const { disabledServerGroups } = this.props;\n const newCommand = { ...this.state.command };\n newCommand.rollbackContext.restoreServerGroupName = restoreServerGroupOption.value;\n const restoreServerGroup = this.filterServerGroups(disabledServerGroups).find(function (disabledServerGroup: any) {\n return disabledServerGroup.name === restoreServerGroupOption.value;\n });\n newCommand.targetSize = restoreServerGroup.capacity.max;\n this.setState({\n command: newCommand,\n });\n };\n\n private handleTaskReasonChange = (taskReason?: any) => {\n const newCommand = { ...this.state.command };\n newCommand.reason = taskReason;\n this.setState({\n command: newCommand,\n });\n };\n\n public render() {\n const { command, taskMonitor, submitting } = this.state;\n const { serverGroup, disabledServerGroups } = this.props;\n const isValidSG = this.isValid();\n const disabledServerGroupOptions = this.filterServerGroups(disabledServerGroups).map(\n (disabledServerGroup: any) => ({\n label: disabledServerGroup.name,\n value: disabledServerGroup.name,\n }),\n );\n\n return (\n <Modal onHide={this.close}>\n <TaskMonitorWrapper monitor={taskMonitor} />\n {submitting && (\n <form role=\"form\">\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Rollback {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"row\">\n <div className=\"col-sm-3 sm-label-right\">Restore to</div>\n <div className=\"col-sm-6\">\n <Select\n value={command.rollbackContext.restoreServerGroupName}\n onChange={this.handleServerGroupChange}\n options={disabledServerGroupOptions}\n />\n </div>\n </div>\n <TaskReason reason={command.taskReason} onChange={this.handleTaskReasonChange} />\n </Modal.Body>\n <AzureModalFooter\n onSubmit={this.submit}\n onCancel={this.close}\n isValid={isValidSG}\n account={serverGroup.account}\n />\n </form>\n )}\n </Modal>\n );\n }\n}\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n} from '@spinnaker/core';\n\nimport '../configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { AzureRollbackServerGroupModal } from './rollback/RollbackServerGroupModal';\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER =\n 'spinnaker.azure.serverGroup.details.controller';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n SERVER_GROUP_WRITER,\n ])\n .controller('azureServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n '$templateCache',\n 'app',\n 'serverGroup',\n 'azureServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n function (\n $scope,\n $state,\n $templateCache,\n app,\n serverGroup,\n azureServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n function extractServerGroupSummary() {\n let summary = _.find(app.serverGroups.data, function (toCheck) {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some(function (loadBalancer) {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some(function (possibleServerGroup) {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n if (!summary) {\n $state.go('^');\n }\n return summary;\n }\n\n function retrieveServerGroup() {\n const summary = extractServerGroupSummary();\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then(function (details) {\n cancelLoader();\n\n angular.extend(details, summary);\n details.account = serverGroup.accountId; // it's possible the summary was not found because the clusters are still loading\n\n $scope.serverGroup = details;\n\n if (!_.isEmpty($scope.serverGroup)) {\n $scope.image = details.image ? details.image : undefined;\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach(function (tag) {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.launchConfig && details.launchConfig.securityGroups) {\n $scope.securityGroups = _.chain(details.launchConfig.securityGroups)\n .map(function (id) {\n return (\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n id: id,\n }) ||\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n name: id,\n })\n );\n })\n .compact()\n .value();\n }\n } else {\n $state.go('^');\n }\n });\n }\n\n function cancelLoader() {\n $scope.state.loading = false;\n }\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = function destroyServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: function () {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return serverGroupWriter.destroyServerGroup(serverGroup, app);\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = function disableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = () => serverGroupWriter.disableServerGroup(serverGroup, app);\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = function enableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(\n serverGroup,\n app,\n angular.extend(params, {\n interestingHealthProviderNames: [], // bypass the check for now; will change this later to ['azureService']\n }),\n );\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rollbackServerGroup = () => {\n const serverGroup = $scope.serverGroup;\n const cluster = _.find(app.clusters, { name: serverGroup.cluster, account: serverGroup.account });\n const disabledServerGroups = _.filter(cluster.serverGroups, { isDisabled: true, region: serverGroup.region });\n AzureRollbackServerGroupModal.show({ application: app, serverGroup, disabledServerGroups });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'azureCloneServerGroupCtrl as ctrl',\n size: 'lg',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n azureServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.truncateCommitHash = function () {\n if ($scope.serverGroup && $scope.serverGroup.buildInfo && $scope.serverGroup.buildInfo.commit) {\n return $scope.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n },\n ]);\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER } from './serverGroupDetails.azure.controller';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE = 'spinnaker.azure.serverGroup.details.azure';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE, [\n AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER,\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ApplicationNameValidator } from '@spinnaker/core';\n\nexport const AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR = 'spinnaker.azure.validation.applicationName';\nexport const name = AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR; // for backwards compatibility\nmodule(AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR, [])\n .factory('azureApplicationNameValidator', function () {\n function validateSpecialCharacters(name, errors) {\n const pattern = /^([a-zA-Z][a-zA-Z0-9]*)?$/;\n if (!pattern.test(name)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters or digits. No ' +\n 'special characters are allowed.',\n );\n }\n }\n\n function validate(name) {\n const warnings = [];\n const errors = [];\n\n if (name && name.length) {\n validateSpecialCharacters(name, errors);\n }\n\n return {\n warnings: warnings,\n errors: errors,\n };\n }\n\n return {\n validate: validate,\n };\n })\n .run([\n 'azureApplicationNameValidator',\n function (azureApplicationNameValidator) {\n ApplicationNameValidator.registerValidator('azure', azureApplicationNameValidator);\n },\n ]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './help/azure.help';\nimport { AZURE_IMAGE_IMAGE_READER } from './image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from './instance/azureInstanceType.service';\nimport { AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { AzureLoadBalancerChoiceModal } from './loadBalancer/configure/AzureLoadBalancerChoiceModal';\nimport { AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER } from './loadBalancer/configure/createLoadBalancer.controller';\nimport { AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER } from './loadBalancer/details/loadBalancerDetail.controller';\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from './loadBalancer/loadBalancer.transformer';\nimport logo from './logo/logo_azure.png';\nimport { AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE } from './pipeline/stages/bake/azureBakeStage';\nimport { AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/azureDestroyAsgStage';\nimport { AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE } from './pipeline/stages/disableAsg/azureDisableAsgStage';\nimport { AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE } from './pipeline/stages/enableAsg/azureEnableAsgStage';\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from './securityGroup/configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL } from './securityGroup/configure/EditSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './securityGroup/details/securityGroupDetail.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_READER } from './securityGroup/securityGroup.reader';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup/securityGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE } from './serverGroup/configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.azure.controller';\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE } from './serverGroup/details/serverGroup.details.module';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\nimport { AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR } from './validation/applicationName.validator';\n\nimport './logo/azure.logo.less';\n\nexport const AZURE_MODULE = 'spinnaker.azure';\nmodule(AZURE_MODULE, [\n AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE,\n AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE,\n AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER,\n AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER,\n AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n AZURE_SECURITYGROUP_SECURITYGROUP_READER,\n AZURE_IMAGE_IMAGE_READER,\n AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR,\n]).config(function () {\n CloudProviderRegistry.registerProvider('azure', {\n name: 'Azure',\n logo: {\n path: logo,\n },\n image: {\n reader: 'azureImageReader',\n },\n serverGroup: {\n transformer: 'azureServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'azureServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'azureCloneServerGroupCtrl',\n commandBuilder: 'azureServerGroupCommandBuilder',\n configurationService: 'azureServerGroupConfigurationService',\n },\n instance: {\n instanceTypeService: 'azureInstanceTypeService',\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'azureInstanceDetailsCtrl',\n },\n loadBalancer: {\n transformer: 'azureLoadBalancerTransformer',\n detailsTemplateUrl: require('./loadBalancer/details/loadBalancerDetail.html'),\n detailsController: 'azureLoadBalancerDetailsCtrl',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/createLoadBalancer.html'),\n createLoadBalancerController: 'azureCreateLoadBalancerCtrl',\n CreateLoadBalancerModal: AzureLoadBalancerChoiceModal,\n },\n securityGroup: {\n transformer: 'azureSecurityGroupTransformer',\n reader: 'azureSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'azureSecurityGroupDetailsCtrl',\n createSecurityGroupTemplateUrl: require('./securityGroup/configure/createSecurityGroup.html'),\n createSecurityGroupController: 'azureCreateSecurityGroupCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('azure', ['redblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHvWIq0/4L77kGaEoSAEBgEge7OOIhre73ECocvJNOcTDrFIUIzOmk1vuuxdWBDV6YEfOWGTXN0kzcyrilIRftq27JK6xoT9jX43Adawp6qVr+npQ3RHU6yDGRR18mhWfgyIARc5HATuSzIHadGOosfyCCLNIroWrGl6V/AgdXYRDAwGglCYBAEPjHBAAGQhftfgO10bOOwpbeHKNLQ6e/E1nqwxd9Seqi91QgFQjctmJi2bEd1ybef2D4+pDnIgY6vYTOw6djQ3ykxBUoEOr2lIyULGgG+SDPx3+Q97PN/UwkE+4BFYc1gDSITgsdlH5NPISAEBkPgYwuG+s7AxENdwZNfKj00c3+Td3ppTevo6uZOagsa1OoNUZs/SN6QhpHfSUH06Wm5cQ03YayPmGZq2IijFI/T7vTR3LMAsDA1YKnAn5qFi5RWgF+QEmpXncUHYmjQJKIRyLAiiB8xMLkI8FkJQkAIDI7AgAQDtAEnkXlNiPRJD6yujNta7w9X1tW7mvyUc8rv3h3lDVkjIzAR8HzfaWDk5x6NWYPOI7gzjpJwNXfeAPq420WsWaDzQzvgjs0CQAkCPsqxoh0dX0pAsMqg0rPPq12c4+s4duyovcdHWZIQzBQShIAQGCyBAQkGJH45th8GwlTywDtV1Bh0kstwK5VfwyQ/0W1CCNhqPXdQ7pmq07MdINbpY30Y5zion6qX9+j1OB6dNBwWBkeeVtfaguKoE9H0IRiOOmFfIp9CQAgMnMCABAOm9SfABlDiQJeLdxuUGAmRg9UC1Qd1CAKNQuQiQ+2Z5MCgzRMB1gr66qV9HR941nuPCcHCVglMJyQIASEwWAIDEgy6HoIl0EkmrwyYsP7DYKhGdjW/t9V6BxYLWU/gEMEUgk99Wp1f3aSvD00JhgGVq68k5LgQ+LwTGGAHMnxqgsDGP/R2HVME3g4HFgGHk1Li4V8iFZANS61j2BLqcAb73IP9JA8n07CxloFyUjVsHgO2UeD6DKJgHjQmmFepFdc34vpOfEsYAAHwwyoShcCsLRYdx9gOBa5qpDmIc02xc5/kN+7DjVZH+sFPMt3PQlqHe3O/pdFRMeyCwLYBexZvrxz0fdGx5MKxzved8jHPcNLHTN6yvMMo7L4WgmQmSjQUJXPDS6rdotAOywo/pWmOF/u6ExpUPs6dBn+NU4DlBNKcwxy6CZZmB6ZQTaZlNcDkUg/1qgztrhRx92FrxsbOXh3SEFl+W2diivoV8GBnOG1nZU1HY8AMpHtc7P+SYVlmKtjxMlNlwAq9Ce+V+8GNGX6sgPtehEo41UHhQopEkskIhSKRyD7d1J/TnNqaj5X4Z+jiAQoGaoj1tVivO2bPOwYkNlD+K0OE4s4yHOFF0HTGdBs8kSGLnJNNM6KhAb2Fhth+dB6tUGh2hCJfM0z9HDhd8GiHwCkwESuXTAOrqmx1YaVFJy+ZH1LE2hBvGLtwAI5egXqkvb63tHH+cxEsq+sEDDM/NXRrzqGGDjrj58/RIZ+bgtBCg1jmPn3yEFr6o7lcGZC1VhGEwkSTTNbCFn8cQCHLOg2JXo+J8AKl4bKOCAVT11CjDj0f9bIf9VL1ce7xWbl2oIKBVWTeIMU/mfBxBUs/ueg5x+kzGtpE6gf7WoZ97+HV5EpMUCspv7lqOp2QzxqsNQYfPMX4iGAg3XGuYQWuJN1N67dW0o+XbKIEZyKWaYP0t5vPpzQe5Fi70l20vbyeFtzy9ESf4Sl5+tYL3jl91JAPyNR3QV7UIO2d2D6XwSTX1TBNz2GBevHPn6U2I5+KCy26ek4uVdb7aX+j7YYCzQuyVyHKwtdUdFz026hhaxDk0NhHv7mp8pRfvcDV4KJFs4vo6/OgsIQdZDnCl5qmvhXJ/moQSX/mLhmoYOhCyXn7xATDp0xyIMKh+c21u3x72lwJSV0RzApCtPAPb9O+316ETm1i+EKrPSqgYTopYhaaEArcXq9cvIqCqRnkxojThEnItqommlOYgUFOeWDS/v31ZLryKOB2uDfXdM0+fRQu050hjE8HcPnnUjCA4TegkX1Vh9PLph0VVBFOhud7kF697XyK78HbtOA1Axf4h1aU0vb6Jrr8zInZJw1N4ykcsxtsyPrj4+tT9lIiJYYjdNfyUroegkE3TMJ/1Lt+NfJXBeHz2GBv8Fm5bqCCAUY5K+pNyP1lIP3uX4aIMzeQmUqt5nI0wHc6M39YJvnqD9C+Lict33uQzh01pBOrrx/RFtBgMB8NBtk167mV26jLlUbjCtLJX9NM7U4D5kd7eOPnN9hIe86sSXRdZRcEg0HXzSliN685mFx7NM1A+7Nakd7avijhfBosYrnInwf6dZBcLlalefPhOhbSgw5IuyAIkeYiF1QbZXANBQLkcbspBcNnOkZyfMMtFQo2UEIHwooUtCC4q+KwEx8RtpWgTRgt+ObnYFgF/wgvHO8OuCemWXQVFrK/ATa4B1FZVQuFwW1UtuewULDCWNViwtw0NXp6VSltaNYov6g1EYIhFwcP8LWDCa1NnVkbIcCHZDpQqiC1dem0fFcdnT8mF3dS1rNifN5uRSwW4S+hTBsGc5+Pew1YJaCz5bjD0FodlA4biAdPCYXxv51CjiZUB6b21IT8eT/uvfq6fqCCAQ0xlol/H6EAgMprkr+5EUUDC4WBCAYYspShkHLTXTQqJ49q1tXQw6+VsWBg8NzoPxIw0tXywYde30th+HL81xlFdNefD+AZDg+alp0HtazLDpgQFLdffaqdBkZAKMbQg62TLTJg+DLzwlagAOKEhcMhbOiMNArbZGR/EjroWKdlDMXveMvlDOO5kC7Mh7tIC3fBONoUIWM/pkPlON+IzYU5eA7czIY4TLiE61o9nijbFYwEd7lcroM4z0JpBLaTkPZ0ZGQsXNQyI7CQYmE5ELbwcInbcqG3JFu6I01p8KooPAlHk8SnzrYTgz1V4NGKcmoRrFDpkSDKUo9SVViRCKZI+jZE3Yxte0x4oW6GQ5DMRbkvsHTtAp0lJpa8OdH2di/7y5Ir3haoqtagSfBdlGTFsneC0wmJZZHDofMcbyS2QXfWR1/bNMzQ3HT+zFHUUr6HVuz20VPv1CjBYPESO+4LhkXI3a0QYOehQ76JZ3fewD1XozwQhH0HlNONBuNJ77G60ndsFC8QmGS69PmW6RiL6VKGRmEX5jO4hL2Mg8lOy5UVclhD8BhhogHu7NAL76GwwzCb4fbfZGnORrSDhrBpHHDo6oFB1kC5PfgoEEgMut0uDCplyHeov3z0dW6gggFltjr6SmTAx7n/RuXKYfGCJnP4x4CT4ogoNFu37W+VNKrUtgJi55jBC8t3G+enIxCiby0opnveqaV122qpNmQezHcZfUhjx6HSfbVU2himjNwkOm9CHt2GngXbA7qMHXgWzA90YebanQlUJOqW88riw8yzdP0KwzS+gH7Bnal1a0VNqjcUGRXvcU+aUjAEPcXuLHg0DI3Vgc6CtFSpUGVoJOxf1tDeTruqm8IlI/MdQzzo12DBq0W4DRmGVeYyXHuQdvO6HWVxmstZhF48ZVZJgUqHOwH7pHBgrxTurxFMifg+WJGBThCi9/bUQFboNKYwi7LjeLGAL4VYgINb2IBDm4lHXcksgE9ZAYTRaV1QOzZX1H7o0I3STVW1tVMLcrkQI5DfU3A/rDQwERhmuaEjeKBJMY945FkFVWT7XLT4pDlwH6wmJsa5shBnNOp7FOp9r33BwD9x3Umn/uDxsQEjgc47KYv0PIuWlG6n1VsPUBvkZQpyxivdyoMXwsmyQlMNyzUVdzgF2yxcvwnfFdh46ZTbBmtNnOOEUCjEQis1DcYKxKtF/riT9hkQhx8yvFGPRC41jUAybC54zgcMFAb+cCEfnLhGb++soOS4eJoyIoccpuVA/WZDTGbrqrWhjSEHm0srrJDDKEUzrDi1pKCD3G7dZUa6ILvfQWIP95mRfk4MVDDwMpFSFbmpx7Z+0v3oKe7EaBRcfg78xemgZfDnoIItULgSY/IG+6aVgMSSB5BgJ2RIE/JkBoNhPTM3mya6A7Q7ktT115U72lB5vL6NoesjwX/fC9vb/B495Wun8QCPDoUGZfexWOHQlSEYgp1eyrv2HxQxPLTtkcupAA+KqF4LVVkt92pU8rcVG0t+8XQp+Z3caTB+mgFyehLp9ism0lUzMEACGHeVmkNtNOXaR6hg8lDa9KuF9LtH3qBfvdFIcXERR3uXlzY8cDmNSYpDXhAf2Whs7Rr5/T+/NnL5dsg+ZzxW/bj5QcxE3qIL5xbTH66ZQUlofRGMQxoUCnQLdZ3Xa9G1i5fR66UtWGBJgirShbmLg3Kz3LT0ptNpdHYKyoOGy/0CdHSHgzburaJb/vo+balnTdczUTfNiRbK7MYg+/ULxtNt55+oKiiCfDnBZeHtz9Hysi7KTUyn1EQHle73Uvo1j5MDM5ROCI9Dj15Ooy/8LXkzcik/OYnS4jW6/eF1zp/e4021TC1NQT/Oj517DpxX2eEZm5Hioek5aB7YkgJrqT0+gV7cVENXnJivGNg1yMIbewA/6Yo/nHLQOeRkPPavVpWAt92wwl448bV3tXsb77/lgkNfmTQEhvkIZn4Omn7dQw5a+GA9PXMd95leQ+pFf75gaEHmZdsXXxKno15sb0CDLvz+o/RKdSttfuQGSmpuoXm3r8TadgIFgu107YUT6LcXTwNHFtycS4N+/dg6umfFLuqKc2uY743TnNY4ZvjdS6fSLedMaEUsP9rxo4h/3FrDQAUDJKQe4A7o9weo06spSWVDtDtlz/1eaeBgMGKRz2fHDIXC1NXlw0r1sbJgx7fQR3kk5sDChfdRaCVgOAecN28oSEh3CKIUqYj9f7D6XouUypDKCOw7rpk/1vezV8qqH1ldTbedO3EYjlUdnYS/I5jy6q4DkMYZKd86s4TFCt4NEYTDV1w0L3wFDyTohDAzJqdnUNDAMhwP4+iGplrK5DGa6Lt3L6XnyjB3j4+noYkaZWcmUUdHgCpqO+jG+99HBzTo2mnDERPsoNXE5QyjlPQsemDFFrrzrVoqyE2lYZlx9P7WcgqFeQDDiI+Otw0j/cV3rlQ2kJJhyfSl2cMpFYaPvQd99Py6/fTqxib6wuYl9NbiSyhbjY48yeG7GDTz+49Qg5FNxcMz6Oq5+eisEVq3s41eXF9Jj6zdR7++8ESVdxQDxBz0yPItdOtTu6gz3kUnjxlK58/IgzAJ04bSJnrlwzDd+0otrd1WR6/ech7ED7dPJ40tyKIWB0wnaFVNgSDFO+JoVkm2GbSCSwPk2JKI4p44Pr/YSk6fVd0UHB2E1B2Z6TqQ4vHUWcFI+TLO6gAD2gikMd3wkwdeu9yNMs6bnt195YIJmfR8ZYgefn2fEgzs3M8MWJuCHciOpyWircPXV9PGok7HYs5I8XhOyEhOxXtBIvWtHb71kJCbcd1+XGAa7vSMnCxrJAwvvQqG5at25HzzqdJ5ltNjq2A8fVDscbE7iVKhhW4vb6Vf3fsSdTjS6aTiJKqqNlH/ts+dBq2OBdCCm56gze0eaK1u+t7csZSKwu3d34p6qqV7XthL28oPpj7znXmsyXChjjscq1fGEsS8R4t3Ifat542G8zNUW+6Y3P4ReFyN7bPhTY2e6AjcWWNB7cJ4VZTLU2mi+SV5tPS7meSOrkfxMebD8bgkLBRVx4+quywYjghIPyXJjUbFEfnZDB2dL0LDUtAOLJqGa/MhKWuOuKbHD5zz/vGJtZV4nmMfBA0b9awvz58YvOPFHf72sCN+ZXnjRByr6nEJ52f2X55ZP7wTL4+aOTlLWdCwNg63PTQprERwg+JgS3TegYiAKNd52hiV8izV+PyKd0rp+X1szzXoR4sm0rdnl/ClKuzc30Rf/fVyWru3qVswQH0hF+C21rXTL/c20twpBfT0905T8f3ovGoeyr8wYlx290oKxGXSRScPofu/Ol3FiX3csegLNONHS6g17Kav/88aev7G2ciP3WFffGMrNVipVFQQT6t/Mi92CV03HxpIhxdTF26cAZQSqzJYMSirqqdbn95DZqKT7rzyBLphxmF5fC2u2YZyLPrFctpem0h3vLKTbj17HGt0dMc1s1Xa/1iylm5+4xBNKXHR0htPvwsHF4NNvfYzVffcoS9f9LMXLlrdauT/YNGkLdedlLca59mmMqAAmy1UlfCV6EgLX/nwUC7sq2ByOI/ng/mSvZtpZ1krHYS31RCUyQ6sR2Jagfa95e9fw6O60YaMrwTEWVNaT9fcswao9Zx5k/PQTvRqXFeHLWzqoXgsXuVFE/rIl+HRJhgR6wTbcx+nucOo9PklRBZluB1020PvQXNKoTfuPpfGpbhVGj7kD+Mq4jjo5vtX0LaOOBo/LI5W3nIxeuPh8IMvttDs21bS21vaaOnOJu3C8ZmxGe7hSAPY65lmP9GDQ7DulmtgmBidA1USHUGpWkcP4dEUuKjx0GdTEj3qSExAYE5vM8DRZEiZ4kxu7DzFODLAuwgPaemUFmdnD/2r18DXxc7xPoNzI08QE/BmNLn1/bPXC2MHLarEbpVmah349jnjnJF5Y7ITX67wJ9774ocnQBBgTFPLivx+uknYn/fga7vHY1gwvn3OWO4lHo3Vlz7C4XJhLwpBcUP837/wPkacbJo5KcMWClzxyLuBUX9cQQZtuO9KamrrYejHOb6TH9Wcm5kQFQpIF8IWJmt0OHRu3Ul/eX4TdTjTKD1Zs4UChIaJuoBFQbmxOzFlefT66XTm/2yidz9oph0dQRqfxH2QaMcBFFcP0KTifPXbgjZEMCPwjCoTQjgzKR4CkB+Sw2nU2y//uY4I05eTJ2XZQgHnTAgwe3CwaDLK8b1zxtNdGJH/trKcfgrB4ISgZFsDy0lf0G6zkYi1Ciny6/h4hUMF7OPm9LdLfrIEMbVxXb7AVhzD6DywgLorwZ1+gmsvfXN9KTXBtpeE5//nDcOKO9cFMnD6ScWU8uC7mNK76ME3K+hn80d2J85lZpuDgbaegDpBgdU1HOHme1+lLnTcb140hkYnumAjQLG6r1RvLst4fE1V2uWzCmGbOzKYpjYCCalVGfsMX8lAcRT34zbc4TPpqdvOVELBhPaFXFAcVz5aodcXpifXNZORGEcP3XSmEgomFgzRkzgByslKoxvn5NOvVzXT31/fbiesUj++jwEJhgi5RsJLbWQgrNOiBzdQE+yzUK2QkejN+PY99vknXITVuxl47hrrDMGwSZNzPPTSd06lF3fW0neeKqWEOIym3Rfb6bFRjI1SEJ4IuB4JRnC/Hrew01TFRrXwiI0jPqilj1xxAs0tycg0TYM7cr+CAauGNWgjaIxKAGCeSKHrzxqVs2Lxlpy1ZR0ldcGwK9flGIPmziJq/Lvry0+q1uMKc9NTaV5BGsdPsTTLrrNY5nAwFuxDPT+RVZSjo6WDqjpcFNa9dP3Zp9jRuXwoB6tbyvIPVTY7NTnWhkGBOeBadKa//GSOuoYbEcqA48gdX4vwLObLvNT3pdnFdhwIDTZsdT8WjwKPGzeccmgdHYw36K1t9TR+ZoGKOyY9gUIwzq18fzeVn1VERUpgwOuC64PnGuj4XO1cEWEInC2VHbApJGHKYd/LFj4QoUq7s4XNpbNG0W9f3UN+TBs3NProlEx7sFA3jH1oGnf6itjPI74tcz2EUdBp6Wz8G3gww5ciz5eyRvb06nIKOt10xexC+3rkj9djmNjc0UPohaoAvbx6Tw/BgIFPlQFtC7EsaIMWVHjuoHfAIa4MQmFYmgsa0BhunpWwE8D93WrDvfjlY1AdjaRIvDMHF39EMOB8XndDtnPT/clDJL/U6JxZhTQzH5o1tCsT3JVSAQ2GV7lWr9tOQU8CjR2ZRiPcdp3rWGmxA1cOyjSxgH6zqo621zX3AtuOeaxPtKhjB5jRML9yeTgbiR4HdaF19CcYuOAslHlT+9FbKE3DgZaKYKGQptOjXudmF0dFBRo+x7bxCIxenEhMIAAQ1xMCM2KtgiOrZSZ1XCM/8mVGLd68BGTH7vtTCxutaDztqBBOAQIi4p06oUgbHrcmsyKSlXP/m3vT7jh77GjNwtOlmnvM/7y8rdCJTvil+UWcKGsTPnRLNVdUZeWjPQKXpTvECokmWVHfpmbbHqxUFGWzrdTEKga0JJSVH1XnaZOOaRHrPkqfRVtTnRIw+cnWCVl8TQhHIVRxjZKcipxGtS0taNTZWEnATB2BPQLsSuB4nCZrezDv5zip6SDmpTUN+FWALUQXnT+ZfrlkAzwRs2gOphuXzymmry8YS8OT+X58K5QWAoEbaHV1E4AlwJ6g06ShPACGlYAKY3WGTZqGMto7KAPajQfTPT+Wc8uqGyAYCqKdjvMVDRGzLrZ79LceZ1ZpbdqQTsN/4Ohz/f1Gu5ih7gBHphW7WjHVctCiWSXRS1gocO1odP0ZY2jZPetpnx8Oao1dNBn5VbwUN+wimon64EXbiop6evDd/Yrhwz86k9NaA5n5qq7p67DPqxU5iJ6tm1YiWLHaVYrtiIAaZisngvo48hwaERuyJ+ZDq+GAN5LpEEoc14J0QA+gHVWt5HThxcedAfr5ko2kId8hCA8Wdfwe1DCaRGdrhOIhCP0BPQWaE96VrAwTKsmBfgxIMGCcGM+QsfyBxuHEMhUqXo0gPW7Ts5zY58Z3dPnhNoiRy74lXEzIiYLjQDcijs/X6XByORy4s9iNOmYPUhUeHbo4PgfVicL2mjt3NHQt6Nb9B7RpNhGgRSu1tQvWvjbUf/Jls4pDd61uSn1uVXkyBAOm9+7kmtqG7HcPwMcEasy35o5EwiaqgCFwDlBpsYz0uKV9yAZjK818UqfGTj93adI9mG6x4QbXO9AglHDAlILLqzqhenGWugS3QWpst8E3P1PARjxenozNVflePh+MoHDvDbm8UPttWw5rUqqTolNHkJ7BIgl16HLHQzvAa/dY7eAQQY6gfbz7wDW06M4Xacv+CP19dQ39FX4dEwoS6PfXz6SpMHZirUaVuBM+CHGYfWt6AsXHceNFvjFNsEvDv7kOOW3so86xPAsDKX4icBM/ApfRt8PWM7ct7Mr/1hKvL1TXrx+BnbL9aXVZeVgByeFcLHnjQ3ivx1MROvyIdM4xplYsgLn9IRMlE4ZTdsIGavZr9NBbZfSnSyfZWprKuy2kbd2CaOHvVgF7Al130Rj/hJT4f4TDgSUOh/sddDzlcIZOOAUysAQrFlj9tEbi9w6c6xZ6+D1t+bulI2xtRLVilWGuTq5elvEm6pjnqBwiYMaWKz6uminaTpPPh2m2iw7h9Wl/WrZXadIcV2OtBk3eQD3qmDo6IEgS4oPcCHgVZ8B2GU6LwzEFAwrDIy90JjRtNrBxZ0ZGj6xZTurIoAbxHod4hOdGzXNQDnxevcgFHcI+og6rDwZh79jAWB6i1Kqq+HjstB0p9skQ4UTEWgYAQh9hVb/fYEBlQPXAG1aJ5ahnDZlXLTjR+d+vPJnREkkqfHlvo75gVCas71spAqEwd3K+8kTCCM69ArLbDqqvHnU3zokd0BHUD/7AFahwHrnhFISRFPYWFo4Q6g5bFULcaKo8wkODUN0I3GwDLNKIJcydlEHGMsFxUSAWvh1e7kdJfBcwx3Hw4+mEmnbgTDjSRU7INl6o7A4oBPsWvHDbRbSn4hDdB+/O5Vs7aX+DRWffvIz+9N1ZtGjqcBWdNb4grPM8igX5ZZ48xcU/nk6osnIZWG4iwHkHFc6Dgi0e1flYnvk8FCYVsY8PtBtHbtJonpv0Gy92eSdkXmIk7CVoCY+9vZs8cSlUjzcTj7rmETWosWc7+3MqJmg1ienxWCJ20Rsb95MJwcD5xGMZioyu2rtOv3hoFTWAV1qGm24/a9xfca8/OZ2efbF7Rr9bARtSUIPPhVoNgTOaxXYRXgHLw3Y6etA4rkcWjnaw88E/+XjPR0EYH1evagFqusj7sEKFfDRuTAatue4MCnax4xxfG20GqiFCZ8OBxGSse3Mj+DQEA8aXYowlI6K3xT0GFpDPgYejInf/7LmD/e6fvaXco31HTx9TMJimA3oj2wjUdAAAefg0MuISPTmzCtNHrIWWff9rpbRg1Cx6fHMthfCU7ne+OIGT34l5JKYeVgYMl+x4c8xg550ziWVJGOz47dhaKECNeFluNpb6WMfRYPFm6WQozQD+f2igrJYPQH4jK2GKw4t1VSNBpy2HWqweaI5er6Yn3HpUDI0q6zqhoWRgydPWLNjjVl2LO/LaesmIbPrj18+g3yJfV9y+lDYh7o8f3UznQzCwsp0Cb1Edajr36upm+CTkJKley5og5xl/9wMlgRbT3km+EFKGf0ZhXgzVkTWJK7j99xoW3v5MwtuaJ7UrGOGOdXRH7PWaJE1rgFfgroZD7aeV1ofJl2bRvEKXz+3KeT9kUiU/rwJDeIZh6SMgdCaYYa/jnXI/7CAavbmvheYXgwmyZI/pTiqHkLx/fTWF8adQnv7O7HdxfAU0gd7yAnGjp+hacBgwjEDm8OAMlYT1cBfehZ6J36e4HXoedBVoiL0V+UguPQunNEiQzU2BRgghEQz6KAuOT8rUqSLaIuTwNcycnIFAgAXqcYdjagwQCmxEGZRTyXHn5pO9gG0A/QbNacL9V0uAYOC2nomZJMoZKoHxbtwNCybT2gfX006sx/83nsYL4vmx/ByPd3pO4tsgvgHV0IYxeBRsFLmoguyoInTE/exq5k/uchzYSIp36xd4yIORyKt5aMP2Who3fTg6I+KxtEeDVK7KUPdZSFgxDU1db3/01nzYOYqPF+ek0gdtFq1cd4BuPHWE3eXQXFkpUgZMCJu6imYqD6EjQ5icMWGYnSgaG4/3ERzDnBmdHCnCIu5AB//HDxbQ6JtewHIwbAveAI2Jd1Nhbg4Nwft7GmAnWrKhgqafPwlTw2hjx5zPgoYAnZZefL9K2Ywc7jg6KY8HMJWyyqt9YxaV8BfvI5j++GzYeIZDCLGFrbfO2MeVxnt4zuKkLnfaiMw4s/ThG894HhGXxjo0RvJ8/J6GbS6282Z884miOnh3Prx6NwTDDGgTKEu0Ur92z5uYDaXQtfOK6Qu5SVWIj0Gh15Cd4Q7lHwjEjaxu6WJBMA7I2lkTtLQgvKVdae/uPkiGCyJTjeycRm+1qdKGIyOrCXaIaVmTimCieHsX7a211SwHViTCWD5mIcx2OdbK4ZGqNHMIMFSC2qKpDPzLFor9xEfKrIr8J4bwsTINa3sGWkACFDsWDFnog8VQ4ycDce5p0wopC0/9scf5I29VqM76jbNL1iDeP9Di74VQeBD7S1EV73Gldddzj5vGxIFq+tEGwEu2uieNTs53kAsPEP1myTae9aMNomPy1ACdyoBQeO29PfTrFTvU7x5Jqt3D6dpn+He0S9JlpwzHkmaIPtxzkB6Heze7arOA4TaOToGYTrr6oVWU4HLSyKHxNDWLbafcCbAQz88uQBBAG4KYARXkgwNcftX0wIXWku7mY9zeiGaOzSU3lkmfXFlBO1sxdeF5DG8QgHCLpqbOIN2Nx9LDSOfsaUOiDalnp+BUcGMYgHmvt+B2BIrwd0cm7tjffBo68/ze4vRxbN0T6yvf0vTAsrOmjXgYZf9dTChwfOzXYHuBwuEX8PONL88sCPMTlm9uPKDqg+0inLfFT6yjMq9OQ1M0uvOS8Xwpj8DDeKeXUDw2L67IMNzDn1tVylIQj4tHRmLqOJKFwr3PrqUHV+/HdI2nhVwXHJhXr+EDxHgHZ5r4rD0Ft2j2jNGUYTbCsKjR3a/vQRbdWAhQ5UFKXNNID+2IpyHY9brdbvbROe7QZ656pBSVWrHmGCtQjxj/lruxNYy+M6dHzBQDxj7E5MIlYEkW4lgfDbdbddGXTiqkDoygUP+w2hHxXnbKiNfRmP6JjV831obtZS1svYzpexXeCBQVDmhdUVTc0FjF52/e5QB3WvV985WzyN98kLpCLjrtphfpsffLaGvZAVq5vZyuuHM5XXbfBtp46LDSw8o2z30N9MlYpcVGEf7mdsYGqoVnT6ZRRhc54j304z+vpe89sobeK6ulLeX76Rk4Vc3+wT9pX3sctXnbaPE3TkFe1OKoytNZP3ycLrt3Da3ff5BzqtJswF8Eu+pPq8jvSKaSUamUzVYZVUCLfnHVbKzjtJELHpDn3ryU7nppC22oqqEtFQfoXuyf+v+epGZ3JpqrSXd/lQfnoJqsqYRVKjCSmeZujM6V+NlrmFKUOgoOYuPWrN8z47ENZedt3nvg5F4jHnUQdbO7pi30nj9svn7FnKHc+XsPDsc2nCj96vyJezXYIVx4pP7RrVUqrgVv03tf30UJmKoPG5ZBtz+7ybztnxtSbn1y3cQfP/7+7O8/vVatSHFkCK3R+Br1xTkThoU68bSt10Xzf7Oc3itvwDMnB+jau5bT/3+pmk4YNxyztjBqKqrho+7QfroDnoeA9mjtxIG16OYr0TaXAnc5251iduKbL8ZzcN5OWrxkJ93x7HpqDwcRHQ0AQtkH79834Al7wS+X0eK3dvN0uq078ePYiXb6fq+Itmm7s9iNot/4/yYn7VGtv8x0hSPhtmDwUFfI5FpKxGCeqxl4g0e0Y39lwST6zVvL8eihh86ZPXwHZp5vH52eP+h/tt0fHtFqmRf4LPWCF1QQ6wBOuMHBsT4QoYAV8eOhllIc7MRIlIu6Ly4ZnkX34HmF7/5jI9XGp9CP/radXOEAloLR8dFScrPj6c5LJ0ZvB5dYNIxWuKN3mIlqNYJPKMHAjYqFBjccaAf8ZOJLd19OC3/2BG3vSqInN7TBIWYNBAqPUh4sbSWRx9lJS39+Lk3LhjIIwchykJ+vmFmcTI9tqKPXttShCOzvBw3GAbsF/ibgiJQgnKouVPlhNywkRknJHlp+6zl02Z2v0SEtlRavqKI/LC2HAAtTEB3MifceDHN76cW7LlLaggl7HDtw8eydW1MAjbgpqL388g/P2KIS7uXj+oUzsu9b/VSaNy0z7qcP7xweNEOT4i9+tNK75Ipua38vl6lDna7UdXmpce7xKSm9uidzJAgQ/jOKtVlDUmpHZfjHbmtz0MPLdtK1UwqptaGNGsAtDR35/e2HwmvC1gcQwE14gjUe5RthBsO+E3++rGLjbeehOOF8OKakzj5xpLFwcik9+0EnlVfH05d+/a56TXI43EWXzCuhexdNoeJrHiMj1dbGeBZlG5gNag8GqMWvNftD5hvI2utQXWoAcQj2a1DXZyGvkAgmffnsiVTf1Ux/WF5Bf1qp0R9fWUrOcKfiqhqDFQ8HLD9deoab3z8KVe74wzEFA5rA4WHr+NPv84po3+vz/P/FiS/OGr3Xmaw1Fg8dyrfDHFAtW+aho0zhJdO8ISn04NVjaE9riK4+c/wGnH//6HwlJyc3/XnZxvv84cCOaXnJSEhPxpYKdTs9MS3ec8vFxR14fqEKTz9W4lqfael56BdTUcFTL5o7Pn/W1EL9oVU72t7aVtdkGhneIRmacclJ+RkXTBtdwL4FaoqCZleYk0Y/uwRaqSfRl+F04IQacjwstVlt5Hjsps7ecQkuY9+Ku68qf3vr7tZn19fH7Tnkhg0knJ+YoOddOL1A/8qpcPlHVLwwRXXRWCO47yeX0WU7qvAsRVXDhqqONkxDtPRkI+2C6fnpi2aMxRX2fZRXIKYb7JU3pjCHttx/BT2/5gN69v3aSKPf2olHsvcU5sTv/+L0vKZzp4xk0ZUHY+BEzLQn4omu5Aism7Bi7Fowc9wrwfiqB370sEq614/UxPjO9b9bWPPLJe/RvtrIXqwj1Z1zWZHv+0t6jX7EwaYHzq9RevgRR3v9UYmj5b/95txTX9tZ60lNYHMGDGtDM+k3C0f7w07HKojIDSBWie92iDU/DABtQX+oYdawGTwio4yOFrz1kx3mShf/13neL27eG4GXbHNzwNGRkZ4Qd8OCk4vnjMwbzmu2P1w4hhLwgh8OIXC0xSQet7x4Uu3uhrYnzz0h5xm0NfaNUAGCaydWdXbjDzjNQwWfAZE69MZLTqPL5p1Iz60tpeUba/DmjBxe+IGBN5WmFsbjmZUSyk+M23tlLJHj/Ob20W+A+XYeGs5LgOLxwpFhzu/fgSWdPRtjl/WThGqo0Xggxktzk3PctOyGafTMB9X03WfKKQlLgN3TrViSg/jmjtEFifv41fB8LIINkSI3YN7+1+NJChUwEvHnI5unoXgT0HmhB8M9kWgTtr+hsl4ZaHpIi1sX2y4wPdRYpesOODcK+RuHJxuzDVJ9m0c0bsO8hM3qKUuqEij56FVGGuwYAZjzDqD9VeI4j5S8HM9mf3bHTcVEJwnKqdthuuDIoF4bx9oJJqBKjYRaoDyYuGwjsBWie2diOYv95sJYrWA9FMlAzyezCdaBKuzvx9aCjWuZjWjIrzkeLsIl8JXJhhSKw6ocO7dqYd3yY30OeVIvvWVO6ECEkfWItz47cWwq9KhJmFbgNSmRNhgedmpO51s43m/A48+YOugnYutAxC1I94N+LxjESdQHJmmRK2HduQiX81QlC7PLRuR1PdT5F/GbX9rC3PsNSGcM+uYUiEwolzrXObPkeRnL3lGQpKfC3jAT+7y0lc5+KZDQmLlqVRiI4K3k4Pb1PO7Vq4aD9LkuTke7OA9+C/MhoHNxHxzqLVjQOrQ7kdbrvZ091rHYYNFnPESowclqbGgcaFKxD7WD31G5oNRaPhcNfFp1+Gi82PEjvrsTw1Ek1J3WEZH+734AYhnuVoYKeBDrQaPgQ88VwaEK55jBgAPiBxCZt48EnNuLg7z1G5APNmDhUQi2ZxzbYauPxFiV5HX0jXweaULwaJlhLQDfODeedVUdDk6jUDWOESy/VURuuEVqFIfmCE8a9hTAU1vkaMCle5FGr9oljkMm0Prodoy7HHla05zv4Qhvn1pA/rgl/h2DYBnKM9oMaR7LaVWjeGtwjgXkgALi7kJE3noLXN8r8Dx/OlRKDAqRIeAH87OB90ihj2kOFqb91gHONyKNp1GHz4a18HwIhUl4xD0DbjGQ0Swi2EdTDyG9g3gx3nuuj/EGqmMKBtyvDFJwF6TgKFY8/ZhzBaLr7Oz9qEHlRpdGp45KCFwQ2+O5a2yfv5WTkxqc8AOBH0EGkKi6jBktD/uIGHPbtWMN9pNnzYMLqAAUuc8KHlyig7gK+ejEZbx9YgFpsqA4LiEXu7nm0cqxz9tnMjg17R0UjLdPLaTY2sDHugfqkOXAyuj2qeS1Lz2k+2bIBB7rMNdhMbrRjU49a5hBxRl42os68O6AZmr1BagVD/b48Ict/fCAC2Hyxf4svAzMy+e2GsDr9yzPeG3eviXPh9Vba1hWq8D92MDGsqr7oDozuA/+Ow8ShIAQGAyBAXUePRheZjpcGfDLKLzv8hm85lwHe4G3HU8f1raFUkqrW5JKD3oT6zp8yfubfZkNbb4hLf5Qts8y3KxIsP83vPr8EdOoDpkOnqvh73toI/H6s9yYVsHWdBYIrNTxn7iDuqTKA8GkvgfxEV0PGsSVcokQ+JwTGJBg0NzuD9FRf4kpM4wqHnYM4TnjRwLiuHEwHSezvWHKqm8JppU3tsZV4gmV/c0dwaomb2eCI8IGthRfCHM5X8fJXjN+um7oWdjgKMcuwZi8sroBgcD7Sj5gZxDiwYPLJQgBITAIAgMSDJwuhAEbYfo1xCAOG9tYI+Ctz/DgFfapVRWdOWW1jSfub/FO3VPv/cLOurZ5LUHL0wX3XV5KM9hrDzMPg58yY3sGLmMNwhYS0ekGaxS8C1UjeiR2X7aESxACQmAQBAYsGAaR9jEvmTsikX3Ol/MGbWMIvi+HWfZrOxsC46rqG2l/R5j21XuprL6FDuC1YniqGJ5d2PAydTxgj9fm4G1CcL1V6/h4zJQfTsHEhbcuWDbZyCZBCAiBQRD4lwqGnvmFJsDrvb+HgGialGVcPSkrf07P87zP/hM1rV2+2ta2mroOy1da05m4s7Yl91AXtAx/CG6oeGIwxJJBXwvL576jr5ffQkAIDIyArZUPLO7/WSy8iGQGJhMn44aF8JaDtxK7LLMGoNXimzv8AWw8bWFPpuHYRrQEQznlzV59ZEp8XWqckx1tnoOw6XVdHeckCAEh0A+Bf0vB0E9++zwFTYN9TFkDaoFAYG8+CUJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIfCYIWJZV8pkoiBRCCAiBT4QAywQdKX1bhMMnwlMSEQL/8QSisuDb/wtm7JLg/HaJgAAAAABJRU5ErkJggg==\""],"names":["AzureLoadBalancerTypes","type","description","_Utility","checkTags","tagsObject","isValid","error","errorMessage","length","Object","keys","TAG_LIMITATION","k","v","entries","TAG_KEY_LENGTH_LIMITATION","TAG_VALUE_LENGTH_LIMITATION","TAG_INVALID_CHAR_REG_EXR","test","getLoadBalancerType","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","forEach","key","HelpContentsRegistry","register","AZURE_IMAGE_IMAGE_READER","module","factory","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE","$q","categories","label","families","instanceTypes","name","cpu","memory","storage","count","size","icon","calculateStorage","getCategories","map","category","family","inst","costFactor","stats","min","Number","MAX_VALUE","max","push","cpuMin","_","minBy","cpuMax","maxBy","memoryMin","memoryMax","storageMin","storageMax","Math","buildStats","when","getAvailableTypesForRegions","locationToInstanceTypesMap","selectedLocations","location","getAllTypesByRegion","AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","UIROUTER_ANGULARJS","ANGULAR_UI_BOOTSTRAP","controller","$scope","$state","$uibModal","instance","app","retrieveInstance","extraData","instanceSummary","loadBalancers","account","vpcId","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","loadBalancer","isDisabled","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","details","state","loading","latest","isStandalone","health","displayableMetrics","filter","metric","detailsMatch","latestHealth","defaults","healthMetrics","extractHealthMetrics","discoveryMetric","vipAddress","vipList","includes","baseIpAddress","publicDnsName","privateIpAddress","go","instanceIdNotFound","detailsTemplateUrl","CloudProviderRegistry","getValue","standalone","this","canDeregisterFromLoadBalancer","canRegisterWithLoadBalancer","outOfService","hasLoadBalancerHealth","canRegisterWithDiscovery","discoveryHealth","terminateInstance","taskMonitor","application","title","onTaskComplete","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","InstanceWriter","terminateInstanceAndShrinkServerGroup","rebootInstance","registerInstanceWithLoadBalancer","loadBalancerNames","deregisterInstanceFromLoadBalancer","enableInstanceInDiscovery","disableInstanceInDiscovery","hasHealthState","healthProviderType","all","ready","$$destroyed","onRefresh","_AzureLoadBalancerChoiceModal","React","Component","constructor","props","super","choose","close","ModalInjector","modalService","open","templateUrl","createLoadBalancerTemplateUrl","windowClass","createLoadBalancerController","resolve","isNew","forPipelineConfig","loadBalancerType","selectedChoice","result","catch","reason","dismissModal","choices","show","ReactModal","className","choiceSelected","choice","setState","render","createElement","Fragment","ModalClose","dismiss","Modal","Header","Title","Body","onClick","Footer","Button","defaultProps","closeModal","noop","AzureLoadBalancerChoiceModal","AzureProviderSettings","SETTINGS","providers","azure","resetToOriginal","resetProvider","AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER","normalizeLoadBalancer","detachedInstances","concat","activeServerGroups","chain","flatten","value","convertLoadBalancerForEditing","toEdit","stack","detail","vnet","subnet","probes","loadBalancingRules","elb","securityGroups","dnsName","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","cloudProvider","probeName","probeProtocol","probePort","probePath","probeInterval","unhealthyThreshold","timeout","ruleName","protocol","externalPort","backendPort","persistence","idleTimeout","sku","AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER","$uibModalInstance","azureLoadBalancerTransformer","ctrl","onApplicationRefresh","newStateParams","accountId","updateLoadBalancerNames","accountLoadBalancersByRegion","getDataSource","refresh","existingLoadBalancerNames","regions","pages","listeners","healthCheck","advancedSettings","isALB","accountsLoaded","submitting","validSkus","TaskMonitor","modalInstance","onNextRefresh","nameParts","NameUtils","parseLoadBalancerName","freeFormDetails","AccountService","listAccounts","accounts","accountUpdated","initializeController","requiresHealthCheckPath","indexOf","updateName","getName","elbName","trimEnd","getRegionsForAccount","regionUpdated","vnetUpdated","selectedVnet","vnetResourceGroup","selectedVnets","NetworkReader","listNetworks","vnets","subnetUpdated","selectedSubnet","selectedSubnets","selectedVnetChanged","item","resourceGroup","subnets","addSubnet","devices","device","removeListener","index","splice","addListener","submit","descriptor","appName","clusterName","resourceGroupName","loadBalancerName","ruleNameBase","subnetType","rule","LoadBalancerWriter","upsertLoadBalancer","cancel","AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER","angular","SECURITY_GROUP_READER","LOAD_BALANCER_READ_SERVICE","$exceptionHandler","securityGroupReader","loadBalancerReader","extractLoadBalancer","getLoadBalancerDetails","filtered","securityGroupId","match","getApplicationSecurityGroup","sortBy","s","ss","substring","toUpperCase","firewallsLabel","FirewallLabels","editLoadBalancer","copy","deleteLoadBalancer","command","AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","roscoSelector","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER","parseCustomScriptsSettings","configuration","Array","isArray","customScriptsSettings","fileUris","fileUrisTemp","trim","convertServerGroupCommandToDeployConfiguration","tempImage","viewState","mode","imageName","isCustom","publisher","offer","version","uri","ostype","selectedImage","selectedProvider","strategy","rollback","onFailure","scaleDown","maxRemainingAsgs","delayBeforeDisableSec","delayBeforeScaleDownSec","allowDeleteActive","allowScaleDownActive","healthSettings","image","useSourceCapacity","capacity","securityGroupName","user","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","isEmpty","instanceType","vmsku","interestingHealthProviderNames","normalizeServerGroup","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","azureImageReader","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","images","selectedVnetSubnets","instanceProfile","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","loadBalancersConfigured","networkSettingsConfigured","securityGroupsConfigured","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromExisting","serverGroupName","parseServerGroupName","desired","tags","source","asgName","listImplicitSecurityGroups","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","disableImageSelection","submitButtonLabel","instanceTypeDetails","viewOverrides","extend","AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE","config","Registry","pipeline","registerStage","provides","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","validators","fieldName","checkParentTriggers","getMessage","labels","restartable","setManagedImages","managedImages","managedImageOptions","i","newImage","osType","extendedAttributes","AuthenticationService","getAuthenticatedUser","addExtendedAttribute","PipelineTemplates","addExtendedAttributes","controllerAs","extendedAttribute","removeExtendedAttribute","showTemplateFileName","templateFileName","showExtendedAttributes","showVarFileName","varFileName","showDefaultImages","managedImagesWasChosen","defaultImagesWasChosen","customImagesWasChosen","managedImage","packageType","showManagedImages","baseOs","showCustomImages","onChangeAccount","r","onChangeManagedImage","selectedManagedImage","onChangeOsType","e","$watch","forOwn","val","getCredentialsKeyedByAccount","BakeryReader","getRegions","getBaseOsOptions","getBaseLabelOptions","credentialsKeyedByAccount","baseOsOptions","baseLabelOptions","baseImages","osTypeOptions","packageTypeOptions","showAdvancedOptions","stg","showAdvanced","AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE","executionStepLabelUrl","accountExtractor","configAccountExtractor","message","fieldLabel","regionsLoaded","getAccountDetails","org","targets","StageConstants","TARGET_LIST","target","AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE","alias","attributes","platformHealthOnly","AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE","reset","resetSelectedCluster","AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE","deleteSecurityGroup","securityGroup","operation","TaskExecutor","executeTask","job","InfrastructureCaches","clearCache","upsertSecurityGroup","assignWith","other","isUndefined","AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL","$controller","azureSecurityGroupWriter","ingress","firewallLabel","accountName","swapRules","ruleset","a","b","temp","priorityA","priority","priorityB","infiniteScroll","numToAdd","currentItems","addMoreItems","namePreview","upsert","addRule","protocolUI","access","direction","sourceAddressPrefix","sourceAddressPrefixes","sourcePortRange","destinationAddressPrefix","destinationPortRange","destinationPortRanges","destPortRanges","sourceIPCIDRRanges","portUpdated","ruleRanges","sourceIPCIDRUpdated","protocolUpdated","removeRule","moveUp","moveDown","securityRules","AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL","CACHE_INITIALIZER_SERVICE","cacheInitializer","destinationPortRangeModel","sourceAddressPrefixModel","refreshingSecurityGroups","getSecurityGroupRefreshTime","getStats","ageMax","refreshSecurityGroups","refreshCache","getAllSecurityGroups","availableGroups","availableSecurityGroups","AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER","startPort","endPort","AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER","resolvedSecurityGroup","extractSecurityGroup","getSecurityGroupDetails","fourOhFour","editInboundRules","cloneSecurityGroup","AZURE_SECURITYGROUP_SECURITYGROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","normalizeSecurityGroup","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER","instanceTypeService","modalWizardService","wizard","getWizard","includePage","markClean","markComplete","excludePage","newVal","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER","markDirty","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE","directive","restrict","scope","bindToController","addDataDisk","newDataDisks","lun","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER","input","selectedRegion","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER","IMAGE_READER","$uibModalStack","imageReader","ModalWizard","markIncomplete","imageChanged","stackPattern","templatingEnabled","detailPattern","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER","healthCheckProtocols","displayName","changeHealthCheckProtocol","newProtocol","port","requestPath","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER","clearImage","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER","loadVnetSubnets","LBs","selectedLoadBalancer","attachedVnet","allVnets","attachedSubnet","useLoadBalancer","loadBalancerChanged","backingData","loadBalancerToFind","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER","vnetChanged","networkSettingsChanged","getVnetName","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER","selectedSecurityGroup","securityGroupChanged","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE","azureServerGroupConfigurationService","link","refreshing","AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE","getTagResult","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE","updateEnableInboundNAT","vm","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE","azureInstanceTypeService","dataDiskTypes","dataDiskCachingTypes","healthCheckTypes","terminationPolicies","configureInstanceTypes","dirty","c","locations","every","l","startsWith","configureStandardInstanceTypes","configureZones","filteredData","regionsSupportZones","availabilityZones","getRegionalSecurityGroups","newSecurityGroups","configureSecurityGroupOptions","currentOptions","newRegionalSecurityGroups","getLoadBalancerNames","uniq","sort","configureLoadBalancerOptions","current","newLoadBalancers","matched","intersection","removed","xor","configureLoadBalancers","filterlist","configureUpdateCommand","configureCommand","loadSecurityGroups","loadLoadBalancers","cmd","regionChanged","isInit","credentialsChanged","regionsForAccount","configureImages","regionalImages","packageImages","amis","ami","refreshLoadBalancers","skipCommandReconfiguration","listLoadBalancers","refreshInstanceTypes","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER","SERVER_GROUP_WRITER","serverGroupWriter","serverGroupCommand","cloneStage","task","execution","stages","newServerGroupName","transitionTo","loaded","initializeWizardState","processCommandUpdateResult","createResultProcessor","method","newValue","oldValue","zoneEnabled","templateSelection","basicSettings","imageSettings","networkSettings","applicationName","templateSelectionText","copied","notCopied","additionalCopyText","cloneServerGroup","toggleSuspendedProcess","process","suspendedProcesses","processIndex","processIsSuspended","templateSelected","AzureModalFooter","verified","handleVerification","onSubmit","onCancel","UserVerification","expectedValue","onValidChange","disabled","_AzureRollbackServerGroupModal","args","apply","ReactInjector","rollbackServerGroup","filterServerGroups","disabledServerGroups","disabledServerGroup","instanceCounts","total","localeCompare","rollbackContext","restoreServerGroupName","handleServerGroupChange","restoreServerGroupOption","newCommand","restoreServerGroup","targetSize","handleTaskReasonChange","taskReason","modalInstanceEmulation","rollbackType","rollbackServerGroupName","enableAndDisableOnly","isValidSG","disabledServerGroupOptions","onHide","TaskMonitorWrapper","monitor","role","Select","onChange","options","TaskReason","AzureRollbackServerGroupModal","AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER","$templateCache","azureServerGroupCommandBuilder","retrieveServerGroup","summary","toCheck","possibleServerGroup","extractServerGroupSummary","ServerGroupReader","getServerGroup","tag","keyVal","baseImage","launchConfig","compact","destroyServerGroup","stateParams","confirmationModalParams","ServerGroupWarningMessageService","addDestroyWarningMessage","disableServerGroup","addDisableWarningMessage","enableServerGroup","cluster","clusters","truncateCommitHash","buildInfo","commit","AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE","AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR","validate","errors","validateSpecialCharacters","warnings","run","azureApplicationNameValidator","ApplicationNameValidator","registerValidator","css","ref","insertAt","document","head","getElementsByTagName","style","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","AZURE_MODULE","registerProvider","logo","reader","transformer","detailsController","cloneServerGroupTemplateUrl","cloneServerGroupController","commandBuilder","configurationService","CreateLoadBalancerModal","createSecurityGroupTemplateUrl","createSecurityGroupController","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[51]}
1
+ {"version":3,"file":"index.js","sources":["../src/utility.ts","../src/help/azure.help.ts","../src/image/image.reader.js","../src/instance/azureInstanceType.service.js","../src/instance/details/AzureInstanceDetails.tsx","../src/azure.settings.ts","../src/loadBalancer/loadBalancer.transformer.js","../src/loadBalancer/configure/AzureLoadBalancerModal.tsx","../src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx","../src/loadBalancer/details/azureLoadBalancerDetails.tsx","../src/pipeline/stages/bake/azureBakeStage.tsx","../src/pipeline/stages/AzureAccountRegionClusterSelector.tsx","../src/pipeline/stages/destroyAsg/azureDestroyAsgStage.tsx","../src/pipeline/stages/disableAsg/azureDisableAsgStage.tsx","../src/pipeline/stages/enableAsg/azureEnableAsgStage.tsx","../src/securityGroup/securityGroup.write.service.ts","../src/securityGroup/configure/AzureSecurityGroupModal.tsx","../src/securityGroup/details/AzureSecurityGroupDetails.tsx","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/serverGroup.transformer.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/pages/common.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupAdvancedSettings.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupCapacityAndZones.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupHealthSettings.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupLoadBalancers.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupNetworkSettings.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupSecurityGroups.tsx","../src/serverGroup/configure/wizard/pages/ServerGroupTags.tsx","../src/serverGroup/configure/wizard/AzureCloneServerGroupModal.tsx","../src/common/AzureModalFooter.tsx","../src/serverGroup/details/rollback/RollbackServerGroupModal.tsx","../src/serverGroup/details/azureServerGroupDetails.tsx","../src/validation/applicationName.validator.js","../src/azure.module.ts","../src/logo/logo_azure.png","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["export interface ITagResult {\n isValid: boolean;\n error: TagError | null;\n errorMessage?: string;\n}\n\nexport enum TagError {\n TAG_NUMBER_EXCEED,\n TAG_KEY_LENGTH_EXCEED,\n TAG_VALUE_LENGTH_EXCEED,\n TAG_KEY_INVALID_CHARACTER,\n TAG_VALUE_INVALID_CHARACTER,\n TAG_OBJECT_UNDEFINED,\n}\n\nexport interface IAzureLoadBalancer {\n type: string;\n description: string;\n}\n\nexport const AzureLoadBalancerTypes: IAzureLoadBalancer[] = [\n {\n type: 'Azure Load Balancer',\n description: '',\n },\n {\n type: 'Azure Application Gateway',\n description: '',\n },\n];\n\nexport default class Utility {\n public static readonly TAG_LIMITATION: number = 8;\n public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512;\n public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256;\n public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\\\?/]/;\n\n public static checkTags(tagsObject: { [s: string]: string }): ITagResult {\n if (!tagsObject) {\n return {\n isValid: false,\n error: TagError.TAG_OBJECT_UNDEFINED,\n errorMessage: 'instanceTags is not defined',\n };\n }\n const length: number = Object.keys(tagsObject).length;\n if (!(length >= 0 && length <= Utility.TAG_LIMITATION)) {\n return {\n isValid: false,\n error: TagError.TAG_NUMBER_EXCEED,\n errorMessage: `Number of tags exceeds the limit: ${Utility.TAG_LIMITATION}`,\n };\n }\n\n for (const [k, v] of Object.entries(tagsObject)) {\n if (k.length > Utility.TAG_KEY_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_LENGTH_EXCEED,\n errorMessage: `Length of Tag key: ${k} exceeds the limit: ${Utility.TAG_KEY_LENGTH_LIMITATION}`,\n };\n }\n if (v.length > Utility.TAG_VALUE_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_LENGTH_EXCEED,\n errorMessage: `Length of Tag value: ${v} exceeds the limit: ${Utility.TAG_VALUE_LENGTH_LIMITATION}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(k)) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag key: ${k}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(v)) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag value: ${v}`,\n };\n }\n }\n return {\n isValid: true,\n error: null,\n };\n }\n\n public static getLoadBalancerType(typeString: string): IAzureLoadBalancer | null {\n typeString = typeString.toLowerCase().split('_').join(' ');\n return AzureLoadBalancerTypes.find((lb: IAzureLoadBalancer) => lb.type.toLowerCase() === typeString) || null;\n }\n}\n","import { HelpContentsRegistry } from '@spinnaker/core';\nimport Utility from '../utility';\n\nconst helpContents: { [key: string]: string } = {\n 'azure.securityGroup.ingress.description': 'Friendly description of the rule you want to enable (limit 80 chars.)',\n 'azure.securityGroup.ingress.priority':\n \"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.\",\n 'azure.securityGroup.ingress.source':\n \"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.sourcePortRange':\n 'The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.destination':\n \"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.destinationPortRange':\n 'The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.direction': 'Specifies whether the rule is for inbound or outbound traffic.',\n 'azure.securityGroup.ingress.actions':\n 'To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.',\n 'azure.securityGroup.ingress.destPortRanges':\n 'Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.',\n 'azure.securityGroup.ingress.sourceIPCIDRRanges':\n 'Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24',\n 'azure.serverGroup.imageName': '(Required) <b>Image</b> is the deployable Azure Machine Image.',\n 'azure.serverGroup.stack':\n '(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'azure.serverGroup.detail':\n '(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n 'azure.serverGroup.scriptLocation':\n 'The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2',\n 'azure.serverGroup.commandToExecute':\n 'Command(s) to execute custom scripts provided during provisioning of an instance.',\n 'azure.serverGroup.customData': 'Script or metadata to be injected into each instances.',\n 'azure.serverGroup.customTags': `Custom tags on Virtual Machine Scale Set. Allow ${Utility.TAG_LIMITATION} tags at most.`,\n 'azure.serverGroup.enableInboundNAT':\n 'An Azure load balancer of the basic sku will be created with adding inbound NAT port-forwarding rules to facilitate loggin on VM instances. There is no charge for creating an Azure load balancer of the basic sku. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.',\n 'azure.serverGroup.lun':\n 'Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.',\n 'azure.serverGroup.diskSizeGB':\n 'Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB',\n 'azure.serverGroup.managedDisk.storageAccountType':\n 'You can choose between Azure managed disks types to support your workload or scenario.',\n 'azure.serverGroup.caching':\n 'Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.',\n 'azure.serverGroup.userAssignedIdentities':\n 'Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview',\n 'azure.loadBalancer.dnsName':\n 'If there is no custom DNS label specified, a default DNS name will be created. The default value will be \"GeneratedText.cloudapp.net\" for Azure Application Gateway or \"GeneratedText.[region].cloudapp.azure.com\" for Azure Load Balancer.',\n 'azure.loadBalancer.probes.probeInterval':\n 'Probe interval in seconds. This value is the time interval between two consecutive probes.',\n 'azure.loadBalancer.probes.timeout':\n 'Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.',\n 'azure.loadBalancer.probes.unhealthyThreshold':\n 'Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.',\n 'azure.loadBalancer.loadBalancingRules.idleTimeout':\n 'Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.',\n 'azure.loadBalancer.loadBalancingRules.sessionPersistence':\n 'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. \"None\" specifies that successive requests from the same client may be handled by any virtual machine. \"Client IP\" specifies that successive requests from the same client IP address will be handled by the same virtual machine. \"Client IP and protocol\" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","import { REST } from '@spinnaker/core';\n\nexport class AzureImageReader {\n findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .then(\n function (results) {\n return results;\n },\n function () {\n return [];\n },\n );\n }\n\n getImage(amiName, region, credentials) {\n return REST('/images')\n .path(credentials, region, amiName)\n .query({ provider: 'azure' })\n .get()\n .then(\n function (results) {\n return results && results.length ? results[0] : null;\n },\n function () {\n return null;\n },\n );\n }\n}\n","import _ from 'lodash';\n\nexport class AzureInstanceTypeService {\n constructor(promiseService) {\n const B = {\n type: 'B-series',\n description:\n 'The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.',\n instanceTypes: [\n {\n name: 'Standard_B1ms',\n label: 'Standard_B1ms',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 4,\n },\n },\n {\n name: 'Standard_B1s',\n label: 'Standard_B1s',\n cpu: 1,\n memory: 1,\n storage: {\n type: 'SSD',\n count: 2,\n size: 2,\n },\n },\n {\n name: 'Standard_B2ms',\n label: 'Standard_B2ms',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_B2s',\n label: 'Standard_B2s',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 8,\n },\n },\n {\n name: 'Standard_B4ms',\n label: 'Standard_B4ms',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_B8ms',\n label: 'Standard_B8ms',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_B1ls',\n label: 'Standard_B1ls',\n cpu: 1,\n memory: 0.5,\n storage: {\n type: 'SSD',\n count: 2,\n size: 1,\n },\n },\n ],\n };\n\n const DSV3 = {\n type: 'Dsv3-series',\n description:\n 'The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2s_v3',\n label: 'Standard_D2s_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_D4s_v3',\n label: 'Standard_D4s_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_D8s_v3',\n label: 'Standard_D8s_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_D16s_v3',\n label: 'Standard_D16s_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 128,\n },\n },\n {\n name: 'Standard_D32s_v3',\n label: 'Standard_D32s_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 256,\n },\n },\n {\n name: 'Standard_D64s_v3',\n label: 'Standard_D64s_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 512,\n },\n },\n ],\n };\n\n const DV3 = {\n type: 'Dv3-series',\n description:\n 'The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2_v3',\n label: 'Standard_D2_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D4_v3',\n label: 'Standard_D4_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D8_v3',\n label: 'Standard_D8_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D16_v3',\n label: 'Standard_D16_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D32_v3',\n label: 'Standard_D32_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 800,\n },\n },\n {\n name: 'Standard_D64_v3',\n label: 'Standard_D64_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 1600,\n },\n },\n ],\n };\n\n const DSV2 = {\n type: 'DSv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DS1_v2',\n label: 'Standard_DS1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 7,\n },\n },\n {\n name: 'Standard_DS2_v2',\n label: 'Standard_DS2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 14,\n },\n },\n {\n name: 'Standard_DS3_v2',\n label: 'Standard_DS3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 28,\n },\n },\n {\n name: 'Standard_DS4_v2',\n label: 'Standard_DS4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 56,\n },\n },\n {\n name: 'Standard_DS5_v2',\n label: 'Standard_DS5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 112,\n },\n },\n {\n name: 'Standard_DS11_v2',\n label: 'Standard_DS11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 28,\n },\n },\n {\n name: 'Standard_DS12_v2',\n label: 'Standard_DS12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 56,\n },\n },\n {\n name: 'Standard_DS13_v2',\n label: 'Standard_DS13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 112,\n },\n },\n {\n name: 'Standard_DS14_v2',\n label: 'Standard_DS14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 224,\n },\n },\n {\n name: 'Standard_DS15_v2',\n label: 'Standard_DS15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const DV2 = {\n type: 'Dv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_D1_v2',\n label: 'Standard_D1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D2_v2',\n label: 'Standard_D2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D3_v2',\n label: 'Standard_D3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D4_v2',\n label: 'Standard_D4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D5_v2',\n label: 'Standard_D5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D11_v2',\n label: 'Standard_D11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D12_v2',\n label: 'Standard_D12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D13_v2',\n label: 'Standard_D13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D14_v2',\n label: 'Standard_D14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D15_v2',\n label: 'Standard_D15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const AV2 = {\n type: 'Av2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_A1_v2',\n label: 'Standard_A1_v2',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 10,\n },\n },\n {\n name: 'Standard_A2m_v2',\n label: 'Standard_A2m_v2',\n cpu: 2,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A2_v2',\n label: 'Standard_A2_v2',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A4m_v2',\n label: 'Standard_A4m_v2',\n cpu: 4,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A4_v2',\n label: 'Standard_A4_v2',\n cpu: 4,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A8m_v2',\n label: 'Standard_A8m_v2',\n cpu: 8,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n {\n name: 'Standard_A8_v2',\n label: 'Standard_A8_v2',\n cpu: 8,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n ],\n };\n\n const DC = {\n type: 'DC-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DC2s',\n label: 'Standard_DC2s',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 2,\n size: 100,\n },\n },\n {\n name: 'Standard_DC4s',\n label: 'Standard_DC4s',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 200,\n },\n },\n ],\n };\n\n const FSV2 = {\n type: 'Fsv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F2s_v2',\n label: 'Standard_F2s_v2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F4s_v2',\n label: 'Standard_F4s_v2',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F8s_v2',\n label: 'Standard_F8s_v2',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F16s_v2',\n label: 'Standard_F16s_v2',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F32s_v2',\n label: 'Standard_F32s_v2',\n cpu: 32,\n memory: 64,\n storage: { type: 'SSD', count: 32, size: 256 },\n },\n {\n name: 'Standard_F64s_v2',\n label: 'Standard_F64s_v2',\n cpu: 64,\n memory: 128,\n storage: { type: 'SSD', count: 32, size: 512 },\n },\n {\n name: 'Standard_F72s_v2',\n label: 'Standard_F72s_v2',\n cpu: 72,\n memory: 144,\n storage: { type: 'SSD', count: 32, size: 576 },\n },\n ],\n };\n\n const FS = {\n type: 'Fs-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1s',\n label: 'Standard_F1s',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 4 },\n },\n {\n name: 'Standard_F2s',\n label: 'Standard_F2s',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 8 },\n },\n {\n name: 'Standard_F4s',\n label: 'Standard_F4s',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 16 },\n },\n {\n name: 'Standard_F8s',\n label: 'Standard_F8s',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 32 },\n },\n {\n name: 'Standard_F16s',\n label: 'Standard_F16s',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 64 },\n },\n ],\n };\n\n const F = {\n type: 'F-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1',\n label: 'Standard_F1',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F2',\n label: 'Standard_F2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F4',\n label: 'Standard_F4',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F8',\n label: 'Standard_F8',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F16',\n label: 'Standard_F16',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 256 },\n },\n ],\n };\n\n const categories = [\n {\n type: 'general',\n label: 'General Purpose',\n description:\n 'Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.',\n families: [B, DSV3, DV3, DSV2, DV2, AV2, DC],\n icon: 'hdd',\n },\n {\n type: 'compute',\n label: 'Compute Optimized',\n description:\n 'High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.',\n families: [FSV2, FS, F],\n icon: 'hdd',\n },\n {\n type: 'custom',\n label: 'Custom Type',\n description: 'Select the instance type below.',\n families: [],\n icon: 'asterisk',\n },\n ];\n\n function calculateStorage(type) {\n if (!type || !type.storage) {\n return 0;\n }\n return type.storage.count * type.storage.size;\n }\n\n function buildStats(category) {\n const stats = {\n cpu: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n memory: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n storage: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n families: [],\n };\n\n if (category.families && category.families.length) {\n category.families.forEach(function (family) {\n stats.families.push(family.type);\n const cpuMin = _.minBy(family.instanceTypes, 'cpu').cpu || Number.MAX_VALUE;\n const cpuMax = _.maxBy(family.instanceTypes, 'cpu').cpu || -Number.MAX_VALUE;\n const memoryMin = _.minBy(family.instanceTypes, 'memory').memory || Number.MAX_VALUE;\n const memoryMax = _.maxBy(family.instanceTypes, 'memory').memory || -Number.MAX_VALUE;\n const storageMin = calculateStorage(_.minBy(family.instanceTypes, calculateStorage)) || Number.MAX_VALUE;\n const storageMax = calculateStorage(_.maxBy(family.instanceTypes, calculateStorage)) || -Number.MAX_VALUE;\n\n stats.cpu.min = Math.min(stats.cpu.min, cpuMin);\n stats.cpu.max = Math.max(stats.cpu.max, cpuMax);\n stats.memory.min = Math.min(stats.memory.min, memoryMin);\n stats.memory.max = Math.max(stats.memory.max, memoryMax);\n stats.storage.min = Math.min(stats.storage.min, storageMin);\n stats.storage.max = Math.max(stats.storage.max, storageMax);\n });\n }\n\n return stats;\n }\n\n function getCategories() {\n categories.map(function (category) {\n for (const family of category.families) {\n for (const inst of family.instanceTypes) {\n if (inst.costFactor == undefined) inst.costFactor = 0;\n }\n }\n category.stats = buildStats(category);\n });\n return promiseService.resolve(categories);\n }\n\n const getAllTypesByRegion = function getAllTypesByRegion() {\n return getCategories();\n };\n\n function getAvailableTypesForRegions(locationToInstanceTypesMap, selectedLocations) {\n // This function is only ever called with one location.\n const [location] = selectedLocations;\n return locationToInstanceTypesMap[location];\n }\n\n this.getCategories = getCategories;\n this.getAvailableTypesForRegions = getAvailableTypesForRegions;\n this.getAllTypesByRegion = getAllTypesByRegion;\n }\n}\n","import { UISref } from '@uirouter/react';\nimport React from 'react';\nimport { Dropdown, MenuItem } from 'react-bootstrap';\n\nimport type { Application, IInstanceDetailsProps, IRouterInjectedProps } from '@spinnaker/core';\nimport {\n AccountTag,\n CollapsibleSection,\n ConfirmationModalService,\n InstanceDetailsHeader,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n timestamp,\n withRouter,\n} from '@spinnaker/core';\n\ninterface IAzureInstanceParams {\n account?: string;\n instanceId: string;\n provider?: string;\n region?: string;\n}\n\ninterface IAzureInstanceDetailsProps extends Partial<IInstanceDetailsProps> {\n app: Application;\n initialInstance?: IAzureLoadedInstance;\n instance?: IAzureInstanceParams;\n $stateParams?: IInstanceDetailsProps['$stateParams'] & Partial<IAzureInstanceParams>;\n}\n\ninterface IAzureLoadInstanceDetailsProps {\n app: Application;\n instance: IAzureInstanceParams;\n}\n\ninterface IAzureInstanceLookupResult {\n account?: string;\n extraData?: { [key: string]: string };\n loadBalancers?: string[];\n region?: string;\n summary?: any;\n vpcId?: string;\n}\n\nexport interface IAzureLoadedInstance {\n [key: string]: any;\n account?: string;\n baseIpAddress?: string;\n health?: any[];\n healthMetrics?: any[];\n instanceId?: string;\n instanceIdNotFound?: string;\n loadBalancers?: string[];\n region?: string;\n serverGroup?: string;\n vpcId?: string;\n}\n\nfunction findInServerGroups(app: Application, instanceId: string): IAzureInstanceLookupResult | undefined {\n const serverGroups = app.serverGroups?.data || [];\n for (const serverGroup of serverGroups) {\n const summary = serverGroup.instances?.find((possibleInstance: any) => possibleInstance.id === instanceId);\n if (summary) {\n return {\n account: serverGroup.account,\n extraData: { serverGroup: serverGroup.name, vpcId: serverGroup.vpcId },\n loadBalancers: serverGroup.loadBalancers,\n region: serverGroup.region,\n summary,\n vpcId: serverGroup.vpcId,\n };\n }\n }\n return undefined;\n}\n\nfunction findInLoadBalancerInstances(app: Application, instanceId: string): IAzureInstanceLookupResult | undefined {\n const loadBalancers = app.loadBalancers?.data || [];\n for (const loadBalancer of loadBalancers) {\n const summary = loadBalancer.instances?.find((possibleInstance: any) => possibleInstance.id === instanceId);\n if (summary) {\n return {\n account: loadBalancer.account,\n loadBalancers: [loadBalancer.name],\n region: loadBalancer.region,\n summary,\n vpcId: loadBalancer.vpcId,\n };\n }\n }\n return undefined;\n}\n\nfunction findInLoadBalancerServerGroups(app: Application, instanceId: string): IAzureInstanceLookupResult | undefined {\n const loadBalancers = app.loadBalancers?.data || [];\n for (const loadBalancer of loadBalancers) {\n const serverGroups = (loadBalancer.serverGroups || []).filter((serverGroup: any) => !serverGroup.isDisabled);\n for (const serverGroup of serverGroups) {\n const summary = serverGroup.instances?.find((possibleInstance: any) => possibleInstance.id === instanceId);\n if (summary) {\n return {\n account: loadBalancer.account,\n loadBalancers: [loadBalancer.name],\n region: loadBalancer.region,\n summary,\n vpcId: loadBalancer.vpcId,\n };\n }\n }\n }\n return undefined;\n}\n\nfunction findInDisabledLoadBalancerServerGroups(\n app: Application,\n instanceId: string,\n): IAzureInstanceLookupResult | undefined {\n const loadBalancers = app.loadBalancers?.data || [];\n for (const loadBalancer of loadBalancers) {\n const disabledServerGroups = (loadBalancer.serverGroups || []).filter((serverGroup: any) => serverGroup.isDisabled);\n for (const serverGroup of disabledServerGroups) {\n const summary = serverGroup.instances?.find((possibleInstance: any) => possibleInstance.id === instanceId);\n if (summary) {\n return {\n account: loadBalancer.account,\n loadBalancers: [loadBalancer.name],\n region: loadBalancer.region,\n summary,\n vpcId: loadBalancer.vpcId,\n };\n }\n }\n }\n return undefined;\n}\n\nfunction findAzureInstanceSummary(\n app: Application,\n instance: IAzureInstanceParams,\n): IAzureInstanceLookupResult | undefined {\n if (!app.serverGroups) {\n return { account: instance.account, loadBalancers: [], region: instance.region, summary: {} };\n }\n\n return (\n findInServerGroups(app, instance.instanceId) ||\n findInLoadBalancerInstances(app, instance.instanceId) ||\n findInLoadBalancerServerGroups(app, instance.instanceId) ||\n findInDisabledLoadBalancerServerGroups(app, instance.instanceId)\n );\n}\n\nfunction extractHealthMetrics(summary: any, details: any, standalone: boolean): any[] {\n const summaryHealth = standalone ? details.health : summary.health;\n const displayableMetrics = (summaryHealth || []).filter(\n (metric: any) => metric.type !== 'Azure' || metric.state !== 'Unknown',\n );\n const latestHealth = details.health || [];\n\n return displayableMetrics.map((metric: any) => {\n const latestMatch = latestHealth.find((latest: any) => latest.type === metric.type);\n return latestMatch ? { ...latestMatch, ...metric } : metric;\n });\n}\n\nexport async function loadAzureInstanceDetails({\n app,\n instance,\n}: IAzureLoadInstanceDetailsProps): Promise<IAzureLoadedInstance> {\n const lookup = findAzureInstanceSummary(app, instance);\n\n if (!lookup?.summary) {\n return { instanceIdNotFound: instance.instanceId };\n }\n\n const { account, region } = lookup;\n if (!account || !region) {\n return { instanceIdNotFound: instance.instanceId };\n }\n\n RecentHistoryService.addExtraDataToLatest('instances', {\n ...lookup.extraData,\n account,\n region,\n });\n\n const details = (await InstanceReader.getInstanceDetails(account, region, instance.instanceId)) as any;\n const healthMetrics = extractHealthMetrics(lookup.summary, details, app.isStandalone);\n const discoveryMetric = healthMetrics.find((metric: any) => metric.type === 'Discovery');\n const loadedInstance = {\n ...lookup.summary,\n ...details,\n account,\n baseIpAddress: details.publicDnsName || details.privateIpAddress,\n healthMetrics,\n instanceId: details.instanceId || lookup.summary.instanceId || lookup.summary.id || instance.instanceId,\n loadBalancers: lookup.loadBalancers,\n region,\n vpcId: lookup.vpcId,\n } as IAzureLoadedInstance;\n\n if (lookup.extraData?.serverGroup) {\n loadedInstance.serverGroup = lookup.extraData.serverGroup;\n }\n\n if (discoveryMetric?.vipAddress) {\n loadedInstance.vipAddress = discoveryMetric.vipAddress.includes(',')\n ? discoveryMetric.vipAddress.split(',')\n : [discoveryMetric.vipAddress];\n }\n\n return loadedInstance;\n}\n\nexport class AzureInstanceDetailsComponent extends React.Component<\n IAzureInstanceDetailsProps & IRouterInjectedProps,\n { instance?: IAzureLoadedInstance; loading: boolean }\n> {\n public state = { instance: this.props.initialInstance, loading: !this.props.initialInstance };\n\n private activeRequestId = 0;\n private isUnmounted = false;\n private unsubscribeFromRefresh: () => void;\n\n public componentDidMount(): void {\n if (this.props.initialInstance) {\n return;\n }\n\n const { app } = this.props;\n const retrieveWhenReady =\n app.isStandalone || !app.serverGroups\n ? Promise.resolve()\n : Promise.all([app.serverGroups.ready(), app.loadBalancers.ready()]);\n retrieveWhenReady.then(() => {\n if (this.isUnmounted) {\n return;\n }\n this.retrieveInstance();\n if (!app.isStandalone && app.serverGroups?.onRefresh) {\n this.unsubscribeFromRefresh = app.serverGroups.onRefresh(this.retrieveInstance);\n }\n });\n }\n\n public componentDidUpdate(prevProps: IAzureInstanceDetailsProps): void {\n const previousParams = this.getInstanceParams(prevProps);\n const currentParams = this.getInstanceParams();\n if (\n previousParams.account !== currentParams.account ||\n previousParams.instanceId !== currentParams.instanceId ||\n previousParams.region !== currentParams.region\n ) {\n this.retrieveInstance(true);\n }\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n if (this.unsubscribeFromRefresh) {\n this.unsubscribeFromRefresh();\n }\n }\n\n private getInstanceParams(\n props: IAzureInstanceDetailsProps & Partial<IRouterInjectedProps> = this.props,\n ): IAzureInstanceParams {\n const params = props.instance || props.$stateParams || props.stateParams;\n return {\n account: params?.account,\n instanceId: params?.instanceId,\n provider: params?.provider,\n region: params?.region,\n };\n }\n\n private retrieveInstance = (clearInstance = false): void => {\n const requestId = ++this.activeRequestId;\n const instanceParams = this.getInstanceParams();\n this.setState(clearInstance ? { instance: undefined, loading: true } : { loading: true });\n loadAzureInstanceDetails({ app: this.props.app, instance: instanceParams }).then(\n (instance) => {\n if (!this.isUnmounted && requestId === this.activeRequestId) {\n this.setState({ instance, loading: false });\n }\n },\n () => {\n if (!this.isUnmounted && requestId === this.activeRequestId) {\n this.setState({ loading: false });\n this.props.stateService.go('^');\n }\n },\n );\n };\n\n public render(): JSX.Element {\n const { app } = this.props;\n const { instance, loading } = this.state;\n const instanceId = instance?.instanceId || instance?.instanceIdNotFound || this.getInstanceParams().instanceId;\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <InstanceDetailsHeader\n healthState={instance?.healthState}\n instanceId={instanceId}\n loading={loading}\n standalone={app.isStandalone}\n />\n {!loading && instance && !instance.instanceIdNotFound && (\n <div className=\"actions\">\n <AzureInstanceActionsComponent\n app={app}\n instance={instance}\n router={this.props.router}\n stateParams={this.props.stateParams}\n stateService={this.props.stateService}\n />\n </div>\n )}\n </div>\n {!loading && instance && !instance.instanceIdNotFound && (\n <div className=\"content\">\n <AzureInstanceInformationSection instance={instance} />\n </div>\n )}\n {!loading && instance?.instanceIdNotFound && (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Instance not found.</h3>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nfunction hasHealthState(instance: IAzureLoadedInstance, healthProviderType: string, state: string): boolean {\n return (instance.health || []).some((health: any) => health.type === healthProviderType && health.state === state);\n}\n\nfunction canRegisterWithLoadBalancer(instance: IAzureLoadedInstance): boolean {\n if (!instance.loadBalancers?.length) {\n return false;\n }\n return (\n hasHealthState(instance, 'LoadBalancer', 'OutOfService') ||\n !(instance.health || []).some((health: any) => health.type === 'LoadBalancer')\n );\n}\n\nfunction canRegisterWithDiscovery(instance: IAzureLoadedInstance): boolean {\n return hasHealthState(instance, 'Discovery', 'OutOfService');\n}\n\nexport function AzureInstanceActionsComponent({\n app,\n instance,\n stateService,\n}: {\n app: Application;\n instance: IAzureLoadedInstance;\n} & IRouterInjectedProps): JSX.Element {\n const loadBalancerNames = (instance.loadBalancers || []).join(' and ');\n const closeIfCurrentInstance = () => {\n if (stateService.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n stateService.go('^');\n }\n };\n const confirm = (\n header: string,\n buttonText: string,\n title: string,\n submitMethod: () => PromiseLike<any>,\n closeOnComplete = false,\n ) => {\n ConfirmationModalService.confirm({\n header,\n buttonText,\n account: instance.account,\n taskMonitorConfig: {\n application: app,\n title,\n onTaskComplete: closeOnComplete ? closeIfCurrentInstance : undefined,\n },\n submitMethod,\n });\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"azure-instance-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Instance Actions</Dropdown.Toggle>\n <Dropdown.Menu>\n <MenuItem\n onClick={() =>\n confirm(\n `Really terminate ${instance.instanceId}?`,\n `Terminate ${instance.instanceId}`,\n `Terminating ${instance.instanceId}`,\n () => InstanceWriter.terminateInstance(instance as any, app),\n true,\n )\n }\n >\n Terminate\n </MenuItem>\n {instance.serverGroup && (\n <MenuItem\n onClick={() =>\n confirm(\n `Really terminate ${instance.instanceId} and shrink ${instance.serverGroup}?`,\n `Terminate ${instance.instanceId} and shrink ${instance.serverGroup}`,\n `Terminating ${instance.instanceId} and shrinking server group`,\n () => InstanceWriter.terminateInstanceAndShrinkServerGroup(instance as any, app),\n true,\n )\n }\n >\n Terminate and Shrink Server Group\n </MenuItem>\n )}\n <MenuItem\n onClick={() =>\n confirm(\n `Really reboot ${instance.instanceId}?`,\n `Reboot ${instance.instanceId}`,\n `Rebooting ${instance.instanceId}`,\n () => InstanceWriter.rebootInstance(instance as any, app),\n )\n }\n >\n Reboot\n </MenuItem>\n {canRegisterWithLoadBalancer(instance) && (\n <MenuItem\n onClick={() =>\n confirm(\n `Really register ${instance.instanceId} with ${loadBalancerNames}?`,\n `Register ${instance.instanceId}`,\n `Registering ${instance.instanceId} with ${loadBalancerNames}`,\n () => InstanceWriter.registerInstanceWithLoadBalancer(instance as any, app),\n )\n }\n >\n Register with Load Balancer\n </MenuItem>\n )}\n {(instance.health || []).some((health: any) => health.type === 'LoadBalancer') && (\n <MenuItem\n onClick={() =>\n confirm(\n `Really deregister ${instance.instanceId} from ${loadBalancerNames}?`,\n `Deregister ${instance.instanceId}`,\n `Deregistering ${instance.instanceId} from ${loadBalancerNames}`,\n () => InstanceWriter.deregisterInstanceFromLoadBalancer(instance as any, app),\n )\n }\n >\n Deregister from Load Balancer\n </MenuItem>\n )}\n {canRegisterWithDiscovery(instance) && (\n <MenuItem\n onClick={() =>\n confirm(\n `Really enable ${instance.instanceId} in discovery?`,\n `Enable ${instance.instanceId}`,\n `Enabling ${instance.instanceId} in discovery`,\n () => InstanceWriter.enableInstanceInDiscovery(instance as any, app),\n )\n }\n >\n Enable in Discovery\n </MenuItem>\n )}\n {(instance.health || []).some((health: any) => health.type === 'Discovery') && (\n <MenuItem\n onClick={() =>\n confirm(\n `Really disable ${instance.instanceId} in discovery?`,\n `Disable ${instance.instanceId}`,\n `Disabling ${instance.instanceId} in discovery`,\n () => InstanceWriter.disableInstanceInDiscovery(instance as any, app),\n )\n }\n >\n Disable in Discovery\n </MenuItem>\n )}\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nexport const AzureInstanceActions = withRouter(AzureInstanceActionsComponent);\nexport const AzureInstanceDetails = withRouter(AzureInstanceDetailsComponent);\n\nexport function AzureInstanceInformationSection({ instance }: { instance: IAzureLoadedInstance }): JSX.Element {\n return (\n <CollapsibleSection heading=\"Instance Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Launched</dt>\n <dd>{instance.launchTime ? timestamp(instance.launchTime) : '(Unknown)'}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={instance.account} /> {instance.region || '(Unknown)'}\n </dd>\n <dt>Type</dt>\n <dd>{instance.instanceType || '(Unknown)'}</dd>\n {instance.serverGroup && <dt>Server Group</dt>}\n {instance.serverGroup && (\n <dd>\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: instance.region,\n accountId: instance.account,\n serverGroup: instance.serverGroup,\n provider: instance.provider,\n }}\n >\n <a>{instance.serverGroup}</a>\n </UISref>\n </dd>\n )}\n </dl>\n </CollapsibleSection>\n );\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IAzureProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const AzureProviderSettings: IAzureProviderSettings = (SETTINGS.providers.azure as IAzureProviderSettings) || {\n defaults: {},\n};\nif (AzureProviderSettings) {\n AzureProviderSettings.resetToOriginal = SETTINGS.resetProvider('azure');\n}\n","import _ from 'lodash';\n\nimport { AzureProviderSettings } from '../azure.settings';\n\nexport class AzureLoadBalancerTransformer {\n constructor(promiseService) {\n this.promiseService = promiseService;\n }\n\n normalizeLoadBalancer(loadBalancer) {\n loadBalancer.serverGroups.forEach(function (serverGroup) {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {\n return { id: instanceId };\n });\n serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);\n } else {\n serverGroup.detachedInstances = [];\n }\n });\n const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();\n return this.promiseService.resolve(loadBalancer);\n }\n\n convertLoadBalancerForEditing(loadBalancer) {\n const toEdit = {\n region: loadBalancer.region,\n credentials: loadBalancer.account,\n name: loadBalancer.name,\n stack: loadBalancer.stack,\n detail: loadBalancer.detail,\n vnet: loadBalancer.vnet,\n subnet: loadBalancer.subnet,\n probes: [],\n loadBalancingRules: [],\n };\n\n if (loadBalancer.elb) {\n const elb = loadBalancer.elb;\n\n toEdit.securityGroups = elb.securityGroups;\n toEdit.vnet = elb.vnet;\n\n if (elb.loadBalancingRules) {\n toEdit.loadBalancingRules = elb.loadBalancingRules;\n }\n\n toEdit.probes = elb.probes;\n if (elb.dnsName && elb.dnsName !== 'dns-not-found') {\n toEdit.dnsName = elb.dnsName.split('.')[0];\n }\n }\n return toEdit;\n }\n\n constructNewLoadBalancerTemplate(application) {\n const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;\n const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;\n return {\n stack: '',\n detail: 'frontend',\n credentials: defaultCredentials,\n region: defaultRegion,\n cloudProvider: 'azure',\n vnet: null,\n subnet: null,\n probes: [\n {\n probeName: '',\n probeProtocol: 'HTTP',\n probePort: '80',\n probePath: '/',\n probeInterval: 30,\n unhealthyThreshold: 8,\n timeout: 120,\n },\n ],\n securityGroups: [],\n loadBalancingRules: [\n {\n ruleName: '',\n protocol: 'HTTP',\n externalPort: 80,\n backendPort: 80,\n probeName: '',\n persistence: 'None',\n idleTimeout: 4,\n },\n ],\n sku: 'Standard_v2',\n };\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport type { Application, IModalComponentProps, IRouterInjectedProps } from '@spinnaker/core';\nimport {\n AccountService,\n LoadBalancerWriter,\n ModalClose,\n NameUtils,\n nativePromiseService,\n NetworkReader,\n noop,\n ReactModal,\n SubmitButton,\n TaskMonitor,\n TaskMonitorWrapper,\n withRouter,\n} from '@spinnaker/core';\n\nimport { AzureLoadBalancerTransformer } from '../loadBalancer.transformer';\nimport type { IAzureLoadBalancer } from '../../utility';\nimport { AzureLoadBalancerTypes } from '../../utility';\n\ninterface IAzureLoadBalancerModalProps extends IModalComponentProps {\n app?: Application;\n application?: Application;\n forPipelineConfig?: boolean;\n isNew?: boolean;\n loadBalancer?: any;\n loadBalancerType?: IAzureLoadBalancer | string;\n}\n\ninterface IAzureVnet {\n account: string;\n name: string;\n region: string;\n resourceGroup?: string;\n subnets?: IAzureSubnet[];\n}\n\ninterface IAzureSubnet {\n devices?: Array<{ type: string }>;\n name: string;\n}\n\ninterface IAzureLoadBalancerModalState {\n accounts: any[];\n accountsLoaded: boolean;\n existingLoadBalancerNames: string[];\n loadBalancer: any;\n regions: any[];\n selectedSubnets: IAzureSubnet[];\n selectedVnets: IAzureVnet[];\n taskMonitor: TaskMonitor;\n}\n\ninterface IValidationOptions {\n existingLoadBalancerNames?: string[];\n isNew?: boolean;\n}\n\nexport const validSkus = ['Standard_v2', 'Standard_Small'];\n\nfunction normalizeLoadBalancerTypeName(loadBalancerType: any): string {\n const normalized = String(loadBalancerType || '')\n .toLowerCase()\n .split('_')\n .join(' ');\n if (normalized === 'application gateway') {\n return 'azure application gateway';\n }\n if (normalized === 'load balancer') {\n return 'azure load balancer';\n }\n return normalized;\n}\n\nexport function getAzureLoadBalancerTypeChoice(\n loadBalancer?: any,\n loadBalancerType?: IAzureLoadBalancer | string,\n): IAzureLoadBalancer {\n const explicitType = typeof loadBalancerType === 'string' ? loadBalancerType : loadBalancerType?.type;\n const normalizedType = normalizeLoadBalancerTypeName(\n explicitType || loadBalancer?.loadBalancerType || loadBalancer?.elb?.loadBalancerType,\n );\n return (\n AzureLoadBalancerTypes.find((candidate) => candidate.type.toLowerCase() === normalizedType) ||\n AzureLoadBalancerTypes[0]\n );\n}\n\nexport function formatInputValue(value: any): any {\n return value ?? '';\n}\n\nexport function getAzureVnetSelectValue(vnet: IAzureVnet): string {\n return `${vnet.name}|${vnet.resourceGroup || ''}`;\n}\n\nexport function getAzureVnetSelectLabel(vnet: IAzureVnet): string {\n return vnet.resourceGroup ? `${vnet.name} (${vnet.resourceGroup})` : vnet.name;\n}\n\nexport function findAzureVnetBySelectValue(vnets: IAzureVnet[], value: string): IAzureVnet | null {\n return vnets.find((vnet) => getAzureVnetSelectValue(vnet) === value) || null;\n}\n\nexport function liftAzureLoadBalancerSessionPersistence(\n loadBalancer: any,\n loadBalancerType: string,\n sourceLoadBalancer = loadBalancer,\n): any {\n if (!isAzureLoadBalancerType(loadBalancerType)) {\n return loadBalancer;\n }\n\n const sourceRule =\n sourceLoadBalancer.elb?.loadBalancingRules?.[0] || sourceLoadBalancer.loadBalancingRules?.[0] || {};\n const convertedRule = loadBalancer.loadBalancingRules?.[0] || {};\n\n return {\n ...loadBalancer,\n sessionPersistence:\n loadBalancer.sessionPersistence ||\n sourceLoadBalancer.elb?.sessionPersistence ||\n sourceRule.persistence ||\n sourceRule.sessionPersistence ||\n convertedRule.persistence ||\n convertedRule.sessionPersistence,\n };\n}\n\nexport function isAzureLoadBalancerType(loadBalancerType: string): boolean {\n return loadBalancerType === 'Azure Load Balancer';\n}\n\nexport function shouldRenderCreateFields(isNew: boolean): boolean {\n return isNew;\n}\n\nexport function shouldRenderNetworkFields(isNew: boolean, loadBalancerType: string): boolean {\n return isNew && !isAzureLoadBalancerType(loadBalancerType);\n}\n\nexport function shouldRenderSkuField(isNew: boolean, loadBalancerType: string): boolean {\n return isNew && !isAzureLoadBalancerType(loadBalancerType);\n}\n\nexport function listenerProtocolOptions(loadBalancerType: string): string[] {\n return isAzureLoadBalancerType(loadBalancerType) ? ['TCP', 'UDP'] : ['HTTP'];\n}\n\nexport function probeProtocolOptions(loadBalancerType: string): string[] {\n return isAzureLoadBalancerType(loadBalancerType) ? ['TCP', 'HTTP'] : ['HTTP'];\n}\n\nexport function parseOptionalNumber(value: any): number {\n if (value === '' || value === null || value === undefined) {\n return undefined;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function applyAzureLoadBalancerTypeDefaults(loadBalancer: any, loadBalancerType: string): any {\n const listenerOptions = listenerProtocolOptions(loadBalancerType);\n const probeOptions = probeProtocolOptions(loadBalancerType);\n return {\n ...loadBalancer,\n sessionPersistence: isAzureLoadBalancerType(loadBalancerType)\n ? loadBalancer.sessionPersistence || 'None'\n : loadBalancer.sessionPersistence,\n probes: (loadBalancer.probes || [{}]).map((probe: any) => ({\n ...probe,\n probeProtocol: probeOptions.includes(probe.probeProtocol) ? probe.probeProtocol : probeOptions[0],\n })),\n loadBalancingRules: (loadBalancer.loadBalancingRules || [{}]).map((rule: any) => ({\n ...rule,\n protocol: listenerOptions.includes(rule.protocol) ? rule.protocol : listenerOptions[0],\n })),\n };\n}\n\nfunction isPresent(value: any): boolean {\n return value !== '' && value !== null && value !== undefined;\n}\n\nfunction isNegativeNumber(value: any): boolean {\n if (!isPresent(value)) {\n return false;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed < 0;\n}\n\nfunction validateNonNegative(errors: string[], value: any, message: string): void {\n if (isNegativeNumber(value)) {\n errors.push(message);\n }\n}\n\nfunction isValidStack(value: string): boolean {\n return /^[a-zA-Z0-9]+$/.test(value || '');\n}\n\nfunction isValidDetail(value: string): boolean {\n return /^[a-zA-Z0-9-]+$/.test(value || '');\n}\n\nexport function validateAzureLoadBalancerForSubmit(\n loadBalancer: any,\n loadBalancerType: string,\n options: IValidationOptions = {},\n): string[] {\n const errors: string[] = [];\n const probe = loadBalancer.probes?.[0] || {};\n const rules = loadBalancer.loadBalancingRules || [];\n\n if (!loadBalancer.name) {\n errors.push('Name is required.');\n } else if (loadBalancer.name.length > 32) {\n errors.push('Name must be 32 characters or fewer.');\n }\n\n if (options.isNew) {\n if (!loadBalancer.credentials) {\n errors.push('Account is required.');\n }\n if (!loadBalancer.region) {\n errors.push('Region is required.');\n }\n if (!loadBalancer.stack) {\n errors.push('Stack is required.');\n } else if (!isValidStack(loadBalancer.stack)) {\n errors.push('Stack may only contain letters and numbers.');\n }\n if (!loadBalancer.detail) {\n errors.push('Detail is required.');\n } else if (!isValidDetail(loadBalancer.detail)) {\n errors.push('Detail may only contain letters, numbers, and hyphens.');\n }\n if (\n (options.existingLoadBalancerNames || []).some((name) => name.toLowerCase() === loadBalancer.name.toLowerCase())\n ) {\n errors.push(`A load balancer named ${loadBalancer.name} already exists in this account and region.`);\n }\n if (!isAzureLoadBalancerType(loadBalancerType)) {\n if (!loadBalancer.selectedVnet && !loadBalancer.vnet) {\n errors.push('VNet is required.');\n }\n if (!loadBalancer.selectedSubnet && !loadBalancer.subnet) {\n errors.push('Subnet is required.');\n }\n }\n }\n\n if (!rules.length) {\n errors.push('At least one listener is required.');\n }\n\n rules.forEach((rule: any, index: number) => {\n if (!listenerProtocolOptions(loadBalancerType).includes(rule.protocol)) {\n errors.push(`Listener ${index + 1} protocol is invalid.`);\n }\n if (!isPresent(rule.externalPort)) {\n errors.push(`Listener ${index + 1} external port is required.`);\n } else {\n validateNonNegative(errors, rule.externalPort, `Listener ${index + 1} external port must be 0 or greater.`);\n }\n if (!isPresent(rule.backendPort)) {\n errors.push(`Listener ${index + 1} backend port is required.`);\n } else {\n validateNonNegative(errors, rule.backendPort, `Listener ${index + 1} backend port must be 0 or greater.`);\n }\n validateNonNegative(errors, rule.idleTimeout, `Listener ${index + 1} idle timeout must be 0 or greater.`);\n });\n\n if (!probeProtocolOptions(loadBalancerType).includes(probe.probeProtocol)) {\n errors.push('Health check protocol is invalid.');\n }\n if (!isPresent(probe.probePort)) {\n errors.push('Health check port is required.');\n } else {\n validateNonNegative(errors, probe.probePort, 'Health check port must be 0 or greater.');\n }\n if (probe.probeProtocol?.indexOf('HTTP') === 0 && !probe.probePath) {\n errors.push('Health check path is required.');\n }\n validateNonNegative(errors, probe.probeInterval, 'Health check interval must be 0 or greater.');\n validateNonNegative(errors, probe.unhealthyThreshold, 'Unhealthy threshold must be 0 or greater.');\n validateNonNegative(errors, probe.timeout, 'Health check timeout must be 0 or greater.');\n\n return errors;\n}\n\nexport function normalizeAzureLoadBalancerForSubmit(loadBalancer: any, loadBalancerType: string): any {\n const normalized = {\n ...loadBalancer,\n probes: (loadBalancer.probes || []).map((probe: any) => ({ ...probe })),\n loadBalancingRules: (loadBalancer.loadBalancingRules || []).map((rule: any) => ({ ...rule })),\n };\n\n if (!isAzureLoadBalancerType(loadBalancerType) && normalized.selectedVnet) {\n normalized.vnet = normalized.selectedVnet.name;\n normalized.vnetResourceGroup = normalized.selectedVnet.resourceGroup;\n }\n\n if (!isAzureLoadBalancerType(loadBalancerType) && normalized.selectedSubnet) {\n normalized.subnet = normalized.selectedSubnet.name;\n }\n\n const name = normalized.clusterName || normalized.name;\n const probeName = `${name}-probe`;\n const ruleNameBase = `${name}-rule`;\n normalized.type = 'upsertLoadBalancer';\n normalized.loadBalancerType = loadBalancerType;\n\n if (!normalized.vnet && !normalized.subnetType) {\n normalized.securityGroups = null;\n }\n\n if (normalized.probes[0]) {\n normalized.probes[0].probeName = probeName;\n if (normalized.probes[0].probeProtocol === 'TCP') {\n normalized.probes[0].probePath = undefined;\n }\n }\n\n normalized.loadBalancingRules.forEach((rule: any, index: number) => {\n delete rule.persistence;\n delete rule.sessionPersistence;\n rule.ruleName = `${ruleNameBase}${index}`;\n rule.probeName = probeName;\n });\n\n return normalized;\n}\n\nexport class AzureLoadBalancerModalComponent extends React.Component<\n IAzureLoadBalancerModalProps & IRouterInjectedProps,\n IAzureLoadBalancerModalState\n> {\n public static defaultProps: Partial<IAzureLoadBalancerModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n isNew: true,\n };\n\n public static show(props: IAzureLoadBalancerModalProps): Promise<any> {\n return ReactModal.show(AzureLoadBalancerModal, props, { dialogClassName: 'modal-lg' });\n }\n\n private mounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n private transformer = new AzureLoadBalancerTransformer(nativePromiseService);\n\n constructor(props: IAzureLoadBalancerModalProps & IRouterInjectedProps) {\n super(props);\n const application = this.getApplication();\n const taskMonitor = new TaskMonitor({\n application,\n title: `${props.isNew ? 'Creating' : 'Updating'} your load balancer`,\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n });\n\n this.state = {\n accounts: [],\n accountsLoaded: !props.isNew,\n existingLoadBalancerNames: [],\n loadBalancer: this.initializeLoadBalancer(),\n regions: [],\n selectedSubnets: [],\n selectedVnets: [],\n taskMonitor,\n };\n }\n\n public componentDidMount(): void {\n this.mounted = true;\n if (this.props.isNew) {\n this.updateName();\n this.initializeCreateMode();\n }\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n }\n\n private getApplication(): Application {\n return (this.props.app || this.props.application) as Application;\n }\n\n private getLoadBalancerType(): string {\n return getAzureLoadBalancerTypeChoice(this.props.loadBalancer, this.props.loadBalancerType).type;\n }\n\n private initializeLoadBalancer(): any {\n if (this.props.loadBalancer) {\n const sourceLoadBalancer = this.props.loadBalancer;\n let loadBalancer =\n this.props.forPipelineConfig && !sourceLoadBalancer.elb\n ? { ...sourceLoadBalancer }\n : this.transformer.convertLoadBalancerForEditing(sourceLoadBalancer);\n loadBalancer = liftAzureLoadBalancerSessionPersistence(\n loadBalancer,\n this.getLoadBalancerType(),\n sourceLoadBalancer,\n );\n if (this.props.isNew) {\n const nameParts = NameUtils.parseLoadBalancerName(loadBalancer.name);\n loadBalancer.stack = nameParts.stack;\n loadBalancer.detail = nameParts.freeFormDetails;\n delete loadBalancer.name;\n }\n return applyAzureLoadBalancerTypeDefaults(loadBalancer, this.getLoadBalancerType());\n }\n\n return applyAzureLoadBalancerTypeDefaults(\n this.transformer.constructNewLoadBalancerTemplate(this.getApplication()),\n this.getLoadBalancerType(),\n );\n }\n\n private initializeCreateMode(): void {\n AccountService.listAccounts('azure').then((accounts) => {\n if (!this.mounted) {\n return;\n }\n this.setState({ accounts, accountsLoaded: true }, this.accountUpdated);\n });\n }\n\n private onTaskComplete = (): void => {\n const application = this.getApplication();\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n this.applicationRefreshUnsubscribe = application.loadBalancers.onNextRefresh(this.onApplicationRefresh);\n application.loadBalancers.refresh();\n };\n\n private onApplicationRefresh = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n if (!this.mounted) {\n return;\n }\n\n const { loadBalancer } = this.state;\n this.props.closeModal();\n const newStateParams = {\n name: loadBalancer.name,\n accountId: loadBalancer.credentials,\n region: loadBalancer.region,\n provider: 'azure',\n };\n\n if (!this.props.stateService.includes('**.loadBalancerDetails')) {\n this.props.stateService.go('.loadBalancerDetails', newStateParams);\n } else {\n this.props.stateService.go('^.loadBalancerDetails', newStateParams);\n }\n };\n\n private getName(): string {\n const { loadBalancer } = this.state;\n return [this.getApplication().name, loadBalancer.stack || '', loadBalancer.detail || '']\n .join('-')\n .replace(/-+$/, '');\n }\n\n private updateName = (): void => {\n if (!this.props.isNew) {\n return;\n }\n this.updateLoadBalancer({ name: this.getName() });\n };\n\n private accountUpdated = (): void => {\n AccountService.getRegionsForAccount(this.state.loadBalancer.credentials).then((regions) => {\n if (!this.mounted) {\n return;\n }\n this.setState({ regions }, this.regionUpdated);\n });\n };\n\n private regionUpdated = (): void => {\n this.updateName();\n this.updateLoadBalancerNames();\n this.vnetUpdated();\n };\n\n private updateLoadBalancerNames = (): void => {\n const loadBalancers = this.getApplication().getDataSource?.('loadBalancers');\n if (!loadBalancers || !this.props.isNew) {\n return;\n }\n\n const { credentials, region } = this.state.loadBalancer;\n loadBalancers.refresh(true).then(() => {\n if (!this.mounted) {\n return;\n }\n const existingLoadBalancerNames = (loadBalancers.data || [])\n .filter((loadBalancer: any) => loadBalancer.account === credentials && loadBalancer.region === region)\n .map((loadBalancer: any) => loadBalancer.name);\n this.setState({ existingLoadBalancerNames });\n });\n };\n\n private vnetUpdated = (): void => {\n const { credentials, region } = this.state.loadBalancer;\n this.setState((state) => ({\n loadBalancer: {\n ...state.loadBalancer,\n selectedVnet: null,\n vnet: null,\n vnetResourceGroup: null,\n },\n selectedVnets: [],\n }));\n\n NetworkReader.listNetworks().then((networks: any) => {\n if (!this.mounted) {\n return;\n }\n const azureNetworks = Array.isArray(networks) ? networks : networks.azure || [];\n const selectedVnets = azureNetworks.filter(\n (vnet: IAzureVnet) => vnet.account === credentials && vnet.region === region,\n );\n this.setState({ selectedVnets });\n });\n\n this.subnetUpdated();\n };\n\n private subnetUpdated = (): void => {\n this.setState((state) => ({\n loadBalancer: {\n ...state.loadBalancer,\n selectedSubnet: null,\n subnet: null,\n },\n selectedSubnets: [],\n }));\n };\n\n private selectedVnetChanged = (vnetName: string): void => {\n const selectedVnet = findAzureVnetBySelectValue(this.state.selectedVnets, vnetName);\n const selectedSubnets = (selectedVnet?.subnets || []).filter((subnet) =>\n (subnet.devices || []).every((device) => !device || device.type === 'applicationGateways'),\n );\n\n this.setState((state) => ({\n loadBalancer: {\n ...state.loadBalancer,\n selectedVnet,\n vnet: selectedVnet?.name || null,\n vnetResourceGroup: selectedVnet?.resourceGroup || null,\n selectedSubnet: null,\n subnet: null,\n },\n selectedSubnets,\n }));\n };\n\n private selectedSubnetChanged = (subnetName: string): void => {\n const selectedSubnet = this.state.selectedSubnets.find((subnet) => subnet.name === subnetName) || null;\n this.updateLoadBalancer({ selectedSubnet, subnet: selectedSubnet?.name || null });\n };\n\n private updateLoadBalancer(values: any, callback?: () => void): void {\n this.setState((state) => ({ loadBalancer: { ...state.loadBalancer, ...values } }), callback);\n }\n\n private updateField = (field: string, value: any): void => {\n this.updateLoadBalancer(\n { [field]: value },\n field === 'credentials' ? this.accountUpdated : field === 'region' ? this.regionUpdated : undefined,\n );\n };\n\n private updateNamePart = (field: string, value: string): void => {\n this.updateLoadBalancer({ [field]: value }, this.updateName);\n };\n\n private updateProbe = (field: string, value: any): void => {\n const probes = [{ ...(this.state.loadBalancer.probes?.[0] || {}), [field]: value }];\n this.updateLoadBalancer({ probes });\n };\n\n private updateRule = (index: number, field: string, value: any): void => {\n const loadBalancingRules = [...(this.state.loadBalancer.loadBalancingRules || [])];\n loadBalancingRules[index] = { ...loadBalancingRules[index], [field]: value };\n this.updateLoadBalancer({ loadBalancingRules });\n };\n\n private updateFirstRule = (field: string, value: any): void => {\n this.updateRule(0, field, value);\n };\n\n private addListener = (): void => {\n const loadBalancingRules = [\n ...(this.state.loadBalancer.loadBalancingRules || []),\n { protocol: listenerProtocolOptions(this.getLoadBalancerType())[0] },\n ];\n this.updateLoadBalancer({ loadBalancingRules });\n };\n\n private removeListener = (index: number): void => {\n const loadBalancingRules = [...(this.state.loadBalancer.loadBalancingRules || [])];\n loadBalancingRules.splice(index, 1);\n this.updateLoadBalancer({ loadBalancingRules });\n };\n\n private submit = (): void => {\n const application = this.getApplication();\n const descriptor = this.props.isNew ? 'Create' : 'Update';\n const errors = validateAzureLoadBalancerForSubmit(this.state.loadBalancer, this.getLoadBalancerType(), {\n existingLoadBalancerNames: this.state.existingLoadBalancerNames,\n isNew: this.props.isNew,\n });\n if (errors.length) {\n return;\n }\n const loadBalancer = normalizeAzureLoadBalancerForSubmit(this.state.loadBalancer, this.getLoadBalancerType());\n\n if (this.props.forPipelineConfig) {\n this.props.closeModal(loadBalancer);\n return;\n }\n\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n clusterName: loadBalancer.clusterName,\n resourceGroupName: loadBalancer.clusterName,\n loadBalancerName: loadBalancer.name,\n };\n\n this.setState({ loadBalancer });\n this.state.taskMonitor.submit(() =>\n LoadBalancerWriter.upsertLoadBalancer(loadBalancer, application, descriptor, params),\n );\n };\n\n private renderInput(label: string, field: string, type = 'text', onChange = this.updateField) {\n const value = formatInputValue(this.state.loadBalancer[field]);\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n type={type}\n value={value}\n onChange={(event) => onChange(field, event.target.value)}\n />\n </div>\n </div>\n );\n }\n\n private renderSelect(\n label: string,\n value: string,\n values: any[],\n onChange: (value: string) => void,\n getLabel = (item: any) => item.name || item,\n getValue = getLabel,\n ) {\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n value={value || ''}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select...</option>\n {values.map((item) => (\n <option key={getValue(item)} value={getValue(item)}>\n {getLabel(item)}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n }\n\n private renderSkuSelect() {\n return this.renderSelect(\n 'SKU',\n this.state.loadBalancer.sku,\n validSkus,\n (value) => this.updateField('sku', value),\n (item) => item,\n );\n }\n\n private renderProbeInput(label: string, field: string, type = 'text') {\n const probe = this.state.loadBalancer.probes?.[0] || {};\n const value = formatInputValue(probe[field]);\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n min={type === 'number' ? 0 : undefined}\n type={type}\n value={value}\n onChange={(event) =>\n this.updateProbe(field, type === 'number' ? parseOptionalNumber(event.target.value) : event.target.value)\n }\n />\n </div>\n </div>\n );\n }\n\n private renderFirstRuleInput(label: string, field: string, type = 'text') {\n const rule = this.state.loadBalancer.loadBalancingRules?.[0] || {};\n const value = formatInputValue(rule[field]);\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n min={type === 'number' ? 0 : undefined}\n type={type}\n value={value}\n onChange={(event) =>\n this.updateFirstRule(\n field,\n type === 'number' ? parseOptionalNumber(event.target.value) : event.target.value,\n )\n }\n />\n </div>\n </div>\n );\n }\n\n public render() {\n const { dismissModal, isNew } = this.props;\n const {\n accounts,\n accountsLoaded,\n existingLoadBalancerNames,\n loadBalancer,\n regions,\n selectedSubnets,\n selectedVnets,\n taskMonitor,\n } = this.state;\n const probe = loadBalancer.probes?.[0] || {};\n const submitting = taskMonitor.submitting;\n const loadBalancerType = this.getLoadBalancerType();\n const validationErrors = validateAzureLoadBalancerForSubmit(loadBalancer, loadBalancerType, {\n existingLoadBalancerNames,\n isNew,\n });\n const listenerOptions = listenerProtocolOptions(loadBalancerType);\n const probeOptions = probeProtocolOptions(loadBalancerType);\n const showCreateFields = shouldRenderCreateFields(isNew);\n const showNetworkFields = shouldRenderNetworkFields(isNew, loadBalancerType);\n const showSkuField = shouldRenderSkuField(isNew, loadBalancerType);\n\n return (\n <>\n <TaskMonitorWrapper monitor={taskMonitor} />\n <ModalClose dismiss={dismissModal} />\n <Modal.Header>\n <Modal.Title>\n {isNew ? `Create New ${loadBalancerType}` : `Edit ${loadBalancerType} ${loadBalancer.name}`}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\" onSubmit={(event) => event.preventDefault()}>\n {showCreateFields && this.renderInput('Stack', 'stack', 'text', this.updateNamePart)}\n {showCreateFields && this.renderInput('Detail', 'detail', 'text', this.updateNamePart)}\n {showCreateFields && this.renderInput('Name', 'name')}\n {showCreateFields &&\n this.renderSelect('Account', loadBalancer.credentials, accounts, (value) =>\n this.updateField('credentials', value),\n )}\n {showCreateFields &&\n this.renderSelect('Region', loadBalancer.region, regions, (value) => this.updateField('region', value))}\n {showNetworkFields &&\n this.renderSelect(\n 'VNet',\n loadBalancer.selectedVnet ? getAzureVnetSelectValue(loadBalancer.selectedVnet) : '',\n selectedVnets,\n this.selectedVnetChanged,\n getAzureVnetSelectLabel,\n getAzureVnetSelectValue,\n )}\n {showNetworkFields &&\n this.renderSelect(\n 'Subnet',\n loadBalancer.selectedSubnet?.name || loadBalancer.subnet,\n selectedSubnets,\n this.selectedSubnetChanged,\n )}\n {this.renderInput('DNS Name', 'dnsName')}\n {showSkuField && this.renderSkuSelect()}\n <h4>Listeners</h4>\n {(loadBalancer.loadBalancingRules || []).map((rule: any, index: number) => (\n <div className=\"well\" key={index}>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Protocol</label>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n value={rule.protocol || listenerOptions[0]}\n onChange={(event) => this.updateRule(index, 'protocol', event.target.value)}\n >\n {listenerOptions.map((protocol) => (\n <option key={protocol} value={protocol}>\n {protocol}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">External Port</label>\n <div className=\"col-md-3\">\n <input\n className=\"form-control input-sm\"\n min={0}\n type=\"number\"\n value={formatInputValue(rule.externalPort)}\n onChange={(event) =>\n this.updateRule(index, 'externalPort', parseOptionalNumber(event.target.value))\n }\n />\n </div>\n <label className=\"col-md-2 control-label\">Backend Port</label>\n <div className=\"col-md-3\">\n <input\n className=\"form-control input-sm\"\n min={0}\n type=\"number\"\n value={formatInputValue(rule.backendPort)}\n onChange={(event) =>\n this.updateRule(index, 'backendPort', parseOptionalNumber(event.target.value))\n }\n />\n </div>\n </div>\n <button className=\"btn btn-link\" type=\"button\" onClick={() => this.removeListener(index)}>\n Remove Listener\n </button>\n </div>\n ))}\n <button className=\"btn btn-default\" type=\"button\" onClick={this.addListener}>\n Add Listener\n </button>\n <h4>Health Check</h4>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Probe Protocol</label>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n value={probe.probeProtocol || probeOptions[0]}\n onChange={(event) => this.updateProbe('probeProtocol', event.target.value)}\n >\n {probeOptions.map((protocol) => (\n <option key={protocol} value={protocol}>\n {protocol}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Probe Port</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n min={0}\n type=\"number\"\n value={formatInputValue(probe.probePort)}\n onChange={(event) => this.updateProbe('probePort', parseOptionalNumber(event.target.value))}\n />\n </div>\n </div>\n {probe.probeProtocol !== 'TCP' && (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Probe Path</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n value={probe.probePath || ''}\n onChange={(event) => this.updateProbe('probePath', event.target.value)}\n />\n </div>\n </div>\n )}\n <h4>Advanced Settings</h4>\n {this.renderProbeInput('Probe Interval', 'probeInterval', 'number')}\n {this.renderProbeInput('Unhealthy Threshold', 'unhealthyThreshold', 'number')}\n {isAzureLoadBalancerType(loadBalancerType) &&\n this.renderFirstRuleInput('Idle Timeout', 'idleTimeout', 'number')}\n {isAzureLoadBalancerType(loadBalancerType) && (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Session Persistence</label>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n value={loadBalancer.sessionPersistence || 'None'}\n onChange={(event) => this.updateField('sessionPersistence', event.target.value)}\n >\n <option value=\"None\">None</option>\n <option value=\"Client IP\">Client IP</option>\n <option value=\"Client IP and protocol\">Client IP and protocol</option>\n </select>\n </div>\n </div>\n )}\n {!isAzureLoadBalancerType(loadBalancerType) && this.renderProbeInput('Probe Timeout', 'timeout', 'number')}\n </form>\n {!!validationErrors.length && (\n <div className=\"alert alert-danger\">\n {validationErrors.map((error) => (\n <div key={error}>{error}</div>\n ))}\n </div>\n )}\n </Modal.Body>\n <Modal.Footer>\n <button className=\"btn btn-default\" disabled={submitting} onClick={dismissModal} type=\"button\">\n Cancel\n </button>\n <SubmitButton\n isDisabled={(isNew && !accountsLoaded) || submitting || !!validationErrors.length}\n isNew={isNew}\n label={isNew ? 'Create' : 'Update'}\n onClick={this.submit}\n submitting={submitting}\n />\n </Modal.Footer>\n </>\n );\n }\n}\n\nexport const AzureLoadBalancerModal = Object.assign(\n withRouter<IAzureLoadBalancerModalProps & IRouterInjectedProps>(AzureLoadBalancerModalComponent),\n { show: AzureLoadBalancerModalComponent.show },\n);\n","import React from 'react';\nimport { Button, Modal } from 'react-bootstrap';\n\nimport type { ILoadBalancerModalProps, ILoadBalancerUpsertCommand } from '@spinnaker/core';\nimport { ModalClose, noop, ReactModal } from '@spinnaker/core';\n\nimport { AzureLoadBalancerModal, getAzureLoadBalancerTypeChoice } from './AzureLoadBalancerModal';\nimport type { IAzureLoadBalancer } from '../../utility';\nimport { AzureLoadBalancerTypes } from '../../utility';\n\nexport interface IAzureLoadBalancerChoiceModalState {\n choices: IAzureLoadBalancer[];\n selectedChoice: IAzureLoadBalancer;\n}\n\ninterface IAzureLoadBalancerChoiceModalProps extends Omit<ILoadBalancerModalProps, 'closeModal'> {\n closeModal?(loadBalancerCommand: ILoadBalancerUpsertCommand | Promise<ILoadBalancerUpsertCommand>): void;\n}\n\nexport class AzureLoadBalancerChoiceModal extends React.Component<\n IAzureLoadBalancerChoiceModalProps,\n IAzureLoadBalancerChoiceModalState\n> {\n public static defaultProps: Partial<IAzureLoadBalancerChoiceModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static supportsPipelineConfig = true;\n\n public static show(props: ILoadBalancerModalProps): Promise<ILoadBalancerUpsertCommand> {\n if ((props as any).isNew === false) {\n const application = (props as any).app || (props as any).application;\n\n return AzureLoadBalancerModal.show({\n ...props,\n app: application,\n application,\n loadBalancer: props.loadBalancer,\n isNew: false,\n forPipelineConfig: props.forPipelineConfig || false,\n });\n }\n\n const componentProps: IAzureLoadBalancerChoiceModalProps = {\n ...props,\n className: 'create-pipeline-modal-overflow-visible',\n };\n\n return ReactModal.show<IAzureLoadBalancerChoiceModalProps, ILoadBalancerUpsertCommand>(\n AzureLoadBalancerChoiceModal,\n componentProps,\n );\n }\n\n constructor(props: IAzureLoadBalancerChoiceModalProps) {\n super(props);\n this.state = {\n choices: AzureLoadBalancerTypes,\n selectedChoice: getAzureLoadBalancerTypeChoice(props.loadBalancer, (props as any).loadBalancerType),\n };\n }\n\n public choiceSelected(choice: IAzureLoadBalancer): void {\n this.setState({ selectedChoice: choice });\n }\n\n private choose = (): void => {\n const application = (this.props as any).app || (this.props as any).application;\n const configurePromise = AzureLoadBalancerModal.show({\n ...this.props,\n app: application,\n application,\n loadBalancer: this.props.loadBalancer || null,\n isNew: (this.props as any).isNew !== false,\n forPipelineConfig: this.props.forPipelineConfig || false,\n loadBalancerType: this.state.selectedChoice,\n });\n\n this.props.closeModal(configurePromise);\n };\n\n public close = (reason?: any): void => {\n this.props.dismissModal(reason);\n };\n\n public render() {\n const { choices, selectedChoice } = this.state;\n\n return (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Select Type of Load Balancer</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"modal-body\">\n <div className=\"card-choices\">\n {choices.map((choice) => (\n <div\n key={choice.type}\n className={`card ${selectedChoice === choice ? 'active' : ''}`}\n onClick={() => this.choiceSelected(choice)}\n >\n <h3 className=\"load-balancer-label\">{choice.type}</h3>\n <div>{choice.description}</div>\n </div>\n ))}\n </div>\n <div className=\"load-balancer-description\" />\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={this.choose}>\n Configure Load Balancer <span className=\"glyphicon glyphicon-chevron-right\" />\n </Button>\n </Modal.Footer>\n </>\n );\n }\n}\n","import { UISref } from '@uirouter/react';\nimport React from 'react';\nimport { Dropdown, MenuItem } from 'react-bootstrap';\n\nimport type {\n Application,\n ILoadBalancer,\n ILoadBalancerActionsProps,\n ILoadBalancerDeleteCommand,\n ILoadBalancerDetailsSectionProps,\n IUseDetailsHookProps,\n LoadBalancerReader as LoadBalancerReaderType,\n SecurityGroupReader,\n UseDetailsResult,\n} from '@spinnaker/core';\nimport {\n AccountTag,\n CollapsibleSection,\n ConfirmationModalService,\n CopyToClipboard,\n FirewallLabels,\n HealthCounts,\n LoadBalancerWriter,\n timestamp,\n useDataSource,\n useDeckRuntimeServices,\n} from '@spinnaker/core';\n\nimport { AzureLoadBalancerModal } from '../configure/AzureLoadBalancerModal';\n\ninterface ILoadAzureLoadBalancerDetailsProps {\n app: Application;\n autoClose: () => void;\n loadBalancers?: ILoadBalancer[];\n loadBalancerParams: IAzureLoadBalancerStateParams;\n loadBalancerReader: LoadBalancerReaderType;\n securityGroupReader: SecurityGroupReader;\n}\n\ninterface IAzureLoadBalancerStateParams {\n accountId: string;\n name: string;\n provider: string;\n region: string;\n}\n\nfunction formatLoadBalancerType(loadBalancerType: string): string {\n if (!loadBalancerType?.includes('_')) {\n return loadBalancerType;\n }\n\n return loadBalancerType\n .split('_')\n .map((part) => {\n const lower = part.toLowerCase();\n return `${lower.substring(0, 1).toUpperCase()}${lower.substring(1)}`;\n })\n .join(' ');\n}\n\nfunction resolveSecurityGroups(\n app: Application,\n loadBalancer: ILoadBalancer,\n loadBalancerParams: IAzureLoadBalancerStateParams,\n securityGroupReader: SecurityGroupReader,\n): any[] {\n const securityGroupIds = loadBalancer.elb?.securityGroups || loadBalancer.securityGroups || [];\n if (!securityGroupIds.length) {\n return [];\n }\n\n return securityGroupIds\n .map((securityGroupId: string) =>\n securityGroupReader.getApplicationSecurityGroup(\n app,\n loadBalancerParams.accountId,\n loadBalancerParams.region,\n securityGroupId,\n ),\n )\n .filter(Boolean)\n .sort((a: any, b: any) => a.name.localeCompare(b.name));\n}\n\nexport async function loadAzureLoadBalancerDetails({\n app,\n autoClose,\n loadBalancers,\n loadBalancerParams,\n loadBalancerReader: reader,\n securityGroupReader,\n}: ILoadAzureLoadBalancerDetailsProps): Promise<ILoadBalancer | undefined> {\n const { accountId, name, region } = loadBalancerParams;\n const loadBalancer = (loadBalancers || app.loadBalancers.data).find(\n (candidate: ILoadBalancer) =>\n candidate.name === name && candidate.region === region && candidate.account === accountId,\n );\n\n if (!loadBalancer) {\n autoClose();\n return undefined;\n }\n\n const details = await reader.getLoadBalancerDetails(\n loadBalancer.provider || loadBalancer.cloudProvider,\n accountId,\n region,\n name,\n );\n const elb = details.find((candidate: ILoadBalancer) => candidate.name === name);\n\n if (elb) {\n loadBalancer.elb = elb;\n loadBalancer.account = accountId;\n loadBalancer.securityGroups = resolveSecurityGroups(\n app,\n loadBalancer,\n loadBalancerParams,\n securityGroupReader,\n ) as any;\n loadBalancer.loadBalancerType = formatLoadBalancerType(loadBalancer.loadBalancerType);\n }\n\n return loadBalancer;\n}\n\nexport function useAzureLoadBalancerDetails({\n app,\n loadBalancerParams,\n autoClose,\n}: IUseDetailsHookProps): UseDetailsResult<ILoadBalancer> {\n const azureLoadBalancerParams = loadBalancerParams as IAzureLoadBalancerStateParams;\n const dataSource = app.getDataSource('loadBalancers');\n const { data: loadBalancers, loaded, refresh, error } = useDataSource<ILoadBalancer[]>(dataSource);\n const { loadBalancerReader, securityGroupReader } = useDeckRuntimeServices();\n const [data, setData] = React.useState<ILoadBalancer>();\n const [loadingDetails, setLoadingDetails] = React.useState(false);\n const [detailsError, setDetailsError] = React.useState<string | null>(null);\n const autoCloseRef = React.useRef(autoClose);\n const isMountedRef = React.useRef(true);\n const requestGenerationRef = React.useRef(0);\n const { accountId, name, provider, region } = azureLoadBalancerParams;\n\n React.useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n React.useEffect(() => {\n autoCloseRef.current = autoClose;\n }, [autoClose]);\n\n const loadDetails = React.useCallback(async () => {\n const requestGeneration = ++requestGenerationRef.current;\n if (!loaded || error) {\n if (isMountedRef.current) {\n setLoadingDetails(false);\n }\n return;\n }\n\n setLoadingDetails(true);\n setDetailsError(null);\n try {\n const loadBalancer = await loadAzureLoadBalancerDetails({\n app,\n loadBalancerParams: { accountId, name, provider, region },\n loadBalancers,\n autoClose: () => autoCloseRef.current(),\n loadBalancerReader,\n securityGroupReader,\n });\n if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {\n setData(loadBalancer);\n }\n } catch (e) {\n if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {\n setDetailsError(e?.message || String(e));\n }\n } finally {\n if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {\n setLoadingDetails(false);\n }\n }\n }, [accountId, app, error, loadBalancerReader, loadBalancers, loaded, name, provider, region, securityGroupReader]);\n\n React.useEffect(() => {\n loadDetails();\n }, [loadDetails]);\n\n return {\n data,\n loading: !loaded || loadingDetails,\n error: error || detailsError,\n refetch: async () => {\n refresh();\n },\n };\n}\n\nexport function AzureLoadBalancerActions({ app, loadBalancer }: ILoadBalancerActionsProps) {\n const canDeleteLoadBalancer = !loadBalancer.serverGroups?.length;\n const editLoadBalancer = () => {\n AzureLoadBalancerModal.show({\n app,\n loadBalancer: { ...loadBalancer },\n isNew: false,\n loadBalancerType: loadBalancer.loadBalancerType,\n });\n };\n const deleteLoadBalancer = () => {\n if (!canDeleteLoadBalancer) {\n return;\n }\n\n const command: ILoadBalancerDeleteCommand = {\n cloudProvider: 'azure',\n loadBalancerName: loadBalancer.name,\n loadBalancerType: loadBalancer.loadBalancerType,\n credentials: loadBalancer.account,\n region: loadBalancer.region,\n appName: app.name,\n } as any;\n\n ConfirmationModalService.confirm({\n header: `Really delete ${loadBalancer.name}?`,\n buttonText: `Delete ${loadBalancer.name}`,\n account: loadBalancer.account,\n taskMonitorConfig: {\n application: app,\n title: `Deleting ${loadBalancer.name}`,\n },\n submitMethod: () => LoadBalancerWriter.deleteLoadBalancer(command, app),\n });\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"azure-load-balancer-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Load Balancer Actions</Dropdown.Toggle>\n <Dropdown.Menu>\n <MenuItem onClick={editLoadBalancer}>Edit Load Balancer</MenuItem>\n <MenuItem\n disabled={!canDeleteLoadBalancer}\n onClick={deleteLoadBalancer}\n title={\n canDeleteLoadBalancer\n ? undefined\n : 'You must detach all server groups before you can delete this load balancer.'\n }\n >\n Delete Load Balancer\n </MenuItem>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nfunction sortServerGroups(a: any, b: any): number {\n if (a.isDisabled !== b.isDisabled) {\n return a.isDisabled ? 1 : -1;\n }\n return b.name.localeCompare(a.name);\n}\n\nexport function AzureLoadBalancerDetailsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const elb = loadBalancer.elb || {};\n const serverGroups = loadBalancer.serverGroups || [];\n const showNetwork = loadBalancer.loadBalancerType === 'Azure Application Gateway';\n\n return (\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Type</dt>\n <dd>{loadBalancer.loadBalancerType || '-'}</dd>\n <dt>Created</dt>\n <dd>{elb.createdTime ? timestamp(elb.createdTime) : '-'}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={loadBalancer.account} /> {loadBalancer.region}\n </dd>\n {showNetwork && <dt>VNet</dt>}\n {showNetwork && <dd>{elb.vnet || '-'}</dd>}\n {showNetwork && <dt>Subnet</dt>}\n {showNetwork && <dd>{elb.subnet || '-'}</dd>}\n </dl>\n {!!serverGroups.length && (\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Server Groups</dt>\n <dd>\n <ul className=\"collapse-margin-on-filter-collapse\">\n {serverGroups\n .slice()\n .sort(sortServerGroups)\n .map((serverGroup: any) => (\n <li key={serverGroup.name}>\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: serverGroup.region,\n accountId: serverGroup.account,\n serverGroup: serverGroup.name,\n provider: 'azure',\n }}\n >\n <a>{serverGroup.name}</a>\n </UISref>\n </li>\n ))}\n </ul>\n </dd>\n </dl>\n )}\n {elb.dnsName && (\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>DNS Name:</dt>\n <dd>\n <a target=\"_blank\" href={`//${elb.dnsName}`}>\n {elb.dnsName}\n </a>{' '}\n <CopyToClipboard text={elb.dnsName} toolTip=\"Copy DNS Name to clipboard\" />\n </dd>\n </dl>\n )}\n </CollapsibleSection>\n );\n}\n\nexport function AzureLoadBalancerListenersSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const rules = loadBalancer.elb?.loadBalancingRules || [];\n\n return (\n <CollapsibleSection heading=\"Listeners\">\n <dl>\n <dt>Load Balancer -&gt; Instance</dt>\n {rules.length ? (\n rules.map((rule: any, index: number) => (\n <dd key={rule.ruleName || index}>\n {rule.protocol}:{rule.externalPort} -&gt; {rule.backendPort}\n </dd>\n ))\n ) : (\n <dd>-</dd>\n )}\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function AzureLoadBalancerHealthChecksSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const probe = loadBalancer.elb?.probes?.[0];\n\n return (\n <CollapsibleSection heading=\"Health Checks\">\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target</dt>\n <dd>{probe?.probeProtocol || '-'}</dd>\n <dt>Interval</dt>\n <dd>{probe?.probeInterval ? `${probe.probeInterval} seconds` : '-'}</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{probe?.unhealthyThreshold || '-'}</dd>\n <dt>Timeout</dt>\n <dd>{probe?.timeout ? `${probe.timeout} seconds` : '-'}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function AzureLoadBalancerStatusSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Status\" defaultExpanded={true}>\n <HealthCounts className=\"pull-left\" container={loadBalancer.instanceCounts} />\n </CollapsibleSection>\n );\n}\n\nexport function AzureLoadBalancerFirewallsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const securityGroups = (loadBalancer.securityGroups || []) as any[];\n\n return (\n <CollapsibleSection heading={FirewallLabels.get('Firewalls')}>\n <ul>\n {securityGroups.map((securityGroup) => (\n <li key={securityGroup.id || securityGroup.name}>\n <UISref\n to=\"^.firewallDetails\"\n params={{\n name: securityGroup.name,\n accountId: loadBalancer.account,\n region: loadBalancer.region,\n vpcId: loadBalancer.vpcId,\n provider: loadBalancer.provider,\n }}\n >\n <a>\n {securityGroup.name} ({securityGroup.id})\n </a>\n </UISref>\n </li>\n ))}\n </ul>\n </CollapsibleSection>\n );\n}\n\nexport const azureLoadBalancerDetailsSections = [\n AzureLoadBalancerDetailsSection,\n AzureLoadBalancerStatusSection,\n AzureLoadBalancerListenersSection,\n AzureLoadBalancerFirewallsSection,\n AzureLoadBalancerHealthChecksSection,\n];\n","import React from 'react';\n\nimport type { IExecutionDetailsSectionProps } from '@spinnaker/core';\nimport {\n AccountService,\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n ExecutionDetailsSection,\n ExecutionDetailsTasks,\n Registry,\n SETTINGS,\n Spinner,\n StageConfigField,\n StageFailureMessage,\n} from '@spinnaker/core';\n\nimport { AzureImageReader } from '../../../image/image.reader';\n\nconst osTypeOptions = ['linux', 'windows'];\nconst packageTypeOptions = ['DEB', 'RPM'];\n\ninterface IAzureBakeStageState {\n accounts: string[];\n baseLabelOptions: string[];\n baseOsOptions: any[];\n extendedAttributeKey: string;\n extendedAttributeValue: string;\n loading: boolean;\n loadError: boolean;\n managedImageOptions: Array<{ id: string; name: string; osType: string }>;\n regions: string[];\n roscoMode: boolean;\n showAdvancedOptions: boolean;\n sourceImageMode: 'default' | 'managed' | 'custom';\n}\n\nfunction deleteEmptyProperties(stage: any): any {\n return Object.keys(stage).reduce((acc, key) => {\n if (stage[key] !== '') {\n acc[key] = stage[key];\n }\n return acc;\n }, {} as any);\n}\n\nfunction baseOsDescription(baseOsOption: any): string {\n const baseOsName = baseOsOption?.displayName || baseOsOption?.id || '';\n return baseOsOption?.shortDescription ? `${baseOsName} (${baseOsOption.shortDescription})` : baseOsName;\n}\n\nfunction sourceImageMode(stage: any): 'default' | 'managed' | 'custom' {\n if (stage.managedImage != null) {\n return 'managed';\n }\n if (stage.publisher != null) {\n return 'custom';\n }\n return 'default';\n}\n\nexport class AzureBakeStageConfig extends React.Component<any, IAzureBakeStageState> {\n private azureImageReader = new AzureImageReader();\n private mounted = false;\n\n public state: IAzureBakeStageState = {\n accounts: [],\n baseLabelOptions: [],\n baseOsOptions: [],\n extendedAttributeKey: '',\n extendedAttributeValue: '',\n loading: true,\n loadError: false,\n managedImageOptions: [],\n regions: [],\n roscoMode: false,\n showAdvancedOptions: false,\n sourceImageMode: sourceImageMode(this.props.stage),\n };\n\n public componentDidMount(): void {\n this.mounted = true;\n this.initialize();\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n }\n\n private initialize(): void {\n const stage = this.props.stage;\n stage.extendedAttributes = stage.extendedAttributes || {};\n stage.regions = stage.regions || [];\n\n Promise.all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n BakeryReader.getRegions('azure'),\n BakeryReader.getBaseOsOptions('azure'),\n BakeryReader.getBaseLabelOptions(),\n ])\n .then(([credentialsKeyedByAccount, regions, baseOsOptions, baseLabelOptions]) => {\n if (!this.mounted) {\n return;\n }\n\n const nextStage = this.applyDefaults(\n stage,\n regions as string[],\n baseOsOptions.baseImages || [],\n baseLabelOptions,\n );\n this.replaceStage(nextStage);\n\n const nextState = {\n accounts: Object.keys(credentialsKeyedByAccount),\n baseLabelOptions,\n baseOsOptions: baseOsOptions.baseImages || [],\n loading: false,\n loadError: false,\n regions: regions as string[],\n roscoMode: this.roscoMode(nextStage),\n showAdvancedOptions: this.showAdvanced(nextStage),\n sourceImageMode: sourceImageMode(nextStage),\n };\n this.setState(nextState);\n\n if (nextState.sourceImageMode === 'managed') {\n this.loadManagedImages(nextStage.account);\n }\n })\n .catch(() => {\n if (this.mounted) {\n this.setState({ loading: false, loadError: true });\n }\n });\n }\n\n private applyDefaults(stage: any, regions: string[], baseOsOptions: any[], baseLabelOptions: string[]): any {\n const nextStage = deleteEmptyProperties({ ...stage });\n nextStage.extendedAttributes = nextStage.extendedAttributes || {};\n nextStage.regions = nextStage.regions || [];\n\n if (!nextStage.user) {\n nextStage.user = AuthenticationService.getAuthenticatedUser()?.name;\n }\n if (regions.length === 1) {\n nextStage.region = regions[0];\n } else if (nextStage.region && !regions.includes(nextStage.region)) {\n delete nextStage.region;\n }\n if (!nextStage.regions.length && this.props.application.defaultRegions.azure) {\n nextStage.regions = [this.props.application.defaultRegions.azure];\n }\n if (!nextStage.baseLabel && baseLabelOptions.length) {\n nextStage.baseLabel = baseLabelOptions[0];\n }\n if (!nextStage.baseOs && baseOsOptions.length && sourceImageMode(nextStage) === 'default') {\n nextStage.baseOs = baseOsOptions[0].id;\n }\n\n return nextStage;\n }\n\n private replaceStage(nextStage: any): void {\n Object.keys(this.props.stage).forEach((key) => {\n if (!Object.prototype.hasOwnProperty.call(nextStage, key)) {\n delete this.props.stage[key];\n }\n });\n Object.assign(this.props.stage, nextStage);\n if (this.props.updateStage) {\n this.props.updateStage(nextStage);\n } else if (this.props.updateStageField) {\n this.props.updateStageField(nextStage);\n }\n }\n\n private updateStage(changes: any): void {\n const nextStage = deleteEmptyProperties({ ...this.props.stage, ...changes });\n this.replaceStage(nextStage);\n if (typeof SETTINGS.feature.roscoSelector === 'function') {\n this.setState({ roscoMode: this.roscoMode(nextStage) });\n }\n }\n\n private updateExtendedAttribute(key: string, value: string): void {\n this.updateStage({ extendedAttributes: { ...(this.props.stage.extendedAttributes || {}), [key]: value } });\n }\n\n private removeExtendedAttribute(key: string): void {\n const extendedAttributes = { ...(this.props.stage.extendedAttributes || {}) };\n delete extendedAttributes[key];\n this.updateStage({ extendedAttributes });\n }\n\n private addExtendedAttribute(): void {\n const key = this.state.extendedAttributeKey.trim();\n if (!key) {\n return;\n }\n\n this.updateExtendedAttribute(key, this.state.extendedAttributeValue);\n this.setState({ extendedAttributeKey: '', extendedAttributeValue: '', showAdvancedOptions: true });\n }\n\n private roscoMode(stage: any): boolean {\n return (\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector(stage))\n );\n }\n\n private showAdvanced(stage: any): boolean {\n return !!(\n stage.templateFileName ||\n (stage.extendedAttributes && Object.keys(stage.extendedAttributes).length > 0) ||\n stage.varFileName\n );\n }\n\n private loadManagedImages(account: string): void {\n this.azureImageReader\n .findImages({ provider: 'azure', managedImages: true, account })\n .then((images: any[]) => {\n if (!this.mounted || this.props.stage.account !== account) {\n return;\n }\n this.setState({\n managedImageOptions: images.map((image) => ({\n id: image.imageName,\n name: image.imageName,\n osType: image.ostype,\n })),\n });\n })\n .catch(() => {});\n }\n\n private loadAccountRegions(account: string): void {\n AccountService.getRegionsForAccount(account)\n .then((regions: any[]) => {\n if (this.mounted && this.props.stage.account === account) {\n this.setState({ regions: regions.map((region) => region.name) });\n }\n })\n .catch(() => {});\n }\n\n private setSourceImageMode(sourceImageModeValue: 'default' | 'managed' | 'custom'): void {\n this.setState({ sourceImageMode: sourceImageModeValue });\n\n if (sourceImageModeValue === 'default') {\n this.updateStage({\n managedImage: null,\n offer: null,\n osType: null,\n packageType: null,\n publisher: null,\n sku: null,\n });\n return;\n }\n\n if (sourceImageModeValue === 'managed') {\n this.setState({ managedImageOptions: [] });\n this.loadManagedImages(this.props.stage.account);\n this.updateStage({ baseOs: null, offer: null, osType: null, packageType: null, publisher: null, sku: null });\n return;\n }\n\n this.updateStage({ baseOs: null, managedImage: null, osType: null, packageType: null });\n }\n\n private onAccountChange(account: string): void {\n this.updateStage({ account, managedImage: null, osType: null, packageType: null });\n if (account) {\n this.loadAccountRegions(account);\n }\n if (this.state.sourceImageMode === 'managed') {\n this.setState({ managedImageOptions: [] });\n this.loadManagedImages(account);\n }\n }\n\n private onManagedImageChange(managedImage: string): void {\n const selectedManagedImage = this.state.managedImageOptions.find((option) => option.id === managedImage);\n this.updateStage({\n managedImage,\n osType: selectedManagedImage?.osType?.toLowerCase(),\n packageType: null,\n });\n }\n\n private renderSourceImageFields(): React.ReactNode {\n const stage = this.props.stage;\n\n if (this.state.sourceImageMode === 'managed') {\n return (\n <StageConfigField label=\"Managed Image\">\n <select\n className=\"form-control input-sm\"\n name=\"managedImage\"\n value={stage.managedImage || ''}\n onChange={(event) => this.onManagedImageChange(event.target.value)}\n >\n <option value=\"\" />\n {this.state.managedImageOptions.map((image) => (\n <option key={image.id} value={image.id}>\n {image.name}\n </option>\n ))}\n </select>\n </StageConfigField>\n );\n }\n\n if (this.state.sourceImageMode === 'custom') {\n return (\n <>\n <StageConfigField label=\"Publisher\">\n <input\n className=\"form-control input-sm\"\n value={stage.publisher || ''}\n onChange={(event) => this.updateStage({ publisher: event.target.value })}\n />\n </StageConfigField>\n <StageConfigField label=\"Offer\">\n <input\n className=\"form-control input-sm\"\n value={stage.offer || ''}\n onChange={(event) => this.updateStage({ offer: event.target.value })}\n />\n </StageConfigField>\n <StageConfigField label=\"SKU\">\n <input\n className=\"form-control input-sm\"\n value={stage.sku || ''}\n onChange={(event) => this.updateStage({ sku: event.target.value })}\n />\n </StageConfigField>\n <StageConfigField label=\"OS Type\">\n {osTypeOptions.map((osType) => (\n <label className=\"radio-inline\" key={osType}>\n <input\n checked={stage.osType === osType}\n name=\"osType\"\n type=\"radio\"\n value={osType}\n onChange={() => this.updateStage({ osType, packageType: null })}\n />\n {osType}\n </label>\n ))}\n </StageConfigField>\n </>\n );\n }\n\n return (\n <StageConfigField label=\"Base OS\">\n <select\n className=\"form-control input-sm\"\n value={stage.baseOs || ''}\n onChange={(event) => this.updateStage({ baseOs: event.target.value })}\n >\n {this.state.baseOsOptions.map((baseOsOption) => (\n <option key={baseOsOption.id} value={baseOsOption.id}>\n {baseOsDescription(baseOsOption)}\n </option>\n ))}\n </select>\n </StageConfigField>\n );\n }\n\n public render() {\n if (this.state.loading) {\n return <Spinner />;\n }\n if (this.state.loadError) {\n return <div className=\"alert alert-danger\">Unable to load Azure bake options.</div>;\n }\n\n const stage = this.props.stage;\n const extendedAttributes = stage.extendedAttributes || {};\n const showAdvancedFields = this.state.showAdvancedOptions || this.state.roscoMode;\n\n return (\n <div className=\"form-horizontal\">\n <StageConfigField label=\"Account\">\n <select\n className=\"form-control input-sm\"\n name=\"account\"\n value={stage.account || ''}\n onChange={(event) => this.onAccountChange(event.target.value)}\n >\n <option value=\"\" />\n {this.state.accounts.map((account) => (\n <option key={account} value={account}>\n {account}\n </option>\n ))}\n </select>\n </StageConfigField>\n <StageConfigField label=\"Regions\">\n {this.state.regions.map((region) => (\n <label className=\"checkbox-inline\" key={region}>\n <input\n checked={(stage.regions || []).includes(region)}\n type=\"checkbox\"\n onChange={(event) => {\n const regions = new Set(stage.regions || []);\n event.target.checked ? regions.add(region) : regions.delete(region);\n const scalarRegion = event.target.checked\n ? region\n : stage.region === region\n ? undefined\n : stage.region;\n this.updateStage({ region: scalarRegion, regions: Array.from(regions) });\n }}\n />\n {region}\n </label>\n ))}\n </StageConfigField>\n <div className=\"panel panel-default\">\n <div className=\"panel-heading\">\n <label className=\"col-md-3 sm-label-right\" />\n <div className=\"btn-group btn-group-xs\" role=\"group\" aria-label=\"Source Image\">\n <button\n className={`btn btn-default ${this.state.sourceImageMode === 'default' ? 'active' : ''}`}\n onClick={() => this.setSourceImageMode('default')}\n type=\"button\"\n >\n Default Images\n </button>\n <button\n className={`btn btn-default ${this.state.sourceImageMode === 'managed' ? 'active' : ''}`}\n onClick={() => this.setSourceImageMode('managed')}\n type=\"button\"\n >\n Managed Images\n </button>\n <button\n className={`btn btn-default ${this.state.sourceImageMode === 'custom' ? 'active' : ''}`}\n onClick={() => this.setSourceImageMode('custom')}\n type=\"button\"\n >\n Custom Image\n </button>\n </div>\n </div>\n <div className=\"panel-body\">\n {this.renderSourceImageFields()}\n {stage.osType === 'linux' && (\n <StageConfigField label=\"Package Type\">\n {packageTypeOptions.map((packageType) => (\n <label className=\"radio-inline\" key={packageType}>\n <input\n checked={stage.packageType === packageType}\n name=\"packageType\"\n type=\"radio\"\n value={packageType}\n onChange={() => this.updateStage({ packageType })}\n />\n {packageType}\n </label>\n ))}\n </StageConfigField>\n )}\n </div>\n </div>\n <StageConfigField label=\"Package\" helpKey=\"pipeline.config.bake.package\">\n <input\n className=\"form-control input-sm\"\n value={stage.package || ''}\n onChange={(event) => this.updateStage({ package: event.target.value })}\n />\n </StageConfigField>\n <StageConfigField label=\"Base Label\">\n {this.state.baseLabelOptions.map((baseLabel) => (\n <label className=\"radio-inline\" key={baseLabel}>\n <input\n checked={stage.baseLabel === baseLabel}\n name=\"baseLabel\"\n type=\"radio\"\n value={baseLabel}\n onChange={() => this.updateStage({ baseLabel })}\n />\n {baseLabel}\n </label>\n ))}\n </StageConfigField>\n {(this.state.roscoMode || stage.rebake) && (\n <StageConfigField label=\"Rebake\">\n <div className=\"checkbox\" style={{ marginBottom: 0 }}>\n <label>\n <input\n checked={!!stage.rebake}\n type=\"checkbox\"\n onChange={(event) => this.updateStage({ rebake: event.target.checked })}\n />\n Rebake image without regard to the status of any existing bake\n </label>\n </div>\n </StageConfigField>\n )}\n <StageConfigField label=\"Base Name\">\n <input\n className=\"form-control input-sm\"\n value={stage.baseName || ''}\n onChange={(event) => this.updateStage({ baseName: event.target.value })}\n />\n </StageConfigField>\n <div className=\"form-group\">\n <div className=\"col-md-9 col-md-offset-1\">\n <div className=\"checkbox\">\n <label>\n <input\n checked={this.state.showAdvancedOptions}\n type=\"checkbox\"\n onChange={(event) => this.setState({ showAdvancedOptions: event.target.checked })}\n />\n <strong>Show Advanced Options</strong>\n </label>\n </div>\n </div>\n </div>\n {showAdvancedFields && (\n <>\n <StageConfigField label=\"Template File Name\" helpKey=\"pipeline.config.bake.templateFileName\">\n <input\n className=\"form-control input-sm\"\n value={stage.templateFileName || ''}\n onChange={(event) => this.updateStage({ templateFileName: event.target.value })}\n />\n </StageConfigField>\n <StageConfigField label=\"Extended Attributes\" helpKey=\"pipeline.config.bake.extendedAttributes\">\n <table className=\"table table-condensed packed\">\n <tbody>\n {Object.keys(extendedAttributes).map((key) => (\n <tr key={key}>\n <td>\n <strong className=\"small\">{key}</strong>\n </td>\n <td>\n <input\n className=\"form-control input-sm\"\n value={extendedAttributes[key]}\n onChange={(event) => this.updateExtendedAttribute(key, event.target.value)}\n />\n </td>\n <td className=\"text-right\">\n <button\n className=\"btn btn-link btn-sm\"\n onClick={() => this.removeExtendedAttribute(key)}\n type=\"button\"\n >\n Remove\n </button>\n </td>\n </tr>\n ))}\n <tr>\n <td>\n <input\n className=\"form-control input-sm\"\n placeholder=\"Key\"\n value={this.state.extendedAttributeKey}\n onChange={(event) => this.setState({ extendedAttributeKey: event.target.value })}\n />\n </td>\n <td>\n <input\n className=\"form-control input-sm\"\n placeholder=\"Value\"\n value={this.state.extendedAttributeValue}\n onChange={(event) => this.setState({ extendedAttributeValue: event.target.value })}\n />\n </td>\n <td className=\"text-right\">\n <button\n className=\"btn btn-block btn-sm add-new\"\n onClick={() => this.addExtendedAttribute()}\n type=\"button\"\n >\n Add Extended Attribute\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </StageConfigField>\n <StageConfigField label=\"Var File Name\" helpKey=\"pipeline.config.bake.varFileName\">\n <input\n className=\"form-control input-sm\"\n value={stage.varFileName || ''}\n onChange={(event) => this.updateStage({ varFileName: event.target.value })}\n />\n </StageConfigField>\n </>\n )}\n </div>\n );\n }\n}\n\nfunction valueForPath(source: any, path: string): string {\n const value = path.split('.').reduce((acc, key) => acc?.[key], source);\n return value == null ? '' : String(value);\n}\n\nfunction interpolatedBakeDetailUrl(stage: any): string {\n const context = stage.context || {};\n const roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector(context));\n const template = (roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl) || '';\n const source = { context };\n\n return template.replace(/\\{\\{\\s*([^}]+?)\\s*\\}\\}/g, (_match: string, path: string) => valueForPath(source, path));\n}\n\nexport function AzureBakeExecutionDetails({ current, execution, name, stage }: IExecutionDetailsSectionProps) {\n const context = stage.context || {};\n const resourceId = context.status?.resourceId;\n const roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector(context));\n const showRebake = roscoMode || execution?.trigger?.rebake || context.rebake;\n\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <div className=\"row\">\n <div className=\"col-md-6\">\n <dl className=\"dl-narrow dl-horizontal\">\n <dt>Provider</dt>\n <dd>Azure</dd>\n <dt>Image</dt>\n <dd>{context.ami}</dd>\n <dt>Region</dt>\n <dd>{context.region}</dd>\n <dt>Package</dt>\n <dd>{context.package}</dd>\n </dl>\n </div>\n <div className=\"col-md-6\">\n <dl className=\"dl-narrow dl-horizontal\">\n <dt>Base OS</dt>\n <dd>{context.baseOs}</dd>\n <dt>Label</dt>\n <dd>{context.baseLabel}</dd>\n {showRebake && (\n <>\n <dt>Rebake</dt>\n <dd>{String(execution?.trigger?.rebake || context.rebake || false)}</dd>\n </>\n )}\n {context.templateFileName && (\n <>\n <dt>Template</dt>\n <dd>{context.templateFileName}</dd>\n </>\n )}\n {context.varFileName && (\n <>\n <dt>Var File</dt>\n <dd>{context.varFileName}</dd>\n </>\n )}\n </dl>\n </div>\n </div>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {context.region && resourceId && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className={`alert alert-${stage.isFailed ? 'danger' : 'info'}`}>\n {context.previouslyBaked && <div>No changes detected; reused existing bake</div>}\n <a target=\"_blank\" rel=\"noopener noreferrer\" href={interpolatedBakeDetailUrl(stage)}>\n View Bakery Details\n </a>\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n}\n\n(AzureBakeExecutionDetails as any).title = 'bakeConfig';\n\nexport function registerAzureBakeStage() {\n Registry.pipeline.registerStage({\n key: 'bake',\n provides: 'bake',\n cloudProvider: 'azure',\n label: 'Bake',\n description: 'Bakes an image',\n component: AzureBakeStageConfig,\n executionDetailsSections: [AzureBakeExecutionDetails as any, ExecutionDetailsTasks],\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage: any) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'package' },\n { type: 'requiredField', fieldName: 'regions' },\n {\n type: 'upstreamVersionProvided',\n checkParentTriggers: true,\n getMessage: (labels: string[]) =>\n 'Bake stages should always have a stage or trigger preceding them that provides version information: ' +\n '<ul>' +\n labels.map((label: string) => `<li>${label}</li>`).join('') +\n '</ul>' +\n 'Otherwise, Spinnaker will bake and deploy the most-recently built package.',\n },\n ] as any,\n restartable: true,\n } as any);\n}\n","import React from 'react';\n\nimport { AccountService, StageConfigField } from '@spinnaker/core';\n\ninterface IAzureAccountRegionClusterSelectorProps {\n application: any;\n stage: any;\n updateStageField: (changes: any) => void;\n onAccountUpdate?: (account: string) => void;\n}\n\ninterface IAzureAccountRegionClusterSelectorState {\n accounts: any[];\n freeFormClusterField: boolean;\n regions: string[];\n}\n\nfunction uniqueSorted(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean))).sort();\n}\n\nfunction regionName(region: any): string {\n if (typeof region === 'string') {\n return region;\n }\n if (region?.name) {\n return region.name;\n }\n\n const keys = Object.keys(region || {});\n return keys.length ? keys[0] : '';\n}\n\nexport class AzureAccountRegionClusterSelector extends React.Component<\n IAzureAccountRegionClusterSelectorProps,\n IAzureAccountRegionClusterSelectorState\n> {\n private mounted = false;\n\n public state: IAzureAccountRegionClusterSelectorState = {\n accounts: [],\n freeFormClusterField: false,\n regions: [],\n };\n\n public componentDidMount(): void {\n this.mounted = true;\n\n Promise.all([\n AccountService.listAccounts('azure'),\n AccountService.getUniqueAttributeForAllAccounts('azure', 'regions'),\n ])\n .then(([accounts, regions]) => {\n if (this.mounted) {\n this.setState({\n accounts,\n freeFormClusterField: this.selectedClusterIsCustom(),\n regions: uniqueSorted((regions || []).map(regionName)),\n });\n }\n })\n .catch(() => {});\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n }\n\n private serverGroups(): any[] {\n try {\n return this.props.application.getDataSource('serverGroups').data || [];\n } catch (_error) {\n return [];\n }\n }\n\n private accountOptions(): string[] {\n const accountNames = this.state.accounts.map((account) => account.name || account).filter(Boolean);\n return uniqueSorted([...accountNames, this.props.stage.credentials]);\n }\n\n private regionOptions(): string[] {\n const { credentials, regions = [] } = this.props.stage;\n const serverGroupRegions = this.serverGroups()\n .filter((serverGroup) => !credentials || serverGroup.account === credentials)\n .map((serverGroup) => serverGroup.region);\n\n const availableRegions = this.state.freeFormClusterField\n ? this.state.regions\n : serverGroupRegions.length\n ? serverGroupRegions\n : this.state.regions;\n\n return uniqueSorted([...availableRegions, ...regions]);\n }\n\n private clusterOptions(regionsOverride = this.props.stage.regions || []): string[] {\n const { credentials } = this.props.stage;\n const clusters = this.serverGroups()\n .filter((serverGroup) => !credentials || serverGroup.account === credentials)\n .filter((serverGroup) => !regionsOverride.length || regionsOverride.includes(serverGroup.region))\n .map((serverGroup) => serverGroup.cluster || serverGroup.moniker?.cluster);\n\n return uniqueSorted(clusters);\n }\n\n private selectedClusterIsCustom(): boolean {\n const cluster = this.props.stage.cluster;\n return !!cluster && !this.clusterOptions().includes(cluster);\n }\n\n private monikerForCluster(cluster: string): any {\n const serverGroup = this.serverGroups().find(\n (candidate) => candidate.cluster === cluster || candidate.moniker?.cluster === cluster,\n );\n return serverGroup?.moniker ? { ...serverGroup.moniker, sequence: null } : undefined;\n }\n\n private updateStageField(changes: any): void {\n Object.assign(this.props.stage, changes);\n this.props.updateStageField(changes);\n }\n\n private updateAccount(credentials: string): void {\n this.setState({ freeFormClusterField: false });\n this.updateStageField({ credentials, regions: [], cluster: undefined, moniker: undefined });\n this.props.onAccountUpdate?.(credentials);\n }\n\n private updateRegion(region: string, selected: boolean): void {\n const regions = new Set(this.props.stage.regions || []);\n selected ? regions.add(region) : regions.delete(region);\n const nextRegions = Array.from(regions);\n const selectedCluster = this.props.stage.cluster;\n const clusterStillAvailable =\n !selectedCluster || (!!nextRegions.length && this.clusterOptions(nextRegions).includes(selectedCluster));\n\n if (this.state.freeFormClusterField || clusterStillAvailable) {\n this.updateStageField({ regions: nextRegions });\n return;\n }\n\n this.updateStageField({ regions: nextRegions, cluster: undefined, moniker: undefined });\n }\n\n private updateCluster(cluster: string): void {\n this.setState({ freeFormClusterField: false });\n this.updateStageField({\n cluster: cluster || undefined,\n moniker: cluster ? this.monikerForCluster(cluster) : undefined,\n });\n }\n\n private updateFreeFormCluster(cluster: string): void {\n this.updateStageField({ cluster: cluster || undefined, moniker: undefined });\n }\n\n private toggleFreeFormClusterField(event: React.MouseEvent<HTMLAnchorElement>): void {\n event.preventDefault();\n const freeFormClusterField = !this.state.freeFormClusterField;\n this.setState({ freeFormClusterField });\n\n if (!freeFormClusterField) {\n this.updateStageField({ cluster: undefined, moniker: undefined });\n }\n }\n\n public render() {\n const stage = this.props.stage;\n const selectedRegions = stage.regions || [];\n\n return (\n <>\n <StageConfigField label=\"Account\">\n <select\n className=\"form-control input-sm\"\n name=\"credentials\"\n value={stage.credentials || ''}\n onChange={(event) => this.updateAccount(event.target.value)}\n >\n <option value=\"\" />\n {this.accountOptions().map((account) => (\n <option key={account} value={account}>\n {account}\n </option>\n ))}\n </select>\n </StageConfigField>\n <StageConfigField label=\"Regions\">\n {!stage.credentials && <p className=\"form-control-static\">(Select an Account)</p>}\n {stage.credentials &&\n this.regionOptions().map((region) => (\n <label className=\"checkbox-inline\" key={region}>\n <input\n checked={selectedRegions.includes(region)}\n name=\"regions\"\n type=\"checkbox\"\n value={region}\n onChange={(event) => this.updateRegion(region, event.target.checked)}\n />\n {region}\n </label>\n ))}\n </StageConfigField>\n <StageConfigField label=\"Cluster\" helpKey=\"pipeline.config.findAmi.cluster\">\n {this.state.freeFormClusterField ? (\n <input\n className=\"form-control input-sm\"\n name=\"cluster\"\n type=\"text\"\n value={stage.cluster || ''}\n onChange={(event) => this.updateFreeFormCluster(event.target.value)}\n />\n ) : (\n <select\n className=\"form-control input-sm\"\n name=\"cluster\"\n value={stage.cluster || ''}\n onChange={(event) => this.updateCluster(event.target.value)}\n >\n <option value=\"\" />\n {this.clusterOptions().map((cluster) => (\n <option key={cluster} value={cluster}>\n {cluster}\n </option>\n ))}\n </select>\n )}\n <div className=\"pull-right\">\n <a href=\"\" onClick={(event) => this.toggleFreeFormClusterField(event)}>\n {this.state.freeFormClusterField ? 'Toggle for list of existing clusters' : 'Toggle for text input'}\n </a>\n </div>\n </StageConfigField>\n </>\n );\n }\n}\n","import React from 'react';\n\nimport { AccountService, Registry, StageConfigField, StageConstants } from '@spinnaker/core';\n\nimport { AzureAccountRegionClusterSelector } from '../AzureAccountRegionClusterSelector';\n\nexport function AzureDestroyAsgExecutionLabel({ stage }: any) {\n const context = stage.masterStage?.context || stage.context || {};\n\n return (\n <span className=\"task-label\">\n {' '}\n Destroy Server Group: {context.serverGroupName} ({context.region}){' '}\n </span>\n );\n}\n\nexport class AzureDestroyAsgStageConfig extends React.Component<any> {\n private mounted = false;\n\n public componentDidMount(): void {\n this.mounted = true;\n this.applyDefaults();\n this.loadRegionForAccount(this.props.stage.credentials);\n }\n\n public componentDidUpdate(previousProps: any): void {\n if (previousProps.stage.credentials !== this.props.stage.credentials) {\n this.updateStageField({ regions: [] });\n this.loadRegionForAccount(this.props.stage.credentials);\n }\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n }\n\n private updateStageField = (changes: any): void => {\n Object.assign(this.props.stage, changes);\n this.props.updateStageField(changes);\n };\n\n private applyDefaults(): void {\n const { application, stage } = this.props;\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n stage.interestingHealthProviderNames = stage.interestingHealthProviderNames || [];\n\n if (!stage.credentials && application.defaultCredentials.azure) {\n stage.credentials = application.defaultCredentials.azure;\n }\n if (!stage.target) {\n stage.target = StageConstants.TARGET_LIST[0].val;\n }\n }\n\n private loadRegionForAccount(credentials: string): void {\n if (!credentials) {\n return;\n }\n\n AccountService.getAccountDetails(credentials)\n .then((details: any) => {\n if (this.mounted && this.props.stage.credentials === credentials && details?.org) {\n this.updateStageField({ regions: [details.org] });\n }\n })\n .catch(() => {});\n }\n\n private accountUpdated = (credentials: string): void => {\n this.loadRegionForAccount(credentials);\n };\n\n public render() {\n this.applyDefaults();\n const { application, pipeline, stage } = this.props;\n\n return (\n <div className=\"form-horizontal\">\n {!pipeline?.strategy && (\n <AzureAccountRegionClusterSelector\n application={application}\n stage={stage}\n updateStageField={this.updateStageField}\n onAccountUpdate={this.accountUpdated}\n />\n )}\n <StageConfigField label=\"Target\">\n <select\n className=\"form-control input-sm\"\n value={stage.target}\n onChange={(event) => this.updateStageField({ target: event.target.value })}\n >\n {StageConstants.TARGET_LIST.map((target: any) => (\n <option key={target.val} value={target.val}>\n {target.label}\n </option>\n ))}\n </select>\n </StageConfigField>\n </div>\n );\n }\n}\n\nexport function registerAzureDestroyAsgStage() {\n Registry.pipeline.registerStage({\n key: 'destroyServerGroup',\n provides: 'destroyServerGroup',\n cloudProvider: 'azure',\n component: AzureDestroyAsgStageConfig,\n executionLabelComponent: AzureDestroyAsgExecutionLabel,\n accountExtractor: (stage: any) => [stage.context.credentials],\n configAccountExtractor: (stage: any) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n } as any);\n}\n","import React from 'react';\n\nimport { PlatformHealthOverride, Registry, StageConfigField, StageConstants } from '@spinnaker/core';\n\nimport { AzureAccountRegionClusterSelector } from '../AzureAccountRegionClusterSelector';\n\nexport function AzureDisableAsgExecutionLabel({ stage }: any) {\n const context = stage.masterStage?.context || stage.context || {};\n\n return (\n <span className=\"task-label\">\n {' '}\n Disable Server Group: {context.serverGroupName} ({context.region}){' '}\n </span>\n );\n}\n\nexport function AzureDisableAsgStageConfig({ application, pipeline, stage, updateStageField }: any) {\n const updateStage = (changes: any) => {\n Object.assign(stage, changes);\n updateStageField(changes);\n };\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n if (\n stage.isNew &&\n application.attributes.platformHealthOnlyShowOverride &&\n stage.interestingHealthProviderNames === undefined\n ) {\n stage.interestingHealthProviderNames = [];\n }\n if (!stage.credentials && application.defaultCredentials.azure) {\n stage.credentials = application.defaultCredentials.azure;\n }\n if (!stage.regions.length && application.defaultRegions.azure) {\n stage.regions.push(application.defaultRegions.azure);\n }\n if (!stage.target) {\n stage.target = StageConstants.TARGET_LIST[0].val;\n }\n\n return (\n <div className=\"form-horizontal\">\n {!pipeline?.strategy && (\n <AzureAccountRegionClusterSelector application={application} stage={stage} updateStageField={updateStage} />\n )}\n <StageConfigField label=\"Target\">\n <select\n className=\"form-control input-sm\"\n value={stage.target}\n onChange={(e) => updateStage({ target: e.target.value })}\n >\n {StageConstants.TARGET_LIST.map((target: any) => (\n <option key={target.val} value={target.val}>\n {target.label}\n </option>\n ))}\n </select>\n </StageConfigField>\n {application.attributes.platformHealthOnlyShowOverride && (\n <PlatformHealthOverride\n interestingHealthProviderNames={stage.interestingHealthProviderNames || []}\n platformHealthType=\"azureService\"\n onChange={(interestingHealthProviderNames) => updateStage({ interestingHealthProviderNames })}\n />\n )}\n </div>\n );\n}\n\nexport function registerAzureDisableAsgStage() {\n Registry.pipeline.registerStage({\n key: 'disableServerGroup',\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'azure',\n component: AzureDisableAsgStageConfig,\n executionLabelComponent: AzureDisableAsgExecutionLabel,\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n } as any);\n}\n","import React from 'react';\n\nimport { PlatformHealthOverride, Registry, StageConfigField, StageConstants } from '@spinnaker/core';\n\nimport { AzureAccountRegionClusterSelector } from '../AzureAccountRegionClusterSelector';\n\nexport function AzureEnableAsgExecutionLabel({ stage }: any) {\n const context = stage.masterStage?.context || stage.context || {};\n\n return (\n <span className=\"task-label\">\n {' '}\n Enable Server Group: {context.serverGroupName} ({context.region}){' '}\n </span>\n );\n}\n\nexport function AzureEnableAsgStageConfig({ application, pipeline, stage, updateStageField }: any) {\n const updateStage = (changes: any) => {\n Object.assign(stage, changes);\n updateStageField(changes);\n };\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n if (\n stage.isNew &&\n application.attributes.platformHealthOnlyShowOverride &&\n stage.interestingHealthProviderNames === undefined\n ) {\n stage.interestingHealthProviderNames = [];\n }\n if (!stage.credentials && application.defaultCredentials.azure) {\n stage.credentials = application.defaultCredentials.azure;\n }\n if (!stage.regions.length && application.defaultRegions.azure) {\n stage.regions.push(application.defaultRegions.azure);\n }\n if (!stage.target) {\n stage.target = StageConstants.TARGET_LIST[0].val;\n }\n\n return (\n <div className=\"form-horizontal\">\n {!pipeline?.strategy && (\n <AzureAccountRegionClusterSelector application={application} stage={stage} updateStageField={updateStage} />\n )}\n <StageConfigField label=\"Target\">\n <select\n className=\"form-control input-sm\"\n value={stage.target}\n onChange={(e) => updateStage({ target: e.target.value })}\n >\n {StageConstants.TARGET_LIST.map((target: any) => (\n <option key={target.val} value={target.val}>\n {target.label}\n </option>\n ))}\n </select>\n </StageConfigField>\n {application.attributes.platformHealthOnlyShowOverride && (\n <PlatformHealthOverride\n interestingHealthProviderNames={stage.interestingHealthProviderNames || []}\n platformHealthType=\"azureService\"\n onChange={(interestingHealthProviderNames) => updateStage({ interestingHealthProviderNames })}\n />\n )}\n </div>\n );\n}\n\nexport function registerAzureEnableAsgStage() {\n Registry.pipeline.registerStage({\n key: 'enableServerGroup',\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'azure',\n component: AzureEnableAsgStageConfig,\n executionLabelComponent: AzureEnableAsgExecutionLabel,\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n } as any);\n}\n","import { FirewallLabels, InfrastructureCaches, TaskExecutor } from '@spinnaker/core';\nimport type { Application, ISecurityGroup, ITask } from '@spinnaker/core';\n\ntype AzureSecurityGroupCommand = Record<string, any>;\n\nfunction getSecurityGroupAccount(securityGroup: ISecurityGroup & AzureSecurityGroupCommand): string {\n return securityGroup.accountId || securityGroup.account || securityGroup.accountName || securityGroup.credentials;\n}\n\nexport function buildUpsertCommand(\n securityGroup: ISecurityGroup & AzureSecurityGroupCommand,\n params: AzureSecurityGroupCommand = {},\n): AzureSecurityGroupCommand {\n return {\n ...securityGroup,\n ...params,\n securityGroupName: securityGroup.name,\n };\n}\n\nexport function buildDeleteCommand(\n securityGroup: ISecurityGroup & AzureSecurityGroupCommand,\n application: Application,\n params: AzureSecurityGroupCommand = {},\n): AzureSecurityGroupCommand {\n return {\n ...params,\n type: 'deleteSecurityGroup',\n securityGroupName: securityGroup.name,\n regions: [securityGroup.region],\n credentials: getSecurityGroupAccount(securityGroup),\n appName: application.name,\n };\n}\n\nexport const AzureSecurityGroupWriter = {\n upsertSecurityGroup(\n securityGroup: ISecurityGroup & AzureSecurityGroupCommand,\n application: Application,\n descriptor: string,\n params: AzureSecurityGroupCommand = {},\n ): Promise<ITask> {\n const command = buildUpsertCommand(securityGroup, params);\n\n const operation = TaskExecutor.executeTask({\n job: [command],\n application,\n description: `${descriptor} ${FirewallLabels.get('Firewall')}: ${securityGroup.name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroups');\n\n return operation;\n },\n\n deleteSecurityGroup(\n securityGroup: ISecurityGroup & AzureSecurityGroupCommand,\n application: Application,\n params: AzureSecurityGroupCommand = {},\n ): Promise<ITask> {\n const command = buildDeleteCommand(securityGroup, application, params);\n\n const operation = TaskExecutor.executeTask({\n job: [command],\n application,\n description: `Delete ${FirewallLabels.get('Firewalls')}: ${securityGroup.name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroups');\n\n return operation;\n },\n};\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport type { Application, IModalComponentProps, IRouterInjectedProps, ISecurityGroup } from '@spinnaker/core';\nimport {\n AccountService,\n ModalClose,\n NetworkReader,\n noop,\n ReactModal,\n SubmitButton,\n TaskMonitor,\n TaskMonitorWrapper,\n withRouter,\n} from '@spinnaker/core';\n\nimport { AzureSecurityGroupWriter } from '../securityGroup.write.service';\n\nexport type AzureSecurityGroupModalMode = 'create' | 'edit' | 'clone';\n\ninterface IAzureSecurityGroupModalProps extends IModalComponentProps {\n app?: Application;\n application?: Application;\n credentials?: string;\n mode: AzureSecurityGroupModalMode;\n region?: string;\n securityGroup?: any;\n}\n\ninterface IAzureSecurityGroupModalState {\n accounts: any[];\n regions: any[];\n securityGroup: any;\n selectedSubnets: IAzureSubnet[];\n selectedVnets: IAzureVnet[];\n taskMonitor: TaskMonitor;\n}\n\ninterface IAzureVnet {\n account: string;\n name: string;\n region: string;\n resourceGroup?: string;\n subnets?: IAzureSubnet[];\n}\n\ninterface IAzureSubnet {\n name: string;\n}\n\nconst defaultRule = {\n access: 'Allow',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [] as string[],\n destinationPorts: ['*'],\n destPortRanges: '*',\n direction: 'Inbound',\n protocol: 'Tcp',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [] as string[],\n sourceCidrs: ['*'],\n sourceIPCIDRRanges: '*',\n sourcePortRange: '*',\n};\n\nfunction parseDelimitedList(value: any): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item).trim()).filter(Boolean);\n }\n if (value === null || value === undefined || value === '') {\n return [];\n }\n return String(value)\n .split(/[\\n,]+/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction firstPopulatedList(values: any[], fallback: string[] = []): string[] {\n for (const value of values) {\n const parsed = parseDelimitedList(value);\n if (parsed.length) {\n return parsed;\n }\n }\n return fallback;\n}\n\nfunction hasOwnProperty(value: any, property: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction destinationPortsForRule(rule: any, fallback: string[] = []): string[] {\n if (hasOwnProperty(rule, 'destinationPorts')) {\n return parseDelimitedList(rule.destinationPorts);\n }\n\n return firstPopulatedList(\n [rule.destPortRanges, rule.destinationPortRanges, rule.destinationPortRange, rule.destinationPortRangeModel],\n fallback,\n );\n}\n\nfunction sourceCidrsForRule(rule: any, fallback: string[] = []): string[] {\n if (hasOwnProperty(rule, 'sourceCidrs')) {\n return parseDelimitedList(rule.sourceCidrs);\n }\n\n return firstPopulatedList(\n [rule.sourceIPCIDRRanges, rule.sourceAddressPrefixes, rule.sourceAddressPrefix, rule.sourceAddressPrefixModel],\n fallback,\n );\n}\n\nfunction isValidPortRange(value: string): boolean {\n if (value === '*') {\n return true;\n }\n\n const bounds = value.split('-');\n if (bounds.length > 2) {\n return false;\n }\n\n const ports = bounds.map((bound) => {\n if (!/^\\d+$/.test(bound)) {\n return null;\n }\n const port = Number(bound);\n return port >= 0 && port <= 65535 ? port : null;\n });\n if (ports.some((port) => port === null)) {\n return false;\n }\n\n return bounds.length === 1 || (ports[0] as number) <= (ports[1] as number);\n}\n\nfunction isValidSourceCidr(value: string): boolean {\n if (value === '*') {\n return true;\n }\n\n const match = value.match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})(?:\\/(\\d{1,2}))?$/);\n if (!match) {\n return false;\n }\n\n const octets = match.slice(1, 5).map(Number);\n const prefix = match[5] ? Number(match[5]) : null;\n return octets.every((octet) => octet >= 0 && octet <= 255) && (prefix === null || (prefix >= 0 && prefix <= 32));\n}\n\nfunction buildAzureSecurityGroupName(applicationName: string, detail: any): string {\n const detailText = String(detail || '').trim();\n return detailText ? `${applicationName}-${detailText}` : applicationName;\n}\n\nfunction detailFromSecurityGroupName(name: string, applicationName: string): string {\n const prefix = `${applicationName}-`;\n return name?.startsWith(prefix) ? name.slice(prefix.length) : '';\n}\n\nfunction securityGroupAccount(securityGroup: any): string {\n return String(\n securityGroup.accountId || securityGroup.account || securityGroup.accountName || securityGroup.credentials || '',\n );\n}\n\nfunction matchesDefinedCoordinate(left: any, right: any): boolean {\n if (!left || !right) {\n return true;\n }\n return String(left).toLowerCase() === String(right).toLowerCase();\n}\n\nfunction getExistingSecurityGroups(application?: Application): any[] {\n const securityGroups = application?.securityGroups?.data || application?.getDataSource?.('securityGroups')?.data;\n return Array.isArray(securityGroups) ? securityGroups : [];\n}\n\nfunction isDuplicateSecurityGroupName(securityGroup: any, application?: Application): boolean {\n const name = String(securityGroup.name || '').toLowerCase();\n const account = securityGroupAccount(securityGroup);\n const region = securityGroup.region;\n\n if (!name || !account) {\n return false;\n }\n\n return getExistingSecurityGroups(application).some((existingSecurityGroup) => {\n return (\n String(existingSecurityGroup.name || '').toLowerCase() === name &&\n matchesDefinedCoordinate(securityGroupAccount(existingSecurityGroup), account) &&\n matchesDefinedCoordinate(existingSecurityGroup.region, region)\n );\n });\n}\n\nexport function isAzureSecurityGroupValid(\n securityGroup: any,\n mode: AzureSecurityGroupModalMode = 'edit',\n application?: Application,\n): boolean {\n if (!securityGroup.name || !securityGroup.accountId || !securityGroup.region) {\n return false;\n }\n\n if (mode !== 'edit') {\n if (!String(securityGroup.detail || '').trim()) {\n return false;\n }\n if (isDuplicateSecurityGroupName(securityGroup, application)) {\n return false;\n }\n }\n\n return (securityGroup.securityRules || []).every((rule: any) => {\n const destinationPorts = destinationPortsForRule(rule);\n const sourceCidrs = sourceCidrsForRule(rule);\n\n return (\n destinationPorts.length > 0 &&\n sourceCidrs.length > 0 &&\n destinationPorts.every(isValidPortRange) &&\n sourceCidrs.every(isValidSourceCidr)\n );\n });\n}\n\nfunction cloneRule(rule: any): any {\n const destinationPorts = destinationPortsForRule(rule, defaultRule.destinationPorts);\n const sourceCidrs = sourceCidrsForRule(rule, defaultRule.sourceCidrs);\n\n return {\n ...defaultRule,\n ...rule,\n destinationPortRangeModel: rule.destinationPortRangeModel || destinationPorts.join(','),\n destinationPorts,\n destPortRanges: rule.destPortRanges || destinationPorts.join(','),\n sourceAddressPrefixModel: rule.sourceAddressPrefixModel || sourceCidrs.join(','),\n sourceCidrs,\n sourceIPCIDRRanges: rule.sourceIPCIDRRanges || sourceCidrs.join(','),\n };\n}\n\nfunction normalizePriorities(rules: any[]): any[] {\n return rules.map((rule, index) => ({ ...rule, priority: 100 + index }));\n}\n\nexport function addSecurityRule(rules: any[]): any[] {\n return normalizePriorities([...rules, { ...defaultRule, name: `rule-${rules.length + 1}` }]);\n}\n\nexport function removeSecurityRule(rules: any[], index: number): any[] {\n return normalizePriorities(rules.filter((_rule, ruleIndex) => ruleIndex !== index));\n}\n\nexport function moveSecurityRule(rules: any[], fromIndex: number, toIndex: number): any[] {\n const nextRules = [...rules];\n const [rule] = nextRules.splice(fromIndex, 1);\n nextRules.splice(toIndex, 0, rule);\n return normalizePriorities(nextRules);\n}\n\nexport function normalizeAzureSecurityGroupForSubmit(securityGroup: ISecurityGroup & Record<string, any>): any {\n return {\n ...securityGroup,\n type: 'upsertSecurityGroup',\n securityRules: (securityGroup.securityRules || []).map((rule: any, index: number) => {\n const normalized = {\n ...rule,\n priority: rule.priority ?? 100 + index,\n };\n const destinationPorts = destinationPortsForRule(rule);\n const sourceCidrs = sourceCidrsForRule(rule);\n\n delete normalized.destinationPorts;\n delete normalized.destPortRanges;\n delete normalized.sourceCidrs;\n delete normalized.sourceIPCIDRRanges;\n delete normalized.destinationPortRange;\n delete normalized.destinationPortRanges;\n delete normalized.destinationPortRangeModel;\n delete normalized.sourceAddressPrefix;\n delete normalized.sourceAddressPrefixes;\n delete normalized.sourceAddressPrefixModel;\n\n if (destinationPorts.length > 1) {\n normalized.destinationPortRanges = destinationPorts;\n } else if (destinationPorts.length === 1) {\n normalized.destinationPortRange = destinationPorts[0];\n }\n\n if (sourceCidrs.length > 1) {\n normalized.sourceAddressPrefixes = sourceCidrs;\n } else if (sourceCidrs.length === 1) {\n normalized.sourceAddressPrefix = sourceCidrs[0];\n }\n\n return normalized;\n }),\n };\n}\n\nexport function getAzureVnetSelectValue(vnet: IAzureVnet): string {\n return `${vnet.name}|${vnet.resourceGroup || ''}`;\n}\n\nfunction getAzureVnetSelectLabel(vnet: IAzureVnet): string {\n return vnet.resourceGroup ? `${vnet.name} (${vnet.resourceGroup})` : vnet.name;\n}\n\nfunction findAzureVnetBySelectValue(vnets: IAzureVnet[], value: string): IAzureVnet | null {\n return vnets.find((vnet) => getAzureVnetSelectValue(vnet) === value) || null;\n}\n\nexport function initializeAzureSecurityGroupForModal(\n props: IAzureSecurityGroupModalProps,\n applicationName: string,\n): any {\n const source = props.securityGroup || {};\n const selectedVnet = source.selectedVnet || null;\n const selectedSubnet = source.selectedSubnet || null;\n const accountId =\n source.accountId || source.account || source.accountName || source.credentials || props.credentials || '';\n const region = source.region || props.region || source.regions?.[0] || '';\n const detail = source.detail || detailFromSecurityGroupName(source.name, applicationName);\n const securityGroup = {\n ...source,\n accountId,\n credentials: source.credentials || accountId,\n detail,\n name:\n props.mode === 'edit'\n ? source.name || buildAzureSecurityGroupName(applicationName, detail)\n : buildAzureSecurityGroupName(applicationName, detail),\n region,\n securityRules: (source.securityRules || source.inboundRules || []).map(cloneRule),\n selectedSubnet,\n selectedVnet,\n subnet: source.subnet || selectedSubnet?.name || '',\n vnet: source.vnet || selectedVnet?.name || '',\n vnetResourceGroup: source.vnetResourceGroup || selectedVnet?.resourceGroup || '',\n vpcId: source.vpcId || '',\n };\n\n if (props.mode === 'clone') {\n delete securityGroup.id;\n }\n\n return securityGroup;\n}\n\nexport class AzureSecurityGroupModalComponent extends React.Component<\n IAzureSecurityGroupModalProps & IRouterInjectedProps,\n IAzureSecurityGroupModalState\n> {\n public static defaultProps: Partial<IAzureSecurityGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n mode: 'create',\n };\n\n public static show(props: IAzureSecurityGroupModalProps): Promise<any> {\n return ReactModal.show(AzureSecurityGroupModal, props, { dialogClassName: 'modal-lg' });\n }\n\n private mounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n\n constructor(props: IAzureSecurityGroupModalProps & IRouterInjectedProps) {\n super(props);\n const application = this.getApplication(props);\n this.state = {\n accounts: [],\n regions: [],\n securityGroup: initializeAzureSecurityGroupForModal(props, application.name),\n selectedSubnets: props.securityGroup?.selectedVnet?.subnets || [],\n selectedVnets: props.securityGroup?.selectedVnet ? [props.securityGroup.selectedVnet] : [],\n taskMonitor: new TaskMonitor({\n application,\n title: `${props.mode === 'edit' ? 'Updating' : 'Creating'} your security group`,\n onDismiss: () => props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n public componentDidMount(): void {\n this.mounted = true;\n AccountService.listAccounts('azure').then((accounts) => this.setState({ accounts }));\n if (this.state.securityGroup.accountId || this.state.securityGroup.credentials) {\n this.accountUpdated(false);\n } else if (this.state.securityGroup.region) {\n this.vnetUpdated();\n }\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n this.clearApplicationRefreshSubscription();\n }\n\n private getApplication(props = this.props): Application {\n return (props.app || props.application) as Application;\n }\n\n public onTaskComplete = (): void => {\n const application = this.getApplication();\n\n if (this.props.mode === 'edit') {\n application.securityGroups?.refresh?.();\n this.props.closeModal();\n return;\n }\n\n const showNewSecurityGroup = (): void => {\n this.clearApplicationRefreshSubscription();\n if (!this.mounted) {\n return;\n }\n const { securityGroup } = this.state;\n this.props.closeModal();\n this.props.stateService.go(\n this.props.stateService.includes('**.firewallDetails') ? '^.firewallDetails' : '.firewallDetails',\n {\n accountId: securityGroup.credentials || securityGroup.accountId || securityGroup.accountName,\n name: securityGroup.name,\n provider: 'azure',\n region: securityGroup.region,\n vpcId: securityGroup.vpcId,\n },\n );\n };\n\n if (application.securityGroups?.onNextRefresh) {\n this.clearApplicationRefreshSubscription();\n this.applicationRefreshUnsubscribe = application.securityGroups.onNextRefresh(showNewSecurityGroup);\n application.securityGroups.refresh?.();\n } else {\n application.securityGroups?.refresh?.();\n showNewSecurityGroup();\n }\n };\n\n private clearApplicationRefreshSubscription = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n };\n\n private updateSecurityGroup(values: any, callback?: () => void): void {\n this.setState((state) => ({ securityGroup: { ...state.securityGroup, ...values } }), callback);\n }\n\n private updateField = (field: string, value: string): void => {\n if (field === 'detail') {\n this.updateSecurityGroup({ detail: value, name: buildAzureSecurityGroupName(this.getApplication().name, value) });\n return;\n }\n\n this.updateSecurityGroup(\n { [field]: value },\n field === 'accountId' ? this.accountUpdated : field === 'region' ? this.vnetUpdated : undefined,\n );\n };\n\n public accountUpdated = (clearNetworkSelections = true): void => {\n const account = this.state.securityGroup.accountId || this.state.securityGroup.credentials;\n if (!account) {\n return;\n }\n\n AccountService.getRegionsForAccount(account).then((regions) => {\n const region = this.state.securityGroup.region || regions[0]?.name || regions[0] || '';\n this.setState(\n (state) => ({\n regions,\n securityGroup: { ...state.securityGroup, accountId: account, credentials: account, region },\n }),\n () => this.vnetUpdated(clearNetworkSelections),\n );\n });\n };\n\n public vnetUpdated = (clearNetworkSelections = true): void => {\n const account = this.state.securityGroup.accountId || this.state.securityGroup.credentials;\n const region = this.state.securityGroup.region;\n if (clearNetworkSelections) {\n this.setState((state) => ({\n securityGroup: {\n ...state.securityGroup,\n selectedSubnet: null,\n selectedVnet: null,\n subnet: null,\n vnet: null,\n vnetResourceGroup: null,\n vpcId: null,\n },\n selectedSubnets: [],\n selectedVnets: [],\n }));\n }\n\n if (!account || !region) {\n return;\n }\n\n NetworkReader.listNetworks().then((networks: any) => {\n const azureNetworks = Array.isArray(networks) ? networks : networks.azure || [];\n this.setState({\n selectedVnets: azureNetworks.filter((vnet: IAzureVnet) => vnet.account === account && vnet.region === region),\n });\n });\n };\n\n private selectedVnetChanged = (vnetValue: string): void => {\n const selectedVnet = findAzureVnetBySelectValue(this.state.selectedVnets, vnetValue);\n this.setState((state) => ({\n securityGroup: {\n ...state.securityGroup,\n selectedSubnet: null,\n selectedVnet,\n subnet: '',\n vnet: selectedVnet?.name || '',\n vnetResourceGroup: selectedVnet?.resourceGroup || '',\n vpcId: selectedVnet?.name || '',\n },\n selectedSubnets: selectedVnet?.subnets || [],\n }));\n };\n\n private selectedSubnetChanged = (subnetName: string): void => {\n const selectedSubnet = this.state.selectedSubnets.find((subnet) => subnet.name === subnetName) || null;\n this.updateSecurityGroup({ selectedSubnet, subnet: selectedSubnet?.name || '' });\n };\n\n private updateRule = (index: number, field: string, value: any): void => {\n const securityRules = [...(this.state.securityGroup.securityRules || [])];\n securityRules[index] = { ...securityRules[index], [field]: value };\n this.updateSecurityGroup({ securityRules });\n };\n\n private addRule = (): void => {\n this.updateSecurityGroup({ securityRules: addSecurityRule(this.state.securityGroup.securityRules || []) });\n };\n\n private removeRule = (index: number): void => {\n this.updateSecurityGroup({\n securityRules: removeSecurityRule(this.state.securityGroup.securityRules || [], index),\n });\n };\n\n private moveRule = (index: number, offset: number): void => {\n this.updateSecurityGroup({\n securityRules: moveSecurityRule(this.state.securityGroup.securityRules || [], index, index + offset),\n });\n };\n\n public submit(): void {\n const application = this.getApplication();\n const securityGroup = normalizeAzureSecurityGroupForSubmit(this.state.securityGroup);\n const descriptor = this.props.mode === 'edit' ? 'Update' : this.props.mode === 'clone' ? 'Clone' : 'Create';\n const params = {\n appName: application.name,\n cloudProvider: 'azure',\n credentials: securityGroup.accountId,\n region: securityGroup.region,\n regions: [securityGroup.region],\n securityGroupName: securityGroup.name,\n subnet: securityGroup.subnet || null,\n vpcId: securityGroup.vpcId || 'null',\n };\n\n this.state.taskMonitor.submit(() =>\n AzureSecurityGroupWriter.upsertSecurityGroup(securityGroup, application, descriptor, params),\n );\n }\n\n private renderInput(label: string, field: string) {\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n value={this.state.securityGroup[field] || ''}\n onChange={(e) => this.updateField(field, e.target.value)}\n />\n </div>\n </div>\n );\n }\n\n private renderSelect(\n label: string,\n value: string,\n values: any[],\n onChange: (value: string) => void,\n getLabel = (item: any) => item.name || item,\n getValue = getLabel,\n ) {\n return (\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">{label}</label>\n <div className=\"col-md-7\">\n <select className=\"form-control input-sm\" value={value || ''} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">Select...</option>\n {values.map((item) => (\n <option key={getValue(item)} value={getValue(item)}>\n {getLabel(item)}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n }\n\n private renderNamePreview(duplicateName: boolean) {\n return (\n <div className=\"form-group\">\n <div className={`col-md-12 well ${duplicateName ? 'alert-danger' : 'alert-info'}`}>\n <strong>Your security group will be named:</strong> <span>{this.state.securityGroup.name}</span>\n {duplicateName && <div>There is already a security group with that name in this account and region.</div>}\n </div>\n </div>\n );\n }\n\n public render() {\n const { dismissModal, mode } = this.props;\n const { accounts, regions, securityGroup, selectedSubnets, selectedVnets, taskMonitor } = this.state;\n const submitting = taskMonitor.submitting;\n const title =\n mode === 'edit'\n ? `Edit ${securityGroup.name}`\n : mode === 'clone'\n ? `Clone ${securityGroup.name}`\n : 'Create Security Group';\n const showLocationFields = mode !== 'edit';\n const duplicateName = showLocationFields && isDuplicateSecurityGroupName(securityGroup, this.getApplication());\n\n return (\n <>\n <TaskMonitorWrapper monitor={taskMonitor} />\n <ModalClose dismiss={dismissModal} />\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\" onSubmit={(e) => e.preventDefault()}>\n {showLocationFields && (\n <>\n {this.renderNamePreview(duplicateName)}\n {this.renderInput('Detail', 'detail')}\n {this.renderInput('Description', 'description')}\n {this.renderSelect(\n 'Account',\n securityGroup.accountId,\n accounts,\n (value) => this.updateField('accountId', value),\n (item) => item.name || item,\n )}\n {this.renderSelect(\n 'Region',\n securityGroup.region,\n regions,\n (value) => this.updateField('region', value),\n (item) => item.name || item,\n )}\n {this.renderSelect(\n 'VNet',\n securityGroup.selectedVnet ? getAzureVnetSelectValue(securityGroup.selectedVnet) : '',\n selectedVnets,\n this.selectedVnetChanged,\n getAzureVnetSelectLabel,\n getAzureVnetSelectValue,\n )}\n {this.renderSelect(\n 'Subnet',\n securityGroup.selectedSubnet?.name || securityGroup.subnet,\n selectedSubnets,\n this.selectedSubnetChanged,\n )}\n </>\n )}\n <h4>Inbound Rules</h4>\n {(securityGroup.securityRules || []).map((rule: any, index: number) => (\n <div className=\"well\" key={index}>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Name</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n value={rule.name || ''}\n onChange={(e) => this.updateRule(index, 'name', e.target.value)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Source CIDRs</label>\n <div className=\"col-md-7\">\n <textarea\n className=\"form-control input-sm\"\n value={(rule.sourceCidrs || []).join(', ')}\n onChange={(e) => this.updateRule(index, 'sourceCidrs', parseDelimitedList(e.target.value))}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Destination Ports</label>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n value={(rule.destinationPorts || []).join(', ')}\n onChange={(e) => this.updateRule(index, 'destinationPorts', parseDelimitedList(e.target.value))}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"col-md-3 control-label\">Protocol</label>\n <div className=\"col-md-3\">\n <select\n className=\"form-control input-sm\"\n value={rule.protocol || 'Tcp'}\n onChange={(e) => this.updateRule(index, 'protocol', e.target.value)}\n >\n <option value=\"Tcp\">Tcp</option>\n <option value=\"Udp\">Udp</option>\n <option value=\"*\">Any</option>\n </select>\n </div>\n </div>\n <button\n className=\"btn btn-link\"\n disabled={index === 0}\n type=\"button\"\n onClick={() => this.moveRule(index, -1)}\n >\n Move Up\n </button>\n <button\n className=\"btn btn-link\"\n disabled={index === securityGroup.securityRules.length - 1}\n type=\"button\"\n onClick={() => this.moveRule(index, 1)}\n >\n Move Down\n </button>\n <button className=\"btn btn-link\" type=\"button\" onClick={() => this.removeRule(index)}>\n Remove Rule\n </button>\n </div>\n ))}\n <button className=\"btn btn-default\" type=\"button\" onClick={this.addRule}>\n Add Rule\n </button>\n </form>\n </Modal.Body>\n <Modal.Footer>\n <button className=\"btn btn-default\" disabled={submitting} onClick={dismissModal} type=\"button\">\n Cancel\n </button>\n <SubmitButton\n isDisabled={submitting || !isAzureSecurityGroupValid(securityGroup, mode, this.getApplication())}\n isNew={mode !== 'edit'}\n label={mode === 'edit' ? 'Update' : mode === 'clone' ? 'Clone' : 'Create'}\n onClick={() => this.submit()}\n submitting={submitting}\n />\n </Modal.Footer>\n </>\n );\n }\n}\n\nexport const AzureSecurityGroupModal = Object.assign(\n withRouter<IAzureSecurityGroupModalProps & IRouterInjectedProps>(AzureSecurityGroupModalComponent),\n { show: AzureSecurityGroupModalComponent.show },\n);\n","import React from 'react';\nimport { Dropdown, MenuItem } from 'react-bootstrap';\n\nimport type {\n Application,\n IOverridableProps,\n IRouterInjectedProps,\n ISecurityGroupDetail,\n SecurityGroupReader,\n} from '@spinnaker/core';\nimport {\n AccountTag,\n CollapsibleSection,\n ConfirmationModalService,\n DeckRuntimeContext,\n withRouter,\n} from '@spinnaker/core';\n\nimport { AzureSecurityGroupModal } from '../configure/AzureSecurityGroupModal';\nimport { AzureSecurityGroupWriter } from '../securityGroup.write.service';\n\ninterface IAzureResolvedSecurityGroup {\n accountId?: string;\n name: string;\n provider?: string;\n region: string;\n vpcId?: string;\n}\n\ninterface IAzureSecurityGroupDetailsProps extends IOverridableProps {\n app: Application;\n autoClose?: () => void;\n resolvedSecurityGroup: IAzureResolvedSecurityGroup;\n securityGroupReader?: SecurityGroupReader;\n}\n\ninterface IAzureSecurityGroupDetailsState {\n loading: boolean;\n securityGroup?: ISecurityGroupDetail & Record<string, any>;\n}\n\ninterface IAzureSecurityGroupSectionProps {\n securityGroup: ISecurityGroupDetail & Record<string, any>;\n}\n\nexport class AzureSecurityGroupDetailsComponent extends React.Component<\n IAzureSecurityGroupDetailsProps & IRouterInjectedProps,\n IAzureSecurityGroupDetailsState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public state: IAzureSecurityGroupDetailsState = { loading: true };\n\n private isUnmounted = false;\n private loadRequestId = 0;\n private unsubscribeFromRefresh: () => void;\n\n public componentDidMount(): void {\n const dataSource = this.props.app.getDataSource?.('securityGroups');\n if (!dataSource) {\n this.loadSecurityGroup();\n return;\n }\n\n dataSource.ready().then(() => {\n if (this.isUnmounted) {\n return;\n }\n this.loadSecurityGroup();\n this.unsubscribeFromRefresh = dataSource.onRefresh(this.loadSecurityGroup);\n });\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n if (this.unsubscribeFromRefresh) {\n this.unsubscribeFromRefresh();\n }\n }\n\n public componentDidUpdate(prevProps: IAzureSecurityGroupDetailsProps): void {\n if (this.getCoordinatesKey(prevProps) !== this.getCoordinatesKey(this.props)) {\n this.loadSecurityGroup();\n }\n }\n\n private getCoordinatesKey(props: IAzureSecurityGroupDetailsProps): string {\n const { accountId, name, region, vpcId } = props.resolvedSecurityGroup;\n return [accountId, region, vpcId || '', name].join(':');\n }\n\n private getSecurityGroupReader(): SecurityGroupReader {\n return this.props.securityGroupReader || this.context.services.securityGroupReader;\n }\n\n private loadSecurityGroup = (): void => {\n const { app, resolvedSecurityGroup } = this.props;\n const requestId = ++this.loadRequestId;\n this.setState({ loading: true });\n this.getSecurityGroupReader()\n .getSecurityGroupDetails(\n app,\n resolvedSecurityGroup.accountId,\n 'azure',\n resolvedSecurityGroup.region,\n resolvedSecurityGroup.vpcId || '',\n resolvedSecurityGroup.name,\n )\n .then((securityGroup: ISecurityGroupDetail & Record<string, any>) => {\n if (this.isUnmounted || requestId !== this.loadRequestId) {\n return;\n }\n if (!securityGroup || Object.keys(securityGroup).length === 0) {\n this.autoClose();\n return;\n }\n this.setState({ loading: false, securityGroup });\n })\n .catch(() => {\n if (requestId === this.loadRequestId) {\n this.autoClose();\n }\n });\n };\n\n private autoClose = (): void => {\n if (this.isUnmounted) {\n return;\n }\n if (this.props.autoClose) {\n this.props.autoClose();\n return;\n }\n this.props.stateService.go('^');\n };\n\n private closeDetails = (): void => {\n this.props.stateService.go('^');\n };\n\n public render(): JSX.Element {\n const { app } = this.props;\n const { loading, securityGroup } = this.state;\n\n if (loading || !securityGroup) {\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <a className=\"btn btn-link\" onClick={this.closeDetails}>\n <span className=\"glyphicon glyphicon-remove\" />\n </a>\n </div>\n <h4 className=\"text-center\">Loading...</h4>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <a className=\"btn btn-link\" onClick={this.closeDetails}>\n <span className=\"glyphicon glyphicon-remove\" />\n </a>\n </div>\n <div className=\"header-text horizontal middle\">\n <h3>{securityGroup.name}</h3>\n </div>\n <div className=\"actions\">\n <AzureSecurityGroupActions\n app={app}\n resolvedSecurityGroup={this.props.resolvedSecurityGroup}\n securityGroup={securityGroup}\n />\n </div>\n </div>\n <div className=\"content\">\n <AzureSecurityGroupInformationSection securityGroup={securityGroup} />\n <AzureSecurityGroupRulesSection securityGroup={securityGroup} />\n </div>\n </div>\n );\n }\n}\n\nexport const AzureSecurityGroupDetails = withRouter(AzureSecurityGroupDetailsComponent);\n\nfunction withResolvedCoordinates(securityGroup: any, resolvedSecurityGroup?: IAzureResolvedSecurityGroup): any {\n if (!resolvedSecurityGroup) {\n return securityGroup;\n }\n\n const accountId =\n securityGroup.accountId ||\n securityGroup.account ||\n securityGroup.accountName ||\n securityGroup.credentials ||\n resolvedSecurityGroup.accountId;\n const name = securityGroup.name || resolvedSecurityGroup.name;\n const region = securityGroup.region || resolvedSecurityGroup.region;\n const vpcId = securityGroup.vpcId || resolvedSecurityGroup.vpcId;\n\n if (\n accountId === securityGroup.accountId &&\n name === securityGroup.name &&\n region === securityGroup.region &&\n vpcId === securityGroup.vpcId\n ) {\n return securityGroup;\n }\n\n return { ...securityGroup, accountId, name, region, vpcId };\n}\n\nexport function AzureSecurityGroupActions({\n app,\n resolvedSecurityGroup,\n securityGroup,\n}: {\n app: Application;\n resolvedSecurityGroup?: IAzureResolvedSecurityGroup;\n securityGroup: any;\n}) {\n const securityGroupWithCoordinates = withResolvedCoordinates(securityGroup, resolvedSecurityGroup);\n const editSecurityGroup = (): void => {\n AzureSecurityGroupModal.show({ app, mode: 'edit', securityGroup: securityGroupWithCoordinates });\n };\n const cloneSecurityGroup = (): void => {\n AzureSecurityGroupModal.show({ app, mode: 'clone', securityGroup: securityGroupWithCoordinates });\n };\n const deleteSecurityGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really delete ${securityGroupWithCoordinates.name}?`,\n buttonText: `Delete ${securityGroupWithCoordinates.name}`,\n account: securityGroupWithCoordinates.accountId || securityGroupWithCoordinates.account,\n taskMonitorConfig: {\n application: app,\n title: `Deleting ${securityGroupWithCoordinates.name}`,\n },\n submitMethod: () =>\n AzureSecurityGroupWriter.deleteSecurityGroup(securityGroupWithCoordinates, app, {\n cloudProvider: 'azure',\n vpcId: securityGroupWithCoordinates.vpcId,\n }),\n });\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"azure-security-group-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Security Group Actions</Dropdown.Toggle>\n <Dropdown.Menu>\n <MenuItem onClick={editSecurityGroup}>Edit Inbound Rules</MenuItem>\n <MenuItem onClick={cloneSecurityGroup}>Clone Security Group</MenuItem>\n <MenuItem onClick={deleteSecurityGroup}>Delete Security Group</MenuItem>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nexport function AzureSecurityGroupInformationSection({ securityGroup }: IAzureSecurityGroupSectionProps) {\n return (\n <CollapsibleSection heading=\"Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>ID</dt>\n <dd>{securityGroup.id || '-'}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={securityGroup.accountId || securityGroup.accountName || securityGroup.account} />\n </dd>\n <dt>Region</dt>\n <dd>{securityGroup.region}</dd>\n <dt>Description:</dt>\n <dd>{securityGroup.description || '-'}</dd>\n <dt>VNet</dt>\n <dd>{securityGroup.vpcId || '-'}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nfunction joinRuleValues(...values: any[]): string {\n for (const value of values) {\n if (Array.isArray(value) && value.length) {\n return value.join(', ');\n }\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return '-';\n}\n\nfunction ruleSources(rule: any): string {\n return joinRuleValues(\n rule.sourceAddressPrefixModel,\n rule.sourceAddressPrefixes,\n rule.sourceAddressPrefix,\n rule.sourceIPCIDRRanges,\n rule.sourceCidrs,\n );\n}\n\nfunction rulePorts(rule: any): string {\n return joinRuleValues(\n rule.destinationPortRangeModel,\n rule.destinationPortRanges,\n rule.destinationPortRange,\n rule.destPortRanges,\n rule.destinationPorts,\n );\n}\n\nexport function AzureSecurityGroupRulesSection({ securityGroup }: IAzureSecurityGroupSectionProps) {\n const rules = (securityGroup.securityRules || securityGroup.inboundRules || [])\n .slice()\n .sort((a: any, b: any) => (a.priority ?? Number.MAX_SAFE_INTEGER) - (b.priority ?? Number.MAX_SAFE_INTEGER));\n return (\n <CollapsibleSection heading=\"Inbound Rules\" defaultExpanded={true}>\n <table className=\"table table-condensed\">\n <thead>\n <tr>\n <th>Priority</th>\n <th>Name</th>\n <th>Source</th>\n <th>Source Port</th>\n <th>Destination</th>\n <th>Ports</th>\n <th>Protocol</th>\n <th>Access</th>\n <th>Direction</th>\n </tr>\n </thead>\n <tbody>\n {rules.map((rule: any, index: number) => (\n <tr key={rule.name || index}>\n <td>{rule.priority || '-'}</td>\n <td>{rule.name || '-'}</td>\n <td>{ruleSources(rule)}</td>\n <td>{rule.sourcePortRange || '-'}</td>\n <td>{rule.destinationAddressPrefix || '-'}</td>\n <td>{rulePorts(rule)}</td>\n <td>{rule.protocol || '-'}</td>\n <td>{rule.access || '-'}</td>\n <td>{rule.direction || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </CollapsibleSection>\n );\n}\n","export class AzureSecurityGroupReader {\n resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n //hack to get around securityGroupId not matching id in indexedSecurityGroups.\n const temp = securityGroupId.split('/');\n return indexedSecurityGroups[container.account][container.region][temp[temp.length - 1]];\n }\n}\n","export class AzureSecurityGroupTransformer {\n normalizeSecurityGroup() {}\n}\n","import _ from 'lodash';\n\nexport class AzureServerGroupTransformer {\n normalizeServerGroup(serverGroup) {\n return serverGroup;\n }\n\n parseCustomScriptsSettings(command, configuration) {\n /*\n At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following\n occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios\n to assign the correct value to model.\n */\n if (Array.isArray(command.customScriptsSettings.fileUris)) {\n configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris;\n } else {\n const fileUrisTemp = command.customScriptsSettings.fileUris;\n if (fileUrisTemp.includes(',')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(',');\n } else if (fileUrisTemp.includes(';')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';');\n } else {\n configuration.customScriptsSettings.fileUris = [fileUrisTemp];\n }\n\n configuration.customScriptsSettings.fileUris.forEach(function (v, index) {\n configuration.customScriptsSettings.fileUris[index] = v.trim();\n });\n }\n }\n\n convertServerGroupCommandToDeployConfiguration(command) {\n let tempImage;\n\n if (command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline') {\n tempImage = {\n imageName: '',\n isCustom: 'true',\n publisher: '',\n offer: '',\n sku: '',\n version: '',\n region: command.region,\n uri: '',\n ostype: '',\n };\n } else {\n tempImage = command.selectedImage;\n }\n\n const configuration = {\n name: command.application,\n cloudProvider: command.selectedProvider,\n application: command.application,\n stack: command.stack,\n strategy: command.strategy,\n rollback: {\n onFailure: command.rollback ? command.rollback.onFailure : null,\n },\n scaleDown: command.scaleDown,\n maxRemainingAsgs: command.maxRemainingAsgs,\n delayBeforeDisableSec: command.delayBeforeDisableSec,\n delayBeforeScaleDownSec: command.delayBeforeScaleDownSec,\n allowDeleteActive: command.strategy === 'redblack' ? true : null,\n allowScaleDownActive: command.strategy === 'redblack' ? true : null,\n detail: command.freeFormDetails,\n freeFormDetails: command.freeFormDetails,\n healthSettings: command.healthSettings,\n image: command.image,\n account: command.credentials,\n selectedProvider: 'azure',\n vnet: command.selectedVnet && command.selectedVnet.name ? command.selectedVnet.name : command.vnet,\n vnetResourceGroup:\n command.selectedVnet && command.selectedVnet.resourceGroup\n ? command.selectedVnet.resourceGroup\n : command.vnetResourceGroup,\n subnet: command.subnet,\n useSourceCapacity: false,\n capacity: {\n min: command.sku.capacity,\n max: command.sku.capacity,\n },\n credentials: command.credentials,\n region: command.region,\n securityGroupName: command.securityGroupName,\n loadBalancerName: command.loadBalancerName,\n loadBalancerType: command.loadBalancerType,\n user: '[anonymous]',\n upgradePolicy: 'Manual',\n type: 'createServerGroup',\n sku: {\n name: 'Standard_DS1_v2',\n tier: 'Standard',\n capacity: command.sku.capacity,\n },\n instanceTags: command.instanceTags,\n dataDisks: command.dataDisks,\n userAssignedIdentities: command.userAssignedIdentities,\n viewState: command.viewState,\n osConfig: {\n customData: command.osConfig ? command.osConfig.customData : null,\n },\n customScriptsSettings: {\n fileUris: null,\n commandToExecute: '',\n },\n zonesEnabled: command.zonesEnabled,\n zones: command.zonesEnabled ? command.zones : [],\n enableInboundNAT: command.enableInboundNAT,\n };\n\n if (command.image == null || command.image.isCustom == false) {\n configuration.image = tempImage;\n }\n\n if (typeof command.stack !== 'undefined') {\n configuration.name = configuration.name + '-' + command.stack;\n }\n if (typeof command.freeFormDetails !== 'undefined') {\n configuration.name = configuration.name + '-' + command.freeFormDetails;\n }\n\n if (typeof command.customScriptsSettings !== 'undefined') {\n configuration.customScriptsSettings.commandToExecute = command.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(command.customScriptsSettings.fileUris)) {\n this.parseCustomScriptsSettings(command, configuration);\n }\n }\n\n if (command.instanceType) {\n const vmsku = command.instanceType;\n configuration.instanceType = command.instanceType;\n configuration.sku.name = vmsku;\n configuration.sku.tier = vmsku.substring(0, vmsku.indexOf('_'));\n }\n\n // Default to an empty list of health provider names for now.\n configuration.interestingHealthProviderNames = [];\n\n return configuration;\n }\n}\n","import _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\nimport { AzureImageReader } from '../../image/image.reader';\nimport { AzureServerGroupTransformer } from '../serverGroup.transformer';\n\nexport class AzureServerGroupCommandBuilder {\n constructor(promiseService) {\n this.promiseService = promiseService;\n this.azureImageReader = new AzureImageReader();\n this.azureServerGroupTransformer = new AzureServerGroupTransformer();\n }\n\n resolve(value) {\n return this.promiseService.resolve(value);\n }\n\n buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultCredentials = defaults.account || application.defaultCredentials.azure;\n const defaultRegion = defaults.region || application.defaultRegions.azure;\n\n return this.azureImageReader.findImages({ provider: 'azure' }).then(function (images) {\n return {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n images,\n loadBalancers: [],\n selectedVnetSubnets: [],\n strategy: '',\n sku: {\n capacity: 1,\n },\n zonesEnabled: false,\n zones: [],\n instanceTags: {},\n dataDisks: [],\n selectedProvider: 'azure',\n viewState: {\n instanceProfile: 'custom',\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n loadBalancersConfigured: false,\n networkSettingsConfigured: false,\n securityGroupsConfigured: false,\n },\n enableInboundNAT: false,\n };\n });\n }\n\n // Only used to prepare view requiring template selecting\n buildNewServerGroupCommandForPipeline() {\n return this.resolve({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n application: application.name,\n strategy: '',\n stack: serverGroupName.stack,\n freeFormDetails: serverGroupName.freeFormDetails,\n credentials: serverGroup.account,\n loadBalancers: serverGroup.loadBalancers,\n selectedSubnets: serverGroup.selectedVnetSubnets,\n selectedVnet: serverGroup.selectedVnet,\n securityGroups: serverGroup.securityGroups,\n loadBalancerName: serverGroup.loadBalancerName,\n loadBalancerType: serverGroup.loadBalancerType,\n securityGroupName: serverGroup.securityGroupName,\n region: serverGroup.region,\n vnet: serverGroup.vnet,\n vnetResourceGroup: serverGroup.vnetResourceGroup,\n subnet: serverGroup.subnet,\n zones: serverGroup.zones,\n zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,\n instanceTags: {},\n dataDisks: serverGroup.dataDisks,\n sku: serverGroup.sku,\n capacity: {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n },\n tags: [],\n instanceType: serverGroup.sku.name,\n selectedProvider: 'azure',\n source: {\n account: serverGroup.account,\n region: serverGroup.region,\n serverGroupName: serverGroup.name,\n asgName: serverGroup.name,\n },\n viewState: {\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: false,\n listImplicitSecurityGroups: false,\n mode: mode,\n disableStrategySelection: true,\n },\n enableInboundNAT: serverGroup.enableInboundNAT,\n };\n\n if (typeof serverGroup.customScriptsSettings !== 'undefined') {\n command.customScriptsSettings = {};\n command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {\n this.azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);\n }\n }\n\n return this.azureImageReader.findImages({ provider: 'azure' }).then((images) => {\n const sourceImage = serverGroup.image || {};\n const imageName = sourceImage.imageName || serverGroup.imageName || serverGroup.amiName;\n const selectedImage = images.find((image) => image.imageName === imageName);\n\n command.images = images;\n if (sourceImage.isCustom || sourceImage.uri) {\n command.image = { ...sourceImage, isCustom: true, region: sourceImage.region || serverGroup.region };\n } else if (imageName) {\n command.imageName = imageName;\n command.selectedImage = selectedImage || sourceImage;\n }\n\n return command;\n });\n }\n\n buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = pipelineCluster.region;\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return this.buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const viewState = {\n disableImageSelection: true,\n useSimpleCapacity: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n instanceProfile: originalCluster.viewState.instanceProfile,\n instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n viewState: viewState,\n };\n if (originalCluster.viewState.instanceTypeDetails) {\n viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;\n }\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n const extendedCommand = _.extend({}, command, pipelineCluster, viewOverrides);\n\n return extendedCommand;\n });\n }\n}\n","import _ from 'lodash';\n\nimport { AccountService } from '@spinnaker/core';\nimport { AzureInstanceTypeService } from '../../instance/azureInstanceType.service';\n\nexport class AzureServerGroupConfigurationService {\n static requiresDeckRuntimeServices = true;\n\n constructor(promiseService, runtimeServices) {\n this.promiseService = promiseService;\n this.azureInstanceTypeService = new AzureInstanceTypeService(promiseService);\n this.cacheInitializer = runtimeServices.cacheInitializer;\n this.loadBalancerReader = runtimeServices.loadBalancerReader;\n this.securityGroupReader = runtimeServices.securityGroupReader;\n }\n\n createDelegate() {\n const all = (values) => this.promiseService.all(values);\n const azureInstanceTypeService = this.azureInstanceTypeService;\n const cacheInitializer = this.cacheInitializer;\n const loadBalancerReader = this.loadBalancerReader;\n const securityGroupReader = this.securityGroupReader;\n const dataDiskTypes = ['Standard_LRS', 'StandardSSD_LRS', 'Premium_LRS'];\n const dataDiskCachingTypes = ['None', 'ReadOnly', 'ReadWrite'];\n\n const healthCheckTypes = ['EC2', 'ELB'];\n const terminationPolicies = [\n 'OldestInstance',\n 'NewestInstance',\n 'OldestLaunchConfiguration',\n 'ClosestToNextInstanceHour',\n 'Default',\n ];\n\n function configureUpdateCommand(command) {\n command.backingData = {\n healthCheckTypes: _.cloneDeep(healthCheckTypes),\n terminationPolicies: _.cloneDeep(terminationPolicies),\n };\n }\n\n function configureCommand(application, command) {\n return all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n securityGroupReader.loadSecurityGroups(),\n loadBalancerReader.loadLoadBalancers(application.name),\n ]).then(function ([credentialsKeyedByAccount, securityGroups, loadBalancers]) {\n command.backingData = {\n credentialsKeyedByAccount,\n securityGroups,\n loadBalancers,\n dataDiskTypes: _.cloneDeep(dataDiskTypes),\n dataDiskCachingTypes: _.cloneDeep(dataDiskCachingTypes),\n accounts: _.keys(credentialsKeyedByAccount),\n filtered: {},\n };\n attachEventHandlers(command);\n });\n }\n\n function configureInstanceTypes(command) {\n const result = {\n dirty: {},\n };\n if (command.region) {\n const results = [result.dirty];\n\n // results.push(configureCustomInstanceTypes(command).dirty);\n results.push(configureStandardInstanceTypes(command).dirty);\n\n _.extend(...results);\n } else {\n command.backingData.filtered.instanceTypes = [];\n }\n return result;\n }\n\n function configureStandardInstanceTypes(command) {\n const c = command;\n const result = {\n dirty: {},\n };\n\n const locations = [c.region];\n const { credentialsKeyedByAccount } = c.backingData;\n const { locationToInstanceTypesMap } = credentialsKeyedByAccount[c.credentials];\n\n if (locations.every((l) => !l)) {\n return result;\n }\n\n const filtered = azureInstanceTypeService\n .getAvailableTypesForRegions(locationToInstanceTypesMap, locations)\n .map((type) => type.name);\n\n const instanceType = c.instanceType;\n if (_.every([instanceType, !_.startsWith(instanceType, 'custom'), !_.includes(filtered, instanceType)])) {\n result.dirty.instanceType = c.instanceType;\n c.instanceType = null;\n }\n c.backingData.filtered.instanceTypes = filtered;\n return result;\n }\n\n function configureImages(command) {\n const result = {\n dirty: {},\n };\n let regionalImages = null;\n const clearSelectedImage = function () {\n if (command.amiName) {\n result.dirty.amiName = true;\n command.amiName = null;\n }\n if (command.imageName) {\n result.dirty.imageName = true;\n command.imageName = null;\n }\n if (command.selectedImage) {\n result.dirty.selectedImage = true;\n command.selectedImage = null;\n }\n };\n if (command.viewState.disableImageSelection) {\n return result;\n }\n if (command.region) {\n regionalImages = (command.backingData.packageImages || command.images || [])\n .filter(function (image) {\n return image.amis && image.amis[command.region];\n })\n .map(function (image) {\n return {\n imageName: image.imageName,\n ami: image.amis ? image.amis[command.region][0] : null,\n };\n });\n const selectedImageName =\n command.imageName || (command.selectedImage && command.selectedImage.imageName) || command.amiName;\n const selectedRegionalImage = regionalImages.find(function (image) {\n return image.imageName === selectedImageName;\n });\n if (selectedImageName && !selectedRegionalImage) {\n clearSelectedImage();\n } else if (selectedRegionalImage && !command.image?.isCustom) {\n command.imageName = selectedRegionalImage.imageName;\n command.selectedImage = selectedRegionalImage;\n }\n } else {\n clearSelectedImage();\n }\n command.backingData.filtered.images = regionalImages;\n return result;\n }\n\n function configureZones(command) {\n const result = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (!command.region) {\n return result;\n }\n let { regionsSupportZones, availabilityZones } = command.backingData.credentialsKeyedByAccount[\n command.credentials\n ];\n regionsSupportZones = regionsSupportZones || [];\n availabilityZones = availabilityZones || [];\n filteredData.zones = regionsSupportZones.includes(command.region) ? availabilityZones : [];\n\n return result;\n }\n\n function getRegionalSecurityGroups(command) {\n const newSecurityGroups = command.backingData.securityGroups[command.credentials] || {\n azure: {},\n };\n return _.chain(newSecurityGroups[command.region]).sortBy('name').value();\n }\n\n function configureSecurityGroupOptions(command) {\n const result = {\n dirty: {},\n };\n let currentOptions;\n if (command.backingData.filtered.securityGroups) {\n currentOptions = command.backingData.filtered.securityGroups;\n }\n const newRegionalSecurityGroups = getRegionalSecurityGroups(command);\n if (command.selectedSecurityGroup) {\n // one has not been previously selected. We are either configuring for the\n //first time or they changed regions or account\n command.selectedSecurityGroup = null;\n result.dirty.securityGroups = true;\n }\n if (currentOptions != newRegionalSecurityGroups) {\n command.backingData.filtered.securityGroups = newRegionalSecurityGroups;\n result.dirty.securityGroups = true;\n }\n\n if (command.backingData.filtered.securityGroups.length === 0) {\n command.viewState.securityGroupsConfigured = false;\n } else {\n command.viewState.securityGroupsConfigured = true;\n }\n\n return result;\n }\n\n function refreshSecurityGroups(command, skipCommandReconfiguration) {\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n command.backingData.securityGroups = securityGroups;\n if (!skipCommandReconfiguration) {\n configureSecurityGroupOptions(command);\n }\n });\n });\n }\n\n function getLoadBalancerNames(loadBalancers) {\n return _.chain(loadBalancers).map('name').uniq().value().sort();\n }\n\n function configureLoadBalancerOptions(command) {\n const result = {\n dirty: {},\n };\n const current = command.loadBalancers;\n const newLoadBalancers = getLoadBalancerNames(command.backingData.loadBalancers);\n\n if (current && command.loadBalancers) {\n const matched = _.intersection(newLoadBalancers, command.loadBalancers);\n const removed = _.xor(matched, current);\n command.loadBalancers = matched;\n if (removed.length) {\n result.dirty.loadBalancers = removed;\n }\n }\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n return result;\n }\n\n function refreshLoadBalancers(command, skipCommandReconfiguration) {\n return loadBalancerReader.listLoadBalancers('azure').then(function (loadBalancers) {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n configureLoadBalancerOptions(command);\n }\n });\n }\n\n function configureLoadBalancers(command) {\n const result = {\n dirty: {},\n };\n const temp = command.backingData.loadBalancers;\n const filterlist = _.filter(temp, function (lb) {\n return lb.account === command.credentials && lb.region === command.region;\n });\n\n command.loadBalancers = getLoadBalancerNames(filterlist);\n command.viewState.loadBalancersConfigured = true;\n\n return result;\n }\n\n function attachEventHandlers(cmd) {\n cmd.regionChanged = function regionChanged(command, isInit = false) {\n const result = {\n dirty: {},\n };\n if (command.region && command.credentials) {\n _.extend(result.dirty, configureLoadBalancers(command).dirty);\n _.extend(result.dirty, configureSecurityGroupOptions(command).dirty);\n _.extend(result.dirty, configureInstanceTypes(command).dirty);\n _.extend(result.dirty, configureZones(command).dirty);\n }\n // reset previous set values\n if (!isInit) {\n command.loadBalancerName = null;\n command.loadBalancerType = null;\n command.vnet = null;\n command.vnetResourceGroup = null;\n command.subnet = null;\n command.selectedSubnet = null;\n command.selectedVnet = null;\n command.selectedVnetSubnets = [];\n command.viewState.networkSettingsConfigured = false;\n command.selectedSecurityGroup = null;\n command.securityGroupName = null;\n command.zonesEnabled = false;\n command.zones = [];\n }\n\n return result;\n };\n\n cmd.credentialsChanged = function credentialsChanged(command, isInit) {\n const result = {\n dirty: {},\n };\n const backingData = command.backingData;\n if (command.credentials) {\n const regionsForAccount = backingData.credentialsKeyedByAccount[command.credentials] || {\n regions: [],\n defaultKeyPair: null,\n };\n backingData.filtered.regions = regionsForAccount.regions;\n if (\n !_.chain(backingData.filtered.regions)\n .some({\n name: command.region,\n })\n .value()\n ) {\n command.region = null;\n result.dirty.region = true;\n } else {\n _.extend(result.dirty, command.regionChanged(command, isInit).dirty);\n }\n if (command.region) {\n _.extend(result.dirty, configureLoadBalancers(command).dirty);\n }\n _.extend(result.dirty, configureInstanceTypes(command).dirty);\n } else {\n command.region = null;\n }\n return result;\n };\n }\n\n function refreshInstanceTypes(command) {\n return cacheInitializer.refreshCache('instanceTypes').then(function () {\n return azureInstanceTypeService.getAllTypesByRegion().then(function (instanceTypes) {\n command.backingData.instanceTypes = instanceTypes;\n configureInstanceTypes(command);\n });\n });\n }\n\n return {\n configureUpdateCommand: configureUpdateCommand,\n configureCommand: configureCommand,\n configureImages: configureImages,\n configureSecurityGroupOptions: configureSecurityGroupOptions,\n configureLoadBalancerOptions: configureLoadBalancerOptions,\n refreshLoadBalancers: refreshLoadBalancers,\n refreshSecurityGroups: refreshSecurityGroups,\n getRegionalSecurityGroups: getRegionalSecurityGroups,\n refreshInstanceTypes: refreshInstanceTypes,\n configureZones: configureZones,\n };\n }\n}\n\n[\n 'configureUpdateCommand',\n 'configureCommand',\n 'configureImages',\n 'configureSecurityGroupOptions',\n 'configureLoadBalancerOptions',\n 'refreshLoadBalancers',\n 'refreshSecurityGroups',\n 'getRegionalSecurityGroups',\n 'refreshInstanceTypes',\n 'configureZones',\n].forEach((method) => {\n AzureServerGroupConfigurationService.prototype[method] = function (...args) {\n if (!this.delegate) {\n this.delegate = this.createDelegate();\n }\n return this.delegate[method](...args);\n };\n});\n","import React from 'react';\n\nimport type { IWizardPageComponent } from '@spinnaker/core';\n\nexport interface IAzureWizardPageProps {\n formik: any;\n app?: any;\n}\n\nexport abstract class AzureWizardPage<P extends IAzureWizardPageProps = IAzureWizardPageProps>\n extends React.Component<P>\n implements IWizardPageComponent<any> {\n public validate(_values: any): { [key: string]: any } {\n return {};\n }\n\n protected setField = (field: string, value: any) => {\n const path = field.split('.');\n const leaf = path.pop();\n const target = path.reduce((acc: any, key) => {\n acc[key] = acc[key] || {};\n return acc[key];\n }, this.props.formik.values);\n target[leaf] = value;\n this.props.formik.setFieldValue(field, value);\n };\n\n protected textField(label: string, field: string, type = 'text') {\n const value = this.props.formik.values[field] ?? '';\n return (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">{label}</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n name={field}\n onChange={(event) => this.setField(field, event.target.value)}\n type={type}\n value={value}\n />\n </div>\n </div>\n );\n }\n\n protected selectField(label: string, field: string, options: any[], labeler: (option: any) => string = String) {\n const value = this.props.formik.values[field] ?? '';\n return (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">{label}</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n name={field}\n onChange={(event) => this.setField(field, event.target.value)}\n value={value}\n >\n <option value=\"\">Select...</option>\n {(options || []).map((option) => {\n const optionValue = typeof option === 'string' ? option : option.name;\n return (\n <option key={optionValue} value={optionValue}>\n {labeler(option)}\n </option>\n );\n })}\n </select>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupAdvancedSettings extends AzureWizardPage {\n public addDataDisk = () => {\n const dataDisks = [\n ...(this.props.formik.values.dataDisks || []),\n {\n lun: 0,\n managedDisk: {\n storageAccountType: 'Standard_LRS',\n },\n diskSizeGB: 1,\n caching: 'None',\n createOption: 'Empty',\n },\n ];\n this.props.formik.values.dataDisks = dataDisks;\n this.props.formik.setFieldValue('dataDisks', dataDisks);\n };\n\n private removeDataDisk = (index: number) => {\n const dataDisks = [...(this.props.formik.values.dataDisks || [])];\n dataDisks.splice(index, 1);\n this.props.formik.values.dataDisks = dataDisks;\n this.props.formik.setFieldValue('dataDisks', dataDisks);\n };\n\n private updateDataDisk = (index: number, field: string, value: any) => {\n const dataDisks = [...(this.props.formik.values.dataDisks || [])];\n const disk = { ...(dataDisks[index] || {}) };\n if (field === 'storageAccountType') {\n disk.managedDisk = { ...(disk.managedDisk || {}), storageAccountType: value };\n } else {\n disk[field] = value;\n }\n dataDisks[index] = disk;\n this.props.formik.values.dataDisks = dataDisks;\n this.props.formik.setFieldValue('dataDisks', dataDisks);\n };\n\n public render() {\n const { values } = this.props.formik;\n values.osConfig = values.osConfig || {};\n values.customScriptsSettings = values.customScriptsSettings || {};\n values.dataDisks = values.dataDisks || [];\n const dataDiskTypes = values.backingData?.dataDiskTypes || ['Standard_LRS', 'StandardSSD_LRS', 'Premium_LRS'];\n const dataDiskCachingTypes = values.backingData?.dataDiskCachingTypes || ['None', 'ReadOnly', 'ReadWrite'];\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">Number of Instances</div>\n <div className=\"col-md-2\">\n <input\n className=\"form-control input-sm\"\n max=\"100\"\n min=\"0\"\n onChange={(event) => this.setField('sku.capacity', Number(event.target.value))}\n type=\"number\"\n value={values.sku?.capacity ?? 0}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">Custom Data</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.setField('osConfig.customData', event.target.value)}\n value={values.osConfig.customData || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">Custom Script</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.setField('customScriptsSettings.fileUris', event.target.value)}\n value={values.customScriptsSettings.fileUris || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">Command To Execute</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.setField('customScriptsSettings.commandToExecute', event.target.value)}\n value={values.customScriptsSettings.commandToExecute || ''}\n />\n </div>\n </div>\n {values.loadBalancerType === 'Azure Application Gateway' && (\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">\n <input\n checked={!!values.enableInboundNAT}\n disabled={!!values.zonesEnabled}\n onChange={(event) => this.setField('enableInboundNAT', event.target.checked)}\n type=\"checkbox\"\n />\n </div>\n <div className=\"col-md-7\">\n <b>Enable inbound NAT port-forwarding rules to connect to VM instances</b>\n </div>\n </div>\n )}\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-right\">User-Assigned Identities</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.setField('userAssignedIdentities', event.target.value)}\n value={values.userAssignedIdentities || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-left\">Data Disks</div>\n <div className=\"col-md-11\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th>LUN</th>\n <th>Size (GB)</th>\n <th>Type</th>\n <th>Caching</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {values.dataDisks.map((disk: any, index: number) => (\n <tr key={index}>\n <td>\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => this.updateDataDisk(index, 'lun', Number(event.target.value))}\n type=\"number\"\n value={disk.lun ?? 0}\n />\n </td>\n <td>\n <input\n className=\"form-control input-sm\"\n min=\"1\"\n onChange={(event) => this.updateDataDisk(index, 'diskSizeGB', Number(event.target.value))}\n type=\"number\"\n value={disk.diskSizeGB ?? 1}\n />\n </td>\n <td>\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.updateDataDisk(index, 'storageAccountType', event.target.value)}\n value={disk.managedDisk?.storageAccountType || ''}\n >\n {dataDiskTypes.map((type: string) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </td>\n <td>\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.updateDataDisk(index, 'caching', event.target.value)}\n value={disk.caching || ''}\n >\n {dataDiskCachingTypes.map((type: string) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </td>\n <td>\n <button\n className=\"btn btn-link sm-label\"\n onClick={() => this.removeDataDisk(index)}\n type=\"button\"\n >\n <span className=\"glyphicon glyphicon-trash\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n <tr>\n <td colSpan={5}>\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.addDataDisk} type=\"button\">\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add New Data Disk\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { DeploymentStrategySelector, NameUtils } from '@spinnaker/core';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupBasicSettings extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n const errors: { [key: string]: any } = {};\n const stackPattern = values.viewState?.templatingEnabled ? /^([a-zA-Z0-9]*(\\${.+})*)*$/ : /^[a-zA-Z0-9]*$/;\n const detailPattern = values.viewState?.templatingEnabled ? /^([a-zA-Z0-9-]*(\\${.+})*)*$/ : /^[a-zA-Z0-9-]*$/;\n\n if (!values.credentials) {\n errors.credentials = 'Account required.';\n }\n if (!values.region) {\n errors.region = 'Region required.';\n }\n if (!values.stack) {\n errors.stack = 'Stack required.';\n }\n if (!values.freeFormDetails) {\n errors.freeFormDetails = 'Detail required.';\n }\n if (!stackPattern.test(values.stack || '')) {\n errors.stack = 'Stack can only contain letters and numbers.';\n }\n if (!detailPattern.test(values.freeFormDetails || '')) {\n errors.freeFormDetails = 'Detail can only contain letters, numbers, and dashes.';\n }\n return errors;\n }\n\n private accountChanged = (account: string) => {\n const { values } = this.props.formik;\n values.credentials = account;\n const result = values.credentialsChanged?.(values);\n this.props.formik.setFieldValue('credentials', account);\n this.props.formik.setFieldValue('region', values.region);\n values.processCommandUpdateResult?.(result);\n };\n\n private regionChanged = (region: string) => {\n const { values } = this.props.formik;\n values.region = region;\n const result = values.regionChanged?.(values);\n this.props.formik.setFieldValue('region', region);\n values.processCommandUpdateResult?.(result);\n };\n\n private strategyChanged = (_values: any, strategy: any) => {\n this.props.formik.setFieldValue('strategy', strategy.key);\n };\n\n private onStrategyFieldChange = (key: string, value: any) => {\n this.props.formik.setFieldValue(key, value);\n };\n\n public render() {\n const { app, formik } = this.props;\n const { values } = formik;\n const clusterName = NameUtils.getClusterName(app?.name || values.application, values.stack, values.freeFormDetails);\n const accounts = values.backingData?.accounts || [];\n const regions = values.backingData?.filtered?.regions || [];\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.accountChanged(event.target.value)}\n value={values.credentials || ''}\n >\n <option value=\"\">Select...</option>\n {accounts.map((account: string) => (\n <option key={account} value={account}>\n {account}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Region</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.regionChanged(event.target.value)}\n value={values.region || ''}\n >\n <option value=\"\">Select...</option>\n {regions.map((region: any) => {\n const name = typeof region === 'string' ? region : region.name;\n return (\n <option key={name} value={name}>\n {name}\n </option>\n );\n })}\n </select>\n </div>\n </div>\n {this.textField('Stack', 'stack')}\n {this.textField('Detail', 'freeFormDetails')}\n {!values.viewState?.disableStrategySelection && values.selectedProvider && (\n <DeploymentStrategySelector\n command={values}\n onFieldChange={this.onStrategyFieldChange}\n onStrategyChange={this.strategyChanged}\n />\n )}\n {!values.viewState?.hideClusterNamePreview && (\n <div className=\"well text-center\">\n Your server group will be in the cluster: <strong>{clusterName}</strong>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupCapacityAndZones extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n if (values.zonesEnabled && (!values.zones || values.zones.length === 0)) {\n return { zones: 'At least one zone is required when zones are enabled.' };\n }\n return {};\n }\n\n private capacityChanged = (capacity: string) => {\n const parsed = Number(capacity);\n this.props.formik.values.sku = { ...(this.props.formik.values.sku || {}), capacity: parsed };\n this.props.formik.setFieldValue('sku.capacity', parsed);\n };\n\n private zoneToggled = (zone: string, enabled: boolean) => {\n const current = this.props.formik.values.zones || [];\n const zones = enabled ? current.concat(zone) : current.filter((candidate: string) => candidate !== zone);\n this.props.formik.values.zones = zones;\n this.props.formik.setFieldValue('zones', zones);\n };\n\n private zonesEnabledChanged = (enabled: boolean) => {\n this.setField('zonesEnabled', enabled);\n if (enabled) {\n this.setField('enableInboundNAT', false);\n }\n };\n\n public render() {\n const { values } = this.props.formik;\n const zones = values.backingData?.filtered?.zones || [];\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Capacity</div>\n <div className=\"col-md-3\">\n <input\n className=\"form-control input-sm\"\n min=\"0\"\n onChange={(event) => this.capacityChanged(event.target.value)}\n type=\"number\"\n value={values.sku?.capacity ?? 0}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Use Zones</div>\n <div className=\"col-md-7\">\n <input\n checked={!!values.zonesEnabled}\n onChange={(event) => this.zonesEnabledChanged(event.target.checked)}\n type=\"checkbox\"\n />\n </div>\n </div>\n {values.zonesEnabled && (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Zones</div>\n <div className=\"col-md-7\">\n {zones.map((zone: string) => (\n <label className=\"checkbox-inline\" key={zone}>\n <input\n checked={(values.zones || []).includes(zone)}\n onChange={(event) => this.zoneToggled(zone, event.target.checked)}\n type=\"checkbox\"\n />\n {zone}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nconst healthCheckProtocols = [\n { displayName: 'N/A', name: '' },\n { displayName: 'HTTP', name: 'http' },\n { displayName: 'TCP', name: 'tcp' },\n];\n\nexport class ServerGroupHealthSettings extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n if (!values.healthSettings?.protocol) {\n return {};\n }\n const errors: { [key: string]: any } = {};\n if (!values.healthSettings.port) {\n errors.port = 'Port required.';\n }\n if (values.healthSettings.protocol === 'http' && !values.healthSettings.requestPath) {\n errors.requestPath = 'Path required.';\n }\n return errors;\n }\n\n private updateHealthSettings = (updates: any) => {\n const healthSettings = { ...(this.props.formik.values.healthSettings || {}), ...updates };\n this.props.formik.values.healthSettings = healthSettings;\n this.props.formik.setFieldValue('healthSettings', healthSettings);\n };\n\n private protocolChanged = (protocol: string) => {\n if (!protocol) {\n this.updateHealthSettings({ protocol: null, port: null, requestPath: null });\n return;\n }\n this.updateHealthSettings({\n protocol,\n requestPath: protocol === 'http' ? this.props.formik.values.healthSettings?.requestPath : null,\n });\n };\n\n public render() {\n const healthSettings = this.props.formik.values.healthSettings || {};\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Protocol</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.protocolChanged(event.target.value)}\n value={healthSettings.protocol || ''}\n >\n {healthCheckProtocols.map((protocol) => (\n <option key={protocol.displayName} value={protocol.name}>\n {protocol.displayName}\n </option>\n ))}\n </select>\n </div>\n </div>\n {healthSettings.protocol && (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Port</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.updateHealthSettings({ port: event.target.value })}\n type=\"text\"\n value={healthSettings.port || ''}\n />\n </div>\n </div>\n )}\n {healthSettings.protocol === 'http' && (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Path</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.updateHealthSettings({ requestPath: event.target.value })}\n type=\"text\"\n value={healthSettings.requestPath || ''}\n />\n </div>\n </div>\n )}\n <div className=\"form-group small\" style={{ marginTop: '20px' }}>\n <div className=\"col-md-9 col-md-offset-3\">\n <p>Health settings here will be applied directly to the VM Scale Set.</p>\n </div>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupImageSettings extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n if (values.viewState?.disableImageSelection) {\n return {};\n }\n if (values.image?.isCustom) {\n const errors: { [key: string]: any } = {};\n if (!values.image.imageName) {\n errors.imageName = 'Image name required.';\n }\n if (!values.image.ostype) {\n errors.ostype = 'OS type required.';\n }\n if (!values.image.uri) {\n errors.uri = 'URI required.';\n }\n return errors;\n }\n if (!values.selectedImage) {\n return { selectedImage: 'Image required.' };\n }\n return {};\n }\n\n private isRegionalImage(image: any, region: string): boolean {\n if (!region) {\n return true;\n }\n if (image.amis) {\n return !!image.amis[region];\n }\n return image.region === region || image.region == null;\n }\n\n private imageChanged = (imageName: string) => {\n const images = this.props.formik.values.backingData?.filtered?.images || this.props.formik.values.images || [];\n const image = images.find((candidate: any) => candidate.imageName === imageName) || null;\n this.props.formik.values.imageName = imageName;\n this.props.formik.values.selectedImage = image;\n this.props.formik.setFieldValue('imageName', imageName);\n this.props.formik.setFieldValue('selectedImage', image);\n };\n\n private customImageChanged = (isCustom: boolean) => {\n const image = isCustom\n ? { ...(this.props.formik.values.image || {}), isCustom, region: this.props.formik.values.region }\n : { isCustom };\n this.props.formik.values.image = image;\n this.props.formik.setFieldValue('image', image);\n };\n\n private customImageFieldChanged = (field: string, value: string) => {\n const image = {\n ...(this.props.formik.values.image || {}),\n isCustom: true,\n region: this.props.formik.values.region,\n [field]: value,\n };\n this.props.formik.values.image = image;\n this.props.formik.setFieldValue('image', image);\n };\n\n public render() {\n const { values } = this.props.formik;\n const imageOptions = values.backingData?.filtered?.images || values.images || [];\n const images = values.region\n ? imageOptions.filter((image: any) => this.isRegionalImage(image, values.region))\n : imageOptions;\n const image = values.image || {};\n\n if (values.viewState?.disableImageSelection) {\n return <div className=\"container-fluid form-horizontal\">Image selection is disabled for this command.</div>;\n }\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Use custom image?</div>\n <div className=\"col-md-7\">\n <input\n checked={!!image.isCustom}\n onChange={(event) => this.customImageChanged(event.target.checked)}\n type=\"checkbox\"\n />\n </div>\n </div>\n {image.isCustom && (\n <>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Region</div>\n <div className=\"col-md-7\">{values.region}</div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Image Name</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.customImageFieldChanged('imageName', event.target.value)}\n value={image.imageName || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">OS Type</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.customImageFieldChanged('ostype', event.target.value)}\n value={image.ostype || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">URI</div>\n <div className=\"col-md-7\">\n <input\n className=\"form-control input-sm\"\n onChange={(event) => this.customImageFieldChanged('uri', event.target.value)}\n value={image.uri || ''}\n />\n </div>\n </div>\n </>\n )}\n {!image.isCustom && (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Image</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.imageChanged(event.target.value)}\n value={values.imageName || values.selectedImage?.imageName || ''}\n >\n <option value=\"\">Select...</option>\n {images.map((image: any) => (\n <option key={image.imageName} value={image.imageName}>\n {image.imageName}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupInstanceType extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n return values.instanceType ? {} : { instanceType: 'Instance Type required.' };\n }\n\n private instanceTypeChanged = (instanceType: string) => {\n this.props.formik.values.instanceType = instanceType;\n this.props.formik.setFieldValue('instanceType', instanceType);\n this.props.formik.setFieldValue('sku.name', instanceType);\n };\n\n public render() {\n const { values } = this.props.formik;\n const instanceTypes = values.backingData?.filtered?.instanceTypes || [];\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Instance Type</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.instanceTypeChanged(event.target.value)}\n value={values.instanceType || ''}\n >\n <option value=\"\">Select...</option>\n {instanceTypes.map((type: string) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { DeckRuntimeContext, InfrastructureCaches, NetworkReader } from '@spinnaker/core';\n\nimport { AzureWizardPage } from './common';\nimport Utility from '../../../../utility';\n\nfunction normalizeLoadBalancerType(loadBalancerType: string): string | null {\n const normalized = String(loadBalancerType || '')\n .toLowerCase()\n .split('_')\n .join(' ');\n if (normalized === 'application gateway') {\n return 'Azure Application Gateway';\n }\n if (normalized === 'load balancer') {\n return 'Azure Load Balancer';\n }\n return Utility.getLoadBalancerType(loadBalancerType)?.type || loadBalancerType || null;\n}\n\nfunction selectableSubnetNames(vnet: any): string[] {\n return (vnet?.subnets || [])\n .filter((subnet: any) =>\n (subnet.devices || []).every((device: any) => !device || device.type !== 'applicationGateways'),\n )\n .map((subnet: any) => subnet.name || subnet);\n}\n\nfunction matchesSelectedVnet(candidate: any, selectedVnet: any): boolean {\n return (\n candidate.name === selectedVnet.name &&\n (!selectedVnet.resourceGroup || candidate.resourceGroup === selectedVnet.resourceGroup)\n );\n}\n\nexport class ServerGroupLoadBalancers extends AzureWizardPage {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n private loadVnetSubnetsRequestId = 0;\n\n private getCommandLoadBalancer(loadBalancerName: string | null): any {\n const { values } = this.props.formik;\n const loadBalancers = values.backingData?.loadBalancers || [];\n return (\n loadBalancers.find(\n (candidate: any) =>\n candidate.name === loadBalancerName &&\n candidate.account === values.credentials &&\n candidate.region === values.region,\n ) || loadBalancers.find((candidate: any) => candidate.name === loadBalancerName)\n );\n }\n\n public componentDidMount(): void {\n const { values } = this.props.formik;\n if (values.credentials && values.region) {\n values.viewState.networkSettingsConfigured = true;\n values.selectedVnetSubnets = values.selectedVnetSubnets || [];\n if (values.loadBalancerName) {\n void this.loadBalancerChanged(values.loadBalancerName);\n } else {\n void this.loadVnetSubnets(null, values.loadBalancerType || null, ++this.loadVnetSubnetsRequestId);\n }\n }\n }\n\n public componentWillUnmount(): void {\n this.loadVnetSubnetsRequestId += 1;\n }\n\n public loadBalancerChanged = async (loadBalancerName: string | null, clearNetworkFields = false): Promise<void> => {\n const { values } = this.props.formik;\n const requestId = ++this.loadVnetSubnetsRequestId;\n const loadBalancer = this.getCommandLoadBalancer(loadBalancerName);\n const loadBalancerType = normalizeLoadBalancerType(loadBalancer?.loadBalancerType);\n values.loadBalancerName = loadBalancerName || null;\n values.loadBalancerType = loadBalancerType;\n values.selectedVnetSubnets = [];\n if (clearNetworkFields) {\n values.selectedVnet = null;\n values.vnet = null;\n values.vnetResourceGroup = null;\n values.selectedSubnet = null;\n values.subnet = null;\n }\n values.viewState = values.viewState || {};\n values.viewState.networkSettingsConfigured = true;\n this.props.formik.setFieldValue('loadBalancerName', values.loadBalancerName);\n this.props.formik.setFieldValue('loadBalancerType', values.loadBalancerType);\n this.props.formik.setFieldValue('selectedVnetSubnets', []);\n if (clearNetworkFields) {\n this.props.formik.setFieldValue('selectedVnet', null);\n this.props.formik.setFieldValue('vnet', null);\n this.props.formik.setFieldValue('vnetResourceGroup', null);\n this.props.formik.setFieldValue('selectedSubnet', null);\n this.props.formik.setFieldValue('subnet', null);\n }\n InfrastructureCaches.clearCache('networks');\n await this.loadVnetSubnets(values.loadBalancerName, loadBalancerType, requestId);\n };\n\n private loadVnetSubnets = async (\n loadBalancerName: string | null,\n loadBalancerType: string | null,\n requestId: number,\n ): Promise<void> => {\n const { values } = this.props.formik;\n const credentials = values.credentials;\n const region = values.region;\n if (!credentials || !region) {\n return;\n }\n\n let loadBalancerDetails: any[];\n let networks: any;\n try {\n [loadBalancerDetails, networks] = await Promise.all([\n loadBalancerName\n ? this.context.services.loadBalancerReader.getLoadBalancerDetails(\n 'azure',\n credentials,\n region,\n loadBalancerName,\n )\n : Promise.resolve([]),\n NetworkReader.listNetworks(),\n ]);\n } catch (_error) {\n return;\n }\n if (\n requestId !== this.loadVnetSubnetsRequestId ||\n values.loadBalancerName !== loadBalancerName ||\n values.credentials !== credentials ||\n values.region !== region\n ) {\n return;\n }\n const azureNetworks = Array.isArray(networks) ? networks : (networks as any).azure || [];\n const allVnets = azureNetworks.filter((vnet: any) => vnet.account === credentials && vnet.region === region);\n const attachedVnet = values.selectedVnet;\n const selectedLoadBalancer = loadBalancerDetails?.length === 1 ? loadBalancerDetails[0] : null;\n let selectedVnet =\n !selectedLoadBalancer && attachedVnet\n ? allVnets.find((vnet: any) => matchesSelectedVnet(vnet, attachedVnet)) || null\n : null;\n\n if (selectedLoadBalancer) {\n selectedVnet = allVnets.find((vnet: any) => {\n if (loadBalancerType === 'Azure Application Gateway') {\n return vnet.name === selectedLoadBalancer.vnet;\n }\n if (loadBalancerType === 'Azure Load Balancer' && attachedVnet) {\n return matchesSelectedVnet(vnet, attachedVnet);\n }\n return false;\n });\n }\n\n const selectedVnetSubnets = selectedVnet\n ? selectableSubnetNames(selectedVnet)\n : allVnets.reduce((subnets: string[], vnet: any) => subnets.concat(selectableSubnetNames(vnet)), []);\n\n values.allVnets = allVnets;\n values.selectedVnet = selectedVnet || null;\n values.vnet = selectedVnet?.name || null;\n values.vnetResourceGroup = selectedVnet?.resourceGroup || null;\n values.selectedVnetSubnets = selectedVnetSubnets;\n values.selectedSubnet = selectedVnet && selectedVnetSubnets.includes(values.subnet) ? values.subnet : null;\n values.subnet = values.selectedSubnet;\n\n this.props.formik.setFieldValue('allVnets', allVnets);\n this.props.formik.setFieldValue('selectedVnet', values.selectedVnet);\n this.props.formik.setFieldValue('vnet', values.vnet);\n this.props.formik.setFieldValue('vnetResourceGroup', values.vnetResourceGroup);\n this.props.formik.setFieldValue('selectedVnetSubnets', selectedVnetSubnets);\n this.props.formik.setFieldValue('selectedSubnet', values.selectedSubnet);\n this.props.formik.setFieldValue('subnet', values.subnet);\n };\n\n public render() {\n const loadBalancers =\n this.props.formik.values.loadBalancers || this.props.formik.values.backingData?.filtered?.loadBalancers || [];\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Load Balancer</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.loadBalancerChanged(event.target.value, true)}\n value={this.props.formik.values.loadBalancerName || ''}\n >\n <option value=\"\">None</option>\n {loadBalancers.map((loadBalancer: string) => (\n <option key={loadBalancer} value={loadBalancer}>\n {loadBalancer}\n </option>\n ))}\n </select>\n </div>\n </div>\n {this.props.formik.values.loadBalancerName && (\n <div className=\"well-compact text-center\">\n The load balancer {this.props.formik.values.loadBalancerName} is an{' '}\n {this.props.formik.values.loadBalancerType}\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nfunction getVnetSelectValue(vnet: any): string {\n return `${vnet.name}|${vnet.resourceGroup || ''}`;\n}\n\nfunction getVnetSelectLabel(vnet: any): string {\n return vnet.resourceGroup ? `${vnet.name} (${vnet.resourceGroup})` : vnet.name;\n}\n\nexport class ServerGroupNetworkSettings extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n const errors: { [key: string]: any } = {};\n\n if (!values.viewState?.networkSettingsConfigured) {\n return errors;\n }\n\n if (!values.selectedVnet) {\n errors.selectedVnet = 'Virtual network required.';\n }\n\n if (!values.subnet) {\n errors.selectedSubnet = 'Subnet required.';\n }\n\n return errors;\n }\n\n private selectedVnetChanged = (selected: string) => {\n const vnets = this.props.formik.values.allVnets || this.props.formik.values.backingData?.filtered?.vnets || [];\n const vnet = vnets.find((candidate: any) => getVnetSelectValue(candidate) === selected);\n const selectedVnetSubnets = (vnet?.subnets || [])\n .filter((subnet: any) =>\n (subnet.devices || []).every((device: any) => !device || device.type !== 'applicationGateways'),\n )\n .map((subnet: any) => subnet.name || subnet);\n this.props.formik.values.selectedVnet = vnet || null;\n this.props.formik.values.vnet = vnet?.name || null;\n this.props.formik.values.vnetResourceGroup = vnet?.resourceGroup || null;\n this.props.formik.values.selectedSubnet = null;\n this.props.formik.values.subnet = null;\n this.props.formik.values.selectedVnetSubnets = selectedVnetSubnets;\n this.props.formik.setFieldValue('selectedVnet', vnet || null);\n this.props.formik.setFieldValue('vnet', vnet?.name || null);\n this.props.formik.setFieldValue('vnetResourceGroup', vnet?.resourceGroup || null);\n this.props.formik.setFieldValue('selectedSubnet', null);\n this.props.formik.setFieldValue('subnet', null);\n this.props.formik.setFieldValue('selectedVnetSubnets', selectedVnetSubnets);\n };\n\n private selectedSubnetChanged = (subnet: string) => {\n this.props.formik.values.selectedSubnet = subnet || null;\n this.props.formik.values.subnet = subnet || null;\n this.props.formik.setFieldValue('selectedSubnet', subnet || null);\n this.props.formik.setFieldValue('subnet', subnet || null);\n };\n\n public render() {\n const { values } = this.props.formik;\n const vnets = values.allVnets || values.backingData?.filtered?.vnets || [];\n const subnets =\n values.selectedVnetSubnets || (values.selectedVnet?.subnets || []).map((subnet: any) => subnet.name || subnet);\n const showVnetSelect = values.loadBalancerType === 'Azure Load Balancer' || !values.loadBalancerType;\n\n if (!values.viewState?.networkSettingsConfigured) {\n return <h5 className=\"text-center\">Please select an account, a region and a load balancer first.</h5>;\n }\n\n return (\n <div className=\"container-fluid form-horizontal\">\n {showVnetSelect && (\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Virtual Network</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.selectedVnetChanged(event.target.value)}\n value={values.selectedVnet ? getVnetSelectValue(values.selectedVnet) : ''}\n >\n <option value=\"\">Select...</option>\n {vnets.map((vnet: any) => (\n <option key={getVnetSelectValue(vnet)} value={getVnetSelectValue(vnet)}>\n {getVnetSelectLabel(vnet)}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Subnets</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.selectedSubnetChanged(event.target.value)}\n value={values.subnet || ''}\n >\n <option value=\"\">Select...</option>\n {subnets.map((subnet: string) => (\n <option key={subnet} value={subnet}>\n {subnet}\n </option>\n ))}\n </select>\n </div>\n </div>\n {!values.viewState?.hideClusterNamePreview && (\n <div className=\"well-compact text-center\">\n <p>Your server group will be using a subnet in virtual network:</p>\n <strong>{values.selectedVnet?.name || 'Virtual network was not selected'}</strong>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { AzureWizardPage } from './common';\n\nexport class ServerGroupSecurityGroups extends AzureWizardPage {\n private securityGroupChanged = (securityGroupId: string) => {\n const securityGroups = this.props.formik.values.backingData?.filtered?.securityGroups || [];\n const selectedSecurityGroup = securityGroups.find(\n (securityGroup: any) => (securityGroup.id || securityGroup.name) === securityGroupId,\n );\n this.props.formik.values.selectedSecurityGroup = selectedSecurityGroup || null;\n this.props.formik.values.securityGroupName = securityGroupId || null;\n this.props.formik.setFieldValue('selectedSecurityGroup', selectedSecurityGroup || null);\n this.props.formik.setFieldValue('securityGroupName', securityGroupId || null);\n };\n\n public render() {\n const { values } = this.props.formik;\n const securityGroups = values.backingData?.filtered?.securityGroups || [];\n if (!values.viewState?.securityGroupsConfigured) {\n return <h5 className=\"text-center\">Please select an account and region.</h5>;\n }\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Firewall</div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n onChange={(event) => this.securityGroupChanged(event.target.value)}\n value={values.selectedSecurityGroup?.id || values.securityGroupName || ''}\n >\n <option value=\"\">Select...</option>\n {securityGroups.map((securityGroup: any) => {\n const securityGroupId = securityGroup.id || securityGroup.name || securityGroup;\n return (\n <option key={securityGroupId} value={securityGroupId}>\n {securityGroupId}\n </option>\n );\n })}\n </select>\n </div>\n </div>\n <div className=\"form-group small\" style={{ marginTop: '20px' }}>\n <div className=\"col-md-9 col-md-offset-3\">\n <p>If you're not finding a firewall that was recently added, refresh the list and reopen this dialog.</p>\n </div>\n </div>\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { MapEditor } from '@spinnaker/core';\n\nimport { AzureWizardPage } from './common';\nimport Utility from '../../../../utility';\n\nexport class ServerGroupTags extends AzureWizardPage {\n public validate(values: any): { [key: string]: any } {\n const tagResult = Utility.checkTags(values.instanceTags);\n return tagResult.isValid ? {} : { instanceTags: tagResult.errorMessage };\n }\n\n private tagsChanged = (instanceTags: any) => {\n this.props.formik.values.instanceTags = instanceTags;\n this.props.formik.setFieldValue('instanceTags', instanceTags);\n };\n\n public render() {\n const tagResult = Utility.checkTags(this.props.formik.values.instanceTags);\n return (\n <div className=\"container-fluid form-horizontal\">\n {!tagResult.isValid && <div className=\"col-md-12 text-danger\">{tagResult.errorMessage}</div>}\n <div className=\"form-group\">\n <div className=\"col-md-4 sm-label-left\">\n <b>Custom Tags</b>\n </div>\n <div className=\"col-md-12\">\n <MapEditor\n addButtonLabel=\"Add New Tags\"\n allowEmpty={true}\n model={this.props.formik.values.instanceTags || {}}\n onChange={this.tagsChanged}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\n\nimport type {\n Application,\n DeckRuntimeServices,\n IModalComponentProps,\n IRouterInjectedProps,\n IStage,\n ITemplateSelectionText,\n} from '@spinnaker/core';\nimport {\n DeckRuntimeContext,\n DeployInitializer,\n FirewallLabels,\n noop,\n ReactModal,\n TaskMonitor,\n withRouter,\n WizardModal,\n WizardPage,\n} from '@spinnaker/core';\n\nimport {\n ServerGroupAdvancedSettings,\n ServerGroupBasicSettings,\n ServerGroupCapacityAndZones,\n ServerGroupHealthSettings,\n ServerGroupImageSettings,\n ServerGroupInstanceType,\n ServerGroupLoadBalancers,\n ServerGroupNetworkSettings,\n ServerGroupSecurityGroups,\n ServerGroupTags,\n} from './pages';\nimport type { AzureServerGroupConfigurationService } from '../serverGroupConfiguration.service';\n\nexport interface IAzureCloneServerGroupModalProps extends IModalComponentProps {\n application: Application;\n command: any;\n title: string;\n}\n\ninterface IAzureCloneServerGroupModalState {\n command: any;\n loaded: boolean;\n requiresTemplateSelection: boolean;\n taskMonitor: TaskMonitor;\n templateSelectionText: ITemplateSelectionText;\n}\n\nexport class AzureCloneServerGroupModalComponent extends React.Component<\n IAzureCloneServerGroupModalProps & IRouterInjectedProps,\n IAzureCloneServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public static defaultProps: Partial<IAzureCloneServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private _isUnmounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n public static show(props: IAzureCloneServerGroupModalProps, runtimeServices: DeckRuntimeServices): Promise<any> {\n return ReactModal.show(\n AzureCloneServerGroupModal,\n props,\n { dialogClassName: 'wizard-modal modal-lg' },\n runtimeServices,\n );\n }\n\n constructor(props: IAzureCloneServerGroupModalProps & IRouterInjectedProps) {\n super(props);\n const requiresTemplateSelection = !!props.command.viewState?.requiresTemplateSelection;\n const workingCommand = cloneDeep(props.command);\n const alreadyConfigured =\n !requiresTemplateSelection && workingCommand.backingData?.accounts && workingCommand.backingData?.filtered;\n const templateSelectionText: ITemplateSelectionText = {\n copied: [\n 'account, region, subnet, cluster name (stack, details)',\n 'load balancers',\n FirewallLabels.get('firewalls'),\n 'instance type',\n 'all fields on the Advanced Settings page',\n ],\n notCopied: [],\n additionalCopyText:\n 'If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group.',\n };\n\n if (!props.command.viewState?.disableStrategySelection) {\n templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n this.state = {\n command: workingCommand,\n loaded: !!alreadyConfigured,\n requiresTemplateSelection,\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: 'Creating your server group',\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n }),\n templateSelectionText,\n };\n }\n\n public componentDidMount(): void {\n if (this.state.loaded) {\n this.completeConfiguration(this.state.command);\n } else if (!this.state.requiresTemplateSelection) {\n this.prepareCommand();\n }\n }\n\n private get configurationService(): AzureServerGroupConfigurationService {\n return this.context.services.providerServiceDelegate.getDelegate('azure', 'serverGroup.configurationService');\n }\n\n private templateSelected = (): void => {\n this.setState({ loaded: false, requiresTemplateSelection: false });\n this.prepareCommand();\n };\n\n public componentWillUnmount(): void {\n this._isUnmounted = true;\n this.clearApplicationRefreshSubscription();\n }\n\n private onTaskComplete = () => {\n this.clearApplicationRefreshSubscription();\n this.applicationRefreshUnsubscribe = this.props.application.serverGroups.onNextRefresh(this.onApplicationRefresh);\n this.props.application.serverGroups.refresh();\n };\n\n private onApplicationRefresh = (): void => {\n this.clearApplicationRefreshSubscription();\n if (this._isUnmounted) {\n return;\n }\n const { command } = this.state;\n const cloneStage = this.state.taskMonitor.task.execution.stages.find(\n (stage: IStage) => stage.type === 'cloneServerGroup',\n );\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][command.region];\n if (newServerGroupName) {\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (this.props.stateService.includes('**.clusters.serverGroup')) {\n transitionTo = '^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters.cluster.serverGroup')) {\n transitionTo = '^.^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters')) {\n transitionTo = '.serverGroup';\n }\n this.props.stateService.go(transitionTo, {\n accountId: command.credentials,\n provider: 'azure',\n region: command.region,\n serverGroup: newServerGroupName,\n });\n }\n }\n };\n\n private clearApplicationRefreshSubscription = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n };\n\n private prepareCommand = () => {\n const { application } = this.props;\n const { command } = this.state;\n command.viewState = command.viewState || {};\n command.processCommandUpdateResult = this.processCommandUpdateResult;\n\n const alreadyConfigured = command.backingData?.accounts && command.backingData?.filtered;\n const configure = alreadyConfigured\n ? null\n : (this.configurationService as any).configureCommand(application, command);\n\n const completeConfiguration = () => {\n this.completeConfiguration(command);\n if (!this._isUnmounted) {\n this.setState({ loaded: true, requiresTemplateSelection: false });\n }\n };\n\n if (configure) {\n configure.then(completeConfiguration);\n } else {\n completeConfiguration();\n }\n };\n\n private completeConfiguration(command: any): void {\n command.backingData = command.backingData || {};\n command.backingData.filtered = command.backingData.filtered || {};\n command.backingData.filtered.regions = command.backingData.filtered.regions || [];\n command.backingData.packageImages = command.backingData.packageImages || command.images || [];\n command.processCommandUpdateResult = this.processCommandUpdateResult;\n this.attachCommandHandlers(command);\n this.processCommandUpdateResult(command.credentialsChanged?.(command, true));\n this.processCommandUpdateResult(command.regionChanged?.(command, true));\n }\n\n private attachCommandHandlers(command: any): void {\n if (command.viewState.azureReactHandlersAttached) {\n return;\n }\n const credentialsChanged = command.credentialsChanged;\n const regionChanged = command.regionChanged;\n command.credentialsChanged = (cmd: any, isInit = false) =>\n this.withImageConfiguration(cmd, credentialsChanged?.(cmd, isInit));\n command.regionChanged = (cmd: any, isInit = false) =>\n this.withImageConfiguration(cmd, regionChanged?.(cmd, isInit));\n command.viewState.azureReactHandlersAttached = true;\n }\n\n private withImageConfiguration(command: any, result: any = { dirty: {} }): any {\n const imageResult = (this.configurationService as any).configureImages(command) || { dirty: {} };\n return { dirty: { ...(result.dirty || {}), ...(imageResult.dirty || {}) } };\n }\n\n private processCommandUpdateResult = (result: any = { dirty: {} }) => {\n const dirty = result.dirty || {};\n if (!Object.keys(dirty).length) {\n return;\n }\n const viewState = (this.state.command.viewState = this.state.command.viewState || {});\n viewState.dirty = { ...(viewState.dirty || {}), ...dirty };\n };\n\n public submit = (command: any): any => {\n const mode = command.viewState?.mode;\n if (mode === 'editPipeline' || mode === 'createPipeline') {\n return this.props.closeModal(command);\n }\n return this.state.taskMonitor.submit(() =>\n this.context.services.serverGroupWriter.cloneServerGroup(command, this.props.application),\n );\n };\n\n public render() {\n const { application, dismissModal, title } = this.props;\n const { command } = this.state;\n if (this.state.requiresTemplateSelection) {\n return (\n <DeployInitializer\n application={application}\n cloudProvider=\"azure\"\n command={command}\n onDismiss={dismissModal}\n onTemplateSelected={this.templateSelected}\n templateSelectionText={this.state.templateSelectionText}\n />\n );\n }\n\n return (\n <WizardModal<any>\n closeModal={this.submit}\n dismissModal={dismissModal}\n heading={title}\n initialValues={command}\n loading={!this.state.loaded}\n submitButtonLabel={command.viewState?.submitButtonLabel}\n taskMonitor={this.state.taskMonitor}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupBasicSettings ref={innerRef} app={application} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Image\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupImageSettings ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Instance Type\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupInstanceType ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Capacity and Zones\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupCapacityAndZones ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Load Balancers\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupLoadBalancers ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Network Settings\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupNetworkSettings ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label={FirewallLabels.get('Firewalls')}\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupSecurityGroups ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Health\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupHealthSettings ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Advanced Settings\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupAdvancedSettings ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n <WizardPage\n label=\"Tags\"\n order={nextIdx()}\n render={({ innerRef }) => <ServerGroupTags ref={innerRef} formik={formik} />}\n wizard={wizard}\n />\n </>\n )}\n />\n );\n }\n}\n\nexport const AzureCloneServerGroupModal = Object.assign(\n withRouter<IAzureCloneServerGroupModalProps & IRouterInjectedProps>(AzureCloneServerGroupModalComponent),\n { show: AzureCloneServerGroupModalComponent.show },\n);\n","import React from 'react';\n\nimport { UserVerification } from '@spinnaker/core';\n\nexport interface IAzureModalFooterProps {\n onSubmit: () => void;\n onCancel: () => void;\n isValid: boolean;\n account: string;\n}\n\nexport interface IAzureModalFooterState {\n verified: boolean;\n}\n\nexport class AzureModalFooter extends React.Component<IAzureModalFooterProps, IAzureModalFooterState> {\n constructor(props: any) {\n super(props);\n }\n\n public state = { verified: false };\n\n private handleVerification = (verified: boolean) => {\n this.setState({ verified });\n };\n\n public render() {\n const { onSubmit, onCancel, isValid, account } = this.props;\n const { verified } = this.state;\n\n return (\n <div className=\"modal-footer\">\n {<UserVerification expectedValue={account} onValidChange={this.handleVerification} />}\n <button className=\"btn btn-default\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"submit\" className=\"btn btn-primary\" onClick={onSubmit} disabled={!isValid || !verified}>\n Submit\n </button>\n </div>\n );\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport Select from 'react-select';\n\nimport type { DeckRuntimeServices, IModalComponentProps } from '@spinnaker/core';\nimport {\n DeckRuntimeContext,\n ModalClose,\n noop,\n ReactModal,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n} from '@spinnaker/core';\n\nimport { AzureModalFooter } from '../../../common/AzureModalFooter';\n\nexport interface IAzureRollbackServerGroupModalProps extends IModalComponentProps {\n application: any;\n serverGroup: any;\n disabledServerGroups: any[];\n}\n\nexport interface IAzureRollbackServerGroupModalState {\n taskMonitor: TaskMonitor;\n submitting: boolean;\n command: any;\n}\n\nexport class AzureRollbackServerGroupModal extends React.Component<\n IAzureRollbackServerGroupModalProps,\n IAzureRollbackServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public static defaultProps: Partial<IAzureRollbackServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IAzureRollbackServerGroupModalProps, runtimeServices: DeckRuntimeServices) {\n const modalProps = {};\n return ReactModal.show(AzureRollbackServerGroupModal, props, modalProps, runtimeServices);\n }\n\n constructor(props: IAzureRollbackServerGroupModalProps) {\n super(props);\n\n const { application, serverGroup } = props;\n\n this.state = {\n taskMonitor: new TaskMonitor({\n application,\n title: 'Rolling back your server group',\n onDismiss: () => this.props.dismissModal(),\n }),\n submitting: true,\n command: {\n interestingHealthProviderNames: [],\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n enableAndDisableOnly: true,\n },\n },\n };\n }\n\n private close = (args?: any) => {\n this.props.dismissModal.apply(null, args);\n };\n\n private submit = () => {\n const { command, taskMonitor } = this.state;\n const { serverGroup, application } = this.props;\n\n taskMonitor.submit(() =>\n this.context.services.serverGroupWriter.rollbackServerGroup(serverGroup, application, command),\n );\n };\n\n private filterServerGroups = (disabledServerGroups: any[]) => {\n return disabledServerGroups\n .filter((disabledServerGroup: any) => disabledServerGroup.instanceCounts.total !== 0)\n .sort((a: any, b: any) => b.name.localeCompare(a.name));\n };\n\n private isValid = () => {\n return this.state.command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n private handleServerGroupChange = (restoreServerGroupOption: any) => {\n const { disabledServerGroups } = this.props;\n const command = { ...this.state.command };\n command.rollbackContext.restoreServerGroupName = restoreServerGroupOption.value;\n const restoreServerGroup = this.filterServerGroups(disabledServerGroups).find((disabledServerGroup: any) => {\n return disabledServerGroup.name === restoreServerGroupOption.value;\n });\n command.targetSize = restoreServerGroup.capacity.max;\n this.setState({ command });\n };\n\n private handleTaskReasonChange = (taskReason?: any) => {\n const command = { ...this.state.command, reason: taskReason };\n this.setState({ command });\n };\n\n public render() {\n const { command, taskMonitor, submitting } = this.state;\n const { serverGroup, disabledServerGroups } = this.props;\n const disabledServerGroupOptions = this.filterServerGroups(disabledServerGroups).map(\n (disabledServerGroup: any) => ({\n label: disabledServerGroup.name,\n value: disabledServerGroup.name,\n }),\n );\n\n return (\n <Modal onHide={this.close}>\n <TaskMonitorWrapper monitor={taskMonitor} />\n {submitting && (\n <form role=\"form\">\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Rollback {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"row\">\n <div className=\"col-sm-3 sm-label-right\">Restore to</div>\n <div className=\"col-sm-6\">\n <Select\n value={command.rollbackContext.restoreServerGroupName}\n onChange={this.handleServerGroupChange}\n options={disabledServerGroupOptions}\n />\n </div>\n </div>\n <TaskReason reason={command.taskReason} onChange={this.handleTaskReasonChange} />\n </Modal.Body>\n <AzureModalFooter\n onSubmit={this.submit}\n onCancel={this.close}\n isValid={this.isValid()}\n account={serverGroup.account}\n />\n </form>\n )}\n </Modal>\n );\n }\n}\n","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\nimport { Observable } from 'rxjs';\nimport type { Subscriber } from 'rxjs';\n\nimport type {\n IRouterInjectedProps,\n IServerGroupActionsProps,\n IServerGroupDetailsProps,\n IServerGroupDetailsSectionProps,\n} from '@spinnaker/core';\nimport {\n AccountTag,\n CloudProviderRegistry,\n CollapsibleSection,\n ConfirmationModalService,\n FirewallLabels,\n HealthCounts,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n timestamp,\n useDeckRuntimeServices,\n withRouter,\n} from '@spinnaker/core';\n\nimport { AzureRollbackServerGroupModal } from './rollback/RollbackServerGroupModal';\n\nfunction findServerGroupSummary(props: IServerGroupDetailsProps): Promise<any> {\n const { app, serverGroup } = props;\n const findSummary = () => {\n let summary = app.serverGroups.data.find((toCheck: any) => {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n\n if (!summary) {\n app.loadBalancers.data.some((loadBalancer: any) => {\n if (loadBalancer.account !== serverGroup.accountId || loadBalancer.region !== serverGroup.region) {\n return false;\n }\n return (loadBalancer.serverGroups || []).some((possibleServerGroup: any) => {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n return false;\n });\n });\n }\n\n return summary;\n };\n\n return app.ready ? app.ready().then(findSummary) : Promise.resolve(findSummary());\n}\n\nfunction decorateAzureServerGroup(serverGroup: any, app: any, accountId: string, region: string): any {\n if (serverGroup.image?.description) {\n serverGroup.image.description.split(', ').forEach((tag: string) => {\n const [key, value] = tag.split('=');\n if (key === 'ancestor_name' && value) {\n serverGroup.image.baseImage = value;\n }\n });\n }\n\n const securityGroupIds = serverGroup.launchConfig?.securityGroups || [];\n if (securityGroupIds.length) {\n serverGroup.securityGroups = securityGroupIds\n .map((id: string) => {\n return app.securityGroups.data.find((securityGroup: any) => {\n return (\n securityGroup.accountName === accountId &&\n securityGroup.region === region &&\n (securityGroup.id === id || securityGroup.name === id)\n );\n });\n })\n .filter(Boolean);\n }\n\n return serverGroup;\n}\n\nexport function azureServerGroupDetailsGetter(props: IServerGroupDetailsProps, autoClose: () => void): Observable<any> {\n const { app, serverGroup: serverGroupInfo } = props;\n return new Observable<any>((observer: Subscriber<any>) => {\n findServerGroupSummary(props).then(\n (summary) => {\n if (!summary) {\n autoClose();\n observer.complete();\n return;\n }\n\n ServerGroupReader.getServerGroup(\n app.name,\n serverGroupInfo.accountId,\n serverGroupInfo.region,\n serverGroupInfo.name,\n ).then(\n (details: any) => {\n if (!details || Object.keys(details).length === 0) {\n autoClose();\n observer.complete();\n return;\n }\n\n const serverGroup = decorateAzureServerGroup(\n Object.assign(details, summary, { account: serverGroupInfo.accountId }),\n app,\n serverGroupInfo.accountId,\n serverGroupInfo.region,\n );\n observer.next(serverGroup);\n },\n () => {\n autoClose();\n observer.complete();\n },\n );\n },\n () => {\n autoClose();\n observer.complete();\n },\n );\n });\n}\n\nexport function AzureServerGroupActionsComponent({\n app,\n serverGroup,\n stateService,\n}: IServerGroupActionsProps & IRouterInjectedProps) {\n const runtimeServices = useDeckRuntimeServices();\n const { serverGroupCommandBuilder, serverGroupWriter } = runtimeServices;\n const destroyServerGroup = (): void => {\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const confirmationModalParams = {\n header: `Really destroy ${serverGroup.name}?`,\n buttonText: `Destroy ${serverGroup.name}`,\n account: serverGroup.account,\n taskMonitorConfig: {\n application: app,\n title: `Destroying ${serverGroup.name}`,\n onTaskComplete: () => {\n if (stateService.includes('**.serverGroup', stateParams)) {\n stateService.go('^');\n }\n },\n },\n submitMethod: (params: any) => serverGroupWriter.destroyServerGroup(serverGroup, app, params),\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n const disableServerGroup = (): void => {\n const confirmationModalParams = {\n header: `Really disable ${serverGroup.name}?`,\n buttonText: `Disable ${serverGroup.name}`,\n account: serverGroup.account,\n taskMonitorConfig: {\n application: app,\n title: `Disabling ${serverGroup.name}`,\n },\n submitMethod: (params: any) => serverGroupWriter.disableServerGroup(serverGroup, app.name, params),\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n const enableServerGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really enable ${serverGroup.name}?`,\n buttonText: `Enable ${serverGroup.name}`,\n account: serverGroup.account,\n taskMonitorConfig: {\n application: app,\n title: `Enabling ${serverGroup.name}`,\n },\n submitMethod: (params: any) =>\n serverGroupWriter.enableServerGroup(serverGroup, app, {\n ...params,\n interestingHealthProviderNames: [],\n }),\n });\n };\n\n const rollbackServerGroup = (): void => {\n const cluster = (app.clusters || []).find(\n (candidate: any) => candidate.name === serverGroup.cluster && candidate.account === serverGroup.account,\n );\n const disabledServerGroups = (cluster?.serverGroups || []).filter((candidate: any) => {\n return candidate.isDisabled && candidate.region === serverGroup.region;\n });\n AzureRollbackServerGroupModal.show({ application: app, serverGroup, disabledServerGroups }, runtimeServices);\n };\n\n const cloneServerGroup = (): void => {\n const CloneServerGroupModal = CloudProviderRegistry.getValue('azure', 'serverGroup.CloneServerGroupModal');\n if (CloneServerGroupModal?.show) {\n serverGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup).then((command: any) => {\n CloneServerGroupModal.show({ application: app, command, title: `Clone ${serverGroup.name}` }, runtimeServices);\n });\n }\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"azure-server-group-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Server Group Actions</Dropdown.Toggle>\n <Dropdown.Menu className=\"dropdown-menu\">\n {!serverGroup.isDisabled && (\n <li>\n <a className=\"clickable\" onClick={rollbackServerGroup}>\n Rollback\n </a>\n </li>\n )}\n <li>\n <a className=\"clickable\" onClick={disableServerGroup}>\n Disable\n </a>\n </li>\n <li>\n <a className=\"clickable\" onClick={enableServerGroup}>\n Enable\n </a>\n </li>\n <li>\n <a className=\"clickable\" onClick={destroyServerGroup}>\n Destroy\n </a>\n </li>\n <li>\n <a className=\"clickable\" onClick={cloneServerGroup}>\n Clone\n </a>\n </li>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nexport const AzureServerGroupActions = withRouter(AzureServerGroupActionsComponent);\n\nexport function AzureServerGroupInformationSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Server Group Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(serverGroup.createdTime)}</dd>\n <dt>Region</dt>\n <dd>\n <AccountTag account={serverGroup.account} />\n {serverGroup.region}\n </dd>\n <dt>Image</dt>\n <dd>{serverGroup.image?.imageName || '-'}</dd>\n <dt>SKU</dt>\n <dd>{serverGroup.sku?.name || '-'}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function AzureServerGroupSizeSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Size\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Current</dt>\n <dd>{serverGroup.instances?.length ?? 0}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function AzureServerGroupHealthSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Health\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Instances</dt>\n <dd>\n <HealthCounts container={serverGroup.instanceCounts} className=\"pull-left\" />\n </dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function AzureServerGroupFirewallsSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading={FirewallLabels.get('Firewalls')}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Name</dt>\n <dd>{serverGroup.securityGroupName || '-'}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport const azureServerGroupDetailsSections = [\n AzureServerGroupInformationSection,\n AzureServerGroupSizeSection,\n AzureServerGroupHealthSection,\n AzureServerGroupFirewallsSection,\n];\n","import { ApplicationNameValidator } from '@spinnaker/core';\n\nexport const azureApplicationNameValidator = {\n validate(name) {\n function validateSpecialCharacters(value, errors) {\n const pattern = /^([a-zA-Z][a-zA-Z0-9]*)?$/;\n if (!pattern.test(value)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters or digits. No ' +\n 'special characters are allowed.',\n );\n }\n }\n\n const warnings = [];\n const errors = [];\n\n if (name && name.length) {\n validateSpecialCharacters(name, errors);\n }\n\n return {\n warnings: warnings,\n errors: errors,\n };\n },\n};\n\nApplicationNameValidator.registerValidator('azure', azureApplicationNameValidator);\n","import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './help/azure.help';\nimport { AzureImageReader } from './image/image.reader';\nimport { AzureInstanceTypeService } from './instance/azureInstanceType.service';\nimport { AzureInstanceDetails } from './instance/details/AzureInstanceDetails';\nimport { AzureLoadBalancerChoiceModal } from './loadBalancer/configure/AzureLoadBalancerChoiceModal';\nimport {\n AzureLoadBalancerActions,\n azureLoadBalancerDetailsSections,\n useAzureLoadBalancerDetails,\n} from './loadBalancer/details/azureLoadBalancerDetails';\nimport { AzureLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';\nimport logo from './logo/logo_azure.png';\nimport { registerAzureBakeStage } from './pipeline/stages/bake/azureBakeStage';\nimport { registerAzureDestroyAsgStage } from './pipeline/stages/destroyAsg/azureDestroyAsgStage';\nimport { registerAzureDisableAsgStage } from './pipeline/stages/disableAsg/azureDisableAsgStage';\nimport { registerAzureEnableAsgStage } from './pipeline/stages/enableAsg/azureEnableAsgStage';\nimport { AzureSecurityGroupModal } from './securityGroup/configure/AzureSecurityGroupModal';\nimport { AzureSecurityGroupDetails } from './securityGroup/details/AzureSecurityGroupDetails';\nimport { AzureSecurityGroupReader } from './securityGroup/securityGroup.reader';\nimport { AzureSecurityGroupTransformer } from './securityGroup/securityGroup.transformer';\nimport { AzureServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { AzureServerGroupConfigurationService } from './serverGroup/configure/serverGroupConfiguration.service';\nimport { AzureCloneServerGroupModal } from './serverGroup/configure/wizard/AzureCloneServerGroupModal';\nimport {\n AzureServerGroupActions,\n azureServerGroupDetailsGetter,\n azureServerGroupDetailsSections,\n} from './serverGroup/details/azureServerGroupDetails';\nimport { AzureServerGroupTransformer } from './serverGroup/serverGroup.transformer';\nimport './validation/applicationName.validator';\n\nimport './logo/azure.logo.less';\n\nexport function registerAzureProvider(): void {\n CloudProviderRegistry.registerProvider('azure', {\n name: 'Azure',\n logo: {\n path: logo,\n },\n image: {\n reader: AzureImageReader,\n },\n serverGroup: {\n transformer: AzureServerGroupTransformer,\n commandBuilder: AzureServerGroupCommandBuilder,\n configurationService: AzureServerGroupConfigurationService,\n CloneServerGroupModal: AzureCloneServerGroupModal,\n detailsGetter: azureServerGroupDetailsGetter,\n detailsActions: AzureServerGroupActions,\n detailsSections: azureServerGroupDetailsSections,\n },\n instance: {\n details: AzureInstanceDetails,\n instanceTypeService: AzureInstanceTypeService,\n },\n loadBalancer: {\n transformer: AzureLoadBalancerTransformer,\n CreateLoadBalancerModal: AzureLoadBalancerChoiceModal,\n useDetailsHook: useAzureLoadBalancerDetails,\n detailsActions: AzureLoadBalancerActions,\n detailsSections: azureLoadBalancerDetailsSections,\n },\n securityGroup: {\n transformer: AzureSecurityGroupTransformer,\n reader: AzureSecurityGroupReader,\n CreateSecurityGroupModal: AzureSecurityGroupModal,\n details: AzureSecurityGroupDetails,\n },\n });\n}\n\nexport function registerAzurePipelineStages(): void {\n registerAzureDestroyAsgStage();\n registerAzureEnableAsgStage();\n registerAzureDisableAsgStage();\n registerAzureBakeStage();\n}\n\nregisterAzureProvider();\nregisterAzurePipelineStages();\nDeploymentStrategyRegistry.registerProvider('azure', ['redblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHv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\"","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":["AzureLoadBalancerTypes","type","description","_Utility","checkTags","tagsObject","isValid","error","errorMessage","length","Object","keys","TAG_LIMITATION","k","v","entries","TAG_KEY_LENGTH_LIMITATION","TAG_VALUE_LENGTH_LIMITATION","TAG_INVALID_CHAR_REG_EXR","test","getLoadBalancerType","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","forEach","key","HelpContentsRegistry","register","AzureImageReader","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","AzureInstanceTypeService","constructor","promiseService","categories","label","families","instanceTypes","name","cpu","memory","storage","count","size","icon","calculateStorage","getCategories","map","category","family","inst","costFactor","stats","min","Number","MAX_VALUE","max","push","cpuMin","_","minBy","cpuMax","maxBy","memoryMin","memoryMax","storageMin","storageMax","Math","buildStats","resolve","this","getAvailableTypesForRegions","locationToInstanceTypesMap","selectedLocations","location","getAllTypesByRegion","AzureInstanceDetailsComponent","React","Component","super","arguments","state","instance","props","initialInstance","loading","activeRequestId","isUnmounted","retrieveInstance","clearInstance","requestId","instanceParams","getInstanceParams","setState","async","app","_a","lookup","serverGroups","instanceId","_b","data","serverGroup","summary","instances","possibleInstance","id","account","extraData","vpcId","loadBalancers","findInServerGroups","loadBalancer","findInLoadBalancerInstances","filter","isDisabled","findInLoadBalancerServerGroups","disabledServerGroups","findInDisabledLoadBalancerServerGroups","findAzureInstanceSummary","instanceIdNotFound","RecentHistoryService","addExtraDataToLatest","details","InstanceReader","getInstanceDetails","healthMetrics","standalone","displayableMetrics","health","metric","latestHealth","latestMatch","latest","extractHealthMetrics","isStandalone","discoveryMetric","loadedInstance","baseIpAddress","publicDnsName","privateIpAddress","vipAddress","includes","loadAzureInstanceDetails","stateService","go","componentDidMount","Promise","all","ready","onRefresh","unsubscribeFromRefresh","componentDidUpdate","prevProps","previousParams","currentParams","componentWillUnmount","$stateParams","stateParams","render","className","createElement","InstanceDetailsHeader","healthState","AzureInstanceActionsComponent","router","AzureInstanceInformationSection","hasHealthState","healthProviderType","some","loadBalancerNames","closeIfCurrentInstance","confirm","header","buttonText","title","submitMethod","closeOnComplete","ConfirmationModalService","taskMonitorConfig","application","onTaskComplete","Dropdown","Toggle","Menu","MenuItem","onClick","InstanceWriter","terminateInstance","terminateInstanceAndShrinkServerGroup","rebootInstance","canRegisterWithLoadBalancer","registerInstanceWithLoadBalancer","deregisterInstanceFromLoadBalancer","canRegisterWithDiscovery","enableInstanceInDiscovery","disableInstanceInDiscovery","withRouter","AzureInstanceDetails","CollapsibleSection","heading","defaultExpanded","launchTime","timestamp","AccountTag","instanceType","UISref","to","accountId","AzureProviderSettings","SETTINGS","providers","azure","defaults","resetToOriginal","resetProvider","AzureLoadBalancerTransformer","normalizeLoadBalancer","detachedInstances","concat","activeServerGroups","chain","flatten","value","convertLoadBalancerForEditing","toEdit","stack","detail","vnet","subnet","probes","loadBalancingRules","elb","securityGroups","dnsName","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","cloudProvider","probeName","probeProtocol","probePort","probePath","probeInterval","unhealthyThreshold","timeout","ruleName","protocol","externalPort","backendPort","persistence","idleTimeout","sku","validSkus","getAzureLoadBalancerTypeChoice","loadBalancerType","normalizedType","normalized","String","normalizeLoadBalancerTypeName","candidate","formatInputValue","getAzureVnetSelectValue","resourceGroup","getAzureVnetSelectLabel","isAzureLoadBalancerType","listenerProtocolOptions","probeProtocolOptions","parseOptionalNumber","parsed","isFinite","applyAzureLoadBalancerTypeDefaults","listenerOptions","probeOptions","sessionPersistence","probe","rule","isPresent","validateNonNegative","errors","message","isNegativeNumber","validateAzureLoadBalancerForSubmit","options","rules","isNew","isValidDetail","existingLoadBalancerNames","selectedVnet","selectedSubnet","index","indexOf","AzureLoadBalancerModalComponent","mounted","transformer","nativePromiseService","getApplication","applicationRefreshUnsubscribe","call","onNextRefresh","onApplicationRefresh","refresh","closeModal","newStateParams","updateName","updateLoadBalancer","getName","accountUpdated","AccountService","getRegionsForAccount","regions","regionUpdated","updateLoadBalancerNames","vnetUpdated","getDataSource","vnetResourceGroup","selectedVnets","NetworkReader","listNetworks","networks","Array","isArray","subnetUpdated","selectedSubnets","selectedVnetChanged","vnetName","vnets","subnets","devices","every","device","selectedSubnetChanged","subnetName","updateField","field","updateNamePart","updateProbe","updateRule","updateFirstRule","addListener","removeListener","splice","submit","descriptor","clusterName","ruleNameBase","subnetType","normalizeAzureLoadBalancerForSubmit","forPipelineConfig","appName","resourceGroupName","loadBalancerName","taskMonitor","LoadBalancerWriter","upsertLoadBalancer","TaskMonitor","onDismiss","dismissModal","accounts","accountsLoaded","initializeLoadBalancer","show","ReactModal","AzureLoadBalancerModal","dialogClassName","initializeCreateMode","sourceLoadBalancer","_c","_d","_e","sourceRule","convertedRule","liftAzureLoadBalancerSessionPersistence","nameParts","NameUtils","parseLoadBalancerName","freeFormDetails","listAccounts","replace","values","callback","renderInput","onChange","event","target","renderSelect","getLabel","item","getValue","renderSkuSelect","renderProbeInput","renderFirstRuleInput","submitting","validationErrors","showCreateFields","showNetworkFields","shouldRenderNetworkFields","showSkuField","shouldRenderSkuField","Fragment","TaskMonitorWrapper","monitor","ModalClose","dismiss","Modal","Header","Title","Body","onSubmit","preventDefault","Footer","disabled","SubmitButton","defaultProps","noop","assign","_AzureLoadBalancerChoiceModal","choose","configurePromise","selectedChoice","close","reason","choices","componentProps","choiceSelected","choice","Button","supportsPipelineConfig","AzureLoadBalancerChoiceModal","loadAzureLoadBalancerDetails","autoClose","loadBalancerParams","loadBalancerReader","reader","securityGroupReader","getLoadBalancerDetails","securityGroupIds","securityGroupId","getApplicationSecurityGroup","Boolean","sort","a","b","localeCompare","resolveSecurityGroups","part","lower","substring","toUpperCase","useAzureLoadBalancerDetails","azureLoadBalancerParams","dataSource","loaded","useDataSource","useDeckRuntimeServices","setData","useState","loadingDetails","setLoadingDetails","detailsError","setDetailsError","autoCloseRef","useRef","isMountedRef","requestGenerationRef","useEffect","current","loadDetails","useCallback","requestGeneration","e","refetch","AzureLoadBalancerActions","canDeleteLoadBalancer","command","deleteLoadBalancer","sortServerGroups","azureLoadBalancerDetailsSections","showNetwork","createdTime","slice","href","CopyToClipboard","text","toolTip","HealthCounts","container","instanceCounts","FirewallLabels","securityGroup","osTypeOptions","packageTypeOptions","deleteEmptyProperties","stage","reduce","acc","sourceImageMode","managedImage","publisher","AzureBakeStageConfig","azureImageReader","baseLabelOptions","baseOsOptions","extendedAttributeKey","extendedAttributeValue","loadError","managedImageOptions","roscoMode","showAdvancedOptions","initialize","extendedAttributes","getCredentialsKeyedByAccount","BakeryReader","getRegions","getBaseOsOptions","getBaseLabelOptions","credentialsKeyedByAccount","nextStage","applyDefaults","baseImages","replaceStage","nextState","showAdvanced","loadManagedImages","catch","user","AuthenticationService","getAuthenticatedUser","baseLabel","baseOs","prototype","hasOwnProperty","updateStage","updateStageField","changes","feature","roscoSelector","updateExtendedAttribute","removeExtendedAttribute","addExtendedAttribute","trim","templateFileName","varFileName","managedImages","images","image","imageName","osType","ostype","loadAccountRegions","setSourceImageMode","sourceImageModeValue","offer","packageType","onAccountChange","onManagedImageChange","selectedManagedImage","option","renderSourceImageFields","StageConfigField","checked","baseOsOption","baseOsName","displayName","shortDescription","baseOsDescription","Spinner","showAdvancedFields","Set","add","delete","scalarRegion","from","role","helpKey","package","rebake","style","marginBottom","baseName","placeholder","interpolatedBakeDetailUrl","context","template","roscoDetailUrl","bakeryDetailUrl","source","_match","valueForPath","AzureBakeExecutionDetails","execution","resourceId","status","showRebake","trigger","ExecutionDetailsSection","ami","StageFailureMessage","failureMessage","isFailed","previouslyBaked","rel","uniqueSorted","regionName","AzureAccountRegionClusterSelector","freeFormClusterField","getUniqueAttributeForAllAccounts","selectedClusterIsCustom","_error","accountOptions","regionOptions","serverGroupRegions","clusterOptions","regionsOverride","cluster","moniker","monikerForCluster","sequence","updateAccount","onAccountUpdate","updateRegion","selected","nextRegions","selectedCluster","clusterStillAvailable","updateCluster","updateFreeFormCluster","toggleFreeFormClusterField","selectedRegions","AzureDestroyAsgExecutionLabel","masterStage","serverGroupName","AzureDestroyAsgStageConfig","loadRegionForAccount","previousProps","interestingHealthProviderNames","StageConstants","TARGET_LIST","val","getAccountDetails","org","pipeline","strategy","AzureDisableAsgExecutionLabel","AzureDisableAsgStageConfig","attributes","platformHealthOnlyShowOverride","PlatformHealthOverride","platformHealthType","AzureEnableAsgExecutionLabel","AzureEnableAsgStageConfig","getSecurityGroupAccount","accountName","AzureSecurityGroupWriter","upsertSecurityGroup","securityGroupName","buildUpsertCommand","operation","TaskExecutor","executeTask","job","InfrastructureCaches","clearCache","deleteSecurityGroup","buildDeleteCommand","defaultRule","access","destinationAddressPrefix","destinationPortRange","destinationPortRanges","destinationPorts","destPortRanges","direction","sourceAddressPrefix","sourceAddressPrefixes","sourceCidrs","sourceIPCIDRRanges","sourcePortRange","parseDelimitedList","firstPopulatedList","fallback","property","destinationPortsForRule","destinationPortRangeModel","sourceCidrsForRule","sourceAddressPrefixModel","isValidPortRange","bounds","ports","bound","port","isValidSourceCidr","match","octets","prefix","octet","buildAzureSecurityGroupName","applicationName","detailText","securityGroupAccount","matchesDefinedCoordinate","left","right","isDuplicateSecurityGroupName","getExistingSecurityGroups","existingSecurityGroup","isAzureSecurityGroupValid","mode","securityRules","cloneRule","normalizePriorities","priority","removeSecurityRule","_rule","ruleIndex","moveSecurityRule","fromIndex","toIndex","nextRules","initializeAzureSecurityGroupForModal","startsWith","detailFromSecurityGroupName","inboundRules","AzureSecurityGroupModalComponent","_f","_g","showNewSecurityGroup","clearApplicationRefreshSubscription","updateSecurityGroup","clearNetworkSelections","azureNetworks","vnetValue","addRule","removeRule","moveRule","offset","AzureSecurityGroupModal","normalizeAzureSecurityGroupForSubmit","renderNamePreview","duplicateName","showLocationFields","AzureSecurityGroupDetailsComponent","loadRequestId","loadSecurityGroup","resolvedSecurityGroup","getSecurityGroupReader","getSecurityGroupDetails","closeDetails","getCoordinatesKey","services","AzureSecurityGroupActions","AzureSecurityGroupInformationSection","AzureSecurityGroupRulesSection","contextType","DeckRuntimeContext","AzureSecurityGroupDetails","securityGroupWithCoordinates","withResolvedCoordinates","joinRuleValues","MAX_SAFE_INTEGER","ruleSources","rulePorts","AzureSecurityGroupReader","resolveIndexedSecurityGroup","indexedSecurityGroups","temp","AzureSecurityGroupTransformer","normalizeSecurityGroup","AzureServerGroupTransformer","normalizeServerGroup","parseCustomScriptsSettings","configuration","customScriptsSettings","fileUris","fileUrisTemp","convertServerGroupCommandToDeployConfiguration","tempImage","viewState","isCustom","version","uri","selectedImage","selectedProvider","rollback","onFailure","scaleDown","maxRemainingAsgs","delayBeforeDisableSec","delayBeforeScaleDownSec","allowDeleteActive","allowScaleDownActive","healthSettings","useSourceCapacity","capacity","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","isEmpty","vmsku","AzureServerGroupCommandBuilder","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","selectedVnetSubnets","instanceProfile","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","loadBalancersConfigured","networkSettingsConfigured","securityGroupsConfigured","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromExisting","parseServerGroupName","desired","tags","asgName","listImplicitSecurityGroups","sourceImage","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","commandOptions","disableImageSelection","submitButtonLabel","instanceTypeDetails","viewOverrides","extend","AzureServerGroupConfigurationService","runtimeServices","azureInstanceTypeService","cacheInitializer","createDelegate","dataDiskTypes","dataDiskCachingTypes","healthCheckTypes","terminationPolicies","configureInstanceTypes","result","dirty","c","locations","backingData","l","filtered","configureStandardInstanceTypes","configureZones","filteredData","regionsSupportZones","availabilityZones","getRegionalSecurityGroups","newSecurityGroups","sortBy","configureSecurityGroupOptions","currentOptions","newRegionalSecurityGroups","selectedSecurityGroup","getLoadBalancerNames","uniq","configureLoadBalancerOptions","newLoadBalancers","matched","intersection","removed","xor","configureLoadBalancers","filterlist","configureUpdateCommand","configureCommand","loadSecurityGroups","loadLoadBalancers","cmd","regionChanged","isInit","credentialsChanged","regionsForAccount","configureImages","regionalImages","clearSelectedImage","packageImages","amis","selectedImageName","selectedRegionalImage","refreshLoadBalancers","skipCommandReconfiguration","listLoadBalancers","refreshSecurityGroups","refreshCache","getAllSecurityGroups","refreshInstanceTypes","method","args","delegate","AzureWizardPage","setField","leaf","pop","formik","setFieldValue","validate","_values","textField","selectField","labeler","optionValue","ServerGroupAdvancedSettings","addDataDisk","lun","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","updateDataDisk","disk","colSpan","ServerGroupBasicSettings","accountChanged","processCommandUpdateResult","strategyChanged","onStrategyFieldChange","stackPattern","templatingEnabled","detailPattern","getClusterName","DeploymentStrategySelector","onFieldChange","onStrategyChange","hideClusterNamePreview","ServerGroupCapacityAndZones","capacityChanged","zoneToggled","zone","enabled","zonesEnabledChanged","healthCheckProtocols","ServerGroupHealthSettings","updateHealthSettings","updates","protocolChanged","requestPath","marginTop","ServerGroupImageSettings","imageChanged","customImageChanged","customImageFieldChanged","isRegionalImage","imageOptions","ServerGroupInstanceType","instanceTypeChanged","selectableSubnetNames","matchesSelectedVnet","ServerGroupLoadBalancers","loadVnetSubnetsRequestId","loadBalancerChanged","clearNetworkFields","getCommandLoadBalancer","normalizeLoadBalancerType","loadVnetSubnets","loadBalancerDetails","allVnets","attachedVnet","selectedLoadBalancer","getVnetSelectValue","ServerGroupNetworkSettings","showVnetSelect","getVnetSelectLabel","ServerGroupSecurityGroups","securityGroupChanged","ServerGroupTags","tagsChanged","tagResult","MapEditor","addButtonLabel","allowEmpty","model","AzureCloneServerGroupModalComponent","_isUnmounted","templateSelected","prepareCommand","cloneStage","task","stages","newServerGroupName","transitionTo","configure","configurationService","completeConfiguration","serverGroupWriter","cloneServerGroup","workingCommand","alreadyConfigured","templateSelectionText","copied","notCopied","additionalCopyText","AzureCloneServerGroupModal","providerServiceDelegate","getDelegate","attachCommandHandlers","azureReactHandlersAttached","withImageConfiguration","imageResult","DeployInitializer","onTemplateSelected","WizardModal","initialValues","nextIdx","wizard","WizardPage","order","innerRef","ref","AzureModalFooter","verified","handleVerification","onCancel","UserVerification","expectedValue","onValidChange","_AzureRollbackServerGroupModal","apply","rollbackServerGroup","filterServerGroups","disabledServerGroup","total","rollbackContext","restoreServerGroupName","handleServerGroupChange","restoreServerGroupOption","restoreServerGroup","targetSize","handleTaskReasonChange","taskReason","rollbackType","rollbackServerGroupName","enableAndDisableOnly","disabledServerGroupOptions","onHide","Select","TaskReason","AzureRollbackServerGroupModal","azureServerGroupDetailsGetter","serverGroupInfo","Observable","observer","findSummary","toCheck","possibleServerGroup","findServerGroupSummary","complete","ServerGroupReader","getServerGroup","tag","baseImage","launchConfig","decorateAzureServerGroup","next","AzureServerGroupActions","serverGroupCommandBuilder","clusters","confirmationModalParams","disableServerGroup","ServerGroupWarningMessageService","addDisableWarningMessage","enableServerGroup","destroyServerGroup","addDestroyWarningMessage","CloneServerGroupModal","CloudProviderRegistry","azureServerGroupDetailsSections","azureApplicationNameValidator","validateSpecialCharacters","warnings","ApplicationNameValidator","registerValidator","registerAzureProvider","registerProvider","logo","commandBuilder","detailsGetter","detailsActions","detailsSections","instanceTypeService","CreateLoadBalancerModal","useDetailsHook","CreateSecurityGroupModal","registerAzurePipelineStages","Registry","registerStage","provides","component","executionLabelComponent","accountExtractor","configAccountExtractor","validators","fieldName","fieldLabel","alias","executionDetailsSections","ExecutionDetailsTasks","BakeExecutionLabel","extraLabelLines","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","checkParentTriggers","getMessage","labels","restartable","css","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[41]}