Skip to content

Commit ea7477e

Browse files
author
OpenShift Bot
authored
Merge pull request #2155 from spadgett/plans-resource
Merged by openshift-bot
2 parents 436cb11 + a04fb60 commit ea7477e

22 files changed

+1006
-886
lines changed

app/scripts/controllers/overview.js

+63-31
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ angular.module('openshiftConsole').controller('OverviewController', [
77
'AlertMessageService',
88
'APIService',
99
'AppsService',
10+
'BindingService',
1011
'BuildsService',
1112
'CatalogService',
1213
'Constants',
@@ -23,9 +24,9 @@ angular.module('openshiftConsole').controller('OverviewController', [
2324
'OwnerReferencesService',
2425
'PodsService',
2526
'ProjectsService',
26-
'BindingService',
2727
'ResourceAlertsService',
2828
'RoutesService',
29+
'ServiceInstancesService',
2930
OverviewController
3031
]);
3132

@@ -35,6 +36,7 @@ function OverviewController($scope,
3536
AlertMessageService,
3637
APIService,
3738
AppsService,
39+
BindingService,
3840
BuildsService,
3941
CatalogService,
4042
Constants,
@@ -51,9 +53,9 @@ function OverviewController($scope,
5153
OwnerReferencesService,
5254
PodsService,
5355
ProjectsService,
54-
BindingService,
5556
ResourceAlertsService,
56-
RoutesService) {
57+
RoutesService,
58+
ServiceInstancesService) {
5759
var overview = this;
5860
var limitWatches = $filter('isIE')() || $filter('isEdge')();
5961
var DEFAULT_POLL_INTERVAL = 60 * 1000; // milliseconds
@@ -63,6 +65,7 @@ function OverviewController($scope,
6365

6466
// Filters used by this controller.
6567
var annotation = $filter('annotation');
68+
var canI = $filter('canI');
6669
var getBuildConfigName = $filter('buildConfigForBuild');
6770
var deploymentIsInProgress = $filter('deploymentIsInProgress');
6871
var imageObjectRef = $filter('imageObjectRef');
@@ -71,6 +74,12 @@ function OverviewController($scope,
7174
var label = $filter('label');
7275
var getPodTemplate = $filter('podTemplate');
7376

77+
// API versions
78+
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
79+
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
80+
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
81+
var servicePlansVersion = APIService.getPreferredVersion('clusterserviceplans');
82+
7483
var deploymentsByUID;
7584
var imageStreams;
7685
var labelSuggestions = {};
@@ -102,6 +111,8 @@ function OverviewController($scope,
102111
routesByService: {},
103112
servicesByObjectUID: {},
104113
serviceInstances: {},
114+
serviceClasses: {},
115+
servicePlans: {},
105116
bindingsByInstanceRef: {},
106117
bindingsByApplicationUID: {},
107118
applicationsByBinding: {},
@@ -314,7 +325,7 @@ function OverviewController($scope,
314325
};
315326

316327
// Updated on viewBy changes to include the app label when appropriate.
317-
var filterFields = ['metadata.name', 'spec.serviceClassName'];
328+
var filterFields = ['metadata.name', 'spec.externalServiceClassName'];
318329
var filterByName = function(items) {
319330
return KeywordService.filterForKeywords(items, filterFields, state.filterKeywords);
320331
};
@@ -1150,8 +1161,12 @@ function OverviewController($scope,
11501161
};
11511162

11521163
var sortServiceInstances = function() {
1153-
state.bindableServiceInstances = BindingService.filterBindableServiceInstances(state.serviceInstances, state.serviceClasses);
1154-
state.orderedServiceInstances = BindingService.sortServiceInstances(state.serviceInstances, state.serviceClasses);
1164+
state.bindableServiceInstances =
1165+
BindingService.filterBindableServiceInstances(state.serviceInstances,
1166+
state.serviceClasses,
1167+
state.servicePlans);
1168+
state.orderedServiceInstances =
1169+
BindingService.sortServiceInstances(state.serviceInstances, state.serviceClasses);
11551170
};
11561171

11571172
var watches = [];
@@ -1312,29 +1327,60 @@ function OverviewController($scope,
13121327
setQuotaNotifications();
13131328
}, {poll: true, pollInterval: DEFAULT_POLL_INTERVAL}));
13141329

1315-
var canI = $filter('canI');
1330+
var fetchServiceClass, fetchServicePlan;
1331+
1332+
// Avoid requesting the same service class or service plan twice.
1333+
var serviceClassPromises = {};
1334+
var servicePlanPromises = {};
1335+
13161336
// The canI check on watch should be temporary until we have a different solution for handling secret parameters
1317-
if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstances', group: 'servicecatalog.k8s.io'}, 'watch')) {
1318-
watches.push(DataService.watch({
1319-
group: 'servicecatalog.k8s.io',
1320-
resource: 'serviceinstances'
1321-
}, context, function(serviceInstances) {
1337+
if (CatalogService.SERVICE_CATALOG_ENABLED && canI(serviceInstancesVersion, 'watch')) {
1338+
1339+
// Get the service class for this instance.
1340+
fetchServiceClass = function(instance) {
1341+
var serviceClassName = ServiceInstancesService.getServiceClassNameForInstance(instance);
1342+
1343+
// Check if we already have the service class or if a request is already in flight.
1344+
if (!_.has(state, ['serviceClasses', serviceClassName]) && !serviceClassPromises[serviceClassName]) {
1345+
serviceClassPromises[serviceClassName] = DataService.get(serviceClassesVersion, serviceClassName, {}).then(function(serviceClass) {
1346+
state.serviceClasses[serviceClassName] = serviceClass;
1347+
}).finally(function() {
1348+
delete servicePlanPromises[serviceClassName];
1349+
});
1350+
}
1351+
};
1352+
1353+
// Get the service plan for this instance.
1354+
fetchServicePlan = function(instance) {
1355+
var servicePlanName = ServiceInstancesService.getServicePlanNameForInstance(instance);
1356+
1357+
// Check if we already have the service plan or if a request is already in flight.
1358+
if (!_.has(state, ['servicePlans', servicePlanName]) && !servicePlanPromises[servicePlanName]) {
1359+
servicePlanPromises[servicePlanName] = DataService.get(servicePlansVersion, servicePlanName, {}).then(function(servicePlan) {
1360+
state.servicePlans[servicePlanName] = servicePlan;
1361+
}).finally(function() {
1362+
delete servicePlanPromises[servicePlanName];
1363+
});
1364+
}
1365+
};
1366+
1367+
watches.push(DataService.watch(serviceInstancesVersion, context, function(serviceInstances) {
13221368
state.serviceInstances = serviceInstances.by('metadata.name');
13231369
_.each(state.serviceInstances, function(instance) {
13241370
var notifications = ResourceAlertsService.getServiceInstanceAlerts(instance);
13251371
setNotifications(instance, notifications);
1372+
1373+
fetchServiceClass(instance);
1374+
fetchServicePlan(instance);
13261375
});
13271376
sortServiceInstances();
13281377
updateLabelSuggestions(state.serviceInstances);
13291378
updateFilter();
13301379
}, {poll: limitWatches, pollInterval: DEFAULT_POLL_INTERVAL}));
13311380
}
13321381

1333-
if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'}, 'watch')) {
1334-
watches.push(DataService.watch({
1335-
group: 'servicecatalog.k8s.io',
1336-
resource: 'serviceinstancecredentials'
1337-
}, context, function(bindings) {
1382+
if (CatalogService.SERVICE_CATALOG_ENABLED && canI(serviceBindingsVersion, 'watch')) {
1383+
watches.push(DataService.watch(serviceBindingsVersion, context, function(bindings) {
13381384
state.bindings = bindings.by('metadata.name');
13391385
overview.bindingsByInstanceRef = _.groupBy(state.bindings, 'spec.instanceRef.name');
13401386
groupBindings();
@@ -1347,20 +1393,6 @@ function OverviewController($scope,
13471393
state.limitRanges = response.by("metadata.name");
13481394
});
13491395

1350-
if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstances', group: 'servicecatalog.k8s.io'}, 'watch')) {
1351-
// TODO: update to behave like ImageStreamResolver
1352-
// - we may not even need to list these... perhaps just fetch the ones we need when needed
1353-
// If we can't watch instances don't bother getting service classes either
1354-
DataService.list({
1355-
group: 'servicecatalog.k8s.io',
1356-
resource: 'serviceclasses'
1357-
}, {}, function(serviceClasses) {
1358-
state.serviceClasses = serviceClasses.by('metadata.name');
1359-
sortServiceInstances();
1360-
updateFilter();
1361-
});
1362-
}
1363-
13641396
var samplePipelineTemplate = Constants.SAMPLE_PIPELINE_TEMPLATE;
13651397
if (samplePipelineTemplate) {
13661398
DataService.get("templates", samplePipelineTemplate.name, {

app/scripts/controllers/serviceInstance.js

+31-37
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ angular.module('openshiftConsole')
44
.controller('ServiceInstanceController', function ($scope,
55
$filter,
66
$routeParams,
7+
APIService,
78
DataService,
89
ProjectsService,
910
ServiceInstancesService) {
1011
$scope.alerts = {};
1112
$scope.projectName = $routeParams.project;
1213
$scope.serviceInstance = null;
1314
$scope.serviceClass = null;
14-
$scope.serviceClasses = null;
1515

1616
$scope.breadcrumbs = [
1717
{
@@ -26,29 +26,42 @@ angular.module('openshiftConsole')
2626

2727
var watches = [];
2828

29+
var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName');
30+
31+
// API Versions
32+
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
33+
2934
var updateBreadcrumbs = function() {
30-
if(!$scope.serviceInstance || !$scope.serviceClasses) {
35+
$scope.breadcrumbs.push({
36+
title: $scope.displayName
37+
});
38+
};
39+
40+
var updateServiceClass = function() {
41+
if ($scope.serviceClass) {
3142
return;
3243
}
3344

34-
$scope.breadcrumbs.push({
35-
title: $filter('serviceInstanceDisplayName')($scope.serviceInstance, $scope.serviceClasses)
45+
ServiceInstancesService.fetchServiceClassForInstance($scope.serviceInstance).then(function(serviceClass) {
46+
$scope.serviceClass = serviceClass;
47+
$scope.displayName = serviceInstanceDisplayName($scope.serviceInstance, serviceClass);
48+
updateBreadcrumbs();
3649
});
3750
};
3851

39-
var updateServiceClassMetadata = function() {
40-
if(!$scope.serviceInstance || !$scope.serviceClasses) {
52+
var updatePlan = function() {
53+
if (ServiceInstancesService.isCurrentPlan($scope.serviceInstance, $scope.plan)) {
4154
return;
4255
}
4356

44-
var serviceClassName = _.get($scope.serviceInstance.spec, 'serviceClassName');
45-
$scope.serviceClass = _.get($scope.serviceClasses, [serviceClassName]);
46-
$scope.plan = _.find(_.get($scope.serviceClass, 'plans'), {name: $scope.serviceInstance.spec.planName });
57+
ServiceInstancesService.fetchServicePlanForInstance($scope.serviceInstance).then(function(plan) {
58+
$scope.plan = plan;
59+
});
4760
};
4861

49-
var serviceResolved = function(service, action) {
62+
var serviceResolved = function(serviceInstance, action) {
5063
$scope.loaded = true;
51-
$scope.serviceInstance = service;
64+
$scope.serviceInstance = serviceInstance;
5265

5366
if (action === "DELETED") {
5467
$scope.alerts["deleted"] = {
@@ -57,7 +70,8 @@ angular.module('openshiftConsole')
5770
};
5871
}
5972

60-
updateServiceClassMetadata();
73+
updateServiceClass();
74+
updatePlan();
6175
};
6276

6377
ProjectsService
@@ -67,41 +81,21 @@ angular.module('openshiftConsole')
6781
$scope.projectContext = context;
6882

6983
DataService
70-
.get({
71-
group: 'servicecatalog.k8s.io',
72-
resource: 'serviceinstances'
73-
}, $routeParams.instance, context, { errorNotification: false })
74-
.then(function(service) {
75-
76-
serviceResolved(service);
77-
updateBreadcrumbs();
78-
79-
watches.push(DataService.watchObject({
80-
group: 'servicecatalog.k8s.io',
81-
resource: 'serviceinstances'
82-
}, $routeParams.instance, context, serviceResolved));
83-
84+
.get(serviceInstancesVersion, $routeParams.instance, context, { errorNotification: false })
85+
.then(function(serviceInstance) {
86+
serviceResolved(serviceInstance);
87+
watches.push(DataService.watchObject(serviceInstancesVersion, $routeParams.instance, context, serviceResolved));
8488
}, function(error) {
8589
$scope.loaded = true;
8690
$scope.alerts["load"] = {
8791
type: "error",
88-
message: "The service details could not be loaded.",
92+
message: "The provisioned service details could not be loaded.",
8993
details: $filter('getErrorDetails')(error)
9094
};
9195
});
9296

93-
DataService.list({
94-
group: 'servicecatalog.k8s.io',
95-
resource: 'serviceclasses'
96-
}, {}, function(serviceClasses) {
97-
$scope.serviceClasses = serviceClasses.by('metadata.name');
98-
updateServiceClassMetadata();
99-
updateBreadcrumbs();
100-
});
101-
10297
$scope.$on('$destroy', function(){
10398
DataService.unwatchAll(watches);
10499
});
105-
106100
}));
107101
});

app/scripts/controllers/serviceInstances.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,25 @@ angular.module('openshiftConsole')
3030
$scope.unfilteredServiceInstances = BindingService.sortServiceInstances($scope.unfilteredServiceInstances, $scope.serviceClasses);
3131
};
3232

33+
$scope.getServiceClass = function(serviceInstance) {
34+
var serviceClassName = _.get(serviceInstance, 'spec.serviceClassRef.name');
35+
return _.get($scope, ['serviceClasses', serviceClassName]);
36+
};
37+
3338
ProjectsService
3439
.get($routeParams.project)
3540
.then(_.spread(function(project, context) {
3641
$scope.project = project;
3742
$scope.projectContext = context;
3843

39-
watches.push(DataService.watch({
40-
group: 'servicecatalog.k8s.io',
41-
resource: 'serviceinstancecredentials'
42-
}, context, function(bindings) {
44+
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
45+
watches.push(DataService.watch(serviceBindingsVersion, context, function(bindings) {
4346
var bindingsByName = bindings.by('metadata.name');
4447
$scope.bindingsByInstanceRef = _.groupBy(bindingsByName, 'spec.instanceRef.name');
4548
}));
4649

47-
watches.push(DataService.watch({
48-
group: 'servicecatalog.k8s.io',
49-
resource: 'serviceinstances'
50-
}, context, function(serviceInstances) {
50+
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
51+
watches.push(DataService.watch(serviceInstancesVersion, context, function(serviceInstances) {
5152
$scope.emptyMessage = "No provisioned services to show";
5253
$scope.unfilteredServiceInstances = serviceInstances.by('metadata.name');
5354

@@ -61,10 +62,8 @@ angular.module('openshiftConsole')
6162
Logger.log("provisioned services (subscribe)", $scope.unfilteredServiceInstances);
6263
}));
6364

64-
DataService.list({
65-
group: 'servicecatalog.k8s.io',
66-
resource: 'serviceclasses'
67-
}, {}, function(serviceClasses) {
65+
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
66+
DataService.list(serviceClassesVersion, {}, function(serviceClasses) {
6867
$scope.serviceClasses = serviceClasses.by('metadata.name');
6968
sortServiceInstances();
7069
updateFilter();

0 commit comments

Comments
 (0)