@spinnaker/azure 0.0.0-main-2

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,262 @@
1
+ 'use strict';
2
+
3
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
4
+ import { module } from 'angular';
5
+ import _ from 'lodash';
6
+
7
+ import {
8
+ AccountService,
9
+ FirewallLabels,
10
+ SECURITY_GROUP_READER,
11
+ SecurityGroupWriter,
12
+ TaskMonitor,
13
+ } from '@spinnaker/core';
14
+
15
+ export const AZURE_SECURITYGROUP_CONFIGURE_CONFIGSECURITYGROUP_MIXIN_CONTROLLER =
16
+ 'spinnaker.azure.securityGroup.baseConfig.controller';
17
+ export const name = AZURE_SECURITYGROUP_CONFIGURE_CONFIGSECURITYGROUP_MIXIN_CONTROLLER; // for backwards compatibility
18
+ module(AZURE_SECURITYGROUP_CONFIGURE_CONFIGSECURITYGROUP_MIXIN_CONTROLLER, [
19
+ UIROUTER_ANGULARJS,
20
+ SECURITY_GROUP_READER,
21
+ ]).controller('azureConfigSecurityGroupMixin', [
22
+ '$scope',
23
+ '$state',
24
+ '$uibModalInstance',
25
+ 'application',
26
+ 'securityGroup',
27
+ 'securityGroupReader',
28
+ 'modalWizardService',
29
+ 'cacheInitializer',
30
+ function (
31
+ $scope,
32
+ $state,
33
+ $uibModalInstance,
34
+ application,
35
+ securityGroup,
36
+ securityGroupReader,
37
+ modalWizardService,
38
+ cacheInitializer,
39
+ ) {
40
+ let allSecurityGroups;
41
+ const ctrl = this;
42
+
43
+ $scope.isNew = true;
44
+
45
+ $scope.state = {
46
+ submitting: false,
47
+ refreshingSecurityGroups: false,
48
+ removedRules: [],
49
+ infiniteScroll: {
50
+ numToAdd: 20,
51
+ currentItems: 20,
52
+ },
53
+ };
54
+
55
+ ctrl.addMoreItems = function () {
56
+ $scope.state.infiniteScroll.currentItems += $scope.state.infiniteScroll.numToAdd;
57
+ };
58
+
59
+ function onApplicationRefresh() {
60
+ // If the user has already closed the modal, do not navigate to the new details view
61
+ if ($scope.$$destroyed) {
62
+ return;
63
+ }
64
+ $uibModalInstance.close();
65
+ const newStateParams = {
66
+ name: $scope.securityGroup.name,
67
+ accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,
68
+ region: $scope.securityGroup.regions[0],
69
+ vpcId: $scope.securityGroup.vpcId,
70
+ provider: 'azure',
71
+ };
72
+ if (!$state.includes('**.firewallDetails')) {
73
+ $state.go('.firewallDetails', newStateParams);
74
+ } else {
75
+ $state.go('^.firewallDetails', newStateParams);
76
+ }
77
+ }
78
+
79
+ function onTaskComplete() {
80
+ application.securityGroups.refresh();
81
+ application.securityGroups.onNextRefresh($scope, onApplicationRefresh);
82
+ }
83
+
84
+ $scope.taskMonitor = new TaskMonitor({
85
+ application: application,
86
+ title: `Creating your ${FirewallLabels.get('firewall')}`,
87
+ modalInstance: $uibModalInstance,
88
+ onTaskComplete: onTaskComplete,
89
+ });
90
+
91
+ $scope.securityGroup = securityGroup;
92
+
93
+ ctrl.upsert = function () {
94
+ $scope.taskMonitor.submit(function () {
95
+ return SecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Create');
96
+ });
97
+ };
98
+
99
+ function clearSecurityGroups() {
100
+ $scope.availableSecurityGroups = [];
101
+ $scope.existingSecurityGroupNames = [];
102
+ }
103
+
104
+ ctrl.accountUpdated = function () {
105
+ const account = $scope.securityGroup.credentials || $scope.securityGroup.accountName;
106
+ AccountService.getRegionsForAccount(account).then(function (regions) {
107
+ $scope.regions = _.map(regions, 'name');
108
+ clearSecurityGroups();
109
+ ctrl.regionUpdated();
110
+ ctrl.updateName();
111
+ });
112
+ };
113
+
114
+ //ctrl.ifVcsFoundInAllRegions = function() {
115
+ // var foundInAllRegions = true;
116
+ // _.forEach($scope.securityGroup.regions, function(region) {
117
+ // if (!_.some(vpcsToTest, { region: region, account: $scope.securityGroup.credentials })) {
118
+ // foundInAllRegions = false;
119
+ // }
120
+ // });
121
+ // return foundInAllRegions;
122
+ //};
123
+
124
+ ctrl.regionUpdated = function () {};
125
+
126
+ this.vpcUpdated = function () {
127
+ const account = $scope.securityGroup.credentials || $scope.securityGroup.accountName;
128
+ const regions = $scope.securityGroup.regions;
129
+ if (account && regions && regions.length) {
130
+ configureFilteredSecurityGroups();
131
+ } else {
132
+ clearSecurityGroups();
133
+ }
134
+ };
135
+
136
+ function configureFilteredSecurityGroups() {
137
+ const vpcId = $scope.securityGroup.vpcId || null;
138
+ const account = $scope.securityGroup.credentials || $scope.securityGroup.accountName;
139
+ const regions = $scope.securityGroup.regions || [];
140
+ let existingSecurityGroupNames = [];
141
+ let availableSecurityGroups = [];
142
+
143
+ regions.forEach(function (region) {
144
+ let regionalVpcId = null;
145
+ if (vpcId) {
146
+ const baseVpc = _.find($scope.allVpcs, { id: vpcId });
147
+ regionalVpcId = _.find($scope.allVpcs, { account: account, region: region, name: baseVpc.name }).id;
148
+ }
149
+
150
+ const regionalSecurityGroups = _.filter(allSecurityGroups[account].azure[region], { vpcId: regionalVpcId });
151
+ const regionalGroupNames = _.map(regionalSecurityGroups, 'name');
152
+
153
+ existingSecurityGroupNames = _.uniq(existingSecurityGroupNames.concat(regionalGroupNames));
154
+
155
+ if (!availableSecurityGroups.length) {
156
+ availableSecurityGroups = existingSecurityGroupNames;
157
+ } else {
158
+ availableSecurityGroups = _.intersection(availableSecurityGroups, regionalGroupNames);
159
+ }
160
+ });
161
+
162
+ $scope.availableSecurityGroups = availableSecurityGroups;
163
+ $scope.existingSecurityGroupNames = existingSecurityGroupNames;
164
+ clearInvalidSecurityGroups();
165
+ }
166
+
167
+ ctrl.mixinUpsert = function (descriptor) {
168
+ $scope.taskMonitor.submit(function () {
169
+ return SecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, descriptor);
170
+ });
171
+ };
172
+
173
+ function clearInvalidSecurityGroups() {
174
+ const removed = $scope.state.removedRules;
175
+ $scope.securityGroup.securityGroupIngress = $scope.securityGroup.securityGroupIngress.filter(function (rule) {
176
+ if (rule.name && !$scope.availableSecurityGroups.includes(rule.name) && !removed.includes(rule.name)) {
177
+ removed.push(rule.name);
178
+ return false;
179
+ }
180
+ return true;
181
+ });
182
+ if (removed.length) {
183
+ modalWizardService.getWizard().markDirty('Ingress');
184
+ }
185
+ }
186
+
187
+ ctrl.refreshSecurityGroups = function () {
188
+ $scope.state.refreshingSecurityGroups = true;
189
+ return cacheInitializer.refreshCache('securityGroups').then(function () {
190
+ return ctrl.initializeSecurityGroups().then(function () {
191
+ ctrl.vpcUpdated();
192
+ $scope.state.refreshingSecurityGroups = false;
193
+ });
194
+ });
195
+ };
196
+
197
+ allSecurityGroups = {};
198
+
199
+ ctrl.initializeSecurityGroups = function () {
200
+ return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {
201
+ allSecurityGroups = securityGroups;
202
+ const account = $scope.securityGroup.credentials || $scope.securityGroup.accountName;
203
+ const region = $scope.securityGroup.regions[0];
204
+ const vpcId = $scope.securityGroup.vpcId || null;
205
+
206
+ let availableGroups;
207
+ if (account && region) {
208
+ availableGroups = _.filter(securityGroups[account].azure[region], { vpcId: vpcId });
209
+ } else {
210
+ availableGroups = securityGroups;
211
+ }
212
+
213
+ $scope.availableSecurityGroups = _.map(availableGroups, 'name');
214
+ });
215
+ };
216
+
217
+ ctrl.cancel = function () {
218
+ $uibModalInstance.dismiss();
219
+ };
220
+
221
+ const classicPattern = /^[\x20-\x7F]+$/;
222
+ const vpcPattern = /^[a-zA-Z0-9\s._\-:/()#,@[\]+=&;{}!$*]+$/;
223
+
224
+ ctrl.getCurrentNamePattern = function () {
225
+ return $scope.securityGroup.vpcId ? vpcPattern : classicPattern;
226
+ };
227
+
228
+ ctrl.updateName = function () {
229
+ const securityGroup = $scope.securityGroup;
230
+ let name = application.name;
231
+ if (securityGroup.detail) {
232
+ name += '-' + securityGroup.detail;
233
+ }
234
+ securityGroup.name = name;
235
+ $scope.namePreview = name;
236
+ };
237
+
238
+ ctrl.namePattern = {
239
+ test: function (name) {
240
+ return ctrl.getCurrentNamePattern().test(name);
241
+ },
242
+ };
243
+
244
+ ctrl.addRule = function (ruleset) {
245
+ ruleset.push({
246
+ type: 'tcp',
247
+ startPort: 7001,
248
+ endPort: 7001,
249
+ });
250
+ };
251
+
252
+ ctrl.removeRule = function (ruleset, index) {
253
+ ruleset.splice(index, 1);
254
+ };
255
+
256
+ ctrl.dismissRemovedRules = function () {
257
+ $scope.state.removedRules = [];
258
+ modalWizardService.getWizard().markClean('Ingress');
259
+ modalWizardService.getWizard().markComplete('Ingress');
260
+ };
261
+ },
262
+ ]);
@@ -0,0 +1,20 @@
1
+ <form name="form" class="form-horizontal" novalidate validate-on-submit>
2
+ <v2-modal-wizard heading="Create New {{firewallLabel}}" 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="Ingress" label="Ingress" done="true">
7
+ <ng-include src="pages.ingress"></ng-include>
8
+ </v2-wizard-page>
9
+ </v2-modal-wizard>
10
+ <div class="modal-footer">
11
+ <button class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>
12
+ <submit-button
13
+ is-disabled="state.submitting"
14
+ submitting="state.submitting"
15
+ on-click="form.$valid && ctrl.upsert()"
16
+ is-new="isNew"
17
+ >
18
+ </submit-button>
19
+ </div>
20
+ </form>
@@ -0,0 +1,75 @@
1
+ <div class="modal-body">
2
+ <div class="row"></div>
3
+ <div class="form-group">
4
+ <div class="form-group">
5
+ <div class="col-md-12">
6
+ <table class="table table-condensed packed">
7
+ <thead>
8
+ <tr>
9
+ <th style="width: 21%">Protocol</th>
10
+ <th style="width: 32%">
11
+ Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>
12
+ </th>
13
+ <th style="width: 32%">
14
+ Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>
15
+ </th>
16
+ <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <tr ng-repeat="rule in securityGroup.securityRules">
21
+ <td>
22
+ <select class="form-control input-sm" ng-model="rule.protocolUI">
23
+ <option value="tcp">TCP</option>
24
+ <option value="udp">UDP</option>
25
+ <option value="*">ANY</option>
26
+ </select>
27
+ </td>
28
+ <td>
29
+ <input
30
+ class="form-control input-sm"
31
+ type="text"
32
+ value="*"
33
+ pattern="^\*$|^((25[0-5]|2[0-4]\d|[01]?\d\d?)[.]){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]|[1-2]\d|3[0-2]))?(,((25[0-5]|2[0-4]\d|[01]?\d\d?)[.]){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/([1-9]|[1-2]\d|3[0-2]))?)*$"
34
+ ng-model="rule.sourceIPCIDRRanges"
35
+ ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"
36
+ required
37
+ />
38
+ </td>
39
+ <td>
40
+ <input
41
+ class="form-control input-sm"
42
+ type="text"
43
+ value="80"
44
+ pattern="^\*$|^((\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])|(\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])-(\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))(,((\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])|(\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])-(\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])))*$"
45
+ ng-model="rule.destPortRanges"
46
+ ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"
47
+ required
48
+ />
49
+ </td>
50
+ <td>
51
+ <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"
52
+ ><span class="glyphicon glyphicon-arrow-up"></span>
53
+ </a>
54
+ <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"
55
+ ><span class="glyphicon glyphicon-arrow-down"></span>
56
+ </a>
57
+ <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"
58
+ ><span class="glyphicon glyphicon-trash"></span>
59
+ </a>
60
+ </td>
61
+ </tr>
62
+ </tbody>
63
+ </table>
64
+ </div>
65
+ </div>
66
+ <div class="form-group small" style="margin-top: 20px">
67
+ <div class="col-md-12">
68
+ <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">
69
+ <span class="glyphicon glyphicon-plus-sign"></span> Add new
70
+ <firewall-label label="Firewall"></firewall-label> Rule
71
+ </button>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
@@ -0,0 +1,88 @@
1
+ <div class="modal-body">
2
+ <div class="form-group">
3
+ <div
4
+ class="col-md-12 well"
5
+ ng-class="{'alert-danger': form.securityGroupName.$error.validateUnique, 'alert-info': !form.securityGroupName.$error.validateUnique}"
6
+ >
7
+ <strong>Your <firewall-label label="firewall"></firewall-label> will be named:</strong>
8
+ <span ng-bind="namePreview"></span>
9
+ </div>
10
+ </div>
11
+ <div class="form-group">
12
+ <div class="col-md-4 sm-label-right">Detail</div>
13
+ <div class="col-md-4">
14
+ <input
15
+ type="text"
16
+ class="form-control input-sm"
17
+ required
18
+ ng-model="securityGroup.detail"
19
+ ng-change="ctrl.updateName()"
20
+ />
21
+ </div>
22
+ </div>
23
+ <div class="form-group">
24
+ <div class="col-md-4 sm-label-right">Description</div>
25
+ <div class="col-md-8">
26
+ <input type="text" class="form-control input-sm" ng-model="securityGroup.description" />
27
+ </div>
28
+ </div>
29
+ <div class="form-group">
30
+ <div class="col-md-4 sm-label-right">Account</div>
31
+ <div class="col-md-8">
32
+ <account-select-field
33
+ required
34
+ component="securityGroup"
35
+ field="credentials"
36
+ accounts="accounts"
37
+ provider="'azure'"
38
+ on-change="ctrl.accountUpdated()"
39
+ ></account-select-field>
40
+ </div>
41
+ </div>
42
+ <div class="form-group">
43
+ <div class="col-md-12">
44
+ <region-select-field
45
+ label-columns="4"
46
+ component="securityGroup"
47
+ field="region"
48
+ field-columns="8"
49
+ account="securityGroup.credentials"
50
+ provider="'azure'"
51
+ on-change="ctrl.regionUpdated()"
52
+ regions="regions"
53
+ ></region-select-field>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="form-group">
58
+ <div class="col-md-4 sm-label-right">Virtual Network</div>
59
+ <div class="col-md-7">
60
+ <ui-select
61
+ class="form-control input-sm"
62
+ ng-model="securityGroup.selectedVnet"
63
+ on-select="ctrl.selectedVnetChanged($item)"
64
+ >
65
+ <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>
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">
74
+ <div class="col-md-4 sm-label-right">Subnet</div>
75
+ <div class="col-md-7">
76
+ <ui-select
77
+ class="form-control input-sm"
78
+ ng-model="securityGroup.selectedSubnet"
79
+ on-select="ctrl.selectedSubnetChanged($item)"
80
+ >
81
+ <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>
82
+ <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">
83
+ <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>
84
+ </ui-select-choices>
85
+ </ui-select>
86
+ </div>
87
+ </div>
88
+ </div>
@@ -0,0 +1,19 @@
1
+ <form name="form" novalidate validate-on-submit>
2
+ <v2-modal-wizard
3
+ heading="Edit {{securityGroup.name}}: {{securityGroup.region}}: {{securityGroup.credentials}}"
4
+ task-monitor="taskMonitor"
5
+ dismiss="$dismiss()"
6
+ >
7
+ <v2-wizard-page key="Ingress" label="Ingress" done="true">
8
+ <ng-include src="pages.ingress"></ng-include>
9
+ </v2-wizard-page>
10
+ </v2-modal-wizard>
11
+ <div class="modal-footer">
12
+ <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>
13
+ <submit-button
14
+ is-disabled="taskMonitor.submitting"
15
+ submitting="taskMonitor.submitting"
16
+ on-click="form.$valid && ctrl.upsert()"
17
+ ></submit-button>
18
+ </div>
19
+ </form>
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
4
+ import * as angular from 'angular';
5
+ import _ from 'lodash';
6
+
7
+ import { ConfirmationModalService, FirewallLabels, SECURITY_GROUP_READER } from '@spinnaker/core';
8
+
9
+ import { AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER } from '../clone/cloneSecurityGroup.controller';
10
+ import { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';
11
+
12
+ export const AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =
13
+ 'spinnaker.azure.securityGroup.azure.details.controller';
14
+ export const name = AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility
15
+ angular
16
+ .module(AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [
17
+ UIROUTER_ANGULARJS,
18
+ SECURITY_GROUP_READER,
19
+ AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,
20
+ AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER,
21
+ ])
22
+ .controller('azureSecurityGroupDetailsCtrl', [
23
+ '$scope',
24
+ '$state',
25
+ 'resolvedSecurityGroup',
26
+ 'app',
27
+ 'azureSecurityGroupWriter',
28
+ 'securityGroupReader',
29
+ '$uibModal',
30
+ function ($scope, $state, resolvedSecurityGroup, app, azureSecurityGroupWriter, securityGroupReader, $uibModal) {
31
+ const application = app;
32
+ const securityGroup = resolvedSecurityGroup;
33
+
34
+ $scope.state = {
35
+ loading: true,
36
+ };
37
+
38
+ $scope.firewallLabel = FirewallLabels.get('Firewall');
39
+
40
+ function extractSecurityGroup() {
41
+ return securityGroupReader
42
+ .getSecurityGroupDetails(
43
+ application,
44
+ securityGroup.accountId,
45
+ securityGroup.provider,
46
+ securityGroup.region,
47
+ securityGroup.vpcId,
48
+ securityGroup.name,
49
+ )
50
+ .then(
51
+ function (details) {
52
+ $scope.state.loading = false;
53
+
54
+ if (!details || _.isEmpty(details)) {
55
+ fourOhFour();
56
+ } else {
57
+ $scope.securityGroup = details;
58
+ }
59
+ },
60
+ function () {
61
+ fourOhFour();
62
+ },
63
+ );
64
+ }
65
+
66
+ function fourOhFour() {
67
+ $state.go('^');
68
+ }
69
+
70
+ extractSecurityGroup().then(() => {
71
+ // If the user navigates away from the view before the initial extractSecurityGroup call completes,
72
+ // do not bother subscribing to the refresh
73
+ if (!$scope.$$destroyed) {
74
+ app.securityGroups.onRefresh($scope, extractSecurityGroup);
75
+ }
76
+ });
77
+
78
+ this.editInboundRules = function editInboundRules() {
79
+ $uibModal.open({
80
+ templateUrl: require('../configure/editSecurityGroup.html'),
81
+ controller: 'azureEditSecurityGroupCtrl as ctrl',
82
+ resolve: {
83
+ securityGroup: function () {
84
+ return angular.copy($scope.securityGroup);
85
+ },
86
+ application: function () {
87
+ return application;
88
+ },
89
+ },
90
+ });
91
+ };
92
+
93
+ this.cloneSecurityGroup = function cloneSecurityGroup() {
94
+ $uibModal.open({
95
+ templateUrl: require('../clone/cloneSecurityGroup.html'),
96
+ controller: 'azureCloneSecurityGroupController as ctrl',
97
+ resolve: {
98
+ securityGroup: function () {
99
+ const securityGroup = angular.copy($scope.securityGroup);
100
+ if (securityGroup.region) {
101
+ securityGroup.regions = [securityGroup.region];
102
+ }
103
+ return securityGroup;
104
+ },
105
+ application: function () {
106
+ return application;
107
+ },
108
+ },
109
+ });
110
+ };
111
+
112
+ this.deleteSecurityGroup = function deleteSecurityGroup() {
113
+ const taskMonitor = {
114
+ application: application,
115
+ title: 'Deleting ' + securityGroup.name,
116
+ };
117
+
118
+ const submitMethod = function () {
119
+ $scope.securityGroup.type = 'deleteSecurityGroup';
120
+ return azureSecurityGroupWriter.deleteSecurityGroup(securityGroup, application, {
121
+ cloudProvider: 'azure',
122
+ vpcId: $scope.securityGroup.vpcId,
123
+ });
124
+ };
125
+
126
+ ConfirmationModalService.confirm({
127
+ header: 'Really delete ' + securityGroup.name + '?',
128
+ buttonText: 'Delete ' + securityGroup.name,
129
+ account: securityGroup.accountId,
130
+ taskMonitorConfig: taskMonitor,
131
+ submitMethod: submitMethod,
132
+ });
133
+ };
134
+
135
+ if (app.isStandalone) {
136
+ // we still want the edit to refresh the firewall details when the modal closes
137
+ app.securityGroups = {
138
+ refresh: extractSecurityGroup,
139
+ };
140
+ }
141
+ },
142
+ ]);
@@ -0,0 +1,78 @@
1
+ <div class="details-panel">
2
+ <div class="header">
3
+ <div class="close-button">
4
+ <a class="btn btn-link" ui-sref="^">
5
+ <span class="glyphicon glyphicon-remove"></span>
6
+ </a>
7
+ </div>
8
+ <div ng-if="state.loading" class="horizontal center middle">
9
+ <loading-spinner size="'small'"></loading-spinner>
10
+ </div>
11
+ <div class="header-text horizontal middle" ng-if="!state.loading">
12
+ <span class="glyphicon glyphicon-transfer"></span>
13
+ <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>
14
+ {{securityGroup.name || '(not found)'}}
15
+ </h3>
16
+ </div>
17
+ <div class="actions">
18
+ <div class="dropdown" uib-dropdown dropdown-append-to-body>
19
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle" ng-disabled="disabled" uib-dropdown-toggle>
20
+ <firewall-label label="Firewall"></firewall-label> Actions <span class="caret"></span>
21
+ </button>
22
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
23
+ <li>
24
+ <a href ng-click="ctrl.deleteSecurityGroup()">Delete <firewall-label label="Firewall"></firewall-label></a>
25
+ </li>
26
+ <li><a href ng-click="ctrl.editInboundRules()">Edit Inbound Rules</a></li>
27
+ <li>
28
+ <a href ng-click="ctrl.cloneSecurityGroup()">Clone <firewall-label label="Firewall"></firewall-label></a>
29
+ </li>
30
+ </ul>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ <div class="content" ng-if="!state.loading">
35
+ <collapsible-section heading="{{firewallLabel}} Details" expanded="true">
36
+ <dl class="dl-horizontal dl-medium">
37
+ <dt>ID</dt>
38
+ <dd>{{securityGroup.id}}</dd>
39
+ <dt>Account</dt>
40
+ <dd><account-tag account="securityGroup.accountName"></account-tag></dd>
41
+ <dt>Region</dt>
42
+ <dd>{{securityGroup.region}}</dd>
43
+ <dt>Description:</dt>
44
+ <dd>{{securityGroup.description}}</dd>
45
+ </dl>
46
+ </collapsible-section>
47
+ <collapsible-section
48
+ heading="Security Rules ({{securityGroup.securityRules.length || 0}})"
49
+ expanded="{{!!(securityGroup.securityRules && securityGroup.securityRules.length)}}"
50
+ >
51
+ <div ng-if="!securityGroup.securityRules.length">None</div>
52
+ <dl
53
+ ng-class="insightCtrl.vm.filtersExpanded ? '' : 'dl-horizontal dl-medium'"
54
+ ng-repeat="rule in securityGroup.securityRules | orderBy: 'rule.priority'"
55
+ >
56
+ <dt>Name</dt>
57
+ <dd>{{rule.name}}</dd>
58
+ <dt>Priority</dt>
59
+ <dd>{{rule.priority}}</dd>
60
+ <dt>Direction</dt>
61
+ <dd>{{rule.direction}}</dd>
62
+ <dt>Access</dt>
63
+ <dd>{{rule.access}}</dd>
64
+ <dt>Protocol</dt>
65
+ <dd>{{rule.protocol}}</dd>
66
+ <dt>Src Addr Prefix</dt>
67
+ <dd>{{rule.sourceAddressPrefixModel}}</dd>
68
+ <dt>Src Port Range</dt>
69
+ <dd>{{rule.sourcePortRange}}</dd>
70
+ <dt>Dest Addr Prefix</dt>
71
+ <dd>{{rule.destinationAddressPrefix}}</dd>
72
+ <dt>Dest Port Range</dt>
73
+ <dd>{{rule.destinationPortRangeModel}}</dd>
74
+ <hr />
75
+ </dl>
76
+ </collapsible-section>
77
+ </div>
78
+ </div>