From f8e680ebf70dd6680c207d458ffd7180d1da8d06 Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Wed, 19 Jun 2024 18:17:52 -0700 Subject: [PATCH 1/4] Make files available in Docker runner image --- .../generator/docker/DockerGenerator.java | 23 +++++++++++ .../RuntimeFilesPropertyContainerized.lf | 39 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 test/C/src/docker/RuntimeFilesPropertyContainerized.lf diff --git a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java index 40f9fa7f37..20b7c45fb7 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java @@ -11,6 +11,7 @@ import org.lflang.target.property.BuildCommandsProperty; import org.lflang.target.property.DockerProperty; import org.lflang.target.property.DockerProperty.DockerOptions; +import org.lflang.target.property.FilesProperty; import org.lflang.util.StringUtil; /** @@ -49,6 +50,7 @@ protected String generateDockerFileContent() { "WORKDIR /lingua-franca", "RUN mkdir scripts", generateCopyOfScript(), + generateCopyOfUserFiles(), generateRunForMakingExecutableDir(), generateCopyOfExecutable(), generateEntryPoint(), @@ -150,6 +152,27 @@ protected String generateCopyOfScript() { return "# (No pre-run script provided.)"; } + /** + * Return zero or more COPY commands to copy files specified using the {@code files} target + * property from the builder to the runner. + */ + protected String generateCopyOfUserFiles() { + var files = context.getTargetConfig().get(FilesProperty.INSTANCE); + if (files == null) { + return ""; + } + var ret = new StringBuilder(); + for (var file : files) { + var p = Path.of(file); + var name = p.getName(p.getNameCount() - 1); + ret.append( + String.format( + "COPY --from=builder \"lingua-franca/%s/src-gen/%s\" \"./%s\"", + context.getFileConfig().name, name, name)); + } + return ret.toString(); + } + /** * Return a list of strings used to construct and entrypoint. If this is done for a federate, then * also include additional parameters to pass in the federation ID. diff --git a/test/C/src/docker/RuntimeFilesPropertyContainerized.lf b/test/C/src/docker/RuntimeFilesPropertyContainerized.lf new file mode 100644 index 0000000000..d80042d122 --- /dev/null +++ b/test/C/src/docker/RuntimeFilesPropertyContainerized.lf @@ -0,0 +1,39 @@ +target C { + files: "./RuntimeFilesPropertyContainerized.lf", + docker: true +} + +preamble {= + #include + #include + #include +=} + +main reactor { + reaction(startup) {= + FILE *f = fopen("RuntimeFilesPropertyContainerized.lf", "rb"); + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + char *string = malloc(fsize + 1); + fread(string, fsize, 1, f); + fclose(f); + + string[fsize] = 0; + + printf("file contents:\n%s\n", string); + + // fail if the file contents are not the contents of this file + char* expected = "target C {\n files: \"./RuntimeFilesPropertyContainerized.lf\",\n docker: true\n}"; + string[strlen(expected)] = 0; + if (strcmp(string, expected) != 0) { + printf("file contents do not match expected contents\n"); + exit(1); + } else { + printf("file contents match expected contents\n"); + } + + free(string); + =} +} From 0c15a11d854054503dd7a3fd0f84802c087e1e0f Mon Sep 17 00:00:00 2001 From: Peter Donovan <33707478+petervdonovan@users.noreply.github.com> Date: Wed, 19 Jun 2024 23:16:38 -0700 Subject: [PATCH 2/4] Update core/src/main/java/org/lflang/generator/docker/DockerGenerator.java Co-authored-by: Marten Lohstroh --- .../main/java/org/lflang/generator/docker/DockerGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java index 20b7c45fb7..b512b80d54 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java @@ -159,7 +159,7 @@ protected String generateCopyOfScript() { protected String generateCopyOfUserFiles() { var files = context.getTargetConfig().get(FilesProperty.INSTANCE); if (files == null) { - return ""; + return "# (No user-specified files to be copied.)"; } var ret = new StringBuilder(); for (var file : files) { From 2121a7e7beeeac612e39d6491cad713f4465bfa0 Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Wed, 19 Jun 2024 23:19:16 -0700 Subject: [PATCH 3/4] Address comments from code review --- .../java/org/lflang/generator/docker/DockerGenerator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java index b512b80d54..ea10bc1032 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerGenerator.java @@ -157,14 +157,17 @@ protected String generateCopyOfScript() { * property from the builder to the runner. */ protected String generateCopyOfUserFiles() { + if (!context.getTargetConfig().isSupported(FilesProperty.INSTANCE)) { + return ""; + } var files = context.getTargetConfig().get(FilesProperty.INSTANCE); if (files == null) { - return "# (No user-specified files to be copied.)"; + return "# (No user-specified files to be copied.)"; } var ret = new StringBuilder(); for (var file : files) { var p = Path.of(file); - var name = p.getName(p.getNameCount() - 1); + var name = p.getFileName().toString(); ret.append( String.format( "COPY --from=builder \"lingua-franca/%s/src-gen/%s\" \"./%s\"", From f8692c681118d827fcec65cc91fd23fdfd734d40 Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Thu, 20 Jun 2024 11:53:03 -0700 Subject: [PATCH 4/4] Add missing type cast --- test/C/src/docker/RuntimeFilesPropertyContainerized.lf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/C/src/docker/RuntimeFilesPropertyContainerized.lf b/test/C/src/docker/RuntimeFilesPropertyContainerized.lf index d80042d122..b15fa63be3 100644 --- a/test/C/src/docker/RuntimeFilesPropertyContainerized.lf +++ b/test/C/src/docker/RuntimeFilesPropertyContainerized.lf @@ -16,7 +16,7 @@ main reactor { long fsize = ftell(f); fseek(f, 0, SEEK_SET); - char *string = malloc(fsize + 1); + char *string = (char*) malloc(fsize + 1); fread(string, fsize, 1, f); fclose(f);