Skip to content

Commit

Permalink
fix: Watch works with complex assemblies using AssemblyFile
Browse files Browse the repository at this point in the history
Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
manusa authored and rohanKanojia committed Jun 8, 2020
1 parent 7580138 commit 50332a7
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 23 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Usage:
* Fix #224: RoleBinding Resources Not Supported by Kubernetes Cluster Configurations
* Fix #191: Removed `@Deprecated` fields from RunImageConfiguration
* Fix #233: Provided Slf4j delegate KitLogger implementation
* Fix :Watch works with complex assemblies using AssemblyFile

### 1.0.0-alpha-3 (2020-05-06)
* Fix #167: Add CMD for wildfly based applications
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
* to rebuild an image.
*
* @author roland
* @since 15/06/15
*/
public class AssemblyFiles {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
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;
Expand All @@ -28,6 +29,7 @@
import java.util.Properties;

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.AssemblyFileSet;
Expand All @@ -47,6 +49,8 @@
import static org.eclipse.jkube.kit.build.core.assembly.JKubeAssemblyConfigurationUtils.getJKubeAssemblyFileSetsExcludes;
import static org.eclipse.jkube.kit.build.core.assembly.JKubeAssemblyConfigurationUtils.getJKubeAssemblyFiles;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.processAssemblyFileSet;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileUtils.getAssemblyFileOutputDirectory;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileUtils.resolveSourceFile;

/**
* Tool for creating a docker image tar ball including a Dockerfile for building
Expand Down Expand Up @@ -227,21 +231,34 @@ void verifyGivenDockerfile(File dockerFile, BuildConfiguration buildConfig, Prop
*
* @param name name of assembly
* @param buildConfig build configuration
* @param mojoParams maven build context
* @param jKubeConfiguration JKube kit configuration
* @return assembly files
*/
public AssemblyFiles getAssemblyFiles(String name, BuildConfiguration buildConfig, JKubeConfiguration mojoParams) {
public AssemblyFiles getAssemblyFiles(String name, BuildConfiguration buildConfig, JKubeConfiguration jKubeConfiguration) {

BuildDirs buildDirs = createBuildDirs(name, mojoParams);
BuildDirs buildDirs = createBuildDirs(name, jKubeConfiguration);

AssemblyConfiguration assemblyConfig = buildConfig.getAssemblyConfiguration();
String assemblyName = assemblyConfig.getName();

AssemblyFiles assemblyFiles = new AssemblyFiles(buildDirs.getOutputDirectory());
File finalOutputArtifact = JKubeProjectUtil.getFinalOutputArtifact(mojoParams.getProject());
if (finalOutputArtifact != null) {
assemblyFiles.addEntry(finalOutputArtifact, new File(buildDirs.getOutputDirectory().getAbsolutePath() + File.separator + assemblyName, finalOutputArtifact.getName()));
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));

return assemblyFiles;
}
Expand Down Expand Up @@ -415,19 +432,11 @@ private void processJKubeProjectAssemblyFile(
JavaProject project, AssemblyFile assemblyFile, BuildDirs buildDirs, AssemblyConfiguration assemblyConfiguration)
throws IOException {

final File outputDirectory;
if (assemblyFile.getOutputDirectory().isAbsolute()) {
outputDirectory = assemblyFile.getOutputDirectory();
} else {
outputDirectory = buildDirs.getOutputDirectory().toPath()
.resolve(assemblyConfiguration.getName())
.resolve(assemblyFile.getOutputDirectory().toPath())
.toFile();
}
final File sourceFile = project.getBaseDirectory().toPath()
.resolve(assemblyFile.getSource().toPath()).toFile();
final File sourceFile = resolveSourceFile(project.getBaseDirectory(), assemblyFile);

final File outputDirectory = getAssemblyFileOutputDirectory(assemblyFile, buildDirs.getOutputDirectory(), assemblyConfiguration);
FileUtil.createDirectory(outputDirectory);

final String destinationFilename = Optional.ofNullable(assemblyFile.getDestName()).orElse(sourceFile.getName());
final File destinationFile = new File(outputDirectory, destinationFilename);
FileUtil.copy(sourceFile, destinationFile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

/**
* @author roland
* @since 30/11/15
*/
public class ArchiveService {

Expand Down Expand Up @@ -78,16 +77,16 @@ public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfig
*
* @param imageConfig image config for which to get files. The build- and assembly configuration in this image
* config must not be null.
* @param mojoParameters needed for tracking the assembly
* @param jKubeConfiguration needed for tracking the assembly
* @return mapping of assembly files
* @throws IOException IO Exception
*/
public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfig, JKubeConfiguration mojoParameters)
public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfig, JKubeConfiguration jKubeConfiguration)
throws IOException {

String name = imageConfig.getName();
try {
return dockerAssemblyManager.getAssemblyFiles(name, imageConfig.getBuildConfiguration(), mojoParameters);
return dockerAssemblyManager.getAssemblyFiles(name, imageConfig.getBuildConfiguration(), jKubeConfiguration);
} catch (Exception e) {
throw new IOException("Cannot extract assembly files for image " + name + ": " + e, e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ public static Map<File, String> processAssemblyFileSet(
return fileToPermissionsMap;
}


static File resolveSourceDirectory(File baseDirectory, AssemblyFileSet assemblyFileSet) {
if (Objects.requireNonNull(assemblyFileSet.getDirectory(), "Assembly FileSet directory is required").isAbsolute()) {
return assemblyFileSet.getDirectory();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* 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.archive;

import org.eclipse.jkube.kit.common.AssemblyConfiguration;
import org.eclipse.jkube.kit.common.AssemblyFile;

import java.io.File;
import java.util.Objects;

public class AssemblyFileUtils {

private AssemblyFileUtils() {}

public static File getAssemblyFileOutputDirectory(
AssemblyFile assemblyFile, File outputDirectoryForRelativePaths, AssemblyConfiguration assemblyConfiguration) {
final File outputDirectory;
if (assemblyFile.getOutputDirectory().isAbsolute()) {
outputDirectory = assemblyFile.getOutputDirectory();
} else {
outputDirectory = outputDirectoryForRelativePaths.toPath()
.resolve(Objects.requireNonNull(assemblyConfiguration.getName(), "Assembly Configuration name is required"))
.resolve(assemblyFile.getOutputDirectory().toPath())
.toFile();
}
return outputDirectory;
}

public static File resolveSourceFile(File baseDirectory, AssemblyFile assemblyFile) {
return baseDirectory.toPath()
.resolve(Objects.requireNonNull(assemblyFile.getSource(), "Assembly File source is required").toPath())
.toFile();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/**
* 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.archive;

import org.eclipse.jkube.kit.common.AssemblyConfiguration;
import org.eclipse.jkube.kit.common.AssemblyFile;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.File;
import java.io.IOException;

import static org.junit.Assert.*;

public class AssemblyFileUtilsTest {

@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();

@Test
public void getAssemblyFileOutputDirectoryWithAbsoluteDirectoryShouldReturnSame() throws IOException {
// Given
final AssemblyFile af = AssemblyFile.builder().outputDirectory(new File("/")).build();
final File outputDirectoryForRelativePaths = temporaryFolder.newFolder("output");
final AssemblyConfiguration ac = AssemblyConfiguration.builder().build();
// When
final File result = AssemblyFileUtils.getAssemblyFileOutputDirectory(af, outputDirectoryForRelativePaths, ac);
// Then
assertEquals("/", result.getAbsolutePath());
}

@Test
public void getAssemblyFileOutputDirectoryWithRelativeDirectoryShouldReturnComputedPath() throws IOException {
// Given
final AssemblyFile af = AssemblyFile.builder().outputDirectory(new File("target")).build();
final File outputDirectoryForRelativePaths = temporaryFolder.newFolder("output");
final AssemblyConfiguration ac = AssemblyConfiguration.builder().name("project").build();
// When
final File result = AssemblyFileUtils.getAssemblyFileOutputDirectory(af, outputDirectoryForRelativePaths, ac);
// Then
final String expectedPath = outputDirectoryForRelativePaths.toPath().resolve("project").resolve("target")
.toAbsolutePath().toString();
assertEquals(expectedPath, result.getAbsolutePath());
}

@Test
public void resolveSourceFileAbsoluteFileShouldReturnSame() throws IOException {
// Given
final File baseDirectory = temporaryFolder.newFolder("base");
final AssemblyFile af = AssemblyFile.builder().source(new File("/")).build();
// When
final File result = AssemblyFileUtils.resolveSourceFile(baseDirectory, af);
// Then
assertEquals("/", result.getAbsolutePath());
}

@Test
public void resolveSourceFileRelativeSourceShouldReturnComputedPath() throws IOException {
// Given
final File baseDirectory = temporaryFolder.newFolder("base");
final AssemblyFile af = AssemblyFile.builder().source(new File("some-file.txt")).build();
// When
final File result = AssemblyFileUtils.resolveSourceFile(baseDirectory, af);
// Then
final String expectedPath = baseDirectory.toPath().resolve("some-file.txt")
.toAbsolutePath().toString();
assertEquals(expectedPath, result.getAbsolutePath());
}
}
1 change: 1 addition & 0 deletions quickstarts/maven/webapp/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jkube.enricher.jkube-service.type>NodePort</jkube.enricher.jkube-service.type>
</properties>
<profiles>
<profile>
Expand Down

0 comments on commit 50332a7

Please sign in to comment.