@spinnaker/azure 2026.2.3 → 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,105 @@
1
+ import { InfrastructureCaches, TaskExecutor } from '@spinnaker/core';
2
+
3
+ import { AzureSecurityGroupWriter, buildDeleteCommand, buildUpsertCommand } from './securityGroup.write.service';
4
+
5
+ describe('AzureSecurityGroupWriter', () => {
6
+ const application = { name: 'fnord' } as any;
7
+ const securityGroup = {
8
+ accountId: 'azure-account',
9
+ cloudProvider: 'azure',
10
+ name: 'azure-sg',
11
+ region: 'westus',
12
+ rules: [{ protocol: 'tcp', port: 443 }],
13
+ vpcId: 'sg-vnet',
14
+ } as any;
15
+
16
+ it('builds an upsert command without overwriting explicit params', () => {
17
+ const params = { cloudProvider: 'explicit-provider', rules: [], type: 'customUpsertType' };
18
+
19
+ const command = buildUpsertCommand(securityGroup, params);
20
+
21
+ expect(command).toEqual(
22
+ jasmine.objectContaining({
23
+ accountId: 'azure-account',
24
+ cloudProvider: 'explicit-provider',
25
+ name: 'azure-sg',
26
+ region: 'westus',
27
+ rules: [],
28
+ securityGroupName: 'azure-sg',
29
+ type: 'customUpsertType',
30
+ vpcId: 'sg-vnet',
31
+ }),
32
+ );
33
+ expect(params).toEqual({ cloudProvider: 'explicit-provider', rules: [], type: 'customUpsertType' });
34
+ });
35
+
36
+ it('builds a delete command with the Azure security group payload', () => {
37
+ const command = buildDeleteCommand(securityGroup, application, { cloudProvider: 'azure', vpcId: 'explicit-vnet' });
38
+
39
+ expect(command).toEqual(
40
+ jasmine.objectContaining({
41
+ appName: 'fnord',
42
+ cloudProvider: 'azure',
43
+ credentials: 'azure-account',
44
+ regions: ['westus'],
45
+ securityGroupName: 'azure-sg',
46
+ type: 'deleteSecurityGroup',
47
+ vpcId: 'explicit-vnet',
48
+ }),
49
+ );
50
+ });
51
+
52
+ it('builds a delete command from legacy account identity fields', () => {
53
+ const command = buildDeleteCommand(
54
+ { ...securityGroup, accountId: undefined, accountName: 'legacy-account' },
55
+ application,
56
+ { cloudProvider: 'azure' },
57
+ );
58
+
59
+ expect(command.credentials).toBe('legacy-account');
60
+ });
61
+
62
+ it('executes an upsert task and clears the security group cache', () => {
63
+ const task = Promise.resolve({}) as any;
64
+ const executeTask = spyOn(TaskExecutor, 'executeTask').and.returnValue(task);
65
+ const clearCache = spyOn(InfrastructureCaches, 'clearCache');
66
+
67
+ const result = AzureSecurityGroupWriter.upsertSecurityGroup(securityGroup, application, 'Create', {
68
+ cloudProvider: 'azure',
69
+ });
70
+
71
+ expect(result).toBe(task);
72
+ expect(executeTask).toHaveBeenCalledWith(
73
+ jasmine.objectContaining({
74
+ application,
75
+ description: 'Create Firewall: azure-sg',
76
+ job: [jasmine.objectContaining({ cloudProvider: 'azure', securityGroupName: 'azure-sg' })],
77
+ }),
78
+ );
79
+ expect(clearCache).toHaveBeenCalledWith('securityGroups');
80
+ });
81
+
82
+ it('executes a delete task and clears the security group cache', () => {
83
+ const task = Promise.resolve({}) as any;
84
+ const executeTask = spyOn(TaskExecutor, 'executeTask').and.returnValue(task);
85
+ const clearCache = spyOn(InfrastructureCaches, 'clearCache');
86
+
87
+ const result = AzureSecurityGroupWriter.deleteSecurityGroup(securityGroup, application, { vpcId: 'explicit-vnet' });
88
+
89
+ expect(result).toBe(task);
90
+ expect(executeTask).toHaveBeenCalledWith(
91
+ jasmine.objectContaining({
92
+ application,
93
+ description: 'Delete Firewalls: azure-sg',
94
+ job: [
95
+ jasmine.objectContaining({
96
+ securityGroupName: 'azure-sg',
97
+ type: 'deleteSecurityGroup',
98
+ vpcId: 'explicit-vnet',
99
+ }),
100
+ ],
101
+ }),
102
+ );
103
+ expect(clearCache).toHaveBeenCalledWith('securityGroups');
104
+ });
105
+ });
@@ -0,0 +1,73 @@
1
+ import { FirewallLabels, InfrastructureCaches, TaskExecutor } from '@spinnaker/core';
2
+ import type { Application, ISecurityGroup, ITask } from '@spinnaker/core';
3
+
4
+ type AzureSecurityGroupCommand = Record<string, any>;
5
+
6
+ function getSecurityGroupAccount(securityGroup: ISecurityGroup & AzureSecurityGroupCommand): string {
7
+ return securityGroup.accountId || securityGroup.account || securityGroup.accountName || securityGroup.credentials;
8
+ }
9
+
10
+ export function buildUpsertCommand(
11
+ securityGroup: ISecurityGroup & AzureSecurityGroupCommand,
12
+ params: AzureSecurityGroupCommand = {},
13
+ ): AzureSecurityGroupCommand {
14
+ return {
15
+ ...securityGroup,
16
+ ...params,
17
+ securityGroupName: securityGroup.name,
18
+ };
19
+ }
20
+
21
+ export function buildDeleteCommand(
22
+ securityGroup: ISecurityGroup & AzureSecurityGroupCommand,
23
+ application: Application,
24
+ params: AzureSecurityGroupCommand = {},
25
+ ): AzureSecurityGroupCommand {
26
+ return {
27
+ ...params,
28
+ type: 'deleteSecurityGroup',
29
+ securityGroupName: securityGroup.name,
30
+ regions: [securityGroup.region],
31
+ credentials: getSecurityGroupAccount(securityGroup),
32
+ appName: application.name,
33
+ };
34
+ }
35
+
36
+ export const AzureSecurityGroupWriter = {
37
+ upsertSecurityGroup(
38
+ securityGroup: ISecurityGroup & AzureSecurityGroupCommand,
39
+ application: Application,
40
+ descriptor: string,
41
+ params: AzureSecurityGroupCommand = {},
42
+ ): Promise<ITask> {
43
+ const command = buildUpsertCommand(securityGroup, params);
44
+
45
+ const operation = TaskExecutor.executeTask({
46
+ job: [command],
47
+ application,
48
+ description: `${descriptor} ${FirewallLabels.get('Firewall')}: ${securityGroup.name}`,
49
+ });
50
+
51
+ InfrastructureCaches.clearCache('securityGroups');
52
+
53
+ return operation;
54
+ },
55
+
56
+ deleteSecurityGroup(
57
+ securityGroup: ISecurityGroup & AzureSecurityGroupCommand,
58
+ application: Application,
59
+ params: AzureSecurityGroupCommand = {},
60
+ ): Promise<ITask> {
61
+ const command = buildDeleteCommand(securityGroup, application, params);
62
+
63
+ const operation = TaskExecutor.executeTask({
64
+ job: [command],
65
+ application,
66
+ description: `Delete ${FirewallLabels.get('Firewalls')}: ${securityGroup.name}`,
67
+ });
68
+
69
+ InfrastructureCaches.clearCache('securityGroups');
70
+
71
+ return operation;
72
+ },
73
+ };
@@ -1,175 +1,176 @@
1
- 'use strict';
2
-
3
- import * as angular from 'angular';
4
1
  import _ from 'lodash';
5
2
 
6
3
  import { NameUtils } from '@spinnaker/core';
7
- import { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';
8
- import { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';
9
-
10
- export const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =
11
- 'spinnaker.azure.serverGroupCommandBuilder.service';
12
- export const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility
13
- angular
14
- .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [
15
- AZURE_IMAGE_IMAGE_READER,
16
- AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,
17
- ])
18
- .factory('azureServerGroupCommandBuilder', [
19
- '$q',
20
- 'azureImageReader',
21
- 'azureServerGroupTransformer',
22
- function ($q, azureImageReader, azureServerGroupTransformer) {
23
- function buildNewServerGroupCommand(application, defaults) {
24
- defaults = defaults || {};
25
-
26
- const defaultCredentials = defaults.account || application.defaultCredentials.azure;
27
- const defaultRegion = defaults.region || application.defaultRegions.azure;
28
-
29
- return azureImageReader.findImages({ provider: 'azure' }).then(function (images) {
30
- return {
31
- application: application.name,
32
- credentials: defaultCredentials,
33
- region: defaultRegion,
34
- images,
35
- loadBalancers: [],
36
- selectedVnetSubnets: [],
37
- strategy: '',
38
- sku: {
39
- capacity: 1,
40
- },
41
- zonesEnabled: false,
42
- zones: [],
43
- instanceTags: {},
44
- dataDisks: [],
45
- selectedProvider: 'azure',
46
- viewState: {
47
- instanceProfile: 'custom',
48
- allImageSelection: null,
49
- useAllImageSelection: false,
50
- useSimpleCapacity: true,
51
- usePreferredZones: true,
52
- mode: defaults.mode || 'create',
53
- disableStrategySelection: true,
54
- loadBalancersConfigured: false,
55
- networkSettingsConfigured: false,
56
- securityGroupsConfigured: false,
57
- },
58
- enableInboundNAT: false,
59
- };
60
- });
61
- }
4
+ import { AzureImageReader } from '../../image/image.reader';
5
+ import { AzureServerGroupTransformer } from '../serverGroup.transformer';
62
6
 
63
- // Only used to prepare view requiring template selecting
64
- function buildNewServerGroupCommandForPipeline() {
65
- return $q.when({
66
- viewState: {
67
- requiresTemplateSelection: true,
68
- },
69
- });
70
- }
7
+ export class AzureServerGroupCommandBuilder {
8
+ constructor(promiseService) {
9
+ this.promiseService = promiseService;
10
+ this.azureImageReader = new AzureImageReader();
11
+ this.azureServerGroupTransformer = new AzureServerGroupTransformer();
12
+ }
71
13
 
72
- function buildServerGroupCommandFromExisting(application, serverGroup, mode) {
73
- mode = mode || 'clone';
74
-
75
- const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);
76
-
77
- const command = {
78
- application: application.name,
79
- strategy: '',
80
- stack: serverGroupName.stack,
81
- freeFormDetails: serverGroupName.freeFormDetails,
82
- credentials: serverGroup.account,
83
- loadBalancers: serverGroup.loadBalancers,
84
- selectedSubnets: serverGroup.selectedVnetSubnets,
85
- selectedVnet: serverGroup.selectedVnet,
86
- securityGroups: serverGroup.securityGroups,
87
- loadBalancerName: serverGroup.loadBalancerName,
88
- loadBalancerType: serverGroup.loadBalancerType,
89
- securityGroupName: serverGroup.securityGroupName,
90
- region: serverGroup.region,
91
- vnet: serverGroup.vnet,
92
- vnetResourceGroup: serverGroup.vnetResourceGroup,
93
- subnet: serverGroup.subnet,
94
- zones: serverGroup.zones,
95
- zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,
96
- instanceTags: {},
97
- dataDisks: serverGroup.dataDisks,
98
- sku: serverGroup.sku,
99
- capacity: {
100
- min: serverGroup.capacity.min,
101
- max: serverGroup.capacity.max,
102
- desired: serverGroup.capacity.desired,
103
- },
104
- tags: [],
105
- instanceType: serverGroup.sku.name,
106
- selectedProvider: 'azure',
107
- source: {
108
- account: serverGroup.account,
109
- region: serverGroup.region,
110
- serverGroupName: serverGroup.name,
111
- asgName: serverGroup.name,
112
- },
113
- viewState: {
114
- allImageSelection: null,
115
- useAllImageSelection: false,
116
- useSimpleCapacity: true,
117
- usePreferredZones: false,
118
- listImplicitSecurityGroups: false,
119
- mode: mode,
120
- disableStrategySelection: true,
121
- },
122
- enableInboundNAT: serverGroup.enableInboundNAT,
123
- };
124
-
125
- if (typeof serverGroup.customScriptsSettings !== 'undefined') {
126
- command.customScriptsSettings = {};
127
- command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;
128
- if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {
129
- azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);
130
- }
131
- }
132
-
133
- return $q.when(command);
134
- }
14
+ resolve(value) {
15
+ return this.promiseService.resolve(value);
16
+ }
135
17
 
136
- function buildServerGroupCommandFromPipeline(application, originalCluster) {
137
- const pipelineCluster = _.cloneDeep(originalCluster);
138
- const region = pipelineCluster.region;
139
-
140
- const commandOptions = { account: pipelineCluster.account, region: region };
141
- return buildNewServerGroupCommand(application, commandOptions).then(function (command) {
142
- const viewState = {
143
- disableImageSelection: true,
144
- useSimpleCapacity: true,
145
- mode: 'editPipeline',
146
- submitButtonLabel: 'Done',
147
- instanceProfile: originalCluster.viewState.instanceProfile,
148
- instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,
149
- };
150
-
151
- const viewOverrides = {
152
- region: region,
153
- credentials: pipelineCluster.account,
154
- viewState: viewState,
155
- };
156
- if (originalCluster.viewState.instanceTypeDetails) {
157
- viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;
158
- }
159
-
160
- pipelineCluster.strategy = pipelineCluster.strategy || '';
161
-
162
- const extendedCommand = angular.extend({}, command, pipelineCluster, viewOverrides);
163
-
164
- return extendedCommand;
165
- });
166
- }
18
+ buildNewServerGroupCommand(application, defaults) {
19
+ defaults = defaults || {};
20
+
21
+ const defaultCredentials = defaults.account || application.defaultCredentials.azure;
22
+ const defaultRegion = defaults.region || application.defaultRegions.azure;
167
23
 
24
+ return this.azureImageReader.findImages({ provider: 'azure' }).then(function (images) {
168
25
  return {
169
- buildNewServerGroupCommand: buildNewServerGroupCommand,
170
- buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,
171
- buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,
172
- buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,
26
+ application: application.name,
27
+ credentials: defaultCredentials,
28
+ region: defaultRegion,
29
+ images,
30
+ loadBalancers: [],
31
+ selectedVnetSubnets: [],
32
+ strategy: '',
33
+ sku: {
34
+ capacity: 1,
35
+ },
36
+ zonesEnabled: false,
37
+ zones: [],
38
+ instanceTags: {},
39
+ dataDisks: [],
40
+ selectedProvider: 'azure',
41
+ viewState: {
42
+ instanceProfile: 'custom',
43
+ allImageSelection: null,
44
+ useAllImageSelection: false,
45
+ useSimpleCapacity: true,
46
+ usePreferredZones: true,
47
+ mode: defaults.mode || 'create',
48
+ disableStrategySelection: true,
49
+ loadBalancersConfigured: false,
50
+ networkSettingsConfigured: false,
51
+ securityGroupsConfigured: false,
52
+ },
53
+ enableInboundNAT: false,
54
+ };
55
+ });
56
+ }
57
+
58
+ // Only used to prepare view requiring template selecting
59
+ buildNewServerGroupCommandForPipeline() {
60
+ return this.resolve({
61
+ viewState: {
62
+ requiresTemplateSelection: true,
63
+ },
64
+ });
65
+ }
66
+
67
+ buildServerGroupCommandFromExisting(application, serverGroup, mode) {
68
+ mode = mode || 'clone';
69
+
70
+ const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);
71
+
72
+ const command = {
73
+ application: application.name,
74
+ strategy: '',
75
+ stack: serverGroupName.stack,
76
+ freeFormDetails: serverGroupName.freeFormDetails,
77
+ credentials: serverGroup.account,
78
+ loadBalancers: serverGroup.loadBalancers,
79
+ selectedSubnets: serverGroup.selectedVnetSubnets,
80
+ selectedVnet: serverGroup.selectedVnet,
81
+ securityGroups: serverGroup.securityGroups,
82
+ loadBalancerName: serverGroup.loadBalancerName,
83
+ loadBalancerType: serverGroup.loadBalancerType,
84
+ securityGroupName: serverGroup.securityGroupName,
85
+ region: serverGroup.region,
86
+ vnet: serverGroup.vnet,
87
+ vnetResourceGroup: serverGroup.vnetResourceGroup,
88
+ subnet: serverGroup.subnet,
89
+ zones: serverGroup.zones,
90
+ zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,
91
+ instanceTags: {},
92
+ dataDisks: serverGroup.dataDisks,
93
+ sku: serverGroup.sku,
94
+ capacity: {
95
+ min: serverGroup.capacity.min,
96
+ max: serverGroup.capacity.max,
97
+ desired: serverGroup.capacity.desired,
98
+ },
99
+ tags: [],
100
+ instanceType: serverGroup.sku.name,
101
+ selectedProvider: 'azure',
102
+ source: {
103
+ account: serverGroup.account,
104
+ region: serverGroup.region,
105
+ serverGroupName: serverGroup.name,
106
+ asgName: serverGroup.name,
107
+ },
108
+ viewState: {
109
+ allImageSelection: null,
110
+ useAllImageSelection: false,
111
+ useSimpleCapacity: true,
112
+ usePreferredZones: false,
113
+ listImplicitSecurityGroups: false,
114
+ mode: mode,
115
+ disableStrategySelection: true,
116
+ },
117
+ enableInboundNAT: serverGroup.enableInboundNAT,
118
+ };
119
+
120
+ if (typeof serverGroup.customScriptsSettings !== 'undefined') {
121
+ command.customScriptsSettings = {};
122
+ command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;
123
+ if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {
124
+ this.azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);
125
+ }
126
+ }
127
+
128
+ return this.azureImageReader.findImages({ provider: 'azure' }).then((images) => {
129
+ const sourceImage = serverGroup.image || {};
130
+ const imageName = sourceImage.imageName || serverGroup.imageName || serverGroup.amiName;
131
+ const selectedImage = images.find((image) => image.imageName === imageName);
132
+
133
+ command.images = images;
134
+ if (sourceImage.isCustom || sourceImage.uri) {
135
+ command.image = { ...sourceImage, isCustom: true, region: sourceImage.region || serverGroup.region };
136
+ } else if (imageName) {
137
+ command.imageName = imageName;
138
+ command.selectedImage = selectedImage || sourceImage;
139
+ }
140
+
141
+ return command;
142
+ });
143
+ }
144
+
145
+ buildServerGroupCommandFromPipeline(application, originalCluster) {
146
+ const pipelineCluster = _.cloneDeep(originalCluster);
147
+ const region = pipelineCluster.region;
148
+
149
+ const commandOptions = { account: pipelineCluster.account, region: region };
150
+ return this.buildNewServerGroupCommand(application, commandOptions).then(function (command) {
151
+ const viewState = {
152
+ disableImageSelection: true,
153
+ useSimpleCapacity: true,
154
+ mode: 'editPipeline',
155
+ submitButtonLabel: 'Done',
156
+ instanceProfile: originalCluster.viewState.instanceProfile,
157
+ instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,
158
+ };
159
+
160
+ const viewOverrides = {
161
+ region: region,
162
+ credentials: pipelineCluster.account,
163
+ viewState: viewState,
173
164
  };
174
- },
175
- ]);
165
+ if (originalCluster.viewState.instanceTypeDetails) {
166
+ viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;
167
+ }
168
+
169
+ pipelineCluster.strategy = pipelineCluster.strategy || '';
170
+
171
+ const extendedCommand = _.extend({}, command, pipelineCluster, viewOverrides);
172
+
173
+ return extendedCommand;
174
+ });
175
+ }
176
+ }
@@ -0,0 +1,63 @@
1
+ import { nativePromiseService } from '@spinnaker/core';
2
+
3
+ import { AzureImageReader } from '../../image/image.reader';
4
+ import { AzureServerGroupCommandBuilder } from './serverGroupCommandBuilder.service';
5
+
6
+ describe('AzureServerGroupCommandBuilder', function () {
7
+ function serverGroup(overrides = {}) {
8
+ return {
9
+ name: 'fnord-web-v001',
10
+ account: 'test',
11
+ region: 'westus',
12
+ loadBalancers: [],
13
+ selectedVnetSubnets: [],
14
+ selectedVnet: { name: 'vnet-a' },
15
+ securityGroups: [],
16
+ zones: [],
17
+ dataDisks: [],
18
+ sku: { name: 'Standard_DS1_v2', capacity: 1 },
19
+ capacity: { min: 1, max: 1, desired: 1 },
20
+ ...overrides,
21
+ };
22
+ }
23
+
24
+ it('builds clone commands with image options and the current marketplace image selected', async function () {
25
+ const images = [
26
+ { imageName: 'ubuntu-west', amis: { westus: ['ami-west'] } },
27
+ { imageName: 'ubuntu-east', amis: { eastus: ['ami-east'] } },
28
+ ];
29
+ spyOn(AzureImageReader.prototype, 'findImages').and.returnValue(Promise.resolve(images));
30
+
31
+ const command = await new AzureServerGroupCommandBuilder(nativePromiseService).buildServerGroupCommandFromExisting(
32
+ { name: 'fnord' },
33
+ serverGroup({ image: { imageName: 'ubuntu-west' } }),
34
+ );
35
+
36
+ expect(AzureImageReader.prototype.findImages).toHaveBeenCalledWith({ provider: 'azure' });
37
+ expect(command.images).toBe(images);
38
+ expect(command.imageName).toBe('ubuntu-west');
39
+ expect(command.selectedImage).toBe(images[0]);
40
+ });
41
+
42
+ it('builds clone commands with image options and the current custom image preserved', async function () {
43
+ const images = [{ imageName: 'ubuntu-west', amis: { westus: ['ami-west'] } }];
44
+ spyOn(AzureImageReader.prototype, 'findImages').and.returnValue(Promise.resolve(images));
45
+
46
+ const command = await new AzureServerGroupCommandBuilder(nativePromiseService).buildServerGroupCommandFromExisting(
47
+ { name: 'fnord' },
48
+ serverGroup({
49
+ image: { isCustom: true, imageName: 'custom-image', ostype: 'Linux', uri: 'https://image.vhd' },
50
+ }),
51
+ );
52
+
53
+ expect(command.images).toBe(images);
54
+ expect(command.image).toEqual({
55
+ isCustom: true,
56
+ imageName: 'custom-image',
57
+ ostype: 'Linux',
58
+ uri: 'https://image.vhd',
59
+ region: 'westus',
60
+ });
61
+ expect(command.selectedImage).toBeUndefined();
62
+ });
63
+ });