Skip to content

Commit

Permalink
Use Gradle Property and Provider to enable lazy evaluation for jib.co…
Browse files Browse the repository at this point in the history
…ntainer.labels (#3094) (#3242)
  • Loading branch information
NAIT BELKACEM committed May 18, 2021
1 parent 026a263 commit cc77462
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.provider.MapProperty;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;

Expand All @@ -43,13 +46,18 @@ public class ContainerParameters {
private ImageFormat format = ImageFormat.Docker;
private List<String> ports = Collections.emptyList();
private List<String> volumes = Collections.emptyList();
private Map<String, String> labels = Collections.emptyMap();
private MapProperty<String, String> labels;
private String appRoot = "";
@Nullable private String user;
@Nullable private String workingDirectory;
private String filesModificationTime = "EPOCH_PLUS_SECOND";
private String creationTime = "EPOCH";

@Inject
public ContainerParameters(ObjectFactory objectFactory) {
labels = objectFactory.mapProperty(String.class, String.class).empty();
}

@Input
@Nullable
@Optional
Expand Down Expand Up @@ -195,18 +203,18 @@ public void setVolumes(List<String> volumes) {

@Input
@Optional
public Map<String, String> getLabels() {
if (System.getProperty(PropertyNames.CONTAINER_LABELS) != null) {
return ConfigurationPropertyValidator.parseMapProperty(
System.getProperty(PropertyNames.CONTAINER_LABELS));
public MapProperty<String, String> getLabels() {
String labelsProperty = System.getProperty(PropertyNames.CONTAINER_LABELS);
if (labelsProperty != null) {
Map<String, String> parsedLabels =
ConfigurationPropertyValidator.parseMapProperty(labelsProperty);
if (!parsedLabels.equals(labels.get())) {
labels.set(parsedLabels);
}
}
return labels;
}

public void setLabels(Map<String, String> labels) {
this.labels = labels;
}

@Input
@Optional
public String getAppRoot() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public Map<String, String> getEnvironment() {

@Override
public Map<String, String> getLabels() {
return jibExtension.getContainer().getLabels();
return jibExtension.getContainer().getLabels().get();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,23 @@
import com.google.common.collect.Sets;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import org.gradle.api.provider.MapProperty;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

/** Test for {@link GradleRawConfiguration}. */
@RunWith(MockitoJUnitRunner.class)
public class GradleRawConfigurationTest {

@Mock private MapProperty<String, String> labels;

@Test
public void testGetters() {
JibExtension jibExtension = Mockito.mock(JibExtension.class);
Expand Down Expand Up @@ -67,8 +75,8 @@ public void testGetters() {
Mockito.when(containerParameters.getEnvironment())
.thenReturn(new HashMap<>(ImmutableMap.of("currency", "dollar")));
Mockito.when(containerParameters.getJvmFlags()).thenReturn(Arrays.asList("-cp", "."));
Mockito.when(containerParameters.getLabels())
.thenReturn(new HashMap<>(ImmutableMap.of("unit", "cm")));
Mockito.when(labels.get()).thenReturn(Collections.singletonMap("unit", "cm"));
Mockito.when(containerParameters.getLabels()).thenReturn(labels);
Mockito.when(containerParameters.getMainClass()).thenReturn("com.example.Main");
Mockito.when(containerParameters.getPorts()).thenReturn(Arrays.asList("80/tcp", "0"));
Mockito.when(containerParameters.getUser()).thenReturn("admin:wheel");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public void testContainer() {
assertThat(testJibExtension.getContainer().getArgs()).isNull();
assertThat(testJibExtension.getContainer().getFormat()).isSameInstanceAs(ImageFormat.Docker);
assertThat(testJibExtension.getContainer().getPorts()).isEmpty();
assertThat(testJibExtension.getContainer().getLabels()).isEmpty();
assertThat(testJibExtension.getContainer().getLabels().get()).isEmpty();
assertThat(testJibExtension.getContainer().getAppRoot()).isEmpty();
assertThat(testJibExtension.getContainer().getFilesModificationTime())
.isEqualTo("EPOCH_PLUS_SECOND");
Expand All @@ -156,7 +156,6 @@ public void testContainer() {
container.setMainClass("mainClass");
container.setArgs(Arrays.asList("arg1", "arg2", "arg3"));
container.setPorts(Arrays.asList("1000", "2000-2010", "3000"));
container.setLabels(ImmutableMap.of("label1", "value1", "label2", "value2"));
container.setFormat(ImageFormat.OCI);
container.setAppRoot("some invalid appRoot value");
container.setFilesModificationTime("some invalid time value");
Expand All @@ -172,9 +171,6 @@ public void testContainer() {
assertThat(testJibExtension.getContainer().getMainClass()).isEqualTo("mainClass");
assertThat(container.getArgs()).containsExactly("arg1", "arg2", "arg3").inOrder();
assertThat(container.getPorts()).containsExactly("1000", "2000-2010", "3000").inOrder();
assertThat(container.getLabels())
.containsExactly("label1", "value1", "label2", "value2")
.inOrder();
assertThat(container.getFormat()).isSameInstanceAs(ImageFormat.OCI);
assertThat(container.getAppRoot()).isEqualTo("some invalid appRoot value");
assertThat(container.getFilesModificationTime()).isEqualTo("some invalid time value");
Expand Down Expand Up @@ -379,7 +375,7 @@ public void testProperties() {
.containsExactly("flag1", "flag2", "flag3")
.inOrder();
System.setProperty("jib.container.labels", "label1=val1,label2=val2");
assertThat(testJibExtension.getContainer().getLabels())
assertThat(testJibExtension.getContainer().getLabels().get())
.containsExactly("label1", "val1", "label2", "val2")
.inOrder();
System.setProperty("jib.container.mainClass", "main");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.tasks.Jar;
import org.gradle.testfixtures.ProjectBuilder;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.UnexpectedBuildFailure;
import org.junit.After;
Expand Down Expand Up @@ -358,6 +359,14 @@ public void testLazyEvalForImageAndTags() {
"Containerizing application to updated-image, updated-image:updated-tag, updated-image:tag2");
}

@Test
public void testLazyEvalForLabels() {
BuildResult showLabels = testProject.build("showlabels", "-Djib.console=plain");
assertThat(showLabels.getOutput())
.contains(
"labels contain values [firstkey:updated-first-label, secondKey:updated-second-label]");
}

private Project createProject(String... plugins) {
Project project =
ProjectBuilder.builder().withProjectDir(testProjectRoot.getRoot()).withName("root").build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,20 @@ project.afterEvaluate {

jib {
to {
image = project.provider {project.ext.value + "-image"}
tags = project.provider {[project.ext.value + "-tag", "tag2"]}
image = project.provider { project.ext.value + "-image" }
tags = project.provider { [project.ext.value + "-tag", "tag2"] }
}
}
container {
labels = project.provider {
[
firstkey : project.ext.value + "-first-label",
secondKey: project.ext.value + "-second-label"
]
}
}
}

tasks.register('showlabels') {
Map<String, String> prop = project.extensions.getByName("jib")["container"]["labels"].get()
println("labels contain values " + prop)
}

0 comments on commit cc77462

Please sign in to comment.