Skip to content

Commit b8038be

Browse files
committed
Ref #25533: Add more (integration) tests
1 parent b52c203 commit b8038be

5 files changed

Lines changed: 289 additions & 3 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public int size() {
4545
}
4646

4747
public String getValue(String parameterId) {
48+
if (!backendValues.containsKey(parameterId)) {
49+
throw new IllegalArgumentException(String.format("The parameter with id \"%s\" does not exist!", parameterId));
50+
}
4851
return backendValues.get(parameterId);
4952
}
5053

src/test/java/eu/openanalytics/containerproxy/test/proxy/TestIntegrationOnKube.java

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package eu.openanalytics.containerproxy.test.proxy;
2222

2323
import eu.openanalytics.containerproxy.ContainerProxyApplication;
24+
import eu.openanalytics.containerproxy.ContainerProxyException;
2425
import eu.openanalytics.containerproxy.backend.IContainerBackend;
2526
import eu.openanalytics.containerproxy.backend.kubernetes.KubernetesBackend;
2627
import eu.openanalytics.containerproxy.model.runtime.Proxy;
@@ -56,16 +57,17 @@
5657
import org.springframework.context.annotation.Bean;
5758
import org.springframework.context.annotation.Primary;
5859
import org.springframework.core.env.Environment;
59-
import org.springframework.session.web.http.DefaultCookieSerializer;
6060
import org.springframework.test.context.ActiveProfiles;
6161
import org.springframework.test.context.ContextConfiguration;
6262

6363
import javax.inject.Inject;
6464
import java.io.ByteArrayInputStream;
6565
import java.net.URI;
6666
import java.util.Collections;
67+
import java.util.HashMap;
6768
import java.util.List;
6869
import java.util.Map;
70+
import java.util.UUID;
6971
import java.util.stream.Collectors;
7072

7173

@@ -1496,6 +1498,115 @@ public void advancedRuntimeLabels() {
14961498
});
14971499
}
14981500

1501+
@Test
1502+
public void launchProxyWithParameters() {
1503+
setup((client, namespace, overriddenNamespace) -> {
1504+
ProxySpec spec = proxyService.getProxySpec("parameters");
1505+
Proxy proxy = proxyService.startProxy(spec, true, null,
1506+
UUID.randomUUID().toString(),
1507+
new HashMap<String, String>() {{
1508+
put("environment", "base_r");
1509+
put("version", "4.0.5");
1510+
put("memory", "2G");
1511+
}});
1512+
1513+
PodList podList = client.pods().inNamespace(namespace).list();
1514+
Assertions.assertEquals(1, podList.getItems().size());
1515+
Pod pod = podList.getItems().get(0);
1516+
ContainerStatus container = pod.getStatus().getContainerStatuses().get(0);
1517+
1518+
Assertions.assertEquals(true, container.getReady());
1519+
Assertions.assertEquals("ledfan/rstudio_base_r:4_0_5", container.getImage());
1520+
Assertions.assertEquals("2G", pod.getSpec().getContainers().get(0).getResources().getLimits().get("memory").getAmount());
1521+
List<EnvVar> envList = pod.getSpec().getContainers().get(0).getEnv();
1522+
Map<String, EnvVar> env = envList.stream().collect(Collectors.toMap(EnvVar::getName, e -> e));
1523+
1524+
Assertions.assertTrue(env.containsKey("ENVIRONMENT"));
1525+
Assertions.assertEquals("ledfan/rstudio_base_r", env.get("ENVIRONMENT").getValue());
1526+
Assertions.assertTrue(env.containsKey("VERSION"));
1527+
Assertions.assertEquals("4_0_5", env.get("VERSION").getValue());
1528+
Assertions.assertTrue(env.containsKey("MEMORY"));
1529+
Assertions.assertEquals("2G", env.get("MEMORY").getValue());
1530+
Assertions.assertTrue(env.containsKey("VALUESET_NAME"));
1531+
Assertions.assertEquals("the-first-value-set", env.get("VALUESET_NAME").getValue());
1532+
1533+
proxyService.stopProxy(proxy, false, true);
1534+
1535+
// Give Kube the time to clean
1536+
Thread.sleep(2000);
1537+
1538+
// all pods should be deleted
1539+
podList = client.pods().inNamespace(namespace).list();
1540+
Assertions.assertEquals(0, podList.getItems().size());
1541+
1542+
Assertions.assertEquals(0, proxyService.getProxies(null, true).size());
1543+
});
1544+
}
1545+
1546+
@Test
1547+
public void launchProxyWithParametersWithNullValueSetName() {
1548+
setup((client, namespace, overriddenNamespace) -> {
1549+
ProxySpec spec = proxyService.getProxySpec("parameters-null");
1550+
Proxy proxy = proxyService.startProxy(spec, true, null,
1551+
UUID.randomUUID().toString(),
1552+
new HashMap<String, String>() {{
1553+
put("environment", "base_r");
1554+
put("version", "4.0.5");
1555+
put("memory", "2G");
1556+
}});
1557+
1558+
PodList podList = client.pods().inNamespace(namespace).list();
1559+
Assertions.assertEquals(1, podList.getItems().size());
1560+
Pod pod = podList.getItems().get(0);
1561+
ContainerStatus container = pod.getStatus().getContainerStatuses().get(0);
1562+
1563+
Assertions.assertEquals(true, container.getReady());
1564+
Assertions.assertEquals("ledfan/rstudio_base_r:4_0_5", container.getImage());
1565+
Assertions.assertEquals("2G", pod.getSpec().getContainers().get(0).getResources().getLimits().get("memory").getAmount());
1566+
List<EnvVar> envList = pod.getSpec().getContainers().get(0).getEnv();
1567+
Map<String, EnvVar> env = envList.stream().collect(Collectors.toMap(EnvVar::getName, e -> e));
1568+
1569+
Assertions.assertTrue(env.containsKey("VALUESET_NAME"));
1570+
Assertions.assertNull( env.get("VALUESET_NAME").getValue());
1571+
1572+
proxyService.stopProxy(proxy, false, true);
1573+
1574+
// Give Kube the time to clean
1575+
Thread.sleep(2000);
1576+
1577+
// all pods should be deleted
1578+
podList = client.pods().inNamespace(namespace).list();
1579+
Assertions.assertEquals(0, podList.getItems().size());
1580+
1581+
Assertions.assertEquals(0, proxyService.getProxies(null, true).size());
1582+
});
1583+
}
1584+
1585+
@Test
1586+
public void launchProxyWithParametersWithError() {
1587+
setup((client, namespace, overriddenNamespace) -> {
1588+
ProxySpec spec = proxyService.getProxySpec("parameters-error");
1589+
1590+
Assertions.assertThrows(ContainerProxyException.class, () -> {
1591+
proxyService.startProxy(spec, true, null,
1592+
UUID.randomUUID().toString(),
1593+
new HashMap<String, String>() {{
1594+
put("environment", "base_r");
1595+
put("version", "4.0.5");
1596+
put("memory", "2G");
1597+
}});
1598+
}, "The parameter with id \"non-existing-parameter\" does not exist!");
1599+
1600+
Thread.sleep(2000);
1601+
1602+
// all pods should be deleted
1603+
PodList podList = client.pods().inNamespace(namespace).list();
1604+
Assertions.assertEquals(0, podList.getItems().size());
1605+
1606+
Assertions.assertEquals(0, proxyService.getProxies(null, true).size());
1607+
});
1608+
}
1609+
14991610

15001611
public static class TestConfiguration {
15011612
@Bean

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,24 +191,28 @@ public void testParseAndValidateRequest() throws InvalidParametersException {
191191
Assertions.assertEquals("1", res1.getValue("parameter2"));
192192
Assertions.assertEquals("foo", res1.getValue("parameter3"));
193193
Assertions.assertEquals("yes", res1.getValue("parameter4"));
194+
Assertions.assertEquals("the-first-value-set", res1.getValueSetName());
194195

195196
ProvidedParameters res2 = testAllowedValue(spec, "The letter A", "2", "Foo", "YES");
196197
Assertions.assertEquals("A", res2.getValue("parameter1"));
197198
Assertions.assertEquals("2", res2.getValue("parameter2"));
198199
Assertions.assertEquals("foo", res2.getValue("parameter3"));
199200
Assertions.assertEquals("yes", res2.getValue("parameter4"));
201+
Assertions.assertEquals("the-first-value-set", res2.getValueSetName());
200202

201203
ProvidedParameters res3 = testAllowedValue(spec, "The letter A", "The number 1", "foobarfoo", "NO");
202204
Assertions.assertEquals("A", res3.getValue("parameter1"));
203205
Assertions.assertEquals("1", res3.getValue("parameter2"));
204206
Assertions.assertEquals("foobarfoo", res3.getValue("parameter3"));
205207
Assertions.assertEquals("no", res3.getValue("parameter4"));
208+
Assertions.assertNull(res3.getValueSetName());
206209

207210
ProvidedParameters res4 = testAllowedValue(spec, "The letter A", "The number 1", "barfoobar", "YES");
208211
Assertions.assertEquals("A", res4.getValue("parameter1"));
209212
Assertions.assertEquals("1", res4.getValue("parameter2"));
210213
Assertions.assertEquals("barfoobar", res4.getValue("parameter3"));
211214
Assertions.assertEquals("yes", res4.getValue("parameter4"));
215+
Assertions.assertEquals("the-last-value-set", res4.getValueSetName());
212216

213217
// test that allowed values but invalid combinations are not allowed
214218
testNotAllowedValue(spec, "The letter A", "The number 1", "foobarfoo", "YES");

src/test/resources/application-parameters.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ proxy:
5353
- value: "no"
5454
name: "NO"
5555
value-sets:
56-
- values:
56+
- name: the-first-value-set
57+
values:
5758
parameter1:
5859
- A
5960
- B
@@ -135,7 +136,8 @@ proxy:
135136
- foobarfoo
136137
parameter4:
137138
- "no"
138-
- values:
139+
- name: the-last-value-set
140+
values:
139141
parameter1:
140142
- A
141143
- B

src/test/resources/application-test.yml

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,169 @@ proxy:
417417
type: Opaque
418418
data:
419419
password: b2xkX3Bhc3N3b3Jk
420+
- id: parameters
421+
container-specs:
422+
- image: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('environment')}:#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('version')}"
423+
memory-limit: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('memory')}"
424+
port-mapping:
425+
default: 8787
426+
parameters:
427+
definitions:
428+
- id: environment
429+
value-names:
430+
- value: ledfan/rstudio_base_r
431+
name: base_r
432+
- value: ledfan/rstudio_breeding_r
433+
name: breeding_r
434+
- value: ledfan/rstudio_biogrid_r
435+
name: biogrid_r
436+
- id: version
437+
value-names:
438+
- value: "3_0_6"
439+
name: 3.0.6
440+
- value: "4_0_5"
441+
name: 4.0.5
442+
- value: "4_1_3"
443+
name: 4.1.3
444+
- id: memory
445+
value-sets:
446+
- name: the-first-value-set
447+
values:
448+
environment: ledfan/rstudio_base_r
449+
version:
450+
- "3_0_6"
451+
- "4_0_5"
452+
- "4_1_3"
453+
memory:
454+
- 2G
455+
- 4G
456+
- 8G
457+
- values:
458+
environment: ledfan/rstudio_breeding_r
459+
version: "4_0_3"
460+
memory: 5G
461+
access-control:
462+
groups: breeding
463+
- values:
464+
environment: ledfan/rstudio_biogrid_r
465+
version: "4_1_13"
466+
memory: 8G
467+
access-control:
468+
expression: "#{groups.contains('DEV')}"
469+
- values:
470+
environment: ledfan/rstudio_biogrid_r
471+
version: "4_0_3"
472+
memory: 8G
473+
- values:
474+
environment: ledfan/rstudio_biogrid_r
475+
version: "4_0_3"
476+
memory: 25G
477+
access-control:
478+
users:
479+
- jack
480+
- jeff
481+
kubernetes-pod-patches: |
482+
- op: add
483+
path: /spec/containers/0/env/-
484+
value:
485+
name: ENVIRONMENT
486+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('environment')}"
487+
- op: add
488+
path: /spec/containers/0/env/-
489+
value:
490+
name: VERSION
491+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('version')}"
492+
- op: add
493+
path: /spec/containers/0/env/-
494+
value:
495+
name: MEMORY
496+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('memory')}"
497+
- op: add
498+
path: /spec/containers/0/env/-
499+
value:
500+
name: VALUESET_NAME
501+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValueSetName()}"
502+
- id: parameters-null
503+
container-specs:
504+
- image: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('environment')}:#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('version')}"
505+
memory-limit: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('memory')}"
506+
port-mapping:
507+
default: 8787
508+
parameters:
509+
definitions:
510+
- id: environment
511+
value-names:
512+
- value: ledfan/rstudio_base_r
513+
name: base_r
514+
- value: ledfan/rstudio_breeding_r
515+
name: breeding_r
516+
- value: ledfan/rstudio_biogrid_r
517+
name: biogrid_r
518+
- id: version
519+
value-names:
520+
- value: "3_0_6"
521+
name: 3.0.6
522+
- value: "4_0_5"
523+
name: 4.0.5
524+
- value: "4_1_3"
525+
name: 4.1.3
526+
- id: memory
527+
value-sets:
528+
- values:
529+
environment: ledfan/rstudio_base_r
530+
version:
531+
- "3_0_6"
532+
- "4_0_5"
533+
- "4_1_3"
534+
memory:
535+
- 2G
536+
- 4G
537+
- 8G
538+
kubernetes-pod-patches: |
539+
- op: add
540+
path: /spec/containers/0/env/-
541+
value:
542+
name: VALUESET_NAME
543+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValueSetName()}"
544+
- id: parameters-error
545+
container-specs:
546+
- image: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('environment')}:#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('version')}"
547+
memory-limit: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('memory')}"
548+
port-mapping:
549+
default: 8787
550+
parameters:
551+
definitions:
552+
- id: environment
553+
value-names:
554+
- value: ledfan/rstudio_base_r
555+
name: base_r
556+
- value: ledfan/rstudio_breeding_r
557+
name: breeding_r
558+
- value: ledfan/rstudio_biogrid_r
559+
name: biogrid_r
560+
- id: version
561+
value-names:
562+
- value: "3_0_6"
563+
name: 3.0.6
564+
- value: "4_0_5"
565+
name: 4.0.5
566+
- value: "4_1_3"
567+
name: 4.1.3
568+
- id: memory
569+
value-sets:
570+
- values:
571+
environment: ledfan/rstudio_base_r
572+
version:
573+
- "3_0_6"
574+
- "4_0_5"
575+
- "4_1_3"
576+
memory:
577+
- 2G
578+
- 4G
579+
- 8G
580+
kubernetes-pod-patches: |
581+
- op: add
582+
path: /spec/containers/0/env/-
583+
value:
584+
name: ERROR
585+
value: "#{proxy.getRuntimeObject('SHINYPROXY_PARAMETERS').getValue('non-existing-parameter')}"

0 commit comments

Comments
 (0)