@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,158 @@
1
+ import React from 'react';
2
+ import { Modal } from 'react-bootstrap';
3
+ import Select from 'react-select';
4
+
5
+ import type { IModalComponentProps } from '@spinnaker/core';
6
+ import {
7
+ ModalClose,
8
+ noop,
9
+ ReactInjector,
10
+ ReactModal,
11
+ TaskMonitor,
12
+ TaskMonitorWrapper,
13
+ TaskReason,
14
+ } from '@spinnaker/core';
15
+
16
+ import { AzureModalFooter } from '../../../common/AzureModalFooter';
17
+
18
+ export interface IAzureRollbackServerGroupModalProps extends IModalComponentProps {
19
+ application: any;
20
+ serverGroup: any;
21
+ disabledServerGroups: any;
22
+ }
23
+
24
+ export interface IAzureRollbackServerGroupModalState {
25
+ taskMonitor: TaskMonitor;
26
+ submitting: boolean;
27
+ command: any;
28
+ }
29
+
30
+ export class AzureRollbackServerGroupModal extends React.Component<
31
+ IAzureRollbackServerGroupModalProps,
32
+ IAzureRollbackServerGroupModalState
33
+ > {
34
+ public static defaultProps: Partial<IAzureRollbackServerGroupModalProps> = {
35
+ closeModal: noop,
36
+ dismissModal: noop,
37
+ };
38
+
39
+ public static show(props: IAzureRollbackServerGroupModalProps) {
40
+ const modalProps = {};
41
+ return ReactModal.show(AzureRollbackServerGroupModal, props, modalProps);
42
+ }
43
+
44
+ constructor(props: IAzureRollbackServerGroupModalProps) {
45
+ super(props);
46
+
47
+ const { application, serverGroup } = props;
48
+
49
+ this.state = {
50
+ taskMonitor: new TaskMonitor({
51
+ application: application,
52
+ title: 'Rolling back your server group',
53
+ modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),
54
+ }),
55
+ submitting: true,
56
+ command: {
57
+ interestingHealthProviderNames: [],
58
+ rollbackType: 'EXPLICIT',
59
+ rollbackContext: {
60
+ rollbackServerGroupName: serverGroup.name,
61
+ enableAndDisableOnly: true,
62
+ },
63
+ },
64
+ };
65
+ }
66
+
67
+ private close = (args?: any) => {
68
+ this.props.dismissModal.apply(null, args);
69
+ };
70
+
71
+ private submit = () => {
72
+ const { command, taskMonitor } = this.state;
73
+ const { serverGroup, application } = this.props;
74
+
75
+ taskMonitor.submit(() => {
76
+ return ReactInjector.serverGroupWriter.rollbackServerGroup(serverGroup, application, command);
77
+ });
78
+ };
79
+
80
+ private filterServerGroups = (disabledServerGroups: any) => {
81
+ const filteredDisabledServerGroups = disabledServerGroups
82
+ .filter((disabledServerGroup: any) => disabledServerGroup.instanceCounts.total !== 0)
83
+ .sort((a: any, b: any) => b.name.localeCompare(a.name));
84
+
85
+ return filteredDisabledServerGroups;
86
+ };
87
+
88
+ private isValid = () => {
89
+ const restoreServerGroupName = this.state.command.rollbackContext.restoreServerGroupName;
90
+ return restoreServerGroupName !== undefined;
91
+ };
92
+
93
+ private handleServerGroupChange = (restoreServerGroupOption: any) => {
94
+ const { disabledServerGroups } = this.props;
95
+ const newCommand = { ...this.state.command };
96
+ newCommand.rollbackContext.restoreServerGroupName = restoreServerGroupOption.value;
97
+ const restoreServerGroup = this.filterServerGroups(disabledServerGroups).find(function (disabledServerGroup: any) {
98
+ return disabledServerGroup.name === restoreServerGroupOption.value;
99
+ });
100
+ newCommand.targetSize = restoreServerGroup.capacity.max;
101
+ this.setState({
102
+ command: newCommand,
103
+ });
104
+ };
105
+
106
+ private handleTaskReasonChange = (taskReason?: any) => {
107
+ const newCommand = { ...this.state.command };
108
+ newCommand.reason = taskReason;
109
+ this.setState({
110
+ command: newCommand,
111
+ });
112
+ };
113
+
114
+ public render() {
115
+ const { command, taskMonitor, submitting } = this.state;
116
+ const { serverGroup, disabledServerGroups } = this.props;
117
+ const isValidSG = this.isValid();
118
+ const disabledServerGroupOptions = this.filterServerGroups(disabledServerGroups).map(
119
+ (disabledServerGroup: any) => ({
120
+ label: disabledServerGroup.name,
121
+ value: disabledServerGroup.name,
122
+ }),
123
+ );
124
+
125
+ return (
126
+ <Modal onHide={this.close}>
127
+ <TaskMonitorWrapper monitor={taskMonitor} />
128
+ {submitting && (
129
+ <form role="form">
130
+ <ModalClose dismiss={this.close} />
131
+ <Modal.Header>
132
+ <Modal.Title>Rollback {serverGroup.name}</Modal.Title>
133
+ </Modal.Header>
134
+ <Modal.Body>
135
+ <div className="row">
136
+ <div className="col-sm-3 sm-label-right">Restore to</div>
137
+ <div className="col-sm-6">
138
+ <Select
139
+ value={command.rollbackContext.restoreServerGroupName}
140
+ onChange={this.handleServerGroupChange}
141
+ options={disabledServerGroupOptions}
142
+ />
143
+ </div>
144
+ </div>
145
+ <TaskReason reason={command.taskReason} onChange={this.handleTaskReasonChange} />
146
+ </Modal.Body>
147
+ <AzureModalFooter
148
+ onSubmit={this.submit}
149
+ onCancel={this.close}
150
+ isValid={isValidSG}
151
+ account={serverGroup.account}
152
+ />
153
+ </form>
154
+ )}
155
+ </Modal>
156
+ );
157
+ }
158
+ }
@@ -0,0 +1,11 @@
1
+ import { module } from 'angular';
2
+
3
+ import { AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER } from './serverGroupDetails.azure.controller';
4
+
5
+ ('use strict');
6
+
7
+ export const AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE = 'spinnaker.azure.serverGroup.details.azure';
8
+ export const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE; // for backwards compatibility
9
+ module(AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE, [
10
+ AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER,
11
+ ]);
@@ -0,0 +1,260 @@
1
+ 'use strict';
2
+
3
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
4
+ import * as angular from 'angular';
5
+ import _ from 'lodash';
6
+
7
+ import {
8
+ ConfirmationModalService,
9
+ FirewallLabels,
10
+ SERVER_GROUP_WRITER,
11
+ ServerGroupReader,
12
+ ServerGroupWarningMessageService,
13
+ } from '@spinnaker/core';
14
+
15
+ import '../configure/serverGroup.configure.azure.module';
16
+ import { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';
17
+ import { AzureRollbackServerGroupModal } from './rollback/RollbackServerGroupModal';
18
+
19
+ export const AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER =
20
+ 'spinnaker.azure.serverGroup.details.controller';
21
+ export const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER; // for backwards compatibility
22
+ angular
23
+ .module(AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER, [
24
+ UIROUTER_ANGULARJS,
25
+ AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,
26
+ SERVER_GROUP_WRITER,
27
+ ])
28
+ .controller('azureServerGroupDetailsCtrl', [
29
+ '$scope',
30
+ '$state',
31
+ '$templateCache',
32
+ 'app',
33
+ 'serverGroup',
34
+ 'azureServerGroupCommandBuilder',
35
+ '$uibModal',
36
+ 'serverGroupWriter',
37
+ function (
38
+ $scope,
39
+ $state,
40
+ $templateCache,
41
+ app,
42
+ serverGroup,
43
+ azureServerGroupCommandBuilder,
44
+ $uibModal,
45
+ serverGroupWriter,
46
+ ) {
47
+ $scope.state = {
48
+ loading: true,
49
+ };
50
+
51
+ $scope.firewallsLabel = FirewallLabels.get('Firewalls');
52
+
53
+ this.application = app;
54
+
55
+ function extractServerGroupSummary() {
56
+ let summary = _.find(app.serverGroups.data, function (toCheck) {
57
+ return (
58
+ toCheck.name === serverGroup.name &&
59
+ toCheck.account === serverGroup.accountId &&
60
+ toCheck.region === serverGroup.region
61
+ );
62
+ });
63
+ if (!summary) {
64
+ app.loadBalancers.data.some(function (loadBalancer) {
65
+ if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {
66
+ return loadBalancer.serverGroups.some(function (possibleServerGroup) {
67
+ if (possibleServerGroup.name === serverGroup.name) {
68
+ summary = possibleServerGroup;
69
+ return true;
70
+ }
71
+ });
72
+ }
73
+ });
74
+ }
75
+ if (!summary) {
76
+ $state.go('^');
77
+ }
78
+ return summary;
79
+ }
80
+
81
+ function retrieveServerGroup() {
82
+ const summary = extractServerGroupSummary();
83
+ return ServerGroupReader.getServerGroup(
84
+ app.name,
85
+ serverGroup.accountId,
86
+ serverGroup.region,
87
+ serverGroup.name,
88
+ ).then(function (details) {
89
+ cancelLoader();
90
+
91
+ angular.extend(details, summary);
92
+ details.account = serverGroup.accountId; // it's possible the summary was not found because the clusters are still loading
93
+
94
+ $scope.serverGroup = details;
95
+
96
+ if (!_.isEmpty($scope.serverGroup)) {
97
+ $scope.image = details.image ? details.image : undefined;
98
+
99
+ if (details.image && details.image.description) {
100
+ const tags = details.image.description.split(', ');
101
+ tags.forEach(function (tag) {
102
+ const keyVal = tag.split('=');
103
+ if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {
104
+ details.image.baseImage = keyVal[1];
105
+ }
106
+ });
107
+ }
108
+
109
+ if (details.launchConfig && details.launchConfig.securityGroups) {
110
+ $scope.securityGroups = _.chain(details.launchConfig.securityGroups)
111
+ .map(function (id) {
112
+ return (
113
+ _.find(app.securityGroups.data, {
114
+ accountName: serverGroup.accountId,
115
+ region: serverGroup.region,
116
+ id: id,
117
+ }) ||
118
+ _.find(app.securityGroups.data, {
119
+ accountName: serverGroup.accountId,
120
+ region: serverGroup.region,
121
+ name: id,
122
+ })
123
+ );
124
+ })
125
+ .compact()
126
+ .value();
127
+ }
128
+ } else {
129
+ $state.go('^');
130
+ }
131
+ });
132
+ }
133
+
134
+ function cancelLoader() {
135
+ $scope.state.loading = false;
136
+ }
137
+
138
+ retrieveServerGroup().then(() => {
139
+ // If the user navigates away from the view before the initial retrieveServerGroup call completes,
140
+ // do not bother subscribing to the refresh
141
+ if (!$scope.$$destroyed) {
142
+ app.serverGroups.onRefresh($scope, retrieveServerGroup);
143
+ }
144
+ });
145
+
146
+ this.destroyServerGroup = function destroyServerGroup() {
147
+ const serverGroup = $scope.serverGroup;
148
+
149
+ const stateParams = {
150
+ name: serverGroup.name,
151
+ accountId: serverGroup.account,
152
+ region: serverGroup.region,
153
+ };
154
+
155
+ const taskMonitor = {
156
+ application: app,
157
+ title: 'Destroying ' + serverGroup.name,
158
+ onTaskComplete: function () {
159
+ if ($state.includes('**.serverGroup', stateParams)) {
160
+ $state.go('^');
161
+ }
162
+ },
163
+ };
164
+
165
+ const submitMethod = function () {
166
+ return serverGroupWriter.destroyServerGroup(serverGroup, app);
167
+ };
168
+
169
+ const confirmationModalParams = {
170
+ header: 'Really destroy ' + serverGroup.name + '?',
171
+ buttonText: 'Destroy ' + serverGroup.name,
172
+ account: serverGroup.account,
173
+ taskMonitorConfig: taskMonitor,
174
+ submitMethod: submitMethod,
175
+ };
176
+
177
+ ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);
178
+
179
+ ConfirmationModalService.confirm(confirmationModalParams);
180
+ };
181
+
182
+ this.disableServerGroup = function disableServerGroup() {
183
+ const serverGroup = $scope.serverGroup;
184
+
185
+ const taskMonitor = {
186
+ application: app,
187
+ title: 'Disabling ' + serverGroup.name,
188
+ };
189
+
190
+ const submitMethod = () => serverGroupWriter.disableServerGroup(serverGroup, app);
191
+
192
+ const confirmationModalParams = {
193
+ header: 'Really disable ' + serverGroup.name + '?',
194
+ buttonText: 'Disable ' + serverGroup.name,
195
+ account: serverGroup.account,
196
+ taskMonitorConfig: taskMonitor,
197
+ submitMethod: submitMethod,
198
+ };
199
+
200
+ ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);
201
+
202
+ ConfirmationModalService.confirm(confirmationModalParams);
203
+ };
204
+
205
+ this.enableServerGroup = function enableServerGroup() {
206
+ const serverGroup = $scope.serverGroup;
207
+
208
+ const taskMonitor = {
209
+ application: app,
210
+ title: 'Enabling ' + serverGroup.name,
211
+ };
212
+
213
+ const submitMethod = (params) => {
214
+ return serverGroupWriter.enableServerGroup(
215
+ serverGroup,
216
+ app,
217
+ angular.extend(params, {
218
+ interestingHealthProviderNames: [], // bypass the check for now; will change this later to ['azureService']
219
+ }),
220
+ );
221
+ };
222
+
223
+ ConfirmationModalService.confirm({
224
+ header: 'Really enable ' + serverGroup.name + '?',
225
+ buttonText: 'Enable ' + serverGroup.name,
226
+ account: serverGroup.account,
227
+ taskMonitorConfig: taskMonitor,
228
+ submitMethod: submitMethod,
229
+ });
230
+ };
231
+
232
+ this.rollbackServerGroup = () => {
233
+ const serverGroup = $scope.serverGroup;
234
+ const cluster = _.find(app.clusters, { name: serverGroup.cluster, account: serverGroup.account });
235
+ const disabledServerGroups = _.filter(cluster.serverGroups, { isDisabled: true, region: serverGroup.region });
236
+ AzureRollbackServerGroupModal.show({ application: app, serverGroup, disabledServerGroups });
237
+ };
238
+
239
+ this.cloneServerGroup = (serverGroup) => {
240
+ $uibModal.open({
241
+ templateUrl: require('../configure/wizard/serverGroupWizard.html'),
242
+ controller: 'azureCloneServerGroupCtrl as ctrl',
243
+ size: 'lg',
244
+ resolve: {
245
+ title: () => 'Clone ' + serverGroup.name,
246
+ application: () => app,
247
+ serverGroupCommand: () =>
248
+ azureServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),
249
+ },
250
+ });
251
+ };
252
+
253
+ this.truncateCommitHash = function () {
254
+ if ($scope.serverGroup && $scope.serverGroup.buildInfo && $scope.serverGroup.buildInfo.commit) {
255
+ return $scope.serverGroup.buildInfo.commit.substring(0, 8);
256
+ }
257
+ return null;
258
+ };
259
+ },
260
+ ]);
@@ -0,0 +1,98 @@
1
+ <div class="details-panel" ng-class="{ disabled: serverGroup.isDisabled }">
2
+ <div class="header" ng-if="state.loading">
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 class="horizontal center middle">
9
+ <loading-spinner size="'small'"></loading-spinner>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="header" ng-if="!state.loading">
14
+ <div class="close-button">
15
+ <a class="btn btn-link" ui-sref="^">
16
+ <span class="glyphicon glyphicon-remove"></span>
17
+ </a>
18
+ </div>
19
+ <div class="header-text horizontal middle">
20
+ <span class="glyphicon glyphicon-th"></span>
21
+ <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{serverGroup.name}}</h3>
22
+ </div>
23
+ <div class="actions" ng-class="{ insights: serverGroup.insightActions.length > 0 }">
24
+ <div class="dropdown" uib-dropdown dropdown-append-to-body>
25
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>
26
+ Server Group Actions <span class="caret"></span>
27
+ </button>
28
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
29
+ <li><a href ng-if="!serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>
30
+ <div ng-if="false">
31
+ <li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>
32
+ </div>
33
+ <li><a href ng-click="ctrl.disableServerGroup()">Disable</a></li>
34
+ <li><a href ng-click="ctrl.enableServerGroup()">Enable</a></li>
35
+ <li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>
36
+ <li><a href ng-click="ctrl.cloneServerGroup(serverGroup)">Clone</a></li>
37
+ </ul>
38
+ </div>
39
+ <div class="dropdown" ng-if="serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>
40
+ <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>
41
+ Insight <span class="caret"></span>
42
+ </button>
43
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
44
+ <li ng-repeat="action in serverGroup.insightActions">
45
+ <a target="_blank" href="{{action.url}}">{{action.label}}</a>
46
+ </li>
47
+ </ul>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ <div class="content" ng-if="!state.loading">
52
+ <h4 class="text-center" ng-if="serverGroup.isDisabled">[SERVER GROUP IS DISABLED]</h4>
53
+
54
+ <server-group-running-tasks-details
55
+ server-group="serverGroup"
56
+ application="ctrl.application"
57
+ ></server-group-running-tasks-details>
58
+
59
+ <collapsible-section heading="Server Group Information" expanded="true">
60
+ <dl class="dl-horizontal dl-narrow">
61
+ <dt>Created</dt>
62
+ <dd>{{serverGroup.createdTime | timestamp}}</dd>
63
+ <dt>Region</dt>
64
+ <dd>
65
+ <account-tag account="serverGroup.account" provider="serverGroup.type" pad="right"></account-tag>
66
+ {{serverGroup.region}}
67
+ </dd>
68
+ <dt>Image</dt>
69
+ <dd>{{serverGroup.image.imageName}}</dd>
70
+ <dt>SKU</dt>
71
+ <dd>{{serverGroup.sku.name}}</dd>
72
+ </dl>
73
+ </collapsible-section>
74
+
75
+ <collapsible-section heading="Size" expanded="true">
76
+ <dl class="dl-horizontal dl-narrow">
77
+ <dt>Current</dt>
78
+ <dd>{{serverGroup.instances.length}}</dd>
79
+ </dl>
80
+ </collapsible-section>
81
+
82
+ <collapsible-section heading="Health" expanded="true">
83
+ <dl class="dl-horizontal dl-narrow" ng-if="serverGroup">
84
+ <dt>Instances</dt>
85
+ <dd>
86
+ <health-counts container="serverGroup.instanceCounts" class="pull-left"></health-counts>
87
+ </dd>
88
+ </dl>
89
+ </collapsible-section>
90
+
91
+ <collapsible-section heading="{{firewallsLabel}}">
92
+ <dl class="dl-horizontal dl-narrow">
93
+ <dt>Name</dt>
94
+ <dd>{{serverGroup.securityGroupName}}</dd>
95
+ </dl>
96
+ </collapsible-section>
97
+ </div>
98
+ </div>
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ import { module } from 'angular';
4
+ import _ from 'lodash';
5
+
6
+ export const AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.azure.serverGroup.transformer';
7
+ export const name = AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility
8
+ module(AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('azureServerGroupTransformer', function () {
9
+ function normalizeServerGroup(serverGroup) {
10
+ return serverGroup;
11
+ }
12
+
13
+ function parseCustomScriptsSettings(command, configuration) {
14
+ /*
15
+ At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following
16
+ occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios
17
+ to assign the correct value to model.
18
+ */
19
+ if (Array.isArray(command.customScriptsSettings.fileUris)) {
20
+ configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris;
21
+ } else {
22
+ const fileUrisTemp = command.customScriptsSettings.fileUris;
23
+ if (fileUrisTemp.includes(',')) {
24
+ configuration.customScriptsSettings.fileUris = fileUrisTemp.split(',');
25
+ } else if (fileUrisTemp.includes(';')) {
26
+ configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';');
27
+ } else {
28
+ configuration.customScriptsSettings.fileUris = [fileUrisTemp];
29
+ }
30
+
31
+ configuration.customScriptsSettings.fileUris.forEach(function (v, index) {
32
+ configuration.customScriptsSettings.fileUris[index] = v.trim();
33
+ });
34
+ }
35
+ }
36
+
37
+ function convertServerGroupCommandToDeployConfiguration(command) {
38
+ let tempImage;
39
+
40
+ if (command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline') {
41
+ tempImage = {
42
+ imageName: '',
43
+ isCustom: 'true',
44
+ publisher: '',
45
+ offer: '',
46
+ sku: '',
47
+ version: '',
48
+ region: command.region,
49
+ uri: '',
50
+ ostype: '',
51
+ };
52
+ } else {
53
+ tempImage = command.selectedImage;
54
+ }
55
+
56
+ const configuration = {
57
+ name: command.application,
58
+ cloudProvider: command.selectedProvider,
59
+ application: command.application,
60
+ stack: command.stack,
61
+ strategy: command.strategy,
62
+ rollback: {
63
+ onFailure: command.rollback ? command.rollback.onFailure : null,
64
+ },
65
+ scaleDown: command.scaleDown,
66
+ maxRemainingAsgs: command.maxRemainingAsgs,
67
+ delayBeforeDisableSec: command.delayBeforeDisableSec,
68
+ delayBeforeScaleDownSec: command.delayBeforeScaleDownSec,
69
+ allowDeleteActive: command.strategy === 'redblack' ? true : null,
70
+ allowScaleDownActive: command.strategy === 'redblack' ? true : null,
71
+ detail: command.freeFormDetails,
72
+ freeFormDetails: command.freeFormDetails,
73
+ healthSettings: command.healthSettings,
74
+ image: command.image,
75
+ account: command.credentials,
76
+ selectedProvider: 'azure',
77
+ vnet: command.vnet,
78
+ vnetResourceGroup: command.selectedVnet.resourceGroup,
79
+ subnet: command.subnet,
80
+ useSourceCapacity: false,
81
+ capacity: {
82
+ min: command.sku.capacity,
83
+ max: command.sku.capacity,
84
+ },
85
+ credentials: command.credentials,
86
+ region: command.region,
87
+ securityGroupName: command.securityGroupName,
88
+ loadBalancerName: command.loadBalancerName,
89
+ loadBalancerType: command.loadBalancerType,
90
+ user: '[anonymous]',
91
+ upgradePolicy: 'Manual',
92
+ type: 'createServerGroup',
93
+ sku: {
94
+ name: 'Standard_DS1_v2',
95
+ tier: 'Standard',
96
+ capacity: command.sku.capacity,
97
+ },
98
+ instanceTags: command.instanceTags,
99
+ dataDisks: command.dataDisks,
100
+ userAssignedIdentities: command.userAssignedIdentities,
101
+ viewState: command.viewState,
102
+ osConfig: {
103
+ customData: command.osConfig ? command.osConfig.customData : null,
104
+ },
105
+ customScriptsSettings: {
106
+ fileUris: null,
107
+ commandToExecute: '',
108
+ },
109
+ zonesEnabled: command.zonesEnabled,
110
+ zones: command.zonesEnabled ? command.zones : [],
111
+ enableInboundNAT: command.enableInboundNAT,
112
+ };
113
+
114
+ if (command.image == null || command.image.isCustom == false) {
115
+ configuration.image = tempImage;
116
+ }
117
+
118
+ if (typeof command.stack !== 'undefined') {
119
+ configuration.name = configuration.name + '-' + command.stack;
120
+ }
121
+ if (typeof command.freeFormDetails !== 'undefined') {
122
+ configuration.name = configuration.name + '-' + command.freeFormDetails;
123
+ }
124
+
125
+ if (typeof command.customScriptsSettings !== 'undefined') {
126
+ configuration.customScriptsSettings.commandToExecute = command.customScriptsSettings.commandToExecute;
127
+ if (!_.isEmpty(command.customScriptsSettings.fileUris)) {
128
+ parseCustomScriptsSettings(command, configuration);
129
+ }
130
+ }
131
+
132
+ if (command.instanceType) {
133
+ const vmsku = command.instanceType;
134
+ configuration.instanceType = command.instanceType;
135
+ configuration.sku.name = vmsku;
136
+ configuration.sku.tier = vmsku.substring(0, vmsku.indexOf('_'));
137
+ }
138
+
139
+ // Default to an empty list of health provider names for now.
140
+ configuration.interestingHealthProviderNames = [];
141
+
142
+ return configuration;
143
+ }
144
+
145
+ return {
146
+ convertServerGroupCommandToDeployConfiguration: convertServerGroupCommandToDeployConfiguration,
147
+ normalizeServerGroup: normalizeServerGroup,
148
+ parseCustomScriptsSettings: parseCustomScriptsSettings,
149
+ };
150
+ });