@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.
- package/CHANGELOG.md +868 -0
- package/LICENSE.txt +203 -0
- package/dist/common/footer.component.d.ts +2 -0
- package/dist/domain/IOracleLoadBalancer.d.ts +114 -0
- package/dist/helpContents/oracleHelpContents.d.ts +1 -0
- package/dist/image/image.reader.d.ts +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3634 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/details/instance.details.controller.d.ts +2 -0
- package/dist/loadBalancer/configure/createLoadBalancer.controller.d.ts +87 -0
- package/dist/loadBalancer/details/loadBalancerDetail.controller.d.ts +21 -0
- package/dist/loadBalancer/loadBalancer.transformer.d.ts +12 -0
- package/dist/oracle.module.d.ts +2 -0
- package/dist/oracle.settings.d.ts +15 -0
- package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +2 -0
- package/dist/pipeline/stages/bake/ociBakeStage.d.ts +2 -0
- package/dist/pipeline/stages/destroyAsg/destroyAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/disableAsg/disableAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/findAmi/findAmiStage.d.ts +2 -0
- package/dist/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.d.ts +2 -0
- package/dist/pipeline/stages/resizeAsg/resizeAsgStage.d.ts +2 -0
- package/dist/pipeline/stages/scaleDownCluster/scaleDownClusterStage.d.ts +2 -0
- package/dist/pipeline/stages/shrinkCluster/shrinkClusterStage.d.ts +2 -0
- package/dist/securityGroup/configure/createSecurityGroup.controller.d.ts +2 -0
- package/dist/securityGroup/securityGroup.reader.d.ts +2 -0
- package/dist/securityGroup/securityGroup.transformer.d.ts +2 -0
- package/dist/serverGroup/configure/serverGroup.configure.module.d.ts +2 -0
- package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +2 -0
- package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/basicSettings/basicSettings.controller.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/capacity/capacitySelector.component.d.ts +2 -0
- package/dist/serverGroup/configure/wizard/cloneServerGroup.controller.d.ts +2 -0
- package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +2 -0
- package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +2 -0
- package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +2 -0
- package/dist/serverGroup/details/serverGroupDetails.controller.d.ts +2 -0
- package/dist/serverGroup/serverGroup.transformer.d.ts +2 -0
- package/package.json +38 -0
- package/src/common/footer.component.html +7 -0
- package/src/common/footer.component.js +18 -0
- package/src/common/ocid/ocid.component.js +15 -0
- package/src/common/ocid/ocid.template.html +10 -0
- package/src/common/ocid/truncateOcid.filter.js +14 -0
- package/src/domain/IOracleLoadBalancer.ts +110 -0
- package/src/helpContents/oracleHelpContents.ts +52 -0
- package/src/image/image.reader.js +38 -0
- package/src/index.ts +1 -0
- package/src/instance/details/instance.details.controller.js +56 -0
- package/src/instance/details/instanceDetails.html +31 -0
- package/src/loadBalancer/configure/backendSets.html +67 -0
- package/src/loadBalancer/configure/certificates.html +63 -0
- package/src/loadBalancer/configure/createLoadBalancer.controller.spec.ts +201 -0
- package/src/loadBalancer/configure/createLoadBalancer.controller.ts +540 -0
- package/src/loadBalancer/configure/createLoadBalancer.html +25 -0
- package/src/loadBalancer/configure/createLoadBalancerProperties.html +167 -0
- package/src/loadBalancer/configure/editLoadBalancer.html +26 -0
- package/src/loadBalancer/configure/listeners.html +88 -0
- package/src/loadBalancer/details/loadBalancerDetail.controller.spec.ts +62 -0
- package/src/loadBalancer/details/loadBalancerDetail.controller.ts +163 -0
- package/src/loadBalancer/details/loadBalancerDetail.html +100 -0
- package/src/loadBalancer/loadBalancer.transformer.ts +144 -0
- package/src/oracle.module.ts +94 -0
- package/src/oracle.settings.ts +19 -0
- package/src/pipeline/disableAsg/disableAsgStage.html +11 -0
- package/src/pipeline/disableAsg/disableAsgStage.js +62 -0
- package/src/pipeline/disableAsg/disableAsgStepLabel.html +1 -0
- package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +38 -0
- package/src/pipeline/stages/bake/bakeExecutionDetails.html +52 -0
- package/src/pipeline/stages/bake/bakeStage.html +109 -0
- package/src/pipeline/stages/bake/ociBakeStage.js +147 -0
- package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +9 -0
- package/src/pipeline/stages/destroyAsg/destroyAsgStage.js +64 -0
- package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
- package/src/pipeline/stages/disableAsg/disableAsgStage.html +11 -0
- package/src/pipeline/stages/disableAsg/disableAsgStage.js +63 -0
- package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
- package/src/pipeline/stages/findAmi/findAmiStage.html +20 -0
- package/src/pipeline/stages/findAmi/findAmiStage.js +82 -0
- package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +44 -0
- package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +11 -0
- package/src/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.js +36 -0
- package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +89 -0
- package/src/pipeline/stages/resizeAsg/resizeAsgStage.js +101 -0
- package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +1 -0
- package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +35 -0
- package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.js +75 -0
- package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +34 -0
- package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.js +71 -0
- package/src/securityGroup/configure/createSecurityGroup.controller.js +19 -0
- package/src/securityGroup/configure/createSecurityGroup.html +19 -0
- package/src/securityGroup/securityGroup.reader.js +15 -0
- package/src/securityGroup/securityGroup.transformer.js +25 -0
- package/src/serverGroup/configure/serverGroup.configure.module.js +15 -0
- package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +105 -0
- package/src/serverGroup/configure/serverGroupConfiguration.service.js +229 -0
- package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +13 -0
- package/src/serverGroup/configure/wizard/basicSettings/basicSettings.controller.js +35 -0
- package/src/serverGroup/configure/wizard/basicSettings/basicSettings.html +134 -0
- package/src/serverGroup/configure/wizard/capacity/capacity.html +7 -0
- package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.html +13 -0
- package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.js +17 -0
- package/src/serverGroup/configure/wizard/cloneServerGroup.controller.js +109 -0
- package/src/serverGroup/configure/wizard/instanceType/instanceType.html +29 -0
- package/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html +44 -0
- package/src/serverGroup/configure/wizard/network/networkSettings.html +15 -0
- package/src/serverGroup/configure/wizard/serverGroupWizard.html +40 -0
- package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +9 -0
- package/src/serverGroup/details/resize/resizeCapacity.component.html +36 -0
- package/src/serverGroup/details/resize/resizeCapacity.component.js +42 -0
- package/src/serverGroup/details/resize/resizeServerGroup.controller.js +62 -0
- package/src/serverGroup/details/resize/resizeServerGroup.html +33 -0
- package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +73 -0
- package/src/serverGroup/details/rollback/rollbackServerGroup.html +41 -0
- package/src/serverGroup/details/serverGroupDetails.controller.js +230 -0
- package/src/serverGroup/details/serverGroupDetails.html +94 -0
- 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 → Backend Set</dt>
|
|
94
|
+
<dd ng-repeat="listener in loadBalancer.listeners">
|
|
95
|
+
{{listener.protocol}}:{{listener.port}} → {{listener.defaultBackendSetName}}
|
|
96
|
+
</dd>
|
|
97
|
+
</dl>
|
|
98
|
+
</collapsible-section>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|