Skip to content

Commit 26d468a

Browse files
author
OpenShift Bot
authored
Merge pull request #1768 from jwforres/acl-svc-cat-actions
Merged by openshift-bot
2 parents b14785b + 7c8a1a2 commit 26d468a

File tree

7 files changed

+167
-60
lines changed

7 files changed

+167
-60
lines changed

app/scripts/directives/overview/listRow.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
(function() {
3+
(function() {
44
angular.module('openshiftConsole').component('overviewListRow', {
55
controller: [
66
'$filter',
@@ -40,6 +40,7 @@
4040
var canI = $filter('canI');
4141
var deploymentIsInProgress = $filter('deploymentIsInProgress');
4242
var isBinaryBuild = $filter('isBinaryBuild');
43+
var enableTechPreviewFeature = $filter('enableTechPreviewFeature');
4344

4445
var updateTriggers = function(apiObject) {
4546
var triggers = _.get(apiObject, 'spec.triggers');
@@ -150,6 +151,8 @@
150151

151152
row.canIDoAny = function() {
152153
var kind = _.get(row, 'apiObject.kind');
154+
var uid = _.get(row, 'apiObject.metadata.uid');
155+
var deleteableBindings = _.get(row.state.deleteableBindingsByApplicationUID, uid);
153156
switch (kind) {
154157
case 'DeploymentConfig':
155158
// Deploy is displayed.
@@ -164,6 +167,19 @@
164167
if (row.current && canI('deploymentconfigs/log', 'get')) {
165168
return true;
166169
}
170+
// Create Binding is displayed.
171+
if (enableTechPreviewFeature('pod_presets') &&
172+
!_.isEmpty(row.state.bindableServiceInstances) &&
173+
canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'create')) {
174+
return true;
175+
}
176+
// Delete Binding is displayed.
177+
if (enableTechPreviewFeature('pod_presets') &&
178+
!_.isEmpty(deleteableBindings) &&
179+
canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'delete')) {
180+
return true;
181+
}
182+
// Check if one of the start build actions is displayed
167183
return row.showStartPipelineAction() || row.showStartBuildAction();
168184

169185
case 'Pod':
@@ -187,7 +203,18 @@
187203
if (canI(row.rgv, 'update')) {
188204
return true;
189205
}
190-
206+
// Create Binding is displayed.
207+
if (enableTechPreviewFeature('pod_presets') &&
208+
!_.isEmpty(row.state.bindableServiceInstances) &&
209+
canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'create')) {
210+
return true;
211+
}
212+
// Delete Binding is displayed.
213+
if (enableTechPreviewFeature('pod_presets') &&
214+
!_.isEmpty(deleteableBindings) &&
215+
canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'delete')) {
216+
return true;
217+
}
191218
return false;
192219
}
193220
};

app/scripts/directives/overview/serviceInstanceRow.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'BindingService',
1010
'ListRowUtils',
1111
'NotificationsService',
12+
'AuthorizationService',
1213
ServiceInstanceRow
1314
],
1415
controllerAs: 'row',
@@ -25,7 +26,8 @@
2526
DataService,
2627
BindingService,
2728
ListRowUtils,
28-
NotificationsService) {
29+
NotificationsService,
30+
AuthorizationService) {
2931
var row = this;
3032
_.extend(row, ListRowUtils.ui);
3133

@@ -55,6 +57,22 @@
5557

5658
row.isBindable = BindingService.isServiceBindable(row.apiObject, row.state.serviceClasses);
5759

60+
row.actionsDropdownVisible = function() {
61+
// We can create bindings
62+
if (row.isBindable && AuthorizationService.canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'create')) {
63+
return true;
64+
}
65+
// We can delete bindings
66+
if (!_.isEmpty(row.deleteableBindings) && AuthorizationService.canI({resource: 'bindings', group: 'servicecatalog.k8s.io'}, 'delete')) {
67+
return true;
68+
}
69+
// We can delete instances
70+
if (AuthorizationService.canI({resource: 'instances', group: 'servicecatalog.k8s.io'}, 'delete')) {
71+
return true;
72+
}
73+
return false;
74+
};
75+
5876
row.closeOverlayPanel = function() {
5977
_.set(row, 'overlay.panelVisible', false);
6078
};

app/views/overview/_list-row-actions.html

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
<li ng-if="'deploymentconfigs' | canI : 'update'" role="menuitem">
2424
<a ng-href="{{row.apiObject | editResourceURL}}">Edit</a>
2525
</li>
26-
<!-- FIXME: Can't enable canI checks on svc cat resources until we have aggregation
27-
<li ng-if="(row.state.serviceInstances | hashSize) > 0 && {resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create'" role="menuitem"> -->
28-
<li ng-if="('pod_presets' | enableTechPreviewFeature) && row.state.bindableServiceInstances.length" role="menuitem">
26+
<li ng-if="('pod_presets' | enableTechPreviewFeature)
27+
&& row.state.bindableServiceInstances.length
28+
&& ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')" role="menuitem">
2929
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">Create Binding</a>
3030
</li>
31-
<li ng-if="('pod_presets' | enableTechPreviewFeature) && row.state.deleteableBindingsByApplicationUID[row.apiObject.metadata.uid].length" role="menuitem">
31+
<li ng-if="('pod_presets' | enableTechPreviewFeature)
32+
&& row.state.deleteableBindingsByApplicationUID[row.apiObject.metadata.uid].length
33+
&& ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'delete')" role="menuitem">
3234
<a href="" ng-click="row.showOverlayPanel('unbindService', {target: row.apiObject})">Delete Binding</a>
3335
</li>
3436
<li ng-if="row.current && ('deploymentconfigs/log' | canI : 'get')" role="menuitem">
@@ -61,6 +63,16 @@
6163
<li role="menuitem" ng-if="row.rgv | canI : 'update'">
6264
<a ng-href="{{row.apiObject | editYamlURL}}">Edit YAML</a>
6365
</li>
66+
<li ng-if="('pod_presets' | enableTechPreviewFeature)
67+
&& row.state.bindableServiceInstances.length
68+
&& ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')" role="menuitem">
69+
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">Create Binding</a>
70+
</li>
71+
<li ng-if="('pod_presets' | enableTechPreviewFeature)
72+
&& row.state.deleteableBindingsByApplicationUID[row.apiObject.metadata.uid].length
73+
&& ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'delete')" role="menuitem">
74+
<a href="" ng-click="row.showOverlayPanel('unbindService', {target: row.apiObject})">Delete Binding</a>
75+
</li>
6476
<li ng-if="(pod = row.firstPod(row.current)) && ('pods/log' | canI : 'get')" role="menuitem">
6577
<a ng-href="{{pod | navigateResourceURL}}?tab=logs">View Logs</a>
6678
</li>

app/views/overview/_service-bindings.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
service-instances="$ctrl.serviceInstances"
88
secrets="$ctrl.secrets">
99
</overview-service-binding>
10-
<div ng-if="$ctrl.bindableServiceInstances | size">
10+
<div ng-if="($ctrl.bindableServiceInstances | size) && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
1111
<a href="" ng-click="$ctrl.createBinding()" role="button">Create Binding</a>
1212
</div>
1313
</div>

app/views/overview/_service-instance-row.html

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ <h3>
1616
<div class="list-pf-details">
1717
<div ng-if="!row.expanded">
1818
<div class="hidden-xs hidden-sm">
19-
<span ng-if="!row.bindings.length && row.isBindable">
19+
<span ng-if="!row.bindings.length
20+
&& row.isBindable
21+
&& ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
2022
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">Create Binding</a>
2123
</span>
2224
<span ng-if="row.bindings.length" class="component-label">Bindings</span>
@@ -46,20 +48,20 @@ <h3>
4648
</div>
4749
</div>
4850
</div>
49-
<div class="list-pf-actions">
51+
<div class="list-pf-actions" ng-if="row.actionsDropdownVisible()">
5052
<div uib-dropdown>
5153
<a href=""
5254
uib-dropdown-toggle
5355
class="actions-dropdown-kebab"><i class="fa fa-ellipsis-v"></i><span class="sr-only">Actions</span></a>
5456
<ul class="dropdown-menu dropdown-menu-right" uib-dropdown-menu role="menu">
55-
<li role="menuitem" ng-if="('pod_presets' | enableTechPreviewFeature) && row.isBindable">
57+
<li role="menuitem" ng-if="row.isBindable && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
5658
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">Create Binding</a>
5759
</li>
58-
<li role="menuitem" ng-if="('pod_presets' | enableTechPreviewFeature) && row.deleteableBindings.length">
60+
<li role="menuitem" ng-if="row.deleteableBindings.length && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'delete')">
5961
<a href="" ng-click="row.showOverlayPanel('unbindService', {target: row.apiObject})">Delete Binding</a>
6062
</li>
6163
<li role="menuitem">
62-
<a href="" ng-click="row.deprovision()" role="button">Delete</a>
64+
<a href="" ng-click="row.deprovision()" role="button" ng-if="{resource: 'instances', group: 'servicecatalog.k8s.io'} | canI : 'delete'">Delete</a>
6365
</li>
6466
</ul>
6567
</div>
@@ -140,11 +142,16 @@ <h3>
140142
</a>
141143
</div>
142144
</div>
143-
<div class="row" ng-if="row.isBindable">
145+
<div class="row" ng-if="row.isBindable && ({resource: 'bindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
144146
<div class="col-sm-12">
145147
<a href="" ng-click="row.showOverlayPanel('bindService', {target: row.apiObject})">Create Binding</a>
146148
</div>
147149
</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>
153+
</div>
154+
</div>
148155
</div>
149156
</div>
150157
</div>

dist/scripts/scripts.js

Lines changed: 59 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12980,26 +12980,26 @@ templateUrl:"views/overview/_builds.html"
1298012980
function a(a, b, c, d, e, f, g, h) {
1298112981
var i = this;
1298212982
_.extend(i, f.ui);
12983-
var j = a("canI"), k = a("deploymentIsInProgress"), l = a("isBinaryBuild"), m = function(a) {
12983+
var j = a("canI"), k = a("deploymentIsInProgress"), l = a("isBinaryBuild"), m = a("enableTechPreviewFeature"), n = function(a) {
1298412984
var b = _.get(a, "spec.triggers");
1298512985
_.isEmpty(b) || (i.imageChangeTriggers = _.filter(b, function(a) {
1298612986
return "ImageChange" === a.type && _.get(a, "imageChangeParams.automatic");
1298712987
}));
12988-
}, n = function(a) {
12989-
a && !i.current && "DeploymentConfig" !== a.kind && "Deployment" !== a.kind && (i.current = a);
1299012988
}, o = function(a) {
12991-
i.rgv = c.objectToResourceGroupVersion(a), n(a), m(a);
12989+
a && !i.current && "DeploymentConfig" !== a.kind && "Deployment" !== a.kind && (i.current = a);
12990+
}, p = function(a) {
12991+
i.rgv = c.objectToResourceGroupVersion(a), o(a), n(a);
1299212992
};
1299312993
i.$onChanges = function(a) {
12994-
a.apiObject && o(a.apiObject.currentValue);
12994+
a.apiObject && p(a.apiObject.currentValue);
1299512995
};
12996-
var p = [], q = function(a) {
12996+
var q = [], r = function(a) {
1299712997
if (!i.state.hpaByResource) return null;
1299812998
var b = _.get(a, "kind"), c = _.get(a, "metadata.name");
12999-
return _.get(i.state.hpaByResource, [ b, c ], p);
12999+
return _.get(i.state.hpaByResource, [ b, c ], q);
1300013000
};
1300113001
i.$doCheck = function() {
13002-
i.notifications = f.getNotifications(i.apiObject, i.state), i.hpa = q(i.apiObject), i.current && _.isEmpty(i.hpa) && (i.hpa = q(i.current));
13002+
i.notifications = f.getNotifications(i.apiObject, i.state), i.hpa = r(i.apiObject), i.current && _.isEmpty(i.hpa) && (i.hpa = r(i.current));
1300313003
var a = _.get(i, "apiObject.metadata.uid");
1300413004
a && (i.services = _.get(i, [ "state", "servicesByObjectUID", a ]), i.buildConfigs = _.get(i, [ "state", "buildConfigsByObjectUID", a ]), i.bindings = _.get(i, [ "state", "bindingsByApplicationUID", a ]));
1300513005
var b, c = _.get(i, "apiObject.kind");
@@ -13015,16 +13015,28 @@ return !!_.isEmpty(i.hpa) && !i.isDeploymentInProgress();
1301513015
}, i.isDeploymentInProgress = function() {
1301613016
return !(!i.current || !i.previous) || k(i.current);
1301713017
}, i.canIDoAny = function() {
13018-
var a = _.get(i, "apiObject.kind");
13018+
var a = _.get(i, "apiObject.kind"), b = _.get(i, "apiObject.metadata.uid"), c = _.get(i.state.deleteableBindingsByApplicationUID, b);
1301913019
switch (a) {
1302013020
case "DeploymentConfig":
13021-
return !!j("deploymentconfigs/instantiate", "create") || (!!j("deploymentconfigs", "update") || (!(!i.current || !j("deploymentconfigs/log", "get")) || (i.showStartPipelineAction() || i.showStartBuildAction())));
13021+
return !!j("deploymentconfigs/instantiate", "create") || (!!j("deploymentconfigs", "update") || (!(!i.current || !j("deploymentconfigs/log", "get")) || (!(!m("pod_presets") || _.isEmpty(i.state.bindableServiceInstances) || !j({
13022+
resource:"bindings",
13023+
group:"servicecatalog.k8s.io"
13024+
}, "create")) || (!(!m("pod_presets") || _.isEmpty(c) || !j({
13025+
resource:"bindings",
13026+
group:"servicecatalog.k8s.io"
13027+
}, "delete")) || (i.showStartPipelineAction() || i.showStartBuildAction())))));
1302213028

1302313029
case "Pod":
1302413030
return !!j("pods/log", "get") || !!j("pods", "update");
1302513031

1302613032
default:
13027-
return !(!i.firstPod(i.current) || !j("pods/log", "get")) || !!j(i.rgv, "update");
13033+
return !(!i.firstPod(i.current) || !j("pods/log", "get")) || (!!j(i.rgv, "update") || (!(!m("pod_presets") || _.isEmpty(i.state.bindableServiceInstances) || !j({
13034+
resource:"bindings",
13035+
group:"servicecatalog.k8s.io"
13036+
}, "create")) || !(!m("pod_presets") || _.isEmpty(c) || !j({
13037+
resource:"bindings",
13038+
group:"servicecatalog.k8s.io"
13039+
}, "delete"))));
1302813040
}
1302913041
}, i.showStartBuildAction = function() {
1303013042
if (!_.isEmpty(i.pipelines)) return !1;
@@ -13100,29 +13112,40 @@ hidePipelines:"<"
1310013112
templateUrl:"views/overview/_list-row.html"
1310113113
});
1310213114
}(), function() {
13103-
function a(a, b, c, d, e, f) {
13104-
var g = this;
13105-
_.extend(g, e.ui);
13106-
var h = a("getErrorDetails"), i = a("serviceInstanceDisplayName"), j = function() {
13107-
var a = g.apiObject.spec.serviceClassName;
13108-
return _.get(g, [ "state", "serviceClasses", a, "description" ]);
13109-
};
13110-
g.$doCheck = function() {
13111-
g.notifications = e.getNotifications(g.apiObject, g.state), g.displayName = i(g.apiObject, g.serviceClasses), g.description = j();
13112-
}, g.$onChanges = function(a) {
13113-
a.bindings && (g.deleteableBindings = _.reject(g.bindings, "metadata.deletionTimestamp"));
13114-
}, g.getSecretForBinding = function(a) {
13115-
return a && _.get(g, [ "state", "secrets", a.spec.secretName ]);
13116-
}, g.isBindable = d.isServiceBindable(g.apiObject, g.state.serviceClasses), g.closeOverlayPanel = function() {
13117-
_.set(g, "overlay.panelVisible", !1);
13118-
}, g.showOverlayPanel = function(a, b) {
13119-
_.set(g, "overlay.panelVisible", !0), _.set(g, "overlay.panelName", a), _.set(g, "overlay.state", b);
13120-
}, g.deprovision = function() {
13115+
function a(a, b, c, d, e, f, g) {
13116+
var h = this;
13117+
_.extend(h, e.ui);
13118+
var i = a("getErrorDetails"), j = a("serviceInstanceDisplayName"), k = function() {
13119+
var a = h.apiObject.spec.serviceClassName;
13120+
return _.get(h, [ "state", "serviceClasses", a, "description" ]);
13121+
};
13122+
h.$doCheck = function() {
13123+
h.notifications = e.getNotifications(h.apiObject, h.state), h.displayName = j(h.apiObject, h.serviceClasses), h.description = k();
13124+
}, h.$onChanges = function(a) {
13125+
a.bindings && (h.deleteableBindings = _.reject(h.bindings, "metadata.deletionTimestamp"));
13126+
}, h.getSecretForBinding = function(a) {
13127+
return a && _.get(h, [ "state", "secrets", a.spec.secretName ]);
13128+
}, h.isBindable = d.isServiceBindable(h.apiObject, h.state.serviceClasses), h.actionsDropdownVisible = function() {
13129+
return !(!h.isBindable || !g.canI({
13130+
resource:"bindings",
13131+
group:"servicecatalog.k8s.io"
13132+
}, "create")) || (!(_.isEmpty(h.deleteableBindings) || !g.canI({
13133+
resource:"bindings",
13134+
group:"servicecatalog.k8s.io"
13135+
}, "delete")) || !!g.canI({
13136+
resource:"instances",
13137+
group:"servicecatalog.k8s.io"
13138+
}, "delete"));
13139+
}, h.closeOverlayPanel = function() {
13140+
_.set(h, "overlay.panelVisible", !1);
13141+
}, h.showOverlayPanel = function(a, b) {
13142+
_.set(h, "overlay.panelVisible", !0), _.set(h, "overlay.panelName", a), _.set(h, "overlay.state", b);
13143+
}, h.deprovision = function() {
1312113144
var a = {
1312213145
alerts:{
1312313146
deprovision:{
1312413147
type:"error",
13125-
message:"Service '" + g.apiObject.spec.serviceClassName + "' will be deleted and no longer available."
13148+
message:"Service '" + h.apiObject.spec.serviceClassName + "' will be deleted and no longer available."
1312613149
}
1312713150
},
1312813151
detailsMarkup:"Delete Service?",
@@ -13143,28 +13166,28 @@ return a;
1314313166
f.hideNotification("deprovision-service-error"), c["delete"]({
1314413167
group:"servicecatalog.k8s.io",
1314513168
resource:"instances"
13146-
}, g.apiObject.metadata.name, {
13147-
namespace:g.apiObject.metadata.namespace
13169+
}, h.apiObject.metadata.name, {
13170+
namespace:h.apiObject.metadata.namespace
1314813171
}, {
1314913172
propagationPolicy:null
1315013173
}).then(function() {
1315113174
f.addNotification({
1315213175
type:"success",
13153-
message:"Successfully deleted " + g.apiObject.metadata.name + "."
13176+
message:"Successfully deleted " + h.apiObject.metadata.name + "."
1315413177
});
1315513178
}, function(a) {
1315613179
f.addNotification({
1315713180
id:"deprovision-service-error",
1315813181
type:"error",
13159-
message:"An error occurred while deleting " + g.apiObject.metadata.name + ".",
13160-
details:h(a)
13182+
message:"An error occurred while deleting " + h.apiObject.metadata.name + ".",
13183+
details:i(a)
1316113184
});
1316213185
});
1316313186
});
1316413187
};
1316513188
}
1316613189
angular.module("openshiftConsole").component("serviceInstanceRow", {
13167-
controller:[ "$filter", "$uibModal", "DataService", "BindingService", "ListRowUtils", "NotificationsService", a ],
13190+
controller:[ "$filter", "$uibModal", "DataService", "BindingService", "ListRowUtils", "NotificationsService", "AuthorizationService", a ],
1316813191
controllerAs:"row",
1316913192
bindings:{
1317013193
apiObject:"<",

0 commit comments

Comments
 (0)