@spinnaker/azure 0.0.0-2025.1-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 (174) hide show
  1. package/CHANGELOG.md +873 -0
  2. package/LICENSE.txt +203 -0
  3. package/dist/azure.module.d.ts +3 -0
  4. package/dist/azure.settings.d.ts +8 -0
  5. package/dist/common/AzureModalFooter.d.ts +18 -0
  6. package/dist/help/azure.help.d.ts +1 -0
  7. package/dist/image/image.reader.d.ts +2 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +6778 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/instance/azureInstanceType.service.d.ts +2 -0
  12. package/dist/instance/details/instance.details.controller.d.ts +2 -0
  13. package/dist/loadBalancer/configure/AzureLoadBalancerChoiceModal.d.ts +16 -0
  14. package/dist/loadBalancer/configure/createLoadBalancer.controller.d.ts +2 -0
  15. package/dist/loadBalancer/details/loadBalancerDetail.controller.d.ts +2 -0
  16. package/dist/loadBalancer/loadBalancer.transformer.d.ts +2 -0
  17. package/dist/pipeline/stages/bake/azureBakeStage.d.ts +2 -0
  18. package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +2 -0
  19. package/dist/pipeline/stages/destroyAsg/azureDestroyAsgStage.d.ts +2 -0
  20. package/dist/pipeline/stages/disableAsg/azureDisableAsgStage.d.ts +2 -0
  21. package/dist/pipeline/stages/enableAsg/azureEnableAsgStage.d.ts +2 -0
  22. package/dist/securityGroup/clone/cloneSecurityGroup.controller.d.ts +2 -0
  23. package/dist/securityGroup/configure/CreateSecurityGroupCtrl.d.ts +2 -0
  24. package/dist/securityGroup/configure/EditSecurityGroupCtrl.d.ts +2 -0
  25. package/dist/securityGroup/details/securityGroupDetail.controller.d.ts +2 -0
  26. package/dist/securityGroup/securityGroup.reader.d.ts +2 -0
  27. package/dist/securityGroup/securityGroup.transformer.d.ts +2 -0
  28. package/dist/securityGroup/securityGroup.write.service.d.ts +2 -0
  29. package/dist/serverGroup/configure/serverGroup.configure.azure.module.d.ts +2 -0
  30. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +2 -0
  31. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +2 -0
  32. package/dist/serverGroup/configure/wizard/CloneServerGroup.azure.controller.d.ts +2 -0
  33. package/dist/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.d.ts +2 -0
  34. package/dist/serverGroup/configure/wizard/ServerGroupInstanceType.controller.d.ts +2 -0
  35. package/dist/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.d.ts +2 -0
  36. package/dist/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.d.ts +2 -0
  37. package/dist/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.d.ts +2 -0
  38. package/dist/serverGroup/configure/wizard/basicSettings/image.regional.filter.d.ts +2 -0
  39. package/dist/serverGroup/configure/wizard/capacity/capacitySelector.directive.d.ts +2 -0
  40. package/dist/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.d.ts +2 -0
  41. package/dist/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.d.ts +2 -0
  42. package/dist/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.d.ts +2 -0
  43. package/dist/serverGroup/configure/wizard/image/imageSettingsSelector.directive.d.ts +2 -0
  44. package/dist/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.d.ts +2 -0
  45. package/dist/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.d.ts +2 -0
  46. package/dist/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.d.ts +2 -0
  47. package/dist/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.d.ts +2 -0
  48. package/dist/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.d.ts +2 -0
  49. package/dist/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.d.ts +2 -0
  50. package/dist/serverGroup/configure/wizard/tags/tagsSelector.directive.d.ts +2 -0
  51. package/dist/serverGroup/configure/wizard/zones/zoneSelector.directive.d.ts +2 -0
  52. package/dist/serverGroup/details/rollback/RollbackServerGroupModal.d.ts +25 -0
  53. package/dist/serverGroup/details/serverGroup.details.module.d.ts +2 -0
  54. package/dist/serverGroup/details/serverGroupDetails.azure.controller.d.ts +2 -0
  55. package/dist/serverGroup/serverGroup.transformer.d.ts +2 -0
  56. package/dist/utility.d.ts +28 -0
  57. package/dist/validation/applicationName.validator.d.ts +2 -0
  58. package/package.json +43 -0
  59. package/src/azure.module.ts +95 -0
  60. package/src/azure.settings.ts +16 -0
  61. package/src/common/AzureModalFooter.tsx +43 -0
  62. package/src/help/azure.help.ts +60 -0
  63. package/src/image/image.reader.js +43 -0
  64. package/src/image/image.reader.spec.js +108 -0
  65. package/src/index.ts +1 -0
  66. package/src/instance/azureInstanceType.service.js +831 -0
  67. package/src/instance/azureInstanceType.service.spec.js +17 -0
  68. package/src/instance/details/instance.details.controller.js +371 -0
  69. package/src/instance/details/instance.details.controller.spec.js +129 -0
  70. package/src/instance/details/instanceDetails.html +43 -0
  71. package/src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx +101 -0
  72. package/src/loadBalancer/configure/advancedSettings.html +95 -0
  73. package/src/loadBalancer/configure/createLoadBalancer.controller.js +275 -0
  74. package/src/loadBalancer/configure/createLoadBalancer.controller.spec.js +39 -0
  75. package/src/loadBalancer/configure/createLoadBalancer.html +25 -0
  76. package/src/loadBalancer/configure/createLoadBalancerProperties.html +128 -0
  77. package/src/loadBalancer/configure/editLoadBalancer.html +26 -0
  78. package/src/loadBalancer/configure/healthCheck.html +74 -0
  79. package/src/loadBalancer/configure/listeners.html +50 -0
  80. package/src/loadBalancer/details/loadBalancerDetail.controller.js +181 -0
  81. package/src/loadBalancer/details/loadBalancerDetail.controller.spec.js +39 -0
  82. package/src/loadBalancer/details/loadBalancerDetail.html +128 -0
  83. package/src/loadBalancer/loadBalancer.transformer.js +109 -0
  84. package/src/logo/azure.icon.svg +196 -0
  85. package/src/logo/azure.logo.less +6 -0
  86. package/src/logo/logo_azure.png +0 -0
  87. package/src/pipeline/stages/bake/azureBakeStage.js +276 -0
  88. package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +40 -0
  89. package/src/pipeline/stages/bake/bakeExecutionDetails.html +50 -0
  90. package/src/pipeline/stages/bake/bakeStage.html +187 -0
  91. package/src/pipeline/stages/destroyAsg/azureDestroyAsgStage.js +73 -0
  92. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +9 -0
  93. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
  94. package/src/pipeline/stages/disableAsg/azureDisableAsgStage.js +65 -0
  95. package/src/pipeline/stages/disableAsg/disableAsgStage.html +11 -0
  96. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
  97. package/src/pipeline/stages/enableAsg/azureEnableAsgStage.js +70 -0
  98. package/src/pipeline/stages/enableAsg/enableAsgStage.html +11 -0
  99. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +1 -0
  100. package/src/securityGroup/clone/cloneSecurityGroup.controller.js +162 -0
  101. package/src/securityGroup/clone/cloneSecurityGroup.html +8 -0
  102. package/src/securityGroup/configure/CreateSecurityGroup.controller.spec.js +78 -0
  103. package/src/securityGroup/configure/CreateSecurityGroupCtrl.js +265 -0
  104. package/src/securityGroup/configure/EditSecurityGroupCtrl.js +222 -0
  105. package/src/securityGroup/configure/configSecurityGroup.mixin.controller.js +262 -0
  106. package/src/securityGroup/configure/createSecurityGroup.html +20 -0
  107. package/src/securityGroup/configure/createSecurityGroupIngress.html +75 -0
  108. package/src/securityGroup/configure/createSecurityGroupProperties.html +88 -0
  109. package/src/securityGroup/configure/editSecurityGroup.html +19 -0
  110. package/src/securityGroup/details/securityGroupDetail.controller.js +142 -0
  111. package/src/securityGroup/details/securityGroupDetail.html +78 -0
  112. package/src/securityGroup/securityGroup.reader.js +17 -0
  113. package/src/securityGroup/securityGroup.transformer.js +13 -0
  114. package/src/securityGroup/securityGroup.write.service.js +57 -0
  115. package/src/serverGroup/configure/serverGroup.configure.azure.module.js +47 -0
  116. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +175 -0
  117. package/src/serverGroup/configure/serverGroupConfiguration.service.js +357 -0
  118. package/src/serverGroup/configure/serverGroupConfiguration.service.spec.js +209 -0
  119. package/src/serverGroup/configure/wizard/CloneServerGroup.azure.controller.js +247 -0
  120. package/src/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.js +35 -0
  121. package/src/serverGroup/configure/wizard/ServerGroupInstanceType.controller.js +15 -0
  122. package/src/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.js +25 -0
  123. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +5 -0
  124. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html +138 -0
  125. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.js +43 -0
  126. package/src/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.js +71 -0
  127. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.html +131 -0
  128. package/src/serverGroup/configure/wizard/basicSettings/image.regional.filter.js +15 -0
  129. package/src/serverGroup/configure/wizard/basicSettings/image.regional.filter.spec.js +42 -0
  130. package/src/serverGroup/configure/wizard/capacity/capacity.html +5 -0
  131. package/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html +20 -0
  132. package/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.js +21 -0
  133. package/src/serverGroup/configure/wizard/capacity/zones.html +5 -0
  134. package/src/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.js +38 -0
  135. package/src/serverGroup/configure/wizard/healthSettings/healthSettings.html +5 -0
  136. package/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html +32 -0
  137. package/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.js +22 -0
  138. package/src/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.js +34 -0
  139. package/src/serverGroup/configure/wizard/image/imageSettings.html +5 -0
  140. package/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html +33 -0
  141. package/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.js +22 -0
  142. package/src/serverGroup/configure/wizard/instanceArchetype.html +33 -0
  143. package/src/serverGroup/configure/wizard/instanceType/instanceType.html +10 -0
  144. package/src/serverGroup/configure/wizard/instanceType.html +33 -0
  145. package/src/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js +137 -0
  146. package/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html +3 -0
  147. package/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html +41 -0
  148. package/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.js +22 -0
  149. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.js +44 -0
  150. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html +54 -0
  151. package/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.js +19 -0
  152. package/src/serverGroup/configure/wizard/networkSettings/networkSettings.html +3 -0
  153. package/src/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.js +28 -0
  154. package/src/serverGroup/configure/wizard/securityGroup/securityGroups.html +3 -0
  155. package/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html +40 -0
  156. package/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.js +38 -0
  157. package/src/serverGroup/configure/wizard/serverGroupWizard.html +61 -0
  158. package/src/serverGroup/configure/wizard/tags/tags.html +5 -0
  159. package/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html +16 -0
  160. package/src/serverGroup/configure/wizard/tags/tagsSelector.directive.js +30 -0
  161. package/src/serverGroup/configure/wizard/templateSelection.html +9 -0
  162. package/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html +21 -0
  163. package/src/serverGroup/configure/wizard/zones/zoneSelector.directive.js +28 -0
  164. package/src/serverGroup/details/rollback/RollbackServerGroupModal.tsx +158 -0
  165. package/src/serverGroup/details/serverGroup.details.module.js +11 -0
  166. package/src/serverGroup/details/serverGroupDetails.azure.controller.js +260 -0
  167. package/src/serverGroup/details/serverGroupDetails.html +98 -0
  168. package/src/serverGroup/serverGroup.transformer.js +150 -0
  169. package/src/serverGroup/serverGroup.transformer.spec.js +256 -0
  170. package/src/subnet/subnetSelectField.directive.html +28 -0
  171. package/src/subnet/subnetSelectField.directive.js +35 -0
  172. package/src/utility.spec.ts +61 -0
  173. package/src/utility.ts +95 -0
  174. package/src/validation/applicationName.validator.js +44 -0
@@ -0,0 +1,95 @@
1
+ <div class="container-fluid form-horizontal">
2
+ <div class="form-group">
3
+ <div class="col-md-12">
4
+ <div class="form-group">
5
+ <div class="col-md-3">
6
+ <b>Custom DNS Label</b>
7
+ <help-field key="azure.loadBalancer.dnsName"></help-field>
8
+ </div>
9
+ <div class="col-md-6">
10
+ <input class="form-control input-sm" type="text" ng-model="loadBalancer.dnsName" />
11
+ <span>.{{loadBalancer.region}}.cloudapp.azure.com</span>
12
+ </div>
13
+ </div>
14
+ <div class="form-group">
15
+ <div class="col-md-3">
16
+ <b>Health Check</b>
17
+ </div>
18
+ </div>
19
+ <div class="form-group">
20
+ <div class="col-md-4 sm-label-right">
21
+ <b>Interval</b>
22
+ <help-field key="azure.loadBalancer.probes.probeInterval"></help-field>
23
+ </div>
24
+ <div class="col-md-4">
25
+ <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].probeInterval" />
26
+ </div>
27
+ </div>
28
+ <div class="form-group">
29
+ <div class="col-md-4 sm-label-right">
30
+ <b>Unhealthy Threshold</b>
31
+ <help-field key="azure.loadBalancer.probes.unhealthyThreshold"></help-field>
32
+ </div>
33
+ <div class="col-md-4">
34
+ <input
35
+ class="form-control input-sm"
36
+ type="number"
37
+ min="0"
38
+ ng-model="loadBalancer.probes[0].unhealthyThreshold"
39
+ />
40
+ </div>
41
+ </div>
42
+ <div class="form-group" ng-if="isALB">
43
+ <div class="col-md-4 sm-label-right">
44
+ <b>Idle Timeout</b>
45
+ <help-field key="azure.loadBalancer.loadBalancingRules.idleTimeout"></help-field>
46
+ </div>
47
+ <div class="col-md-4">
48
+ <input
49
+ class="form-control input-sm"
50
+ type="number"
51
+ min="0"
52
+ ng-model="loadBalancer.loadBalancingRules[0].idleTimeout"
53
+ />
54
+ </div>
55
+ </div>
56
+ <div class="form-group" ng-if="!isALB">
57
+ <div class="col-md-4 sm-label-right">
58
+ <b>Timeout</b>
59
+ <help-field key="azure.loadBalancer.probes.timeout"></help-field>
60
+ </div>
61
+ <div class="col-md-4">
62
+ <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].timeout" />
63
+ </div>
64
+ </div>
65
+ <div class="form-group" ng-if="isNew && !isALB">
66
+ <div class="col-md-4 sm-label-right">
67
+ <b>SKU</b>
68
+ <help-field key="azure.loadBalancer.sku"></help-field>
69
+ </div>
70
+ <div class="col-md-4">
71
+ <select
72
+ class="form-control input-sm"
73
+ ng-model="loadBalancer.sku"
74
+ ng-options="sku for sku in validSkus"
75
+ ></select>
76
+ </div>
77
+ </div>
78
+ <div class="form-group" ng-if="isALB">
79
+ <div class="col-md-4 sm-label-right">
80
+ <b>Session persistence</b>
81
+ <help-field key="azure.loadBalancer.loadBalancingRules.sessionPersistence"></help-field>
82
+ </div>
83
+ <div class="col-md-4">
84
+ <select
85
+ class="form-control input-sm"
86
+ ng-model="loadBalancer.sessionPersistence"
87
+ ng-init="loadBalancer.sessionPersistence = 'None'"
88
+ required
89
+ ng-options="p for p in ['None', 'Client IP', 'Client IP and protocol']"
90
+ ></select>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
@@ -0,0 +1,275 @@
1
+ 'use strict';
2
+
3
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
4
+ import { module } from 'angular';
5
+ import _ from 'lodash';
6
+
7
+ import { AccountService, LoadBalancerWriter, NameUtils, NetworkReader, TaskMonitor } from '@spinnaker/core';
8
+
9
+ import { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from '../loadBalancer.transformer';
10
+
11
+ export const AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER =
12
+ 'spinnaker.azure.loadBalancer.create.controller';
13
+ export const name = AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER; // for backwards compatibility
14
+ module(AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER, [
15
+ UIROUTER_ANGULARJS,
16
+ AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,
17
+ ]).controller('azureCreateLoadBalancerCtrl', [
18
+ '$scope',
19
+ '$uibModalInstance',
20
+ '$state',
21
+ 'azureLoadBalancerTransformer',
22
+ 'application',
23
+ 'loadBalancer',
24
+ 'isNew',
25
+ 'loadBalancerType',
26
+ function (
27
+ $scope,
28
+ $uibModalInstance,
29
+ $state,
30
+ azureLoadBalancerTransformer,
31
+ application,
32
+ loadBalancer,
33
+ isNew,
34
+ loadBalancerType,
35
+ ) {
36
+ const ctrl = this;
37
+
38
+ $scope.regions = [];
39
+
40
+ $scope.pages = {
41
+ location: require('./createLoadBalancerProperties.html'),
42
+ listeners: require('./listeners.html'),
43
+ healthCheck: require('./healthCheck.html'),
44
+ advancedSettings: require('./advancedSettings.html'),
45
+ };
46
+
47
+ $scope.isNew = isNew;
48
+ $scope.loadBalancerType = loadBalancerType.type;
49
+ $scope.isALB = loadBalancerType.type === 'Azure Load Balancer';
50
+
51
+ $scope.state = {
52
+ accountsLoaded: false,
53
+ submitting: false,
54
+ };
55
+
56
+ $scope.validSkus = ['Standard_v2', 'Standard_Small'];
57
+
58
+ function onApplicationRefresh() {
59
+ // If the user has already closed the modal, do not navigate to the new details view
60
+ if ($scope.$$destroyed) {
61
+ return;
62
+ }
63
+ $uibModalInstance.close();
64
+ const newStateParams = {
65
+ name: $scope.loadBalancer.name,
66
+ accountId: $scope.loadBalancer.credentials,
67
+ region: $scope.loadBalancer.region,
68
+ provider: 'azure',
69
+ };
70
+
71
+ if (!$state.includes('**.loadBalancerDetails')) {
72
+ $state.go('.loadBalancerDetails', newStateParams);
73
+ } else {
74
+ $state.go('^.loadBalancerDetails', newStateParams);
75
+ }
76
+ }
77
+
78
+ function onTaskComplete() {
79
+ application.loadBalancers.refresh();
80
+ application.loadBalancers.onNextRefresh($scope, onApplicationRefresh);
81
+ }
82
+
83
+ $scope.taskMonitor = new TaskMonitor({
84
+ application: application,
85
+ title: (isNew ? 'Creating ' : 'Updating ') + 'your load balancer',
86
+ modalInstance: $uibModalInstance,
87
+ onTaskComplete: onTaskComplete,
88
+ });
89
+
90
+ function initializeCreateMode() {
91
+ AccountService.listAccounts('azure').then(function (accounts) {
92
+ $scope.accounts = accounts;
93
+ $scope.state.accountsLoaded = true;
94
+ ctrl.accountUpdated();
95
+ });
96
+ }
97
+
98
+ function initializeController() {
99
+ if (loadBalancer) {
100
+ $scope.loadBalancer = azureLoadBalancerTransformer.convertLoadBalancerForEditing(loadBalancer);
101
+ if (isNew) {
102
+ const nameParts = NameUtils.parseLoadBalancerName($scope.loadBalancer.name);
103
+ $scope.loadBalancer.stack = nameParts.stack;
104
+ $scope.loadBalancer.detail = nameParts.freeFormDetails;
105
+ delete $scope.loadBalancer.name;
106
+ }
107
+ } else {
108
+ $scope.loadBalancer = azureLoadBalancerTransformer.constructNewLoadBalancerTemplate(application);
109
+ }
110
+ if (isNew) {
111
+ updateLoadBalancerNames();
112
+ initializeCreateMode();
113
+ }
114
+ }
115
+
116
+ function updateLoadBalancerNames() {
117
+ const account = $scope.loadBalancer.credentials;
118
+ const region = $scope.loadBalancer.region;
119
+
120
+ const accountLoadBalancersByRegion = {};
121
+ application
122
+ .getDataSource('loadBalancers')
123
+ .refresh(true)
124
+ .then(() => {
125
+ application.getDataSource('loadBalancers').data.forEach((loadBalancer) => {
126
+ if (loadBalancer.account === account) {
127
+ accountLoadBalancersByRegion[loadBalancer.region] =
128
+ accountLoadBalancersByRegion[loadBalancer.region] || [];
129
+ accountLoadBalancersByRegion[loadBalancer.region].push(loadBalancer.name);
130
+ }
131
+ });
132
+
133
+ $scope.existingLoadBalancerNames = accountLoadBalancersByRegion[region] || [];
134
+ });
135
+ }
136
+
137
+ initializeController();
138
+
139
+ this.requiresHealthCheckPath = function () {
140
+ return (
141
+ $scope.loadBalancer.probes[0].probeProtocol && $scope.loadBalancer.probes[0].probeProtocol.indexOf('HTTP') === 0
142
+ );
143
+ };
144
+
145
+ this.updateName = function () {
146
+ $scope.loadBalancer.name = this.getName();
147
+ };
148
+
149
+ this.getName = function () {
150
+ const elb = $scope.loadBalancer;
151
+ const elbName = [application.name, elb.stack || '', elb.detail || ''].join('-');
152
+ return _.trimEnd(elbName, '-');
153
+ };
154
+
155
+ this.accountUpdated = function () {
156
+ AccountService.getRegionsForAccount($scope.loadBalancer.credentials).then(function (regions) {
157
+ $scope.regions = regions;
158
+ ctrl.regionUpdated();
159
+ });
160
+ };
161
+
162
+ this.regionUpdated = function () {
163
+ updateLoadBalancerNames();
164
+ ctrl.updateName();
165
+ ctrl.vnetUpdated();
166
+ };
167
+
168
+ this.vnetUpdated = function () {
169
+ const account = $scope.loadBalancer.credentials;
170
+ const region = $scope.loadBalancer.region;
171
+ $scope.loadBalancer.selectedVnet = null;
172
+ $scope.loadBalancer.vnet = null;
173
+ $scope.loadBalancer.vnetResourceGroup = null;
174
+ ctrl.selectedVnets = [];
175
+
176
+ NetworkReader.listNetworks().then(function (vnets) {
177
+ if (vnets.azure) {
178
+ vnets.azure.forEach((vnet) => {
179
+ if (vnet.account === account && vnet.region === region) {
180
+ ctrl.selectedVnets.push(vnet);
181
+ }
182
+ });
183
+ }
184
+ });
185
+
186
+ ctrl.subnetUpdated();
187
+ };
188
+
189
+ this.subnetUpdated = function () {
190
+ $scope.loadBalancer.selectedSubnet = null;
191
+ $scope.loadBalancer.subnet = null;
192
+ ctrl.selectedSubnets = [];
193
+ };
194
+
195
+ this.selectedVnetChanged = function (item) {
196
+ $scope.loadBalancer.vnet = item.name;
197
+ $scope.loadBalancer.vnetResourceGroup = item.resourceGroup;
198
+ $scope.loadBalancer.selectedSubnet = null;
199
+ $scope.loadBalancer.subnet = null;
200
+ ctrl.selectedSubnets = [];
201
+ if (item.subnets) {
202
+ item.subnets.map(function (subnet) {
203
+ let addSubnet = true;
204
+ if (subnet.devices) {
205
+ subnet.devices.map(function (device) {
206
+ if (device && device.type !== 'applicationGateways') {
207
+ addSubnet = false;
208
+ }
209
+ });
210
+ }
211
+ if (addSubnet) {
212
+ ctrl.selectedSubnets.push(subnet);
213
+ }
214
+ });
215
+ }
216
+ };
217
+
218
+ this.removeListener = function (index) {
219
+ $scope.loadBalancer.loadBalancingRules.splice(index, 1);
220
+ };
221
+
222
+ this.addListener = function () {
223
+ $scope.loadBalancer.loadBalancingRules.push({ protocol: 'HTTP' });
224
+ };
225
+
226
+ this.submit = function () {
227
+ const descriptor = isNew ? 'Create' : 'Update';
228
+
229
+ $scope.taskMonitor.submit(function () {
230
+ const params = {
231
+ cloudProvider: 'azure',
232
+ appName: application.name,
233
+ clusterName: $scope.loadBalancer.clusterName,
234
+ resourceGroupName: $scope.loadBalancer.clusterName,
235
+ loadBalancerName: $scope.loadBalancer.name,
236
+ };
237
+
238
+ if ($scope.loadBalancer.selectedVnet) {
239
+ $scope.loadBalancer.vnet = $scope.loadBalancer.selectedVnet.name;
240
+ $scope.loadBalancer.vnetResourceGroup = $scope.loadBalancer.selectedVnet.resourceGroup;
241
+ }
242
+
243
+ if ($scope.loadBalancer.selectedSubnet) {
244
+ $scope.loadBalancer.subnet = $scope.loadBalancer.selectedSubnet.name;
245
+ }
246
+
247
+ const name = $scope.loadBalancer.clusterName || $scope.loadBalancer.name;
248
+ const probeName = name + '-probe';
249
+ const ruleNameBase = name + '-rule';
250
+ $scope.loadBalancer.type = 'upsertLoadBalancer';
251
+ $scope.loadBalancer.loadBalancerType = $scope.loadBalancerType;
252
+ if (!$scope.loadBalancer.vnet && !$scope.loadBalancer.subnetType) {
253
+ $scope.loadBalancer.securityGroups = null;
254
+ }
255
+
256
+ $scope.loadBalancer.probes[0].probeName = probeName;
257
+
258
+ $scope.loadBalancer.loadBalancingRules.forEach((rule, index) => {
259
+ rule.ruleName = ruleNameBase + index;
260
+ rule.probeName = probeName;
261
+ });
262
+
263
+ if ($scope.loadBalancer.probes[0].probeProtocol === 'TCP') {
264
+ $scope.loadBalancer.probes[0].probePath = undefined;
265
+ }
266
+
267
+ return LoadBalancerWriter.upsertLoadBalancer($scope.loadBalancer, application, descriptor, params);
268
+ });
269
+ };
270
+
271
+ this.cancel = function () {
272
+ $uibModalInstance.dismiss();
273
+ };
274
+ },
275
+ ]);
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+ import { ApplicationModelBuilder } from '@spinnaker/core';
3
+
4
+ describe('Controller: azureCreateLoadBalancerCtrl', function () {
5
+ // load the controller's module
6
+ beforeEach(window.module(require('./createLoadBalancer.controller').name));
7
+
8
+ // Initialize the controller and a mock scope
9
+ beforeEach(
10
+ window.inject(function ($controller, $rootScope) {
11
+ const app = ApplicationModelBuilder.createApplicationForTests('app', {
12
+ key: 'loadBalancers',
13
+ lazy: true,
14
+ defaultData: [],
15
+ });
16
+ this.$scope = $rootScope.$new();
17
+ this.ctrl = $controller('azureCreateLoadBalancerCtrl', {
18
+ $scope: this.$scope,
19
+ $uibModalInstance: { dismiss: angular.noop, result: { then: angular.noop } },
20
+ application: app,
21
+ loadBalancer: null,
22
+ isNew: true,
23
+ loadBalancerType: 'Azure Load Balancer',
24
+ });
25
+ }),
26
+ );
27
+
28
+ it('correctly creates a default loadbalancer', function () {
29
+ var lb = this.$scope.loadBalancer;
30
+
31
+ expect(lb.probes.length).toEqual(1);
32
+ expect(lb.loadBalancingRules.length).toEqual(1);
33
+
34
+ expect(lb.loadBalancingRules[0].protocol).toEqual('HTTP');
35
+
36
+ expect(this.$scope.existingLoadBalancerNames).toEqual(undefined);
37
+ expect(lb.providerType).toEqual(undefined);
38
+ });
39
+ });
@@ -0,0 +1,25 @@
1
+ <form name="form" class="form-horizontal" novalidate validate-on-submit>
2
+ <v2-modal-wizard heading="Create New {{loadBalancerType}}" task-monitor="taskMonitor" dismiss="$dismiss()">
3
+ <v2-wizard-page key="Location" label="Location">
4
+ <ng-include src="pages.location"></ng-include>
5
+ </v2-wizard-page>
6
+ <v2-wizard-page key="Listeners" label="Listeners" done="true">
7
+ <ng-include src="pages.listeners"></ng-include>
8
+ </v2-wizard-page>
9
+ <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">
10
+ <ng-include src="pages.healthCheck"></ng-include>
11
+ </v2-wizard-page>
12
+ <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">
13
+ <ng-include src="pages.advancedSettings"></ng-include>
14
+ </v2-wizard-page>
15
+ </v2-modal-wizard>
16
+ <div class="modal-footer">
17
+ <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>
18
+ <submit-button
19
+ is-disabled="!state.accountsLoaded || taskMonitor.submitting"
20
+ submitting="taskMonitor.submitting"
21
+ on-click="form.$valid && ctrl.submit()"
22
+ is-new="isNew"
23
+ ></submit-button>
24
+ </div>
25
+ </form>
@@ -0,0 +1,128 @@
1
+ <div>
2
+ <div ng-if="!state.accountsLoaded" style="height: 200px" class="horizontal center middle">
3
+ <loading-spinner size="'small'"></loading-spinner>
4
+ </div>
5
+ <div class="modal-body" ng-if="state.accountsLoaded">
6
+ <div class="form-group">
7
+ <div
8
+ class="col-md-12 well"
9
+ ng-class="{'alert-danger': form.loadBalancerName.$error.validateUnique, 'alert-info': !form.loadBalancerName.$error.validateUnique}"
10
+ >
11
+ <strong>Your {{loadBalancerType}} will be named:</strong>
12
+ <span>{{ctrl.getName()}}</span>
13
+ <!-- Angular does not seem to run length validation on hidden inputs, hence the text + display:none -->
14
+ <input
15
+ type="text"
16
+ style="display: none"
17
+ ng-maxlength="32"
18
+ class="form-control input-sm"
19
+ ng-model="loadBalancer.name"
20
+ validate-unique="existingLoadBalancerNames"
21
+ validate-ignore-case="true"
22
+ name="loadBalancerName"
23
+ />
24
+ <validation-error
25
+ ng-if="form.loadBalancerName.$error.validateUnique"
26
+ message="There is already a load balancer in {{loadBalancer.credentials}}:{{loadBalancer.region}} with that name."
27
+ ></validation-error>
28
+ </div>
29
+ </div>
30
+ <div class="form-group">
31
+ <div class="col-md-3 sm-label-right">Account</div>
32
+ <div class="col-md-7">
33
+ <account-select-field
34
+ required
35
+ component="loadBalancer"
36
+ field="credentials"
37
+ accounts="accounts"
38
+ provider="'azure'"
39
+ on-change="ctrl.accountUpdated()"
40
+ ></account-select-field>
41
+ </div>
42
+ </div>
43
+ <region-select-field
44
+ required
45
+ label-columns="3"
46
+ component="loadBalancer"
47
+ field="region"
48
+ account="loadBalancer.credentials"
49
+ provider="'azure'"
50
+ on-change="ctrl.regionUpdated()"
51
+ regions="regions"
52
+ ></region-select-field>
53
+
54
+ <div class="form-group" ng-if="!isALB">
55
+ <div class="col-md-3 sm-label-right">Virtual Network</div>
56
+ <div class="col-md-7">
57
+ <ui-select
58
+ class="form-control input-sm"
59
+ required
60
+ ng-model="loadBalancer.selectedVnet"
61
+ on-select="ctrl.selectedVnetChanged($item)"
62
+ >
63
+ <ui-select-match placeholder="Select from existing virtual networks"
64
+ >{{$select.selected.name}}</ui-select-match
65
+ >
66
+ <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">
67
+ <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>
68
+ </ui-select-choices>
69
+ </ui-select>
70
+ </div>
71
+ </div>
72
+
73
+ <div class="form-group" ng-if="!isALB">
74
+ <div class="col-md-3 sm-label-right">Subnet</div>
75
+ <div class="col-md-7">
76
+ <ui-select
77
+ class="form-control input-sm"
78
+ required
79
+ ng-model="loadBalancer.selectedSubnet"
80
+ on-select="ctrl.selectedSubnetChanged($item)"
81
+ >
82
+ <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>
83
+ <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">
84
+ <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>
85
+ </ui-select-choices>
86
+ </ui-select>
87
+ </div>
88
+ </div>
89
+
90
+ <div class="form-group">
91
+ <div class="col-md-3 sm-label-right">Stack <help-field key="azure.loadBalancer.stack"></help-field></div>
92
+ <div class="col-md-3">
93
+ <input
94
+ required
95
+ type="text"
96
+ class="form-control input-sm"
97
+ ng-model="loadBalancer.stack"
98
+ name="stackName"
99
+ ng-change="ctrl.updateName()"
100
+ ng-pattern="/^[a-zA-Z0-9]*$/"
101
+ />
102
+ </div>
103
+ <div class="col-md-6 form-inline">
104
+ <label class="sm-label-right"> Detail <help-field key="azure.loadBalancer.detail"></help-field> </label>
105
+ <input
106
+ required
107
+ type="text"
108
+ class="form-control input-sm"
109
+ ng-model="loadBalancer.detail"
110
+ name="detailName"
111
+ ng-change="ctrl.updateName()"
112
+ ng-pattern="/^[a-zA-Z0-9-]*$/"
113
+ />
114
+ </div>
115
+ <div class="col-md-7 col-md-offset-3" ng-if="form.stackName.$error.pattern">
116
+ <validation-error message="Stack can only contain letters and numbers."></validation-error>
117
+ </div>
118
+ <div class="col-md-7 col-md-offset-3" ng-if="form.detailName.$error.pattern">
119
+ <validation-error message="Detail can only contain letters, numbers, and dashes."></validation-error>
120
+ </div>
121
+ </div>
122
+ <div class="form-group">
123
+ <div class="col-md-9 col-md-offset-3" ng-if="form.loadBalancerName.$error.maxlength">
124
+ <validation-error message="Load Balancer name can only be 32 characters."></validation-error>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
@@ -0,0 +1,26 @@
1
+ <form name="form" novalidate validate-on-submit>
2
+ <v2-modal-wizard
3
+ heading="Edit {{loadBalancerType}} {{loadBalancer.name}}"
4
+ task-monitor="taskMonitor"
5
+ dismiss="$dismiss()"
6
+ >
7
+ <v2-wizard-page key="Listeners" label="Listeners" done="true">
8
+ <ng-include src="pages.listeners"></ng-include>
9
+ </v2-wizard-page>
10
+ <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">
11
+ <ng-include src="pages.healthCheck"></ng-include>
12
+ </v2-wizard-page>
13
+ <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">
14
+ <ng-include src="pages.advancedSettings"></ng-include>
15
+ </v2-wizard-page>
16
+ </v2-modal-wizard>
17
+ <div class="modal-footer">
18
+ <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>
19
+ <submit-button
20
+ is-disabled="taskMonitor.submitting"
21
+ submitting="taskMonitor.submitting"
22
+ on-click="form.$valid && ctrl.submit()"
23
+ is-new="isNew"
24
+ ></submit-button>
25
+ </div>
26
+ </form>
@@ -0,0 +1,74 @@
1
+ <div class="container-fluid form-horizontal">
2
+ <div class="form-group">
3
+ <div class="col-md-12">
4
+ <table class="table table-condensed packed" ng-if="!isALB">
5
+ <thead>
6
+ <tr>
7
+ <th width="35%">Protocol</th>
8
+ <th width="30%">Host</th>
9
+ <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <tr>
14
+ <td>
15
+ <select
16
+ class="form-control input-sm"
17
+ ng-model="loadBalancer.probes[0].probeProtocol"
18
+ required
19
+ ng-options="protocol for protocol in ['HTTP']"
20
+ ></select>
21
+ </td>
22
+ <td>
23
+ <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />
24
+ </td>
25
+ <td>
26
+ <input
27
+ ng-if="ctrl.requiresHealthCheckPath()"
28
+ class="form-control input-sm"
29
+ type="text"
30
+ ng-model="loadBalancer.probes[0].probePath"
31
+ required
32
+ />
33
+ </td>
34
+ </tr>
35
+ </tbody>
36
+ </table>
37
+
38
+ <table class="table table-condensed packed" ng-if="isALB">
39
+ <thead>
40
+ <tr>
41
+ <th width="35%">Protocol</th>
42
+ <th width="30%">Port</th>
43
+ <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>
44
+ </tr>
45
+ </thead>
46
+ <tbody>
47
+ <tr>
48
+ <td>
49
+ <select
50
+ class="form-control input-sm"
51
+ ng-model="loadBalancer.probes[0].probeProtocol"
52
+ ng-init="loadBalancer.probes[0].probeProtocol = 'TCP'"
53
+ required
54
+ ng-options="protocol for protocol in ['TCP', 'HTTP']"
55
+ ></select>
56
+ </td>
57
+ <td>
58
+ <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />
59
+ </td>
60
+ <td>
61
+ <input
62
+ ng-if="ctrl.requiresHealthCheckPath()"
63
+ class="form-control input-sm"
64
+ type="text"
65
+ ng-model="loadBalancer.probes[0].probePath"
66
+ required
67
+ />
68
+ </td>
69
+ </tr>
70
+ </tbody>
71
+ </table>
72
+ </div>
73
+ </div>
74
+ </div>