Skip to content

Commit 9b71f2c

Browse files
committed
Update BindService for binding parameters
1 parent a120f82 commit 9b71f2c

File tree

4 files changed

+266
-45
lines changed

4 files changed

+266
-45
lines changed

dist/origin-web-common-services.js

+74-10
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,9 @@ angular.module("openshiftCommonServices")
10181018
AuthService,
10191019
DataService,
10201020
DNS1123_SUBDOMAIN_VALIDATION) {
1021+
// The secret key this service uses for the parameters JSON blob when binding.
1022+
var PARAMETERS_SECRET_KEY = 'parameters';
1023+
10211024
var bindingResource = {
10221025
group: 'servicecatalog.k8s.io',
10231026
resource: 'bindings'
@@ -1047,9 +1050,49 @@ angular.module("openshiftCommonServices")
10471050
};
10481051

10491052
var generateName = $filter('generateName');
1050-
var makeBinding = function (serviceInstance, application, parameters) {
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+
});
1061+
1062+
return generateName(secretNamePrefix, generateNameLength);
1063+
};
1064+
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, parameters) {
1092+
var parametersSecretName;
10511093
var instanceName = serviceInstance.metadata.name;
10521094
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
1095+
10531096
var binding = {
10541097
kind: 'Binding',
10551098
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -1060,12 +1103,17 @@ angular.module("openshiftCommonServices")
10601103
instanceRef: {
10611104
name: instanceName
10621105
},
1063-
secretName: relatedObjName
1106+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
10641107
}
10651108
};
10661109

10671110
if (!_.isEmpty(parameters)) {
1068-
binding.spec.parameters = parameters;
1111+
binding.spec.parametersFrom = [{
1112+
secretKeyRef: {
1113+
name: generateSecretName(serviceInstance.metadata.name + '-parameters-'),
1114+
key: PARAMETERS_SECRET_KEY
1115+
}
1116+
}];
10691117
}
10701118

10711119
var appSelector = _.get(application, 'spec.selector');
@@ -1173,18 +1221,34 @@ angular.module("openshiftCommonServices")
11731221
return {
11741222
bindingResource: bindingResource,
11751223
getServiceClassForInstance: getServiceClassForInstance,
1224+
getPlanForInstance: getPlanForInstance,
11761225

11771226
// Create a binding for `serviceInstance`. If an `application` API object
11781227
// is specified, also create a pod preset for that application using its
11791228
// `spec.selector`. `serviceClass` is required to determine if any
11801229
// parameters need to be set when creating the binding.
1181-
bindService: function(serviceInstance, application, serviceClass) {
1182-
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
1183-
var newBinding = makeBinding(serviceInstance, application, parameters);
1184-
var context = {
1185-
namespace: serviceInstance.metadata.namespace
1186-
};
1187-
return DataService.create(bindingResource, null, newBinding, context);
1230+
bindService: function(serviceInstance, application, serviceClass, parameters) {
1231+
var secretName;
1232+
if (!_.isEmpty(parameters)) {
1233+
secretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
1234+
}
1235+
1236+
var newBinding = makeBinding(serviceInstance, application, secretName);
1237+
var context = {
1238+
namespace: serviceInstance.metadata.namespace
1239+
};
1240+
1241+
var promise = DataService.create(bindingResource, null, newBinding, context);
1242+
if (!secretName) {
1243+
return promise;
1244+
}
1245+
1246+
// Create the secret as well if the binding has parameters.
1247+
return promise.then(function(binding) {
1248+
var parametersSecret = makeParametersSecret(secretName, parameters, binding);
1249+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1250+
return binding;
1251+
});
11881252
});
11891253
},
11901254

dist/origin-web-common.js

+74-10
Original file line numberDiff line numberDiff line change
@@ -2887,6 +2887,9 @@ angular.module("openshiftCommonServices")
28872887
AuthService,
28882888
DataService,
28892889
DNS1123_SUBDOMAIN_VALIDATION) {
2890+
// The secret key this service uses for the parameters JSON blob when binding.
2891+
var PARAMETERS_SECRET_KEY = 'parameters';
2892+
28902893
var bindingResource = {
28912894
group: 'servicecatalog.k8s.io',
28922895
resource: 'bindings'
@@ -2916,9 +2919,49 @@ angular.module("openshiftCommonServices")
29162919
};
29172920

29182921
var generateName = $filter('generateName');
2919-
var makeBinding = function (serviceInstance, application, parameters) {
2922+
var generateSecretName = function(prefix) {
2923+
var generateNameLength = 5;
2924+
// Truncate the class name if it's too long to append the generated name suffix.
2925+
var secretNamePrefix = _.truncate(prefix, {
2926+
// `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
2927+
length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
2928+
omission: ''
2929+
});
2930+
2931+
return generateName(secretNamePrefix, generateNameLength);
2932+
};
2933+
2934+
var makeParametersSecret = function(secretName, parameters, binding) {
2935+
var secret = {
2936+
apiVersion: 'v1',
2937+
kind: 'Secret',
2938+
metadata: {
2939+
name: secretName,
2940+
ownerReferences: [{
2941+
apiVersion: binding.apiVersion,
2942+
kind: binding.kind,
2943+
name: binding.metadata.name,
2944+
uid: binding.metadata.uid,
2945+
controller: false,
2946+
// TODO: Change to true when garbage collection works with service
2947+
// catalog resources. Setting to true now results in a 403 Forbidden
2948+
// error creating the secret.
2949+
blockOwnerDeletion: false
2950+
}]
2951+
},
2952+
type: 'Opaque',
2953+
stringData: {}
2954+
};
2955+
2956+
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
2957+
return secret;
2958+
};
2959+
2960+
var makeBinding = function(serviceInstance, application, parameters) {
2961+
var parametersSecretName;
29202962
var instanceName = serviceInstance.metadata.name;
29212963
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
2964+
29222965
var binding = {
29232966
kind: 'Binding',
29242967
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -2929,12 +2972,17 @@ angular.module("openshiftCommonServices")
29292972
instanceRef: {
29302973
name: instanceName
29312974
},
2932-
secretName: relatedObjName
2975+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
29332976
}
29342977
};
29352978

29362979
if (!_.isEmpty(parameters)) {
2937-
binding.spec.parameters = parameters;
2980+
binding.spec.parametersFrom = [{
2981+
secretKeyRef: {
2982+
name: generateSecretName(serviceInstance.metadata.name + '-parameters-'),
2983+
key: PARAMETERS_SECRET_KEY
2984+
}
2985+
}];
29382986
}
29392987

29402988
var appSelector = _.get(application, 'spec.selector');
@@ -3042,18 +3090,34 @@ angular.module("openshiftCommonServices")
30423090
return {
30433091
bindingResource: bindingResource,
30443092
getServiceClassForInstance: getServiceClassForInstance,
3093+
getPlanForInstance: getPlanForInstance,
30453094

30463095
// Create a binding for `serviceInstance`. If an `application` API object
30473096
// is specified, also create a pod preset for that application using its
30483097
// `spec.selector`. `serviceClass` is required to determine if any
30493098
// parameters need to be set when creating the binding.
3050-
bindService: function(serviceInstance, application, serviceClass) {
3051-
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
3052-
var newBinding = makeBinding(serviceInstance, application, parameters);
3053-
var context = {
3054-
namespace: serviceInstance.metadata.namespace
3055-
};
3056-
return DataService.create(bindingResource, null, newBinding, context);
3099+
bindService: function(serviceInstance, application, serviceClass, parameters) {
3100+
var secretName;
3101+
if (!_.isEmpty(parameters)) {
3102+
secretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
3103+
}
3104+
3105+
var newBinding = makeBinding(serviceInstance, application, secretName);
3106+
var context = {
3107+
namespace: serviceInstance.metadata.namespace
3108+
};
3109+
3110+
var promise = DataService.create(bindingResource, null, newBinding, context);
3111+
if (!secretName) {
3112+
return promise;
3113+
}
3114+
3115+
// Create the secret as well if the binding has parameters.
3116+
return promise.then(function(binding) {
3117+
var parametersSecret = makeParametersSecret(secretName, parameters, binding);
3118+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
3119+
return binding;
3120+
});
30573121
});
30583122
},
30593123

dist/origin-web-common.min.js

+44-15
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ return data;
11461146
}
11471147
};
11481148
}), angular.module("openshiftCommonServices").service("BindingService", [ "$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, AuthService, DataService, DNS1123_SUBDOMAIN_VALIDATION) {
1149-
var bindingResource = {
1149+
var PARAMETERS_SECRET_KEY = "parameters", bindingResource = {
11501150
group:"servicecatalog.k8s.io",
11511151
resource:"bindings"
11521152
}, getServiceClassForInstance = function(serviceInstance, serviceClasses) {
@@ -1157,14 +1157,32 @@ var planName = _.get(serviceInstance, "spec.planName");
11571157
return _.find(serviceClass.plans, {
11581158
name:planName
11591159
});
1160-
}, getBindParameters = function(serviceInstance, serviceClass) {
1161-
var plan = getPlanForInstance(serviceInstance, serviceClass);
1162-
return _.has(plan, [ "alphaBindingCreateParameterSchema", "properties", "template.openshift.io/requester-username" ]) ? AuthService.withUser().then(function(user) {
1163-
return {
1164-
"template.openshift.io/requester-username":user.metadata.name
1160+
}, generateName = $filter("generateName"), generateSecretName = function(prefix) {
1161+
var generateNameLength = 5, secretNamePrefix = _.truncate(prefix, {
1162+
length:DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
1163+
omission:""
1164+
});
1165+
return generateName(secretNamePrefix, generateNameLength);
1166+
}, makeParametersSecret = function(secretName, parameters, binding) {
1167+
var secret = {
1168+
apiVersion:"v1",
1169+
kind:"Secret",
1170+
metadata:{
1171+
name:secretName,
1172+
ownerReferences:[ {
1173+
apiVersion:binding.apiVersion,
1174+
kind:binding.kind,
1175+
name:binding.metadata.name,
1176+
uid:binding.metadata.uid,
1177+
controller:!1,
1178+
blockOwnerDeletion:!1
1179+
} ]
1180+
},
1181+
type:"Opaque",
1182+
stringData:{}
11651183
};
1166-
}) :$q.when({});
1167-
}, generateName = $filter("generateName"), makeBinding = function(serviceInstance, application, parameters) {
1184+
return secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters), secret;
1185+
}, makeBinding = function(serviceInstance, application, parameters) {
11681186
var instanceName = serviceInstance.metadata.name, relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + "-"), binding = {
11691187
kind:"Binding",
11701188
apiVersion:"servicecatalog.k8s.io/v1alpha1",
@@ -1175,10 +1193,15 @@ spec:{
11751193
instanceRef:{
11761194
name:instanceName
11771195
},
1178-
secretName:relatedObjName
1196+
secretName:generateSecretName(serviceInstance.metadata.name + "-credentials-")
11791197
}
11801198
};
1181-
_.isEmpty(parameters) || (binding.spec.parameters = parameters);
1199+
_.isEmpty(parameters) || (binding.spec.parametersFrom = [ {
1200+
secretKeyRef:{
1201+
name:generateSecretName(serviceInstance.metadata.name + "-parameters-"),
1202+
key:PARAMETERS_SECRET_KEY
1203+
}
1204+
} ]);
11821205
var appSelector = _.get(application, "spec.selector");
11831206
return appSelector && (appSelector.matchLabels || appSelector.matchExpressions || (appSelector = {
11841207
matchLabels:appSelector
@@ -1217,13 +1240,19 @@ return _.get(item, "metadata.name", "");
12171240
return {
12181241
bindingResource:bindingResource,
12191242
getServiceClassForInstance:getServiceClassForInstance,
1220-
bindService:function(serviceInstance, application, serviceClass) {
1221-
return getBindParameters(serviceInstance, serviceClass).then(function(parameters) {
1222-
var newBinding = makeBinding(serviceInstance, application, parameters), context = {
1243+
getPlanForInstance:getPlanForInstance,
1244+
bindService:function(serviceInstance, application, serviceClass, parameters) {
1245+
var secretName;
1246+
_.isEmpty(parameters) || (secretName = generateSecretName(serviceInstance.metadata.name + "-bind-parameters-"));
1247+
var newBinding = makeBinding(serviceInstance, application, secretName), context = {
12231248
namespace:serviceInstance.metadata.namespace
1224-
};
1225-
return DataService.create(bindingResource, null, newBinding, context);
1249+
}, promise = DataService.create(bindingResource, null, newBinding, context);
1250+
return secretName ? promise.then(function(binding) {
1251+
var parametersSecret = makeParametersSecret(secretName, parameters, binding);
1252+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1253+
return binding;
12261254
});
1255+
}) :promise;
12271256
},
12281257
isServiceBindable:isServiceBindable,
12291258
getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings,

0 commit comments

Comments
 (0)