Commit 0f4d8365 by Samuel Padgett

Add requester-username parameter when needed on bind

Add the required `template.openshift.io/requester-username` parameter
if needed for the template broker on bind requests.
parent 5d715783
...@@ -998,29 +998,63 @@ angular.module('openshiftCommonServices') ...@@ -998,29 +998,63 @@ angular.module('openshiftCommonServices')
;'use strict'; ;'use strict';
angular.module("openshiftCommonServices") angular.module("openshiftCommonServices")
.service("BindingService", function($filter, $q, DataService, DNS1123_SUBDOMAIN_VALIDATION){ .service("BindingService",
function($filter,
$q,
AuthService,
DataService,
DNS1123_SUBDOMAIN_VALIDATION) {
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
}; };
var makeBinding = function (serviceToBind, appToBind) { var getServiceClassForInstance = function(serviceInstance, serviceClasses) {
var generateName = $filter('generateName'); var serviceClassName = _.get(serviceInstance, 'spec.serviceClassName');
var relatedObjName = generateName(_.trunc(serviceToBind, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-'); return _.get(serviceClasses, [serviceClassName]);
};
var getPlanForInstance = function(serviceInstance, serviceClass) {
var planName = _.get(serviceInstance, 'spec.planName');
return _.find(serviceClass.plans, { name: planName });
};
var getBindParameters = function(serviceInstance, serviceClass) {
var plan = getPlanForInstance(serviceInstance, serviceClass);
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) {
return AuthService.withUser().then(function(user) {
return {
'template.openshift.io/requester-username': user.metadata.name
};
});
}
return $q.when({});
};
var generateName = $filter('generateName');
var makeBinding = function (serviceInstance, application, parameters) {
var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.trunc(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
metadata: { metadata: {
generateName: serviceToBind + '-' generateName: instanceName + '-'
}, },
spec: { spec: {
instanceRef: { instanceRef: {
name: serviceToBind name: instanceName
}, },
secretName: relatedObjName secretName: relatedObjName
} }
}; };
var appSelector = _.get(appToBind, 'spec.selector');
if (!_.isEmpty(parameters)) {
binding.spec.parameters = parameters;
}
var appSelector = _.get(application, 'spec.selector');
if (appSelector) { if (appSelector) {
if (!appSelector.matchLabels && !appSelector.matchExpressions) { if (!appSelector.matchLabels && !appSelector.matchExpressions) {
// Then this is the old format of selector, pod preset requires the new format // Then this is the old format of selector, pod preset requires the new format
...@@ -1033,30 +1067,45 @@ angular.module("openshiftCommonServices") ...@@ -1033,30 +1067,45 @@ angular.module("openshiftCommonServices")
selector: appSelector selector: appSelector
}; };
} }
return binding; return binding;
}; };
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
bindService: function(context, serviceToBind, appToBind) { getServiceClassForInstance: getServiceClassForInstance,
var newBinding = makeBinding(serviceToBind, appToBind);
return DataService.create(bindingResource, null, newBinding, context); // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
var newBinding = makeBinding(serviceInstance, application, parameters);
var context = {
namespace: serviceInstance.metadata.namespace
};
return DataService.create(bindingResource, null, newBinding, context);
});
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: function(serviceInstance, serviceClasses) {
if (serviceClasses && serviceInstance) { var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
var serviceClass = serviceClasses[serviceInstance.spec.serviceClassName]; if (!serviceClass) {
if (serviceClass) { return !!serviceInstance;
var plan = _.find(serviceClass.plans, {name: serviceInstance.spec.planName}); }
if (plan.bindable === false) {
return false; var plan = getPlanForInstance(serviceInstance, serviceClass);
} else if (plan.bindable === true) { var planBindable = _.get(plan, 'bindable');
return true; if (planBindable === true) {
} else { return true;
return serviceClass.bindable;
}
}
} }
return !!serviceInstance; if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
} }
}; };
}); });
......
...@@ -47,7 +47,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI'); ...@@ -47,7 +47,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI');
" <fieldset>\n" + " <fieldset>\n" +
" <div class=\"radio\">\n" + " <div class=\"radio\">\n" +
" <label ng-if=\"ctrl.allowNoBinding\">\n" + " <label ng-if=\"ctrl.allowNoBinding\">\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"null\">\n" +
" Do not bind at this time.\n" + " Do not bind at this time.\n" +
" </label>\n" + " </label>\n" +
" <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" + " <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" +
...@@ -57,7 +57,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI'); ...@@ -57,7 +57,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI');
" </div>\n" + " </div>\n" +
" <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" + " <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" +
" <label>\n" + " <label>\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"{{serviceInstance.metadata.name}}\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"serviceInstance\">\n" +
" {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" + " {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" +
" </label>\n" + " </label>\n" +
" <div class=\"bind-description\">\n" + " <div class=\"bind-description\">\n" +
......
...@@ -218,7 +218,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI'); ...@@ -218,7 +218,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI');
" <fieldset>\n" + " <fieldset>\n" +
" <div class=\"radio\">\n" + " <div class=\"radio\">\n" +
" <label ng-if=\"ctrl.allowNoBinding\">\n" + " <label ng-if=\"ctrl.allowNoBinding\">\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"null\">\n" +
" Do not bind at this time.\n" + " Do not bind at this time.\n" +
" </label>\n" + " </label>\n" +
" <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" + " <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" +
...@@ -228,7 +228,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI'); ...@@ -228,7 +228,7 @@ hawtioPluginLoader.addModule('openshiftCommonUI');
" </div>\n" + " </div>\n" +
" <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" + " <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" +
" <label>\n" + " <label>\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"{{serviceInstance.metadata.name}}\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"serviceInstance\">\n" +
" {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" + " {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" +
" </label>\n" + " </label>\n" +
" <div class=\"bind-description\">\n" + " <div class=\"bind-description\">\n" +
...@@ -2722,29 +2722,63 @@ angular.module('openshiftCommonServices') ...@@ -2722,29 +2722,63 @@ angular.module('openshiftCommonServices')
;'use strict'; ;'use strict';
angular.module("openshiftCommonServices") angular.module("openshiftCommonServices")
.service("BindingService", ["$filter", "$q", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, DataService, DNS1123_SUBDOMAIN_VALIDATION){ .service("BindingService",
["$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter,
$q,
AuthService,
DataService,
DNS1123_SUBDOMAIN_VALIDATION) {
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
}; };
var makeBinding = function (serviceToBind, appToBind) { var getServiceClassForInstance = function(serviceInstance, serviceClasses) {
var generateName = $filter('generateName'); var serviceClassName = _.get(serviceInstance, 'spec.serviceClassName');
var relatedObjName = generateName(_.trunc(serviceToBind, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-'); return _.get(serviceClasses, [serviceClassName]);
};
var getPlanForInstance = function(serviceInstance, serviceClass) {
var planName = _.get(serviceInstance, 'spec.planName');
return _.find(serviceClass.plans, { name: planName });
};
var getBindParameters = function(serviceInstance, serviceClass) {
var plan = getPlanForInstance(serviceInstance, serviceClass);
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) {
return AuthService.withUser().then(function(user) {
return {
'template.openshift.io/requester-username': user.metadata.name
};
});
}
return $q.when({});
};
var generateName = $filter('generateName');
var makeBinding = function (serviceInstance, application, parameters) {
var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.trunc(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
metadata: { metadata: {
generateName: serviceToBind + '-' generateName: instanceName + '-'
}, },
spec: { spec: {
instanceRef: { instanceRef: {
name: serviceToBind name: instanceName
}, },
secretName: relatedObjName secretName: relatedObjName
} }
}; };
var appSelector = _.get(appToBind, 'spec.selector');
if (!_.isEmpty(parameters)) {
binding.spec.parameters = parameters;
}
var appSelector = _.get(application, 'spec.selector');
if (appSelector) { if (appSelector) {
if (!appSelector.matchLabels && !appSelector.matchExpressions) { if (!appSelector.matchLabels && !appSelector.matchExpressions) {
// Then this is the old format of selector, pod preset requires the new format // Then this is the old format of selector, pod preset requires the new format
...@@ -2757,30 +2791,45 @@ angular.module("openshiftCommonServices") ...@@ -2757,30 +2791,45 @@ angular.module("openshiftCommonServices")
selector: appSelector selector: appSelector
}; };
} }
return binding; return binding;
}; };
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
bindService: function(context, serviceToBind, appToBind) { getServiceClassForInstance: getServiceClassForInstance,
var newBinding = makeBinding(serviceToBind, appToBind);
return DataService.create(bindingResource, null, newBinding, context); // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
var newBinding = makeBinding(serviceInstance, application, parameters);
var context = {
namespace: serviceInstance.metadata.namespace
};
return DataService.create(bindingResource, null, newBinding, context);
});
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: function(serviceInstance, serviceClasses) {
if (serviceClasses && serviceInstance) { var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
var serviceClass = serviceClasses[serviceInstance.spec.serviceClassName]; if (!serviceClass) {
if (serviceClass) { return !!serviceInstance;
var plan = _.find(serviceClass.plans, {name: serviceInstance.spec.planName});
if (plan.bindable === false) {
return false;
} else if (plan.bindable === true) {
return true;
} else {
return serviceClass.bindable;
}
}
} }
return !!serviceInstance;
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
} }
}; };
}]); }]);
......
...@@ -18,7 +18,7 @@ angular.module('openshiftCommonUI').run(['$templateCache', function($templateCac ...@@ -18,7 +18,7 @@ angular.module('openshiftCommonUI').run(['$templateCache', function($templateCac
" <fieldset>\n" + " <fieldset>\n" +
" <div class=\"radio\">\n" + " <div class=\"radio\">\n" +
" <label ng-if=\"ctrl.allowNoBinding\">\n" + " <label ng-if=\"ctrl.allowNoBinding\">\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"null\">\n" +
" Do not bind at this time.\n" + " Do not bind at this time.\n" +
" </label>\n" + " </label>\n" +
" <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" + " <div ng-if=\"ctrl.allowNoBinding\" class=\"bind-description\">\n" +
...@@ -28,7 +28,7 @@ angular.module('openshiftCommonUI').run(['$templateCache', function($templateCac ...@@ -28,7 +28,7 @@ angular.module('openshiftCommonUI').run(['$templateCache', function($templateCac
" </div>\n" + " </div>\n" +
" <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" + " <div ng-repeat=\"serviceInstance in ctrl.bindableServiceInstances\">\n" +
" <label>\n" + " <label>\n" +
" <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" value=\"{{serviceInstance.metadata.name}}\">\n" + " <input type=\"radio\" ng-model=\"ctrl.serviceToBind\" ng-value=\"serviceInstance\">\n" +
" {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" + " {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}\n" +
" </label>\n" + " </label>\n" +
" <div class=\"bind-description\">\n" + " <div class=\"bind-description\">\n" +
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<fieldset> <fieldset>
<div class="radio"> <div class="radio">
<label ng-if="ctrl.allowNoBinding"> <label ng-if="ctrl.allowNoBinding">
<input type="radio" ng-model="ctrl.serviceToBind" value=""> <input type="radio" ng-model="ctrl.serviceToBind" ng-value="null">
Do not bind at this time. Do not bind at this time.
</label> </label>
<div ng-if="ctrl.allowNoBinding" class="bind-description"> <div ng-if="ctrl.allowNoBinding" class="bind-description">
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
</div> </div>
<div ng-repeat="serviceInstance in ctrl.bindableServiceInstances"> <div ng-repeat="serviceInstance in ctrl.bindableServiceInstances">
<label> <label>
<input type="radio" ng-model="ctrl.serviceToBind" value="{{serviceInstance.metadata.name}}"> <input type="radio" ng-model="ctrl.serviceToBind" ng-value="serviceInstance">
{{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}} {{ctrl.serviceClasses[serviceInstance.spec.serviceClassName].osbMetadata.displayName || serviceInstance.spec.serviceClassName}}
</label> </label>
<div class="bind-description"> <div class="bind-description">
......
'use strict'; 'use strict';
angular.module("openshiftCommonServices") angular.module("openshiftCommonServices")
.service("BindingService", function($filter, $q, DataService, DNS1123_SUBDOMAIN_VALIDATION){ .service("BindingService",
function($filter,
$q,
AuthService,
DataService,
DNS1123_SUBDOMAIN_VALIDATION) {
var bindingResource = { var bindingResource = {
group: 'servicecatalog.k8s.io', group: 'servicecatalog.k8s.io',
resource: 'bindings' resource: 'bindings'
}; };
var makeBinding = function (serviceToBind, appToBind) { var getServiceClassForInstance = function(serviceInstance, serviceClasses) {
var generateName = $filter('generateName'); var serviceClassName = _.get(serviceInstance, 'spec.serviceClassName');
var relatedObjName = generateName(_.trunc(serviceToBind, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-'); return _.get(serviceClasses, [serviceClassName]);
};
var getPlanForInstance = function(serviceInstance, serviceClass) {
var planName = _.get(serviceInstance, 'spec.planName');
return _.find(serviceClass.plans, { name: planName });
};
var getBindParameters = function(serviceInstance, serviceClass) {
var plan = getPlanForInstance(serviceInstance, serviceClass);
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) {
return AuthService.withUser().then(function(user) {
return {
'template.openshift.io/requester-username': user.metadata.name
};
});
}
return $q.when({});
};
var generateName = $filter('generateName');
var makeBinding = function (serviceInstance, application, parameters) {
var instanceName = serviceInstance.metadata.name;
var relatedObjName = generateName(_.trunc(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
var binding = { var binding = {
kind: 'Binding', kind: 'Binding',
apiVersion: 'servicecatalog.k8s.io/v1alpha1', apiVersion: 'servicecatalog.k8s.io/v1alpha1',
metadata: { metadata: {
generateName: serviceToBind + '-' generateName: instanceName + '-'
}, },
spec: { spec: {
instanceRef: { instanceRef: {
name: serviceToBind name: instanceName
}, },
secretName: relatedObjName secretName: relatedObjName
} }
}; };
var appSelector = _.get(appToBind, 'spec.selector');
if (!_.isEmpty(parameters)) {
binding.spec.parameters = parameters;
}
var appSelector = _.get(application, 'spec.selector');
if (appSelector) { if (appSelector) {
if (!appSelector.matchLabels && !appSelector.matchExpressions) { if (!appSelector.matchLabels && !appSelector.matchExpressions) {
// Then this is the old format of selector, pod preset requires the new format // Then this is the old format of selector, pod preset requires the new format
...@@ -36,30 +70,45 @@ angular.module("openshiftCommonServices") ...@@ -36,30 +70,45 @@ angular.module("openshiftCommonServices")
selector: appSelector selector: appSelector
}; };
} }
return binding; return binding;
}; };
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
bindService: function(context, serviceToBind, appToBind) { getServiceClassForInstance: getServiceClassForInstance,
var newBinding = makeBinding(serviceToBind, appToBind);
return DataService.create(bindingResource, null, newBinding, context); // Create a binding for `serviceInstance`. If an `application` API object
// is specified, also create a pod preset for that application using its
// `spec.selector`. `serviceClass` is required to determine if any
// parameters need to be set when creating the binding.
bindService: function(serviceInstance, application, serviceClass) {
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
var newBinding = makeBinding(serviceInstance, application, parameters);
var context = {
namespace: serviceInstance.metadata.namespace
};
return DataService.create(bindingResource, null, newBinding, context);
});
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: function(serviceInstance, serviceClasses) {
if (serviceClasses && serviceInstance) { var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
var serviceClass = serviceClasses[serviceInstance.spec.serviceClassName]; if (!serviceClass) {
if (serviceClass) { return !!serviceInstance;
var plan = _.find(serviceClass.plans, {name: serviceInstance.spec.planName}); }
if (plan.bindable === false) {
return false; var plan = getPlanForInstance(serviceInstance, serviceClass);
} else if (plan.bindable === true) { var planBindable = _.get(plan, 'bindable');
return true; if (planBindable === true) {
} else { return true;
return serviceClass.bindable;
}
}
} }
return !!serviceInstance; if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
} }
}; };
}); });
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