Skip to content

Commit 33bf3c4

Browse files
committed
Ref #25533: add string representation to providedParameters
1 parent 2067976 commit 33bf3c4

6 files changed

Lines changed: 94 additions & 61 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/model/runtime/ProvidedParameters.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,33 @@
2121
package eu.openanalytics.containerproxy.model.runtime;
2222

2323
import com.fasterxml.jackson.annotation.JsonCreator;
24+
import com.fasterxml.jackson.core.JsonProcessingException;
25+
import com.fasterxml.jackson.databind.ObjectMapper;
2426

2527
import java.util.HashMap;
2628
import java.util.Map;
2729

2830
public class ProvidedParameters {
2931

30-
private final Map<String, String> map;
32+
private final Map<String, String> backendValues;
33+
private final String stringRepresentation;
3134

3235
@JsonCreator
33-
public ProvidedParameters(Map<String, String> map) {
34-
this.map = map;
35-
}
36-
37-
public ProvidedParameters() {
38-
this.map = new HashMap<>();
36+
public ProvidedParameters(Map<String, String> backendValues, String stringRepresentation) {
37+
this.backendValues = backendValues;
38+
this.stringRepresentation = stringRepresentation;
3939
}
4040

4141
public int size() {
42-
return map.size();
42+
return backendValues.size();
4343
}
4444

45-
public boolean containsParameter(String parameterId) {
46-
return map.containsKey(parameterId);
45+
public String getValue(String parameterId) {
46+
return backendValues.get(parameterId);
4747
}
4848

49-
public String getValue(String parameterId) {
50-
return map.get(parameterId);
49+
@Override
50+
public String toString() {
51+
return stringRepresentation;
5152
}
5253
}

src/main/java/eu/openanalytics/containerproxy/service/ParametersService.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
*/
2121
package eu.openanalytics.containerproxy.service;
2222

23+
import com.fasterxml.jackson.core.JsonProcessingException;
24+
import com.fasterxml.jackson.databind.ObjectMapper;
2325
import eu.openanalytics.containerproxy.model.runtime.AllowedParametersForUser;
2426
import eu.openanalytics.containerproxy.model.runtime.ProvidedParameters;
2527
import eu.openanalytics.containerproxy.model.spec.ParameterDefinition;
@@ -50,9 +52,12 @@ public class ParametersService {
5052

5153
private static final Pattern PARAMETER_ID_PATTERN = Pattern.compile("[a-zA-Z\\d_-]*");
5254

53-
public ParametersService(IProxySpecProvider baseSpecProvider, AccessControlEvaluationService accessControlEvaluationService) {
55+
private final ObjectMapper objectMapper;
56+
57+
public ParametersService(IProxySpecProvider baseSpecProvider, AccessControlEvaluationService accessControlEvaluationService, ObjectMapper objectMapper) {
5458
this.baseSpecProvider = baseSpecProvider;
5559
this.accessControlEvaluationService = accessControlEvaluationService;
60+
this.objectMapper = objectMapper;
5661
}
5762

5863
@PostConstruct
@@ -128,7 +133,7 @@ private void validateSpec(ProxySpec spec) {
128133
* @return the parsed parameters (using backend values)
129134
* @throws InvalidParametersException
130135
*/
131-
public Optional<ProvidedParameters> parseAndValidateRequest(Authentication auth, ProxySpec spec, ProvidedParameters providedParameters) throws InvalidParametersException {
136+
public Optional<ProvidedParameters> parseAndValidateRequest(Authentication auth, ProxySpec spec, Map<String, String> providedParameters) throws InvalidParametersException {
132137
Parameters parameters = spec.getParameters();
133138
if (parameters == null) {
134139
return Optional.empty();
@@ -145,7 +150,7 @@ public Optional<ProvidedParameters> parseAndValidateRequest(Authentication auth,
145150

146151
// check if all parameter ids are provided
147152
for (String parameterId : parameters.getIds()) {
148-
if (!providedParameters.containsParameter(parameterId)) {
153+
if (!providedParameters.containsKey(parameterId)) {
149154
throw new InvalidParametersException("Missing value for parameter " + parameterId);
150155
}
151156
}
@@ -173,13 +178,14 @@ public Optional<ProvidedParameters> parseAndValidateRequest(Authentication auth,
173178
* @param providedParameters the parameters as provided by the user (using human friendly names)
174179
* @return the converted values (i.e. using backend values) if allowed otherwise nothing
175180
*/
176-
private Optional<ProvidedParameters> convertParametersIfAllowed(List<ParameterDefinition> parameters, Parameters.ValueSet valueSet, ProvidedParameters providedParameters) {
177-
Map<String, String> res = new HashMap<>();
181+
private Optional<ProvidedParameters> convertParametersIfAllowed(List<ParameterDefinition> parameters, Parameters.ValueSet valueSet, Map<String, String> providedParameters) {
182+
Map<String, String> backendValues = new HashMap<>();
183+
Map<String, String> names = new HashMap<>();
178184
for (ParameterDefinition parameter: parameters) {
179-
if (!providedParameters.containsParameter(parameter.getId())) {
185+
if (!providedParameters.containsKey(parameter.getId())) {
180186
throw new IllegalStateException("Could not find value for parameter with id" + parameter.getId());
181187
}
182-
String providedValue = providedParameters.getValue(parameter.getId());
188+
String providedValue = providedParameters.get(parameter.getId());
183189
String backendValue = parameter.getValueForName(providedValue);
184190
if (backendValue == null) {
185191
// if we did not find a backend value for the provided value (i.e. the user already provided a backend value),
@@ -195,11 +201,29 @@ private Optional<ProvidedParameters> convertParametersIfAllowed(List<ParameterDe
195201
if (!valueSet.getParameterValues(parameter.getId()).contains(backendValue)) {
196202
return Optional.empty();
197203
}
198-
res.put(parameter.getId(), backendValue);
204+
backendValues.put(parameter.getId(), backendValue);
205+
names.put(parameter.getDisplayNameOrId(), providedValue); // TODO description?
199206
}
200207
// providedParameters contains an allowed value for every parameter
201208
// return the backend values (instead of the names provided by the user)
202-
return Optional.of(new ProvidedParameters(res));
209+
return Optional.of(new ProvidedParameters(backendValues, getStringRepresentation(parameters, providedParameters)));
210+
}
211+
212+
public String getStringRepresentation(List<ParameterDefinition> parameters, Map<String, String> providedParameters) {
213+
List<Map<String, String>> res = new ArrayList<>();
214+
for (ParameterDefinition parameter : parameters) {
215+
res.add(new HashMap<String, String>() {{
216+
put("displayName", parameter.getDisplayNameOrId());
217+
put("description", parameter.getDescription());
218+
put("value", providedParameters.get(parameter.getId())); // important: this is the human-friendly/frontend value
219+
}});
220+
}
221+
222+
try {
223+
return objectMapper.writeValueAsString(res);
224+
} catch (JsonProcessingException e) {
225+
throw new RuntimeException(e);
226+
}
203227
}
204228

205229
public AllowedParametersForUser calculateAllowedParametersForUser(Authentication auth, ProxySpec proxySpec) {

src/main/java/eu/openanalytics/containerproxy/service/ProxyService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.ArrayList;
2727
import java.util.Collections;
2828
import java.util.List;
29+
import java.util.Map;
2930
import java.util.Map.Entry;
3031
import java.util.UUID;
3132
import java.util.concurrent.ExecutorService;
@@ -249,7 +250,7 @@ public Proxy startProxy(ProxySpec spec, boolean ignoreAccessControl) throws Cont
249250
* @return The newly launched proxy.
250251
* @throws ContainerProxyException If the proxy fails to start for any reason.
251252
*/
252-
public Proxy startProxy(ProxySpec spec, boolean ignoreAccessControl, List<RuntimeValue> runtimeValues, String proxyId, ProvidedParameters parameters) throws ContainerProxyException, InvalidParametersException {
253+
public Proxy startProxy(ProxySpec spec, boolean ignoreAccessControl, List<RuntimeValue> runtimeValues, String proxyId, Map<String, String> parameters) throws ContainerProxyException, InvalidParametersException {
253254
if (!ignoreAccessControl && !userService.canAccess(spec)) {
254255
throw new AccessDeniedException(String.format("Cannot start proxy %s: access denied", spec.getId()));
255256
}

src/main/java/eu/openanalytics/containerproxy/service/RuntimeValueService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
import org.springframework.core.env.Environment;
3333
import org.springframework.stereotype.Service;
3434

35+
import javax.annotation.PostConstruct;
3536
import javax.inject.Inject;
37+
import java.util.Map;
3638
import java.util.Optional;
3739

3840
/**
@@ -63,12 +65,13 @@ public class RuntimeValueService {
6365
@Inject
6466
private UserService userService;
6567

68+
@PostConstruct
6669
public void init() {
6770
defaultHeartbeatTimeout = environment.getProperty(PROP_TIMEOUT, Long.class, DEFAULT_TIMEOUT);
6871
defaultMaxLifetime = environment.getProperty(PROP_DEFAULT_PROXY_MAX_LIFETIME, Long.class, -1L);
6972
}
7073

71-
public void createRuntimeValues(ProxySpec spec, ProvidedParameters parameters, Proxy proxy) throws InvalidParametersException {
74+
public void createRuntimeValues(ProxySpec spec, Map<String, String> parameters, Proxy proxy) throws InvalidParametersException {
7275
Optional<ProvidedParameters> providedParametersOptional = parametersService.parseAndValidateRequest(userService.getCurrentAuth(), spec, parameters);
7376
if (providedParametersOptional.isPresent()) {
7477
proxy.addRuntimeValue(new RuntimeValue(ParametersKey.inst, providedParametersOptional.get()));

src/test/java/eu/openanalytics/containerproxy/test/unit/TestParameterServiceAccessControl.java

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
package eu.openanalytics.containerproxy.test.unit;
2222

23+
import com.fasterxml.jackson.databind.ObjectMapper;
2324
import eu.openanalytics.containerproxy.ContainerProxyApplication;
2425
import eu.openanalytics.containerproxy.auth.IAuthenticationBackend;
2526
import eu.openanalytics.containerproxy.model.runtime.AllowedParametersForUser;
@@ -34,7 +35,6 @@
3435
import eu.openanalytics.containerproxy.spec.expression.SpecExpressionResolver;
3536
import eu.openanalytics.containerproxy.test.proxy.PropertyOverrideContextInitializer;
3637
import eu.openanalytics.containerproxy.test.proxy.TestIntegrationOnKube;
37-
import org.apache.commons.lang3.tuple.Pair;
3838
import org.junit.jupiter.api.Assertions;
3939
import org.junit.jupiter.api.Test;
4040
import org.springframework.boot.test.context.SpringBootTest;
@@ -50,6 +50,7 @@
5050
import java.util.Collection;
5151
import java.util.Collections;
5252
import java.util.HashMap;
53+
import java.util.Map;
5354

5455
import static org.mockito.Mockito.mock;
5556
import static org.mockito.Mockito.when;
@@ -65,6 +66,9 @@ public class TestParameterServiceAccessControl {
6566
@Inject
6667
private IProxySpecProvider proxySpecProvider;
6768

69+
@Inject
70+
private ObjectMapper objectMapper;
71+
6872
@Inject
6973
private ProxyService proxyService;
7074
private UserService userService;
@@ -76,7 +80,7 @@ public void init() {
7680
SpecExpressionResolver specExpressionResolver = new SpecExpressionResolver(new GenericApplicationContext());
7781
AccessControlEvaluationService accessControlEvaluationService = new AccessControlEvaluationService(authBackend, userService, specExpressionResolver);
7882

79-
parametersService = new ParametersService(proxySpecProvider, accessControlEvaluationService);
83+
parametersService = new ParametersService(proxySpecProvider, accessControlEvaluationService, objectMapper);
8084
}
8185

8286
@Test
@@ -117,31 +121,31 @@ public void testWithAccessControl() throws InvalidParametersException {
117121
Assertions.assertFalse(allowedParametersForUser.getAllowedCombinations().contains(Arrays.asList(1, 1, 4)));
118122

119123
// try to "start" the app with correct parameters
120-
ProvidedParameters providedParameters = new ProvidedParameters(new HashMap<String, String>() {{
124+
Map<String, String> providedParameters = new HashMap<String, String>() {{
121125
put("environment", "base_r");
122126
put("version", "4.0.5");
123127
put("memory", "8G");
124-
}});
128+
}};
125129

126130
Assertions.assertTrue(parametersService.parseAndValidateRequest(auth, spec, providedParameters).isPresent());
127131

128132
// try to "start" the app with not-allowed parameters
129-
ProvidedParameters providedParameters2 = new ProvidedParameters(new HashMap<String, String>() {{
133+
Map<String, String> providedParameters2 = new HashMap<String, String>() {{
130134
put("environment", "breeding_r");
131135
put("version", "4.0.3");
132136
put("memory", "5G");
133-
}});
137+
}};
134138

135139
Assertions.assertThrows(InvalidParametersException.class,
136140
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters2),
137141
"Provided parameter values are not allowed");
138142

139143
// try to "start" the app with not-allowed parameters
140-
ProvidedParameters providedParameters3 = new ProvidedParameters(new HashMap<String, String>() {{
144+
Map<String, String> providedParameters3 = new HashMap<String, String>() {{
141145
put("environment", "biogrid_r");
142146
put("version", "4.0.3");
143147
put("memory", "25G");
144-
}});
148+
}};
145149

146150
Assertions.assertThrows(InvalidParametersException.class,
147151
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters3),
@@ -189,20 +193,20 @@ public void testWithAccessControlWithGroupMembership() throws InvalidParametersE
189193
Assertions.assertFalse(allowedParametersForUser.getAllowedCombinations().contains(Arrays.asList(4, 1, 1)));
190194

191195
// try to "start" the app with correct parameters
192-
ProvidedParameters providedParameters = new ProvidedParameters(new HashMap<String, String>() {{
196+
Map<String, String> providedParameters = new HashMap<String, String>() {{
193197
put("environment", "breeding_r");
194198
put("version", "4.0.3");
195199
put("memory", "5G");
196-
}});
200+
}};
197201

198202
Assertions.assertTrue(parametersService.parseAndValidateRequest(auth, spec, providedParameters).isPresent());
199203

200204
// try to "start" the app with not-allowed parameters
201-
ProvidedParameters providedParameters3 = new ProvidedParameters(new HashMap<String, String>() {{
205+
Map<String, String> providedParameters3 = new HashMap<String, String>() {{
202206
put("environment", "biogrid_r");
203207
put("version", "4.0.3");
204208
put("memory", "25G");
205-
}});
209+
}};
206210

207211
Assertions.assertThrows(InvalidParametersException.class,
208212
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters3),
@@ -249,31 +253,31 @@ public void testWithAccessControlWithAccessExpression() throws InvalidParameters
249253
Assertions.assertFalse(allowedParametersForUser.getAllowedCombinations().contains(Arrays.asList(4, 1, 1)));
250254

251255
// try to "start" the app with correct parameters
252-
ProvidedParameters providedParameters = new ProvidedParameters(new HashMap<String, String>() {{
256+
Map<String, String> providedParameters = new HashMap<String, String>() {{
253257
put("environment", "biogrid_r");
254258
put("version", "4.1.13");
255259
put("memory", "8G");
256-
}});
260+
}};
257261

258262
Assertions.assertTrue(parametersService.parseAndValidateRequest(auth, spec, providedParameters).isPresent());
259263

260264
// try to "start" the app with not-allowed parameters
261-
ProvidedParameters providedParameters2 = new ProvidedParameters(new HashMap<String, String>() {{
265+
Map<String, String> providedParameters2 = new HashMap<String, String>() {{
262266
put("environment", "breeding_r");
263267
put("version", "4.0.3");
264268
put("memory", "5G");
265-
}});
269+
}};
266270

267271
Assertions.assertThrows(InvalidParametersException.class,
268272
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters2),
269273
"Provided parameter values are not allowed");
270274

271275
// try to "start" the app with not-allowed parameters
272-
ProvidedParameters providedParameters3 = new ProvidedParameters(new HashMap<String, String>() {{
276+
Map<String, String> providedParameters3 = new HashMap<String, String>() {{
273277
put("environment", "biogrid_r");
274278
put("version", "4.0.3");
275279
put("memory", "25G");
276-
}});
280+
}};
277281

278282
Assertions.assertThrows(InvalidParametersException.class,
279283
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters3),
@@ -320,31 +324,31 @@ public void testWithAccessControlWithAccessUsers() throws InvalidParametersExcep
320324
Assertions.assertFalse(allowedParametersForUser.getAllowedCombinations().contains(Arrays.asList(1, 1, 4)));
321325

322326
// try to "start" the app with correct parameters
323-
ProvidedParameters providedParameters = new ProvidedParameters(new HashMap<String, String>() {{
327+
Map<String, String> providedParameters = new HashMap<String, String>() {{
324328
put("environment", "biogrid_r");
325329
put("version", "4.0.3");
326330
put("memory", "25G");
327-
}});
331+
}};
328332

329333
Assertions.assertTrue(parametersService.parseAndValidateRequest(auth, spec, providedParameters).isPresent());
330334

331335
// try to "start" the app with not-allowed parameters
332-
ProvidedParameters providedParameters2 = new ProvidedParameters(new HashMap<String, String>() {{
336+
Map<String, String> providedParameters2 = new HashMap<String, String>() {{
333337
put("environment", "breeding_r");
334338
put("version", "4.0.3");
335339
put("memory", "5G");
336-
}});
340+
}};
337341

338342
Assertions.assertThrows(InvalidParametersException.class,
339343
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters2),
340344
"Provided parameter values are not allowed");
341345

342346
// try to "start" the app with not-allowed parameters
343-
ProvidedParameters providedParameters3 = new ProvidedParameters(new HashMap<String, String>() {{
347+
Map<String, String> providedParameters3 = new HashMap<String, String>() {{
344348
put("environment", "biogrid_r");
345349
put("version", "4.1.13");
346350
put("memory", "8G");
347-
}});
351+
}};
348352

349353
Assertions.assertThrows(InvalidParametersException.class,
350354
() -> parametersService.parseAndValidateRequest(auth, spec, providedParameters3),

0 commit comments

Comments
 (0)