Skip to content

Commit

Permalink
feat (jkube-kit/build/service/buildpacks) : Add BuildPackCliController (
Browse files Browse the repository at this point in the history
#2453)

Signed-off-by: Rohan Kumar <rohaan@redhat.com>
  • Loading branch information
rohanKanojia authored and manusa committed Jan 25, 2024
1 parent 609f31d commit aa41f75
Show file tree
Hide file tree
Showing 5 changed files with 239 additions and 0 deletions.
8 changes: 8 additions & 0 deletions jkube-kit/build/service/buildpacks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-build-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-common</artifactId>
Expand All @@ -52,6 +56,10 @@
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* 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.service.buildpacks;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
public class BuildPackBuildOptions {
private String builderImage;
private String imageName;
private String creationTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* 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.service.buildpacks.controller;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jkube.kit.common.KitLogger;
import org.eclipse.jkube.kit.service.buildpacks.BuildPackBuildOptions;
import org.eclipse.jkube.kit.service.buildpacks.BuildPackCommand;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

public class BuildPackCliController implements BuildPackController {
private final File pack;
private final KitLogger kitLogger;

public BuildPackCliController(File binaryFile, KitLogger kitLogger) {
this.pack = binaryFile;
this.kitLogger = kitLogger;
}

@Override
public void build(BuildPackBuildOptions buildOptions) {
BuildPackCommand buildPackCommand = new BuildPackCommand(kitLogger, pack,
createBuildCommandArguments(buildOptions),
l -> kitLogger.info("[[s]]%s", l));
try {
buildPackCommand.execute();
} catch (IOException e) {
throw new IllegalStateException("Process Existed With : " + buildPackCommand.getExitCode() + " [" + e.getMessage() + "]", e);
}
}

@Override
public String version() {
AtomicReference<String> versionRef = new AtomicReference<>();
BuildPackCommand versionCommand = new BuildPackCommand(kitLogger, pack, Collections.singletonList("--version"), versionRef::set);
try {
versionCommand.execute();
} catch (IOException e) {
kitLogger.warn(e.getMessage());
}
if (StringUtils.isNotBlank(versionRef.get())) {
return versionRef.get();
}
return null;
}

private List<String> createBuildCommandArguments(BuildPackBuildOptions buildOptions) {
List<String> buildArgs = new ArrayList<>();
buildArgs.add("build");
buildArgs.add(buildOptions.getImageName());
buildArgs.addAll(Arrays.asList("--builder", buildOptions.getBuilderImage()));
buildArgs.addAll(Arrays.asList("--creation-time", buildOptions.getCreationTime()));
return buildArgs;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* 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.service.buildpacks.controller;

import org.eclipse.jkube.kit.service.buildpacks.BuildPackBuildOptions;

public interface BuildPackController {
void build(BuildPackBuildOptions buildOptions);
String version();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* 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.service.buildpacks;

import org.eclipse.jkube.kit.common.KitLogger;
import org.eclipse.jkube.kit.common.util.EnvUtil;
import org.eclipse.jkube.kit.service.buildpacks.controller.BuildPackCliController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

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

import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

class BuildPackCliControllerTest {
private KitLogger kitLogger;
private BuildPackCliController buildPackCliController;
private BuildPackBuildOptions buildOptions;
private File pack;

@BeforeEach
void setUp() {
kitLogger = spy(new KitLogger.SilentLogger());
String validPackBinary = EnvUtil.isWindows() ? "pack.bat" : "pack";
pack = new File(Objects.requireNonNull(getClass().getResource(String.format("/%s", validPackBinary))).getFile());
buildPackCliController = new BuildPackCliController(pack, kitLogger);
buildOptions = BuildPackBuildOptions.builder()
.imageName("foo/bar:latest")
.builderImage("foo/builder:base")
.creationTime("now")
.build();
}

@Nested
@DisplayName("pack command succeeds")
class CommandSucceeds {
@Test
@DisplayName("build, BuildPackBuildOptions passes as commandline arguments")
void build_whenInvoked_thenBuildPackBuildOptionsPassedAsCommandLineArguments() {
// When
buildPackCliController.build(buildOptions);

// Then
verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now");
}

@Test
@DisplayName("version, should get pack version")
void version() {
// When
String version = buildPackCliController.version();

// Then
assertThat(version).isEqualTo("0.32.1+git-b14250b.build-5241");
}
}

@Nested
@DisplayName("pack command fails")
class CommandFails {
@BeforeEach
void setUp() {
String invalidPackBinary = EnvUtil.isWindows() ? "invalid-pack.bat" : "invalid-pack";
pack = new File(Objects.requireNonNull(BuildPackCliControllerTest.class.getResource(String.format("/%s", invalidPackBinary))).getFile());
buildPackCliController = new BuildPackCliController(pack, kitLogger);
}

@Test
@DisplayName("build, throws exception")
void build_whenCommandFailed_thenThrowException() {
// When + Then
assertThatIllegalStateException()
.isThrownBy(() -> buildPackCliController.build(buildOptions))
.withMessageContaining("Process Existed With : 1");
}

@Test
@DisplayName("version, returns null on failure")
void version_whenCommandFailed_thenReturnNull() {
// When
String version = buildPackCliController.version();

// Then
assertThat(version).isNull();
}
}
}

0 comments on commit aa41f75

Please sign in to comment.