From ff71b8775437e48447af8d93646328a033ccfa83 Mon Sep 17 00:00:00 2001 From: manusa Date: Mon, 29 Jun 2020 15:24:26 +0200 Subject: [PATCH] fix: Watch uses same logic as build to monitor changed assembly files Signed-off-by: Marc Nuri --- CHANGELOG.md | 1 + .../assembly/AssemblyConfigurationUtils.java | 12 +- .../build/core/assembly/AssemblyFiles.java | 69 +----- .../core/assembly/DockerAssemblyManager.java | 208 +++++++++--------- .../core/assembly/JKubeBuildTarArchiver.java | 14 +- .../build/service/docker/ArchiveService.java | 22 +- .../build/service/docker/WatchService.java | 17 +- .../service/docker/config/WatchMode.java | 2 +- .../assembly/DockerAssemblyManagerTest.java | 140 +++++++++--- .../jkube/kit/common/AssemblyFileEntry.java | 51 +++++ .../common/archive/AssemblyFileSetUtils.java | 39 ++-- ...ileSetUtilsProcessAssemblyFileSetTest.java | 30 +-- .../archive/AssemblyFileSetUtilsTest.java | 57 +++-- .../openshift/OpenshiftBuildService.java | 12 +- .../springboot/watcher/SpringBootWatcher.java | 33 +-- .../jkube/watcher/api/BaseWatcher.java | 2 +- .../jkube/watcher/api/WatcherContext.java | 37 ++-- .../watcher/standard/DockerImageWatcher.java | 6 +- .../plugin/mojo/build/AbstractDockerMojo.java | 3 - .../maven/plugin/mojo/develop/WatchMojo.java | 5 - .../maven/plugin/watcher/WatcherManager.java | 13 +- quickstarts/maven/quarkus/pom.xml | 2 +- 22 files changed, 420 insertions(+), 355 deletions(-) create mode 100644 jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/AssemblyFileEntry.java diff --git a/CHANGELOG.md b/CHANGELOG.md index fd408be1d6..163d82d566 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ Usage: * Fix #189: Removed `@Deprecated` fields from BuildConfiguration * Fix #195: Added MigrateMojo for migrating projects from FMP to JKube * Fix #261: DockerFileBuilder only supports *nix paths (Dockerfile Linux only), fixed invalid default configs +* Fix #238: Watch uses same logic as build to monitor changed assembly files ### 1.0.0-alpha-4 (2020-06-08) * Fix #173: Use OpenShift compliant git/vcs annotations diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyConfigurationUtils.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyConfigurationUtils.java index bdf35e60f1..e7613af5f0 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyConfigurationUtils.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyConfigurationUtils.java @@ -20,6 +20,8 @@ import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.common.Assembly; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -35,7 +37,8 @@ class AssemblyConfigurationUtils { private AssemblyConfigurationUtils() {} - static AssemblyConfiguration getAssemblyConfigurationOrCreateDefault(BuildConfiguration buildConfiguration) { + @Nonnull + static AssemblyConfiguration getAssemblyConfigurationOrCreateDefault(@Nullable BuildConfiguration buildConfiguration) { final AssemblyConfiguration ac = Optional.ofNullable(buildConfiguration) .map(BuildConfiguration::getAssembly) .orElse(AssemblyConfiguration.builder().user(DEFAULT_USER).build()); @@ -53,14 +56,16 @@ static AssemblyConfiguration getAssemblyConfigurationOrCreateDefault(BuildConfig return builder.build(); } - static List getJKubeAssemblyFileSets(AssemblyConfiguration configuration) { + @Nonnull + static List getJKubeAssemblyFileSets(@Nullable AssemblyConfiguration configuration) { return Optional.ofNullable(configuration) .map(AssemblyConfiguration::getInline) .map(Assembly::getFileSets) .orElse(Collections.emptyList()); } - static List getJKubeAssemblyFileSetsExcludes(AssemblyConfiguration assemblyConfiguration) { + @Nonnull + static List getJKubeAssemblyFileSetsExcludes(@Nullable AssemblyConfiguration assemblyConfiguration) { return getJKubeAssemblyFileSets(assemblyConfiguration).stream() .filter(Objects::nonNull) .map(AssemblyFileSet::getExcludes) @@ -70,6 +75,7 @@ static List getJKubeAssemblyFileSetsExcludes(AssemblyConfiguration assem .collect(Collectors.toList()); } + @Nonnull static List getJKubeAssemblyFiles(AssemblyConfiguration configuration) { return Optional.ofNullable(configuration) .map(AssemblyConfiguration::getInline) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyFiles.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyFiles.java index 263bae05b9..62b3bed787 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyFiles.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/AssemblyFiles.java @@ -13,9 +13,12 @@ */ package org.eclipse.jkube.kit.build.core.assembly; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; + import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * Collection of assembly files which need to be monitored for checking when @@ -26,7 +29,7 @@ public class AssemblyFiles { private final File assemblyDirectory; - private List entries = new ArrayList<>(); + private List entries = new ArrayList<>(); /** * Create a collection of assembly files @@ -40,28 +43,21 @@ public AssemblyFiles(File assemblyDirectory) { /** * Add a entry to the list of assembly files which possible should be monitored * - * @param srcFile source file to monitor. The source file must exist. - * @param destFile the destination to which it is eventually copied. The destination file must be relative. + * @param assemblyFileEntry to monitor. */ - public void addEntry(File srcFile, File destFile) { - entries.add(new Entry(srcFile, destFile)); + public void addEntry(AssemblyFileEntry assemblyFileEntry) { + entries.add(assemblyFileEntry); } /** * Get the list of all updated entries i.e. all entries which have modification date * which is newer than the last time check. ATTENTION: As a side effect this method also - * updates the timestamp of entries. + * updates the timestamp of updated entries. * * @return list of all entries which has been updated since the last call to this method or an empty list */ - public List getUpdatedEntriesAndRefresh() { - List ret = new ArrayList<>(); - for (Entry entry : entries) { - if (entry.isUpdated()) { - ret.add(entry); - } - } - return ret; + public List getUpdatedEntriesAndRefresh() { + return entries.stream().filter(AssemblyFileEntry::isUpdated).collect(Collectors.toList()); } /** @@ -82,49 +78,4 @@ public File getAssemblyDirectory() { return assemblyDirectory; } - // =============================================================================== - // Inner class remembering the modification date of a source file and its destination - - public static class Entry { - - private long lastModified; - private File srcFile; - private File destFile; - - private Entry(File srcFile, File destFile) { - this.srcFile = srcFile; - this.destFile = destFile; - if (!srcFile.exists()) { - throw new IllegalArgumentException("Source " + srcFile + " does not exist"); - } - if (!destFile.exists()) { - throw new IllegalArgumentException("Destination " + destFile + " does not exist"); - } - if (srcFile.isDirectory()) { - throw new IllegalArgumentException("Can only watch files, not directories: " + srcFile); - } - this.lastModified = this.srcFile.lastModified(); - } - - public File getSrcFile() { - return srcFile; - } - - /** - * @return destination file which is absolute (and withing AssemblyFiles.assemblyDirectory) - */ - public File getDestFile() { - return destFile; - } - - boolean isUpdated() { - if (srcFile.lastModified() > lastModified) { - // Update last modified as a side effect - lastModified = srcFile.lastModified(); - return true; - } else { - return false; - } - } - } } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManager.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManager.java index 19d162dbca..d462e9620e 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManager.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManager.java @@ -18,20 +18,20 @@ import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Properties; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.build.service.docker.ImageConfiguration; import org.eclipse.jkube.kit.build.service.docker.helper.DockerFileUtil; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.common.AssemblyFile; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.common.AssemblyMode; import org.eclipse.jkube.kit.common.JavaProject; @@ -44,8 +44,9 @@ import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.DockerFileBuilder; -import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getAssemblyConfigurationOrCreateDefault; -import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFileSets; +import javax.annotation.Nonnull; + +import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getAssemblyConfigurationOrCreateDefault;import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFileSets; import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFileSetsExcludes; import static org.eclipse.jkube.kit.build.core.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFiles; import static org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.processAssemblyFileSet; @@ -81,25 +82,7 @@ public static DockerAssemblyManager getInstance() { * creating the image. * * @param imageName Name of the image to create (used for creating build directories) - * @param params Mojos parameters (used for finding the directories) - * @param buildConfig configuration for how to build the image - * @param log KitLogger used to display warning if permissions are to be normalized - * @return file holding the path to the created assembly tar file - * @throws IOException IO exception - */ - public File createDockerTarArchive( - String imageName, JKubeConfiguration params, BuildConfiguration buildConfig, KitLogger log) - throws IOException { - - return createDockerTarArchive(imageName, params, buildConfig, log, null); - } - - /** - * Create an docker tar archive from the given configuration which can be send to the Docker host for - * creating the image. - * - * @param imageName Name of the image to create (used for creating build directories) - * @param params Mojos parameters (used for finding the directories) + * @param configuration Mojos parameters (used for finding the directories) * @param buildConfig configuration for how to build the image * @param log KitLogger used to display warning if permissions are to be normalized * @param finalCustomizer finalCustomizer to be applied to the tar archive @@ -107,31 +90,28 @@ public File createDockerTarArchive( * @throws IOException IO exception */ public File createDockerTarArchive( - String imageName, final JKubeConfiguration params, final BuildConfiguration buildConfig, KitLogger log, + String imageName, final JKubeConfiguration configuration, final BuildConfiguration buildConfig, KitLogger log, ArchiverCustomizer finalCustomizer) throws IOException { - final BuildDirs buildDirs = createBuildDirs(imageName, params); - final AssemblyConfiguration assemblyConfig; + final BuildDirs buildDirs = createBuildDirs(imageName, configuration); final List archiveCustomizers = new ArrayList<>(); + final AssemblyConfiguration assemblyConfig; + final List assemblyFileEntries; try { if (buildConfig.isDockerFileMode()) { - assemblyConfig = getAssemblyConfigurationForDockerfileMode(buildConfig, params); - createDockerTarArchiveForDockerFile(buildConfig, assemblyConfig, params, buildDirs, log, archiveCustomizers); + assemblyConfig = getAssemblyConfigurationForDockerfileMode(buildConfig, configuration); + assemblyFileEntries = copyFilesToFinalTarballDirectory(configuration.getProject(), buildDirs, assemblyConfig); + createDockerTarArchiveForDockerFile(buildConfig, assemblyConfig, configuration, buildDirs, log, archiveCustomizers); } else { assemblyConfig = getAssemblyConfigurationOrCreateDefault(buildConfig); - // Build up assembly. In dockerfile mode this must be added explicitly in the Dockerfile with an ADD - if (hasAssemblyConfiguration(assemblyConfig)) { - createAssemblyArchive(assemblyConfig, params, buildDirs, buildConfig.getCompression()); - } + assemblyFileEntries = copyFilesToFinalTarballDirectory(configuration.getProject(), buildDirs, assemblyConfig); + createAssemblyArchive(assemblyConfig, configuration, buildDirs, buildConfig.getCompression(), assemblyFileEntries); createDockerTarArchiveForGeneratorMode(buildConfig, buildDirs, archiveCustomizers, assemblyConfig); } - - if (assemblyConfig != null) { - return processAssemblyConfigToCreateTarball(buildConfig, params, buildDirs, assemblyConfig, archiveCustomizers, finalCustomizer); - } else { - throw new IllegalStateException("Failed to build up AssemblyConfiguration"); - } + archiveCustomizers.addAll( + getDefaultCustomizers(buildConfig, configuration, assemblyConfig, finalCustomizer, assemblyFileEntries)); + return createBuildTarBall(configuration, buildDirs, archiveCustomizers, assemblyConfig, buildConfig.getCompression()); } catch (IOException e) { throw new IOException(String.format("Cannot create %s in %s", DOCKERFILE_NAME, buildDirs.getOutputDirectory()), e); } @@ -181,51 +161,32 @@ void verifyGivenDockerfile(File dockerFile, BuildConfiguration buildConfig, Prop * Extract all files with a tracking archiver. These can be used to track changes in the filesystem and triggering * a rebuild of the image if needed ('docker:watch') * - * @param name name of assembly - * @param buildConfig build configuration + * @param imageConfiguration the image configuration * @param jKubeConfiguration JKube kit configuration * @return assembly files */ - public AssemblyFiles getAssemblyFiles(String name, BuildConfiguration buildConfig, JKubeConfiguration jKubeConfiguration) { - - BuildDirs buildDirs = createBuildDirs(name, jKubeConfiguration); - - AssemblyConfiguration assemblyConfig = buildConfig.getAssembly(); - String assemblyName = assemblyConfig.getName(); + public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfiguration, JKubeConfiguration jKubeConfiguration) + throws IOException { + BuildDirs buildDirs = createBuildDirs(imageConfiguration.getName(), jKubeConfiguration); + AssemblyConfiguration assemblyConfig = imageConfiguration.getBuildConfiguration().getAssembly(); AssemblyFiles assemblyFiles = new AssemblyFiles(buildDirs.getOutputDirectory()); - if (Optional.ofNullable(assemblyConfig.getInline()).map(Assembly::getFiles).isPresent()) { - for (AssemblyFile af : assemblyConfig.getInline().getFiles()){ - final File outputDirectory = getAssemblyFileOutputDirectory(af, buildDirs.getOutputDirectory(), assemblyConfig); - final File targetFile = new File(outputDirectory, Optional.ofNullable(af.getDestName()).orElse(af.getSource().getName())); - assemblyFiles.addEntry( - resolveSourceFile(jKubeConfiguration.getProject().getBaseDirectory(), af), - targetFile - ); - } - } - // Add standard artifact - File finalOutputArtifact = JKubeProjectUtil.getFinalOutputArtifact(jKubeConfiguration.getProject()); - Optional.ofNullable(finalOutputArtifact) - .map(f -> buildDirs.getOutputDirectory().toPath().resolve(assemblyName).resolve(f.getName())) - .map(Path::toFile) - .filter(File::exists) - .ifPresent(assembledArtifactFile -> assemblyFiles.addEntry(finalOutputArtifact, assembledArtifactFile)); - + copyFilesToFinalTarballDirectory(jKubeConfiguration.getProject(), buildDirs, assemblyConfig) + .forEach(assemblyFiles::addEntry); return assemblyFiles; } + public File createChangedFilesArchive( + List entries, File assemblyDirectory, String imageName, + JKubeConfiguration jKubeConfiguration) throws IOException { - public File createChangedFilesArchive(List entries, File assemblyDirectory, - String imageName, JKubeConfiguration mojoParameters) - throws IOException { - BuildDirs dirs = createBuildDirs(imageName, mojoParameters); + BuildDirs dirs = createBuildDirs(imageName, jKubeConfiguration); try { File archive = new File(dirs.getTemporaryRootDirectory(), "changed-files.tar"); File archiveDir = createArchiveDir(dirs); - for (AssemblyFiles.Entry entry : entries) { - File dest = prepareChangedFilesArchivePath(archiveDir,entry.getDestFile(),assemblyDirectory); - Files.copy(Paths.get(entry.getSrcFile().getAbsolutePath()), Paths.get(dest.getAbsolutePath())); + for (AssemblyFileEntry entry : entries) { + File dest = prepareChangedFilesArchivePath(archiveDir, entry.getDest(), assemblyDirectory); + Files.copy(Paths.get(entry.getSource().getAbsolutePath()), Paths.get(dest.getAbsolutePath())); } return JKubeTarArchiver.createTarBallOfDirectory(archive, archiveDir, ArchiveCompression.none); } catch (IOException exp) { @@ -236,8 +197,8 @@ public File createChangedFilesArchive(List entries, File as private File prepareChangedFilesArchivePath(File archiveDir, File destFile, File assemblyDir) throws IOException { // Replace build target dir from destfile and add changed-files build dir instead - String relativePath = FileUtil.getRelativeFilePath(assemblyDir.getCanonicalPath(),destFile.getCanonicalPath()); - return new File(archiveDir,relativePath); + String relativePath = FileUtil.getRelativeFilePath(assemblyDir.getCanonicalPath(), destFile.getCanonicalPath()); + return new File(archiveDir, relativePath); } // Create final tar-ball to be used for building the archive to send to the Docker daemon @@ -254,7 +215,6 @@ private File createBuildTarBall(JKubeConfiguration params, BuildDirs buildDirs, return jkubeTarArchiver.createArchive(source.getOutputDirectory(), buildDirs, compression); } - private File createArchiveDir(BuildDirs dirs) throws IOException{ File archiveDir = new File(dirs.getTemporaryRootDirectory(), "changed-files"); if (archiveDir.exists()) { @@ -314,15 +274,21 @@ DockerFileBuilder createDockerFileBuilder(BuildConfiguration buildConfig, Assemb return builder; } - private void createAssemblyArchive(AssemblyConfiguration assemblyConfig, JKubeConfiguration params, BuildDirs buildDirs, ArchiveCompression compression) - throws IOException { + private void createAssemblyArchive( + AssemblyConfiguration assemblyConfig, JKubeConfiguration params, BuildDirs buildDirs, ArchiveCompression compression, + List assemblyFileEntries) + throws IOException { + + if (!hasAssemblyConfiguration(assemblyConfig)) { + return; + } DockerAssemblyConfigurationSource source = new DockerAssemblyConfigurationSource(params, buildDirs, assemblyConfig); JKubeBuildTarArchiver jkubeTarArchiver = new JKubeBuildTarArchiver(); - Map fileToPermissionsMap = copyFilesToFinalTarballDirectory(params.getProject(), buildDirs, assemblyConfig); AssemblyMode buildMode = assemblyConfig.getMode(); try { - fileToPermissionsMap.forEach(jkubeTarArchiver::setFilePermissions); + assemblyFileEntries.stream().filter(afe -> StringUtils.isNotBlank(afe.getPermission())) + .forEach(jkubeTarArchiver::setFilePermissions); jkubeTarArchiver.createArchive(source.getOutputDirectory(), buildDirs, compression); } catch (IOException e) { String error = "Failed to create assembly for docker image " + @@ -365,21 +331,21 @@ private void setArtifactFile(JavaProject project, File artifactFile) throws IOEx } } - private Map copyFilesToFinalTarballDirectory( + private List copyFilesToFinalTarballDirectory( JavaProject project, BuildDirs buildDirs, AssemblyConfiguration assemblyConfiguration) throws IOException { - final Map filesToPermissionsMap = new HashMap<>(); + final List files = new ArrayList<>(); FileUtil.createDirectory(new File(buildDirs.getOutputDirectory(), assemblyConfiguration.getTargetDir())); for (AssemblyFileSet fileSet : getJKubeAssemblyFileSets(assemblyConfiguration)) { - filesToPermissionsMap.putAll(processAssemblyFileSet(project.getBaseDirectory(), buildDirs.getOutputDirectory(), fileSet, assemblyConfiguration)); + files.addAll(processAssemblyFileSet(project.getBaseDirectory(), buildDirs.getOutputDirectory(), fileSet, assemblyConfiguration)); } for (AssemblyFile file : getJKubeAssemblyFiles(assemblyConfiguration)) { - processJKubeProjectAssemblyFile(project, file, buildDirs, assemblyConfiguration); + files.add(processJKubeProjectAssemblyFile(project, file, buildDirs, assemblyConfiguration)); } - return filesToPermissionsMap; + return files; } - private void processJKubeProjectAssemblyFile( + private AssemblyFileEntry processJKubeProjectAssemblyFile( JavaProject project, AssemblyFile assemblyFile, BuildDirs buildDirs, AssemblyConfiguration assemblyConfiguration) throws IOException { @@ -391,6 +357,8 @@ private void processJKubeProjectAssemblyFile( final String destinationFilename = Optional.ofNullable(assemblyFile.getDestName()).orElse(sourceFile.getName()); final File destinationFile = new File(outputDirectory, destinationFilename); FileUtil.copy(sourceFile, destinationFile); + // TODO: Need to add permission (Probably change AssemblyFile model to have this) + return new AssemblyFileEntry(sourceFile, destinationFile, null); } private static BuildDirs createBuildDirs(String imageName, JKubeConfiguration params) { @@ -448,7 +416,26 @@ private void createDockerTarArchiveForGeneratorMode(BuildConfiguration buildConf } - private static AssemblyConfiguration getAssemblyConfigurationForDockerfileMode(BuildConfiguration buildConfiguration, JKubeConfiguration params) { + @Nonnull + private static List getDefaultCustomizers( + BuildConfiguration buildConfiguration, JKubeConfiguration configuration, + AssemblyConfiguration assemblyConfiguration, ArchiverCustomizer finalCustomizer, List fileEntries) { + final List archiverCustomizers = new ArrayList<>(); + if (!assemblyConfiguration.isExcludeFinalOutputArtifact()) { + archiverCustomizers.add(finalOutputArtifactCustomizer(configuration, assemblyConfiguration)); + } + if (finalCustomizer != null) { + archiverCustomizers.add(finalCustomizer); + } + archiverCustomizers.add(filePermissionCustomizer(fileEntries)); + archiverCustomizers.add(excludeFilesCustomizer(buildConfiguration)); + return archiverCustomizers; + } + + @Nonnull + private static AssemblyConfiguration getAssemblyConfigurationForDockerfileMode( + BuildConfiguration buildConfiguration, JKubeConfiguration params) { + AssemblyConfiguration assemblyConfig = getAssemblyConfigurationOrCreateDefault(buildConfiguration); final AssemblyConfiguration.AssemblyConfigurationBuilder builder = assemblyConfig.toBuilder(); @@ -463,28 +450,35 @@ private static AssemblyConfiguration getAssemblyConfigurationForDockerfileMode(B return builder.build(); } - private File processAssemblyConfigToCreateTarball(BuildConfiguration buildConfig, JKubeConfiguration params, BuildDirs buildDirs, AssemblyConfiguration assemblyConfig, List archiveCustomizers, ArchiverCustomizer finalCustomizer) throws IOException { - Map fileToPermissionsMap = copyFilesToFinalTarballDirectory(params.getProject(), buildDirs, assemblyConfig); - if (finalCustomizer != null) { - archiveCustomizers.add(finalCustomizer); - } - if (!assemblyConfig.isExcludeFinalOutputArtifact()) { - archiveCustomizers.add(archiver -> { - File finalArtifactFile = JKubeProjectUtil.getFinalOutputArtifact(params.getProject()); - if (finalArtifactFile != null) { - archiver.includeFile(finalArtifactFile, assemblyConfig.getTargetDir() + File.separator + finalArtifactFile.getName()); - } - return archiver; - }); - } + @Nonnull + private static ArchiverCustomizer finalOutputArtifactCustomizer( + @Nonnull JKubeConfiguration configuration, @Nonnull AssemblyConfiguration assemblyConfiguration) { - List filesToExclude = getJKubeAssemblyFileSetsExcludes(buildConfig.getAssembly()); - archiveCustomizers.add(archiver -> { - filesToExclude.forEach(archiver::excludeFile); - fileToPermissionsMap.forEach(archiver::setFilePermissions); - return archiver; - }); + return ac -> { + File finalArtifactFile = JKubeProjectUtil.getFinalOutputArtifact(configuration.getProject()); + if (finalArtifactFile != null) { + ac.includeFile(finalArtifactFile, assemblyConfiguration.getTargetDir() + File.separator + finalArtifactFile.getName()); + } + return ac; + }; + } - return createBuildTarBall(params, buildDirs, archiveCustomizers, assemblyConfig, buildConfig.getCompression()); + @Nonnull + private static ArchiverCustomizer filePermissionCustomizer(@Nonnull List fileEntries) { + return ac -> { + fileEntries.stream().filter(afe -> StringUtils.isNotBlank(afe.getPermission())) + .forEach(ac::setFilePermissions); + return ac; + }; } + + @Nonnull + private static ArchiverCustomizer excludeFilesCustomizer(BuildConfiguration buildConfiguration) { + return ac -> { + final List filesToExclude = getJKubeAssemblyFileSetsExcludes(buildConfiguration.getAssembly()); + filesToExclude.forEach(ac::excludeFile); + return ac; + }; + } + } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/JKubeBuildTarArchiver.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/JKubeBuildTarArchiver.java index 9cfc750b70..8f1198dc29 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/JKubeBuildTarArchiver.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/core/assembly/JKubeBuildTarArchiver.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.common.archive.JKubeTarArchiver; import org.eclipse.jkube.kit.common.util.FileUtil; @@ -27,6 +28,7 @@ import org.apache.commons.io.FileUtils; public class JKubeBuildTarArchiver { + private Map filesToIncludeNameMap = new HashMap<>(); private Map fileToPermissionsMap = new HashMap<>(); private List filesNamesToExclude = new ArrayList<>(); @@ -35,22 +37,14 @@ public void includeFile(File inputFile, String destinationFileName) { filesToIncludeNameMap.put(inputFile, destinationFileName); } - public void setFilePermissions(File file, String permissions) { - fileToPermissionsMap.put(file, permissions); + public void setFilePermissions(AssemblyFileEntry assemblyFileEntry) { + fileToPermissionsMap.put(assemblyFileEntry.getDest(), assemblyFileEntry.getPermission()); } public void excludeFile(String inputFilePath) { filesNamesToExclude.add(inputFilePath); } - public Map getFilesToIncludeNameMap() { - return filesToIncludeNameMap; - } - - public List getFilesNamesToExcludeName() { - return filesNamesToExclude; - } - public File createArchive(File inputDirectory, BuildDirs buildDirs, ArchiveCompression compression) throws IOException { File outputFile = new File(buildDirs.getTemporaryRootDirectory(), "docker-build." + (compression.equals(ArchiveCompression.none) ? "tar" : compression.getFileSuffix())); List files = FileUtil.listFilesAndDirsRecursivelyInDirectory(inputDirectory); diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java index 48456c3bc5..b2f4b8d484 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.kit.build.service.docker; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.config.JKubeConfiguration; import org.eclipse.jkube.kit.build.core.assembly.ArchiverCustomizer; import org.eclipse.jkube.kit.build.core.assembly.AssemblyFiles; @@ -29,11 +30,9 @@ */ public class ArchiveService { - private final KitLogger log; private DockerAssemblyManager dockerAssemblyManager; - public ArchiveService(DockerAssemblyManager dockerAssemblyManager, KitLogger log) { this.log = log; this.dockerAssemblyManager = dockerAssemblyManager; @@ -84,11 +83,10 @@ public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfig public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfig, JKubeConfiguration jKubeConfiguration) throws IOException { - String name = imageConfig.getName(); try { - return dockerAssemblyManager.getAssemblyFiles(name, imageConfig.getBuildConfiguration(), jKubeConfiguration); - } catch (Exception e) { - throw new IOException("Cannot extract assembly files for image " + name + ": " + e, e); + return dockerAssemblyManager.getAssemblyFiles(imageConfig, jKubeConfiguration); + } catch (IOException e) { + throw new IOException("Cannot extract assembly files for image " + imageConfig.getName() + ": " + e.getMessage(), e); } } @@ -98,16 +96,16 @@ public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfig, JKubeConfi * @param entries changed files. List must not be empty or null * @param assemblyDir assembly directory * @param imageName image's name - * @param mojoParameters maven build context + * @param jKubeConfiguration maven build context * @return created archive * @throws IOException in case of any I/O exception */ - public File createChangedFilesArchive(List entries, File assemblyDir, - String imageName, JKubeConfiguration mojoParameters) throws IOException { - return dockerAssemblyManager.createChangedFilesArchive(entries, assemblyDir, imageName, mojoParameters); - } + public File createChangedFilesArchive( + List entries, File assemblyDir,String imageName, + JKubeConfiguration jKubeConfiguration) throws IOException { - // ============================================= + return dockerAssemblyManager.createChangedFilesArchive(entries, assemblyDir, imageName, jKubeConfiguration); + } File createArchive(String imageName, BuildConfiguration buildConfig, JKubeConfiguration params, KitLogger log) throws IOException { diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java index eaa17b782c..9f65a2eefe 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java @@ -33,6 +33,7 @@ import org.eclipse.jkube.kit.build.core.GavLabel; import org.eclipse.jkube.kit.build.service.docker.config.RunImageConfiguration; import org.eclipse.jkube.kit.build.service.docker.config.WaitConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.config.JKubeConfiguration; import org.eclipse.jkube.kit.build.core.assembly.AssemblyFiles; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; @@ -87,7 +88,7 @@ public synchronized void watch(WatchContext context, JKubeConfiguration buildCon long interval = watcher.getInterval(); WatchMode watchMode = watcher.getWatchMode(imageConfig); - log.info("Watching " + imageConfig.getName() + (watchMode != null ? " using " + watchMode.getDescription() : "")); + log.info("Watching %s %s", imageConfig.getName(), (watchMode != null ? " using " + watchMode.getDescription() : "")); ArrayList tasks = new ArrayList<>(); @@ -134,20 +135,20 @@ private void schedule(ScheduledExecutorService executor, Runnable runnable, long } private Runnable createCopyWatchTask(final ImageWatcher watcher, - final JKubeConfiguration mojoParameters, final String containerBaseDir) throws IOException { + final JKubeConfiguration jKubeConfiguration, final String containerBaseDir) throws IOException { final ImageConfiguration imageConfig = watcher.getImageConfiguration(); - final AssemblyFiles files = archiveService.getAssemblyFiles(imageConfig, mojoParameters); + final AssemblyFiles files = archiveService.getAssemblyFiles(imageConfig, jKubeConfiguration); return new Runnable() { @Override public void run() { - List entries = files.getUpdatedEntriesAndRefresh(); - if (entries != null && entries.size() > 0) { + List entries = files.getUpdatedEntriesAndRefresh(); + if (!entries.isEmpty()) { try { log.info("%s: Assembly changed. Copying changed files to container ...", imageConfig.getDescription()); File changedFilesArchive = archiveService.createChangedFilesArchive(entries, files.getAssemblyDirectory(), - imageConfig.getName(), mojoParameters); + imageConfig.getName(), jKubeConfiguration); dockerAccess.copyArchive(watcher.getContainerId(), changedFilesArchive, containerBaseDir); callPostExec(watcher); } catch (IOException | ExecException e) { @@ -171,7 +172,7 @@ private Runnable createBuildWatchTask(final ImageWatcher watcher, throws IOException { final ImageConfiguration imageConfig = watcher.getImageConfiguration(); final AssemblyFiles files = archiveService.getAssemblyFiles(imageConfig, mojoParameters); - if (files != null && files.isEmpty()) { + if (files.isEmpty()) { log.error("No assembly files for %s. Are you sure you invoked together with the `package` goal?", imageConfig.getDescription()); throw new IOException("No files to watch found for " + imageConfig); } @@ -179,7 +180,7 @@ private Runnable createBuildWatchTask(final ImageWatcher watcher, return new Runnable() { @Override public void run() { - List entries = files.getUpdatedEntriesAndRefresh(); + List entries = files.getUpdatedEntriesAndRefresh(); if (entries != null && !entries.isEmpty()) { try { log.info("%s: Assembly changed. Rebuild ...", imageConfig.getDescription()); diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/config/WatchMode.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/config/WatchMode.java index f5aa7bf069..ba62563ffa 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/config/WatchMode.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/config/WatchMode.java @@ -21,7 +21,7 @@ public enum WatchMode { /** - * Copy watched artefacts into contaienr + * Copy watched artifacts into container */ copy(false, false, true, "build"), diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManagerTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManagerTest.java index 0e0a30da9d..c85bd9bf76 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManagerTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/core/assembly/DockerAssemblyManagerTest.java @@ -18,8 +18,13 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.jkube.kit.build.service.docker.ImageConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.config.JKubeConfiguration; import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -41,19 +46,29 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; public class DockerAssemblyManagerTest { - @Mocked - private PrefixedLogger prefixedLogger; - @Tested private DockerAssemblyManager assemblyManager; + @Mocked + private PrefixedLogger prefixedLogger; + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); + @Test + public void testGetInstanceShouldBeSingleton() { + // When + final DockerAssemblyManager dam1 = DockerAssemblyManager.getInstance(); + final DockerAssemblyManager dam2 = DockerAssemblyManager.getInstance(); + // Then + assertSame(dam1, dam2); + } + @Test public void testNoAssembly() { BuildConfiguration buildConfig = BuildConfiguration.builder().build(); @@ -67,27 +82,50 @@ public void testNoAssembly() { } @Test - public void assemblyFiles(@Injectable final JKubeConfiguration mojoParams, @Injectable final JavaProject project) + public void assemblyFiles(@Injectable final JKubeConfiguration configuration, @Injectable final JavaProject project) throws Exception { + // Given final File baseDirectory = temporaryFolder.newFolder("buildDirs"); final File targetDir = new File(baseDirectory, "target"); assertTrue(targetDir.mkdirs()); new Expectations() {{ - mojoParams.getProject(); + configuration.getProject(); result = project; project.getBaseDirectory(); result = baseDirectory; - project.getBuildDirectory(); - result = targetDir; }}; - - BuildConfiguration buildConfig = createBuildConfig(); - - AssemblyFiles assemblyFiles = assemblyManager.getAssemblyFiles("testImage", buildConfig, mojoParams); + ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("testImage").build(createBuildConfig()) + .build(); + // When + AssemblyFiles assemblyFiles = assemblyManager.getAssemblyFiles(imageConfiguration, configuration); + // Then assertNotNull(assemblyFiles); assertEquals(baseDirectory.toPath().resolve("testImage").resolve("build").toFile(), assemblyFiles.getAssemblyDirectory()); + assertTrue(assemblyFiles.getUpdatedEntriesAndRefresh().isEmpty()); + } + + @Test + public void testCreateChangedFilesArchive() throws IOException { + // Given + final List entries = new ArrayList<>(); + final File assemblyDirectory = temporaryFolder.getRoot().toPath().resolve("target").resolve("docker").toFile(); + final JKubeConfiguration jc = createNoDockerfileConfiguration(); + entries.add(AssemblyFileEntry.builder() + .source(temporaryFolder.getRoot().toPath().resolve("target").resolve("test-0.1.0.jar").toFile()) + .dest(temporaryFolder.getRoot().toPath().resolve("target").resolve("docker").resolve("test-0.1.0.jar").toFile()) + .permission("0655") + .build()); + // When + final File result = assemblyManager.createChangedFilesArchive(entries, assemblyDirectory, "image-name", jc); + // Then + assertNotNull(result); + assertTrue(result.exists()); + assertTrue(result.isFile()); + assertEquals("changed-files.tar", result.getName()); + assertEquals(1536, result.length()); } @Test @@ -151,10 +189,8 @@ public void testEnsureThatArtifactFileIsSetWithProjectArtifactSet() throws IOExc JavaProject project = JavaProject.builder() .artifact(temporaryFolder.newFile("temp-project-0.0.1.jar")) .build(); - // When File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project); - // Then assertNotNull(artifactFile); assertEquals("temp-project-0.0.1.jar", artifactFile.getName()); @@ -171,10 +207,8 @@ public void testEnsureThatArtifactFileIsSetWithNullProjectArtifact() throws IOEx .packaging("jar") .buildFinalName("foo-project-0.0.1") .build(); - // When File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project); - // Then assertNotNull(artifactFile); assertTrue(artifactFile.exists()); @@ -185,10 +219,8 @@ public void testEnsureThatArtifactFileIsSetWithNullProjectArtifact() throws IOEx public void testEnsureThatArtifactFileIsSetWithEverythingNull() throws IOException { // Given JavaProject project = JavaProject.builder().build(); - // When File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project); - // Then assertNull(artifactFile); } @@ -196,23 +228,7 @@ public void testEnsureThatArtifactFileIsSetWithEverythingNull() throws IOExcepti @Test public void testCreateDockerTarArchiveWithoutDockerfile() throws IOException { // Given - File targetFolder = temporaryFolder.newFolder("target"); - File finalArtifactFile = new File(targetFolder, "test-0.1.0.jar"); - assertTrue(finalArtifactFile.createNewFile()); - File outputDirectory = new File(targetFolder, "docker"); - - final JKubeConfiguration jKubeBuildContext = JKubeConfiguration.builder() - .project(JavaProject.builder() - .groupId("org.eclipse.jkube") - .artifactId("test") - .packaging("jar") - .version("0.1.0") - .buildDirectory(targetFolder) - .artifact(finalArtifactFile) - .build()) - .outputDirectory(outputDirectory.getAbsolutePath()) - .sourceDirectory(temporaryFolder.getRoot().getAbsolutePath() + "/src/main/docker") - .build(); + final JKubeConfiguration jKubeBuildContext = createNoDockerfileConfiguration(); final BuildConfiguration jKubeBuildConfiguration = BuildConfiguration.builder().build(); // When @@ -222,6 +238,42 @@ public void testCreateDockerTarArchiveWithoutDockerfile() throws IOException { assertNotNull(dockerArchiveFile); assertTrue(dockerArchiveFile.exists()); assertEquals(3072, dockerArchiveFile.length()); + final File outputDirectory = temporaryFolder.getRoot().toPath().resolve("target").resolve("docker").toFile(); + assertTrue(outputDirectory.isDirectory() && outputDirectory.exists()); + File buildOutputDir = new File(outputDirectory, "test-image"); + assertTrue(buildOutputDir.isDirectory() && buildOutputDir.exists()); + File buildDir = new File(buildOutputDir, "build"); + File workDir = new File(buildOutputDir, "work"); + File tmpDir = new File(buildOutputDir, "tmp"); + assertTrue(buildDir.isDirectory() && buildDir.exists()); + assertTrue(workDir.isDirectory() && workDir.exists()); + assertTrue(tmpDir.isDirectory() && tmpDir.exists()); + assertTrue(new File(buildDir, "Dockerfile").exists()); + File assemblyNameDirInBuild = new File(buildDir, "maven"); + assertTrue(assemblyNameDirInBuild.isDirectory() && assemblyNameDirInBuild.exists()); + assertTrue(new File(assemblyNameDirInBuild, "test-0.1.0.jar").exists()); + } + + @Test + public void testCreateDockerTarArchiveWithoutDockerfileAndFinalCustomizer() throws IOException { + // Given + final JKubeConfiguration jKubeBuildContext = createNoDockerfileConfiguration(); + final BuildConfiguration jKubeBuildConfiguration = BuildConfiguration.builder().build(); + final AtomicBoolean customized = new AtomicBoolean(false); + final ArchiverCustomizer finalCustomizer = ac -> { + customized.set(true); + return ac; + }; + + // When + File dockerArchiveFile = assemblyManager.createDockerTarArchive( + "test-image", jKubeBuildContext, jKubeBuildConfiguration, prefixedLogger, finalCustomizer); + + // Then + assertNotNull(dockerArchiveFile); + assertTrue(dockerArchiveFile.exists()); + assertEquals(3072, dockerArchiveFile.length()); + final File outputDirectory = temporaryFolder.getRoot().toPath().resolve("target").resolve("docker").toFile(); assertTrue(outputDirectory.isDirectory() && outputDirectory.exists()); File buildOutputDir = new File(outputDirectory, "test-image"); assertTrue(buildOutputDir.isDirectory() && buildOutputDir.exists()); @@ -235,7 +287,26 @@ public void testCreateDockerTarArchiveWithoutDockerfile() throws IOException { File assemblyNameDirInBuild = new File(buildDir, "maven"); assertTrue(assemblyNameDirInBuild.isDirectory() && assemblyNameDirInBuild.exists()); assertTrue(new File(assemblyNameDirInBuild, "test-0.1.0.jar").exists()); + assertTrue(customized.get()); + } + private JKubeConfiguration createNoDockerfileConfiguration() throws IOException { + File targetFolder = temporaryFolder.newFolder("target"); + File finalArtifactFile = new File(targetFolder, "test-0.1.0.jar"); + assertTrue(finalArtifactFile.createNewFile()); + File outputDirectory = new File(targetFolder, "docker"); + return JKubeConfiguration.builder() + .project(JavaProject.builder() + .groupId("org.eclipse.jkube") + .artifactId("test") + .packaging("jar") + .version("0.1.0") + .buildDirectory(targetFolder) + .artifact(finalArtifactFile) + .build()) + .outputDirectory(outputDirectory.getAbsolutePath()) + .sourceDirectory(temporaryFolder.getRoot().getAbsolutePath() + "/src/main/docker") + .build(); } @Test @@ -252,7 +323,6 @@ public void testCreateDockerTarArchiveWithDockerfile() throws IOException { assertTrue(finalArtifactFile.createNewFile()); File dockerDirectory = new File(targetDirectory, "docker"); - final JKubeConfiguration configuration = JKubeConfiguration.builder() .project(JavaProject.builder() .groupId("org.eclipse.jkube") diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/AssemblyFileEntry.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/AssemblyFileEntry.java new file mode 100644 index 0000000000..4eaf9e8fc9 --- /dev/null +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/AssemblyFileEntry.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.io.File; + + +@Getter +@Setter +@EqualsAndHashCode +public class AssemblyFileEntry { + + private long lastModified; + private File source; + private File dest; + private String permission; + + @Builder + public AssemblyFileEntry(File source, File dest, String permission) { + this.lastModified = source.lastModified(); + this.source = source; + this.dest = dest; + this.permission = permission; + } + + public boolean isUpdated() { + if (source.lastModified() > lastModified) { + // Update last modified as a side effect + lastModified = source.lastModified(); + return true; + } else { + return false; + } + } +} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java index 9dc12f458c..d6f7b37241 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java @@ -15,15 +15,15 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.common.util.FileUtil; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -34,21 +34,22 @@ public class AssemblyFileSetUtils { private AssemblyFileSetUtils() {} - public static Map calculateFilePermissions(File destFile, AssemblyFileSet assemblyFileSet) { - final Map ret = new HashMap<>(); - if (destFile.isDirectory()) { + public static List calculateFilePermissions(File source, File dest, AssemblyFileSet assemblyFileSet) { + final List ret = new ArrayList<>(); + if (dest.isDirectory()) { final String directoryMode = Optional.ofNullable(assemblyFileSet.getDirectoryMode()) .orElse(DIRECTORY_CAN_LIST_PERMISSION); - ret.put(destFile, directoryMode); - FileUtil.listFilesAndDirsRecursivelyInDirectory(destFile).forEach(f -> { + ret.add(new AssemblyFileEntry(source, dest, directoryMode)); + FileUtil.listFilesAndDirsRecursivelyInDirectory(dest).forEach(f -> { + final File s = source.toPath().resolve(dest.toPath().relativize(f.toPath())).toFile(); if (f.isDirectory()) { - ret.put(f, directoryMode); + ret.add(new AssemblyFileEntry(s, f, directoryMode)); } else if(f.isFile() && assemblyFileSet.getFileMode() != null) { - ret.put(f, assemblyFileSet.getFileMode()); + ret.add(new AssemblyFileEntry(s, f, assemblyFileSet.getFileMode())); } }); - } else if (destFile.isFile() && assemblyFileSet.getFileMode() != null) { - ret.put(destFile, assemblyFileSet.getFileMode()); + } else if (dest.isFile() && assemblyFileSet.getFileMode() != null) { + ret.add(new AssemblyFileEntry(source, dest, assemblyFileSet.getFileMode())); } return ret; } @@ -68,11 +69,10 @@ public static Map calculateFilePermissions(File destFile, Assembly * * @see Maven Assemblies (Spec partially compliant) */ - public static Map processAssemblyFileSet( + public static List processAssemblyFileSet( File baseDirectory, File outputDirectory, AssemblyFileSet assemblyFileSet, AssemblyConfiguration assemblyConfiguration) throws IOException { - final Map fileToPermissionsMap = new HashMap<>(); final File sourceDirectory = resolveSourceDirectory(baseDirectory, assemblyFileSet); final File targetDirectory = new File(outputDirectory, Objects.requireNonNull( assemblyConfiguration.getTargetDir(), "Assembly Configuration target dir is required")); @@ -89,17 +89,18 @@ public static Map processAssemblyFileSet( final List includes = Optional.ofNullable(assemblyFileSet.getIncludes()) .filter(i -> !i.isEmpty()) .orElse(Collections.singletonList(PATH_TO_SELF)); + final List entries = new ArrayList<>(); for (String include : includes) { if (isSelfPath(include)) { - fileToPermissionsMap.putAll(copy(sourceDirectory, destinationDirectory, assemblyFileSet)); + entries.addAll(copy(sourceDirectory, destinationDirectory, assemblyFileSet)); } else { final File sourceFile = new File(sourceDirectory, include); final File destFile = destinationDirectory.toPath().resolve(sourceDirectory.toPath().relativize(sourceFile.toPath())).toFile(); FileUtil.createDirectory(destFile.getParentFile()); - fileToPermissionsMap.putAll(copy(sourceFile, destFile, assemblyFileSet)); + entries.addAll(copy(sourceFile, destFile, assemblyFileSet)); } } - return fileToPermissionsMap; + return entries; } static File resolveSourceDirectory(File baseDirectory, AssemblyFileSet assemblyFileSet) { @@ -116,15 +117,15 @@ private static boolean isSelfPath(String path) { return StringUtils.isBlank(path) || path.equals(PATH_TO_SELF); } - private static Map copy(File source, File target, AssemblyFileSet assemblyFileSet) throws IOException { + private static List copy(File source, File target, AssemblyFileSet assemblyFileSet) throws IOException { if (source.exists()) { if (source.isDirectory()) { FileUtil.copyDirectoryIfNotExists(source, target); } else { FileUtil.copy(source, target); } - return calculateFilePermissions(target, assemblyFileSet); + return calculateFilePermissions(source, target, assemblyFileSet); } - return Collections.emptyMap(); + return Collections.emptyList(); } } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsProcessAssemblyFileSetTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsProcessAssemblyFileSetTest.java index 453dee8b7b..c16d4b5b29 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsProcessAssemblyFileSetTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsProcessAssemblyFileSetTest.java @@ -17,12 +17,12 @@ import java.io.IOException; import java.nio.file.Path; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.apache.commons.io.FileUtils; @@ -151,9 +151,9 @@ public void minimumRequiredFields() throws Exception { .targetDir("deployments") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(4)); + assertThat(result, hasSize(4)); final File deployments = new File(outputDirectory, "deployments"); assertThat(deployments.exists(), equalTo(true)); assertThat(deployments.listFiles(), arrayWithSize(1)); @@ -181,9 +181,9 @@ public void sourceDoesNotExist() throws Exception { .targetDir("deployments") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), empty()); + assertThat(result, empty()); final File deployments = new File(outputDirectory, "deployments"); assertThat(deployments.exists(), equalTo(false)); } @@ -207,9 +207,9 @@ public void fileSetDirectoryAndOutputDirectoryResolvingToSelf() throws Exception .targetDir("deployments") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(4)); + assertThat(result, hasSize(4)); final File deployments = new File(outputDirectory, "deployments"); assertThat(deployments.exists(), equalTo(true)); assertThat(deployments.listFiles(), arrayWithSize(6)); @@ -236,9 +236,9 @@ public void fileSetDirectoryAndAbsoluteOutputDirectory() throws Exception { .targetDir("/deployments") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(4)); + assertThat(result, hasSize(4)); assertThat(new File(outputDirectory, "deployments").exists(), equalTo(false)); assertThat(absoluteOutputDirectory.listFiles(), arrayWithSize(6)); assertThat(absoluteOutputDirectory.list(), arrayContainingInAnyOrder("one", "two", "three", "1.txt", "3.other", "37")); @@ -263,9 +263,9 @@ public void fileSetDirectoryAndRelativeOutputDirectory() throws Exception { .targetDir("/deployments/") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(4)); + assertThat(result, hasSize(4)); final File deployments = new File(outputDirectory, "deployments"); assertThat(deployments.exists(), equalTo(true)); assertThat(deployments.listFiles(), arrayWithSize(1)); @@ -296,9 +296,9 @@ public void hierarchicalInclude() throws Exception { .targetDir("/deployments") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(1)); + assertThat(result, hasSize(1)); final File deployments = new File(outputDirectory, "deployments"); assertThat(deployments.exists(), equalTo(true)); assertThat(deployments.listFiles(), arrayWithSize(1)); @@ -331,9 +331,9 @@ public void hierarchicalIncludeInRelativeDirectory() throws Exception { .targetDir("maven") .build(); // When - final Map permissions = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); + final List result = AssemblyFileSetUtils.processAssemblyFileSet(baseDirectory, outputDirectory, afs, ac); // Then - assertThat(permissions.entrySet(), hasSize(1)); + assertThat(result, hasSize(1)); final File maven = new File(outputDirectory, "maven"); assertThat(maven.exists(), equalTo(true)); assertThat(maven.listFiles(), arrayWithSize(1)); diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsTest.java index 490e8e8e37..57543fcfae 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtilsTest.java @@ -14,9 +14,10 @@ package org.eclipse.jkube.kit.common.archive; import java.io.File; -import java.util.Map; +import java.util.List; import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.junit.Rule; @@ -25,9 +26,10 @@ import static org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.calculateFilePermissions; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasSize; public class AssemblyFileSetUtilsTest { @@ -39,69 +41,86 @@ public class AssemblyFileSetUtilsTest { public void calculateFilePermissionsFileWithNoFileMode() throws Exception { // Given final AssemblyFileSet afs = AssemblyFileSet.builder().build(); + final File sourceFile = temp.newFile("source-file.txt"); final File aFile = temp.newFile("just-a-file.txt"); // When - final Map result = calculateFilePermissions(aFile, afs); + final List result = calculateFilePermissions(sourceFile, aFile, afs); // Then - assertThat(result.entrySet(), empty()); + assertThat(result, empty()); } @Test public void calculateFilePermissionsFileWithFileMode() throws Exception { // Given final AssemblyFileSet afs = AssemblyFileSet.builder().fileMode("0644").build(); + final File sourceFile = temp.newFile("source-file.txt"); final File aFile = temp.newFile("just-a-file.txt"); // When - final Map result = calculateFilePermissions(aFile, afs); + final List result = calculateFilePermissions(sourceFile, aFile, afs); // Then - assertThat(result.entrySet(), hasSize(1)); - assertThat(result, hasEntry(aFile, "0644")); + assertThat(result, hasSize(1)); + assertThat(result, contains(new AssemblyFileEntry(sourceFile, aFile, "0644"))); } @Test public void calculateFilePermissionsDirectoryWithNoDirectoryMode() throws Exception { // Given final AssemblyFileSet afs = AssemblyFileSet.builder().build(); + final File sourceDirectory = temp.newFile("source-directory"); final File aDirectory = temp.newFolder("just-a-directory"); // When - final Map result = calculateFilePermissions(aDirectory, afs); + final List result = calculateFilePermissions(sourceDirectory, aDirectory, afs); // Then - assertThat(result.entrySet(), hasSize(1)); - assertThat(result, hasEntry(aDirectory, "040111")); + assertThat(result, hasSize(1)); + assertThat(result, contains(new AssemblyFileEntry(sourceDirectory, aDirectory, "040111"))); } @Test public void calculateFilePermissionsDirectoryWithDirectoryMode() throws Exception { // Given final AssemblyFileSet afs = AssemblyFileSet.builder().directoryMode("040755").build(); + final File sourceDirectory = temp.newFolder("source-directory"); + final File sourceSubdirectory = new File(sourceDirectory, "subdirectory"); + FileUtils.forceMkdir(sourceSubdirectory); + final File sourceFile = new File(sourceDirectory, "file.txt"); + assertThat(sourceFile.createNewFile(), equalTo(true)); final File aDirectory = temp.newFolder("just-a-directory"); final File aSubdirectory = new File(aDirectory, "subdirectory"); FileUtils.forceMkdir(aSubdirectory); final File aFile = new File(aDirectory, "file.txt"); assertThat(aFile.createNewFile(), equalTo(true)); // When - final Map result = calculateFilePermissions(aDirectory, afs); + final List result = calculateFilePermissions(sourceDirectory, aDirectory, afs); // Then - assertThat(result.entrySet(), hasSize(2)); - assertThat(result, hasEntry(aDirectory, "040755")); - assertThat(result, hasEntry(aSubdirectory, "040755")); + assertThat(result, hasSize(2)); + assertThat(result, containsInAnyOrder( + new AssemblyFileEntry(sourceDirectory, aDirectory, "040755"), + new AssemblyFileEntry(sourceSubdirectory, aSubdirectory, "040755") + )); } @Test public void calculateFilePermissionsDirectoryWithDirectoryAndFileMode() throws Exception { // Given final AssemblyFileSet afs = AssemblyFileSet.builder().directoryMode("040755").fileMode("0644").build(); + final File sourceDirectory = temp.newFolder("source-directory"); + final File sourceSubdirectory = new File(sourceDirectory, "subdirectory"); + FileUtils.forceMkdir(sourceSubdirectory); + final File sourceFile = new File(sourceDirectory, "file.txt"); + assertThat(sourceFile.createNewFile(), equalTo(true)); final File aDirectory = temp.newFolder("just-a-directory"); final File aSubdirectory = new File(aDirectory, "subdirectory"); FileUtils.forceMkdir(aSubdirectory); final File aFile = new File(aDirectory, "file.txt"); assertThat(aFile.createNewFile(), equalTo(true)); // When - final Map result = calculateFilePermissions(aDirectory, afs); + final List result = calculateFilePermissions(sourceDirectory, aDirectory, afs); // Then - assertThat(result.entrySet(), hasSize(3)); - assertThat(result, hasEntry(aDirectory, "040755")); - assertThat(result, hasEntry(aSubdirectory, "040755")); - assertThat(result, hasEntry(aFile, "0644")); + assertThat(result, hasSize(3)); + assertThat(result, containsInAnyOrder( + new AssemblyFileEntry(sourceDirectory, aDirectory, "040755"), + new AssemblyFileEntry(sourceSubdirectory, aSubdirectory, "040755"), + new AssemblyFileEntry(sourceFile, aFile, "0644") + )); } } \ No newline at end of file diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java index d05d77ccb6..f39b652ea9 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java @@ -157,16 +157,8 @@ protected File createBuildArchive(ImageConfiguration imageConfig) throws JKubeSe final ArchiverCustomizer customizer = getS2ICustomizer(imageConfig); try { - // Create tar file with Docker archive - File dockerTar; - if (customizer != null) { - dockerTar = jKubeServiceHub.getDockerServiceHub().getArchiveService() - .createDockerBuildArchive(imageConfig, jKubeServiceHub.getConfiguration(), customizer); - } else { - dockerTar = jKubeServiceHub.getDockerServiceHub() - .getArchiveService().createDockerBuildArchive(imageConfig, jKubeServiceHub.getConfiguration()); - } - return dockerTar; + return jKubeServiceHub.getDockerServiceHub().getArchiveService() + .createDockerBuildArchive(imageConfig, jKubeServiceHub.getConfiguration(), customizer); } catch (IOException e) { throw new JKubeServiceException("Unable to create the build archive", e); } diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java index 82c82f4152..007a0407de 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java @@ -73,18 +73,18 @@ private enum Config implements Configs.Key { public SpringBootWatcher(WatcherContext watcherContext) { super(watcherContext, "spring-boot"); - portForwardService = new PortForwardService(watcherContext.getKubernetesClient(), watcherContext.getLogger()); + portForwardService = new PortForwardService(watcherContext.getJKubeServiceHub().getClient(), watcherContext.getLogger()); } @Override public boolean isApplicable(List configs, Set resources, PlatformMode mode) { - return JKubeProjectUtil.hasPluginOfAnyArtifactId(getContext().getProject(), + return JKubeProjectUtil.hasPluginOfAnyArtifactId(getContext().getBuildContext().getProject(), SpringBootConfigurationHelper.SPRING_BOOT_MAVEN_PLUGIN_ARTIFACT_ID); } @Override public void watch(List configs, Set resources, PlatformMode mode) throws Exception { - KubernetesClient kubernetes = getContext().getKubernetesClient(); + KubernetesClient kubernetes = getContext().getJKubeServiceHub().getClient(); PodLogService.PodLogServiceContext logContext = PodLogService.PodLogServiceContext.builder() .log(log) @@ -92,7 +92,10 @@ public void watch(List configs, Set resources, .oldPodLog(getContext().getOldPodLogger()) .build(); - new PodLogService(logContext).tailAppPodsLogs(kubernetes, getContext().getClusterConfiguration().getNamespace(), resources, false, null, true, null, false); + new PodLogService(logContext).tailAppPodsLogs( + kubernetes, + getContext().getJKubeServiceHub().getClusterAccess().getNamespace(), + resources, false, null, true, null, false); String url = getServiceExposeUrl(kubernetes, resources); if (url == null) { @@ -114,8 +117,9 @@ private String getPortForwardUrl(final Set resources) throws JKubeS } Properties properties = SpringBootUtil.getSpringBootApplicationProperties( - JKubeProjectUtil.getClassLoader(getContext().getProject())); - SpringBootConfigurationHelper propertyHelper = new SpringBootConfigurationHelper(SpringBootUtil.getSpringBootVersion(getContext().getProject())); + JKubeProjectUtil.getClassLoader(getContext().getBuildContext().getProject())); + SpringBootConfigurationHelper propertyHelper = new SpringBootConfigurationHelper( + SpringBootUtil.getSpringBootVersion(getContext().getBuildContext().getProject())); int port = IoUtil.getFreeRandomPort(); int containerPort = propertyHelper.getServerPort(properties); @@ -136,7 +140,9 @@ private String getServiceExposeUrl(KubernetesClient kubernetes, Set if (entity instanceof Service) { Service service = (Service) entity; String name = KubernetesHelper.getName(service); - Resource serviceResource = kubernetes.services().inNamespace(getContext().getClusterConfiguration().getNamespace()).withName(name); + Resource serviceResource = kubernetes.services() + .inNamespace(getContext().getJKubeServiceHub().getClusterAccess().getNamespace()) + .withName(name); String url = null; // lets wait a little while until there is a service URL in case the exposecontroller is running slow for (int i = 0; i < serviceUrlWaitTimeSeconds; i++) { @@ -180,10 +186,9 @@ private void runRemoteSpringApplication(String url) { ClassLoader classLoader = getClass().getClassLoader(); if (classLoader instanceof URLClassLoader) { URLClassLoader pluginClassLoader = (URLClassLoader) classLoader; - try( - URLClassLoader projectClassLoader = - ClassUtil.createProjectClassLoader(getContext().getProject().getCompileClassPathElements(), log)) { - + try(URLClassLoader projectClassLoader = ClassUtil.createProjectClassLoader( + getContext().getBuildContext().getProject().getCompileClassPathElements(), log) + ) { URLClassLoader[] classLoaders = {projectClassLoader, pluginClassLoader}; StringBuilder buffer = new StringBuilder("java -cp "); @@ -206,7 +211,7 @@ private void runRemoteSpringApplication(String url) { // Add dev tools to the classpath (the main class is not read from BOOT-INF/lib) try { - File devtools = getSpringBootDevToolsJar(getContext().getProject()); + File devtools = getSpringBootDevToolsJar(getContext().getBuildContext().getProject()); buffer.append(File.pathSeparator); buffer.append(devtools.getCanonicalPath()); } catch (Exception e) { @@ -289,7 +294,7 @@ private File getSpringBootDevToolsJar(JavaProject project) { private String validateSpringBootDevtoolsSettings() { final Map configuration = JKubeProjectUtil - .getPlugin(getContext().getProject(), SpringBootConfigurationHelper.SPRING_BOOT_MAVEN_PLUGIN_ARTIFACT_ID) + .getPlugin(getContext().getBuildContext().getProject(), SpringBootConfigurationHelper.SPRING_BOOT_MAVEN_PLUGIN_ARTIFACT_ID) .getConfiguration(); if(!configuration.containsKey("excludeDevtools") || !configuration.get("excludeDevtools").equals("false")) { log.warn("devtools need to be included in repacked archive, please set to false in plugin configuration"); @@ -297,7 +302,7 @@ private String validateSpringBootDevtoolsSettings() { } Properties properties = SpringBootUtil.getSpringBootApplicationProperties( - JKubeProjectUtil.getClassLoader(getContext().getProject())); + JKubeProjectUtil.getClassLoader(getContext().getBuildContext().getProject())); String remoteSecret = properties.getProperty(DEV_TOOLS_REMOTE_SECRET, System.getProperty(DEV_TOOLS_REMOTE_SECRET)); if (StringUtils.isBlank(remoteSecret)) { log.warn("There is no `%s` property defined in your src/main/resources/application.properties. Please add one!", DEV_TOOLS_REMOTE_SECRET); diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/BaseWatcher.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/BaseWatcher.java index a77598b1b3..33ae9bbdcb 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/BaseWatcher.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/BaseWatcher.java @@ -32,7 +32,7 @@ public abstract class BaseWatcher implements Watcher { public BaseWatcher(WatcherContext context, String name) { this.context = context; - this.config = new WatcherConfig(context.getProject().getProperties(), name, context.getConfig()); + this.config = new WatcherConfig(context.getBuildContext().getProject().getProperties(), name, context.getConfig()); this.name = name; this.log = new PrefixedLogger(name, context.getLogger()); } diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java index 64c053b2c0..c5f1df4a46 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java @@ -13,22 +13,18 @@ */ package org.eclipse.jkube.watcher.api; -import io.fabric8.kubernetes.client.KubernetesClient; +import org.eclipse.jkube.kit.build.service.docker.WatchService; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.config.JKubeConfiguration; +import org.eclipse.jkube.kit.config.resource.ProcessorConfig; +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; + import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import org.eclipse.jkube.kit.config.JKubeConfiguration; -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.build.service.docker.ServiceHub; -import org.eclipse.jkube.kit.build.service.docker.WatchService; -import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; -import org.eclipse.jkube.kit.config.resource.RuntimeMode; -import org.eclipse.jkube.kit.config.resource.ProcessorConfig; -import org.eclipse.jkube.kit.config.service.JKubeServiceHub; /** * @author nicola @@ -40,18 +36,13 @@ @EqualsAndHashCode public class WatcherContext { - private JavaProject project; - private ProcessorConfig config; - private KitLogger logger; - private KitLogger newPodLogger; - private KitLogger oldPodLogger; - private RuntimeMode mode; - private boolean useProjectClasspath; - private ServiceHub serviceHub; - private WatchService.WatchContext watchContext; - private JKubeConfiguration buildContext; - private ClusterConfiguration clusterConfiguration; - private KubernetesClient kubernetesClient; - private JKubeServiceHub jKubeServiceHub; + private ProcessorConfig config; + private KitLogger logger; + private KitLogger newPodLogger; + private KitLogger oldPodLogger; + private boolean useProjectClasspath; + private WatchService.WatchContext watchContext; + private JKubeConfiguration buildContext; + private JKubeServiceHub jKubeServiceHub; } diff --git a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java index 19da6e0ea6..e0c4524af8 100644 --- a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java +++ b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java @@ -64,7 +64,7 @@ public void watch(List configs, final Set resou .imageCustomizer(this::buildImage).containerRestarter(imageWatcher -> restartContainer(imageWatcher, resources)) .build(); - ServiceHub hub = getContext().getServiceHub(); + ServiceHub hub = getContext().getJKubeServiceHub().getDockerServiceHub(); try { hub.getWatchService().watch(watchContext, getContext().getBuildContext(), configs); } catch (Exception ex) { @@ -78,7 +78,7 @@ protected void buildImage(ImageConfiguration imageConfig) { try { String imagePrefix = getImagePrefix(imageName); imageName = imagePrefix + "%t"; - ImageNameFormatter formatter = new ImageNameFormatter(getContext().getProject(), new Date()); + ImageNameFormatter formatter = new ImageNameFormatter(getContext().getBuildContext().getProject(), new Date()); imageName = formatter.format(imageName); imageConfig.setName(imageName); log.info("New image name: " + imageConfig.getName()); @@ -101,7 +101,7 @@ private String getImagePrefix(String imageName) { protected void restartContainer(WatchService.ImageWatcher watcher, Set resources) { ImageConfiguration imageConfig = watcher.getImageConfiguration(); String imageName = imageConfig.getName(); - ClusterAccess clusterAccess = new ClusterAccess(log, getContext().getClusterConfiguration()); + ClusterAccess clusterAccess = getContext().getJKubeServiceHub().getClusterAccess(); try (KubernetesClient client = clusterAccess.createDefaultClient()) { String namespace = clusterAccess.getNamespace(); diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 0525f40d73..612365d612 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -102,9 +102,6 @@ public abstract class AbstractDockerMojo extends AbstractMojo public static final String DMP_PLUGIN_DESCRIPTOR = "META-INF/maven/org.eclipse.jkube/k8s-plugin"; public static final String DOCKER_EXTRA_DIR = "docker-extra"; - // Key for indicating that a "start" goal has run - public static final String CONTEXT_KEY_START_CALLED = "CONTEXT_KEY_DOCKER_START_CALLED"; - // Key holding the log dispatcher public static final String CONTEXT_KEY_LOG_DISPATCHER = "CONTEXT_KEY_DOCKER_LOG_DISPATCHER"; diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 06c87612a6..d545d77160 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -110,18 +110,13 @@ private WatcherContext getWatcherContext() throws MojoExecutionException { WatchService.WatchContext watchContext = jkubeServiceHub.getDockerServiceHub() != null ? getWatchContext() : null; return WatcherContext.builder() - .serviceHub(jkubeServiceHub.getDockerServiceHub()) .buildContext(buildContext) .watchContext(watchContext) .config(extractWatcherConfig()) .logger(log) .newPodLogger(createLogger("[[C]][NEW][[C]] ")) .oldPodLogger(createLogger("[[R]][OLD][[R]] ")) - .mode(getConfiguredRuntimeMode()) - .project(MavenUtil.convertMavenProjectToJKubeProject(project, session)) .useProjectClasspath(useProjectClasspath) - .clusterConfiguration(initClusterConfiguration()) - .kubernetesClient(kubernetesClient) .jKubeServiceHub(jkubeServiceHub) .build(); } catch (IOException exception) { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/watcher/WatcherManager.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/watcher/WatcherManager.java index f67c82a025..fd0abbca94 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/watcher/WatcherManager.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/watcher/WatcherManager.java @@ -13,25 +13,24 @@ */ package org.eclipse.jkube.maven.plugin.watcher; -import io.fabric8.kubernetes.api.model.HasMetadata; +import java.util.List; +import java.util.Set; + import org.eclipse.jkube.kit.build.service.docker.ImageConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.ClassUtil; -import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.common.util.PluginServiceFactory; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.watcher.api.Watcher; import org.eclipse.jkube.watcher.api.WatcherContext; -import java.util.List; -import java.util.Set; +import io.fabric8.kubernetes.api.model.HasMetadata; /** * Manager responsible for finding and calling watchers * * @author nicola - * @since 06/02/17 */ public class WatcherManager { @@ -39,10 +38,10 @@ public static void watch(List ret, Set resource PluginServiceFactory pluginFactory = watcherCtx.isUseProjectClasspath() ? - new PluginServiceFactory<>(watcherCtx, ClassUtil.createProjectClassLoader(watcherCtx.getProject().getCompileClassPathElements(), watcherCtx.getLogger())) : + new PluginServiceFactory<>(watcherCtx, ClassUtil.createProjectClassLoader(watcherCtx.getBuildContext().getProject().getCompileClassPathElements(), watcherCtx.getLogger())) : new PluginServiceFactory<>(watcherCtx); - boolean isOpenshift = OpenshiftHelper.isOpenShift(watcherCtx.getKubernetesClient()); + boolean isOpenshift = watcherCtx.getJKubeServiceHub().getClusterAccess().isOpenShift(); PlatformMode mode = isOpenshift ? PlatformMode.openshift : PlatformMode.kubernetes; List watchers = diff --git a/quickstarts/maven/quarkus/pom.xml b/quickstarts/maven/quarkus/pom.xml index 55f79b1101..ef3b7fb4ef 100644 --- a/quickstarts/maven/quarkus/pom.xml +++ b/quickstarts/maven/quarkus/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - 1.2.1.Final + 1.5.2.Final