From 69a1fb499747ce6df4ee693a8323d4a4692bdaf9 Mon Sep 17 00:00:00 2001 From: Samuel Padgett Date: Fri, 22 Sep 2017 09:36:44 -0400 Subject: [PATCH] [DO NOT MERGE] [WIP] Adopt service catalog API changes --- app/scripts/controllers/overview.js | 18 ++++++- app/scripts/controllers/serviceInstance.js | 50 ++++++++----------- app/scripts/directives/bindService.js | 24 +++++++-- .../directives/overview/serviceInstanceRow.js | 13 ++++- .../directives/resourceServiceBindings.js | 10 +++- app/scripts/filters/resources.js | 33 ++++++++---- app/views/browse/service-instance.html | 14 +++--- app/views/directives/_service-binding.html | 2 +- app/views/overview/_service-instance-row.html | 10 ++-- 9 files changed, 112 insertions(+), 62 deletions(-) diff --git a/app/scripts/controllers/overview.js b/app/scripts/controllers/overview.js index 04ba315c5a..815d972af4 100644 --- a/app/scripts/controllers/overview.js +++ b/app/scripts/controllers/overview.js @@ -1150,8 +1150,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 = []; @@ -1359,6 +1363,16 @@ function OverviewController($scope, 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({ + group: 'servicecatalog.k8s.io', + resource: 'serviceplans' + }, {}, function(servicePlans) { + state.servicePlans = servicePlans.by('metadata.name'); + }); } var samplePipelineTemplate = Constants.SAMPLE_PIPELINE_TEMPLATE; diff --git a/app/scripts/controllers/serviceInstance.js b/app/scripts/controllers/serviceInstance.js index 8d05681d83..d18e639559 100644 --- a/app/scripts/controllers/serviceInstance.js +++ b/app/scripts/controllers/serviceInstance.js @@ -11,7 +11,6 @@ angular.module('openshiftConsole') $scope.projectName = $routeParams.project; $scope.serviceInstance = null; $scope.serviceClass = null; - $scope.serviceClasses = null; $scope.breadcrumbs = [ { @@ -27,25 +26,11 @@ angular.module('openshiftConsole') var watches = []; var updateBreadcrumbs = function() { - if(!$scope.serviceInstance || !$scope.serviceClasses) { - return; - } - $scope.breadcrumbs.push({ - title: $filter('serviceInstanceDisplayName')($scope.serviceInstance, $scope.serviceClasses) + title: $scope.displayName }); }; - var updateServiceClassMetadata = function() { - if(!$scope.serviceInstance || !$scope.serviceClasses) { - 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 }); - }; - var serviceResolved = function(service, action) { $scope.loaded = true; $scope.serviceInstance = service; @@ -57,7 +42,16 @@ angular.module('openshiftConsole') }; } - updateServiceClassMetadata(); + var planName = service.spec.planName; + if (!$scope.plan || $scope.plan.metadata.name !== planName) { + $scope.plan = null; + DataService.get({ + group: 'servicecatalog.k8s.io', + resource: 'serviceplans' + }, planName, {}).then(function(servicePlan) { + $scope.plan = servicePlan; + }); + } }; ProjectsService @@ -72,15 +66,21 @@ angular.module('openshiftConsole') resource: 'serviceinstances' }, $routeParams.instance, context, { errorNotification: false }) .then(function(service) { - serviceResolved(service); - updateBreadcrumbs(); + + DataService.get({ + group: 'servicecatalog.k8s.io', + resource: 'serviceclasses' + }, service.spec.serviceClassName, {}).then(function(serviceClass) { + $scope.serviceClass = serviceClass; + $scope.displayName = $filter('serviceClassDisplayName')(serviceClass) || service.metadata.name; + updateBreadcrumbs(); + }); watches.push(DataService.watchObject({ group: 'servicecatalog.k8s.io', resource: 'serviceinstances' }, $routeParams.instance, context, serviceResolved)); - }, function(error) { $scope.loaded = true; $scope.alerts["load"] = { @@ -90,18 +90,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); }); - })); }); diff --git a/app/scripts/directives/bindService.js b/app/scripts/directives/bindService.js index ee4dd00966..4ec374a88f 100644 --- a/app/scripts/directives/bindService.js +++ b/app/scripts/directives/bindService.js @@ -50,10 +50,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(); @@ -157,8 +162,8 @@ 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'); + ctrl.plan = ctrl.servicePlans[instance.spec.planName]; + ctrl.parameterSchema = _.get(ctrl.plan, 'spec.serviceInstanceCredentialCreateParameterSchema'); bindParametersStep.hidden = !_.has(ctrl.parameterSchema, 'properties'); ctrl.nextTitle = bindParametersStep.hidden ? 'Bind' : 'Next >'; ctrl.hideBack = bindParametersStep.hidden; @@ -185,6 +190,15 @@ sortServiceInstances(); }); + // We'll need service plans for binding parameters. + // TODO: Only load plans for selected instance. + DataService.list({ + group: 'servicecatalog.k8s.io', + resource: 'serviceplans' + }, {}).then(function(plans) { + ctrl.servicePlans = plans.by('metadata.name'); + }); + if (ctrl.target.kind === 'ServiceInstance') { ctrl.bindType = "secret-only"; ctrl.appToBind = null; diff --git a/app/scripts/directives/overview/serviceInstanceRow.js b/app/scripts/directives/overview/serviceInstanceRow.js index 5e65e3f5be..478e903a4c 100644 --- a/app/scripts/directives/overview/serviceInstanceRow.js +++ b/app/scripts/directives/overview/serviceInstanceRow.js @@ -32,6 +32,14 @@ var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName'); + var getServiceClass = function() { + return _.get(row, ['state','serviceClasses', row.apiObject.spec.serviceClassName]); + }; + + var getServicePlan = function() { + return _.get(row, ['state', 'servicePlans', row.apiObject.spec.planName]); + }; + var updateInstanceStatus = function() { if (_.get(row.apiObject, 'metadata.deletionTimestamp')) { row.instanceStatus = 'deleted'; @@ -49,8 +57,9 @@ 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.isBindable = BindingService.isServiceBindable(row.apiObject, row.serviceClass, row.servicePlan); }; row.$onChanges = function(changes) { diff --git a/app/scripts/directives/resourceServiceBindings.js b/app/scripts/directives/resourceServiceBindings.js index e0eb66d228..ac7b988585 100644 --- a/app/scripts/directives/resourceServiceBindings.js +++ b/app/scripts/directives/resourceServiceBindings.js @@ -22,6 +22,7 @@ angular.module('openshiftConsole').component('resourceServiceBindings', { function ResourceServiceBindings($filter, DataService, BindingService, CatalogService) { var ctrl = this; var enableTechPreviewFeature = $filter('enableTechPreviewFeature'); + var servicePlans; ctrl.bindings = []; ctrl.bindableServiceInstances = []; @@ -44,7 +45,7 @@ function ResourceServiceBindings($filter, DataService, BindingService, CatalogSe }; var sortServiceInstances = function() { - ctrl.bindableServiceInstances = BindingService.filterBindableServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses); + ctrl.bindableServiceInstances = BindingService.filterBindableServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses, servicePlans); ctrl.orderedServiceInstances = BindingService.sortServiceInstances(ctrl.serviceInstances, ctrl.serviceClasses); }; @@ -89,6 +90,13 @@ function ResourceServiceBindings($filter, DataService, BindingService, CatalogSe ctrl.serviceClasses = serviceClasses.by('metadata.name'); sortServiceInstances(); }); + + DataService.list({ + group: 'servicecatalog.k8s.io', + resource: 'serviceplans' + }, {}, function(planData) { + servicePlans = planData.by('metadata.name'); + }); } }; diff --git a/app/scripts/filters/resources.js b/app/scripts/filters/resources.js index 39f5d3db5f..611f369cca 100644 --- a/app/scripts/filters/resources.js +++ b/app/scripts/filters/resources.js @@ -1316,17 +1316,30 @@ angular.module('openshiftConsole') return !_.isEmpty(alternateBackends); }; }) - // .filter('serviceClassDisplayName', function() { - // return function(serviceClass) { - // TODO: this filter may also be useful. - // }; - // }) - .filter('serviceInstanceDisplayName', function() { + .filter('serviceClassDisplayName', function() { + return function(serviceClass) { + var serviceClassDisplayName = _.get(serviceClass, 'spec.externalMetadata.displayName'); + if (serviceClassDisplayName) { + return serviceClassDisplayName; + } + + var serviceClassExternalName = _.get(serviceClass, 'spec.externalName'); + if (serviceClassExternalName) { + return serviceClassExternalName; + } + + return _.get(serviceClass, 'metadata.name'); + }; + }) + .filter('serviceInstanceDisplayName', function(serviceClassDisplayNameFilter) { return function(instance, serviceClasses) { - var serviceClassName = instance.spec.serviceClassName; - var instanceName = instance.metadata.name; - var serviceClassDisplayName = _.get(serviceClasses, [serviceClassName, 'externalMetadata', 'displayName']); - return serviceClassDisplayName || serviceClassName || instanceName; + var serviceClassName = _.get(instance, 'spec.serviceClassName'); + var serviceClass = _.get(serviceClasses, [serviceClassName]); + if (serviceClass) { + return serviceClassDisplayNameFilter(serviceClass); + } + + return _.get(instance, 'metadata.name'); }; }) .filter('serviceInstanceStatus', function(isServiceInstanceReadyFilter) { diff --git a/app/views/browse/service-instance.html b/app/views/browse/service-instance.html index 480463dd71..66542f6298 100644 --- a/app/views/browse/service-instance.html +++ b/app/views/browse/service-instance.html @@ -28,8 +28,10 @@

- {{serviceInstance | serviceInstanceDisplayName:serviceClasses}} - {{serviceInstance.metadata.name}} + {{displayName}} + + {{serviceInstance.metadata.name}} +
created
@@ -54,7 +56,7 @@

-

+

Status:
@@ -65,10 +67,10 @@

{{serviceInstance | serviceInstanceConditionMessage}}
-
Description:
+
Description:
-

-

+

+

diff --git a/app/views/directives/_service-binding.html b/app/views/directives/_service-binding.html index b9ab1e89f9..d24b4abd8c 100644 --- a/app/views/directives/_service-binding.html +++ b/app/views/directives/_service-binding.html @@ -9,7 +9,7 @@

{{$ctrl.binding.metadata.name}} - {{$ctrl.serviceClass.externalMetadata.displayName || $ctrl.serviceClass.metadata.name}} + {{$ctrl.serviceClass.spec.externalMetadata.displayName || $ctrl.serviceClass.metadata.name}} {{$ctrl.binding.spec.instanceRef.name}} diff --git a/app/views/overview/_service-instance-row.html b/app/views/overview/_service-instance-row.html index 78cfcbcd39..94217f747a 100644 --- a/app/views/overview/_service-instance-row.html +++ b/app/views/overview/_service-instance-row.html @@ -135,11 +135,11 @@