@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
@@ -0,0 +1,412 @@
1
+ import { UISref } from '@uirouter/react';
2
+ import React from 'react';
3
+ import { Dropdown, MenuItem } from 'react-bootstrap';
4
+
5
+ import type {
6
+ Application,
7
+ ILoadBalancer,
8
+ ILoadBalancerActionsProps,
9
+ ILoadBalancerDeleteCommand,
10
+ ILoadBalancerDetailsSectionProps,
11
+ IUseDetailsHookProps,
12
+ LoadBalancerReader as LoadBalancerReaderType,
13
+ SecurityGroupReader,
14
+ UseDetailsResult,
15
+ } from '@spinnaker/core';
16
+ import {
17
+ AccountTag,
18
+ CollapsibleSection,
19
+ ConfirmationModalService,
20
+ CopyToClipboard,
21
+ FirewallLabels,
22
+ HealthCounts,
23
+ LoadBalancerWriter,
24
+ timestamp,
25
+ useDataSource,
26
+ useDeckRuntimeServices,
27
+ } from '@spinnaker/core';
28
+
29
+ import { AzureLoadBalancerModal } from '../configure/AzureLoadBalancerModal';
30
+
31
+ interface ILoadAzureLoadBalancerDetailsProps {
32
+ app: Application;
33
+ autoClose: () => void;
34
+ loadBalancers?: ILoadBalancer[];
35
+ loadBalancerParams: IAzureLoadBalancerStateParams;
36
+ loadBalancerReader: LoadBalancerReaderType;
37
+ securityGroupReader: SecurityGroupReader;
38
+ }
39
+
40
+ interface IAzureLoadBalancerStateParams {
41
+ accountId: string;
42
+ name: string;
43
+ provider: string;
44
+ region: string;
45
+ }
46
+
47
+ function formatLoadBalancerType(loadBalancerType: string): string {
48
+ if (!loadBalancerType?.includes('_')) {
49
+ return loadBalancerType;
50
+ }
51
+
52
+ return loadBalancerType
53
+ .split('_')
54
+ .map((part) => {
55
+ const lower = part.toLowerCase();
56
+ return `${lower.substring(0, 1).toUpperCase()}${lower.substring(1)}`;
57
+ })
58
+ .join(' ');
59
+ }
60
+
61
+ function resolveSecurityGroups(
62
+ app: Application,
63
+ loadBalancer: ILoadBalancer,
64
+ loadBalancerParams: IAzureLoadBalancerStateParams,
65
+ securityGroupReader: SecurityGroupReader,
66
+ ): any[] {
67
+ const securityGroupIds = loadBalancer.elb?.securityGroups || loadBalancer.securityGroups || [];
68
+ if (!securityGroupIds.length) {
69
+ return [];
70
+ }
71
+
72
+ return securityGroupIds
73
+ .map((securityGroupId: string) =>
74
+ securityGroupReader.getApplicationSecurityGroup(
75
+ app,
76
+ loadBalancerParams.accountId,
77
+ loadBalancerParams.region,
78
+ securityGroupId,
79
+ ),
80
+ )
81
+ .filter(Boolean)
82
+ .sort((a: any, b: any) => a.name.localeCompare(b.name));
83
+ }
84
+
85
+ export async function loadAzureLoadBalancerDetails({
86
+ app,
87
+ autoClose,
88
+ loadBalancers,
89
+ loadBalancerParams,
90
+ loadBalancerReader: reader,
91
+ securityGroupReader,
92
+ }: ILoadAzureLoadBalancerDetailsProps): Promise<ILoadBalancer | undefined> {
93
+ const { accountId, name, region } = loadBalancerParams;
94
+ const loadBalancer = (loadBalancers || app.loadBalancers.data).find(
95
+ (candidate: ILoadBalancer) =>
96
+ candidate.name === name && candidate.region === region && candidate.account === accountId,
97
+ );
98
+
99
+ if (!loadBalancer) {
100
+ autoClose();
101
+ return undefined;
102
+ }
103
+
104
+ const details = await reader.getLoadBalancerDetails(
105
+ loadBalancer.provider || loadBalancer.cloudProvider,
106
+ accountId,
107
+ region,
108
+ name,
109
+ );
110
+ const elb = details.find((candidate: ILoadBalancer) => candidate.name === name);
111
+
112
+ if (elb) {
113
+ loadBalancer.elb = elb;
114
+ loadBalancer.account = accountId;
115
+ loadBalancer.securityGroups = resolveSecurityGroups(
116
+ app,
117
+ loadBalancer,
118
+ loadBalancerParams,
119
+ securityGroupReader,
120
+ ) as any;
121
+ loadBalancer.loadBalancerType = formatLoadBalancerType(loadBalancer.loadBalancerType);
122
+ }
123
+
124
+ return loadBalancer;
125
+ }
126
+
127
+ export function useAzureLoadBalancerDetails({
128
+ app,
129
+ loadBalancerParams,
130
+ autoClose,
131
+ }: IUseDetailsHookProps): UseDetailsResult<ILoadBalancer> {
132
+ const azureLoadBalancerParams = loadBalancerParams as IAzureLoadBalancerStateParams;
133
+ const dataSource = app.getDataSource('loadBalancers');
134
+ const { data: loadBalancers, loaded, refresh, error } = useDataSource<ILoadBalancer[]>(dataSource);
135
+ const { loadBalancerReader, securityGroupReader } = useDeckRuntimeServices();
136
+ const [data, setData] = React.useState<ILoadBalancer>();
137
+ const [loadingDetails, setLoadingDetails] = React.useState(false);
138
+ const [detailsError, setDetailsError] = React.useState<string | null>(null);
139
+ const autoCloseRef = React.useRef(autoClose);
140
+ const isMountedRef = React.useRef(true);
141
+ const requestGenerationRef = React.useRef(0);
142
+ const { accountId, name, provider, region } = azureLoadBalancerParams;
143
+
144
+ React.useEffect(() => {
145
+ return () => {
146
+ isMountedRef.current = false;
147
+ };
148
+ }, []);
149
+
150
+ React.useEffect(() => {
151
+ autoCloseRef.current = autoClose;
152
+ }, [autoClose]);
153
+
154
+ const loadDetails = React.useCallback(async () => {
155
+ const requestGeneration = ++requestGenerationRef.current;
156
+ if (!loaded || error) {
157
+ if (isMountedRef.current) {
158
+ setLoadingDetails(false);
159
+ }
160
+ return;
161
+ }
162
+
163
+ setLoadingDetails(true);
164
+ setDetailsError(null);
165
+ try {
166
+ const loadBalancer = await loadAzureLoadBalancerDetails({
167
+ app,
168
+ loadBalancerParams: { accountId, name, provider, region },
169
+ loadBalancers,
170
+ autoClose: () => autoCloseRef.current(),
171
+ loadBalancerReader,
172
+ securityGroupReader,
173
+ });
174
+ if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {
175
+ setData(loadBalancer);
176
+ }
177
+ } catch (e) {
178
+ if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {
179
+ setDetailsError(e?.message || String(e));
180
+ }
181
+ } finally {
182
+ if (isMountedRef.current && requestGeneration === requestGenerationRef.current) {
183
+ setLoadingDetails(false);
184
+ }
185
+ }
186
+ }, [accountId, app, error, loadBalancerReader, loadBalancers, loaded, name, provider, region, securityGroupReader]);
187
+
188
+ React.useEffect(() => {
189
+ loadDetails();
190
+ }, [loadDetails]);
191
+
192
+ return {
193
+ data,
194
+ loading: !loaded || loadingDetails,
195
+ error: error || detailsError,
196
+ refetch: async () => {
197
+ refresh();
198
+ },
199
+ };
200
+ }
201
+
202
+ export function AzureLoadBalancerActions({ app, loadBalancer }: ILoadBalancerActionsProps) {
203
+ const canDeleteLoadBalancer = !loadBalancer.serverGroups?.length;
204
+ const editLoadBalancer = () => {
205
+ AzureLoadBalancerModal.show({
206
+ app,
207
+ loadBalancer: { ...loadBalancer },
208
+ isNew: false,
209
+ loadBalancerType: loadBalancer.loadBalancerType,
210
+ });
211
+ };
212
+ const deleteLoadBalancer = () => {
213
+ if (!canDeleteLoadBalancer) {
214
+ return;
215
+ }
216
+
217
+ const command: ILoadBalancerDeleteCommand = {
218
+ cloudProvider: 'azure',
219
+ loadBalancerName: loadBalancer.name,
220
+ loadBalancerType: loadBalancer.loadBalancerType,
221
+ credentials: loadBalancer.account,
222
+ region: loadBalancer.region,
223
+ appName: app.name,
224
+ } as any;
225
+
226
+ ConfirmationModalService.confirm({
227
+ header: `Really delete ${loadBalancer.name}?`,
228
+ buttonText: `Delete ${loadBalancer.name}`,
229
+ account: loadBalancer.account,
230
+ taskMonitorConfig: {
231
+ application: app,
232
+ title: `Deleting ${loadBalancer.name}`,
233
+ },
234
+ submitMethod: () => LoadBalancerWriter.deleteLoadBalancer(command, app),
235
+ });
236
+ };
237
+
238
+ return (
239
+ <Dropdown className="dropdown" id="azure-load-balancer-actions-dropdown">
240
+ <Dropdown.Toggle className="btn btn-sm btn-primary dropdown-toggle">Load Balancer Actions</Dropdown.Toggle>
241
+ <Dropdown.Menu>
242
+ <MenuItem onClick={editLoadBalancer}>Edit Load Balancer</MenuItem>
243
+ <MenuItem
244
+ disabled={!canDeleteLoadBalancer}
245
+ onClick={deleteLoadBalancer}
246
+ title={
247
+ canDeleteLoadBalancer
248
+ ? undefined
249
+ : 'You must detach all server groups before you can delete this load balancer.'
250
+ }
251
+ >
252
+ Delete Load Balancer
253
+ </MenuItem>
254
+ </Dropdown.Menu>
255
+ </Dropdown>
256
+ );
257
+ }
258
+
259
+ function sortServerGroups(a: any, b: any): number {
260
+ if (a.isDisabled !== b.isDisabled) {
261
+ return a.isDisabled ? 1 : -1;
262
+ }
263
+ return b.name.localeCompare(a.name);
264
+ }
265
+
266
+ export function AzureLoadBalancerDetailsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {
267
+ const elb = loadBalancer.elb || {};
268
+ const serverGroups = loadBalancer.serverGroups || [];
269
+ const showNetwork = loadBalancer.loadBalancerType === 'Azure Application Gateway';
270
+
271
+ return (
272
+ <CollapsibleSection heading="Load Balancer Details" defaultExpanded={true}>
273
+ <dl className="dl-horizontal dl-narrow">
274
+ <dt>Type</dt>
275
+ <dd>{loadBalancer.loadBalancerType || '-'}</dd>
276
+ <dt>Created</dt>
277
+ <dd>{elb.createdTime ? timestamp(elb.createdTime) : '-'}</dd>
278
+ <dt>In</dt>
279
+ <dd>
280
+ <AccountTag account={loadBalancer.account} /> {loadBalancer.region}
281
+ </dd>
282
+ {showNetwork && <dt>VNet</dt>}
283
+ {showNetwork && <dd>{elb.vnet || '-'}</dd>}
284
+ {showNetwork && <dt>Subnet</dt>}
285
+ {showNetwork && <dd>{elb.subnet || '-'}</dd>}
286
+ </dl>
287
+ {!!serverGroups.length && (
288
+ <dl className="horizontal-when-filters-collapsed">
289
+ <dt>Server Groups</dt>
290
+ <dd>
291
+ <ul className="collapse-margin-on-filter-collapse">
292
+ {serverGroups
293
+ .slice()
294
+ .sort(sortServerGroups)
295
+ .map((serverGroup: any) => (
296
+ <li key={serverGroup.name}>
297
+ <UISref
298
+ to="^.serverGroup"
299
+ params={{
300
+ region: serverGroup.region,
301
+ accountId: serverGroup.account,
302
+ serverGroup: serverGroup.name,
303
+ provider: 'azure',
304
+ }}
305
+ >
306
+ <a>{serverGroup.name}</a>
307
+ </UISref>
308
+ </li>
309
+ ))}
310
+ </ul>
311
+ </dd>
312
+ </dl>
313
+ )}
314
+ {elb.dnsName && (
315
+ <dl className="horizontal-when-filters-collapsed">
316
+ <dt>DNS Name:</dt>
317
+ <dd>
318
+ <a target="_blank" href={`//${elb.dnsName}`}>
319
+ {elb.dnsName}
320
+ </a>{' '}
321
+ <CopyToClipboard text={elb.dnsName} toolTip="Copy DNS Name to clipboard" />
322
+ </dd>
323
+ </dl>
324
+ )}
325
+ </CollapsibleSection>
326
+ );
327
+ }
328
+
329
+ export function AzureLoadBalancerListenersSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {
330
+ const rules = loadBalancer.elb?.loadBalancingRules || [];
331
+
332
+ return (
333
+ <CollapsibleSection heading="Listeners">
334
+ <dl>
335
+ <dt>Load Balancer -&gt; Instance</dt>
336
+ {rules.length ? (
337
+ rules.map((rule: any, index: number) => (
338
+ <dd key={rule.ruleName || index}>
339
+ {rule.protocol}:{rule.externalPort} -&gt; {rule.backendPort}
340
+ </dd>
341
+ ))
342
+ ) : (
343
+ <dd>-</dd>
344
+ )}
345
+ </dl>
346
+ </CollapsibleSection>
347
+ );
348
+ }
349
+
350
+ export function AzureLoadBalancerHealthChecksSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {
351
+ const probe = loadBalancer.elb?.probes?.[0];
352
+
353
+ return (
354
+ <CollapsibleSection heading="Health Checks">
355
+ <dl className="horizontal-when-filters-collapsed">
356
+ <dt>Target</dt>
357
+ <dd>{probe?.probeProtocol || '-'}</dd>
358
+ <dt>Interval</dt>
359
+ <dd>{probe?.probeInterval ? `${probe.probeInterval} seconds` : '-'}</dd>
360
+ <dt>Unhealthy Threshold</dt>
361
+ <dd>{probe?.unhealthyThreshold || '-'}</dd>
362
+ <dt>Timeout</dt>
363
+ <dd>{probe?.timeout ? `${probe.timeout} seconds` : '-'}</dd>
364
+ </dl>
365
+ </CollapsibleSection>
366
+ );
367
+ }
368
+
369
+ export function AzureLoadBalancerStatusSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {
370
+ return (
371
+ <CollapsibleSection heading="Status" defaultExpanded={true}>
372
+ <HealthCounts className="pull-left" container={loadBalancer.instanceCounts} />
373
+ </CollapsibleSection>
374
+ );
375
+ }
376
+
377
+ export function AzureLoadBalancerFirewallsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {
378
+ const securityGroups = (loadBalancer.securityGroups || []) as any[];
379
+
380
+ return (
381
+ <CollapsibleSection heading={FirewallLabels.get('Firewalls')}>
382
+ <ul>
383
+ {securityGroups.map((securityGroup) => (
384
+ <li key={securityGroup.id || securityGroup.name}>
385
+ <UISref
386
+ to="^.firewallDetails"
387
+ params={{
388
+ name: securityGroup.name,
389
+ accountId: loadBalancer.account,
390
+ region: loadBalancer.region,
391
+ vpcId: loadBalancer.vpcId,
392
+ provider: loadBalancer.provider,
393
+ }}
394
+ >
395
+ <a>
396
+ {securityGroup.name} ({securityGroup.id})
397
+ </a>
398
+ </UISref>
399
+ </li>
400
+ ))}
401
+ </ul>
402
+ </CollapsibleSection>
403
+ );
404
+ }
405
+
406
+ export const azureLoadBalancerDetailsSections = [
407
+ AzureLoadBalancerDetailsSection,
408
+ AzureLoadBalancerStatusSection,
409
+ AzureLoadBalancerListenersSection,
410
+ AzureLoadBalancerFirewallsSection,
411
+ AzureLoadBalancerHealthChecksSection,
412
+ ];
@@ -1,109 +1,99 @@
1
- 'use strict';
2
-
3
- import { module } from 'angular';
4
1
  import _ from 'lodash';
5
2
 
6
3
  import { AzureProviderSettings } from '../azure.settings';
7
4
 
8
- export const AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER = 'spinnaker.azure.loadBalancer.transformer';
9
- export const name = AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER; // for backwards compatibility
10
- module(AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER, []).factory('azureLoadBalancerTransformer', [
11
- '$q',
12
- function ($q) {
13
- function normalizeLoadBalancer(loadBalancer) {
14
- loadBalancer.serverGroups.forEach(function (serverGroup) {
15
- serverGroup.account = loadBalancer.account;
16
- serverGroup.region = loadBalancer.region;
5
+ export class AzureLoadBalancerTransformer {
6
+ constructor(promiseService) {
7
+ this.promiseService = promiseService;
8
+ }
17
9
 
18
- if (serverGroup.detachedInstances) {
19
- serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {
20
- return { id: instanceId };
21
- });
22
- serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);
23
- } else {
24
- serverGroup.detachedInstances = [];
25
- }
26
- });
27
- const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });
28
- loadBalancer.provider = loadBalancer.type;
29
- loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();
30
- loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();
31
- return $q.resolve(loadBalancer);
32
- }
10
+ normalizeLoadBalancer(loadBalancer) {
11
+ loadBalancer.serverGroups.forEach(function (serverGroup) {
12
+ serverGroup.account = loadBalancer.account;
13
+ serverGroup.region = loadBalancer.region;
33
14
 
34
- function convertLoadBalancerForEditing(loadBalancer) {
35
- const toEdit = {
36
- region: loadBalancer.region,
37
- credentials: loadBalancer.account,
38
- name: loadBalancer.name,
39
- stack: loadBalancer.stack,
40
- detail: loadBalancer.detail,
41
- vnet: loadBalancer.vnet,
42
- subnet: loadBalancer.subnet,
43
- probes: [],
44
- loadBalancingRules: [],
45
- };
15
+ if (serverGroup.detachedInstances) {
16
+ serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {
17
+ return { id: instanceId };
18
+ });
19
+ serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);
20
+ } else {
21
+ serverGroup.detachedInstances = [];
22
+ }
23
+ });
24
+ const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });
25
+ loadBalancer.provider = loadBalancer.type;
26
+ loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();
27
+ loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();
28
+ return this.promiseService.resolve(loadBalancer);
29
+ }
46
30
 
47
- if (loadBalancer.elb) {
48
- const elb = loadBalancer.elb;
31
+ convertLoadBalancerForEditing(loadBalancer) {
32
+ const toEdit = {
33
+ region: loadBalancer.region,
34
+ credentials: loadBalancer.account,
35
+ name: loadBalancer.name,
36
+ stack: loadBalancer.stack,
37
+ detail: loadBalancer.detail,
38
+ vnet: loadBalancer.vnet,
39
+ subnet: loadBalancer.subnet,
40
+ probes: [],
41
+ loadBalancingRules: [],
42
+ };
49
43
 
50
- toEdit.securityGroups = elb.securityGroups;
51
- toEdit.vnet = elb.vnet;
44
+ if (loadBalancer.elb) {
45
+ const elb = loadBalancer.elb;
52
46
 
53
- if (elb.loadBalancingRules) {
54
- toEdit.loadBalancingRules = elb.loadBalancingRules;
55
- }
47
+ toEdit.securityGroups = elb.securityGroups;
48
+ toEdit.vnet = elb.vnet;
56
49
 
57
- toEdit.probes = elb.probes;
58
- if (elb.dnsName && elb.dnsName !== 'dns-not-found') {
59
- toEdit.dnsName = elb.dnsName.split('.')[0];
60
- }
50
+ if (elb.loadBalancingRules) {
51
+ toEdit.loadBalancingRules = elb.loadBalancingRules;
61
52
  }
62
- return toEdit;
63
- }
64
53
 
65
- function constructNewLoadBalancerTemplate(application) {
66
- const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;
67
- const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;
68
- return {
69
- stack: '',
70
- detail: 'frontend',
71
- credentials: defaultCredentials,
72
- region: defaultRegion,
73
- cloudProvider: 'azure',
74
- vnet: null,
75
- subnet: null,
76
- probes: [
77
- {
78
- probeName: '',
79
- probeProtocol: 'HTTP',
80
- probePort: '80',
81
- probePath: '/',
82
- probeInterval: 30,
83
- unhealthyThreshold: 8,
84
- timeout: 120,
85
- },
86
- ],
87
- securityGroups: [],
88
- loadBalancingRules: [
89
- {
90
- ruleName: '',
91
- protocol: 'HTTP',
92
- externalPort: 80,
93
- backendPort: 80,
94
- probeName: '',
95
- persistence: 'None',
96
- idleTimeout: 4,
97
- },
98
- ],
99
- sku: 'Standard_v2',
100
- };
54
+ toEdit.probes = elb.probes;
55
+ if (elb.dnsName && elb.dnsName !== 'dns-not-found') {
56
+ toEdit.dnsName = elb.dnsName.split('.')[0];
57
+ }
101
58
  }
59
+ return toEdit;
60
+ }
102
61
 
62
+ constructNewLoadBalancerTemplate(application) {
63
+ const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;
64
+ const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;
103
65
  return {
104
- normalizeLoadBalancer: normalizeLoadBalancer,
105
- convertLoadBalancerForEditing: convertLoadBalancerForEditing,
106
- constructNewLoadBalancerTemplate: constructNewLoadBalancerTemplate,
66
+ stack: '',
67
+ detail: 'frontend',
68
+ credentials: defaultCredentials,
69
+ region: defaultRegion,
70
+ cloudProvider: 'azure',
71
+ vnet: null,
72
+ subnet: null,
73
+ probes: [
74
+ {
75
+ probeName: '',
76
+ probeProtocol: 'HTTP',
77
+ probePort: '80',
78
+ probePath: '/',
79
+ probeInterval: 30,
80
+ unhealthyThreshold: 8,
81
+ timeout: 120,
82
+ },
83
+ ],
84
+ securityGroups: [],
85
+ loadBalancingRules: [
86
+ {
87
+ ruleName: '',
88
+ protocol: 'HTTP',
89
+ externalPort: 80,
90
+ backendPort: 80,
91
+ probeName: '',
92
+ persistence: 'None',
93
+ idleTimeout: 4,
94
+ },
95
+ ],
96
+ sku: 'Standard_v2',
107
97
  };
108
- },
109
- ]);
98
+ }
99
+ }