Skip to content

Commit

Permalink
Adopt service catalog API changes
Browse files Browse the repository at this point in the history
  • Loading branch information
spadgett committed Oct 4, 2017
1 parent a9de5c9 commit de3b4ea
Show file tree
Hide file tree
Showing 13 changed files with 162 additions and 105 deletions.
39 changes: 25 additions & 14 deletions app/scripts/controllers/overview.js
Expand Up @@ -63,6 +63,7 @@ function OverviewController($scope,

// Filters used by this controller.
var annotation = $filter('annotation');
var canI = $filter('canI');
var getBuildConfigName = $filter('buildConfigForBuild');
var deploymentIsInProgress = $filter('deploymentIsInProgress');
var imageObjectRef = $filter('imageObjectRef');
Expand All @@ -71,6 +72,12 @@ function OverviewController($scope,
var label = $filter('label');
var getPodTemplate = $filter('podTemplate');

// API versions
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
var servicePlansVersion = APIService.getPreferredVersion('clusterserviceplans');

var deploymentsByUID;
var imageStreams;
var labelSuggestions = {};
Expand Down Expand Up @@ -314,7 +321,7 @@ function OverviewController($scope,
};

// Updated on viewBy changes to include the app label when appropriate.
var filterFields = ['metadata.name', 'spec.serviceClassName'];
var filterFields = ['metadata.name', 'spec.externalServiceClassName'];
var filterByName = function(items) {
return KeywordService.filterForKeywords(items, filterFields, state.filterKeywords);
};
Expand Down Expand Up @@ -1150,8 +1157,12 @@ function OverviewController($scope,
};

var sortServiceInstances = function() {
state.bindableServiceInstances = BindingService.filterBindableServiceInstances(state.serviceInstances, state.serviceClasses);
state.orderedServiceInstances = BindingService.sortServiceInstances(state.serviceInstances, state.serviceClasses);
state.bindableServiceInstances =
BindingService.filterBindableServiceInstances(state.serviceInstances,
state.serviceClasses,
state.servicePlans);
state.orderedServiceInstances =
BindingService.sortServiceInstances(state.serviceInstances, state.serviceClasses);
};

var watches = [];
Expand Down Expand Up @@ -1312,7 +1323,6 @@ function OverviewController($scope,
setQuotaNotifications();
}, {poll: true, pollInterval: DEFAULT_POLL_INTERVAL}));

var canI = $filter('canI');
// The canI check on watch should be temporary until we have a different solution for handling secret parameters
if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstances', group: 'servicecatalog.k8s.io'}, 'watch')) {
watches.push(DataService.watch({
Expand All @@ -1330,11 +1340,8 @@ function OverviewController($scope,
}, {poll: limitWatches, pollInterval: DEFAULT_POLL_INTERVAL}));
}

if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'}, 'watch')) {
watches.push(DataService.watch({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstancecredentials'
}, context, function(bindings) {
if (CatalogService.SERVICE_CATALOG_ENABLED && canI(serviceBindingsVersion, 'watch')) {
watches.push(DataService.watch(serviceBindingsVersion, context, function(bindings) {
state.bindings = bindings.by('metadata.name');
overview.bindingsByInstanceRef = _.groupBy(state.bindings, 'spec.instanceRef.name');
groupBindings();
Expand All @@ -1347,18 +1354,22 @@ function OverviewController($scope,
state.limitRanges = response.by("metadata.name");
});

if (CatalogService.SERVICE_CATALOG_ENABLED && canI({resource: 'serviceinstances', group: 'servicecatalog.k8s.io'}, 'watch')) {
if (CatalogService.SERVICE_CATALOG_ENABLED && canI(serviceInstancesVersion, 'watch')) {
// TODO: update to behave like ImageStreamResolver
// - we may not even need to list these... perhaps just fetch the ones we need when needed
// If we can't watch instances don't bother getting service classes either
DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, {}, function(serviceClasses) {
DataService.list(serviceClassesVersion, {}, function(serviceClasses) {
state.serviceClasses = serviceClasses.by('metadata.name');
sortServiceInstances();
updateFilter();
});

// TODO: update to behave like ImageStreamResolver
// - we may not even need to list these... perhaps just fetch the ones we need when needed
// If we can't watch instances don't bother getting service classes either
DataService.list(servicePlansVersion, {}, function(servicePlans) {
state.servicePlans = servicePlans.by('metadata.name');
});
}

var samplePipelineTemplate = Constants.SAMPLE_PIPELINE_TEMPLATE;
Expand Down
68 changes: 35 additions & 33 deletions app/scripts/controllers/serviceInstance.js
Expand Up @@ -4,14 +4,14 @@ angular.module('openshiftConsole')
.controller('ServiceInstanceController', function ($scope,
$filter,
$routeParams,
APIService,
DataService,
ProjectsService,
ServiceInstancesService) {
$scope.alerts = {};
$scope.projectName = $routeParams.project;
$scope.serviceInstance = null;
$scope.serviceClass = null;
$scope.serviceClasses = null;

$scope.breadcrumbs = [
{
Expand All @@ -26,24 +26,45 @@ angular.module('openshiftConsole')

var watches = [];

var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
var servicePlansVersion = APIService.getPreferredVersion('clusterserviceplans');
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');

var updateBreadcrumbs = function() {
if(!$scope.serviceInstance || !$scope.serviceClasses) {
$scope.breadcrumbs.push({
title: $scope.displayName
});
};

var requestServiceClass = _.once(function(serviceClassName) {
DataService.get(serviceClassesVersion, serviceClassName, {}).then(function(serviceClass) {
$scope.serviceClass = serviceClass;
$scope.displayName = $filter('serviceInstanceDisplayName')($scope.serviceInstance, serviceClass);
updateBreadcrumbs();
});
});

var updateServiceClass = function() {
if ($scope.serviceClass) {
return;
}

$scope.breadcrumbs.push({
title: $filter('serviceInstanceDisplayName')($scope.serviceInstance, $scope.serviceClasses)
});
var serviceClassName = _.get($scope.serviceInstance, 'spec.serviceClassRef.name');
requestServiceClass(serviceClassName);
};

var updateServiceClassMetadata = function() {
if(!$scope.serviceInstance || !$scope.serviceClasses) {
var updatePlan = function() {
var servicePlanName = _.get($scope.serviceInstance, 'spec.servicePlanRef.name');
if (!servicePlanName) {
return;
}

var serviceClassName = _.get($scope.serviceInstance.spec, 'serviceClassName');
$scope.serviceClass = _.get($scope.serviceClasses, [serviceClassName]);
$scope.plan = _.find(_.get($scope.serviceClass, 'plans'), {name: $scope.serviceInstance.spec.planName });
if (!$scope.plan || $scope.plan.metadata.name !== servicePlanName) {
$scope.plan = null;
DataService.get(servicePlansVersion, servicePlanName, {}).then(function(plan) {
$scope.plan = plan;
});
}
};

var serviceResolved = function(service, action) {
Expand All @@ -57,7 +78,8 @@ angular.module('openshiftConsole')
};
}

updateServiceClassMetadata();
updateServiceClass();
updatePlan();
};

ProjectsService
Expand All @@ -67,20 +89,10 @@ angular.module('openshiftConsole')
$scope.projectContext = context;

DataService
.get({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstances'
}, $routeParams.instance, context, { errorNotification: false })
.get(serviceInstancesVersion, $routeParams.instance, context, { errorNotification: false })
.then(function(service) {

serviceResolved(service);
updateBreadcrumbs();

watches.push(DataService.watchObject({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstances'
}, $routeParams.instance, context, serviceResolved));

watches.push(DataService.watchObject(serviceInstancesVersion, $routeParams.instance, context, serviceResolved));
}, function(error) {
$scope.loaded = true;
$scope.alerts["load"] = {
Expand All @@ -90,18 +102,8 @@ angular.module('openshiftConsole')
};
});

DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, {}, function(serviceClasses) {
$scope.serviceClasses = serviceClasses.by('metadata.name');
updateServiceClassMetadata();
updateBreadcrumbs();
});

$scope.$on('$destroy', function(){
DataService.unwatchAll(watches);
});

}));
});
23 changes: 11 additions & 12 deletions app/scripts/controllers/serviceInstances.js
Expand Up @@ -30,24 +30,25 @@ angular.module('openshiftConsole')
$scope.unfilteredServiceInstances = BindingService.sortServiceInstances($scope.unfilteredServiceInstances, $scope.serviceClasses);
};

$scope.getServiceClass = function(serviceInstance) {
var serviceClassName = _.get(serviceInstance, 'spec.serviceClassRef.name');
return _.get($scope, ['serviceClasses', serviceClassName]);
};

ProjectsService
.get($routeParams.project)
.then(_.spread(function(project, context) {
$scope.project = project;
$scope.projectContext = context;

watches.push(DataService.watch({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstancecredentials'
}, context, function(bindings) {
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
watches.push(DataService.watch(serviceBindingsVersion, context, function(bindings) {
var bindingsByName = bindings.by('metadata.name');
$scope.bindingsByInstanceRef = _.groupBy(bindingsByName, 'spec.instanceRef.name');
}));

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

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

DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, {}, function(serviceClasses) {
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
DataService.list(serviceClassesVersion, {}, function(serviceClasses) {
$scope.serviceClasses = serviceClasses.by('metadata.name');
sortServiceInstances();
updateFilter();
Expand Down
44 changes: 28 additions & 16 deletions app/scripts/directives/bindService.js
Expand Up @@ -5,6 +5,7 @@
controller: [
'$scope',
'$filter',
'APIService',
'ApplicationsService',
'DataService',
'BindingService',
Expand All @@ -21,6 +22,7 @@

function BindService($scope,
$filter,
APIService,
ApplicationsService,
DataService,
BindingService) {
Expand Down Expand Up @@ -50,10 +52,15 @@
};

var sortServiceInstances = function() {
// wait till both service instances and service classes are available so that the sort is stable and items dont jump around
// wait till both service instances and service classes are available so
// that the sort is stable and items dont jump around
if (ctrl.serviceClasses && ctrl.serviceInstances) {
ctrl.serviceInstances = BindingService.filterBindableServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses);
ctrl.orderedServiceInstances = BindingService.sortServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses);
ctrl.serviceInstances =
BindingService.filterBindableServiceInstances(ctrl.serviceInstances,
ctrl.serviceClasses,
ctrl.servicePlans);
ctrl.orderedServiceInstances =
BindingService.sortServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses);

if (!ctrl.serviceToBind) {
preselectService();
Expand Down Expand Up @@ -109,10 +116,8 @@
namespace: _.get(ctrl.target, 'metadata.namespace')
};

DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstances'
}, context).then(function(instances) {
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
DataService.list(serviceInstancesVersion, context).then(function(instances) {
ctrl.serviceInstances = instances.by('metadata.name');
sortServiceInstances();
});
Expand Down Expand Up @@ -146,7 +151,7 @@
};

var updateInstance = function() {
if (!ctrl.serviceClasses) {
if (!ctrl.serviceClasses || !ctrl.servicePlans) {
return;
}

Expand All @@ -155,10 +160,11 @@
return;
}

ctrl.serviceClass = ctrl.serviceClasses[instance.spec.serviceClassName];
ctrl.serviceClassName = instance.spec.serviceClassName;
ctrl.plan = BindingService.getPlanForInstance(instance, ctrl.serviceClass);
ctrl.parameterSchema = _.get(ctrl.plan, 'serviceInstanceCredentialCreateParameterSchema');
var serviceClassName = _.get(instance, 'spec.serviceClassRef.name');
ctrl.serviceClass = ctrl.serviceClasses[serviceClassName];
var servicePlanName = _.get(instance, 'spec.servicePlanRef.name');
ctrl.plan = ctrl.servicePlans[servicePlanName];
ctrl.parameterSchema = _.get(ctrl.plan, 'spec.serviceInstanceCredentialCreateParameterSchema');
bindParametersStep.hidden = !_.has(ctrl.parameterSchema, 'properties');
ctrl.nextTitle = bindParametersStep.hidden ? 'Bind' : 'Next >';
ctrl.hideBack = bindParametersStep.hidden;
Expand All @@ -176,15 +182,21 @@
ctrl.hideBack = bindParametersStep.hidden;

// We will want ServiceClasses either way for display purposes
DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, {}).then(function(serviceClasses) {
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
DataService.list(serviceClassesVersion, {}).then(function(serviceClasses) {
ctrl.serviceClasses = serviceClasses.by('metadata.name');
updateInstance();
sortServiceInstances();
});

// We'll need service plans for binding parameters.
// TODO: Only load plans for selected instance.
var servicePlansVersion = APIService.getPreferredVersion('clusterserviceplans');
DataService.list(servicePlansVersion, {}).then(function(plans) {
ctrl.servicePlans = plans.by('metadata.name');
updateInstance();
});

if (ctrl.target.kind === 'ServiceInstance') {
ctrl.bindType = "secret-only";
ctrl.appToBind = null;
Expand Down
17 changes: 14 additions & 3 deletions app/scripts/directives/overview/serviceInstanceRow.js
Expand Up @@ -32,6 +32,16 @@

var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName');

var getServiceClass = function() {
var serviceClassName = _.get(row, 'apiObject.spec.serviceClassRef.name');
return _.get(row, ['state','serviceClasses', serviceClassName]);
};

var getServicePlan = function() {
var servicePlanName = _.get(row, 'apiObject.spec.servicePlanRef.name');
return _.get(row, ['state', 'servicePlans', servicePlanName]);
};

var updateInstanceStatus = function() {
if (_.get(row.apiObject, 'metadata.deletionTimestamp')) {
row.instanceStatus = 'deleted';
Expand All @@ -48,9 +58,10 @@
updateInstanceStatus();

row.notifications = ListRowUtils.getNotifications(row.apiObject, row.state);
row.displayName = serviceInstanceDisplayName(row.apiObject, row.state.serviceClasses);
row.isBindable = BindingService.isServiceBindable(row.apiObject, row.state.serviceClasses);
row.serviceClass = _.get(row, ['state', 'serviceClasses', row.apiObject.spec.serviceClassName]);
row.serviceClass = getServiceClass();
row.servicePlan = getServicePlan();
row.displayName = serviceInstanceDisplayName(row.apiObject, row.serviceClass);
row.isBindable = BindingService.isServiceBindable(row.apiObject, row.serviceClass, row.servicePlan);
};

row.$onChanges = function(changes) {
Expand Down

0 comments on commit de3b4ea

Please sign in to comment.