@spinnaker/oracle 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 (117) hide show
  1. package/CHANGELOG.md +868 -0
  2. package/LICENSE.txt +203 -0
  3. package/dist/common/footer.component.d.ts +2 -0
  4. package/dist/domain/IOracleLoadBalancer.d.ts +114 -0
  5. package/dist/helpContents/oracleHelpContents.d.ts +1 -0
  6. package/dist/image/image.reader.d.ts +2 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +3634 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/instance/details/instance.details.controller.d.ts +2 -0
  11. package/dist/loadBalancer/configure/createLoadBalancer.controller.d.ts +87 -0
  12. package/dist/loadBalancer/details/loadBalancerDetail.controller.d.ts +21 -0
  13. package/dist/loadBalancer/loadBalancer.transformer.d.ts +12 -0
  14. package/dist/oracle.module.d.ts +2 -0
  15. package/dist/oracle.settings.d.ts +15 -0
  16. package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +2 -0
  17. package/dist/pipeline/stages/bake/ociBakeStage.d.ts +2 -0
  18. package/dist/pipeline/stages/destroyAsg/destroyAsgStage.d.ts +2 -0
  19. package/dist/pipeline/stages/disableAsg/disableAsgStage.d.ts +2 -0
  20. package/dist/pipeline/stages/findAmi/findAmiStage.d.ts +2 -0
  21. package/dist/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.d.ts +2 -0
  22. package/dist/pipeline/stages/resizeAsg/resizeAsgStage.d.ts +2 -0
  23. package/dist/pipeline/stages/scaleDownCluster/scaleDownClusterStage.d.ts +2 -0
  24. package/dist/pipeline/stages/shrinkCluster/shrinkClusterStage.d.ts +2 -0
  25. package/dist/securityGroup/configure/createSecurityGroup.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/serverGroup/configure/serverGroup.configure.module.d.ts +2 -0
  29. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +2 -0
  30. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +2 -0
  31. package/dist/serverGroup/configure/wizard/basicSettings/basicSettings.controller.d.ts +2 -0
  32. package/dist/serverGroup/configure/wizard/capacity/capacitySelector.component.d.ts +2 -0
  33. package/dist/serverGroup/configure/wizard/cloneServerGroup.controller.d.ts +2 -0
  34. package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +2 -0
  35. package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +2 -0
  36. package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +2 -0
  37. package/dist/serverGroup/details/serverGroupDetails.controller.d.ts +2 -0
  38. package/dist/serverGroup/serverGroup.transformer.d.ts +2 -0
  39. package/package.json +38 -0
  40. package/src/common/footer.component.html +7 -0
  41. package/src/common/footer.component.js +18 -0
  42. package/src/common/ocid/ocid.component.js +15 -0
  43. package/src/common/ocid/ocid.template.html +10 -0
  44. package/src/common/ocid/truncateOcid.filter.js +14 -0
  45. package/src/domain/IOracleLoadBalancer.ts +110 -0
  46. package/src/helpContents/oracleHelpContents.ts +52 -0
  47. package/src/image/image.reader.js +38 -0
  48. package/src/index.ts +1 -0
  49. package/src/instance/details/instance.details.controller.js +56 -0
  50. package/src/instance/details/instanceDetails.html +31 -0
  51. package/src/loadBalancer/configure/backendSets.html +67 -0
  52. package/src/loadBalancer/configure/certificates.html +63 -0
  53. package/src/loadBalancer/configure/createLoadBalancer.controller.spec.ts +201 -0
  54. package/src/loadBalancer/configure/createLoadBalancer.controller.ts +540 -0
  55. package/src/loadBalancer/configure/createLoadBalancer.html +25 -0
  56. package/src/loadBalancer/configure/createLoadBalancerProperties.html +167 -0
  57. package/src/loadBalancer/configure/editLoadBalancer.html +26 -0
  58. package/src/loadBalancer/configure/listeners.html +88 -0
  59. package/src/loadBalancer/details/loadBalancerDetail.controller.spec.ts +62 -0
  60. package/src/loadBalancer/details/loadBalancerDetail.controller.ts +163 -0
  61. package/src/loadBalancer/details/loadBalancerDetail.html +100 -0
  62. package/src/loadBalancer/loadBalancer.transformer.ts +144 -0
  63. package/src/oracle.module.ts +94 -0
  64. package/src/oracle.settings.ts +19 -0
  65. package/src/pipeline/disableAsg/disableAsgStage.html +11 -0
  66. package/src/pipeline/disableAsg/disableAsgStage.js +62 -0
  67. package/src/pipeline/disableAsg/disableAsgStepLabel.html +1 -0
  68. package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +38 -0
  69. package/src/pipeline/stages/bake/bakeExecutionDetails.html +52 -0
  70. package/src/pipeline/stages/bake/bakeStage.html +109 -0
  71. package/src/pipeline/stages/bake/ociBakeStage.js +147 -0
  72. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +9 -0
  73. package/src/pipeline/stages/destroyAsg/destroyAsgStage.js +64 -0
  74. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
  75. package/src/pipeline/stages/disableAsg/disableAsgStage.html +11 -0
  76. package/src/pipeline/stages/disableAsg/disableAsgStage.js +63 -0
  77. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
  78. package/src/pipeline/stages/findAmi/findAmiStage.html +20 -0
  79. package/src/pipeline/stages/findAmi/findAmiStage.js +82 -0
  80. package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +44 -0
  81. package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +11 -0
  82. package/src/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.js +36 -0
  83. package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +89 -0
  84. package/src/pipeline/stages/resizeAsg/resizeAsgStage.js +101 -0
  85. package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +1 -0
  86. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +35 -0
  87. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.js +75 -0
  88. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +34 -0
  89. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.js +71 -0
  90. package/src/securityGroup/configure/createSecurityGroup.controller.js +19 -0
  91. package/src/securityGroup/configure/createSecurityGroup.html +19 -0
  92. package/src/securityGroup/securityGroup.reader.js +15 -0
  93. package/src/securityGroup/securityGroup.transformer.js +25 -0
  94. package/src/serverGroup/configure/serverGroup.configure.module.js +15 -0
  95. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +105 -0
  96. package/src/serverGroup/configure/serverGroupConfiguration.service.js +229 -0
  97. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +13 -0
  98. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.controller.js +35 -0
  99. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.html +134 -0
  100. package/src/serverGroup/configure/wizard/capacity/capacity.html +7 -0
  101. package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.html +13 -0
  102. package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.js +17 -0
  103. package/src/serverGroup/configure/wizard/cloneServerGroup.controller.js +109 -0
  104. package/src/serverGroup/configure/wizard/instanceType/instanceType.html +29 -0
  105. package/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html +44 -0
  106. package/src/serverGroup/configure/wizard/network/networkSettings.html +15 -0
  107. package/src/serverGroup/configure/wizard/serverGroupWizard.html +40 -0
  108. package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +9 -0
  109. package/src/serverGroup/details/resize/resizeCapacity.component.html +36 -0
  110. package/src/serverGroup/details/resize/resizeCapacity.component.js +42 -0
  111. package/src/serverGroup/details/resize/resizeServerGroup.controller.js +62 -0
  112. package/src/serverGroup/details/resize/resizeServerGroup.html +33 -0
  113. package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +73 -0
  114. package/src/serverGroup/details/rollback/rollbackServerGroup.html +41 -0
  115. package/src/serverGroup/details/serverGroupDetails.controller.js +230 -0
  116. package/src/serverGroup/details/serverGroupDetails.html +94 -0
  117. package/src/serverGroup/serverGroup.transformer.js +29 -0
@@ -0,0 +1,167 @@
1
+ <div>
2
+ <div ng-if="!state.accountsLoaded" style="height: 200px" class="horizontal center middle">
3
+ <loading-spinner size="'small'"></loading-spinner>
4
+ </div>
5
+ <div class="modal-body" ng-if="state.accountsLoaded">
6
+ <div class="form-group">
7
+ <div
8
+ class="col-md-12 well"
9
+ ng-class="{'alert-danger': form.loadBalancerName.$error.validateUnique, 'alert-info': !form.loadBalancerName.$error.validateUnique}"
10
+ >
11
+ <strong>Your load balancer will be named:</strong>
12
+ <span>{{loadBalancerCmd.name}}</span>
13
+ <!-- Angular does not seem to run length validation on hidden inputs, hence the text + display:none -->
14
+ <input
15
+ type="text"
16
+ style="display: none"
17
+ ng-maxlength="32"
18
+ class="form-control input-sm"
19
+ ng-model="loadBalancerCmd.name"
20
+ validate-unique="existingLoadBalancerNames"
21
+ validate-ignore-case="true"
22
+ name="loadBalancerName"
23
+ />
24
+ <validation-error
25
+ ng-if="form.loadBalancerName.$error.validateUnique"
26
+ message="There is already a load balancer in {{loadBalancerCmd.credentials}}:{{loadBalancerCmd.region}} with that name."
27
+ ></validation-error>
28
+ </div>
29
+ </div>
30
+ <div class="form-group">
31
+ <div class="col-md-3 sm-label-right">Shape</div>
32
+ <div class="col-md-7">
33
+ <ui-select class="form-control input-sm" required ng-model="loadBalancerCmd.shape">
34
+ <ui-select-match placeholder="Select Shape">{{$select.selected}}</ui-select-match>
35
+ <ui-select-choices repeat="shape in ctrl.shapes | filter: $select.search">
36
+ <span ng-bind-html="shape | highlight: $select.search"></span>
37
+ </ui-select-choices>
38
+ </ui-select>
39
+ <!-- <select class="form-control input-sm" ng-model="loadBalancer.shape" required ng-options="shape for shapes in shapes"></select> -->
40
+ </div>
41
+ </div>
42
+ <div class="form-group">
43
+ <div class="col-md-3 sm-label-right">Private Load Balancer</div>
44
+ <div class="col-md-7 checkbox">
45
+ <label>
46
+ <input
47
+ type="checkbox"
48
+ name="isPrivate"
49
+ ng-model="loadBalancerCmd.isPrivate"
50
+ on-change="ctrl.isPrivateChanged()"
51
+ />
52
+ </label>
53
+ </div>
54
+ </div>
55
+ <div class="form-group">
56
+ <div class="col-md-3 sm-label-right">Account</div>
57
+ <div class="col-md-7">
58
+ <account-select-field
59
+ required
60
+ component="loadBalancerCmd"
61
+ field="credentials"
62
+ accounts="accounts"
63
+ provider="'oracle'"
64
+ on-change="ctrl.accountUpdated()"
65
+ ></account-select-field>
66
+ </div>
67
+ </div>
68
+ <region-select-field
69
+ required
70
+ label-columns="3"
71
+ component="loadBalancerCmd"
72
+ field="region"
73
+ account="loadBalancerCmd.credentials"
74
+ provider="'oracle'"
75
+ on-change="ctrl.regionUpdated()"
76
+ regions="regions"
77
+ ></region-select-field>
78
+
79
+ <div class="form-group">
80
+ <div class="col-md-3 sm-label-right">Virtual Network</div>
81
+ <div class="col-md-7">
82
+ <ui-select
83
+ class="form-control input-sm"
84
+ required
85
+ ng-model="ctrl.selectedVnet"
86
+ on-select="ctrl.selectedVnetChanged($item)"
87
+ >
88
+ <ui-select-match placeholder="Select from existing virtual networks"
89
+ >{{$select.selected.name}}</ui-select-match
90
+ >
91
+ <ui-select-choices repeat="vnet in ctrl.filteredVnets | filter: $select.search">
92
+ <span ng-bind-html="vnet.name | highlight: $select.search"></span>
93
+ </ui-select-choices>
94
+ </ui-select>
95
+ </div>
96
+ </div>
97
+
98
+ <div class="form-group">
99
+ <div class="col-md-3 sm-label-right">Subnets</div>
100
+ <div class="col-md-7">
101
+ <ui-select
102
+ multiple
103
+ required
104
+ limit="2"
105
+ name="subnets"
106
+ class="form-control input-sm"
107
+ ng-model="ctrl.selectedSubnets"
108
+ on-select="ctrl.selectedSubnetsChanged($item)"
109
+ on-remove="ctrl.selectedSubnetRemoved()"
110
+ >
111
+ <ui-select-match placeholder="Select from existing subnets">{{$item.name}}</ui-select-match>
112
+ <ui-select-choices repeat="subnet in ctrl.filteredSubnetsByType | filter: $select.search">
113
+ <span ng-bind-html="subnet.name | highlight: $select.search"></span>
114
+ </ui-select-choices>
115
+ </ui-select>
116
+ </div>
117
+ </div>
118
+ <div ng-if="ctrl.filteredSubnetsByType.length > 0">
119
+ <div class="col-md-7 col-md-offset-3" ng-if="loadBalancerCmd.isPrivate && ctrl.selectedSubnets.length != 1">
120
+ <validation-error message="Exactly one subnet must be selected for a private load balancer."></validation-error>
121
+ </div>
122
+ <div
123
+ class="col-md-7 col-md-offset-3"
124
+ ng-if="!loadBalancerCmd.isPrivate && ctrl.selectedSubnets.length === 1 && ctrl.selectedSubnets[0].availabilityDomain"
125
+ >
126
+ <validation-error
127
+ message="Exactly 2 Availability Domain-specific subnets must be selected for a public load balancer."
128
+ ></validation-error>
129
+ </div>
130
+ </div>
131
+ <div class="form-group">
132
+ <div class="col-md-3 sm-label-right">Stack <help-field key="oracle.loadBalancer.stack"></help-field></div>
133
+ <div class="col-md-3">
134
+ <input
135
+ type="text"
136
+ class="form-control input-sm"
137
+ ng-model="loadBalancerCmd.stack"
138
+ name="stackName"
139
+ ng-change="ctrl.updateName()"
140
+ ng-pattern="/^[a-zA-Z0-9]*$/"
141
+ />
142
+ </div>
143
+ <div class="col-md-6 form-inline">
144
+ <label class="sm-label-right"> Detail <help-field key="oracle.loadBalancer.detail"></help-field> </label>
145
+ <input
146
+ type="text"
147
+ class="form-control input-sm"
148
+ ng-model="loadBalancerCmd.detail"
149
+ name="detailName"
150
+ ng-change="ctrl.updateName()"
151
+ ng-pattern="/^[a-zA-Z0-9-]*$/"
152
+ />
153
+ </div>
154
+ <div class="col-md-7 col-md-offset-3" ng-if="form.stackName.$error.pattern">
155
+ <validation-error message="Stack can only contain letters and numbers."></validation-error>
156
+ </div>
157
+ <div class="col-md-7 col-md-offset-3" ng-if="form.detailName.$error.pattern">
158
+ <validation-error message="Detail can only contain letters, numbers, and dashes."></validation-error>
159
+ </div>
160
+ </div>
161
+ <div class="form-group">
162
+ <div class="col-md-9 col-md-offset-3" ng-if="form.loadBalancerName.$error.maxlength">
163
+ <validation-error message="Load Balancer name can only be 32 characters."></validation-error>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
@@ -0,0 +1,26 @@
1
+ <form name="form" class="form-horizontal" novalidate validate-on-submit>
2
+ <v2-modal-wizard
3
+ heading="Edit Load Balancer {{ctrl.loadBalancer.name}}"
4
+ task-monitor="taskMonitor"
5
+ dismiss="$dismiss()"
6
+ >
7
+ <v2-wizard-page key="Certificates" label="SSL Certificates" done="true">
8
+ <ng-include src="ctrl.pages.certificates"></ng-include>
9
+ </v2-wizard-page>
10
+ <v2-wizard-page key="Backend Sets" label="Backend Sets" done="true">
11
+ <ng-include src="ctrl.pages.backendSets"></ng-include>
12
+ </v2-wizard-page>
13
+ <v2-wizard-page key="Listeners" label="Listeners" done="true">
14
+ <ng-include src="ctrl.pages.listeners"></ng-include>
15
+ </v2-wizard-page>
16
+ </v2-modal-wizard>
17
+ <div class="modal-footer">
18
+ <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>
19
+ <submit-button
20
+ is-disabled="taskMonitor.submitting"
21
+ submitting="taskMonitor.submitting"
22
+ on-click="form.$valid && ctrl.submit()"
23
+ is-new="isNew"
24
+ ></submit-button>
25
+ </div>
26
+ </form>
@@ -0,0 +1,88 @@
1
+ <div class="container-fluid form-horizontal">
2
+ <div class="form-group">
3
+ <div class="col-md-12">
4
+ <table class="table table-condensed packed">
5
+ <thead>
6
+ <tr>
7
+ <th>SSL</th>
8
+ <th>SSL Certificate Name</th>
9
+ <th>Protocol</th>
10
+ <th>Listening Port</th>
11
+ <th>Default Backend Set Name</th>
12
+ <!-- TODO <th>SSL config</th>
13
+ <th>Hostnames</th> -->
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr ng-repeat="listener in ctrl.listeners">
18
+ <td>
19
+ <input
20
+ type="checkbox"
21
+ name="isSsl"
22
+ ng-model="listener.isSsl"
23
+ on-change="ctrl.listenerIsSslChanged(listener)"
24
+ />
25
+ </td>
26
+ <td>
27
+ <ui-select
28
+ ng-if="listener.isSsl"
29
+ class="form-control input-sm"
30
+ required
31
+ ng-model="listener.sslConfiguration.certificateName"
32
+ >
33
+ <ui-select-match placeholder="Select certificate name"
34
+ >{{$select.selected.certificateName}}</ui-select-match
35
+ >
36
+ <ui-select-choices repeat="cert.certificateName as cert in ctrl.certificates | filter: $select.search">
37
+ <span ng-bind-html="cert.certificateName | highlight: $select.search"></span>
38
+ </ui-select-choices>
39
+ </ui-select>
40
+ <div ng-if="!listener.isSsl">N/A</div>
41
+ </td>
42
+ <td>
43
+ <select
44
+ class="form-control input-sm"
45
+ ng-model="listener.protocol"
46
+ ng-options="protocol for protocol in ['HTTP', 'TCP']"
47
+ ></select>
48
+ </td>
49
+ <td>
50
+ <input class="form-control input-sm" type="number" ng-model="listener.port" required />
51
+ </td>
52
+ <td>
53
+ <ui-select class="form-control input-sm" required ng-model="listener.defaultBackendSetName">
54
+ <ui-select-match placeholder="Select default backend set name"
55
+ >{{$select.selected.name}}</ui-select-match
56
+ >
57
+ <ui-select-choices repeat="backendSet.name as backendSet in ctrl.backendSets | filter: $select.search">
58
+ <span ng-bind-html="backendSet.name | highlight: $select.search"></span>
59
+ </ui-select-choices>
60
+ </ui-select>
61
+ <!-- <select class="form-control input-sm" required ng-model="listener.defaultBackendSetName" ng-options="backendSetName as backendSet.name for backendSet in loadBalancerCmd.backendSets"></select> -->
62
+ </td>
63
+ <td>
64
+ <a href class="sm-label" ng-click="ctrl.removeListener($index)"
65
+ ><span class="glyphicon glyphicon-trash"></span
66
+ ></a>
67
+ </td>
68
+ </tr>
69
+ <tr ng-if="!ctrl.listenersUniqueProtocolPort()">
70
+ <td colspan="3">
71
+ <validation-error message="Listeners must have unique protocol and port"></validation-error>
72
+ </td>
73
+ </tr>
74
+ </tbody>
75
+ <tfoot>
76
+ <tr>
77
+ <td colspan="5">
78
+ <button class="add-new col-md-12" ng-click="ctrl.addListener()">
79
+ <span class="glyphicon glyphicon-plus-sign"></span>
80
+ Add Listener
81
+ </button>
82
+ </td>
83
+ </tr>
84
+ </tfoot>
85
+ </table>
86
+ </div>
87
+ </div>
88
+ </div>
@@ -0,0 +1,62 @@
1
+ import type { StateService } from '@uirouter/angularjs';
2
+ import type { IControllerService, IRootScopeService, IScope } from 'angular';
3
+ import { mock } from 'angular';
4
+
5
+ import type { LoadBalancerReader, SecurityGroupReader } from '@spinnaker/core';
6
+ import { ApplicationModelBuilder, LOAD_BALANCER_READ_SERVICE, SECURITY_GROUP_READER } from '@spinnaker/core';
7
+
8
+ import type { OracleLoadBalancerDetailController } from './loadBalancerDetail.controller';
9
+ import { ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER } from './loadBalancerDetail.controller';
10
+
11
+ describe('Controller: oracleLoadBalancerDetailCtrl', function () {
12
+ let controller: OracleLoadBalancerDetailController;
13
+ let $scope: IScope;
14
+ let $state: StateService;
15
+ let securityGroupReader: SecurityGroupReader;
16
+ let loadBalancerReader: LoadBalancerReader;
17
+
18
+ const loadBalancer = {
19
+ name: 'foo',
20
+ region: 'us-west-1',
21
+ account: 'test',
22
+ accountId: 'test',
23
+ vpcId: '1',
24
+ };
25
+
26
+ beforeEach(mock.module(ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER, SECURITY_GROUP_READER, LOAD_BALANCER_READ_SERVICE));
27
+
28
+ beforeEach(
29
+ mock.inject(
30
+ (
31
+ $controller: IControllerService,
32
+ $rootScope: IRootScopeService,
33
+ _$state_: StateService,
34
+ _securityGroupReader_: SecurityGroupReader,
35
+ _loadBalancerReader_: LoadBalancerReader,
36
+ ) => {
37
+ $scope = $rootScope.$new();
38
+ $state = _$state_;
39
+ const app = ApplicationModelBuilder.createApplicationForTests('app', {
40
+ key: 'loadBalancers',
41
+ lazy: true,
42
+ defaultData: [],
43
+ });
44
+ app.loadBalancers.data.push(loadBalancer);
45
+ securityGroupReader = _securityGroupReader_;
46
+ loadBalancerReader = _loadBalancerReader_;
47
+ controller = $controller('oracleLoadBalancerDetailCtrl', {
48
+ $scope: $scope,
49
+ loadBalancer: loadBalancer,
50
+ app: app,
51
+ $state: $state,
52
+ securityGroupReader: securityGroupReader,
53
+ loadBalancerReader: loadBalancerReader,
54
+ });
55
+ },
56
+ ),
57
+ );
58
+
59
+ it('should have an instantiated controller', function () {
60
+ expect(controller).toBeDefined();
61
+ });
62
+ });
@@ -0,0 +1,163 @@
1
+ import type { StateService } from '@uirouter/angularjs';
2
+ import UIROUTER_ANGULARJS from '@uirouter/angularjs';
3
+ import type { IController } from 'angular';
4
+ import angular, { module } from 'angular';
5
+ import type { IModalService } from 'angular-ui-bootstrap';
6
+ import ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';
7
+ import { sortBy } from 'lodash';
8
+
9
+ import type { Application, ISecurityGroup, LoadBalancerReader, SecurityGroupReader } from '@spinnaker/core';
10
+ import { ConfirmationModalService, FirewallLabels, LoadBalancerWriter } from '@spinnaker/core';
11
+
12
+ import { OracleLoadBalancerController } from '../configure/createLoadBalancer.controller';
13
+ import type { ILoadBalancerDetails, IOracleLoadBalancer } from '../../domain/IOracleLoadBalancer';
14
+
15
+ export class OracleLoadBalancerDetailController implements IController {
16
+ public static $inject = [
17
+ '$scope',
18
+ '$state',
19
+ '$uibModal',
20
+ 'loadBalancer',
21
+ 'app',
22
+ 'securityGroupReader',
23
+ 'loadBalancerReader',
24
+ '$q',
25
+ ];
26
+ constructor(
27
+ private $scope: ng.IScope,
28
+ private $state: StateService,
29
+ private $uibModal: IModalService,
30
+ private loadBalancer: ILoadBalancerDetails,
31
+ private app: Application,
32
+ private securityGroupReader: SecurityGroupReader,
33
+ private loadBalancerReader: LoadBalancerReader,
34
+ private $q: angular.IQService,
35
+ ) {
36
+ $scope.state = {
37
+ loading: true,
38
+ };
39
+ $scope.firewallsLabel = FirewallLabels.get('Firewalls');
40
+
41
+ const extractLoadBalancer = (): PromiseLike<any> => {
42
+ $scope.loadBalancer = app.loadBalancers.data.filter((test: IOracleLoadBalancer) => {
43
+ return (
44
+ test.name === loadBalancer.name &&
45
+ test.region === loadBalancer.region &&
46
+ test.account === loadBalancer.accountId
47
+ );
48
+ })[0];
49
+
50
+ if ($scope.loadBalancer) {
51
+ const detailsLoader = this.loadBalancerReader.getLoadBalancerDetails(
52
+ $scope.loadBalancer.cloudProvider,
53
+ loadBalancer.accountId,
54
+ loadBalancer.region,
55
+ loadBalancer.name,
56
+ );
57
+
58
+ return detailsLoader.then((details) => {
59
+ // ILoadBalancerSourceData
60
+ $scope.state.loading = false;
61
+ const securityGroups: ISecurityGroup[] = [];
62
+
63
+ const filtered = details.filter((test: IOracleLoadBalancer) => {
64
+ return test.name === loadBalancer.name;
65
+ });
66
+
67
+ if (filtered.length) {
68
+ $scope.loadBalancer.elb = filtered[0];
69
+
70
+ $scope.loadBalancer.account = loadBalancer.accountId;
71
+
72
+ if ($scope.loadBalancer.elb.securityGroups) {
73
+ $scope.loadBalancer.elb.securityGroups.forEach((securityGroupId: string) => {
74
+ const match = this.securityGroupReader.getApplicationSecurityGroup(
75
+ this.app,
76
+ loadBalancer.accountId,
77
+ loadBalancer.region,
78
+ securityGroupId,
79
+ );
80
+ if (match) {
81
+ securityGroups.push(match);
82
+ }
83
+ });
84
+ this.$scope.securityGroups = sortBy(securityGroups, 'name');
85
+ }
86
+ }
87
+ });
88
+ }
89
+ if (!this.$scope.loadBalancer) {
90
+ this.$state.go('^');
91
+ }
92
+
93
+ return this.$q.when(null);
94
+ };
95
+
96
+ this.app
97
+ .ready()
98
+ .then(extractLoadBalancer)
99
+ .then(() => {
100
+ // If the user navigates away from the view before the initial extractLoadBalancer call completes,
101
+ // do not bother subscribing to the refresh
102
+ if (!this.$scope.$$destroyed) {
103
+ this.app.onRefresh($scope, extractLoadBalancer);
104
+ }
105
+ });
106
+ }
107
+
108
+ public editLoadBalancer() {
109
+ this.$uibModal.open({
110
+ templateUrl: require('../configure/editLoadBalancer.html'),
111
+ controller: OracleLoadBalancerController,
112
+ controllerAs: 'ctrl',
113
+ size: 'lg',
114
+ resolve: {
115
+ application: () => {
116
+ return this.app;
117
+ },
118
+ loadBalancer: () => {
119
+ return angular.copy(this.$scope.loadBalancer);
120
+ },
121
+ isNew: () => {
122
+ return false;
123
+ },
124
+ },
125
+ });
126
+ }
127
+
128
+ public deleteLoadBalancer() {
129
+ if (this.$scope.loadBalancer.instances && this.$scope.loadBalancer.instances.length) {
130
+ return;
131
+ }
132
+
133
+ const taskMonitor = {
134
+ application: this.app,
135
+ title: 'Deleting ' + this.loadBalancer.name,
136
+ };
137
+
138
+ const command = {
139
+ cloudProvider: 'oracle',
140
+ loadBalancerName: this.$scope.loadBalancer.name,
141
+ credentials: this.$scope.loadBalancer.account,
142
+ region: this.loadBalancer.region,
143
+ application: this.app.name,
144
+ loadBalancerId: this.$scope.loadBalancer.id,
145
+ };
146
+
147
+ const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, this.app);
148
+
149
+ ConfirmationModalService.confirm({
150
+ header: 'Really delete ' + this.loadBalancer.name + '?',
151
+ buttonText: 'Delete ' + this.loadBalancer.name,
152
+ account: this.loadBalancer.accountId,
153
+ taskMonitorConfig: taskMonitor,
154
+ submitMethod: submitMethod,
155
+ });
156
+ }
157
+ }
158
+
159
+ export const ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER = 'spinnaker.oracle.loadBalancerDetail.controller';
160
+ module(ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP as any]).controller(
161
+ 'oracleLoadBalancerDetailCtrl',
162
+ OracleLoadBalancerDetailController,
163
+ );
@@ -0,0 +1,100 @@
1
+ <div class="details-panel">
2
+ <div ng-if="state.loading" 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 class="horizontal center middle">
9
+ <loading-spinner size="'small'"></loading-spinner>
10
+ </div>
11
+ </div>
12
+
13
+ <div ng-if="!state.loading" class="header">
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
+ <i class="fa icon-sitemap"></i>
21
+ <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{loadBalancer.name}}</h3>
22
+ </div>
23
+ <div>
24
+ <div class="actions">
25
+ <div class="dropdown" uib-dropdown dropdown-append-to-body>
26
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>
27
+ Load Balancer Actions <span class="caret"></span>
28
+ </button>
29
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
30
+ <li><a href ng-click="ctrl.editLoadBalancer()">Edit Load Balancer</a></li>
31
+ <li ng-if="!loadBalancer.serverGroups.length">
32
+ <a href ng-click="ctrl.deleteLoadBalancer()">Delete Load Balancer</a>
33
+ </li>
34
+ <li
35
+ ng-if="loadBalancer.serverGroups.length"
36
+ class="disabled"
37
+ tooltip="You must detach all server groups before you can delete this load balancer."
38
+ >
39
+ <a href ng-click="return">Delete Load Balancer</a>
40
+ </li>
41
+ </ul>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ <div ng-if="!state.loading" class="content">
47
+ <collapsible-section heading="Load Balancer Details" expanded="true">
48
+ <dl class="dl-horizontal dl-narrow">
49
+ <dt>Created</dt>
50
+ <dd>{{loadBalancer.timeCreated}}</dd>
51
+ <dt>In</dt>
52
+ <dd>
53
+ <account-tag account="loadBalancer.account" pad="right" provider="loadBalancer.type"></account-tag>
54
+ {{loadBalancer.region}}
55
+ </dd>
56
+ <dt>Subnets</dt>
57
+ <dd ng-repeat="subnet in loadBalancer.subnets">{{subnet.name}}</dd>
58
+ <dt>Public IP</dt>
59
+ <dd ng-repeat="ip in loadBalancer.ipAddresses">{{ip.ipAddress}}</dd>
60
+ </dl>
61
+ <dl class="horizontal-when-filters-collapsed">
62
+ <dt ng-if="loadBalancer.serverGroups">Server Groups</dt>
63
+ <dd ng-if="loadBalancer.serverGroups">
64
+ <ul class="collapse-margin-on-filter-collapse">
65
+ <li ng-repeat="serverGroup in loadBalancer.serverGroups | orderBy: ['isDisabled', '-name']">
66
+ <a
67
+ ui-sref="^.serverGroup({region: serverGroup.region,
68
+ accountId: serverGroup.account,
69
+ serverGroup: serverGroup.name,
70
+ provider: 'oracle'})"
71
+ >
72
+ {{serverGroup.name}}
73
+ </a>
74
+ </li>
75
+ </ul>
76
+ </dd>
77
+ </dl>
78
+ </collapsible-section>
79
+ <!-- <collapsible-section heading="Status" expanded="true">
80
+ <health-counts class="pull-left" container="loadBalancer.instanceCounts"></health-counts>
81
+ </collapsible-section> -->
82
+ <collapsible-section heading="Backend Sets">
83
+ <dd ng-repeat="backendSet in loadBalancer.backendSets">
84
+ <dl>
85
+ <dt>{{backendSet.name}}</dt>
86
+ <dd>{{backendSet.policy}}</dd>
87
+ <dd>Health Check: {{backendSet.healthChecker.urlPath}}</dd>
88
+ </dl>
89
+ </dd>
90
+ </collapsible-section>
91
+ <collapsible-section heading="Listeners">
92
+ <dl>
93
+ <dt>Listener &rarr; Backend Set</dt>
94
+ <dd ng-repeat="listener in loadBalancer.listeners">
95
+ {{listener.protocol}}:{{listener.port}} &rarr; {{listener.defaultBackendSetName}}
96
+ </dd>
97
+ </dl>
98
+ </collapsible-section>
99
+ </div>
100
+ </div>