@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,256 @@
1
+ 'use strict';
2
+
3
+ describe('azureServerGroupTransformer', function () {
4
+ var transformer;
5
+
6
+ beforeEach(window.module(require('./serverGroup.transformer').name));
7
+
8
+ beforeEach(function () {
9
+ window.inject(function (_azureServerGroupTransformer_) {
10
+ transformer = _azureServerGroupTransformer_;
11
+ });
12
+ });
13
+
14
+ describe('command transforms', function () {
15
+ it('sets name correctly with no stack or detail', function () {
16
+ var base = {
17
+ application: 'myApp',
18
+ sku: {
19
+ capacity: 1,
20
+ },
21
+ selectedImage: {
22
+ publisher: 'Microsoft',
23
+ offer: 'Windows',
24
+ sku: 'Server2016',
25
+ version: '12.0.0.1',
26
+ },
27
+ selectedVnet: {},
28
+ viewState: {
29
+ mode: 'create',
30
+ },
31
+ };
32
+
33
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(base);
34
+
35
+ expect(transformed.name).toBe('myApp');
36
+ });
37
+
38
+ it('it sets name correctly with only stack', function () {
39
+ var command = {
40
+ stack: 's1',
41
+ application: 'theApp',
42
+ sku: {
43
+ capacity: 1,
44
+ },
45
+ selectedImage: {
46
+ publisher: 'Microsoft',
47
+ offer: 'Windows',
48
+ sku: 'Server2016',
49
+ version: '12.0.0.1',
50
+ },
51
+ selectedVnet: {},
52
+ viewState: {
53
+ mode: 'create',
54
+ },
55
+ };
56
+
57
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
58
+
59
+ expect(transformed.name).toBe('theApp-s1');
60
+ });
61
+
62
+ it('it sets name correctly with only detail', function () {
63
+ var command = {
64
+ freeFormDetails: 'd1',
65
+ application: 'theApp',
66
+ sku: {
67
+ capacity: 1,
68
+ },
69
+ selectedImage: {
70
+ publisher: 'Microsoft',
71
+ offer: 'Windows',
72
+ sku: 'Server2016',
73
+ version: '12.0.0.1',
74
+ },
75
+ selectedVnet: {},
76
+ viewState: {
77
+ mode: 'create',
78
+ },
79
+ };
80
+
81
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
82
+
83
+ expect(transformed.name).toBe('theApp-d1');
84
+ });
85
+
86
+ it('it sets name correctly with both stack and detail', function () {
87
+ var command = {
88
+ stack: 's1',
89
+ freeFormDetails: 'd1',
90
+ application: 'theApp',
91
+ sku: {
92
+ capacity: 1,
93
+ },
94
+ selectedImage: {
95
+ publisher: 'Microsoft',
96
+ offer: 'Windows',
97
+ sku: 'Server2016',
98
+ version: '12.0.0.1',
99
+ },
100
+ selectedVnet: {},
101
+ viewState: {
102
+ mode: 'create',
103
+ },
104
+ };
105
+
106
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
107
+
108
+ expect(transformed.name).toBe('theApp-s1-d1');
109
+ });
110
+
111
+ it('it sets the Advanced Settings correctly when provided', function () {
112
+ var command = {
113
+ stack: 's1',
114
+ freeFormDetails: 'd1',
115
+ application: 'theApp',
116
+ sku: {
117
+ capacity: 1,
118
+ },
119
+ selectedImage: {
120
+ publisher: 'Microsoft',
121
+ offer: 'Windows',
122
+ sku: 'Server2016',
123
+ version: '12.0.0.1',
124
+ },
125
+ selectedVnet: {},
126
+ viewState: {
127
+ mode: 'create',
128
+ },
129
+ osConfig: {
130
+ customData: 'this is custom data',
131
+ },
132
+ customScriptsSettings: {
133
+ fileUris: 'file1',
134
+ commandToExecute: 'do_this',
135
+ },
136
+ };
137
+
138
+ var customScript = {
139
+ fileUris: ['file1'],
140
+ commandToExecute: 'do_this',
141
+ };
142
+
143
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
144
+ expect(transformed.osConfig.customData).toBe('this is custom data');
145
+ expect(transformed.customScriptsSettings).toEqual(customScript);
146
+ });
147
+
148
+ it('it sets the Advanced Settings correctly when not provided', function () {
149
+ var command = {
150
+ stack: 's1',
151
+ freeFormDetails: 'd1',
152
+ application: 'theApp',
153
+ sku: {
154
+ capacity: 1,
155
+ },
156
+ selectedImage: {
157
+ publisher: 'Microsoft',
158
+ offer: 'Windows',
159
+ sku: 'Server2016',
160
+ version: '12.0.0.1',
161
+ },
162
+ selectedVnet: {},
163
+ viewState: {
164
+ mode: 'create',
165
+ },
166
+ };
167
+
168
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
169
+
170
+ expect(transformed.customScriptsSettings).toBeDefined();
171
+ expect(transformed.customScriptsSettings.fileUris).toBeNull();
172
+ expect(transformed.customScriptsSettings.commandToExecute).toBe('');
173
+ });
174
+
175
+ it('it sets the zones information', function () {
176
+ var command = {
177
+ zonesEnabled: true,
178
+ zones: ['1', '3'],
179
+ stack: 's1',
180
+ freeFormDetails: 'd1',
181
+ application: 'theApp',
182
+ sku: {
183
+ capacity: 1,
184
+ },
185
+ selectedImage: {
186
+ publisher: 'Microsoft',
187
+ offer: 'Windows',
188
+ sku: 'Server2016',
189
+ version: '12.0.0.1',
190
+ },
191
+ selectedVnet: {},
192
+ viewState: {
193
+ mode: 'create',
194
+ },
195
+ };
196
+
197
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
198
+
199
+ expect(transformed.zonesEnabled).toEqual(true);
200
+ expect(transformed.zones).toEqual(command.zones);
201
+ });
202
+
203
+ it('it should not set the zones information if zonesEnabled is false', function () {
204
+ var command = {
205
+ zonesEnabled: false,
206
+ zones: ['1', '3'],
207
+ stack: 's1',
208
+ freeFormDetails: 'd1',
209
+ application: 'theApp',
210
+ sku: {
211
+ capacity: 1,
212
+ },
213
+ selectedImage: {
214
+ publisher: 'Microsoft',
215
+ offer: 'Windows',
216
+ sku: 'Server2016',
217
+ version: '12.0.0.1',
218
+ },
219
+ selectedVnet: {},
220
+ viewState: {
221
+ mode: 'create',
222
+ },
223
+ };
224
+
225
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(command);
226
+
227
+ expect(transformed.zonesEnabled).toEqual(false);
228
+ expect(transformed.zones).toEqual([]);
229
+ });
230
+
231
+ it('sets instance tags correctly when provided', function () {
232
+ let imap = new Map();
233
+ var base = {
234
+ application: 'myApp',
235
+ sku: {
236
+ capacity: 1,
237
+ },
238
+ selectedImage: {
239
+ publisher: 'Microsoft',
240
+ offer: 'Windows',
241
+ sku: 'Server2016',
242
+ version: '12.0.0.1',
243
+ },
244
+ selectedVnet: {},
245
+ viewState: {
246
+ mode: 'create',
247
+ },
248
+ instanceTags: imap,
249
+ };
250
+
251
+ var transformed = transformer.convertServerGroupCommandToDeployConfiguration(base);
252
+
253
+ expect(transformed.instanceTags).toBe(imap);
254
+ });
255
+ });
256
+ });
@@ -0,0 +1,28 @@
1
+ <div class="form-group">
2
+ <div class="col-md-{{labelColumns}} sm-label-right">
3
+ VPC Subnet
4
+ <help-field key="{{helpKey}}"></help-field>
5
+ </div>
6
+ <div class="col-md-7" ng-if="!region">(Select an account)</div>
7
+ <div class="col-md-7" ng-if="region">
8
+ <select class="form-control input-sm" ng-model="component[field]" ng-change="onChange()" ng-if="!readOnly">
9
+ <option value="">None (EC2 Classic)</option>
10
+ <option
11
+ ng-repeat="subnet in activeSubnets | orderBy: 'label'"
12
+ value="{{subnet.purpose}}"
13
+ ng-selected="component[field] === subnet.purpose"
14
+ >
15
+ {{subnet.label}}
16
+ </option>
17
+ <option ng-if="activeSubnets.length && deprecatedSubnets.length" disabled>---------------</option>
18
+ <option
19
+ ng-repeat="subnet in deprecatedSubnets | orderBy: 'label'"
20
+ value="{{subnet.purpose}}"
21
+ ng-selected="component[field] === subnet.purpose"
22
+ >
23
+ {{subnet.label}}
24
+ </option>
25
+ </select>
26
+ <p ng-if="readOnly" class="form-control-static">{{component[field]}}</p>
27
+ </div>
28
+ </div>
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ export const AZURE_SUBNET_SUBNETSELECTFIELD_DIRECTIVE = 'spinnaker.azure.subnet.subnetSelectField.directive';
6
+ export const name = AZURE_SUBNET_SUBNETSELECTFIELD_DIRECTIVE; // for backwards compatibility
7
+ module(AZURE_SUBNET_SUBNETSELECTFIELD_DIRECTIVE, []).directive('azureSubnetSelectField', function () {
8
+ return {
9
+ restrict: 'E',
10
+ templateUrl: require('./subnetSelectField.directive.html'),
11
+ scope: {
12
+ subnets: '=',
13
+ component: '=',
14
+ field: '@',
15
+ region: '=',
16
+ onChange: '&',
17
+ labelColumns: '@',
18
+ helpKey: '@',
19
+ readOnly: '=',
20
+ },
21
+ link: function (scope) {
22
+ function setSubnets() {
23
+ const subnets = scope.subnets || [];
24
+ scope.activeSubnets = subnets.filter(function (subnet) {
25
+ return !subnet.deprecated;
26
+ });
27
+ scope.deprecatedSubnets = subnets.filter(function (subnet) {
28
+ return subnet.deprecated;
29
+ });
30
+ }
31
+
32
+ scope.$watch('subnets', setSubnets);
33
+ },
34
+ };
35
+ });
@@ -0,0 +1,61 @@
1
+ import type { ITagResult } from './utility';
2
+ import Utility, { TagError } from './utility';
3
+
4
+ describe('Azure Utility', function () {
5
+ it('returns tag error when null object passed', function () {
6
+ const tags: any = null;
7
+ const result: ITagResult = Utility.checkTags(tags);
8
+ expect(result.isValid).toBeFalsy();
9
+ expect(result.error).toBe(TagError.TAG_OBJECT_UNDEFINED);
10
+ });
11
+
12
+ it('returns tag error when number of tags exceeds limitation', function () {
13
+ const tags: any = {};
14
+ for (let i = 0; i < 13; i++) {
15
+ tags[`key${i}`] = `value${i}`;
16
+ }
17
+ const result: ITagResult = Utility.checkTags(tags);
18
+ expect(result.isValid).toBeFalsy();
19
+ expect(result.error).toBe(TagError.TAG_NUMBER_EXCEED);
20
+ });
21
+
22
+ it('returns tag error when length of key exceeds limitation', function () {
23
+ const tags: any = {};
24
+ tags['abcd'.repeat(128 + 1)] = '1';
25
+ const result: ITagResult = Utility.checkTags(tags);
26
+ expect(result.isValid).toBeFalsy();
27
+ expect(result.error).toBe(TagError.TAG_KEY_LENGTH_EXCEED);
28
+ });
29
+
30
+ it('returns tag error when length of value exceeds limitation', function () {
31
+ const tags: any = {};
32
+ tags['abcd'] = 'abcd'.repeat(64 + 1);
33
+ const result: ITagResult = Utility.checkTags(tags);
34
+ expect(result.isValid).toBeFalsy();
35
+ expect(result.error).toBe(TagError.TAG_VALUE_LENGTH_EXCEED);
36
+ });
37
+
38
+ it('returns tag error when key contains invalid character', function () {
39
+ const tags: any = {};
40
+ tags['abc&def'] = '1';
41
+ const result: ITagResult = Utility.checkTags(tags);
42
+ expect(result.isValid).toBeFalsy();
43
+ expect(result.error).toBe(TagError.TAG_KEY_INVALID_CHARACTER);
44
+ });
45
+
46
+ it('returns tag error when value contains invalid character', function () {
47
+ const tags: any = {};
48
+ tags['abcd'] = 'abc?def';
49
+ const result: ITagResult = Utility.checkTags(tags);
50
+ expect(result.isValid).toBeFalsy();
51
+ expect(result.error).toBe(TagError.TAG_VALUE_INVALID_CHARACTER);
52
+ });
53
+
54
+ it('returns no error when value are valid', function () {
55
+ const tags: any = {};
56
+ tags['abcd'] = 'abcdef';
57
+ const result: ITagResult = Utility.checkTags(tags);
58
+ expect(result.isValid).toBeTruthy();
59
+ expect(result.error).toBeNull();
60
+ });
61
+ });
package/src/utility.ts ADDED
@@ -0,0 +1,95 @@
1
+ export interface ITagResult {
2
+ isValid: boolean;
3
+ error: TagError | null;
4
+ errorMessage?: string;
5
+ }
6
+
7
+ export enum TagError {
8
+ TAG_NUMBER_EXCEED,
9
+ TAG_KEY_LENGTH_EXCEED,
10
+ TAG_VALUE_LENGTH_EXCEED,
11
+ TAG_KEY_INVALID_CHARACTER,
12
+ TAG_VALUE_INVALID_CHARACTER,
13
+ TAG_OBJECT_UNDEFINED,
14
+ }
15
+
16
+ export interface IAzureLoadBalancer {
17
+ type: string;
18
+ description: string;
19
+ }
20
+
21
+ export const AzureLoadBalancerTypes: IAzureLoadBalancer[] = [
22
+ {
23
+ type: 'Azure Load Balancer',
24
+ description: '',
25
+ },
26
+ {
27
+ type: 'Azure Application Gateway',
28
+ description: '',
29
+ },
30
+ ];
31
+
32
+ export default class Utility {
33
+ public static readonly TAG_LIMITATION: number = 8;
34
+ public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512;
35
+ public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256;
36
+ public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\?/]/;
37
+
38
+ public static checkTags(tagsObject: { [s: string]: string }): ITagResult {
39
+ if (!tagsObject) {
40
+ return {
41
+ isValid: false,
42
+ error: TagError.TAG_OBJECT_UNDEFINED,
43
+ errorMessage: 'instanceTags is not defined',
44
+ };
45
+ }
46
+ const length: number = Object.keys(tagsObject).length;
47
+ if (!(length >= 0 && length <= Utility.TAG_LIMITATION)) {
48
+ return {
49
+ isValid: false,
50
+ error: TagError.TAG_NUMBER_EXCEED,
51
+ errorMessage: `Number of tags exceeds the limit: ${Utility.TAG_LIMITATION}`,
52
+ };
53
+ }
54
+
55
+ for (const [k, v] of Object.entries(tagsObject)) {
56
+ if (k.length > Utility.TAG_KEY_LENGTH_LIMITATION) {
57
+ return {
58
+ isValid: false,
59
+ error: TagError.TAG_KEY_LENGTH_EXCEED,
60
+ errorMessage: `Length of Tag key: ${k} exceeds the limit: ${Utility.TAG_KEY_LENGTH_LIMITATION}`,
61
+ };
62
+ }
63
+ if (v.length > Utility.TAG_VALUE_LENGTH_LIMITATION) {
64
+ return {
65
+ isValid: false,
66
+ error: TagError.TAG_VALUE_LENGTH_EXCEED,
67
+ errorMessage: `Length of Tag value: ${v} exceeds the limit: ${Utility.TAG_VALUE_LENGTH_LIMITATION}`,
68
+ };
69
+ }
70
+ if (Utility.TAG_INVALID_CHAR_REG_EXR.test(k)) {
71
+ return {
72
+ isValid: false,
73
+ error: TagError.TAG_KEY_INVALID_CHARACTER,
74
+ errorMessage: `Invalid characters in Tag key: ${k}`,
75
+ };
76
+ }
77
+ if (Utility.TAG_INVALID_CHAR_REG_EXR.test(v)) {
78
+ return {
79
+ isValid: false,
80
+ error: TagError.TAG_VALUE_INVALID_CHARACTER,
81
+ errorMessage: `Invalid characters in Tag value: ${v}`,
82
+ };
83
+ }
84
+ }
85
+ return {
86
+ isValid: true,
87
+ error: null,
88
+ };
89
+ }
90
+
91
+ public static getLoadBalancerType(typeString: string): IAzureLoadBalancer | null {
92
+ typeString = typeString.toLowerCase().split('_').join(' ');
93
+ return AzureLoadBalancerTypes.find((lb: IAzureLoadBalancer) => lb.type.toLowerCase() === typeString) || null;
94
+ }
95
+ }
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+
5
+ import { ApplicationNameValidator } from '@spinnaker/core';
6
+
7
+ export const AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR = 'spinnaker.azure.validation.applicationName';
8
+ export const name = AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR; // for backwards compatibility
9
+ module(AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR, [])
10
+ .factory('azureApplicationNameValidator', function () {
11
+ function validateSpecialCharacters(name, errors) {
12
+ const pattern = /^([a-zA-Z][a-zA-Z0-9]*)?$/;
13
+ if (!pattern.test(name)) {
14
+ errors.push(
15
+ 'The application name must begin with a letter and must contain only letters or digits. No ' +
16
+ 'special characters are allowed.',
17
+ );
18
+ }
19
+ }
20
+
21
+ function validate(name) {
22
+ const warnings = [];
23
+ const errors = [];
24
+
25
+ if (name && name.length) {
26
+ validateSpecialCharacters(name, errors);
27
+ }
28
+
29
+ return {
30
+ warnings: warnings,
31
+ errors: errors,
32
+ };
33
+ }
34
+
35
+ return {
36
+ validate: validate,
37
+ };
38
+ })
39
+ .run([
40
+ 'azureApplicationNameValidator',
41
+ function (azureApplicationNameValidator) {
42
+ ApplicationNameValidator.registerValidator('azure', azureApplicationNameValidator);
43
+ },
44
+ ]);