Commit e25a7494 by Samuel Padgett

Update BindService for binding parameters

parent d5ae6b45
...@@ -1031,6 +1031,9 @@ angular.module("openshiftCommonServices") ...@@ -1031,6 +1031,9 @@ angular.module("openshiftCommonServices")
AuthService, AuthService,
DataService, DataService,
DNS1123_SUBDOMAIN_VALIDATION) { DNS1123_SUBDOMAIN_VALIDATION) {
// The secret key this service uses for the parameters JSON blob when binding.
var PARAMETERS_SECRET_KEY = 'parameters';
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
...@@ -1046,23 +1049,49 @@ angular.module("openshiftCommonServices") ...@@ -1046,23 +1049,49 @@ angular.module("openshiftCommonServices")
return _.find(serviceClass.plans, { name: planName }); return _.find(serviceClass.plans, { name: planName });
}; };
var getBindParameters = function(serviceInstance, serviceClass) { var generateName = $filter('generateName');
var plan = getPlanForInstance(serviceInstance, serviceClass); var generateSecretName = function(prefix) {
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) { var generateNameLength = 5;
return AuthService.withUser().then(function(user) { // Truncate the class name if it's too long to append the generated name suffix.
return { var secretNamePrefix = _.truncate(prefix, {
'template.openshift.io/requester-username': user.metadata.name // `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
}; length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
omission: ''
}); });
}
return $q.when({}); return generateName(secretNamePrefix, generateNameLength);
}; };
var generateName = $filter('generateName'); var makeParametersSecret = function(secretName, parameters, binding) {
var makeBinding = function (serviceInstance, application, parameters) { var secret = {
apiVersion: 'v1',
kind: 'Secret',
metadata: {
name: secretName,
ownerReferences: [{
apiVersion: binding.apiVersion,
kind: binding.kind,
name: binding.metadata.name,
uid: binding.metadata.uid,
controller: false,
// TODO: Change to true when garbage collection works with service
// catalog resources. Setting to true now results in a 403 Forbidden
// error creating the secret.
blockOwnerDeletion: false
}]
},
type: 'Opaque',
stringData: {}
};
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
return secret;
};
var makeBinding = function(serviceInstance, application, parametersSecretName) {
var parametersSecretName;
var instanceName = serviceInstance.metadata.name; var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
...@@ -1073,12 +1102,17 @@ angular.module("openshiftCommonServices") ...@@ -1073,12 +1102,17 @@ angular.module("openshiftCommonServices")
instanceRef: { instanceRef: {
name: instanceName name: instanceName
}, },
secretName: relatedObjName secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
} }
}; };
if (!_.isEmpty(parameters)) { if (parametersSecretName) {
binding.spec.parameters = parameters; binding.spec.parametersFrom = [{
secretKeyRef: {
name: parametersSecretName,
key: PARAMETERS_SECRET_KEY
}
}];
} }
var appSelector = _.get(application, 'spec.selector'); var appSelector = _.get(application, 'spec.selector');
...@@ -1190,18 +1224,34 @@ angular.module("openshiftCommonServices") ...@@ -1190,18 +1224,34 @@ angular.module("openshiftCommonServices")
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
getPlanForInstance: getPlanForInstance,
// Create a binding for `serviceInstance`. If an `application` API object // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its // is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any // `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding. // parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) { bindService: function(serviceInstance, application, serviceClass, parameters) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) { var parametersSecretName;
var newBinding = makeBinding(serviceInstance, application, parameters); if (!_.isEmpty(parameters)) {
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
}
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
var context = { var context = {
namespace: serviceInstance.metadata.namespace namespace: serviceInstance.metadata.namespace
}; };
return DataService.create(bindingResource, null, newBinding, context);
var promise = DataService.create(bindingResource, null, newBinding, context);
if (!parametersSecretName) {
return promise;
}
// Create the secret as well if the binding has parameters.
return promise.then(function(binding) {
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
return DataService.create("secrets", null, parametersSecret, context).then(function() {
return binding;
});
}); });
}, },
......
...@@ -2911,6 +2911,9 @@ angular.module("openshiftCommonServices") ...@@ -2911,6 +2911,9 @@ angular.module("openshiftCommonServices")
AuthService, AuthService,
DataService, DataService,
DNS1123_SUBDOMAIN_VALIDATION) { DNS1123_SUBDOMAIN_VALIDATION) {
// The secret key this service uses for the parameters JSON blob when binding.
var PARAMETERS_SECRET_KEY = 'parameters';
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
...@@ -2926,23 +2929,49 @@ angular.module("openshiftCommonServices") ...@@ -2926,23 +2929,49 @@ angular.module("openshiftCommonServices")
return _.find(serviceClass.plans, { name: planName }); return _.find(serviceClass.plans, { name: planName });
}; };
var getBindParameters = function(serviceInstance, serviceClass) { var generateName = $filter('generateName');
var plan = getPlanForInstance(serviceInstance, serviceClass); var generateSecretName = function(prefix) {
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) { var generateNameLength = 5;
return AuthService.withUser().then(function(user) { // Truncate the class name if it's too long to append the generated name suffix.
return { var secretNamePrefix = _.truncate(prefix, {
'template.openshift.io/requester-username': user.metadata.name // `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
}; length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
omission: ''
}); });
}
return $q.when({}); return generateName(secretNamePrefix, generateNameLength);
}; };
var generateName = $filter('generateName'); var makeParametersSecret = function(secretName, parameters, binding) {
var makeBinding = function (serviceInstance, application, parameters) { var secret = {
apiVersion: 'v1',
kind: 'Secret',
metadata: {
name: secretName,
ownerReferences: [{
apiVersion: binding.apiVersion,
kind: binding.kind,
name: binding.metadata.name,
uid: binding.metadata.uid,
controller: false,
// TODO: Change to true when garbage collection works with service
// catalog resources. Setting to true now results in a 403 Forbidden
// error creating the secret.
blockOwnerDeletion: false
}]
},
type: 'Opaque',
stringData: {}
};
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
return secret;
};
var makeBinding = function(serviceInstance, application, parametersSecretName) {
var parametersSecretName;
var instanceName = serviceInstance.metadata.name; var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
...@@ -2953,12 +2982,17 @@ angular.module("openshiftCommonServices") ...@@ -2953,12 +2982,17 @@ angular.module("openshiftCommonServices")
instanceRef: { instanceRef: {
name: instanceName name: instanceName
}, },
secretName: relatedObjName secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
} }
}; };
if (!_.isEmpty(parameters)) { if (parametersSecretName) {
binding.spec.parameters = parameters; binding.spec.parametersFrom = [{
secretKeyRef: {
name: parametersSecretName,
key: PARAMETERS_SECRET_KEY
}
}];
} }
var appSelector = _.get(application, 'spec.selector'); var appSelector = _.get(application, 'spec.selector');
...@@ -3070,18 +3104,34 @@ angular.module("openshiftCommonServices") ...@@ -3070,18 +3104,34 @@ angular.module("openshiftCommonServices")
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
getPlanForInstance: getPlanForInstance,
// Create a binding for `serviceInstance`. If an `application` API object // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its // is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any // `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding. // parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) { bindService: function(serviceInstance, application, serviceClass, parameters) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) { var parametersSecretName;
var newBinding = makeBinding(serviceInstance, application, parameters); if (!_.isEmpty(parameters)) {
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
}
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
var context = { var context = {
namespace: serviceInstance.metadata.namespace namespace: serviceInstance.metadata.namespace
}; };
return DataService.create(bindingResource, null, newBinding, context);
var promise = DataService.create(bindingResource, null, newBinding, context);
if (!parametersSecretName) {
return promise;
}
// Create the secret as well if the binding has parameters.
return promise.then(function(binding) {
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
return DataService.create("secrets", null, parametersSecret, context).then(function() {
return binding;
});
}); });
}, },
......
...@@ -1158,7 +1158,7 @@ return data; ...@@ -1158,7 +1158,7 @@ return data;
} }
}; };
}), angular.module("openshiftCommonServices").service("BindingService", [ "$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, AuthService, DataService, DNS1123_SUBDOMAIN_VALIDATION) { }), angular.module("openshiftCommonServices").service("BindingService", [ "$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, AuthService, DataService, DNS1123_SUBDOMAIN_VALIDATION) {
var bindingResource = { var PARAMETERS_SECRET_KEY = "parameters", bindingResource = {
group:"servicecatalog.k8s.io", group:"servicecatalog.k8s.io",
resource:"bindings" resource:"bindings"
}, getServiceClassForInstance = function(serviceInstance, serviceClasses) { }, getServiceClassForInstance = function(serviceInstance, serviceClasses) {
...@@ -1169,15 +1169,33 @@ var planName = _.get(serviceInstance, "spec.planName"); ...@@ -1169,15 +1169,33 @@ var planName = _.get(serviceInstance, "spec.planName");
return _.find(serviceClass.plans, { return _.find(serviceClass.plans, {
name:planName name:planName
}); });
}, getBindParameters = function(serviceInstance, serviceClass) { }, generateName = $filter("generateName"), generateSecretName = function(prefix) {
var plan = getPlanForInstance(serviceInstance, serviceClass); var generateNameLength = 5, secretNamePrefix = _.truncate(prefix, {
return _.has(plan, [ "alphaBindingCreateParameterSchema", "properties", "template.openshift.io/requester-username" ]) ? AuthService.withUser().then(function(user) { length:DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
return { omission:""
"template.openshift.io/requester-username":user.metadata.name });
return generateName(secretNamePrefix, generateNameLength);
}, makeParametersSecret = function(secretName, parameters, binding) {
var secret = {
apiVersion:"v1",
kind:"Secret",
metadata:{
name:secretName,
ownerReferences:[ {
apiVersion:binding.apiVersion,
kind:binding.kind,
name:binding.metadata.name,
uid:binding.metadata.uid,
controller:!1,
blockOwnerDeletion:!1
} ]
},
type:"Opaque",
stringData:{}
}; };
}) :$q.when({}); return secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters), secret;
}, generateName = $filter("generateName"), makeBinding = function(serviceInstance, application, parameters) { }, makeBinding = function(serviceInstance, application, parametersSecretName) {
var instanceName = serviceInstance.metadata.name, relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + "-"), binding = { var parametersSecretName, instanceName = serviceInstance.metadata.name, binding = {
kind:"Binding", kind:"Binding",
apiVersion:"servicecatalog.k8s.io/v1alpha1", apiVersion:"servicecatalog.k8s.io/v1alpha1",
metadata:{ metadata:{
...@@ -1187,10 +1205,15 @@ spec:{ ...@@ -1187,10 +1205,15 @@ spec:{
instanceRef:{ instanceRef:{
name:instanceName name:instanceName
}, },
secretName:relatedObjName secretName:generateSecretName(serviceInstance.metadata.name + "-credentials-")
} }
}; };
_.isEmpty(parameters) || (binding.spec.parameters = parameters); parametersSecretName && (binding.spec.parametersFrom = [ {
secretKeyRef:{
name:parametersSecretName,
key:PARAMETERS_SECRET_KEY
}
} ]);
var appSelector = _.get(application, "spec.selector"); var appSelector = _.get(application, "spec.selector");
return appSelector && (appSelector.matchLabels || appSelector.matchExpressions || (appSelector = { return appSelector && (appSelector.matchLabels || appSelector.matchExpressions || (appSelector = {
matchLabels:appSelector matchLabels:appSelector
...@@ -1230,13 +1253,19 @@ return _.get(item, "metadata.name", ""); ...@@ -1230,13 +1253,19 @@ return _.get(item, "metadata.name", "");
return { return {
bindingResource:bindingResource, bindingResource:bindingResource,
getServiceClassForInstance:getServiceClassForInstance, getServiceClassForInstance:getServiceClassForInstance,
bindService:function(serviceInstance, application, serviceClass) { getPlanForInstance:getPlanForInstance,
return getBindParameters(serviceInstance, serviceClass).then(function(parameters) { bindService:function(serviceInstance, application, serviceClass, parameters) {
var newBinding = makeBinding(serviceInstance, application, parameters), context = { var parametersSecretName;
_.isEmpty(parameters) || (parametersSecretName = generateSecretName(serviceInstance.metadata.name + "-bind-parameters-"));
var newBinding = makeBinding(serviceInstance, application, parametersSecretName), context = {
namespace:serviceInstance.metadata.namespace namespace:serviceInstance.metadata.namespace
}; }, promise = DataService.create(bindingResource, null, newBinding, context);
return DataService.create(bindingResource, null, newBinding, context); return parametersSecretName ? promise.then(function(binding) {
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
return DataService.create("secrets", null, parametersSecret, context).then(function() {
return binding;
}); });
}) :promise;
}, },
isServiceBindable:isServiceBindable, isServiceBindable:isServiceBindable,
getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings, getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings,
......
...@@ -7,6 +7,9 @@ angular.module("openshiftCommonServices") ...@@ -7,6 +7,9 @@ angular.module("openshiftCommonServices")
AuthService, AuthService,
DataService, DataService,
DNS1123_SUBDOMAIN_VALIDATION) { DNS1123_SUBDOMAIN_VALIDATION) {
// The secret key this service uses for the parameters JSON blob when binding.
var PARAMETERS_SECRET_KEY = 'parameters';
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
...@@ -22,23 +25,49 @@ angular.module("openshiftCommonServices") ...@@ -22,23 +25,49 @@ angular.module("openshiftCommonServices")
return _.find(serviceClass.plans, { name: planName }); return _.find(serviceClass.plans, { name: planName });
}; };
var getBindParameters = function(serviceInstance, serviceClass) { var generateName = $filter('generateName');
var plan = getPlanForInstance(serviceInstance, serviceClass); var generateSecretName = function(prefix) {
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) { var generateNameLength = 5;
return AuthService.withUser().then(function(user) { // Truncate the class name if it's too long to append the generated name suffix.
return { var secretNamePrefix = _.truncate(prefix, {
'template.openshift.io/requester-username': user.metadata.name // `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
}; length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
omission: ''
}); });
}
return $q.when({}); return generateName(secretNamePrefix, generateNameLength);
}; };
var generateName = $filter('generateName'); var makeParametersSecret = function(secretName, parameters, binding) {
var makeBinding = function (serviceInstance, application, parameters) { var secret = {
apiVersion: 'v1',
kind: 'Secret',
metadata: {
name: secretName,
ownerReferences: [{
apiVersion: binding.apiVersion,
kind: binding.kind,
name: binding.metadata.name,
uid: binding.metadata.uid,
controller: false,
// TODO: Change to true when garbage collection works with service
// catalog resources. Setting to true now results in a 403 Forbidden
// error creating the secret.
blockOwnerDeletion: false
}]
},
type: 'Opaque',
stringData: {}
};
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
return secret;
};
var makeBinding = function(serviceInstance, application, parametersSecretName) {
var parametersSecretName;
var instanceName = serviceInstance.metadata.name; var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
...@@ -49,12 +78,17 @@ angular.module("openshiftCommonServices") ...@@ -49,12 +78,17 @@ angular.module("openshiftCommonServices")
instanceRef: { instanceRef: {
name: instanceName name: instanceName
}, },
secretName: relatedObjName secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
} }
}; };
if (!_.isEmpty(parameters)) { if (parametersSecretName) {
binding.spec.parameters = parameters; binding.spec.parametersFrom = [{
secretKeyRef: {
name: parametersSecretName,
key: PARAMETERS_SECRET_KEY
}
}];
} }
var appSelector = _.get(application, 'spec.selector'); var appSelector = _.get(application, 'spec.selector');
...@@ -166,18 +200,34 @@ angular.module("openshiftCommonServices") ...@@ -166,18 +200,34 @@ angular.module("openshiftCommonServices")
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
getPlanForInstance: getPlanForInstance,
// Create a binding for `serviceInstance`. If an `application` API object // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its // is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any // `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding. // parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) { bindService: function(serviceInstance, application, serviceClass, parameters) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) { var parametersSecretName;
var newBinding = makeBinding(serviceInstance, application, parameters); if (!_.isEmpty(parameters)) {
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
}
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
var context = { var context = {
namespace: serviceInstance.metadata.namespace namespace: serviceInstance.metadata.namespace
}; };
return DataService.create(bindingResource, null, newBinding, context);
var promise = DataService.create(bindingResource, null, newBinding, context);
if (!parametersSecretName) {
return promise;
}
// Create the secret as well if the binding has parameters.
return promise.then(function(binding) {
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
return DataService.create("secrets", null, parametersSecret, context).then(function() {
return binding;
});
}); });
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment