Skip to content

Commit 961418d

Browse files
Show provision status of service instances on the overview page.
1 parent 5972dde commit 961418d

File tree

4 files changed

+190
-64
lines changed

4 files changed

+190
-64
lines changed

Diff for: app/scripts/directives/overview/serviceInstanceRow.js

+27-1
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,31 @@
3939
return _.get(row, ['state','serviceClasses', serviceClassName, 'description']);
4040
};
4141

42+
var updateInstanceStatus = function() {
43+
var conditions = _.get(row.apiObject, 'status.conditions');
44+
var readyCondition = _.find(conditions, {type: 'Ready'});
45+
46+
row.instanceError = _.find(conditions, {type: 'Failed', status: 'True'});
47+
48+
if (_.get(row.apiObject, 'metadata.deletionTimestamp')) {
49+
row.instanceStatus = 'deleted';
50+
} else if (row.instanceError) {
51+
row.instanceStatus = 'failed';
52+
} else if (readyCondition && readyCondition.status === 'True') {
53+
row.instanceStatus = 'ready';
54+
} else {
55+
row.instanceStatus = 'pending';
56+
row.pendingMessage = _.get(readyCondition, 'message') || 'The instance is being provisioned asynchronously.';
57+
}
58+
};
59+
4260
row.$doCheck = function() {
61+
updateInstanceStatus();
62+
4363
row.notifications = ListRowUtils.getNotifications(row.apiObject, row.state);
4464
row.displayName = serviceInstanceDisplayName(row.apiObject, row.state.serviceClasses);
45-
row.isBindable = BindingService.isServiceBindable(row.apiObject, row.state.serviceClasses);
65+
row.isBindable = !row.instanceError &&
66+
BindingService.isServiceBindable(row.apiObject, row.state.serviceClasses);
4667
row.description = getDescription();
4768
};
4869

@@ -57,6 +78,11 @@
5778
};
5879

5980
row.actionsDropdownVisible = function() {
81+
// no actions on those marked for deletion
82+
if (_.get(row.apiObject, 'metadata.deletionTimestamp')) {
83+
return false;
84+
}
85+
6086
// We can create bindings
6187
if (row.isBindable && AuthorizationService.canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'create')) {
6288
return true;

Diff for: app/views/overview/_service-instance-row.html

+101-53
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,24 @@ <h3>
1313
<notification-icon ng-if="!row.expanded" alerts="row.notifications"></notification-icon>
1414
</div>
1515
</div>
16-
<div class="list-pf-details">
17-
<div ng-if="!row.expanded">
16+
<div class="list-pf-details" ng-if="!row.expanded" ng-switch="row.instanceStatus">
17+
18+
<span ng-switch-when="failed"
19+
dynamic-content="{{row.instanceError.message}}"
20+
data-toggle="tooltip"
21+
data-trigger="hover">
22+
<span class="pficon pficon-error-circle-o" aria-hidden="true"></span>
23+
<span>Error</span>
24+
</span>
25+
<span ng-switch-when="deleted">
26+
<span class="pficon pficon-warning-triangle-o" aria-hidden="true"></span>
27+
<span>Marked for Deletion</span>
28+
</span>
29+
<span ng-switch-when="pending">
30+
<span class="spinner spinner-xs spinner-inline" aria-hidden="true"></span>
31+
<span>Pending</span>
32+
</span>
33+
<div ng-switch-default>
1834
<div class="hidden-xs hidden-sm">
1935
<span ng-if="!row.bindings.length
2036
&& row.isBindable
@@ -44,15 +60,15 @@ <h3>
4460
</div>
4561
<div
4662
class="hidden-xs"
47-
ng-if="!row.expanded && row.apiObject.status.dashboardURL">
63+
ng-if="(!row.instanceStatus || row.instanceStatus === 'ok') && row.apiObject.status.dashboardURL">
4864
<a ng-href="{{row.apiObject.status.dashboardURL}}" target="_blank">
4965
Console
5066
</a> <i class="fa fa-external-link small" aria-hidden="true"></i>
5167
</div>
5268
</div>
5369
</div>
54-
<div class="list-pf-actions" ng-if="row.actionsDropdownVisible()">
55-
<div uib-dropdown>
70+
<div class="list-pf-actions">
71+
<div uib-dropdown ng-if="row.actionsDropdownVisible()">
5672
<a href=""
5773
uib-dropdown-toggle
5874
class="actions-dropdown-kebab"><i class="fa fa-ellipsis-v"></i><span class="sr-only">Actions</span></a>
@@ -97,59 +113,91 @@ <h3>
97113
</div>
98114
</div>
99115
-->
100-
<div class="row">
101-
<div class="col-sm-12" ng-if="row.description">
102-
<p class="pre-wrap" ng-bind-html="row.description | linky"></p>
116+
<div ng-switch="row.instanceStatus">
117+
<div ng-switch-when="deleted" class="row">
118+
<div class="col-sm-12">
119+
<div class="alert word-break alert-warning">
120+
<span class="pficon pficon-warning-triangle-o" aria-hidden="true"></span>
121+
<span class="sr-only">warning</span>
122+
<span class="strong">The service was marked for deletion</span>
123+
<span class="strong" am-time-ago="row.apiObject.metadata.deletionTimestamp"></span>
124+
</div>
125+
</div>
103126
</div>
104-
</div>
105-
<div class="section-title" ng-if="row.isBindable || row.bindings">
106-
Bindings
107-
</div>
108-
<div class="row overview-bindings" ng-repeat="(name, binding) in row.bindings">
109-
<div class="col-sm-5 col-md-6">
110-
<div ng-if="!(row.state.applicationsByBinding[binding.metadata.name] | size)">
111-
<h3>
112-
<div class="component-label">
113-
Secret
127+
<div ng-switch-when="failed" class="row">
128+
<div class="col-sm-12">
129+
<div class="alert word-break alert-danger">
130+
<span class="pficon pficon-error-circle-o" aria-hidden="true"></span>
131+
<span class="sr-only">error</span>
132+
<span class="strong">{{row.instanceError.message}}</span>
133+
</div>
134+
</div>
135+
</div>
136+
<div ng-switch-when="pending" class="row">
137+
<div class="col-sm-12">
138+
<div class="alert word-break alert-info">
139+
<span class="pficon pficon-info" aria-hidden="true"></span>
140+
<span class="sr-only">info</span>
141+
<span>{{row.pendingMessage}}</span>
142+
</div>
143+
</div>
144+
</div>
145+
<div ng-switch-default>
146+
<div class="row">
147+
<div class="col-sm-12" ng-if="row.description">
148+
<p class="pre-wrap" ng-bind-html="row.description | linky"></p>
149+
</div>
150+
</div>
151+
<div class="section-title" ng-if="row.isBindable || row.bindings">
152+
Bindings
153+
</div>
154+
<div class="row overview-bindings" ng-repeat="(name, binding) in row.bindings">
155+
<div class="col-sm-5 col-md-6">
156+
<div ng-if="!(row.state.applicationsByBinding[binding.metadata.name] | size)">
157+
<h3>
158+
<div class="component-label">
159+
Secret
160+
</div>
161+
<a ng-if="('secrets' | canI : 'get')"
162+
ng-href="{{binding.spec.secretName | navigateResourceURL : 'Secret' : row.apiObject.metadata.namespace}}">
163+
{{binding.spec.secretName}}
164+
</a>
165+
<span ng-if="!('secrets' | canI : 'get')">
166+
{{binding.spec.secretName}}
167+
</span>
168+
</h3>
114169
</div>
115-
<a ng-if="('secrets' | canI : 'get')"
116-
ng-href="{{binding.spec.secretName | navigateResourceURL : 'Secret' : row.apiObject.metadata.namespace}}">
117-
{{binding.spec.secretName}}
118-
</a>
119-
<span ng-if="!('secrets' | canI : 'get')">
120-
{{binding.spec.secretName}}
170+
<div ng-repeat="target in row.state.applicationsByBinding[binding.metadata.name] track by (target | uid)">
171+
<h3>
172+
<div class="component-label">
173+
{{target.kind | humanizeKind : true}}
174+
</div>
175+
<a ng-href="{{target | navigateResourceURL}}">{{target.metadata.name}}</a>
176+
</h3>
177+
</div>
178+
</div>
179+
<div class="col-sm-7 col-md-6 overview-bindings">
180+
<span ng-if="binding.metadata.deletionTimestamp">
181+
<status-icon status="'Pending'"></status-icon> Deleting
182+
</span>
183+
<span ng-if="!(binding | isBindingReady) && !binding.metadata.deletionTimestamp">
184+
<status-icon status="'Pending'"></status-icon> Pending
121185
</span>
122-
</h3>
186+
</div>
123187
</div>
124-
<div ng-repeat="target in row.state.applicationsByBinding[binding.metadata.name] track by (target | uid)">
125-
<h3>
126-
<div class="component-label">
127-
{{target.kind | humanizeKind : true}}
128-
</div>
129-
<a ng-href="{{target | navigateResourceURL}}">{{target.metadata.name}}</a>
130-
</h3>
188+
<div class="row" ng-if="row.isBindable && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
189+
<div class="col-sm-12">
190+
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">
191+
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
192+
Create Binding
193+
</a>
194+
</div>
195+
</div>
196+
<div class="row" ng-if="!row.bindings.length && (!row.isBindable || !({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create'))">
197+
<div class="col-sm-12">
198+
<em>No bindings</em>
199+
</div>
131200
</div>
132-
</div>
133-
<div class="col-sm-7 col-md-6 overview-bindings">
134-
<span ng-if="binding.metadata.deletionTimestamp">
135-
<status-icon status="'Pending'"></status-icon> Deleting
136-
</span>
137-
<span ng-if="!(binding | isBindingReady) && !binding.metadata.deletionTimestamp">
138-
<status-icon status="'Pending'"></status-icon> Pending
139-
</span>
140-
</div>
141-
</div>
142-
<div class="row" ng-if="row.isBindable && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
143-
<div class="col-sm-12">
144-
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">
145-
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
146-
Create Binding
147-
</a>
148-
</div>
149-
</div>
150-
<div class="row" ng-if="!row.bindings.length && (!row.isBindable || !({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create'))">
151-
<div class="col-sm-12">
152-
<em>No bindings</em>
153201
</div>
154202
</div>
155203
</div>

Diff for: dist/scripts/scripts.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -12969,24 +12969,32 @@ _.extend(s, r.ui);
1296912969
var c = e("getErrorDetails"), l = e("serviceInstanceDisplayName"), u = function() {
1297012970
var e = s.apiObject.spec.serviceClassName;
1297112971
return _.get(s, [ "state", "serviceClasses", e, "description" ]);
12972+
}, d = function() {
12973+
var e = _.get(s.apiObject, "status.conditions"), t = _.find(e, {
12974+
type: "Ready"
12975+
});
12976+
s.instanceError = _.find(e, {
12977+
type: "Failed",
12978+
status: "True"
12979+
}), _.get(s.apiObject, "metadata.deletionTimestamp") ? s.instanceStatus = "deleted" : s.instanceError ? s.instanceStatus = "failed" : t && "True" === t.status ? s.instanceStatus = "ready" : (s.instanceStatus = "pending", s.pendingMessage = _.get(t, "message") || "The instance is being provisioned asynchronously.");
1297212980
};
1297312981
s.$doCheck = function() {
12974-
s.notifications = r.getNotifications(s.apiObject, s.state), s.displayName = l(s.apiObject, s.state.serviceClasses), s.isBindable = a.isServiceBindable(s.apiObject, s.state.serviceClasses), s.description = u();
12982+
d(), s.notifications = r.getNotifications(s.apiObject, s.state), s.displayName = l(s.apiObject, s.state.serviceClasses), s.isBindable = !s.instanceError && a.isServiceBindable(s.apiObject, s.state.serviceClasses), s.description = u();
1297512983
}, s.$onChanges = function(e) {
1297612984
e.bindings && (s.deleteableBindings = _.reject(s.bindings, "metadata.deletionTimestamp"));
1297712985
}, s.getSecretForBinding = function(e) {
1297812986
return e && _.get(s, [ "state", "secrets", e.spec.secretName ]);
1297912987
}, s.actionsDropdownVisible = function() {
12980-
return !(!s.isBindable || !i.canI({
12988+
return !(_.get(s.apiObject, "metadata.deletionTimestamp") || (!s.isBindable || !i.canI({
1298112989
resource: "bindings",
1298212990
group: "servicecatalog.k8s.io"
12983-
}, "create")) || !(_.isEmpty(s.deleteableBindings) || !i.canI({
12991+
}, "create")) && (_.isEmpty(s.deleteableBindings) || !i.canI({
1298412992
resource: "bindings",
1298512993
group: "servicecatalog.k8s.io"
12986-
}, "delete")) || !!i.canI({
12994+
}, "delete")) && !i.canI({
1298712995
resource: "instances",
1298812996
group: "servicecatalog.k8s.io"
12989-
}, "delete");
12997+
}, "delete"));
1299012998
}, s.closeOverlayPanel = function() {
1299112999
_.set(s, "overlay.panelVisible", !1);
1299213000
}, s.showOverlayPanel = function(e, t) {

Diff for: dist/scripts/templates.js

+49-5
Original file line numberDiff line numberDiff line change
@@ -12397,8 +12397,20 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
1239712397
"<notification-icon ng-if=\"!row.expanded\" alerts=\"row.notifications\"></notification-icon>\n" +
1239812398
"</div>\n" +
1239912399
"</div>\n" +
12400-
"<div class=\"list-pf-details\">\n" +
12401-
"<div ng-if=\"!row.expanded\">\n" +
12400+
"<div class=\"list-pf-details\" ng-if=\"!row.expanded\" ng-switch=\"row.instanceStatus\">\n" +
12401+
"<span ng-switch-when=\"failed\" dynamic-content=\"{{row.instanceError.message}}\" data-toggle=\"tooltip\" data-trigger=\"hover\">\n" +
12402+
"<span class=\"pficon pficon-error-circle-o\" aria-hidden=\"true\"></span>\n" +
12403+
"<span>Error</span>\n" +
12404+
"</span>\n" +
12405+
"<span ng-switch-when=\"deleted\">\n" +
12406+
"<span class=\"pficon pficon-warning-triangle-o\" aria-hidden=\"true\"></span>\n" +
12407+
"<span>Marked for Deletion</span>\n" +
12408+
"</span>\n" +
12409+
"<span ng-switch-when=\"pending\">\n" +
12410+
"<span class=\"spinner spinner-xs spinner-inline\" aria-hidden=\"true\"></span>\n" +
12411+
"<span>Pending</span>\n" +
12412+
"</span>\n" +
12413+
"<div ng-switch-default>\n" +
1240212414
"<div class=\"hidden-xs hidden-sm\">\n" +
1240312415
"<span ng-if=\"!row.bindings.length\n" +
1240412416
" && row.isBindable\n" +
@@ -12424,15 +12436,15 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
1242412436
"</p>\n" +
1242512437
"</div>\n" +
1242612438
"</div>\n" +
12427-
"<div class=\"hidden-xs\" ng-if=\"!row.expanded && row.apiObject.status.dashboardURL\">\n" +
12439+
"<div class=\"hidden-xs\" ng-if=\"(!row.instanceStatus || row.instanceStatus === 'ok') && row.apiObject.status.dashboardURL\">\n" +
1242812440
"<a ng-href=\"{{row.apiObject.status.dashboardURL}}\" target=\"_blank\">\n" +
1242912441
"Console\n" +
1243012442
"</a> <i class=\"fa fa-external-link small\" aria-hidden=\"true\"></i>\n" +
1243112443
"</div>\n" +
1243212444
"</div>\n" +
1243312445
"</div>\n" +
12434-
"<div class=\"list-pf-actions\" ng-if=\"row.actionsDropdownVisible()\">\n" +
12435-
"<div uib-dropdown>\n" +
12446+
"<div class=\"list-pf-actions\">\n" +
12447+
"<div uib-dropdown ng-if=\"row.actionsDropdownVisible()\">\n" +
1243612448
"<a href=\"\" uib-dropdown-toggle class=\"actions-dropdown-kebab\"><i class=\"fa fa-ellipsis-v\"></i><span class=\"sr-only\">Actions</span></a>\n" +
1243712449
"<ul class=\"dropdown-menu dropdown-menu-right\" uib-dropdown-menu role=\"menu\">\n" +
1243812450
"<li role=\"menuitem\" ng-if=\"row.isBindable && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')\">\n" +
@@ -12455,6 +12467,36 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
1245512467
"<div class=\"expanded-section\">\n" +
1245612468
"<alerts alerts=\"row.notifications\"></alerts>\n" +
1245712469
"\n" +
12470+
"<div ng-switch=\"row.instanceStatus\">\n" +
12471+
"<div ng-switch-when=\"deleted\" class=\"row\">\n" +
12472+
"<div class=\"col-sm-12\">\n" +
12473+
"<div class=\"alert word-break alert-warning\">\n" +
12474+
"<span class=\"pficon pficon-warning-triangle-o\" aria-hidden=\"true\"></span>\n" +
12475+
"<span class=\"sr-only\">warning</span>\n" +
12476+
"<span class=\"strong\">The service was marked for deletion</span>\n" +
12477+
"<span class=\"strong\" am-time-ago=\"row.apiObject.metadata.deletionTimestamp\"></span>\n" +
12478+
"</div>\n" +
12479+
"</div>\n" +
12480+
"</div>\n" +
12481+
"<div ng-switch-when=\"failed\" class=\"row\">\n" +
12482+
"<div class=\"col-sm-12\">\n" +
12483+
"<div class=\"alert word-break alert-danger\">\n" +
12484+
"<span class=\"pficon pficon-error-circle-o\" aria-hidden=\"true\"></span>\n" +
12485+
"<span class=\"sr-only\">error</span>\n" +
12486+
"<span class=\"strong\">{{row.instanceError.message}}</span>\n" +
12487+
"</div>\n" +
12488+
"</div>\n" +
12489+
"</div>\n" +
12490+
"<div ng-switch-when=\"pending\" class=\"row\">\n" +
12491+
"<div class=\"col-sm-12\">\n" +
12492+
"<div class=\"alert word-break alert-info\">\n" +
12493+
"<span class=\"pficon pficon-info\" aria-hidden=\"true\"></span>\n" +
12494+
"<span class=\"sr-only\">info</span>\n" +
12495+
"<span>{{row.pendingMessage}}</span>\n" +
12496+
"</div>\n" +
12497+
"</div>\n" +
12498+
"</div>\n" +
12499+
"<div ng-switch-default>\n" +
1245812500
"<div class=\"row\">\n" +
1245912501
"<div class=\"col-sm-12\" ng-if=\"row.description\">\n" +
1246012502
"<p class=\"pre-wrap\" ng-bind-html=\"row.description | linky\"></p>\n" +
@@ -12513,6 +12555,8 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
1251312555
"</div>\n" +
1251412556
"</div>\n" +
1251512557
"</div>\n" +
12558+
"</div>\n" +
12559+
"</div>\n" +
1251612560
"<overlay-panel single-column=\"true\" show-panel=\"row.overlay.panelVisible\" show-close=\"true\" handle-close=\"row.closeOverlayPanel\">\n" +
1251712561
"<div ng-if=\"row.overlay.panelName === 'bindService'\">\n" +
1251812562
"<bind-service target=\"row.overlay.state.target\" project=\"row.state.project\" on-close=\"row.closeOverlayPanel\"></bind-service>\n" +

0 commit comments

Comments
 (0)