From 841667fb9b07a7712b4b05004f62e823b0c406ac Mon Sep 17 00:00:00 2001 From: mamunozgil <miguel.munoz-gil@hft-stuttgart.de> Date: Fri, 17 Jan 2025 14:44:55 +0100 Subject: [PATCH] Add dynamic paths to test --- .../dtabackend/rest/v1/task/TaskUpload.java | 6 +-- .../dtabackend/utils/DockerUtil.java | 47 +++++++++++++++---- .../dtabackend/utils/ExecuteTestUtil.java | 6 +-- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java b/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java index a070bef..0e7c788 100644 --- a/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java +++ b/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java @@ -33,14 +33,14 @@ public class TaskUpload { private static final Logger LOG = LogManager.getLogger(TaskUpload.class); private final RepoUtil repoUtil; - private final Path testTmpPath; + private final Path assignmentSubmissionsPath; private final ExecuteTestUtil executeTestUtil; private final Tika tika; public TaskUpload(Environment env, RepoUtil repoUtil, ExecuteTestUtil executeTestUtil) { this.repoUtil = repoUtil; this.executeTestUtil = executeTestUtil; - this.testTmpPath = Paths.get(env.getProperty("tests.tmp.dir")); + this.assignmentSubmissionsPath = Paths.get(env.getProperty("tests.tmp.dir")); this.tika = new Tika(); } @@ -68,7 +68,7 @@ public class TaskUpload { private Path createWorkDirectory() throws IOException { LOG.debug("Creating new temporary directory"); - Path workDirectory = Files.createTempDirectory(testTmpPath, "dta-submission"); + Path workDirectory = Files.createTempDirectory(assignmentSubmissionsPath, "dta-submission"); LOG.debug("Working directory for test: {}", workDirectory.toAbsolutePath()); return workDirectory; } diff --git a/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java b/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java index 17f1b2e..194388b 100644 --- a/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java +++ b/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java @@ -59,27 +59,56 @@ public class DockerUtil { image, e.getMessage())); } - + LOG.debug("creating container"); CreateContainerResponse containerResponse; try { + // Extract paths from binds + String testPath = null; + String srcPath = null; + String resultPath = null; + for (Bind bind : binds) { + Volume volume = bind.getVolume(); + if (volume.getPath().contains("test")) { + testPath = bind.getPath(); + } else if (volume.getPath().contains("src")) { + srcPath = bind.getPath(); + } else if (volume.getPath().contains("result")) { + resultPath = bind.getPath(); + } + } + + if (testPath == null || srcPath == null || resultPath == null) { + throw new IllegalArgumentException("All required paths (testPath, srcPath, resultPath) must be provided."); + } + containerResponse = dockerClient.createContainerCmd("testcontainer") .withImage(image) .withHostConfig( HostConfig.newHostConfig() - .withBinds(binds)) + .withBinds(binds) + ) + .withCmd( + "java", + "-Djava.security.egd=file:/dev/./urandom", + "-jar", + "/data/app.jar", + String.format("%s:%s", srcPath, testPath), + "/data/libs/*:/data/test/libs/*", + resultPath + ) .exec(); } catch (DockerException e) { LOG.error(String.format( "Creating Docker Testrunner container failed with %s", e.getMessage())); throw e; } - + LOG.debug(String.format("container created: %s", containerResponse.getId())); - + LOG.debug(String.format("starting container %s", containerResponse.getId())); dockerClient.startContainerCmd(containerResponse.getId()).exec(); - + LOG.debug(String.format("retrieving logs for container %s", containerResponse.getId())); dockerClient.logContainerCmd(containerResponse.getId()) .withStdOut(true) @@ -92,7 +121,7 @@ public class DockerUtil { LOG.debug(String.format("LOG: %s", new String(frame.getPayload(), StandardCharsets.UTF_8))); } }); - + LOG.debug(String.format("waiting for completion of container %s", containerResponse.getId())); int ret = dockerClient .waitContainerCmd(containerResponse.getId()) @@ -100,12 +129,12 @@ public class DockerUtil { .awaitCompletion() .awaitStatusCode(); LOG.debug(String.format("container completed with status %d", ret)); - + LOG.debug(String.format("deleting container %s", containerResponse.getId())); dockerClient.removeContainerCmd(containerResponse.getId()) .withRemoveVolumes(true) .exec(); - + return ret; - } + } } diff --git a/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java b/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java index fb4a3fb..cacb6b9 100644 --- a/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java +++ b/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java @@ -104,9 +104,9 @@ public class ExecuteTestUtil { // Start the test-container with professor-given image and submission-specific volume mounts dockerUtil.runContainer( image, - new Bind(testPath.toString(), new Volume("/data/test")), - new Bind(srcPath.toString(), new Volume("/data/src")), - new Bind(resultPath.toString(), new Volume("/data/result")) + new Bind(testPath.toString(), new Volume("test")), + new Bind(srcPath.toString(), new Volume("src")), + new Bind(resultPath.toString(), new Volume("result")) ); return generateResult(assignmentId, resultPath, testPath); -- GitLab