Skip to content

Commit 278a077

Browse files
Service instance details configuration and edit
1 parent bb25fca commit 278a077

File tree

10 files changed

+413
-65
lines changed

10 files changed

+413
-65
lines changed

app/scripts/controllers/serviceInstance.js

+96-15
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ angular.module('openshiftConsole')
55
$filter,
66
$routeParams,
77
APIService,
8+
Catalog,
89
DataService,
910
ProjectsService,
11+
SecretsService,
1012
ServiceInstancesService) {
1113
$scope.alerts = {};
1214
$scope.projectName = $routeParams.project;
1315
$scope.serviceInstance = null;
1416
$scope.serviceClass = null;
17+
$scope.serviceClasses = null;
18+
$scope.editDialogShown = false;
1519

1620
$scope.breadcrumbs = [
1721
{
@@ -24,11 +28,28 @@ angular.module('openshiftConsole')
2428
ServiceInstancesService.deprovision($scope.serviceInstance);
2529
};
2630

31+
$scope.showEditDialog = function() {
32+
$scope.editDialogShown = true;
33+
};
34+
35+
$scope.showConfigValues = false;
36+
37+
$scope.toggleConfigValues = function() {
38+
$scope.showConfigValues = !$scope.showConfigValues;
39+
};
40+
41+
$scope.closeEditDialog = function() {
42+
$scope.editDialogShown = false;
43+
};
44+
2745
var watches = [];
46+
var secretWatcher;
2847

2948
var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName');
49+
var serviceInstanceReady = $filter('isServiceInstanceReady');
3050

3151
// API Versions
52+
var serviceClassesVersion = APIService.getPreferredVersion('clusterserviceclasses');
3253
var serviceInstancesVersion = APIService.getPreferredVersion('serviceinstances');
3354

3455
var updateBreadcrumbs = function() {
@@ -37,25 +58,68 @@ angular.module('openshiftConsole')
3758
});
3859
};
3960

40-
var updateServiceClass = function() {
41-
if ($scope.serviceClass) {
42-
return;
61+
var updateParameterData = function() {
62+
if (secretWatcher) {
63+
DataService.unwatch(secretWatcher);
64+
secretWatcher = undefined;
4365
}
4466

45-
ServiceInstancesService.fetchServiceClassForInstance($scope.serviceInstance).then(function(serviceClass) {
46-
$scope.serviceClass = serviceClass;
47-
$scope.displayName = serviceInstanceDisplayName($scope.serviceInstance, serviceClass);
48-
updateBreadcrumbs();
67+
$scope.parameterData = {};
68+
_.each(_.keys(_.get($scope.parameterSchema, 'properties')), function(key) {
69+
$scope.parameterData[key] = $scope.parameterSchema.properties[key].default;
70+
});
71+
72+
$scope.parameterData = angular.extend($scope.parameterData, _.get($scope.serviceInstance, 'spec.parameters', {}));
73+
74+
_.each(_.get($scope.serviceInstance, 'spec.parametersFrom'), function(parametersSource) {
75+
secretWatcher = DataService.watchObject("secrets", _.get(parametersSource, 'secretKeyRef.name'), $scope.projectContext, function (secret) {
76+
try {
77+
_.extend($scope.parameterData, JSON.parse(SecretsService.decodeSecretData(secret.data).parameters));
78+
} catch (e) {
79+
}
80+
});
4981
});
5082
};
5183

52-
var updatePlan = function() {
53-
if (ServiceInstancesService.isCurrentPlan($scope.serviceInstance, $scope.plan)) {
84+
var updateParameterSchema = function() {
85+
$scope.parameterFormDefinition = angular.copy(_.get($scope.plan, 'spec.externalMetadata.schemas.service_instance.create.openshift_form_definition'));
86+
87+
$scope.parameterSchema = angular.copy(_.get($scope.plan, 'spec.instanceCreateParameterSchema'));
88+
$scope.parameterSchema.readonly = true;
89+
$scope.parameterSchema.required = [];
90+
91+
_.each(_.get($scope.parameterSchema, 'properties'), function(property) {
92+
property.description = undefined;
93+
property.title = property.title + ":";
94+
});
95+
96+
// TODO: Find some plans and schemas that are updateable
97+
// var planUpdatable = _.get($scope.plan, 'spec.instanceUpdateParameterSchema') || (_.get($scope.serviceClass, 'spec.planUpdatable') && (_.size($scope.servicePlans) > 1));
98+
var planUpdatable = _.get($scope.plan, 'spec.instanceCreateParameterSchema') || (_.get($scope.serviceClass, 'spec.planUpdatable') && (_.size($scope.servicePlans) > 1));
99+
100+
$scope.editAvailable = planUpdatable && serviceInstanceReady($scope.serviceInstance) && !_.get($scope.serviceInstance, 'metadata.deletionTimestamp');
101+
};
102+
103+
var updateServiceClass = function() {
104+
if(!$scope.serviceInstance || !$scope.serviceClasses) {
54105
return;
55106
}
56107

57-
ServiceInstancesService.fetchServicePlanForInstance($scope.serviceInstance).then(function(plan) {
58-
$scope.plan = plan;
108+
var serviceClassName = _.get($scope.serviceInstance.spec, 'serviceClassRef.name');
109+
$scope.serviceClass = _.get($scope.serviceClasses, [serviceClassName]);
110+
$scope.displayName = serviceInstanceDisplayName($scope.serviceInstance, $scope.serviceClass);
111+
updateBreadcrumbs();
112+
113+
Catalog.getServicePlans().then(function(plans) {
114+
plans = plans.by('metadata.name');
115+
var plansByServiceClassName = Catalog.groupPlansByServiceClassName(plans);
116+
$scope.servicePlans = plansByServiceClassName[$scope.serviceClass.metadata.name];
117+
118+
var servicePlanName = _.get($scope.serviceInstance, 'spec.servicePlanRef.name');
119+
$scope.plan = plans[servicePlanName];
120+
121+
updateParameterSchema();
122+
updateParameterData();
59123
});
60124
};
61125

@@ -71,7 +135,6 @@ angular.module('openshiftConsole')
71135
}
72136

73137
updateServiceClass();
74-
updatePlan();
75138
};
76139

77140
ProjectsService
@@ -80,6 +143,8 @@ angular.module('openshiftConsole')
80143
$scope.project = project;
81144
$scope.projectContext = context;
82145

146+
147+
83148
DataService
84149
.get(serviceInstancesVersion, $routeParams.instance, context, { errorNotification: false })
85150
.then(function(serviceInstance) {
@@ -94,8 +159,24 @@ angular.module('openshiftConsole')
94159
};
95160
});
96161

97-
$scope.$on('$destroy', function(){
98-
DataService.unwatchAll(watches);
162+
DataService.list(serviceClassesVersion, {}, function(serviceClasses) {
163+
$scope.serviceClasses = serviceClasses.by('metadata.name');
164+
updateServiceClass();
165+
updateBreadcrumbs();
99166
});
100-
}));
167+
}, function(error) {
168+
$scope.loaded = true;
169+
$scope.alerts["load"] = {
170+
type: "error",
171+
message: "The service details could not be loaded.",
172+
details: $filter('getErrorDetails')(error)
173+
};
174+
}));
175+
176+
$scope.$on('$destroy', function(){
177+
DataService.unwatchAll(watches);
178+
if (secretWatcher) {
179+
DataService.unwatch(secretWatcher);
180+
}
181+
});
101182
});

app/scripts/directives/serviceBinding.js

+47-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
(function() {
44
angular.module('openshiftConsole').component('serviceBinding', {
55
controller: [
6+
'APIService',
7+
'DataService',
8+
'SecretsService',
69
ServiceBinding
710
],
811
controllerAs: '$ctrl',
@@ -17,22 +20,62 @@
1720
templateUrl: 'views/directives/_service-binding.html'
1821
});
1922

20-
function ServiceBinding() {
23+
function ServiceBinding(APIService, DataService, SecretsService) {
2124
var ctrl = this;
25+
ctrl.showParameterValues = false;
26+
27+
var context = {
28+
namespace: ctrl.namespace
29+
};
30+
31+
var updateParameterData = function() {
32+
ctrl.parameterData = angular.copy(_.get(ctrl.binding, 'spec.parameters', {}));
33+
34+
_.each(_.get(ctrl.binding, 'spec.parametersFrom'), function(parametersSource) {
35+
DataService.get("secrets", _.get(parametersSource, 'secretKeyRef.name'), context).then(function(secret) {
36+
try {
37+
_.extend(ctrl.parameterData, SecretsService.decodeSecretData(secret.data).parameters);
38+
} catch (e) {
39+
}
40+
});
41+
});
42+
};
43+
44+
var updateParameterSchema = function() {
45+
var resource = APIService.getPreferredVersion('clusterserviceplans');
46+
DataService.get(resource, _.get(ctrl.serviceInstance, 'spec.servicePlanRef.name'), context).then(function(servicePlan) {
47+
// TODO: Is there a form definition for this?
48+
ctrl.bindParameterSchema = angular.copy(_.get(servicePlan, 'spec.serviceInstanceCredentialCreateParameterSchema'));
49+
ctrl.bindParameterSchema.readonly = true;
50+
_.each(_.get(ctrl.bindParameterSchema, 'properties'), function(property) {
51+
property.description = undefined;
52+
property.title = property.title + ":";
53+
});
54+
});
55+
};
2256

2357
var updateServiceClass = function() {
2458
if (_.get(ctrl.refApiObject, 'kind') !== 'ServiceInstance') {
2559
var instanceName = _.get(ctrl.binding, 'spec.instanceRef.name');
26-
var instance = _.get(ctrl.serviceInstances, [instanceName]);
27-
var serviceClassName = _.get(instance, 'spec.serviceClassRef.name');
28-
ctrl.serviceClass = _.get(ctrl.serviceClasses, [serviceClassName]);
60+
ctrl.serviceInstance = _.get(ctrl.serviceInstances, [instanceName]);
61+
} else {
62+
ctrl.serviceInstance = ctrl.refApiObject;
2963
}
64+
65+
var serviceClassName = _.get(ctrl.serviceInstance, 'spec.serviceClassRef.name');
66+
ctrl.serviceClass = _.get(ctrl.serviceClasses, [serviceClassName]);
3067
};
3168

3269
this.$onChanges = function(changes) {
3370
if (changes.binding || changes.serviceInstances || changes.serviceClasses) {
3471
updateServiceClass();
72+
updateParameterSchema();
73+
updateParameterData();
3574
}
3675
};
76+
77+
ctrl.toggleShowParameterValues = function() {
78+
ctrl.showParameterValues = !ctrl.showParameterValues;
79+
};
3780
}
3881
})();

app/styles/_components.less

+22
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,28 @@ code.command {
196196
}
197197
}
198198

199+
.service-binding-message {
200+
margin-left: 20px;
201+
}
202+
.service-binding-parameters {
203+
margin-left: 20px;
204+
> a {
205+
border-left: 1px solid @color-pf-black-300;
206+
padding: 0 10px;
207+
208+
&:first-of-type {
209+
border-left: 0;
210+
}
211+
}
212+
.parameters-heading {
213+
color: @color-pf-black-500;
214+
}
215+
.parameter-title {
216+
font-weight: 700;
217+
text-align: right;
218+
}
219+
}
220+
199221
.service-binding-actions {
200222
font-size: 13px;
201223
font-weight: 400;

app/styles/_core.less

+26
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,32 @@
105105
border-bottom: 0;
106106
padding-bottom: 0;
107107
}
108+
109+
.config-parameters-form {
110+
margin-top: 5px;
111+
112+
@media (min-width: @screen-lg-min) {
113+
margin-bottom: 10px;
114+
}
115+
116+
form {
117+
margin-top: 10px;
118+
}
119+
.control-label {
120+
padding-right: 0;
121+
word-break: break-word;
122+
}
123+
124+
.form-group {
125+
margin-bottom: 0;
126+
}
127+
128+
.hide-show-link {
129+
font-size: @font-size-base;
130+
margin-left: 5px;
131+
}
132+
}
133+
108134
}
109135

110136
.hide-tabs .nav-tabs {

0 commit comments

Comments
 (0)