Skip to content

Commit e3049e9

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

File tree

4 files changed

+270
-52
lines changed

4 files changed

+270
-52
lines changed

dist/origin-web-common-services.js

+75-12
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,48 @@ 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, parametersSecretName) {
1092+
var parametersSecretName;
10511093
var instanceName = serviceInstance.metadata.name;
1052-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
1094+
10531095
var binding = {
10541096
kind: 'Binding',
10551097
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -1060,12 +1102,17 @@ angular.module("openshiftCommonServices")
10601102
instanceRef: {
10611103
name: instanceName
10621104
},
1063-
secretName: relatedObjName
1105+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
10641106
}
10651107
};
10661108

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

10711118
var appSelector = _.get(application, 'spec.selector');
@@ -1173,18 +1220,34 @@ angular.module("openshiftCommonServices")
11731220
return {
11741221
bindingResource: bindingResource,
11751222
getServiceClassForInstance: getServiceClassForInstance,
1223+
getPlanForInstance: getPlanForInstance,
11761224

11771225
// Create a binding for `serviceInstance`. If an `application` API object
11781226
// is specified, also create a pod preset for that application using its
11791227
// `spec.selector`. `serviceClass` is required to determine if any
11801228
// 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);
1229+
bindService: function(serviceInstance, application, serviceClass, parameters) {
1230+
var parametersSecretName;
1231+
if (!_.isEmpty(parameters)) {
1232+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
1233+
}
1234+
1235+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
1236+
var context = {
1237+
namespace: serviceInstance.metadata.namespace
1238+
};
1239+
1240+
var promise = DataService.create(bindingResource, null, newBinding, context);
1241+
if (!parametersSecretName) {
1242+
return promise;
1243+
}
1244+
1245+
// Create the secret as well if the binding has parameters.
1246+
return promise.then(function(binding) {
1247+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
1248+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1249+
return binding;
1250+
});
11881251
});
11891252
},
11901253

dist/origin-web-common.js

+75-12
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,48 @@ 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, parametersSecretName) {
2961+
var parametersSecretName;
29202962
var instanceName = serviceInstance.metadata.name;
2921-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
2963+
29222964
var binding = {
29232965
kind: 'Binding',
29242966
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -2929,12 +2971,17 @@ angular.module("openshiftCommonServices")
29292971
instanceRef: {
29302972
name: instanceName
29312973
},
2932-
secretName: relatedObjName
2974+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
29332975
}
29342976
};
29352977

2936-
if (!_.isEmpty(parameters)) {
2937-
binding.spec.parameters = parameters;
2978+
if (parametersSecretName) {
2979+
binding.spec.parametersFrom = [{
2980+
secretKeyRef: {
2981+
name: parametersSecretName,
2982+
key: PARAMETERS_SECRET_KEY
2983+
}
2984+
}];
29382985
}
29392986

29402987
var appSelector = _.get(application, 'spec.selector');
@@ -3042,18 +3089,34 @@ angular.module("openshiftCommonServices")
30423089
return {
30433090
bindingResource: bindingResource,
30443091
getServiceClassForInstance: getServiceClassForInstance,
3092+
getPlanForInstance: getPlanForInstance,
30453093

30463094
// Create a binding for `serviceInstance`. If an `application` API object
30473095
// is specified, also create a pod preset for that application using its
30483096
// `spec.selector`. `serviceClass` is required to determine if any
30493097
// 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);
3098+
bindService: function(serviceInstance, application, serviceClass, parameters) {
3099+
var parametersSecretName;
3100+
if (!_.isEmpty(parameters)) {
3101+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
3102+
}
3103+
3104+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
3105+
var context = {
3106+
namespace: serviceInstance.metadata.namespace
3107+
};
3108+
3109+
var promise = DataService.create(bindingResource, null, newBinding, context);
3110+
if (!parametersSecretName) {
3111+
return promise;
3112+
}
3113+
3114+
// Create the secret as well if the binding has parameters.
3115+
return promise.then(function(binding) {
3116+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
3117+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
3118+
return binding;
3119+
});
30573120
});
30583121
},
30593122

dist/origin-web-common.min.js

+45-16
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,15 +1157,33 @@ 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) {
1168-
var instanceName = serviceInstance.metadata.name, relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + "-"), binding = {
1184+
return secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters), secret;
1185+
}, makeBinding = function(serviceInstance, application, parametersSecretName) {
1186+
var parametersSecretName, instanceName = serviceInstance.metadata.name, binding = {
11691187
kind:"Binding",
11701188
apiVersion:"servicecatalog.k8s.io/v1alpha1",
11711189
metadata:{
@@ -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+
parametersSecretName && (binding.spec.parametersFrom = [ {
1200+
secretKeyRef:{
1201+
name:parametersSecretName,
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 parametersSecretName;
1246+
_.isEmpty(parameters) || (parametersSecretName = generateSecretName(serviceInstance.metadata.name + "-bind-parameters-"));
1247+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName), 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 parametersSecretName ? promise.then(function(binding) {
1251+
var parametersSecret = makeParametersSecret(parametersSecretName, 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)