|
27 | 27 | import eu.openanalytics.containerproxy.model.spec.ProxySpec; |
28 | 28 | import eu.openanalytics.containerproxy.spec.expression.SpelException; |
29 | 29 | import eu.openanalytics.containerproxy.test.helpers.ContainerSetup; |
| 30 | +import eu.openanalytics.containerproxy.test.helpers.ShinyProxyClient; |
30 | 31 | import eu.openanalytics.containerproxy.test.helpers.ShinyProxyInstance; |
31 | 32 | import eu.openanalytics.containerproxy.test.helpers.TestUtil; |
32 | 33 | import eu.openanalytics.containerproxy.util.Retrying; |
@@ -1355,6 +1356,152 @@ public void launchProxyWithAdditionalPersistentManifestsUsingAuthObjects() { |
1355 | 1356 | } |
1356 | 1357 | } |
1357 | 1358 |
|
| 1359 | + /** |
| 1360 | + * Test whether kubernetes-authorized-pod-patches works. |
| 1361 | + */ |
| 1362 | + @Test |
| 1363 | + public void launchProxyWithAuthorizedPodPatches() { |
| 1364 | + try (ContainerSetup k8s = new ContainerSetup("kubernetes")) { |
| 1365 | + // launch as user demo |
| 1366 | + String id = inst.client.startProxy("01_hello_pod_patches_auth"); |
| 1367 | + Proxy proxy = inst.proxyService.getProxy(id); |
| 1368 | + |
| 1369 | + PodList podList = k8s.client.pods().inNamespace(k8s.namespace).list(); |
| 1370 | + Assertions.assertEquals(1, podList.getItems().size()); |
| 1371 | + Pod pod = podList.getItems().get(0); |
| 1372 | + Assertions.assertEquals("Running", pod.getStatus().getPhase()); |
| 1373 | + Assertions.assertEquals(k8s.namespace, pod.getMetadata().getNamespace()); |
| 1374 | + Assertions.assertEquals("sp-pod-" + proxy.getId() + "-0", pod.getMetadata().getName()); |
| 1375 | + Assertions.assertEquals(1, pod.getStatus().getContainerStatuses().size()); |
| 1376 | + ContainerStatus container = pod.getStatus().getContainerStatuses().get(0); |
| 1377 | + Assertions.assertEquals(true, container.getReady()); |
| 1378 | + Assertions.assertTrue(container.getImage().endsWith("openanalytics/shinyproxy-integration-test-app:latest")); |
| 1379 | + |
| 1380 | + // Check Env Variables |
| 1381 | + List<EnvVar> envList = pod.getSpec().getContainers().get(0).getEnv(); |
| 1382 | + Map<String, EnvVar> env = envList.stream().collect(Collectors.toMap(EnvVar::getName, e -> e)); |
| 1383 | + Assertions.assertTrue(env.containsKey("VAR_FOR_DEMO")); |
| 1384 | + Assertions.assertEquals("VALUE", env.get("VAR_FOR_DEMO").getValue()); // value is a String "null" |
| 1385 | + Assertions.assertFalse(env.containsKey("VAR_FOR_DEMO2")); |
| 1386 | + |
| 1387 | + inst.proxyService.stopProxy(null, proxy, true).run(); |
| 1388 | + |
| 1389 | + // all pods should be deleted |
| 1390 | + assertNoPods(k8s); |
| 1391 | + } |
| 1392 | + try (ContainerSetup k8s = new ContainerSetup("kubernetes")) { |
| 1393 | + // launch as user demo2 |
| 1394 | + ShinyProxyClient clientDemo2 = inst.getClient("demo2"); |
| 1395 | + String id = clientDemo2.startProxy("01_hello_pod_patches_auth"); |
| 1396 | + Proxy proxy = inst.proxyService.getProxy(id); |
| 1397 | + |
| 1398 | + PodList podList = k8s.client.pods().inNamespace(k8s.namespace).list(); |
| 1399 | + Assertions.assertEquals(1, podList.getItems().size()); |
| 1400 | + Pod pod = podList.getItems().get(0); |
| 1401 | + Assertions.assertEquals("Running", pod.getStatus().getPhase()); |
| 1402 | + Assertions.assertEquals(k8s.namespace, pod.getMetadata().getNamespace()); |
| 1403 | + Assertions.assertEquals("sp-pod-" + proxy.getId() + "-0", pod.getMetadata().getName()); |
| 1404 | + Assertions.assertEquals(1, pod.getStatus().getContainerStatuses().size()); |
| 1405 | + ContainerStatus container = pod.getStatus().getContainerStatuses().get(0); |
| 1406 | + Assertions.assertEquals(true, container.getReady()); |
| 1407 | + Assertions.assertTrue(container.getImage().endsWith("openanalytics/shinyproxy-integration-test-app:latest")); |
| 1408 | + |
| 1409 | + // Check Env Variables |
| 1410 | + List<EnvVar> envList = pod.getSpec().getContainers().get(0).getEnv(); |
| 1411 | + Map<String, EnvVar> env = envList.stream().collect(Collectors.toMap(EnvVar::getName, e -> e)); |
| 1412 | + Assertions.assertFalse(env.containsKey("VAR_FOR_DEMO")); |
| 1413 | + Assertions.assertTrue(env.containsKey("VAR_FOR_DEMO2")); |
| 1414 | + Assertions.assertEquals("VALUE", env.get("VAR_FOR_DEMO2").getValue()); // value is a String "null" |
| 1415 | + |
| 1416 | + inst.proxyService.stopProxy(null, proxy, true).run(); |
| 1417 | + |
| 1418 | + // all pods should be deleted |
| 1419 | + assertNoPods(k8s); |
| 1420 | + } |
| 1421 | + } |
| 1422 | + |
| 1423 | + @Test |
| 1424 | + public void launchProxyWithAuthorizedAdditionalManifests() { |
| 1425 | + try (ContainerSetup k8s = new ContainerSetup("kubernetes")) { |
| 1426 | + // launch as user demo |
| 1427 | + String id = inst.client.startProxy("01_hello_manifests_auth"); |
| 1428 | + Proxy proxy = inst.proxyService.getProxy(id); |
| 1429 | + |
| 1430 | + PodList podList = k8s.client.pods().inNamespace(k8s.namespace).list(); |
| 1431 | + Assertions.assertEquals(1, podList.getItems().size()); |
| 1432 | + Pod pod = podList.getItems().get(0); |
| 1433 | + Assertions.assertEquals("Running", pod.getStatus().getPhase()); |
| 1434 | + Assertions.assertEquals(k8s.namespace, pod.getMetadata().getNamespace()); |
| 1435 | + Assertions.assertEquals("sp-pod-" + proxy.getId() + "-0", pod.getMetadata().getName()); |
| 1436 | + Assertions.assertEquals(1, pod.getStatus().getContainerStatuses().size()); |
| 1437 | + ContainerStatus container = pod.getStatus().getContainerStatuses().get(0); |
| 1438 | + Assertions.assertEquals(true, container.getReady()); |
| 1439 | + Assertions.assertTrue(container.getImage().endsWith("openanalytics/shinyproxy-integration-test-app:latest")); |
| 1440 | + |
| 1441 | + // additional manifest |
| 1442 | + Secret secret = k8s.getSingleSecret(k8s.namespace); |
| 1443 | + Assertions.assertEquals(k8s.namespace, secret.getMetadata().getNamespace()); |
| 1444 | + Assertions.assertEquals("manifests-secret-demo", secret.getMetadata().getName()); |
| 1445 | + |
| 1446 | + // additional persistent manifest |
| 1447 | + PersistentVolumeClaimList claimList = k8s.client.persistentVolumeClaims().inNamespace(k8s.namespace).list(); |
| 1448 | + Assertions.assertEquals(1, claimList.getItems().size()); |
| 1449 | + PersistentVolumeClaim claim = claimList.getItems().get(0); |
| 1450 | + Assertions.assertEquals(k8s.namespace, claim.getMetadata().getNamespace()); |
| 1451 | + Assertions.assertEquals("manifests-pvc-demo", claim.getMetadata().getName()); |
| 1452 | + |
| 1453 | + inst.proxyService.stopProxy(null, proxy, true).run(); |
| 1454 | + |
| 1455 | + // all pods should be deleted |
| 1456 | + assertNoPods(k8s); |
| 1457 | + // the secret should be deleted |
| 1458 | + assertNoSecrets(k8s); |
| 1459 | + |
| 1460 | + // the PVC should not be deleted |
| 1461 | + Assertions.assertEquals(1, k8s.client.persistentVolumeClaims().inNamespace(k8s.namespace).list().getItems().size()); |
| 1462 | + } |
| 1463 | + |
| 1464 | + try (ContainerSetup k8s = new ContainerSetup("kubernetes")) { |
| 1465 | + // launch as user demo2 |
| 1466 | + ShinyProxyClient clientDemo2 = inst.getClient("demo2"); |
| 1467 | + String id = clientDemo2.startProxy("01_hello_manifests_auth"); |
| 1468 | + Proxy proxy = inst.proxyService.getProxy(id); |
| 1469 | + |
| 1470 | + PodList podList = k8s.client.pods().inNamespace(k8s.namespace).list(); |
| 1471 | + Assertions.assertEquals(1, podList.getItems().size()); |
| 1472 | + Pod pod = podList.getItems().get(0); |
| 1473 | + Assertions.assertEquals("Running", pod.getStatus().getPhase()); |
| 1474 | + Assertions.assertEquals(k8s.namespace, pod.getMetadata().getNamespace()); |
| 1475 | + Assertions.assertEquals("sp-pod-" + proxy.getId() + "-0", pod.getMetadata().getName()); |
| 1476 | + Assertions.assertEquals(1, pod.getStatus().getContainerStatuses().size()); |
| 1477 | + ContainerStatus container = pod.getStatus().getContainerStatuses().get(0); |
| 1478 | + Assertions.assertEquals(true, container.getReady()); |
| 1479 | + Assertions.assertTrue(container.getImage().endsWith("openanalytics/shinyproxy-integration-test-app:latest")); |
| 1480 | + |
| 1481 | + // additional manifest |
| 1482 | + Secret secret = k8s.getSingleSecret(k8s.namespace); |
| 1483 | + Assertions.assertEquals(k8s.namespace, secret.getMetadata().getNamespace()); |
| 1484 | + Assertions.assertEquals("manifests-secret-demo2", secret.getMetadata().getName()); |
| 1485 | + |
| 1486 | + // additional persistent manifest |
| 1487 | + PersistentVolumeClaimList claimList = k8s.client.persistentVolumeClaims().inNamespace(k8s.namespace).list(); |
| 1488 | + Assertions.assertEquals(1, claimList.getItems().size()); |
| 1489 | + PersistentVolumeClaim claim = claimList.getItems().get(0); |
| 1490 | + Assertions.assertEquals(k8s.namespace, claim.getMetadata().getNamespace()); |
| 1491 | + Assertions.assertEquals("manifests-pvc-demo2", claim.getMetadata().getName()); |
| 1492 | + |
| 1493 | + inst.proxyService.stopProxy(null, proxy, true).run(); |
| 1494 | + |
| 1495 | + // all pods should be deleted |
| 1496 | + assertNoPods(k8s); |
| 1497 | + // the secret should be deleted |
| 1498 | + assertNoSecrets(k8s); |
| 1499 | + |
| 1500 | + // the PVC should not be deleted |
| 1501 | + Assertions.assertEquals(1, k8s.client.persistentVolumeClaims().inNamespace(k8s.namespace).list().getItems().size()); |
| 1502 | + } |
| 1503 | + } |
| 1504 | + |
1358 | 1505 | private void assertNoPods(ContainerSetup k8s) { |
1359 | 1506 | boolean cleanedUp = Retrying.retry((c, m) -> { |
1360 | 1507 | List<Pod> pods1 = k8s.client.pods().inNamespace(k8s.namespace).list().getItems(); |
|
0 commit comments