Skip to content

Commit cbe5aba

Browse files
Service instance details configuration and edit
1 parent 61b4aba commit cbe5aba

File tree

13 files changed

+944
-350
lines changed

13 files changed

+944
-350
lines changed

app/scripts/controllers/serviceInstance.js

+97-17
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@ angular.module('openshiftConsole')
66
$routeParams,
77
APIService,
88
BindingService,
9+
AuthorizationService,
10+
Catalog,
911
DataService,
12+
Logger,
1013
ProjectsService,
14+
SecretsService,
1115
ServiceInstancesService) {
1216
$scope.alerts = {};
1317
$scope.projectName = $routeParams.project;
1418
$scope.serviceInstance = null;
1519
$scope.serviceClass = null;
20+
$scope.serviceClasses = null;
21+
$scope.editDialogShown = false;
1622

1723
$scope.breadcrumbs = [
1824
{
@@ -28,9 +34,26 @@ angular.module('openshiftConsole')
2834
ServiceInstancesService.deprovision($scope.serviceInstance, $scope.bindings);
2935
};
3036

37+
$scope.showEditDialog = function() {
38+
$scope.editDialogShown = true;
39+
};
40+
41+
$scope.showParameterValues = false;
42+
43+
$scope.toggleShowParameterValues = function() {
44+
$scope.showParameterValues = !$scope.showParameterValues;
45+
};
46+
47+
$scope.closeEditDialog = function() {
48+
$scope.editDialogShown = false;
49+
};
50+
3151
var watches = [];
52+
var secretWatchers = [];
53+
var serviceClassPromise;
3254

3355
var serviceInstanceDisplayName = $filter('serviceInstanceDisplayName');
56+
var serviceInstanceReady = $filter('isServiceInstanceReady');
3457

3558
// API Versions
3659
var serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
@@ -42,28 +65,76 @@ angular.module('openshiftConsole')
4265
});
4366
};
4467

45-
var serviceClassPromise;
68+
var updateParameterData = function() {
69+
if (!$scope.serviceInstance || !$scope.parameterSchema) {
70+
return;
71+
}
72+
73+
DataService.unwatchAll(secretWatchers);
74+
secretWatchers = [];
75+
76+
$scope.parameterData = {};
77+
_.each(_.keys(_.get($scope.parameterSchema, 'properties')), function(key) {
78+
$scope.parameterData[key] = $scope.parameterSchema.properties[key].default;
79+
});
80+
81+
$scope.parameterData = angular.extend($scope.parameterData, _.get($scope.serviceInstance, 'spec.parameters', {}));
82+
83+
if (AuthorizationService.canI('secrets', 'get', $scope.projectName)) {
84+
_.each(_.get($scope.serviceInstance, 'spec.parametersFrom'), function (parametersSource) {
85+
secretWatchers.push(DataService.watchObject("secrets", _.get(parametersSource, 'secretKeyRef.name'), $scope.projectContext, function (secret) {
86+
try {
87+
_.extend($scope.parameterData, JSON.parse(SecretsService.decodeSecretData(secret.data)[parametersSource.secretKeyRef.key]));
88+
} catch (e) {
89+
Logger.warn('Unable to load parameters from secret ' + _.get(parametersSource, 'secretKeyRef.name'), e);
90+
}
91+
}));
92+
});
93+
}
94+
};
95+
96+
var updateEditable = function() {
97+
if (!$scope.plan || !$scope.serviceClass || !$scope.serviceInstance) {
98+
return;
99+
}
100+
101+
var updateSchema = _.get($scope.plan, 'spec.instanceUpdateParameterSchema');
102+
var planUpdatable = (_.size(_.get(updateSchema, 'properties')) > 0) || (_.get($scope.serviceClass, 'spec.planUpdatable') && (_.size($scope.servicePlans) > 1));
103+
104+
$scope.editAvailable = planUpdatable && serviceInstanceReady($scope.serviceInstance) && !_.get($scope.serviceInstance, 'metadata.deletionTimestamp');
105+
};
106+
107+
var updateParameterSchema = function() {
108+
$scope.parameterFormDefinition = angular.copy(_.get($scope.plan, 'spec.externalMetadata.schemas.service_instance.update.openshift_form_definition'));
109+
$scope.parameterSchema = _.get($scope.plan, 'spec.instanceCreateParameterSchema');
110+
};
111+
46112
var updateServiceClass = function() {
47113
// If we've previously loaded the service class or a request is in flight, don't do anything.
48-
if ($scope.serviceClass || serviceClassPromise) {
114+
if (!$scope.serviceInstance || $scope.serviceClass || serviceClassPromise) {
49115
return;
50116
}
51117

52-
serviceClassPromise = ServiceInstancesService.fetchServiceClassForInstance($scope.serviceInstance).then(function(serviceClass) {
118+
serviceClassPromise = ServiceInstancesService.fetchServiceClassForInstance($scope.serviceInstance).then(function (serviceClass) {
53119
$scope.serviceClass = serviceClass;
54-
$scope.displayName = serviceInstanceDisplayName($scope.serviceInstance, serviceClass);
120+
$scope.displayName = serviceInstanceDisplayName($scope.serviceInstance, $scope.serviceClass);
121+
55122
updateBreadcrumbs();
56123
serviceClassPromise = null;
57-
});
58-
};
59124

60-
var updatePlan = function() {
61-
if (ServiceInstancesService.isCurrentPlan($scope.serviceInstance, $scope.plan)) {
62-
return;
63-
}
125+
Catalog.getServicePlans().then(function (plans) {
126+
plans = plans.by('metadata.name');
127+
128+
var plansByServiceClassName = Catalog.groupPlansByServiceClassName(plans);
129+
$scope.servicePlans = plansByServiceClassName[$scope.serviceClass.metadata.name];
64130

65-
ServiceInstancesService.fetchServicePlanForInstance($scope.serviceInstance).then(function(plan) {
66-
$scope.plan = plan;
131+
var servicePlanName = _.get($scope.serviceInstance, 'spec.clusterServicePlanRef.name');
132+
$scope.plan = plans[servicePlanName];
133+
134+
updateParameterSchema();
135+
updateParameterData();
136+
updateEditable();
137+
});
67138
});
68139
};
69140

@@ -79,7 +150,8 @@ angular.module('openshiftConsole')
79150
}
80151

81152
updateServiceClass();
82-
updatePlan();
153+
updateParameterData();
154+
updateEditable();
83155
};
84156

85157
ProjectsService
@@ -106,9 +178,17 @@ angular.module('openshiftConsole')
106178
details: $filter('getErrorDetails')(error)
107179
};
108180
});
181+
}, function(error) {
182+
$scope.loaded = true;
183+
$scope.alerts["load"] = {
184+
type: "error",
185+
message: "The service details could not be loaded.",
186+
details: $filter('getErrorDetails')(error)
187+
};
188+
}));
109189

110-
$scope.$on('$destroy', function(){
111-
DataService.unwatchAll(watches);
112-
});
113-
}));
190+
$scope.$on('$destroy', function(){
191+
DataService.unwatchAll(watches);
192+
DataService.unwatchAll(secretWatchers);
193+
});
114194
});

app/scripts/controllers/serviceInstances.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ angular.module('openshiftConsole')
3232
};
3333

3434
$scope.getServiceClass = function(serviceInstance) {
35-
var serviceClassName = _.get(serviceInstance, 'spec.serviceClassRef.name');
35+
var serviceClassName = _.get(serviceInstance, 'spec.clusterServiceClassRef.name');
3636
return _.get($scope, ['serviceClasses', serviceClassName]);
3737
};
3838

app/scripts/directives/bindService.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
ctrl.serviceClass = ctrl.serviceClasses[serviceClassName];
167167
var servicePlanName = ServiceInstancesService.getServicePlanNameForInstance(instance);
168168
ctrl.plan = ctrl.servicePlans[servicePlanName];
169-
ctrl.parameterSchema = _.get(ctrl.plan, 'spec.serviceInstanceCredentialCreateParameterSchema');
169+
ctrl.parameterSchema = _.get(ctrl.plan, 'spec.serviceBindingCreateParameterSchema');
170170
ctrl.parameterFormDefinition = _.get(ctrl.plan, 'spec.externalMetadata.schemas.service_binding.create.openshift_form_definition');
171171
bindParametersStep.hidden = !_.has(ctrl.parameterSchema, 'properties');
172172
ctrl.nextTitle = bindParametersStep.hidden ? 'Bind' : 'Next >';

app/scripts/directives/serviceBinding.js

+50-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
(function() {
44
angular.module('openshiftConsole').component('serviceBinding', {
55
controller: [
6-
"APIService",
7-
"ServiceInstancesService",
6+
'APIService',
7+
'AuthorizationService',
8+
'DataService',
9+
'Logger',
10+
'SecretsService',
11+
'ServiceInstancesService',
812
ServiceBinding
913
],
1014
controllerAs: '$ctrl',
@@ -20,23 +24,64 @@
2024
});
2125

2226
function ServiceBinding(APIService,
27+
AuthorizationService,
28+
DataService,
29+
Logger,
30+
SecretsService,
2331
ServiceInstancesService) {
2432
var ctrl = this;
2533
ctrl.serviceBindingsVersion = APIService.getPreferredVersion('servicebindings');
34+
ctrl.showParameterValues = false;
35+
36+
var context = {
37+
namespace: ctrl.namespace
38+
};
39+
40+
var updateParameterData = function() {
41+
ctrl.parameterData = angular.copy(_.get(ctrl.binding, 'spec.parameters', {}));
42+
if (AuthorizationService.canI('secrets', 'get', ctrl.namespace)) {
43+
_.each(_.get(ctrl.binding, 'spec.parametersFrom'), function (parametersSource) {
44+
DataService.get('secrets', _.get(parametersSource, 'secretKeyRef.name'), context).then(function (secret) {
45+
try {
46+
_.extend(ctrl.parameterData, JSON.parse(SecretsService.decodeSecretData(secret.data)[parametersSource.secretKeyRef.key]));
47+
} catch (e) {
48+
Logger.warn('Unable to load parameters from secret ' + _.get(parametersSource, 'secretKeyRef.name'), e);
49+
}
50+
});
51+
});
52+
}
53+
};
54+
55+
var updateParameterSchema = function() {
56+
var resource = APIService.getPreferredVersion('clusterserviceplans');
57+
DataService.get(resource, _.get(ctrl.serviceInstance, 'spec.clusterServicePlanRef.name'), context).then(function(servicePlan) {
58+
ctrl.bindParameterFormDefinition = angular.copy(_.get(servicePlan, 'spec.externalMetadata.schemas.service_binding.create.openshift_form_definition'));
59+
ctrl.bindParameterSchema = _.get(servicePlan, 'spec.serviceBindingCreateParameterSchema');
60+
});
61+
};
2662

2763
var updateServiceClass = function() {
2864
if (_.get(ctrl.refApiObject, 'kind') !== 'ServiceInstance') {
2965
var instanceName = _.get(ctrl.binding, 'spec.instanceRef.name');
30-
var instance = _.get(ctrl.serviceInstances, [instanceName]);
31-
var serviceClassName = ServiceInstancesService.getServiceClassNameForInstance(instance);
32-
ctrl.serviceClass = _.get(ctrl.serviceClasses, [serviceClassName]);
66+
ctrl.serviceInstance = _.get(ctrl.serviceInstances, [instanceName]);
67+
} else {
68+
ctrl.serviceInstance = ctrl.refApiObject;
3369
}
70+
71+
var serviceClassName = ServiceInstancesService.getServiceClassNameForInstance(ctrl.serviceInstance);
72+
ctrl.serviceClass = _.get(ctrl.serviceClasses, [serviceClassName]);
3473
};
3574

3675
this.$onChanges = function(changes) {
3776
if (changes.binding || changes.serviceInstances || changes.serviceClasses) {
3877
updateServiceClass();
78+
updateParameterSchema();
79+
updateParameterData();
3980
}
4081
};
82+
83+
ctrl.toggleShowParameterValues = function() {
84+
ctrl.showParameterValues = !ctrl.showParameterValues;
85+
};
4186
}
4287
})();

app/styles/_components.less

+23
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,29 @@ 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+
text-transform: uppercase;
215+
}
216+
.parameter-title {
217+
font-weight: 700;
218+
text-align: right;
219+
}
220+
}
221+
199222
.service-binding-actions {
200223
font-size: 13px;
201224
font-weight: 400;

app/styles/_core.less

+26
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,32 @@
9797
}
9898

9999
.resource-details {
100+
.config-parameters-form {
101+
margin-top: 5px;
102+
103+
.control-label {
104+
padding-right: 0;
105+
word-break: break-word;
106+
}
107+
108+
form {
109+
margin-top: 10px;
110+
}
111+
112+
.form-group {
113+
margin-bottom: 0;
114+
}
115+
116+
.hide-show-link {
117+
font-size: @font-size-base;
118+
margin-left: 5px;
119+
}
120+
121+
@media (min-width: @screen-lg-min) {
122+
margin-bottom: 10px;
123+
}
124+
}
125+
100126
h3 {
101127
border-bottom: 1px solid #eee;
102128
padding-bottom: 10px;

0 commit comments

Comments
 (0)