Skip to content

Commit b500f54

Browse files
committed
Update BindService for binding parameters
1 parent bdc00a2 commit b500f54

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
@@ -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'
@@ -1060,9 +1063,48 @@ angular.module("openshiftCommonServices")
10601063
};
10611064

10621065
var generateName = $filter('generateName');
1063-
var makeBinding = function (serviceInstance, application, parameters) {
1066+
var generateSecretName = function(prefix) {
1067+
var generateNameLength = 5;
1068+
// Truncate the class name if it's too long to append the generated name suffix.
1069+
var secretNamePrefix = _.truncate(prefix, {
1070+
// `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
1071+
length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
1072+
omission: ''
1073+
});
1074+
1075+
return generateName(secretNamePrefix, generateNameLength);
1076+
};
1077+
1078+
var makeParametersSecret = function(secretName, parameters, binding) {
1079+
var secret = {
1080+
apiVersion: 'v1',
1081+
kind: 'Secret',
1082+
metadata: {
1083+
name: secretName,
1084+
ownerReferences: [{
1085+
apiVersion: binding.apiVersion,
1086+
kind: binding.kind,
1087+
name: binding.metadata.name,
1088+
uid: binding.metadata.uid,
1089+
controller: false,
1090+
// TODO: Change to true when garbage collection works with service
1091+
// catalog resources. Setting to true now results in a 403 Forbidden
1092+
// error creating the secret.
1093+
blockOwnerDeletion: false
1094+
}]
1095+
},
1096+
type: 'Opaque',
1097+
stringData: {}
1098+
};
1099+
1100+
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
1101+
return secret;
1102+
};
1103+
1104+
var makeBinding = function(serviceInstance, application, parametersSecretName) {
1105+
var parametersSecretName;
10641106
var instanceName = serviceInstance.metadata.name;
1065-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
1107+
10661108
var binding = {
10671109
kind: 'Binding',
10681110
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -1073,12 +1115,17 @@ angular.module("openshiftCommonServices")
10731115
instanceRef: {
10741116
name: instanceName
10751117
},
1076-
secretName: relatedObjName
1118+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
10771119
}
10781120
};
10791121

1080-
if (!_.isEmpty(parameters)) {
1081-
binding.spec.parameters = parameters;
1122+
if (parametersSecretName) {
1123+
binding.spec.parametersFrom = [{
1124+
secretKeyRef: {
1125+
name: parametersSecretName,
1126+
key: PARAMETERS_SECRET_KEY
1127+
}
1128+
}];
10821129
}
10831130

10841131
var appSelector = _.get(application, 'spec.selector');
@@ -1190,18 +1237,34 @@ angular.module("openshiftCommonServices")
11901237
return {
11911238
bindingResource: bindingResource,
11921239
getServiceClassForInstance: getServiceClassForInstance,
1240+
getPlanForInstance: getPlanForInstance,
11931241

11941242
// Create a binding for `serviceInstance`. If an `application` API object
11951243
// is specified, also create a pod preset for that application using its
11961244
// `spec.selector`. `serviceClass` is required to determine if any
11971245
// 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);
1246+
bindService: function(serviceInstance, application, serviceClass, parameters) {
1247+
var parametersSecretName;
1248+
if (!_.isEmpty(parameters)) {
1249+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
1250+
}
1251+
1252+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
1253+
var context = {
1254+
namespace: serviceInstance.metadata.namespace
1255+
};
1256+
1257+
var promise = DataService.create(bindingResource, null, newBinding, context);
1258+
if (!parametersSecretName) {
1259+
return promise;
1260+
}
1261+
1262+
// Create the secret as well if the binding has parameters.
1263+
return promise.then(function(binding) {
1264+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
1265+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1266+
return binding;
1267+
});
12051268
});
12061269
},
12071270

dist/origin-web-common.js

+75-12
Original file line numberDiff line numberDiff line change
@@ -2900,6 +2900,9 @@ angular.module("openshiftCommonServices")
29002900
AuthService,
29012901
DataService,
29022902
DNS1123_SUBDOMAIN_VALIDATION) {
2903+
// The secret key this service uses for the parameters JSON blob when binding.
2904+
var PARAMETERS_SECRET_KEY = 'parameters';
2905+
29032906
var bindingResource = {
29042907
group: 'servicecatalog.k8s.io',
29052908
resource: 'bindings'
@@ -2929,9 +2932,48 @@ angular.module("openshiftCommonServices")
29292932
};
29302933

29312934
var generateName = $filter('generateName');
2932-
var makeBinding = function (serviceInstance, application, parameters) {
2935+
var generateSecretName = function(prefix) {
2936+
var generateNameLength = 5;
2937+
// Truncate the class name if it's too long to append the generated name suffix.
2938+
var secretNamePrefix = _.truncate(prefix, {
2939+
// `generateNameLength - 1` because we append a '-' and then a 5 char generated suffix
2940+
length: DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
2941+
omission: ''
2942+
});
2943+
2944+
return generateName(secretNamePrefix, generateNameLength);
2945+
};
2946+
2947+
var makeParametersSecret = function(secretName, parameters, binding) {
2948+
var secret = {
2949+
apiVersion: 'v1',
2950+
kind: 'Secret',
2951+
metadata: {
2952+
name: secretName,
2953+
ownerReferences: [{
2954+
apiVersion: binding.apiVersion,
2955+
kind: binding.kind,
2956+
name: binding.metadata.name,
2957+
uid: binding.metadata.uid,
2958+
controller: false,
2959+
// TODO: Change to true when garbage collection works with service
2960+
// catalog resources. Setting to true now results in a 403 Forbidden
2961+
// error creating the secret.
2962+
blockOwnerDeletion: false
2963+
}]
2964+
},
2965+
type: 'Opaque',
2966+
stringData: {}
2967+
};
2968+
2969+
secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters);
2970+
return secret;
2971+
};
2972+
2973+
var makeBinding = function(serviceInstance, application, parametersSecretName) {
2974+
var parametersSecretName;
29332975
var instanceName = serviceInstance.metadata.name;
2934-
var relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + '-');
2976+
29352977
var binding = {
29362978
kind: 'Binding',
29372979
apiVersion: 'servicecatalog.k8s.io/v1alpha1',
@@ -2942,12 +2984,17 @@ angular.module("openshiftCommonServices")
29422984
instanceRef: {
29432985
name: instanceName
29442986
},
2945-
secretName: relatedObjName
2987+
secretName: generateSecretName(serviceInstance.metadata.name + '-credentials-')
29462988
}
29472989
};
29482990

2949-
if (!_.isEmpty(parameters)) {
2950-
binding.spec.parameters = parameters;
2991+
if (parametersSecretName) {
2992+
binding.spec.parametersFrom = [{
2993+
secretKeyRef: {
2994+
name: parametersSecretName,
2995+
key: PARAMETERS_SECRET_KEY
2996+
}
2997+
}];
29512998
}
29522999

29533000
var appSelector = _.get(application, 'spec.selector');
@@ -3059,18 +3106,34 @@ angular.module("openshiftCommonServices")
30593106
return {
30603107
bindingResource: bindingResource,
30613108
getServiceClassForInstance: getServiceClassForInstance,
3109+
getPlanForInstance: getPlanForInstance,
30623110

30633111
// Create a binding for `serviceInstance`. If an `application` API object
30643112
// is specified, also create a pod preset for that application using its
30653113
// `spec.selector`. `serviceClass` is required to determine if any
30663114
// parameters need to be set when creating the binding.
3067-
bindService: function(serviceInstance, application, serviceClass) {
3068-
return getBindParameters(serviceInstance, serviceClass).then(function (parameters) {
3069-
var newBinding = makeBinding(serviceInstance, application, parameters);
3070-
var context = {
3071-
namespace: serviceInstance.metadata.namespace
3072-
};
3073-
return DataService.create(bindingResource, null, newBinding, context);
3115+
bindService: function(serviceInstance, application, serviceClass, parameters) {
3116+
var parametersSecretName;
3117+
if (!_.isEmpty(parameters)) {
3118+
parametersSecretName = generateSecretName(serviceInstance.metadata.name + '-bind-parameters-');
3119+
}
3120+
3121+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName);
3122+
var context = {
3123+
namespace: serviceInstance.metadata.namespace
3124+
};
3125+
3126+
var promise = DataService.create(bindingResource, null, newBinding, context);
3127+
if (!parametersSecretName) {
3128+
return promise;
3129+
}
3130+
3131+
// Create the secret as well if the binding has parameters.
3132+
return promise.then(function(binding) {
3133+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
3134+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
3135+
return binding;
3136+
});
30743137
});
30753138
},
30763139

dist/origin-web-common.min.js

+45-16
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ return data;
11491149
}
11501150
};
11511151
}), angular.module("openshiftCommonServices").service("BindingService", [ "$filter", "$q", "AuthService", "DataService", "DNS1123_SUBDOMAIN_VALIDATION", function($filter, $q, AuthService, DataService, DNS1123_SUBDOMAIN_VALIDATION) {
1152-
var bindingResource = {
1152+
var PARAMETERS_SECRET_KEY = "parameters", bindingResource = {
11531153
group:"servicecatalog.k8s.io",
11541154
resource:"bindings"
11551155
}, getServiceClassForInstance = function(serviceInstance, serviceClasses) {
@@ -1160,15 +1160,33 @@ var planName = _.get(serviceInstance, "spec.planName");
11601160
return _.find(serviceClass.plans, {
11611161
name:planName
11621162
});
1163-
}, getBindParameters = function(serviceInstance, serviceClass) {
1164-
var plan = getPlanForInstance(serviceInstance, serviceClass);
1165-
return _.has(plan, [ "alphaBindingCreateParameterSchema", "properties", "template.openshift.io/requester-username" ]) ? AuthService.withUser().then(function(user) {
1166-
return {
1167-
"template.openshift.io/requester-username":user.metadata.name
1163+
}, generateName = $filter("generateName"), generateSecretName = function(prefix) {
1164+
var generateNameLength = 5, secretNamePrefix = _.truncate(prefix, {
1165+
length:DNS1123_SUBDOMAIN_VALIDATION.maxlength - generateNameLength - 1,
1166+
omission:""
1167+
});
1168+
return generateName(secretNamePrefix, generateNameLength);
1169+
}, makeParametersSecret = function(secretName, parameters, binding) {
1170+
var secret = {
1171+
apiVersion:"v1",
1172+
kind:"Secret",
1173+
metadata:{
1174+
name:secretName,
1175+
ownerReferences:[ {
1176+
apiVersion:binding.apiVersion,
1177+
kind:binding.kind,
1178+
name:binding.metadata.name,
1179+
uid:binding.metadata.uid,
1180+
controller:!1,
1181+
blockOwnerDeletion:!1
1182+
} ]
1183+
},
1184+
type:"Opaque",
1185+
stringData:{}
11681186
};
1169-
}) :$q.when({});
1170-
}, generateName = $filter("generateName"), makeBinding = function(serviceInstance, application, parameters) {
1171-
var instanceName = serviceInstance.metadata.name, relatedObjName = generateName(_.truncate(instanceName, DNS1123_SUBDOMAIN_VALIDATION.maxlength - 6) + "-"), binding = {
1187+
return secret.stringData[PARAMETERS_SECRET_KEY] = JSON.stringify(parameters), secret;
1188+
}, makeBinding = function(serviceInstance, application, parametersSecretName) {
1189+
var parametersSecretName, instanceName = serviceInstance.metadata.name, binding = {
11721190
kind:"Binding",
11731191
apiVersion:"servicecatalog.k8s.io/v1alpha1",
11741192
metadata:{
@@ -1178,10 +1196,15 @@ spec:{
11781196
instanceRef:{
11791197
name:instanceName
11801198
},
1181-
secretName:relatedObjName
1199+
secretName:generateSecretName(serviceInstance.metadata.name + "-credentials-")
11821200
}
11831201
};
1184-
_.isEmpty(parameters) || (binding.spec.parameters = parameters);
1202+
parametersSecretName && (binding.spec.parametersFrom = [ {
1203+
secretKeyRef:{
1204+
name:parametersSecretName,
1205+
key:PARAMETERS_SECRET_KEY
1206+
}
1207+
} ]);
11851208
var appSelector = _.get(application, "spec.selector");
11861209
return appSelector && (appSelector.matchLabels || appSelector.matchExpressions || (appSelector = {
11871210
matchLabels:appSelector
@@ -1221,13 +1244,19 @@ return _.get(item, "metadata.name", "");
12211244
return {
12221245
bindingResource:bindingResource,
12231246
getServiceClassForInstance:getServiceClassForInstance,
1224-
bindService:function(serviceInstance, application, serviceClass) {
1225-
return getBindParameters(serviceInstance, serviceClass).then(function(parameters) {
1226-
var newBinding = makeBinding(serviceInstance, application, parameters), context = {
1247+
getPlanForInstance:getPlanForInstance,
1248+
bindService:function(serviceInstance, application, serviceClass, parameters) {
1249+
var parametersSecretName;
1250+
_.isEmpty(parameters) || (parametersSecretName = generateSecretName(serviceInstance.metadata.name + "-bind-parameters-"));
1251+
var newBinding = makeBinding(serviceInstance, application, parametersSecretName), context = {
12271252
namespace:serviceInstance.metadata.namespace
1228-
};
1229-
return DataService.create(bindingResource, null, newBinding, context);
1253+
}, promise = DataService.create(bindingResource, null, newBinding, context);
1254+
return parametersSecretName ? promise.then(function(binding) {
1255+
var parametersSecret = makeParametersSecret(parametersSecretName, parameters, binding);
1256+
return DataService.create("secrets", null, parametersSecret, context).then(function() {
1257+
return binding;
12301258
});
1259+
}) :promise;
12311260
},
12321261
isServiceBindable:isServiceBindable,
12331262
getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings,

0 commit comments

Comments
 (0)