Skip to content

Commit f950d1c

Browse files
Merge pull request #2273 from spadgett/is-bindable
Automatic merge from submit-queue. Fix issues with bindings widget for service instances - Don't show "Create Binding" when service instance is not bindable - Fix empty content when there are no bindings and you don't have permission to add a binding - Don't request all service classes and plans to show bindings. This is a large amount of data when we usually have the service class and plan already Fixes #2271 Fixes #2270
2 parents de72b67 + fabf66e commit f950d1c

11 files changed

+180
-46
lines changed

app/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ <h1>JavaScript Required</h1>
323323
<script src="scripts/directives/replicas.js"></script>
324324
<script src="scripts/directives/resources.js"></script>
325325
<script src="scripts/directives/resourceServiceBindings.js"></script>
326+
<script src="scripts/directives/serviceInstanceBindings.js"></script>
326327
<script src="scripts/directives/nav.js"></script>
327328
<script src="scripts/directives/alerts.js"></script>
328329
<script src="scripts/directives/parseError.js"></script>

app/scripts/controllers/serviceInstance.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ angular.module('openshiftConsole')
55
$filter,
66
$routeParams,
77
APIService,
8+
BindingService,
89
DataService,
910
ProjectsService,
1011
ServiceInstancesService) {
@@ -24,14 +25,15 @@ angular.module('openshiftConsole')
2425
if ($scope.serviceInstance.metadata.deletionTimestamp) {
2526
return;
2627
}
27-
ServiceInstancesService.deprovision($scope.serviceInstance);
28+
ServiceInstancesService.deprovision($scope.serviceInstance, $scope.bindings);
2829
};
2930

3031
var watches = [];
3132

3233
var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName');
3334

3435
// API Versions
36+
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
3537
$scope.serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
3638

3739
var updateBreadcrumbs = function() {
@@ -91,6 +93,11 @@ angular.module('openshiftConsole')
9193
.then(function(serviceInstance) {
9294
serviceResolved(serviceInstance);
9395
watches.push(DataService.watchObject($scope.serviceInstancesVersion, $routeParams.instance, context, serviceResolved));
96+
97+
watches.push(DataService.watch(serviceBindingsVersion, context, function(bindingsData) {
98+
var allBindings = bindingsData.by('metadata.name');
99+
$scope.bindings = BindingService.getBindingsForResource(allBindings, serviceInstance);
100+
}));
94101
}, function(error) {
95102
$scope.loaded = true;
96103
$scope.alerts["load"] = {

app/scripts/directives/resourceServiceBindings.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function ResourceServiceBindings($filter,
3333
ctrl.bindableServiceInstances = [];
3434
ctrl.serviceClasses = [];
3535
ctrl.serviceInstances = [];
36-
ctrl.showBindings = CatalogService.SERVICE_CATALOG_ENABLED && (_.get(ctrl, 'apiObject.kind') === 'ServiceInstance' || enableTechPreviewFeature('pod_presets'));
36+
ctrl.showBindings = CatalogService.SERVICE_CATALOG_ENABLED && enableTechPreviewFeature('pod_presets');
3737

3838
var limitWatches = $filter('isIE')() || $filter('isEdge')();
3939
var DEFAULT_POLL_INTERVAL = 60 * 1000; // milliseconds
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
'use strict';
2+
3+
angular.module('openshiftConsole').component('serviceInstanceBindings', {
4+
controller: [
5+
'$filter',
6+
'APIService',
7+
'BindingService',
8+
ServiceInstanceBindings
9+
],
10+
controllerAs: '$ctrl',
11+
bindings: {
12+
showHeader: '<?',
13+
project: '<',
14+
bindings: '<',
15+
serviceInstance: '<',
16+
serviceClass: '<',
17+
servicePlan: '<'
18+
},
19+
templateUrl: 'views/directives/service-instance-bindings.html'
20+
});
21+
22+
23+
function ServiceInstanceBindings($filter,
24+
APIService,
25+
BindingService) {
26+
var ctrl = this;
27+
var canI = $filter('canI');
28+
var serviceBindingsVersion = ctrl.serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
29+
30+
var checkBindable = function() {
31+
ctrl.bindable = canI(serviceBindingsVersion, 'create') &&
32+
BindingService.isServiceBindable(ctrl.serviceInstance,
33+
ctrl.serviceClass,
34+
ctrl.servicePlan);
35+
};
36+
37+
ctrl.createBinding = function() {
38+
ctrl.overlayPanelVisible = true;
39+
};
40+
41+
ctrl.closeOverlayPanel = function() {
42+
ctrl.overlayPanelVisible = false;
43+
};
44+
45+
ctrl.$onChanges = function() {
46+
checkBindable();
47+
};
48+
}

app/views/browse/service-instance.html

+8-5
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,15 @@ <h1 class="contains-actions">
8686
</dd>
8787
</dl>
8888
</div>
89-
<div class="col-lg-6">
90-
<resource-service-bindings
89+
<div class="col-lg-6 mar-bottom-xl">
90+
<service-instance-bindings
91+
show-header="true"
9192
project="project"
92-
project-context="projectContext"
93-
api-object="serviceInstance">
94-
</resource-service-bindings>
93+
bindings="bindings"
94+
service-instance="serviceInstance"
95+
service-class="serviceClass"
96+
service-plan="plan">
97+
</service-instance-bindings>
9598
</div>
9699
</div>
97100
<annotations annotations="serviceInstance.metadata.annotations"></annotations>

app/views/directives/resource-service-bindings.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@ <h3>Bindings</h3>
88
service-classes="$ctrl.serviceClasses"
99
service-instances="$ctrl.serviceInstances">
1010
</service-binding>
11-
<div ng-if="(($ctrl.apiObject.kind === 'ServiceInstance') || ($ctrl.bindableServiceInstances | size)) &&
11+
<div ng-if="($ctrl.bindableServiceInstances | size) &&
1212
($ctrl.serviceBindingsVersion | canI : 'create') &&
1313
!$ctrl.apiObject.metadata.deletionTimestamp">
1414
<a href="" ng-click="$ctrl.createBinding()" role="button">
1515
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
1616
Create Binding
1717
</a>
1818
</div>
19-
<div ng-if="!$ctrl.apiObject.metadata.deletionTimestamp && ($ctrl.apiObject.kind !== 'ServiceInstance') && !($ctrl.bindableServiceInstances | size)">
19+
<div ng-if="!$ctrl.apiObject.metadata.deletionTimestamp && !($ctrl.bindableServiceInstances | size)">
2020
<span>You must have a bindable service in your namespace in order to create bindings.</span>
2121
<div>
2222
<a href="./">Browse Catalog</a>
2323
</div>
2424
</div>
25-
<div ng-if="($ctrl.apiObject.kind !== 'ServiceInstance') && !($ctrl.bindings | size) && ($ctrl.bindableServiceInstances | size) && !($ctrl.serviceBindingsVersion | canI : 'create')">
25+
<div ng-if="!($ctrl.bindings | size) && ($ctrl.bindableServiceInstances | size) && !($ctrl.serviceBindingsVersion | canI : 'create')">
2626
<span>There are no service bindings.</span>
2727
</div>
2828
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<div ng-if="$ctrl.bindable || ($ctrl.bindings | size)">
2+
<h3 ng-if="$ctrl.showHeader">Bindings</h3>
3+
<service-binding
4+
ng-repeat="binding in $ctrl.bindings track by (binding | uid)"
5+
namespace="binding.metadata.namespace"
6+
binding="binding"
7+
ref-api-object="$ctrl.serviceInstance">
8+
</service-binding>
9+
<div ng-if="$ctrl.bindable">
10+
<a href="" ng-click="$ctrl.createBinding()" role="button">
11+
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
12+
Create Binding
13+
</a>
14+
</div>
15+
<div ng-if="!$ctrl.bindable && !($ctrl.bindings | size)">
16+
<span>There are no service bindings.</span>
17+
</div>
18+
</div>
19+
<overlay-panel show-panel="$ctrl.overlayPanelVisible" handle-close="$ctrl.closeOverlayPanel">
20+
<bind-service target="$ctrl.serviceInstance"
21+
project="$ctrl.project"
22+
on-close="$ctrl.closeOverlayPanel"></bind-service>
23+
</overlay-panel>

app/views/overview/_service-bindings.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
service-instances="$ctrl.serviceInstances"
1111
secrets="$ctrl.secrets">
1212
</service-binding>
13-
<div ng-if="!$ctrl.refApiObject.metadata.deletionTimestamp && (($ctrl.refApiObject.kind === 'ServiceInstance') || ($ctrl.bindableServiceInstances | size)) && ({resource: 'servicebindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
13+
<div ng-if="!$ctrl.refApiObject.metadata.deletionTimestamp && ($ctrl.bindableServiceInstances | size) && ({resource: 'servicebindings', group: 'servicecatalog.k8s.io'} | canI : 'create')">
1414
<a href="" ng-click="$ctrl.createBinding()" role="button">
1515
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
1616
Create Binding

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,16 @@ <h3>
149149
</div>
150150
</div>
151151
</div>
152-
<overview-service-bindings
153-
ng-if="row.isBindable || row.bindings"
154-
section-title="Bindings"
155-
ref-api-object="row.apiObject"
156-
namespace="row.apiObject.metadata.namespace"
157-
bindings="row.bindings"
158-
bindable-service-instances="row.state.bindableServiceInstances"
159-
service-classes="row.state.serviceClasses"
160-
create-binding="row.showOverlayPanel('bindService', {target: row.apiObject})">
161-
</overview-service-bindings>
152+
<div ng-if="row.isBindable || (row.bindings | size)">
153+
<div class="section-title">Bindings</div>
154+
<service-instance-bindings
155+
project="row.state.project"
156+
bindings="row.bindings"
157+
service-instance="row.apiObject"
158+
service-class="row.serviceClass"
159+
service-plan="row.servicePlan">
160+
</service-instance-bindings>
161+
</div>
162162
</div>
163163
</div>
164164
</div>

dist/scripts/scripts.js

+44-16
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ u.unwatchAll(at), $(window).off(".overview");
492492

493493
function ResourceServiceBindings(e, t, n, a, r) {
494494
var o, i = this, s = e("enableTechPreviewFeature");
495-
i.bindings = [], i.bindableServiceInstances = [], i.serviceClasses = [], i.serviceInstances = [], i.showBindings = a.SERVICE_CATALOG_ENABLED && ("ServiceInstance" === _.get(i, "apiObject.kind") || s("pod_presets"));
495+
i.bindings = [], i.bindableServiceInstances = [], i.serviceClasses = [], i.serviceInstances = [], i.showBindings = a.SERVICE_CATALOG_ENABLED && s("pod_presets");
496496
var c = e("isIE")() || e("isEdge")(), l = [], u = e("canI"), d = i.serviceBindingsVersion = t.getPreferredVersion("servicebindings"), m = t.getPreferredVersion("clusterserviceclasses"), p = t.getPreferredVersion("serviceinstances"), f = t.getPreferredVersion("clusterserviceplans"), g = function() {
497497
i.apiObject && i.bindings && (i.bindings = n.getBindingsForResource(i.bindings, i.apiObject));
498498
}, v = function() {
@@ -527,6 +527,19 @@ r.unwatchAll(l);
527527
};
528528
}
529529

530+
function ServiceInstanceBindings(e, t, n) {
531+
var a = this, r = e("canI"), o = a.serviceBindingsVersion = t.getPreferredVersion("servicebindings"), i = function() {
532+
a.bindable = r(o, "create") && n.isServiceBindable(a.serviceInstance, a.serviceClass, a.servicePlan);
533+
};
534+
a.createBinding = function() {
535+
a.overlayPanelVisible = !0;
536+
}, a.closeOverlayPanel = function() {
537+
a.overlayPanelVisible = !1;
538+
}, a.$onChanges = function() {
539+
i();
540+
};
541+
}
542+
530543
angular.isUndefined(window.OPENSHIFT_CONSTANTS) && (window.OPENSHIFT_CONSTANTS = {}), angular.extend(window.OPENSHIFT_CONSTANTS, {
531544
HELP_BASE_URL: "https://docs.openshift.org/latest/",
532545
HELP: {
@@ -6308,46 +6321,49 @@ e.serviceInstances = t.select(e.unfilteredServiceInstances), r();
63086321
i.unwatchAll(u);
63096322
});
63106323
}));
6311-
} ]), angular.module("openshiftConsole").controller("ServiceInstanceController", [ "$scope", "$filter", "$routeParams", "APIService", "DataService", "ProjectsService", "ServiceInstancesService", function(e, t, n, a, r, o, i) {
6324+
} ]), angular.module("openshiftConsole").controller("ServiceInstanceController", [ "$scope", "$filter", "$routeParams", "APIService", "BindingService", "DataService", "ProjectsService", "ServiceInstancesService", function(e, t, n, a, r, o, i, s) {
63126325
e.alerts = {}, e.projectName = n.project, e.serviceInstance = null, e.serviceClass = null, e.breadcrumbs = [ {
63136326
title: "Provisioned Services",
63146327
link: "project/" + n.project + "/browse/service-instances"
63156328
} ], e.deprovision = function() {
6316-
e.serviceInstance.metadata.deletionTimestamp || i.deprovision(e.serviceInstance);
6329+
e.serviceInstance.metadata.deletionTimestamp || s.deprovision(e.serviceInstance, e.bindings);
63176330
};
6318-
var s = [], c = t("serviceInstanceDisplayName");
6331+
var c = [], l = t("serviceInstanceDisplayName"), u = a.getPreferredVersion("servicebindings");
63196332
e.serviceInstancesVersion = a.getPreferredVersion("serviceinstances");
6320-
var l, u = function() {
6333+
var d, m = function() {
63216334
e.breadcrumbs.push({
63226335
title: e.displayName
63236336
});
6324-
}, d = function() {
6325-
e.serviceClass || l || (l = i.fetchServiceClassForInstance(e.serviceInstance).then(function(t) {
6326-
e.serviceClass = t, e.displayName = c(e.serviceInstance, t), u(), l = null;
6337+
}, p = function() {
6338+
e.serviceClass || d || (d = s.fetchServiceClassForInstance(e.serviceInstance).then(function(t) {
6339+
e.serviceClass = t, e.displayName = l(e.serviceInstance, t), m(), d = null;
63276340
}));
6328-
}, m = function() {
6329-
i.isCurrentPlan(e.serviceInstance, e.plan) || i.fetchServicePlanForInstance(e.serviceInstance).then(function(t) {
6341+
}, f = function() {
6342+
s.isCurrentPlan(e.serviceInstance, e.plan) || s.fetchServicePlanForInstance(e.serviceInstance).then(function(t) {
63306343
e.plan = t;
63316344
});
6332-
}, p = function(t, n) {
6345+
}, g = function(t, n) {
63336346
e.loaded = !0, e.serviceInstance = t, "DELETED" === n && (e.alerts.deleted = {
63346347
type: "warning",
63356348
message: "This provisioned service has been deleted."
6336-
}), d(), m();
6349+
}), p(), f();
63376350
};
6338-
o.get(n.project).then(_.spread(function(a, o) {
6339-
e.project = a, e.projectContext = o, r.get(e.serviceInstancesVersion, n.instance, o, {
6351+
i.get(n.project).then(_.spread(function(a, i) {
6352+
e.project = a, e.projectContext = i, o.get(e.serviceInstancesVersion, n.instance, i, {
63406353
errorNotification: !1
63416354
}).then(function(t) {
6342-
p(t), s.push(r.watchObject(e.serviceInstancesVersion, n.instance, o, p));
6355+
g(t), c.push(o.watchObject(e.serviceInstancesVersion, n.instance, i, g)), c.push(o.watch(u, i, function(n) {
6356+
var a = n.by("metadata.name");
6357+
e.bindings = r.getBindingsForResource(a, t);
6358+
}));
63436359
}, function(n) {
63446360
e.loaded = !0, e.alerts.load = {
63456361
type: "error",
63466362
message: "The provisioned service details could not be loaded.",
63476363
details: t("getErrorDetails")(n)
63486364
};
63496365
}), e.$on("$destroy", function() {
6350-
r.unwatchAll(s);
6366+
o.unwatchAll(c);
63516367
});
63526368
}));
63536369
} ]), angular.module("openshiftConsole").controller("SecretsController", [ "$routeParams", "$scope", "DataService", "ProjectsService", function(e, t, n, a) {
@@ -10379,6 +10395,18 @@ apiObject: "<",
1037910395
createBinding: "&"
1038010396
},
1038110397
templateUrl: "views/directives/resource-service-bindings.html"
10398+
}), angular.module("openshiftConsole").component("serviceInstanceBindings", {
10399+
controller: [ "$filter", "APIService", "BindingService", ServiceInstanceBindings ],
10400+
controllerAs: "$ctrl",
10401+
bindings: {
10402+
showHeader: "<?",
10403+
project: "<",
10404+
bindings: "<",
10405+
serviceInstance: "<",
10406+
serviceClass: "<",
10407+
servicePlan: "<"
10408+
},
10409+
templateUrl: "views/directives/service-instance-bindings.html"
1038210410
}), angular.module("openshiftConsole").directive("sidebar", [ "$location", "$filter", "$timeout", "$rootScope", "$routeParams", "AuthorizationService", "Constants", "HTMLService", function(e, t, n, a, r, o, i, s) {
1038310411
var c = function(e, t) {
1038410412
return e.href === t || _.some(e.prefixes, function(e) {

0 commit comments

Comments
 (0)