From 432abd2a332af79f2a805dfbbacf9e0156d08347 Mon Sep 17 00:00:00 2001 From: George Brownbridge Date: Mon, 20 Jan 2025 18:08:10 +0000 Subject: [PATCH 1/5] fix-chown-on-copy-issue: Bumped stack projects' version numbers. --- Deploy/stacks/dynamic/stack-clients/docker-compose.yml | 2 +- Deploy/stacks/dynamic/stack-clients/pom.xml | 2 +- Deploy/stacks/dynamic/stack-data-uploader/docker-compose.yml | 2 +- Deploy/stacks/dynamic/stack-data-uploader/pom.xml | 4 ++-- Deploy/stacks/dynamic/stack-manager/docker-compose.yml | 2 +- Deploy/stacks/dynamic/stack-manager/pom.xml | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Deploy/stacks/dynamic/stack-clients/docker-compose.yml b/Deploy/stacks/dynamic/stack-clients/docker-compose.yml index f90b7b0c1b..1592265e1d 100644 --- a/Deploy/stacks/dynamic/stack-clients/docker-compose.yml +++ b/Deploy/stacks/dynamic/stack-clients/docker-compose.yml @@ -1,6 +1,6 @@ services: stack-client: - image: ghcr.io/cambridge-cares/stack-client${IMAGE_SUFFIX}:1.40.0 + image: ghcr.io/cambridge-cares/stack-client${IMAGE_SUFFIX}:1.40.1-fix-chown-on-copy-issue-SNAPSHOT secrets: - blazegraph_password - postgis_password diff --git a/Deploy/stacks/dynamic/stack-clients/pom.xml b/Deploy/stacks/dynamic/stack-clients/pom.xml index 61d68e3072..d237acf7ab 100644 --- a/Deploy/stacks/dynamic/stack-clients/pom.xml +++ b/Deploy/stacks/dynamic/stack-clients/pom.xml @@ -7,7 +7,7 @@ com.cmclinnovations stack-clients - 1.40.0 + 1.40.1-fix-chown-on-copy-issue-SNAPSHOT Stack Clients https://theworldavatar.io diff --git a/Deploy/stacks/dynamic/stack-data-uploader/docker-compose.yml b/Deploy/stacks/dynamic/stack-data-uploader/docker-compose.yml index 8bc5b4e946..dc29718334 100644 --- a/Deploy/stacks/dynamic/stack-data-uploader/docker-compose.yml +++ b/Deploy/stacks/dynamic/stack-data-uploader/docker-compose.yml @@ -1,6 +1,6 @@ services: stack-data-uploader: - image: ghcr.io/cambridge-cares/stack-data-uploader${IMAGE_SUFFIX}:1.40.0 + image: ghcr.io/cambridge-cares/stack-data-uploader${IMAGE_SUFFIX}:1.40.1-fix-chown-on-copy-issue-SNAPSHOT secrets: - blazegraph_password - postgis_password diff --git a/Deploy/stacks/dynamic/stack-data-uploader/pom.xml b/Deploy/stacks/dynamic/stack-data-uploader/pom.xml index 0e75782ce2..6338438bae 100644 --- a/Deploy/stacks/dynamic/stack-data-uploader/pom.xml +++ b/Deploy/stacks/dynamic/stack-data-uploader/pom.xml @@ -7,7 +7,7 @@ com.cmclinnovations stack-data-uploader - 1.40.0 + 1.40.1-fix-chown-on-copy-issue-SNAPSHOT Stack Data Uploader https://theworldavatar.io @@ -29,7 +29,7 @@ com.cmclinnovations stack-clients - 1.40.0 + 1.40.1-fix-chown-on-copy-issue-SNAPSHOT diff --git a/Deploy/stacks/dynamic/stack-manager/docker-compose.yml b/Deploy/stacks/dynamic/stack-manager/docker-compose.yml index ac1c7c3604..0885f04770 100644 --- a/Deploy/stacks/dynamic/stack-manager/docker-compose.yml +++ b/Deploy/stacks/dynamic/stack-manager/docker-compose.yml @@ -1,6 +1,6 @@ services: stack-manager: - image: ghcr.io/cambridge-cares/stack-manager${IMAGE_SUFFIX}:1.40.0 + image: ghcr.io/cambridge-cares/stack-manager${IMAGE_SUFFIX}:1.40.1-fix-chown-on-copy-issue-SNAPSHOT environment: EXTERNAL_PORT: "${EXTERNAL_PORT-3838}" STACK_BASE_DIR: "${STACK_BASE_DIR}" diff --git a/Deploy/stacks/dynamic/stack-manager/pom.xml b/Deploy/stacks/dynamic/stack-manager/pom.xml index 9acd4303e6..5fbbc13649 100644 --- a/Deploy/stacks/dynamic/stack-manager/pom.xml +++ b/Deploy/stacks/dynamic/stack-manager/pom.xml @@ -7,7 +7,7 @@ com.cmclinnovations stack-manager - 1.40.0 + 1.40.1-fix-chown-on-copy-issue-SNAPSHOT Stack Manager https://theworldavatar.io @@ -29,7 +29,7 @@ com.cmclinnovations stack-clients - 1.40.0 + 1.40.1-fix-chown-on-copy-issue-SNAPSHOT From 9e4a522729d05bc5af03fa6db317bb50d3d37dec Mon Sep 17 00:00:00 2001 From: George Brownbridge Date: Tue, 21 Jan 2025 11:15:13 +0000 Subject: [PATCH 2/5] fix-chown-on-copy-issue: Instead of setting the ownership of files transferred between containers in the tar archive the ownership is handled by setting the ```CopyUIDGID``` flag in the Docker API call. This should set the files' owner and group to those of the destination container. --- .../cmclinnovations/stack/clients/docker/DockerClient.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java index e7a3444833..95338d37d5 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java @@ -399,9 +399,7 @@ private void addFileContentToTar(TarArchiveOutputStream tar, String filePath, by filePath = filePath.replace('\\', '/'); TarArchiveEntry entry = new TarArchiveEntry(filePath); entry.setSize(fileContent.length); - entry.setMode(0755); - // Set the files' user and group to the default ones in that container - entry.setIds(1000, 1000); + entry.setMode(0600); tar.putArchiveEntry(entry); tar.write(fileContent); tar.closeArchiveEntry(); @@ -412,6 +410,7 @@ private void sendTarFileContent(String containerId, String remoteDirPath, byte[] CopyArchiveToContainerCmd copyArchiveToContainerCmd = internalClient .copyArchiveToContainerCmd(containerId)) { copyArchiveToContainerCmd.withTarInputStream(is) + .withCopyUIDGID(true) .withRemotePath(remoteDirPath).exec(); } From 4758d76090400a15b1b77f37de65ea4923584c2d Mon Sep 17 00:00:00 2001 From: George Brownbridge Date: Tue, 21 Jan 2025 11:21:23 +0000 Subject: [PATCH 3/5] fix-chown-on-copy-issue: Corrected the spelling of the name of the ```FileIterator``` class. --- .../stack/clients/docker/DockerClient.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java index 95338d37d5..da3840adb4 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java @@ -416,16 +416,16 @@ private void sendTarFileContent(String containerId, String remoteDirPath, byte[] } } - private final class FileIterater implements Iterable>, AutoCloseable { + private final class FileIterator implements Iterable>, AutoCloseable { Path dirPath; private final Stream stream; - public FileIterater(String baseDir) throws IOException { + public FileIterator(String baseDir) throws IOException { dirPath = Path.of(baseDir); stream = Files.walk(Path.of(baseDir)); } - public FileIterater(String baseDir, Collection relativeFilePaths) { + public FileIterator(String baseDir, Collection relativeFilePaths) { dirPath = Path.of(baseDir); stream = relativeFilePaths.stream().map(dirPath::resolve); } @@ -459,7 +459,7 @@ public void sendFilesContent(String containerId, Map files, Stri } public void sendFiles(String containerId, String localDirPath, List filePaths, String remoteDirPath) { - try (FileIterater fileIterator = new FileIterater(localDirPath, filePaths)) { + try (FileIterator fileIterator = new FileIterator(localDirPath, filePaths)) { sendFileEntries(containerId, remoteDirPath, fileIterator); } catch (Exception ex) { throw new RuntimeException("Failed to send the following files to '" + remoteDirPath + "':\n" @@ -468,7 +468,7 @@ public void sendFiles(String containerId, String localDirPath, List file } public void sendFolder(String containerId, String localDirPath, String remoteDirPath) { - try (FileIterater fileIterator = new FileIterater(localDirPath)) { + try (FileIterator fileIterator = new FileIterator(localDirPath)) { sendFileEntries(containerId, remoteDirPath, fileIterator); } catch (Exception ex) { throw new RuntimeException("Failed to send files from folder '" + localDirPath From bd1a9dfe9baf8b9f09d2b6d8f81fd4b15024f1b1 Mon Sep 17 00:00:00 2001 From: George Brownbridge Date: Tue, 21 Jan 2025 11:26:22 +0000 Subject: [PATCH 4/5] fix-chown-on-copy-issue: Added missing ```exec``` call to ```chown``` command in the ```OntopService``` class. --- .../java/com/cmclinnovations/stack/services/OntopService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java index e21be63cff..bab48bd7bf 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java @@ -112,7 +112,7 @@ public void doPostStartUpConfiguration() { DockerClient dockerClient = DockerClient.getInstance(); String containerId = dockerClient.getContainerId(containerName); dockerClient.createComplexCommand(containerId, "chown", "ontop:ontop", String.join(" ", configDirs)) - .withUser("root"); + .withUser("root").exec(); OntopClient ontopClient = OntopClient.getInstance(); configFiles.forEach(f -> { From 6f8600d0c302c77d0a7243c0091c409b7b03746d Mon Sep 17 00:00:00 2001 From: George Brownbridge Date: Tue, 21 Jan 2025 12:04:22 +0000 Subject: [PATCH 5/5] fix-chown-on-copy-issue: Added a `sendFileContent` method to the `DockerClient`, `ContainerClient` and `ContainerService` classes and used it to replace calls to the `sendFilesContent` method when there is only one file. Also tidied up some adjacent code. --- .../stack/clients/citydb/CityTilerClient.java | 11 ++++------- .../stack/clients/docker/ContainerClient.java | 5 +++++ .../stack/clients/docker/DockerClient.java | 7 ++++++- .../stack/clients/geoserver/GeoServerClient.java | 16 +++++++--------- .../stack/clients/ontop/OntopClient.java | 10 +++------- .../stack/services/CityTilerService.java | 5 +---- .../stack/services/ContainerService.java | 16 +++++++++------- .../stack/services/NginxService.java | 2 +- .../stack/services/OntopService.java | 2 +- .../stack/services/PostGISService.java | 10 +++------- .../stack/clients/docker/DockerClientTest.java | 13 +++++++++++++ 11 files changed, 53 insertions(+), 44 deletions(-) diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/citydb/CityTilerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/citydb/CityTilerClient.java index 3ab60fe015..8a5cd7691b 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/citydb/CityTilerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/citydb/CityTilerClient.java @@ -64,18 +64,15 @@ public void generateTiles(String database, String schema, CityTilerOptions optio executeSimpleCommand(containerId, "cp", CityTilerClient.DEFAULT_COLOUR_CONFIG_FILE, CityTilerClient.COLOUR_CONFIG_FILE); } else { - sendFilesContent(containerId, - Map.of(COLOUR_CONFIG_FILE, colours.toString().getBytes()), - "/"); + sendFileContent(containerId, Path.of(COLOUR_CONFIG_FILE), colours.toString().getBytes()); } try (TempDir configDir = makeRemoteTempDir(containerId)) { String configFilename = database + "-" + schema + ".yml"; - sendFilesContent(containerId, - Map.of(configFilename, generateConfigFileContent(database, schema).getBytes()), - configDir.toString()); + sendFileContent(containerId, configDir.getPath().resolve(configFilename), + generateConfigFileContent(database, schema).getBytes()); String crsIn = getCRSFromDatabase(database, schema); @@ -87,7 +84,7 @@ public void generateTiles(String database, String schema, CityTilerOptions optio stream.parallel(); } stream.forEach(entry -> generateTileSet(options, containerId, crsIn, configFilePath, - outputDir, entry.getKey(), entry.getValue())); + outputDir, entry.getKey(), entry.getValue())); } } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/ContainerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/ContainerClient.java index d4c0927cce..ce6fe0df71 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/ContainerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/ContainerClient.java @@ -2,6 +2,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; @@ -67,6 +68,10 @@ protected final void sendFilesContent(String containerId, Map fi DockerClient.getInstance().sendFilesContent(containerId, files, remoteDirPath); } + protected final void sendFileContent(String containerId, Path filePath, byte[] content) { + DockerClient.getInstance().sendFileContent(containerId, filePath, content); + } + protected final void sendFiles(String containerId, String localDirPath, List filePaths, String remoteDirPath) { DockerClient.getInstance().sendFiles(containerId, localDirPath, filePaths, remoteDirPath); diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java index da3840adb4..3a3f7f179a 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/docker/DockerClient.java @@ -458,6 +458,11 @@ public void sendFilesContent(String containerId, Map files, Stri } } + public void sendFileContent(String containerId, Path filePath, byte[] content) { + sendFilesContent(containerId, Map.of(filePath.getFileName().toString(), content), + filePath.getParent().toString()); + } + public void sendFiles(String containerId, String localDirPath, List filePaths, String remoteDirPath) { try (FileIterator fileIterator = new FileIterator(localDirPath, filePaths)) { sendFileEntries(containerId, remoteDirPath, fileIterator); @@ -669,7 +674,7 @@ public void removeSecret(Secret secret) { } public String getDNSIPAddress() { - return "127.0.0.11"; + return "127.0.0.11"; } } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/geoserver/GeoServerClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/geoserver/GeoServerClient.java index 4acbaa56be..86eb9e4382 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/geoserver/GeoServerClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/geoserver/GeoServerClient.java @@ -45,6 +45,7 @@ public class GeoServerClient extends ClientWithEndpoint { public static final Path SERVING_DIRECTORY = Path.of("/opt/geoserver_data/www"); private static final Path STATIC_DATA_DIRECTORY = SERVING_DIRECTORY.resolve("static_data"); private static final Path ICONS_DIRECTORY = SERVING_DIRECTORY.resolve("icons"); + private static final String USER_PROJECTIONS_DIR = "/opt/geoserver_data/user_projections"; private static final String GEOSERVER_RASTER_INDEX_DATABASE_SUFFIX = "_geoserver_indices"; private static final String DIM_PREFIX = "dim_"; @@ -143,10 +144,8 @@ private void loadStaticFile(Path baseDirectory, GeoserverOtherStaticFile file) { sendFolder(containerId, absSourcePath.toString(), absTargetPath.toString()); } else { try { - sendFilesContent(containerId, - Map.of(file.getTarget(), - Files.readAllBytes(baseDirectory.resolve(file.getSource()))), - STATIC_DATA_DIRECTORY.toString()); + sendFileContent(containerId, STATIC_DATA_DIRECTORY.resolve(file.getTarget()), + Files.readAllBytes(baseDirectory.resolve(file.getSource()))); } catch (IOException ex) { throw new RuntimeException( "Failed to serialise file '" + absSourcePath.toString() + "'."); @@ -352,12 +351,11 @@ public void addProjectionsToGeoserver(String wktString, String srid) { String geoserverContainerId = getContainerId("geoserver"); DockerClient dockerClient = DockerClient.getInstance(); - dockerClient.makeDir(geoserverContainerId, "/opt/geoserver_data/user_projections"); + dockerClient.makeDir(geoserverContainerId, USER_PROJECTIONS_DIR); - dockerClient.sendFilesContent(geoserverContainerId, - Map.of("epsg.properties", - (srid + "=" + wktString + "\n").getBytes()), - "/opt/geoserver_data/user_projections/"); + sendFileContent(geoserverContainerId, + Path.of(USER_PROJECTIONS_DIR, "epsg.properties"), + (srid + "=" + wktString + "\n").getBytes()); GeoServerClient.getInstance().reload(); } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/ontop/OntopClient.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/ontop/OntopClient.java index 6af6362357..eaddba0a6a 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/ontop/OntopClient.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/clients/ontop/OntopClient.java @@ -80,7 +80,7 @@ public void updateOBDA(Path newMappingFilePath) { .createTempOBDAFile(ontopMappingFilePath)) { mapping.serialize(localTempOntopMappingFilePath.getPath()); - sendFile(containerId, ontopMappingFilePath, + sendFileContent(containerId, ontopMappingFilePath, Files.readAllBytes(localTempOntopMappingFilePath.getPath())); } } catch (IOException ex) { @@ -96,7 +96,7 @@ public void uploadRules(List ruleFiles) { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { sparqlRules.write(outputStream); - sendFile(containerId, sparqlRulesFilePath, outputStream.toByteArray()); + sendFileContent(containerId, sparqlRulesFilePath, outputStream.toByteArray()); } catch (IOException ex) { throw new RuntimeException( "Failed to write SPARQL Rules file.", ex); @@ -109,7 +109,7 @@ private void writeTurtleToFile(Model model) { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { model.write(outputStream, "TURTLE"); - sendFile(containerId, ontopOntologyFilePath, outputStream.toByteArray()); + sendFileContent(containerId, ontopOntologyFilePath, outputStream.toByteArray()); } catch (IOException ex) { throw new RuntimeException(ex); } @@ -123,8 +123,4 @@ private Path getFilePath(String containerId, String filenameKey) { + " not set through Docker for '" + getContainerName() + "' container.")); } - private void sendFile(String containerId, Path filePath, byte[] content) { - sendFilesContent(containerId, Map.of(filePath.getFileName().toString(), content), - filePath.getParent().toString()); - } } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/CityTilerService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/CityTilerService.java index b9de2530da..db1f38cb05 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/CityTilerService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/CityTilerService.java @@ -3,7 +3,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,9 +28,7 @@ public void doPostStartUpConfiguration() { try (InputStream is = CityTilerService.class .getResourceAsStream("citytiler/citytiler_config_default.json")) { - dockerClient.sendFilesContent(dockerClient.getContainerId(TYPE), - Map.of(CityTilerClient.DEFAULT_COLOUR_CONFIG_FILE, is.readAllBytes()), - "/"); + sendFileContent(CityTilerClient.DEFAULT_COLOUR_CONFIG_FILE, is.readAllBytes()); } catch (IOException ex) { throw new RuntimeException("Failed to read in default citytiler colour config file.", ex); diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/ContainerService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/ContainerService.java index 4c40cfaa3a..3a22c07131 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/ContainerService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/ContainerService.java @@ -122,10 +122,14 @@ protected final void checkEnvironmentVariableNonNull(String key) { + "' to be specified in its config file."); } - public final void sendFiles(Map files, String remoteDirPath) { + public final void sendFilesContent(Map files, String remoteDirPath) { dockerClient.sendFilesContent(containerId, files, remoteDirPath); } + public final void sendFileContent(String file, byte[] content) { + dockerClient.sendFileContent(containerId, Path.of(file), content); + } + public boolean fileExists(String filePath) { return dockerClient.fileExists(containerId, filePath); } @@ -138,15 +142,13 @@ public final ComplexCommand createComplexCommand(String... cmd) { return dockerClient.createComplexCommand(containerId, cmd); } - protected final void downloadFileAndSendItToContainer(URL url, String folderPath, - String filename, + protected final void downloadFileAndSendItToContainer(URL url, String folderPath, String filename, boolean overwrite) { Path filePath = Path.of(folderPath, filename); - if (overwrite || !dockerClient.fileExists(containerId, filePath.toString())) { + if (overwrite || !fileExists(filePath.toString())) { try (InputStream downloadStream = url.openStream()) { byte[] bytes = downloadStream.readAllBytes(); - Map files = Map.of(filename, bytes); - dockerClient.sendFilesContent(containerId, files, folderPath); + sendFileContent(filePath.toString(), bytes); } catch (IOException ex) { throw new RuntimeException("Failed to download file from '" + url + "' and send it to '" + folderPath + "' in the container '" + getName() + "'.", ex); @@ -201,7 +203,7 @@ public void addServerSpecificNginxSettingsToLocationBlock(NgxBlock locationBlock // configuration block } - public String getDNSIPAddress(){ + public String getDNSIPAddress() { return dockerClient.getDNSIPAddress(); } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/NginxService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/NginxService.java index 3a28c72bec..5a4fb65adc 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/NginxService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/NginxService.java @@ -185,7 +185,7 @@ private void addConfig(NgxConfig config, String filepath) { } public void sendConfigs() { - sendFiles(files, NGINX_CONF_DIR); + sendFilesContent(files, NGINX_CONF_DIR); executeCommand(CMD, "-s", "reload"); files.clear(); } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java index bab48bd7bf..1dc511887a 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/OntopService.java @@ -126,7 +126,7 @@ public void doPostStartUpConfiguration() { ontopClient.uploadRules(List.of()); break; default: - dockerClient.createComplexCommand(containerId, "touch", f).withUser("root").exec(); + sendFileContent(f, "".getBytes()); break; } } diff --git a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/PostGISService.java b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/PostGISService.java index 802a93f7bf..92f25b0b1b 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/PostGISService.java +++ b/Deploy/stacks/dynamic/stack-clients/src/main/java/com/cmclinnovations/stack/services/PostGISService.java @@ -4,7 +4,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -53,17 +52,14 @@ public void doPostStartUpConfiguration() { } private void writePGPASSFile() { - sendFiles(Map.of( - PGPASS_FILE.getFileName().toString(), + sendFileContent( + PGPASS_FILE.toString(), ("localhost:" + endpointConfig.getPort() + ":" + "*:" + endpointConfig.getUsername() + ":" + endpointConfig.getPassword()) - .getBytes()), - PGPASS_FILE.getParent().toString()); - - executeCommand("chmod", "0600", PGPASS_FILE.toString()); + .getBytes()); } private void copyJDBCDriverToVolume() { diff --git a/Deploy/stacks/dynamic/stack-clients/src/test/java/com/cmclinnovations/stack/clients/docker/DockerClientTest.java b/Deploy/stacks/dynamic/stack-clients/src/test/java/com/cmclinnovations/stack/clients/docker/DockerClientTest.java index 2caf4e2fb1..d1ee6d2ae6 100644 --- a/Deploy/stacks/dynamic/stack-clients/src/test/java/com/cmclinnovations/stack/clients/docker/DockerClientTest.java +++ b/Deploy/stacks/dynamic/stack-clients/src/test/java/com/cmclinnovations/stack/clients/docker/DockerClientTest.java @@ -107,6 +107,19 @@ public void testSendFilesContent() { Assert.assertFalse(dockerAPI.fileExists(containerId, filePath)); } + @Test + public void testSendFileContent() { + String remoteBaseDir = "/" + testName.getMethodName() + "/"; + String filename = "file.txt"; + String filePath = remoteBaseDir + filename; + + Assert.assertFalse(dockerAPI.fileExists(containerId, filePath)); + dockerAPI.sendFileContent(containerId, Path.of(filePath), TEST_MESSAGE.getBytes()); + Assert.assertTrue(dockerAPI.fileExists(containerId, filePath)); + dockerAPI.deleteFile(containerId, filePath); + Assert.assertFalse(dockerAPI.fileExists(containerId, filePath)); + } + @Test public void testSendFiles() throws IOException { String remoteBaseDir = "/" + testName.getMethodName() + "/";