Skip to content

Commit 2535e99

Browse files
committed
Ref #32108: add tests for auth pod patches and manifests
1 parent f5135f4 commit 2535e99

2 files changed

Lines changed: 238 additions & 0 deletions

File tree

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

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import eu.openanalytics.containerproxy.model.spec.ProxySpec;
2828
import eu.openanalytics.containerproxy.spec.expression.SpelException;
2929
import eu.openanalytics.containerproxy.test.helpers.ContainerSetup;
30+
import eu.openanalytics.containerproxy.test.helpers.ShinyProxyClient;
3031
import eu.openanalytics.containerproxy.test.helpers.ShinyProxyInstance;
3132
import eu.openanalytics.containerproxy.test.helpers.TestUtil;
3233
import eu.openanalytics.containerproxy.util.Retrying;
@@ -1355,6 +1356,152 @@ public void launchProxyWithAdditionalPersistentManifestsUsingAuthObjects() {
13551356
}
13561357
}
13571358

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+
13581505
private void assertNoPods(ContainerSetup k8s) {
13591506
boolean cleanedUp = Retrying.retry((c, m) -> {
13601507
List<Pod> pods1 = k8s.client.pods().inNamespace(k8s.namespace).list().getItems();

src/test/resources/application-test-kubernetes.yml

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,97 @@ proxy:
746746
port-mapping:
747747
- name: default
748748
port: 3838
749+
- id: 01_hello_pod_patches_auth
750+
container-specs:
751+
- image: "openanalytics/shinyproxy-integration-test-app"
752+
cmd: [ "R", "-e", "shinyproxy::run_01_hello()" ]
753+
port-mapping:
754+
- name: default
755+
port: 3838
756+
kubernetes-authorized-pod-patches:
757+
- access-control:
758+
users:
759+
- demo
760+
patches: |
761+
- op: add
762+
path: /spec/containers/0/env/-
763+
value:
764+
name: VAR_FOR_DEMO
765+
value: VALUE
766+
- access-control:
767+
users:
768+
- demo2
769+
patches: |
770+
- op: add
771+
path: /spec/containers/0/env/-
772+
value:
773+
name: VAR_FOR_DEMO2
774+
value: VALUE
775+
- id: 01_hello_manifests_auth
776+
container-specs:
777+
- image: "openanalytics/shinyproxy-integration-test-app"
778+
cmd: [ "R", "-e", "shinyproxy::run_01_hello()" ]
779+
port-mapping:
780+
- name: default
781+
port: 3838
782+
kubernetes-authorized-additional-manifests:
783+
- access-control:
784+
users:
785+
- demo
786+
manifests:
787+
- |
788+
apiVersion: v1
789+
kind: Secret
790+
metadata:
791+
name: manifests-secret-demo
792+
type: Opaque
793+
data:
794+
password: cGFzc3dvcmQ=
795+
- access-control:
796+
users:
797+
- demo2
798+
manifests:
799+
- |
800+
apiVersion: v1
801+
kind: Secret
802+
metadata:
803+
name: manifests-secret-demo2
804+
type: Opaque
805+
data:
806+
password: cGFzc3dvcmQ=
807+
kubernetes-authorized-additional-persistent-manifests:
808+
- access-control:
809+
users:
810+
- demo
811+
manifests:
812+
- |
813+
apiVersion: v1
814+
kind: PersistentVolumeClaim
815+
metadata:
816+
name: manifests-pvc-demo
817+
spec:
818+
storageClassName: standard
819+
accessModes:
820+
- ReadWriteOnce
821+
resources:
822+
requests:
823+
storage: 5Gi
824+
- access-control:
825+
users:
826+
- demo2
827+
manifests:
828+
- |
829+
apiVersion: v1
830+
kind: PersistentVolumeClaim
831+
metadata:
832+
name: manifests-pvc-demo2
833+
spec:
834+
storageClassName: standard
835+
accessModes:
836+
- ReadWriteOnce
837+
resources:
838+
requests:
839+
storage: 5Gi
749840
750841
appNamespaces:
751842
- itest-overridden

0 commit comments

Comments
 (0)