Skip to content

Commit f271d65

Browse files
Merge pull request #163 from spadgett/bind-service-updates
Update BindService for binding parameters
2 parents b060476 + e25a749 commit f271d65

File tree

4 files changed

+264
-85
lines changed

4 files changed

+264
-85
lines changed

dist/origin-web-common-services.js

+73-23
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,9 @@ angular.module("openshiftCommonServices")
10311031
AuthService,
10321032
DataService,
10331033
DNS1123_SUBDOMAIN_VALIDATION) {
1034+
// The secret key this service uses for the parameters JSON blob when binding.
1035+
var PARAMETERS_SECRET_KEY = 'parameters';
1036+
10341037
var bindingResource = {
10351038
group: 'servicecatalog.k8s.io',
10361039
resource: 'bindings'
@@ -1046,23 +1049,49 @@ angular.module("openshiftCommonServices")
10461049
return _.find(serviceClass.plans, { name: planName });
10471050
};
10481051

1049-
var getBindParameters = function(serviceInstance, serviceClass) {
1050-
var plan = getPlanForInstance(serviceInstance, serviceClass);
1051-
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) {
1052-
return AuthService.withUser().then(function(user) {
1053-
return {
1054-
'template.openshift.io/requester-username': user.metadata.name
1055-
};
1056-
});
1057-
}
1052+
var generateName = $filter('generateName');
1053+
var generateSecretName = function(prefix) {
1054+
var generateNameLength = 5;
1055+
// Truncate the class name if it's too long to append the generated name suffix.
1056+
var secretNamePrefix = _.truncate(prefix, {
1057+
// `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
1058+
length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
1059+
omission: ''
1060+
});
10581061

1059-
return $q.when({});
1062+
return generateName(secretNamePrefix, generateNameLength);
10601063
};
10611064

1062-
var generateName = $filter('generateName');
1063-
var makeBinding = function (serviceInstance, application, parameters) {
1065+
var makeParametersSecret = function(secretName, parameters, binding) {
1066+
var secret = {
1067+
apiVersion: 'v1',
1068+
kind: 'Secret',
1069+
metadata: {
1070+
name: secretName,
1071+
ownerReferences: [{
1072+
apiVersion: binding.apiVersion,
1073+
kind: binding.kind,
1074+
name: binding.metadata.name,
1075+
uid: binding.metadata.uid,
1076+
controller: false,
1077+
// TODO: Change to true when garbage collection works with service
1078+
// catalog resources. Setting to true now results in a 403 Forbidden
1079+
// error creating the secret.
1080+
blockOwnerDeletion: false
1081+
}]
1082+
},
1083+
type: 'Opaque',
1084+
stringData: {}
1085+
};
1086+
1087+
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
1088+
return secret;
1089+
};
1090+
1091+
var makeBinding = function(serviceInstance, application, parametersSecretName) {
1092+
var parametersSecretName;
10641093
var instanceName = serviceInstance.metadata.name;
1065-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
1094+
10661095
var binding = {
10671096
kind: 'Binding',
10681097
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -1073,12 +1102,17 @@ angular.module("openshiftCommonServices")
10731102
instanceRef: {
10741103
name: instanceName
10751104
},
1076-
secretName: relatedObjName
1105+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
10771106
}
10781107
};
10791108

1080-
if (!_.isEmpty(parameters)) {
1081-
binding.spec.parameters = parameters;
1109+
if (parametersSecretName) {
1110+
binding.spec.parametersFrom = [{
1111+
secretKeyRef: {
1112+
name: parametersSecretName,
1113+
key: PARAMETERS_SECRET_KEY
1114+
}
1115+
}];
10821116
}
10831117

10841118
var appSelector = _.get(application, 'spec.selector');
@@ -1190,18 +1224,34 @@ angular.module("openshiftCommonServices")
11901224
return {
11911225
bindingResource: bindingResource,
11921226
getServiceClassForInstance: getServiceClassForInstance,
1227+
getPlanForInstance: getPlanForInstance,
11931228

11941229
// Create a binding for `serviceInstance`. If an `application` API object
11951230
// is specified, also create a pod preset for that application using its
11961231
// `spec.selector`. `serviceClass` is required to determine if any
11971232
// parameters need to be set when creating the binding.
1198-
bindService: function(serviceInstance, application, serviceClass) {
1199-
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
1200-
var newBinding = makeBinding(serviceInstance, application, parameters);
1201-
var context = {
1202-
namespace: serviceInstance.metadata.namespace
1203-
};
1204-
return DataService.create(bindingResource, null, newBinding, context);
1233+
bindService: function(serviceInstance, application, serviceClass, parameters) {
1234+
var parametersSecretName;
1235+
if (!_.isEmpty(parameters)) {
1236+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
1237+
}
1238+
1239+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
1240+
var context = {
1241+
namespace: serviceInstance.metadata.namespace
1242+
};
1243+
1244+
var promise = DataService.create(bindingResource, null, newBinding, context);
1245+
if (!parametersSecretName) {
1246+
return promise;
1247+
}
1248+
1249+
// Create the secret as well if the binding has parameters.
1250+
return promise.then(function(binding) {
1251+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
1252+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1253+
return binding;
1254+
});
12051255
});
12061256
},
12071257

dist/origin-web-common.js

+73-23
Original file line numberDiff line numberDiff line change
@@ -2911,6 +2911,9 @@ angular.module("openshiftCommonServices")
29112911
AuthService,
29122912
DataService,
29132913
DNS1123_SUBDOMAIN_VALIDATION) {
2914+
// The secret key this service uses for the parameters JSON blob when binding.
2915+
var PARAMETERS_SECRET_KEY = 'parameters';
2916+
29142917
var bindingResource = {
29152918
group: 'servicecatalog.k8s.io',
29162919
resource: 'bindings'
@@ -2926,23 +2929,49 @@ angular.module("openshiftCommonServices")
29262929
return _.find(serviceClass.plans, { name: planName });
29272930
};
29282931

2929-
var getBindParameters = function(serviceInstance, serviceClass) {
2930-
var plan = getPlanForInstance(serviceInstance, serviceClass);
2931-
if (_.has(plan, ['alphaBindingCreateParameterSchema', 'properties', 'template.openshift.io/requester-username'])) {
2932-
return AuthService.withUser().then(function(user) {
2933-
return {
2934-
'template.openshift.io/requester-username': user.metadata.name
2935-
};
2936-
});
2937-
}
2932+
var generateName = $filter('generateName');
2933+
var generateSecretName = function(prefix) {
2934+
var generateNameLength = 5;
2935+
// Truncate the class name if it's too long to append the generated name suffix.
2936+
var secretNamePrefix = _.truncate(prefix, {
2937+
// `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
2938+
length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
2939+
omission: ''
2940+
});
29382941

2939-
return $q.when({});
2942+
return generateName(secretNamePrefix, generateNameLength);
29402943
};
29412944

2942-
var generateName = $filter('generateName');
2943-
var makeBinding = function (serviceInstance, application, parameters) {
2945+
var makeParametersSecret = function(secretName, parameters, binding) {
2946+
var secret = {
2947+
apiVersion: 'v1',
2948+
kind: 'Secret',
2949+
metadata: {
2950+
name: secretName,
2951+
ownerReferences: [{
2952+
apiVersion: binding.apiVersion,
2953+
kind: binding.kind,
2954+
name: binding.metadata.name,
2955+
uid: binding.metadata.uid,
2956+
controller: false,
2957+
// TODO: Change to true when garbage collection works with service
2958+
// catalog resources. Setting to true now results in a 403 Forbidden
2959+
// error creating the secret.
2960+
blockOwnerDeletion: false
2961+
}]
2962+
},
2963+
type: 'Opaque',
2964+
stringData: {}
2965+
};
2966+
2967+
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
2968+
return secret;
2969+
};
2970+
2971+
var makeBinding = function(serviceInstance, application, parametersSecretName) {
2972+
var parametersSecretName;
29442973
var instanceName = serviceInstance.metadata.name;
2945-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
2974+
29462975
var binding = {
29472976
kind: 'Binding',
29482977
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -2953,12 +2982,17 @@ angular.module("openshiftCommonServices")
29532982
instanceRef: {
29542983
name: instanceName
29552984
},
2956-
secretName: relatedObjName
2985+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
29572986
}
29582987
};
29592988

2960-
if (!_.isEmpty(parameters)) {
2961-
binding.spec.parameters = parameters;
2989+
if (parametersSecretName) {
2990+
binding.spec.parametersFrom = [{
2991+
secretKeyRef: {
2992+
name: parametersSecretName,
2993+
key: PARAMETERS_SECRET_KEY
2994+
}
2995+
}];
29622996
}
29632997

29642998
var appSelector = _.get(application, 'spec.selector');
@@ -3070,18 +3104,34 @@ angular.module("openshiftCommonServices")
30703104
return {
30713105
bindingResource: bindingResource,
30723106
getServiceClassForInstance: getServiceClassForInstance,
3107+
getPlanForInstance: getPlanForInstance,
30733108

30743109
// Create a binding for `serviceInstance`. If an `application` API object
30753110
// is specified, also create a pod preset for that application using its
30763111
// `spec.selector`. `serviceClass` is required to determine if any
30773112
// parameters need to be set when creating the binding.
3078-
bindService: function(serviceInstance, application, serviceClass) {
3079-
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
3080-
var newBinding = makeBinding(serviceInstance, application, parameters);
3081-
var context = {
3082-
namespace: serviceInstance.metadata.namespace
3083-
};
3084-
return DataService.create(bindingResource, null, newBinding, context);
3113+
bindService: function(serviceInstance, application, serviceClass, parameters) {
3114+
var parametersSecretName;
3115+
if (!_.isEmpty(parameters)) {
3116+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
3117+
}
3118+
3119+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
3120+
var context = {
3121+
namespace: serviceInstance.metadata.namespace
3122+
};
3123+
3124+
var promise = DataService.create(bindingResource, null, newBinding, context);
3125+
if (!parametersSecretName) {
3126+
return promise;
3127+
}
3128+
3129+
// Create the secret as well if the binding has parameters.
3130+
return promise.then(function(binding) {
3131+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
3132+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
3133+
return binding;
3134+
});
30853135
});
30863136
},
30873137

dist/origin-web-common.min.js

+45-16
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,7 @@ return data;
11581158
}
11591159
};
11601160
}), angular.module("openshiftCommonServices").service("BindingService", [ "$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, AuthService, DataService, DNS1123_SUBDOMAIN_VALIDATION) {
1161-
var bindingResource = {
1161+
var PARAMETERS_SECRET_KEY = "parameters", bindingResource = {
11621162
group:"servicecatalog.k8s.io",
11631163
resource:"bindings"
11641164
}, getServiceClassForInstance = function(serviceInstance, serviceClasses) {
@@ -1169,15 +1169,33 @@ var planName = _.get(serviceInstance, "spec.planName");
11691169
return _.find(serviceClass.plans, {
11701170
name:planName
11711171
});
1172-
}, getBindParameters = function(serviceInstance, serviceClass) {
1173-
var plan = getPlanForInstance(serviceInstance, serviceClass);
1174-
return _.has(plan, [ "alphaBindingCreateParameterSchema", "properties", "template.openshift.io/requester-username" ]) ? AuthService.withUser().then(function(user) {
1175-
return {
1176-
"template.openshift.io/requester-username":user.metadata.name
1172+
}, generateName = $filter("generateName"), generateSecretName = function(prefix) {
1173+
var generateNameLength = 5, secretNamePrefix = _.truncate(prefix, {
1174+
length:DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
1175+
omission:""
1176+
});
1177+
return generateName(secretNamePrefix, generateNameLength);
1178+
}, makeParametersSecret = function(secretName, parameters, binding) {
1179+
var secret = {
1180+
apiVersion:"v1",
1181+
kind:"Secret",
1182+
metadata:{
1183+
name:secretName,
1184+
ownerReferences:[ {
1185+
apiVersion:binding.apiVersion,
1186+
kind:binding.kind,
1187+
name:binding.metadata.name,
1188+
uid:binding.metadata.uid,
1189+
controller:!1,
1190+
blockOwnerDeletion:!1
1191+
} ]
1192+
},
1193+
type:"Opaque",
1194+
stringData:{}
11771195
};
1178-
}) :$q.when({});
1179-
}, generateName = $filter("generateName"), makeBinding = function(serviceInstance, application, parameters) {
1180-
var instanceName = serviceInstance.metadata.name, relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + "-"), binding = {
1196+
return secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters), secret;
1197+
}, makeBinding = function(serviceInstance, application, parametersSecretName) {
1198+
var parametersSecretName, instanceName = serviceInstance.metadata.name, binding = {
11811199
kind:"Binding",
11821200
apiVersion:"servicecatalog.k8s.io/v1alpha1",
11831201
metadata:{
@@ -1187,10 +1205,15 @@ spec:{
11871205
instanceRef:{
11881206
name:instanceName
11891207
},
1190-
secretName:relatedObjName
1208+
secretName:generateSecretName(serviceInstance.metadata.name + "-credentials-")
11911209
}
11921210
};
1193-
_.isEmpty(parameters) || (binding.spec.parameters = parameters);
1211+
parametersSecretName && (binding.spec.parametersFrom = [ {
1212+
secretKeyRef:{
1213+
name:parametersSecretName,
1214+
key:PARAMETERS_SECRET_KEY
1215+
}
1216+
} ]);
11941217
var appSelector = _.get(application, "spec.selector");
11951218
return appSelector && (appSelector.matchLabels || appSelector.matchExpressions || (appSelector = {
11961219
matchLabels:appSelector
@@ -1230,13 +1253,19 @@ return _.get(item, "metadata.name", "");
12301253
return {
12311254
bindingResource:bindingResource,
12321255
getServiceClassForInstance:getServiceClassForInstance,
1233-
bindService:function(serviceInstance, application, serviceClass) {
1234-
return getBindParameters(serviceInstance, serviceClass).then(function(parameters) {
1235-
var newBinding = makeBinding(serviceInstance, application, parameters), context = {
1256+
getPlanForInstance:getPlanForInstance,
1257+
bindService:function(serviceInstance, application, serviceClass, parameters) {
1258+
var parametersSecretName;
1259+
_.isEmpty(parameters) || (parametersSecretName = generateSecretName(serviceInstance.metadata.name + "-bind-parameters-"));
1260+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName), context = {
12361261
namespace:serviceInstance.metadata.namespace
1237-
};
1238-
return DataService.create(bindingResource, null, newBinding, context);
1262+
}, promise = DataService.create(bindingResource, null, newBinding, context);
1263+
return parametersSecretName ? promise.then(function(binding) {
1264+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
1265+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1266+
return binding;
12391267
});
1268+
}) :promise;
12401269
},
12411270
isServiceBindable:isServiceBindable,
12421271
getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings,

0 commit comments

Comments
 (0)