jkube icon indicating copy to clipboard operation
jkube copied to clipboard

Incorrect `PathMatcher` Pattern leads to Stack Overflow

Open l3002 opened this issue 1 year ago • 15 comments

Component

JKube Kit

Task description

Task Description

Propose a solution for the problem given below and add a correct exclusion condition for the destination subdirectory (target/myapp) for successful copy operation.

Description

Related To #2733

While working on the above mentioned issue I have found that an ill designed PathMatcher statement is leading to StackOverflow in AssemblyFileSetUtils.copy().

image

This is a recursive function and as I suspect it's expected to copy DockerFile and docker-build.tar from the output directory (here, target) to the subdirectory of the same output directory (here, target/myapp/build/maven) in the context of build_withDockerfileModeAndAssembly_shouldSucceed()

The exclusion condition for the destination subdirectory is mentioned, here, in AssemblyManager.createDockerExcludesList()

image

But as the outputDirectory definition is creating the a incorrect path due to initialization with target.getAbsolute(). It creates a incorrect file path in Linux & Windows. In Linux, it leads to the creation of incorrect destination path and in Windows it leads to test failure.

image

Destination File Path in Linux:

image

Error in Windows:

image

And when I change this outputDirectory to target.getName() to create the right directory. It leads to StackOverflow caused by the infinite recursion due to the incorrect exclusion statement which is not excluding any files or after changing the relativized path leads to exclusion of all files and directories.

image

Expected Behavior

As per my analysis, I believe the that the expected behavior is to copy all the files and directories in output directory (target) to the subdirectory (for example, target/myapp/build/maven) except for the subdirectory itself.

@rohanKanojia & @manusa, Could you guys please look into this and let me know if I'm right about it.

Acceptance Criteria

  • [ ] OpenshiftBuildServiceIntegrationTest.build_withDockerfileModeAndAssembly_shouldSucceed() should pass
  • [ ] AssemblyFileSetUtils.copy() should lead to successfully copying of files and directories in target

l3002 avatar Mar 04 '24 19:03 l3002

@rohanKanojia / @manusa, Please look into this issue and if it seems a genuine issue, then assign it to me.

l3002 avatar Mar 04 '24 19:03 l3002

Hi @l3002

I'm sorry, but I'm failing to see the issue at hand. The "Error in windows:" screenshot shows a truncated stacktrace precisely where the most critical part is, could you please attach that line using (backtic/code blocks)

    ```
    $theStackTraceLine
    ```

Why is the path wrong in *nix-compatible file systems?

Would the issue be fixed for Windows in case the / character was changed to \ in the following line: https://github.com/eclipse/jkube/blob/5da6068d7756784aef9569568ee80f98da97e296/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java#L456

manusa avatar Mar 05 '24 05:03 manusa

Hi @manusa, Sorry for the messy description, There was a lot to cover. The issue persists with both Windows and Linux.

In Windows:


	at org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildService.buildSingleImage(OpenshiftBuildService.java:170)
	at org.eclipse.jkube.kit.config.service.AbstractImageBuildService.processImage(AbstractImageBuildService.java:57)
	at org.eclipse.jkube.kit.config.service.AbstractImageBuildService.build(AbstractImageBuildService.java:36)
	at org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildServiceIntegrationTest.build_withDockerfileModeAndAssembly_shouldSucceed(OpenshiftBuildServiceIntegrationTest.java:254)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.util.regex.PatternSyntaxException: Stack overflow during pattern compilation near index 12
^target(?:(?:\\.*)|(?:))$
            ^
	at java.base/java.util.regex.Pattern.error(Pattern.java:2028)
	at java.base/java.util.regex.Pattern.<init>(Pattern.java:1432)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1095)
	at java.base/sun.nio.fs.WindowsFileSystem.getPathMatcher(WindowsFileSystem.java:282)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.lambda$excludePathMatchers$5(AssemblyFileSetUtils.java:198)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Collections$2.tryAdvance(Collections.java:4853)
	at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4861)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.excludePathMatchers(AssemblyFileSetUtils.java:199)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.isNotExcluded(AssemblyFileSetUtils.java:190)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:166)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
	at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)

This is occurring due to two reasons, one them is the relativized path for the source, which should return the path in target/<directory-name> form but returns <directory name>

The source code relativization of path is given below sourceDirectory.relativize(path).normalize()

image

This should return target/<directory-name> because the glob pattern created at AssemblyManager.createDockerExcludesList() is target{/**,} which would remove any files in target, which leads to our 2nd issue.

image

The second issue is that, we are not supposed to exclude all files in target but just the destination subdirectory from it or any directories specified by the user. but due to the above glob glob:target{/**,} all the files are being excluded when we change the relativized path to the correct form.

When all the files are being excluded nothing happens and it never enters the copy() block of the code.

The same issue was encountered with Linux but it doesn't return a StackOverflow rather it returns:

 File name too long
        at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
        at java.base/sun.nio.fs.UnixCopyFile.copyFile(UnixCopyFile.java:246)
        at java.base/sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:603)
        at java.base/sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:257)
        at java.base/java.nio.file.Files.copy(Files.java:1305)
        at org.eclipse.jkube.kit.common.util.FileUtil.copy(FileUtil.java:205)
        at org.eclipse.jkube.kit.common.util.FileUtil.copy(FileUtil.java:201)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:173)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)
        at org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.copy(AssemblyFileSetUtils.java:170)

This issue is occurring due to the same reasons mentioned above but here Unix's System call returns error for File Name Too Long.

l3002 avatar Mar 05 '24 09:03 l3002

@l3002 : Hello, Could you please share steps to reproduce this problem?

rohanKanojia avatar Mar 05 '24 09:03 rohanKanojia

@rohanKanojia: Sure, Just change outputDirectory in jKubeServiceHub.Configuration to target.getName() in OpenshiftBuildServiceIntegrationTest

image

image

and run mvn clean install for the project.

l3002 avatar Mar 05 '24 09:03 l3002

@manusa / @rohanKanojia: Were you guys able to reproduce the Issue?

l3002 avatar Mar 05 '24 20:03 l3002

@l3002 : I could reproduce the issue after making the abovementioned changes. However, I haven't checked what's causing this. I would like to find answers to these questions

Why is the test working when the absolute path is used in JKubeConfiguration?

.outputDirectory(target.getAbsolutePath())

What's the difference in behavior of isNotExcluded filter when outputDirectory is changed to target.getName()?

rohanKanojia avatar Mar 06 '24 06:03 rohanKanojia

@rohanKanojia: I have been working on that and have made some progress with it.

The issue is occurring with target.getName() because it creates the Destination Directory as the sub directory of itself. Whereas the Destination Directory for target.getAbsolutePath() is a directory created outside the target directory. Due to which it never needs to enter the exclusion part.

For target.getAbsolutePath():

image

NOTE: Here, the target is the destination directory.

It actually creates the destination directory in the parent directory of target which is openshift-build-service.

Now, For target.getName():

The exclusion statement should exclude the output sub directory (for example, target/myapp) but it isn't therefore when it enters the if block it checks that it is a directory and force creates it and invokes copy on the all the subdirectory which again invokes the if block and force creates that new directory. Thus, creating an infinite recursion.

Something like this: image image

and so on.

l3002 avatar Mar 06 '24 10:03 l3002

@l3002 : Do you mean this issue is happening due to wrong expectation set in tests? Just because output directory name is target ?

In Mojos, this value is set to target/docker https://github.com/eclipse/jkube/blob/8caae1af25655622875bf537b32814fd3648c189/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java#L172-L173

What happens if you change value of target variable to match this value?

target = Files.createDirectories(baseDirectory.toPath().resolve("target").resolve("docker")).toFile();

rohanKanojia avatar Mar 06 '24 10:03 rohanKanojia

@rohanKanojia : I don't think that would solve the problem, Because the issue occurring, here,

https://github.com/eclipse/jkube/blob/8caae1af25655622875bf537b32814fd3648c189/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java#L168

In the copy(), it creates the destination file once it resolves that the file source is a directory. This must have been implemented for the openshift-build-service/target itself which is our initial source directory, because after that when it recursively calls itself, it does that for the files contained in it.

https://github.com/eclipse/jkube/blob/8caae1af25655622875bf537b32814fd3648c189/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/AssemblyFileSetUtils.java#L169-L171

But as the destination directory target/myapp/build/maven is also present there it needs an exclusion statement for it so that it doesn't enter the the if block.

https://github.com/eclipse/jkube/blob/8caae1af25655622875bf537b32814fd3648c189/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java#L453-L465

Here, we needs to add the destination sub directory so that when it actually calls the exclude list and checks if isNotExcluded then for destination this becomes false and it never enters the if block.

l3002 avatar Mar 06 '24 10:03 l3002

The more I look at the test build_withDockerfileModeAndAssembly_shouldSucceed, the more I feel it's not set up correctly:

We're providing Dockerfile inside target directory (which looks a bit strange). https://github.com/eclipse/jkube/blob/b64915ec6090dcb0171e45b6372052278210e6f3/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildServiceIntegrationTest.java#L224-L224

We don't provide any context directory, which means context directory would be Dockerfile's parent directory. Dockerfile's context directory is added to AssemblyFileSet: https://github.com/eclipse/jkube/blob/8caae1af25655622875bf537b32814fd3648c189/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java#L432-L435

You can fix it by either changing Dockerfile location to be under base directory:

final File dockerFile = new File(baseDirectory, "Dockerfile");

Or change the output directory to be different from build directory like I advised in my previous comment.

rohanKanojia avatar Mar 06 '24 17:03 rohanKanojia

@rohanKanojia: Sorry, I missed your last comment yesterday. I'll see if the changing the Dockerfile's location to baseDirectory works.

I believe changing the output directory to be different from the build directory could work and has a strong chance of working. I'll test this in my local environment and let you know.

l3002 avatar Mar 07 '24 10:03 l3002

@l3002 : Hello, Did you get time to try it out? Is it working?

rohanKanojia avatar Mar 12 '24 12:03 rohanKanojia

@rohanKanojia: Hi, Yeah, I checked it yesterday. The solution worked like a charm. I changed the Dockerfile location to baseDirectory.

I'll send in a commit in a few minutes.

I still have some suspicions about the exclusion statement because it wasn't actually working for the any even though it was supposed to. I'll check that some other time though. If I'll find there's any change might be required for that. I'll create a issue for that but for now I guess we can resolve this issue.

l3002 avatar Mar 12 '24 12:03 l3002

Thanks for help again.

l3002 avatar Mar 12 '24 12:03 l3002