From 705d5cc7d43c57dbbcfac4255b6222bce7dbcb23 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 16 Apr 2020 16:54:10 -0400 Subject: [PATCH 01/20] Add extension configuration option for Maven --- .../jib/gradle/GradleProjectProperties.java | 4 +- .../jib/gradle/GradleRawConfiguration.java | 6 ++ .../extension/JibMavenPluginExtension.java | 7 +- .../jib/maven/JibPluginConfiguration.java | 24 ++++++ .../jib/maven/MavenProjectProperties.java | 32 +++++-- .../jib/maven/MavenRawConfiguration.java | 7 ++ .../jib/maven/MavenProjectPropertiesTest.java | 86 ++++++++++++++++--- .../common/PluginConfigurationProcessor.java | 10 ++- .../jib/plugins/common/ProjectProperties.java | 4 +- .../jib/plugins/common/RawConfiguration.java | 9 ++ 10 files changed, 164 insertions(+), 25 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index c168a82bc3..bf6fa0279c 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -33,6 +33,7 @@ import com.google.cloud.tools.jib.plugins.common.JavaContainerBuilderHelper; import com.google.cloud.tools.jib.plugins.common.ProjectProperties; import com.google.cloud.tools.jib.plugins.common.PropertyNames; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; import com.google.cloud.tools.jib.plugins.common.TimerEventHandler; import com.google.cloud.tools.jib.plugins.common.ZipUtil; import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLogger; @@ -396,7 +397,8 @@ public boolean isOffline() { } @Override - public JibContainerBuilder runPluginExtensions(JibContainerBuilder jibContainerBuilder) + public JibContainerBuilder runPluginExtensions( + List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { return runPluginExtensions( ServiceLoader.load(JibGradlePluginExtension.class).iterator(), jibContainerBuilder); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 2d76150735..35b0c6f894 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -21,6 +21,7 @@ import com.google.cloud.tools.jib.plugins.common.AuthProperty; import com.google.cloud.tools.jib.plugins.common.RawConfiguration; import java.nio.file.Path; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -199,4 +200,9 @@ public Path getImageIdOutputPath() { public Path getImageJsonOutputPath() { return jibExtension.getOutputPaths().getImageJsonPath(); } + + @Override + public List getPluginExtensions() { + return Collections.emptyList(); + } } diff --git a/jib-maven-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/maven/extension/JibMavenPluginExtension.java b/jib-maven-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/maven/extension/JibMavenPluginExtension.java index 2e83b86f8b..e2dbca7385 100644 --- a/jib-maven-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/maven/extension/JibMavenPluginExtension.java +++ b/jib-maven-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/maven/extension/JibMavenPluginExtension.java @@ -20,6 +20,7 @@ import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import java.util.Map; /** * Jib Maven plugin extension API. @@ -34,12 +35,16 @@ public interface JibMavenPluginExtension extends JibPluginExtension { * Extends the build plan prepared by the Jib Maven plugin. * * @param buildPlan original build plan prepared by the Jib Maven plugin + * @param properties custom properties configured for the plugin extension * @param mavenData {@link MavenData} providing Maven-specific data and properties * @param logger logger for writing log messages * @return updated build plan * @throws JibPluginExtensionException if an error occurs while running the plugin extension */ ContainerBuildPlan extendContainerBuildPlan( - ContainerBuildPlan buildPlan, MavenData mavenData, ExtensionLogger logger) + ContainerBuildPlan buildPlan, + Map properties, + MavenData mavenData, + ExtensionLogger logger) throws JibPluginExtensionException; } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java index cb8582c0ed..23182562df 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java @@ -19,6 +19,7 @@ import com.google.cloud.tools.jib.plugins.common.AuthProperty; import com.google.cloud.tools.jib.plugins.common.ConfigurationPropertyValidator; import com.google.cloud.tools.jib.plugins.common.PropertyNames; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -219,6 +220,23 @@ public static class OutputPathsParameters { @Nullable @Parameter private File imageJson; } + public static class ExtensionParameters implements ExtensionConfiguration { + + @Nullable @Parameter private String implementation; + + @Parameter private Map properties = Collections.emptyMap(); + + @Override + public Optional getExtensionClass() { + return Optional.ofNullable(implementation); + } + + @Override + public Map getProperties() { + return properties; + } + } + @Nullable @Parameter(defaultValue = "${session}", readonly = true) private MavenSession session; @@ -253,6 +271,8 @@ public static class OutputPathsParameters { @Parameter(property = PropertyNames.SKIP) private boolean skip; + @Parameter private List extensions = Collections.emptyList(); + @Component protected SettingsDecrypter settingsDecrypter; protected MavenSession getSession() { @@ -654,6 +674,10 @@ boolean isSkipped() { return skip; } + List getPluginExtensions() { + return extensions; + } + /** * Return false if the `jib.containerize` property is specified and does not match this * module/project. Used by the Skaffold-Jib binding. diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index f94a1ed320..21436c9308 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -34,6 +34,7 @@ import com.google.cloud.tools.jib.plugins.common.JavaContainerBuilderHelper; import com.google.cloud.tools.jib.plugins.common.ProjectProperties; import com.google.cloud.tools.jib.plugins.common.PropertyNames; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; import com.google.cloud.tools.jib.plugins.common.TimerEventHandler; import com.google.cloud.tools.jib.plugins.common.ZipUtil; import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLogger; @@ -531,18 +532,23 @@ boolean jarRepackagedBySpringBoot() { } @Override - public JibContainerBuilder runPluginExtensions(JibContainerBuilder jibContainerBuilder) + public JibContainerBuilder runPluginExtensions( + List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { return runPluginExtensions( - ServiceLoader.load(JibMavenPluginExtension.class).iterator(), jibContainerBuilder); + ServiceLoader.load(JibMavenPluginExtension.class).iterator(), + extensionConfigs, + jibContainerBuilder); } @VisibleForTesting JibContainerBuilder runPluginExtensions( - Iterator services, JibContainerBuilder jibContainerBuilder) + Iterator services, + List extensionConfigs, + JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { if (!services.hasNext()) { - log(LogEvent.debug("No Jib plugin extensions discovered")); + log(LogEvent.debug("No Jib plugin extensions discovered on Jib runtime classpath")); return jibContainerBuilder; } @@ -553,8 +559,17 @@ JibContainerBuilder runPluginExtensions( try { while (services.hasNext()) { extension = services.next(); + Optional extensionConfig = + findExtensionConfiguration(extensionConfigs, extension); + if (!extensionConfig.isPresent()) { + log(LogEvent.debug("Skipping extension: " + extension.getClass().getName())); + continue; + } + log(LogEvent.lifecycle("Running extension: " + extension.getClass().getName())); - buildPlan = extension.extendContainerBuildPlan(buildPlan, mavenData, logger); + buildPlan = + extension.extendContainerBuildPlan( + buildPlan, extensionConfig.get().getProperties(), mavenData, logger); ImageReference.parse(buildPlan.getBaseImage()); // to validate image reference } return jibContainerBuilder.applyContainerBuildPlan(buildPlan); @@ -566,4 +581,11 @@ JibContainerBuilder runPluginExtensions( ex); } } + + private Optional findExtensionConfiguration( + List configs, JibMavenPluginExtension extension) { + Predicate matchesClassName = + config -> extension.getClass().getName().equals(config.getExtensionClass().orElse(null)); + return configs.stream().filter(matchesClassName).findFirst(); + } } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java index 4bcd889d06..e574593a74 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java @@ -204,4 +204,11 @@ public Path getImageIdOutputPath() { public Path getImageJsonOutputPath() { return jibPluginConfiguration.getImageJsonOutputPath(); } + + @SuppressWarnings("unchecked") + @Override + public List getPluginExtensions() { + return (List) + (List) jibPluginConfiguration.getPluginExtensions(); + } } diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java index dd0d3d845b..7eb576ee41 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java @@ -26,13 +26,17 @@ import com.google.cloud.tools.jib.api.JibContainerBuilderTestHelper; import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; +import com.google.cloud.tools.jib.api.buildplan.ContainerBuildPlan; import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; import com.google.cloud.tools.jib.api.buildplan.FileEntry; import com.google.cloud.tools.jib.configuration.BuildContext; import com.google.cloud.tools.jib.filesystem.DirectoryWalker; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; import com.google.cloud.tools.jib.maven.extension.JibMavenPluginExtension; +import com.google.cloud.tools.jib.maven.extension.MavenData; import com.google.cloud.tools.jib.plugins.common.ContainerizingMode; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; +import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger; import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.collect.ImmutableList; @@ -89,6 +93,49 @@ public class MavenProjectPropertiesTest { private static final ContainerizingMode DEFAULT_CONTAINERIZING_MODE = ContainerizingMode.EXPLODED; private static final Instant SAMPLE_FILE_MODIFICATION_TIME = Instant.ofEpochSecond(32); + // Interface defined only to give a type name. + private static class FakeJibMavenPluginExtension implements JibMavenPluginExtension { + + private final JibMavenPluginExtension extension; + + private FakeJibMavenPluginExtension(JibMavenPluginExtension extension) { + this.extension = extension; + } + + @Override + public ContainerBuildPlan extendContainerBuildPlan( + ContainerBuildPlan buildPlan, + Map properties, + MavenData mavenData, + ExtensionLogger logger) + throws JibPluginExtensionException { + return extension.extendContainerBuildPlan(buildPlan, properties, mavenData, logger); + } + } + + private static class FakeExtensionConfiguration implements ExtensionConfiguration { + + private String extensionClass = FakeJibMavenPluginExtension.class.getName(); + private Map properties = Collections.emptyMap(); + + private FakeExtensionConfiguration() {} + + private FakeExtensionConfiguration(String extensionClass, Map properties) { + this.extensionClass = extensionClass; + this.properties = properties; + } + + @Override + public Map getProperties() { + return properties; + } + + @Override + public Optional getExtensionClass() { + return Optional.of(extensionClass); + } + } + /** Helper for reading back layers in a {@link BuildContext}. */ private static class ContainerBuilderLayers { @@ -1013,25 +1060,29 @@ public void testRunPluginExtensions_noExtensionsFound() throws JibPluginExtensionException, InvalidImageReferenceException { JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); JibContainerBuilder extendedBuilder = - mavenProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); + mavenProjectProperties.runPluginExtensions( + Collections.emptyIterator(), Collections.emptyList(), originalBuilder); Assert.assertSame(extendedBuilder, originalBuilder); mavenProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLog).debug("No Jib plugin extensions discovered"); + Mockito.verify(mockLog).debug("No Jib plugin extensions discovered on Jib runtime classpath"); } @Test public void testRunPluginExtensions() throws JibPluginExtensionException, InvalidImageReferenceException { JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> { - logger.log(LogLevel.ERROR, "awesome error from my extension"); - return buildPlan.toBuilder().setUser("user from extension").build(); - }; + new FakeJibMavenPluginExtension( + (buildPlan, properties, mavenData, logger) -> { + logger.log(LogLevel.ERROR, "awesome error from my extension"); + return buildPlan.toBuilder().setUser("user from extension").build(); + }); JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); + Arrays.asList(extension).iterator(), + Arrays.asList(new FakeExtensionConfiguration()), + Jib.from(RegistryImage.named("from/nothing"))); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); mavenProjectProperties.waitForLoggingThread(); @@ -1047,15 +1098,18 @@ public void testRunPluginExtensions_exceptionFromExtension() throws InvalidImageReferenceException { FileNotFoundException fakeException = new FileNotFoundException(); JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> { - throw new JibPluginExtensionException( - JibMavenPluginExtension.class, "exception from extension", fakeException); - }; + new FakeJibMavenPluginExtension( + (buildPlan, properties, mavenData, logger) -> { + throw new JibPluginExtensionException( + JibMavenPluginExtension.class, "exception from extension", fakeException); + }); JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); + Arrays.asList(extension).iterator(), + Arrays.asList(new FakeExtensionConfiguration()), + originalBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("exception from extension", ex.getMessage()); @@ -1067,12 +1121,16 @@ public void testRunPluginExtensions_exceptionFromExtension() public void testRunPluginExtensions_invalidBaseImageFromExtension() throws InvalidImageReferenceException { JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); + new FakeJibMavenPluginExtension( + (buildPlan, properties, mavenData, logger) -> + buildPlan.toBuilder().setBaseImage(" in*val+id").build()); JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); + Arrays.asList(extension).iterator(), + Arrays.asList(new FakeExtensionConfiguration()), + originalBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java index 57f4f5cb04..f2946c8376 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java @@ -125,7 +125,9 @@ public static JibBuildRunner createJibBuildRunnerForDockerDaemonImage( processCommonConfiguration( rawConfiguration, inferredAuthProvider, projectProperties, containerizer); JibContainerBuilder updatedContainerBuilder = - projectProperties.runPluginExtensions(jibContainerBuilder).setFormat(ImageFormat.Docker); + projectProperties + .runPluginExtensions(rawConfiguration.getPluginExtensions(), jibContainerBuilder) + .setFormat(ImageFormat.Docker); return JibBuildRunner.forBuildToDockerDaemon( updatedContainerBuilder, @@ -184,7 +186,8 @@ public static JibBuildRunner createJibBuildRunnerForTarImage( processCommonConfiguration( rawConfiguration, inferredAuthProvider, projectProperties, containerizer); JibContainerBuilder updatedContainerBuilder = - projectProperties.runPluginExtensions(jibContainerBuilder); + projectProperties.runPluginExtensions( + rawConfiguration.getPluginExtensions(), jibContainerBuilder); return JibBuildRunner.forBuildTar( updatedContainerBuilder, @@ -258,7 +261,8 @@ public static JibBuildRunner createJibBuildRunnerForRegistryImage( processCommonConfiguration( rawConfiguration, inferredAuthProvider, projectProperties, containerizer); JibContainerBuilder updatedContainerBuilder = - projectProperties.runPluginExtensions(jibContainerBuilder); + projectProperties.runPluginExtensions( + rawConfiguration.getPluginExtensions(), jibContainerBuilder); return JibBuildRunner.forBuildImage( updatedContainerBuilder, diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java index ce9dbce0bf..16aa31cd2e 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java @@ -20,6 +20,7 @@ import com.google.cloud.tools.jib.api.JavaContainerBuilder; import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.LogEvent; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import java.io.IOException; import java.nio.file.Path; @@ -87,6 +88,7 @@ JibContainerBuilder createJibContainerBuilder( boolean isOffline(); - JibContainerBuilder runPluginExtensions(JibContainerBuilder jibContainerBuilder) + JibContainerBuilder runPluginExtensions( + List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException; } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java index 7a17312900..f50084dd02 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java @@ -30,6 +30,13 @@ */ public interface RawConfiguration { + static interface ExtensionConfiguration { + + Optional getExtensionClass(); + + Map getProperties(); + } + Optional getFromImage(); Optional getToImage(); @@ -95,4 +102,6 @@ public interface RawConfiguration { Path getImageIdOutputPath(); Path getImageJsonOutputPath(); + + List getPluginExtensions(); } From f505261172994a087507db82ae5eb9c202549144 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 16 Apr 2020 17:10:47 -0400 Subject: [PATCH 02/20] Move plugin extension tests to a new class --- .../GradleProjectPropertiesExtensionTest.java | 145 +++++++++++++++++ .../gradle/GradleProjectPropertiesTest.java | 80 +--------- .../MavenProjectPropertiesExtensionTest.java | 150 ++++++++++++++++++ .../jib/maven/MavenProjectPropertiesTest.java | 79 --------- 4 files changed, 296 insertions(+), 158 deletions(-) create mode 100644 jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java create mode 100644 jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java new file mode 100644 index 0000000000..af64121740 --- /dev/null +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java @@ -0,0 +1,145 @@ +/* + * Copyright 2018 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.gradle; + +import com.google.cloud.tools.jib.api.InvalidImageReferenceException; +import com.google.cloud.tools.jib.api.Jib; +import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.RegistryImage; +import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; +import com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension; +import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; +import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import java.io.FileNotFoundException; +import java.util.Arrays; +import java.util.Collections; +import org.gradle.api.Project; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.configuration.ConsoleOutput; +import org.hamcrest.CoreMatchers; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +/** Plugin extension test for {@link GradleProjectProperties}. */ +@RunWith(MockitoJUnitRunner.class) +public class GradleProjectPropertiesExtensionTest { + + @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Mock private TempDirectoryProvider mockTempDirectoryProvider; + @Mock private Logger mockLogger; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Project mockProject; + + private GradleProjectProperties gradleProjectProperties; + + @Before + public void setUp() { + Mockito.when(mockLogger.isDebugEnabled()).thenReturn(true); + Mockito.when(mockLogger.isInfoEnabled()).thenReturn(true); + Mockito.when(mockLogger.isWarnEnabled()).thenReturn(true); + Mockito.when(mockLogger.isErrorEnabled()).thenReturn(true); + + Mockito.when(mockProject.getGradle().getStartParameter().getConsoleOutput()) + .thenReturn(ConsoleOutput.Plain); + + gradleProjectProperties = + new GradleProjectProperties(mockProject, mockLogger, mockTempDirectoryProvider); + } + + @Test + public void testRunPluginExtensions_noExtensionsFound() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + JibContainerBuilder extendedBuilder = + gradleProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); + Assert.assertSame(extendedBuilder, originalBuilder); + + gradleProjectProperties.waitForLoggingThread(); + Mockito.verify(mockLogger).debug("No Jib plugin extensions discovered"); + } + + @Test + public void testRunPluginExtensions() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibGradlePluginExtension extension = + (buildPlan, gradleData, logger) -> { + logger.log(LogLevel.ERROR, "awesome error from my extension"); + return buildPlan.toBuilder().setUser("user from extension").build(); + }; + + JibContainerBuilder extendedBuilder = + gradleProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); + Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); + + gradleProjectProperties.waitForLoggingThread(); + Mockito.verify(mockLogger).error("awesome error from my extension"); + Mockito.verify(mockLogger) + .lifecycle( + Mockito.startsWith( + "Running extension: com.google.cloud.tools.jib.gradle.GradleProjectProperties")); + } + + @Test + public void testRunPluginExtensions_exceptionFromExtension() + throws InvalidImageReferenceException { + FileNotFoundException fakeException = new FileNotFoundException(); + JibGradlePluginExtension extension = + (buildPlan, gradleData, logger) -> { + throw new JibPluginExtensionException( + JibGradlePluginExtension.class, "exception from extension", fakeException); + }; + + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); + try { + gradleProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), originalBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals("exception from extension", ex.getMessage()); + Assert.assertSame(fakeException, ex.getCause()); + } + } + + @Test + public void testRunPluginExtensions_invalidBaseImageFromExtension() + throws InvalidImageReferenceException { + JibGradlePluginExtension extension = + (buildPlan, gradleData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); + + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + try { + gradleProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), originalBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); + Assert.assertThat( + ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); + } + } +} diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java index d1eb8d5681..5de1e1f949 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java @@ -21,7 +21,6 @@ import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.JavaContainerBuilder; import com.google.cloud.tools.jib.api.JavaContainerBuilder.LayerType; -import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.JibContainerBuilderTestHelper; import com.google.cloud.tools.jib.api.RegistryImage; @@ -32,17 +31,13 @@ import com.google.cloud.tools.jib.configuration.BuildContext; import com.google.cloud.tools.jib.filesystem.DirectoryWalker; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; -import com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension; import com.google.cloud.tools.jib.plugins.common.ContainerizingMode; -import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; -import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteStreams; import com.google.common.io.Resources; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; @@ -223,7 +218,7 @@ public void setUp() throws URISyntaxException, IOException { Mockito.when(mockJavaPluginConvention.getSourceSets()).thenReturn(mockSourceSetContainer); Mockito.when(mockProject.getTasks()).thenReturn(mockTaskContainer); Mockito.when(mockProject.getGradle().getStartParameter().getConsoleOutput()) - .thenReturn(ConsoleOutput.Auto); + .thenReturn(ConsoleOutput.Plain); // mocking to complete ignore project dependency resolution Mockito.when( @@ -601,79 +596,6 @@ public void testGetWarFilePath_bootWarDisabled() { Assert.assertEquals("war.war", gradleProjectProperties.getWarFilePath()); } - @Test - public void testRunPluginExtensions_noExtensionsFound() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); - JibContainerBuilder extendedBuilder = - gradleProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); - Assert.assertSame(extendedBuilder, originalBuilder); - - gradleProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLogger).debug("No Jib plugin extensions discovered"); - } - - @Test - public void testRunPluginExtensions() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> { - logger.log(LogLevel.ERROR, "awesome error from my extension"); - return buildPlan.toBuilder().setUser("user from extension").build(); - }; - - JibContainerBuilder extendedBuilder = - gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); - Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); - - gradleProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLogger).error("awesome error from my extension"); - Mockito.verify(mockLogger) - .lifecycle( - Mockito.startsWith( - "Running extension: com.google.cloud.tools.jib.gradle.GradleProjectProperties")); - } - - @Test - public void testRunPluginExtensions_exceptionFromExtension() - throws InvalidImageReferenceException { - FileNotFoundException fakeException = new FileNotFoundException(); - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> { - throw new JibPluginExtensionException( - JibGradlePluginExtension.class, "exception from extension", fakeException); - }; - - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); - try { - gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); - Assert.fail(); - } catch (JibPluginExtensionException ex) { - Assert.assertEquals("exception from extension", ex.getMessage()); - Assert.assertSame(fakeException, ex.getCause()); - } - } - - @Test - public void testRunPluginExtensions_invalidBaseImageFromExtension() - throws InvalidImageReferenceException { - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); - - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); - try { - gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); - Assert.fail(); - } catch (JibPluginExtensionException ex) { - Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); - Assert.assertThat( - ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); - } - } - private BuildContext setupBuildContext(String appRoot) throws InvalidImageReferenceException, CacheDirectoryCreationException { JavaContainerBuilder javaContainerBuilder = diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java new file mode 100644 index 0000000000..8299d6bc09 --- /dev/null +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -0,0 +1,150 @@ +/* + * Copyright 2018 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.maven; + +import com.google.cloud.tools.jib.api.InvalidImageReferenceException; +import com.google.cloud.tools.jib.api.Jib; +import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.RegistryImage; +import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; +import com.google.cloud.tools.jib.maven.extension.JibMavenPluginExtension; +import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; +import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import java.io.FileNotFoundException; +import java.util.Arrays; +import java.util.Collections; +import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.descriptor.PluginDescriptor; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.project.MavenProject; +import org.hamcrest.CoreMatchers; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +/** Plugin extension test for {@link MavenProjectProperties}. */ +@RunWith(MockitoJUnitRunner.class) +public class MavenProjectPropertiesExtensionTest { + + @Rule public final TestRepository testRepository = new TestRepository(); + @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Mock private PluginDescriptor mockJibPluginDescriptor; + @Mock private MavenProject mockMavenProject; + @Mock private MavenSession mockMavenSession; + @Mock private MavenExecutionRequest mockMavenRequest; + @Mock private Log mockLog; + @Mock private TempDirectoryProvider mockTempDirectoryProvider; + + private MavenProjectProperties mavenProjectProperties; + + @Before + public void setUp() { + Mockito.when(mockLog.isDebugEnabled()).thenReturn(true); + Mockito.when(mockLog.isWarnEnabled()).thenReturn(true); + Mockito.when(mockLog.isErrorEnabled()).thenReturn(true); + + Mockito.when(mockMavenSession.getRequest()).thenReturn(mockMavenRequest); + mavenProjectProperties = + new MavenProjectProperties( + mockJibPluginDescriptor, + mockMavenProject, + mockMavenSession, + mockLog, + mockTempDirectoryProvider); + } + + @Test + public void testRunPluginExtensions_noExtensionsFound() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + JibContainerBuilder extendedBuilder = + mavenProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); + Assert.assertSame(extendedBuilder, originalBuilder); + + mavenProjectProperties.waitForLoggingThread(); + Mockito.verify(mockLog).debug("No Jib plugin extensions discovered"); + } + + @Test + public void testRunPluginExtensions() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibMavenPluginExtension extension = + (buildPlan, mavenData, logger) -> { + logger.log(LogLevel.ERROR, "awesome error from my extension"); + return buildPlan.toBuilder().setUser("user from extension").build(); + }; + + JibContainerBuilder extendedBuilder = + mavenProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); + Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); + + mavenProjectProperties.waitForLoggingThread(); + Mockito.verify(mockLog).error("awesome error from my extension"); + Mockito.verify(mockLog) + .info( + Mockito.startsWith( + "Running extension: com.google.cloud.tools.jib.maven.MavenProjectProperties")); + } + + @Test + public void testRunPluginExtensions_exceptionFromExtension() + throws InvalidImageReferenceException { + FileNotFoundException fakeException = new FileNotFoundException(); + JibMavenPluginExtension extension = + (buildPlan, mavenData, logger) -> { + throw new JibPluginExtensionException( + JibMavenPluginExtension.class, "exception from extension", fakeException); + }; + + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); + try { + mavenProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), originalBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals("exception from extension", ex.getMessage()); + Assert.assertSame(fakeException, ex.getCause()); + } + } + + @Test + public void testRunPluginExtensions_invalidBaseImageFromExtension() + throws InvalidImageReferenceException { + JibMavenPluginExtension extension = + (buildPlan, mavenData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); + + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + try { + mavenProjectProperties.runPluginExtensions( + Arrays.asList(extension).iterator(), originalBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); + Assert.assertThat( + ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); + } + } +} diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java index dd0d3d845b..9e1fb3f107 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesTest.java @@ -21,7 +21,6 @@ import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.JavaContainerBuilder; import com.google.cloud.tools.jib.api.JavaContainerBuilder.LayerType; -import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.JibContainerBuilderTestHelper; import com.google.cloud.tools.jib.api.RegistryImage; @@ -31,16 +30,12 @@ import com.google.cloud.tools.jib.configuration.BuildContext; import com.google.cloud.tools.jib.filesystem.DirectoryWalker; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; -import com.google.cloud.tools.jib.maven.extension.JibMavenPluginExtension; import com.google.cloud.tools.jib.plugins.common.ContainerizingMode; -import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; -import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteStreams; import com.google.common.io.Resources; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; @@ -71,7 +66,6 @@ import org.codehaus.plexus.archiver.zip.ZipEntry; import org.codehaus.plexus.archiver.zip.ZipOutputStream; import org.codehaus.plexus.util.xml.Xpp3Dom; -import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -1008,79 +1002,6 @@ public void testGetWarArtifact_executionIdNotMatched() { Paths.get("/foo/bar/helloworld-1.war"), mavenProjectProperties.getWarArtifact()); } - @Test - public void testRunPluginExtensions_noExtensionsFound() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); - JibContainerBuilder extendedBuilder = - mavenProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); - Assert.assertSame(extendedBuilder, originalBuilder); - - mavenProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLog).debug("No Jib plugin extensions discovered"); - } - - @Test - public void testRunPluginExtensions() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> { - logger.log(LogLevel.ERROR, "awesome error from my extension"); - return buildPlan.toBuilder().setUser("user from extension").build(); - }; - - JibContainerBuilder extendedBuilder = - mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); - Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); - - mavenProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLog).error("awesome error from my extension"); - Mockito.verify(mockLog) - .info( - Mockito.startsWith( - "Running extension: com.google.cloud.tools.jib.maven.MavenProjectProperties")); - } - - @Test - public void testRunPluginExtensions_exceptionFromExtension() - throws InvalidImageReferenceException { - FileNotFoundException fakeException = new FileNotFoundException(); - JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> { - throw new JibPluginExtensionException( - JibMavenPluginExtension.class, "exception from extension", fakeException); - }; - - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); - try { - mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); - Assert.fail(); - } catch (JibPluginExtensionException ex) { - Assert.assertEquals("exception from extension", ex.getMessage()); - Assert.assertSame(fakeException, ex.getCause()); - } - } - - @Test - public void testRunPluginExtensions_invalidBaseImageFromExtension() - throws InvalidImageReferenceException { - JibMavenPluginExtension extension = - (buildPlan, mavenData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); - - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); - try { - mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); - Assert.fail(); - } catch (JibPluginExtensionException ex) { - Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); - Assert.assertThat( - ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); - } - } - private BuildContext setUpBuildContext(String appRoot, ContainerizingMode containerizingMode) throws InvalidImageReferenceException, IOException, CacheDirectoryCreationException { JavaContainerBuilder javaContainerBuilder = From bb65ebdf93b98f560a73d524c3d15ecab76c3f27 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 16 Apr 2020 18:42:29 -0400 Subject: [PATCH 03/20] Iterator over configs instead of extension list --- .../jib/maven/JibPluginConfiguration.java | 6 +-- .../jib/maven/MavenProjectProperties.java | 46 ++++++++++--------- .../MavenProjectPropertiesExtensionTest.java | 28 ++++++++--- .../jib/plugins/common/RawConfiguration.java | 2 +- 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java index 23182562df..857b0e01f5 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java @@ -222,13 +222,13 @@ public static class OutputPathsParameters { public static class ExtensionParameters implements ExtensionConfiguration { - @Nullable @Parameter private String implementation; + @Parameter private String implementation = "undefined"; @Parameter private Map properties = Collections.emptyMap(); @Override - public Optional getExtensionClass() { - return Optional.ofNullable(implementation); + public String getExtensionClass() { + return implementation; } @Override diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index 21436c9308..a87b558252 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -16,6 +16,7 @@ package com.google.cloud.tools.jib.maven; +import com.google.api.client.util.Lists; import com.google.cloud.tools.jib.api.Containerizer; import com.google.cloud.tools.jib.api.ImageReference; import com.google.cloud.tools.jib.api.InvalidImageReferenceException; @@ -52,7 +53,6 @@ import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -535,41 +535,45 @@ boolean jarRepackagedBySpringBoot() { public JibContainerBuilder runPluginExtensions( List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { - return runPluginExtensions( - ServiceLoader.load(JibMavenPluginExtension.class).iterator(), - extensionConfigs, - jibContainerBuilder); + List services = + Lists.newArrayList(ServiceLoader.load(JibMavenPluginExtension.class).iterator()); + return runPluginExtensions(services, extensionConfigs, jibContainerBuilder); } @VisibleForTesting JibContainerBuilder runPluginExtensions( - Iterator services, + List services, List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { - if (!services.hasNext()) { + if (services.isEmpty()) { log(LogEvent.debug("No Jib plugin extensions discovered on Jib runtime classpath")); return jibContainerBuilder; } + if (extensionConfigs.isEmpty()) { + log(LogEvent.debug("No Jib plugin extensions configured to load")); + return jibContainerBuilder; + } JibMavenPluginExtension extension = null; ContainerBuildPlan buildPlan = jibContainerBuilder.toContainerBuildPlan(); MavenExtensionData mavenData = new MavenExtensionData(project, session); MavenExtensionLogger logger = new MavenExtensionLogger(this::log); try { - while (services.hasNext()) { - extension = services.next(); - Optional extensionConfig = - findExtensionConfiguration(extensionConfigs, extension); - if (!extensionConfig.isPresent()) { - log(LogEvent.debug("Skipping extension: " + extension.getClass().getName())); - continue; + for (ExtensionConfiguration config : extensionConfigs) { + String extensionClass = config.getExtensionClass(); + extension = findConfiguredExtension(services, extensionClass); + if (extension == null) { + throw new JibPluginExtensionException( + JibMavenPluginExtension.class, + "the following extension is configured to load but not discovered on Jib runtime classpath: " + + extensionClass); } - log(LogEvent.lifecycle("Running extension: " + extension.getClass().getName())); + log(LogEvent.lifecycle("Running extension: " + extensionClass)); buildPlan = extension.extendContainerBuildPlan( - buildPlan, extensionConfig.get().getProperties(), mavenData, logger); + buildPlan, config.getProperties(), mavenData, logger); ImageReference.parse(buildPlan.getBaseImage()); // to validate image reference } return jibContainerBuilder.applyContainerBuildPlan(buildPlan); @@ -582,10 +586,10 @@ JibContainerBuilder runPluginExtensions( } } - private Optional findExtensionConfiguration( - List configs, JibMavenPluginExtension extension) { - Predicate matchesClassName = - config -> extension.getClass().getName().equals(config.getExtensionClass().orElse(null)); - return configs.stream().filter(matchesClassName).findFirst(); + private JibMavenPluginExtension findConfiguredExtension( + List extensions, String extensionClass) { + Predicate matchesClassName = + extension -> extension.getClass().getName().equals(extensionClass); + return extensions.stream().filter(matchesClassName).findFirst().orElse(null); } } diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index 605a5d3892..b834213416 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -32,7 +32,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Map; -import java.util.Optional; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.descriptor.PluginDescriptor; @@ -91,8 +90,8 @@ public Map getProperties() { } @Override - public Optional getExtensionClass() { - return Optional.of(extensionClass); + public String getExtensionClass() { + return extensionClass; } } @@ -130,13 +129,28 @@ public void testRunPluginExtensions_noExtensionsFound() JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( - Collections.emptyIterator(), Collections.emptyList(), originalBuilder); + Collections.emptyList(), Collections.emptyList(), originalBuilder); Assert.assertSame(extendedBuilder, originalBuilder); mavenProjectProperties.waitForLoggingThread(); Mockito.verify(mockLog).debug("No Jib plugin extensions discovered on Jib runtime classpath"); } + @Test + public void testRunPluginExtensions_noExtensionsConfigured() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibMavenPluginExtension extension = (buildPlan, properties, mavenData, logger) -> buildPlan; + + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + JibContainerBuilder extendedBuilder = + mavenProjectProperties.runPluginExtensions( + Arrays.asList(extension), Collections.emptyList(), originalBuilder); + Assert.assertSame(extendedBuilder, originalBuilder); + + mavenProjectProperties.waitForLoggingThread(); + Mockito.verify(mockLog).debug("No Jib plugin extensions configured to load"); + } + @Test public void testRunPluginExtensions() throws JibPluginExtensionException, InvalidImageReferenceException { @@ -149,7 +163,7 @@ public void testRunPluginExtensions() JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), + Arrays.asList(extension), Arrays.asList(new FakeExtensionConfiguration()), Jib.from(RegistryImage.named("from/nothing"))); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); @@ -176,7 +190,7 @@ public void testRunPluginExtensions_exceptionFromExtension() JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), + Arrays.asList(extension), Arrays.asList(new FakeExtensionConfiguration()), originalBuilder); Assert.fail(); @@ -197,7 +211,7 @@ public void testRunPluginExtensions_invalidBaseImageFromExtension() JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), + Arrays.asList(extension), Arrays.asList(new FakeExtensionConfiguration()), originalBuilder); Assert.fail(); diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java index f50084dd02..8263964322 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java @@ -32,7 +32,7 @@ public interface RawConfiguration { static interface ExtensionConfiguration { - Optional getExtensionClass(); + String getExtensionClass(); Map getProperties(); } From e6f4532355926cf30280e82329582b1242fe1227 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 17 Apr 2020 11:41:15 -0400 Subject: [PATCH 04/20] Update and add tests --- .../jib/maven/MavenProjectProperties.java | 4 - .../MavenProjectPropertiesExtensionTest.java | 97 +++++++++++++------ 2 files changed, 68 insertions(+), 33 deletions(-) diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index a87b558252..0be52064bb 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -546,10 +546,6 @@ JibContainerBuilder runPluginExtensions( List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { - if (services.isEmpty()) { - log(LogEvent.debug("No Jib plugin extensions discovered on Jib runtime classpath")); - return jibContainerBuilder; - } if (extensionConfigs.isEmpty()) { log(LogEvent.debug("No Jib plugin extensions configured to load")); return jibContainerBuilder; diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index b834213416..eb87adaf80 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -53,11 +53,11 @@ public class MavenProjectPropertiesExtensionTest { // Interface defined only to give a type name. - private static class FakeJibMavenPluginExtension implements JibMavenPluginExtension { + private static class FooExtension implements JibMavenPluginExtension { private final JibMavenPluginExtension extension; - private FakeJibMavenPluginExtension(JibMavenPluginExtension extension) { + private FooExtension(JibMavenPluginExtension extension) { this.extension = extension; } @@ -72,15 +72,25 @@ public ContainerBuildPlan extendContainerBuildPlan( } } - private static class FakeExtensionConfiguration implements ExtensionConfiguration { + private static class BarExtension extends FooExtension { - private String extensionClass = FakeJibMavenPluginExtension.class.getName(); + private BarExtension(JibMavenPluginExtension extension) { + super(extension); + } + } + + private static class FooExtensionConfig implements ExtensionConfiguration { + + private String extensionClass = FooExtension.class.getName(); private Map properties = Collections.emptyMap(); - private FakeExtensionConfiguration() {} + private FooExtensionConfig() {} - private FakeExtensionConfiguration(String extensionClass, Map properties) { + private FooExtensionConfig(String extensionClass) { this.extensionClass = extensionClass; + } + + private FooExtensionConfig(Map properties) { this.properties = properties; } @@ -95,6 +105,13 @@ public String getExtensionClass() { } } + private static class BarExtensionConfig extends FooExtensionConfig { + + private BarExtensionConfig() { + super(BarExtension.class.getName()); + } + } + @Rule public final TestRepository testRepository = new TestRepository(); @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -123,19 +140,6 @@ public void setUp() { mockTempDirectoryProvider); } - @Test - public void testRunPluginExtensions_noExtensionsFound() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); - JibContainerBuilder extendedBuilder = - mavenProjectProperties.runPluginExtensions( - Collections.emptyList(), Collections.emptyList(), originalBuilder); - Assert.assertSame(extendedBuilder, originalBuilder); - - mavenProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLog).debug("No Jib plugin extensions discovered on Jib runtime classpath"); - } - @Test public void testRunPluginExtensions_noExtensionsConfigured() throws JibPluginExtensionException, InvalidImageReferenceException { @@ -151,11 +155,28 @@ public void testRunPluginExtensions_noExtensionsConfigured() Mockito.verify(mockLog).debug("No Jib plugin extensions configured to load"); } + @Test + public void testRunPluginExtensions_configuredExtensionNotFound() + throws InvalidImageReferenceException { + JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + try { + mavenProjectProperties.runPluginExtensions( + Collections.emptyList(), Arrays.asList(new FooExtensionConfig()), originalBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals( + "the following extension is configured to load but not discovered on Jib runtime " + + "classpath: com.google.cloud.tools.jib.maven.MavenProjectPropertiesExtensionTest" + + "$FooExtension", + ex.getMessage()); + } + } + @Test public void testRunPluginExtensions() throws JibPluginExtensionException, InvalidImageReferenceException { JibMavenPluginExtension extension = - new FakeJibMavenPluginExtension( + new FooExtension( (buildPlan, properties, mavenData, logger) -> { logger.log(LogLevel.ERROR, "awesome error from my extension"); return buildPlan.toBuilder().setUser("user from extension").build(); @@ -164,7 +185,7 @@ public void testRunPluginExtensions() JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( Arrays.asList(extension), - Arrays.asList(new FakeExtensionConfiguration()), + Arrays.asList(new FooExtensionConfig()), Jib.from(RegistryImage.named("from/nothing"))); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); @@ -181,7 +202,7 @@ public void testRunPluginExtensions_exceptionFromExtension() throws InvalidImageReferenceException { FileNotFoundException fakeException = new FileNotFoundException(); JibMavenPluginExtension extension = - new FakeJibMavenPluginExtension( + new FooExtension( (buildPlan, properties, mavenData, logger) -> { throw new JibPluginExtensionException( JibMavenPluginExtension.class, "exception from extension", fakeException); @@ -190,9 +211,7 @@ public void testRunPluginExtensions_exceptionFromExtension() JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), - Arrays.asList(new FakeExtensionConfiguration()), - originalBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), originalBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("exception from extension", ex.getMessage()); @@ -204,16 +223,14 @@ public void testRunPluginExtensions_exceptionFromExtension() public void testRunPluginExtensions_invalidBaseImageFromExtension() throws InvalidImageReferenceException { JibMavenPluginExtension extension = - new FakeJibMavenPluginExtension( + new FooExtension( (buildPlan, properties, mavenData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build()); JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), - Arrays.asList(new FakeExtensionConfiguration()), - originalBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), originalBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); @@ -221,4 +238,26 @@ public void testRunPluginExtensions_invalidBaseImageFromExtension() ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); } } + + @Test + public void testRunPluginExtensions_extensionOrder() + throws JibPluginExtensionException, InvalidImageReferenceException { + JibMavenPluginExtension fakeExtension = + new FooExtension( + (buildPlan, properties, mavenData, logger) -> + buildPlan.toBuilder().setBaseImage("fake").build()); + JibMavenPluginExtension anotherFakeExtension = + new BarExtension( + (buildPlan, properties, mavenData, logger) -> + buildPlan.toBuilder().setBaseImage("another/fake").build()); + + JibContainerBuilder extendedBuilder = + mavenProjectProperties.runPluginExtensions( + Arrays.asList(fakeExtension, anotherFakeExtension), + Arrays.asList(new FooExtensionConfig(), new BarExtensionConfig()), + Jib.from(RegistryImage.named("scratch"))); + Assert.assertEquals("another/fake", extendedBuilder.toContainerBuildPlan().getBaseImage()); + + // TODO: the other direction. + } } From ca9e84e47c6dd3c5294dd048c917fbbb17f9aad4 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 17 Apr 2020 13:56:42 -0400 Subject: [PATCH 05/20] Update test --- .../google/cloud/tools/jib/maven/MavenProjectProperties.java | 2 +- .../tools/jib/maven/MavenProjectPropertiesExtensionTest.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index 0be52064bb..d15fab9338 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -562,7 +562,7 @@ JibContainerBuilder runPluginExtensions( if (extension == null) { throw new JibPluginExtensionException( JibMavenPluginExtension.class, - "the following extension is configured to load but not discovered on Jib runtime classpath: " + "extension configured but not discovered on Jib runtime classpath: " + extensionClass); } diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index eb87adaf80..89f0c28159 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -165,9 +165,8 @@ public void testRunPluginExtensions_configuredExtensionNotFound() Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals( - "the following extension is configured to load but not discovered on Jib runtime " - + "classpath: com.google.cloud.tools.jib.maven.MavenProjectPropertiesExtensionTest" - + "$FooExtension", + "extension configured but not discovered on Jib runtime classpath: com.google.cloud." + + "tools.jib.maven.MavenProjectPropertiesExtensionTest$FooExtension", ex.getMessage()); } } From 8032a6a3fb01f04a2913e55df2ca21156ff313b1 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 17 Apr 2020 17:50:20 -0400 Subject: [PATCH 06/20] Update tests --- .../GradleProjectPropertiesExtensionTest.java | 28 +++---- .../MavenProjectPropertiesExtensionTest.java | 73 +++++++++---------- 2 files changed, 45 insertions(+), 56 deletions(-) diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java index af64121740..cb321ea23a 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java @@ -19,7 +19,6 @@ import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; import com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension; import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; @@ -54,6 +53,8 @@ public class GradleProjectPropertiesExtensionTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Project mockProject; + private final JibContainerBuilder containerBuilder = Jib.fromScratch(); + private GradleProjectProperties gradleProjectProperties; @Before @@ -71,20 +72,17 @@ public void setUp() { } @Test - public void testRunPluginExtensions_noExtensionsFound() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + public void testRunPluginExtensions_noExtensionsFound() throws JibPluginExtensionException { JibContainerBuilder extendedBuilder = - gradleProjectProperties.runPluginExtensions(Collections.emptyIterator(), originalBuilder); - Assert.assertSame(extendedBuilder, originalBuilder); + gradleProjectProperties.runPluginExtensions(Collections.emptyIterator(), containerBuilder); + Assert.assertSame(extendedBuilder, containerBuilder); gradleProjectProperties.waitForLoggingThread(); Mockito.verify(mockLogger).debug("No Jib plugin extensions discovered"); } @Test - public void testRunPluginExtensions() - throws JibPluginExtensionException, InvalidImageReferenceException { + public void testRunPluginExtensions() throws JibPluginExtensionException { JibGradlePluginExtension extension = (buildPlan, gradleData, logger) -> { logger.log(LogLevel.ERROR, "awesome error from my extension"); @@ -93,7 +91,7 @@ public void testRunPluginExtensions() JibContainerBuilder extendedBuilder = gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), Jib.from(RegistryImage.named("from/nothing"))); + Arrays.asList(extension).iterator(), containerBuilder); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); gradleProjectProperties.waitForLoggingThread(); @@ -105,8 +103,7 @@ public void testRunPluginExtensions() } @Test - public void testRunPluginExtensions_exceptionFromExtension() - throws InvalidImageReferenceException { + public void testRunPluginExtensions_exceptionFromExtension() { FileNotFoundException fakeException = new FileNotFoundException(); JibGradlePluginExtension extension = (buildPlan, gradleData, logger) -> { @@ -114,10 +111,9 @@ public void testRunPluginExtensions_exceptionFromExtension() JibGradlePluginExtension.class, "exception from extension", fakeException); }; - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); try { gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); + Arrays.asList(extension).iterator(), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("exception from extension", ex.getMessage()); @@ -126,15 +122,13 @@ public void testRunPluginExtensions_exceptionFromExtension() } @Test - public void testRunPluginExtensions_invalidBaseImageFromExtension() - throws InvalidImageReferenceException { + public void testRunPluginExtensions_invalidBaseImageFromExtension() { JibGradlePluginExtension extension = (buildPlan, gradleData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); try { gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), originalBuilder); + Arrays.asList(extension).iterator(), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index 89f0c28159..9a8bdba3d9 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -19,7 +19,6 @@ import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.api.buildplan.ContainerBuildPlan; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; import com.google.cloud.tools.jib.maven.extension.JibMavenPluginExtension; @@ -31,6 +30,7 @@ import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Map; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenSession; @@ -52,7 +52,6 @@ @RunWith(MockitoJUnitRunner.class) public class MavenProjectPropertiesExtensionTest { - // Interface defined only to give a type name. private static class FooExtension implements JibMavenPluginExtension { private final JibMavenPluginExtension extension; @@ -122,6 +121,8 @@ private BarExtensionConfig() { @Mock private Log mockLog; @Mock private TempDirectoryProvider mockTempDirectoryProvider; + private final JibContainerBuilder containerBuilder = Jib.fromScratch(); + private MavenProjectProperties mavenProjectProperties; @Before @@ -141,27 +142,23 @@ public void setUp() { } @Test - public void testRunPluginExtensions_noExtensionsConfigured() - throws JibPluginExtensionException, InvalidImageReferenceException { + public void testRunPluginExtensions_noExtensionsConfigured() throws JibPluginExtensionException { JibMavenPluginExtension extension = (buildPlan, properties, mavenData, logger) -> buildPlan; - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), Collections.emptyList(), originalBuilder); - Assert.assertSame(extendedBuilder, originalBuilder); + Arrays.asList(extension), Collections.emptyList(), containerBuilder); + Assert.assertSame(extendedBuilder, containerBuilder); mavenProjectProperties.waitForLoggingThread(); Mockito.verify(mockLog).debug("No Jib plugin extensions configured to load"); } @Test - public void testRunPluginExtensions_configuredExtensionNotFound() - throws InvalidImageReferenceException { - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); + public void testRunPluginExtensions_configuredExtensionNotFound() { try { mavenProjectProperties.runPluginExtensions( - Collections.emptyList(), Arrays.asList(new FooExtensionConfig()), originalBuilder); + Collections.emptyList(), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals( @@ -172,9 +169,8 @@ public void testRunPluginExtensions_configuredExtensionNotFound() } @Test - public void testRunPluginExtensions() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibMavenPluginExtension extension = + public void testRunPluginExtensions() throws JibPluginExtensionException { + FooExtension extension = new FooExtension( (buildPlan, properties, mavenData, logger) -> { logger.log(LogLevel.ERROR, "awesome error from my extension"); @@ -183,9 +179,7 @@ public void testRunPluginExtensions() JibContainerBuilder extendedBuilder = mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), - Arrays.asList(new FooExtensionConfig()), - Jib.from(RegistryImage.named("from/nothing"))); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); mavenProjectProperties.waitForLoggingThread(); @@ -197,20 +191,18 @@ public void testRunPluginExtensions() } @Test - public void testRunPluginExtensions_exceptionFromExtension() - throws InvalidImageReferenceException { + public void testRunPluginExtensions_exceptionFromExtension() { FileNotFoundException fakeException = new FileNotFoundException(); - JibMavenPluginExtension extension = + FooExtension extension = new FooExtension( (buildPlan, properties, mavenData, logger) -> { throw new JibPluginExtensionException( - JibMavenPluginExtension.class, "exception from extension", fakeException); + FooExtension.class, "exception from extension", fakeException); }); - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("scratch")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), originalBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("exception from extension", ex.getMessage()); @@ -219,17 +211,15 @@ public void testRunPluginExtensions_exceptionFromExtension() } @Test - public void testRunPluginExtensions_invalidBaseImageFromExtension() - throws InvalidImageReferenceException { - JibMavenPluginExtension extension = + public void testRunPluginExtensions_invalidBaseImageFromExtension() { + FooExtension extension = new FooExtension( (buildPlan, properties, mavenData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build()); - JibContainerBuilder originalBuilder = Jib.from(RegistryImage.named("from/nothing")); try { mavenProjectProperties.runPluginExtensions( - Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), originalBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); @@ -239,24 +229,29 @@ public void testRunPluginExtensions_invalidBaseImageFromExtension() } @Test - public void testRunPluginExtensions_extensionOrder() - throws JibPluginExtensionException, InvalidImageReferenceException { - JibMavenPluginExtension fakeExtension = + public void testRunPluginExtensions_extensionOrder() throws JibPluginExtensionException { + FooExtension fooExtension = new FooExtension( (buildPlan, properties, mavenData, logger) -> - buildPlan.toBuilder().setBaseImage("fake").build()); - JibMavenPluginExtension anotherFakeExtension = + buildPlan.toBuilder().setBaseImage("foo").build()); + BarExtension barExtension = new BarExtension( (buildPlan, properties, mavenData, logger) -> - buildPlan.toBuilder().setBaseImage("another/fake").build()); + buildPlan.toBuilder().setBaseImage("bar").build()); + List extensions = Arrays.asList(fooExtension, barExtension); - JibContainerBuilder extendedBuilder = + JibContainerBuilder extendedBuilder1 = mavenProjectProperties.runPluginExtensions( - Arrays.asList(fakeExtension, anotherFakeExtension), + extensions, Arrays.asList(new FooExtensionConfig(), new BarExtensionConfig()), - Jib.from(RegistryImage.named("scratch"))); - Assert.assertEquals("another/fake", extendedBuilder.toContainerBuildPlan().getBaseImage()); + containerBuilder); + Assert.assertEquals("bar", extendedBuilder1.toContainerBuildPlan().getBaseImage()); - // TODO: the other direction. + JibContainerBuilder extendedBuilder2 = + mavenProjectProperties.runPluginExtensions( + extensions, + Arrays.asList(new BarExtensionConfig(), new FooExtensionConfig()), + containerBuilder); + Assert.assertEquals("foo", extendedBuilder2.toContainerBuildPlan().getBaseImage()); } } From 94c63403bab9d278c7811a281f93e68f86cfbc0c Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Mon, 20 Apr 2020 12:06:13 -0400 Subject: [PATCH 07/20] Add test --- .../MavenProjectPropertiesExtensionTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index 9a8bdba3d9..7a503a8273 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -27,6 +27,7 @@ import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger; import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import com.google.common.collect.ImmutableMap; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Collections; @@ -254,4 +255,19 @@ public void testRunPluginExtensions_extensionOrder() throws JibPluginExtensionEx containerBuilder); Assert.assertEquals("foo", extendedBuilder2.toContainerBuildPlan().getBaseImage()); } + + @Test + public void testRunPluginExtensions_customProperties() throws JibPluginExtensionException { + FooExtension extension = + new FooExtension( + (buildPlan, properties, mavenData, logger) -> + buildPlan.toBuilder().setUser(properties.get("user")).build()); + + JibContainerBuilder extendedBuilder = + mavenProjectProperties.runPluginExtensions( + Arrays.asList(extension), + Arrays.asList(new FooExtensionConfig(ImmutableMap.of("user", "65432"))), + containerBuilder); + Assert.assertEquals("65432", extendedBuilder.toContainerBuildPlan().getUser()); + } } From 088fd95d3832344ca17c1964b97d0ddcc6bc6889 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Wed, 22 Apr 2020 18:26:58 -0400 Subject: [PATCH 08/20] Process extension configuration --- .../extension/JibGradlePluginExtension.java | 7 +- .../jib/gradle/GradleProjectProperties.java | 41 +++-- .../GradleProjectPropertiesExtensionTest.java | 167 +++++++++++++++--- .../jib/maven/MavenProjectProperties.java | 4 +- .../MavenProjectPropertiesExtensionTest.java | 5 - 5 files changed, 185 insertions(+), 39 deletions(-) diff --git a/jib-gradle-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/gradle/extension/JibGradlePluginExtension.java b/jib-gradle-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/gradle/extension/JibGradlePluginExtension.java index 1f99465e1d..9c13e2975b 100644 --- a/jib-gradle-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/gradle/extension/JibGradlePluginExtension.java +++ b/jib-gradle-plugin-extension-api/src/main/java/com/google/cloud/tools/jib/gradle/extension/JibGradlePluginExtension.java @@ -20,6 +20,7 @@ import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import java.util.Map; /** * Jib Gradle plugin extension API. @@ -34,12 +35,16 @@ public interface JibGradlePluginExtension extends JibPluginExtension { * Extends the build plan prepared by the Jib Gradle plugin. * * @param buildPlan original build plan prepared by the Jib Gradle plugin + * @param properties custom properties configured for the plugin extension * @param gradleData {@link GradleData} providing Gradle-specific data and properties * @param logger logger for writing log messages * @return updated build plan * @throws JibPluginExtensionException if an error occurs while running the plugin extension */ ContainerBuildPlan extendContainerBuildPlan( - ContainerBuildPlan buildPlan, GradleData gradleData, ExtensionLogger logger) + ContainerBuildPlan buildPlan, + Map properties, + GradleData gradleData, + ExtensionLogger logger) throws JibPluginExtensionException; } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index bf6fa0279c..c01c8d111e 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -16,6 +16,7 @@ package com.google.cloud.tools.jib.gradle; +import com.google.api.client.util.Lists; import com.google.cloud.tools.jib.api.Containerizer; import com.google.cloud.tools.jib.api.ImageReference; import com.google.cloud.tools.jib.api.InvalidImageReferenceException; @@ -50,9 +51,9 @@ import java.nio.file.Paths; import java.time.Duration; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.ServiceLoader; +import java.util.function.Predicate; import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.tools.ant.taskdefs.condition.Os; @@ -400,16 +401,19 @@ public boolean isOffline() { public JibContainerBuilder runPluginExtensions( List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { - return runPluginExtensions( - ServiceLoader.load(JibGradlePluginExtension.class).iterator(), jibContainerBuilder); + List services = + Lists.newArrayList(ServiceLoader.load(JibGradlePluginExtension.class).iterator()); + return runPluginExtensions(services, extensionConfigs, jibContainerBuilder); } @VisibleForTesting JibContainerBuilder runPluginExtensions( - Iterator services, JibContainerBuilder jibContainerBuilder) + List services, + List extensionConfigs, + JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { - if (!services.hasNext()) { - log(LogEvent.debug("No Jib plugin extensions discovered")); + if (extensionConfigs.isEmpty()) { + log(LogEvent.debug("No Jib plugin extensions configured to load")); return jibContainerBuilder; } @@ -417,10 +421,20 @@ JibContainerBuilder runPluginExtensions( ContainerBuildPlan buildPlan = jibContainerBuilder.toContainerBuildPlan(); GradleExtensionLogger extensionLogger = new GradleExtensionLogger(this::log); try { - while (services.hasNext()) { - extension = services.next(); - log(LogEvent.lifecycle("Running extension: " + extension.getClass().getName())); - buildPlan = extension.extendContainerBuildPlan(buildPlan, () -> project, extensionLogger); + for (ExtensionConfiguration config : extensionConfigs) { + String extensionClass = config.getExtensionClass(); + extension = findConfiguredExtension(services, extensionClass); + if (extension == null) { + throw new JibPluginExtensionException( + JibGradlePluginExtension.class, + "extension configured but not discovered on Jib runtime classpath: " + + extensionClass); + } + + log(LogEvent.lifecycle("Running extension: " + extensionClass)); + buildPlan = + extension.extendContainerBuildPlan( + buildPlan, config.getProperties(), () -> project, extensionLogger); ImageReference.parse(buildPlan.getBaseImage()); // to validate image reference } return jibContainerBuilder.applyContainerBuildPlan(buildPlan); @@ -432,4 +446,11 @@ JibContainerBuilder runPluginExtensions( ex); } } + + private JibGradlePluginExtension findConfiguredExtension( + List extensions, String extensionClass) { + Predicate matchesClassName = + extension -> extension.getClass().getName().equals(extensionClass); + return extensions.stream().filter(matchesClassName).findFirst().orElse(null); + } } diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java index cb321ea23a..2f25097369 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java @@ -19,22 +19,27 @@ import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.buildplan.ContainerBuildPlan; import com.google.cloud.tools.jib.filesystem.TempDirectoryProvider; +import com.google.cloud.tools.jib.gradle.extension.GradleData; import com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; +import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger; import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger.LogLevel; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; +import com.google.common.collect.ImmutableMap; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Collections; +import java.util.List; +import java.util.Map; import org.gradle.api.Project; import org.gradle.api.logging.Logger; import org.gradle.api.logging.configuration.ConsoleOutput; import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; @@ -45,7 +50,64 @@ @RunWith(MockitoJUnitRunner.class) public class GradleProjectPropertiesExtensionTest { - @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + private static class FooExtension implements JibGradlePluginExtension { + + private final JibGradlePluginExtension extension; + + private FooExtension(JibGradlePluginExtension extension) { + this.extension = extension; + } + + @Override + public ContainerBuildPlan extendContainerBuildPlan( + ContainerBuildPlan buildPlan, + Map properties, + GradleData gradleData, + ExtensionLogger logger) + throws JibPluginExtensionException { + return extension.extendContainerBuildPlan(buildPlan, properties, gradleData, logger); + } + } + + private static class BarExtension extends FooExtension { + + private BarExtension(JibGradlePluginExtension extension) { + super(extension); + } + } + + private static class FooExtensionConfig implements ExtensionConfiguration { + + private String extensionClass = FooExtension.class.getName(); + private Map properties = Collections.emptyMap(); + + private FooExtensionConfig() {} + + private FooExtensionConfig(String extensionClass) { + this.extensionClass = extensionClass; + } + + private FooExtensionConfig(Map properties) { + this.properties = properties; + } + + @Override + public Map getProperties() { + return properties; + } + + @Override + public String getExtensionClass() { + return extensionClass; + } + } + + private static class BarExtensionConfig extends FooExtensionConfig { + + private BarExtensionConfig() { + super(BarExtension.class.getName()); + } + } @Mock private TempDirectoryProvider mockTempDirectoryProvider; @Mock private Logger mockLogger; @@ -72,26 +134,44 @@ public void setUp() { } @Test - public void testRunPluginExtensions_noExtensionsFound() throws JibPluginExtensionException { + public void testRunPluginExtensions_noExtensionsConfigured() throws JibPluginExtensionException { + JibGradlePluginExtension extension = (buildPlan, properties, gradleData, logger) -> buildPlan; + JibContainerBuilder extendedBuilder = - gradleProjectProperties.runPluginExtensions(Collections.emptyIterator(), containerBuilder); + gradleProjectProperties.runPluginExtensions( + Arrays.asList(extension), Collections.emptyList(), containerBuilder); Assert.assertSame(extendedBuilder, containerBuilder); gradleProjectProperties.waitForLoggingThread(); - Mockito.verify(mockLogger).debug("No Jib plugin extensions discovered"); + Mockito.verify(mockLogger).debug("No Jib plugin extensions configured to load"); + } + + @Test + public void testRunPluginExtensions_configuredExtensionNotFound() { + try { + gradleProjectProperties.runPluginExtensions( + Collections.emptyList(), Arrays.asList(new FooExtensionConfig()), containerBuilder); + Assert.fail(); + } catch (JibPluginExtensionException ex) { + Assert.assertEquals( + "extension configured but not discovered on Jib runtime classpath: com.google.cloud." + + "tools.jib.gradle.GradleProjectPropertiesExtensionTest$FooExtension", + ex.getMessage()); + } } @Test public void testRunPluginExtensions() throws JibPluginExtensionException { - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> { - logger.log(LogLevel.ERROR, "awesome error from my extension"); - return buildPlan.toBuilder().setUser("user from extension").build(); - }; + FooExtension extension = + new FooExtension( + (buildPlan, properties, gradleData, logger) -> { + logger.log(LogLevel.ERROR, "awesome error from my extension"); + return buildPlan.toBuilder().setUser("user from extension").build(); + }); JibContainerBuilder extendedBuilder = gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), containerBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.assertEquals("user from extension", extendedBuilder.toContainerBuildPlan().getUser()); gradleProjectProperties.waitForLoggingThread(); @@ -105,15 +185,16 @@ public void testRunPluginExtensions() throws JibPluginExtensionException { @Test public void testRunPluginExtensions_exceptionFromExtension() { FileNotFoundException fakeException = new FileNotFoundException(); - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> { - throw new JibPluginExtensionException( - JibGradlePluginExtension.class, "exception from extension", fakeException); - }; + FooExtension extension = + new FooExtension( + (buildPlan, properties, gradleData, logger) -> { + throw new JibPluginExtensionException( + JibGradlePluginExtension.class, "exception from extension", fakeException); + }); try { gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), containerBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("exception from extension", ex.getMessage()); @@ -123,12 +204,14 @@ public void testRunPluginExtensions_exceptionFromExtension() { @Test public void testRunPluginExtensions_invalidBaseImageFromExtension() { - JibGradlePluginExtension extension = - (buildPlan, gradleData, logger) -> buildPlan.toBuilder().setBaseImage(" in*val+id").build(); + FooExtension extension = + new FooExtension( + (buildPlan, properties, gradleData, logger) -> + buildPlan.toBuilder().setBaseImage(" in*val+id").build()); try { gradleProjectProperties.runPluginExtensions( - Arrays.asList(extension).iterator(), containerBuilder); + Arrays.asList(extension), Arrays.asList(new FooExtensionConfig()), containerBuilder); Assert.fail(); } catch (JibPluginExtensionException ex) { Assert.assertEquals("invalid base image reference: in*val+id", ex.getMessage()); @@ -136,4 +219,46 @@ public void testRunPluginExtensions_invalidBaseImageFromExtension() { ex.getCause(), CoreMatchers.instanceOf(InvalidImageReferenceException.class)); } } + + @Test + public void testRunPluginExtensions_extensionOrder() throws JibPluginExtensionException { + FooExtension fooExtension = + new FooExtension( + (buildPlan, properties, gradleData, logger) -> + buildPlan.toBuilder().setBaseImage("foo").build()); + BarExtension barExtension = + new BarExtension( + (buildPlan, properties, gradleData, logger) -> + buildPlan.toBuilder().setBaseImage("bar").build()); + List extensions = Arrays.asList(fooExtension, barExtension); + + JibContainerBuilder extendedBuilder1 = + gradleProjectProperties.runPluginExtensions( + extensions, + Arrays.asList(new FooExtensionConfig(), new BarExtensionConfig()), + containerBuilder); + Assert.assertEquals("bar", extendedBuilder1.toContainerBuildPlan().getBaseImage()); + + JibContainerBuilder extendedBuilder2 = + gradleProjectProperties.runPluginExtensions( + extensions, + Arrays.asList(new BarExtensionConfig(), new FooExtensionConfig()), + containerBuilder); + Assert.assertEquals("foo", extendedBuilder2.toContainerBuildPlan().getBaseImage()); + } + + @Test + public void testRunPluginExtensions_customProperties() throws JibPluginExtensionException { + FooExtension extension = + new FooExtension( + (buildPlan, properties, gradleData, logger) -> + buildPlan.toBuilder().setUser(properties.get("user")).build()); + + JibContainerBuilder extendedBuilder = + gradleProjectProperties.runPluginExtensions( + Arrays.asList(extension), + Arrays.asList(new FooExtensionConfig(ImmutableMap.of("user", "65432"))), + containerBuilder); + Assert.assertEquals("65432", extendedBuilder.toContainerBuildPlan().getUser()); + } } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index d15fab9338..75c1cd6514 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -554,7 +554,7 @@ JibContainerBuilder runPluginExtensions( JibMavenPluginExtension extension = null; ContainerBuildPlan buildPlan = jibContainerBuilder.toContainerBuildPlan(); MavenExtensionData mavenData = new MavenExtensionData(project, session); - MavenExtensionLogger logger = new MavenExtensionLogger(this::log); + MavenExtensionLogger extensionLogger = new MavenExtensionLogger(this::log); try { for (ExtensionConfiguration config : extensionConfigs) { String extensionClass = config.getExtensionClass(); @@ -569,7 +569,7 @@ JibContainerBuilder runPluginExtensions( log(LogEvent.lifecycle("Running extension: " + extensionClass)); buildPlan = extension.extendContainerBuildPlan( - buildPlan, config.getProperties(), mavenData, logger); + buildPlan, config.getProperties(), mavenData, extensionLogger); ImageReference.parse(buildPlan.getBaseImage()); // to validate image reference } return jibContainerBuilder.applyContainerBuildPlan(buildPlan); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java index 7a503a8273..8819340d6d 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenProjectPropertiesExtensionTest.java @@ -41,9 +41,7 @@ import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; @@ -112,9 +110,6 @@ private BarExtensionConfig() { } } - @Rule public final TestRepository testRepository = new TestRepository(); - @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); - @Mock private PluginDescriptor mockJibPluginDescriptor; @Mock private MavenProject mockMavenProject; @Mock private MavenSession mockMavenSession; From 31366fc22121349bc5ac6c8f6df3f006769945c8 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 23 Apr 2020 18:51:56 -0400 Subject: [PATCH 09/20] Wire Gradle extension configuration --- .../jib/gradle/ExtensionsParameters.java | 55 +++++++++++++++++++ .../jib/gradle/GradleProjectProperties.java | 3 +- .../jib/gradle/GradleRawConfiguration.java | 5 +- .../cloud/tools/jib/gradle/JibExtension.java | 18 ++++++ .../jib/maven/JibPluginConfiguration.java | 2 +- .../jib/maven/MavenProjectProperties.java | 3 +- 6 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java new file mode 100644 index 0000000000..593b2c9a10 --- /dev/null +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java @@ -0,0 +1,55 @@ +/* + * Copyright 2020 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.gradle; + +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; +import java.util.Collections; +import java.util.Map; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; + +/** Object in {@link JibExtension} that configures plugin extensions. */ +public class ExtensionsParameters implements ExtensionConfiguration { + + private String implementation = ""; + private Map properties = Collections.emptyMap(); + + @Input + public String getImplementation() { + return getExtensionClass(); + } + + @Internal + @Override + public String getExtensionClass() { + return implementation; + } + + public void setImplementation(String implementation) { + this.implementation = implementation; + } + + @Input + @Override + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } +} diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index c01c8d111e..c3971ebe2a 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -41,6 +41,7 @@ import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLoggerBuilder; import com.google.cloud.tools.jib.plugins.common.logging.ProgressDisplayGenerator; import com.google.cloud.tools.jib.plugins.common.logging.SingleThreadedExecutor; +import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Verify; @@ -426,7 +427,7 @@ JibContainerBuilder runPluginExtensions( extension = findConfiguredExtension(services, extensionClass); if (extension == null) { throw new JibPluginExtensionException( - JibGradlePluginExtension.class, + JibPluginExtension.class, "extension configured but not discovered on Jib runtime classpath: " + extensionClass); } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 35b0c6f894..69dff60b06 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -21,7 +21,6 @@ import com.google.cloud.tools.jib.plugins.common.AuthProperty; import com.google.cloud.tools.jib.plugins.common.RawConfiguration; import java.nio.file.Path; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -201,8 +200,10 @@ public Path getImageJsonOutputPath() { return jibExtension.getOutputPaths().getImageJsonPath(); } + @SuppressWarnings("unchecked") @Override public List getPluginExtensions() { - return Collections.emptyList(); + return (List) + (List) jibExtension.getExtensions().get(); } } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 149e1deb4e..c455e544ce 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -21,6 +21,7 @@ import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Nested; @@ -72,6 +73,8 @@ public class JibExtension { private static final boolean DEFAULT_ALLOW_INSECURE_REGISTIRIES = false; private static final String DEFAULT_CONTAINERIZING_MODE = "exploded"; + private final Project project; + private final BaseImageParameters from; private final TargetImageParameters to; private final ContainerParameters container; @@ -81,6 +84,7 @@ public class JibExtension { private final SkaffoldParameters skaffold; private final Property allowInsecureRegistries; private final Property containerizingMode; + private final ListProperty extensions; /** * Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}. @@ -88,6 +92,7 @@ public class JibExtension { * @param project the injected gradle project */ public JibExtension(Project project) { + this.project = project; ObjectFactory objectFactory = project.getObjects(); from = objectFactory.newInstance(BaseImageParameters.class); @@ -98,6 +103,7 @@ public JibExtension(Project project) { outputPaths = objectFactory.newInstance(OutputPathsParameters.class, project); skaffold = objectFactory.newInstance(SkaffoldParameters.class, project); + extensions = objectFactory.listProperty(ExtensionsParameters.class).empty(); allowInsecureRegistries = objectFactory.property(Boolean.class); containerizingMode = objectFactory.property(String.class); @@ -134,6 +140,12 @@ public void skaffold(Action action) { action.execute(skaffold); } + public void extensions(Action action) { + ExtensionsParameters extension = project.getObjects().newInstance(ExtensionsParameters.class); + action.execute(extension); + extensions.add(extension); + } + public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { this.allowInsecureRegistries.set(allowInsecureRegistries); } @@ -198,4 +210,10 @@ public String getContainerizingMode() { String property = System.getProperty(PropertyNames.CONTAINERIZING_MODE); return property != null ? property : containerizingMode.get(); } + + @Nested + @Optional + public ListProperty getExtensions() { + return extensions; + } } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java index 857b0e01f5..6a76cd24eb 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java @@ -222,7 +222,7 @@ public static class OutputPathsParameters { public static class ExtensionParameters implements ExtensionConfiguration { - @Parameter private String implementation = "undefined"; + @Parameter private String implementation = ""; @Parameter private Map properties = Collections.emptyMap(); diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index 75c1cd6514..e081efde28 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -42,6 +42,7 @@ import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLoggerBuilder; import com.google.cloud.tools.jib.plugins.common.logging.ProgressDisplayGenerator; import com.google.cloud.tools.jib.plugins.common.logging.SingleThreadedExecutor; +import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -561,7 +562,7 @@ JibContainerBuilder runPluginExtensions( extension = findConfiguredExtension(services, extensionClass); if (extension == null) { throw new JibPluginExtensionException( - JibMavenPluginExtension.class, + JibPluginExtension.class, "extension configured but not discovered on Jib runtime classpath: " + extensionClass); } From 6a99a255e34d25fb8afcca43bb7489a498ae88ae Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 23 Apr 2020 19:00:08 -0400 Subject: [PATCH 10/20] javadoc --- .../java/com/google/cloud/tools/jib/gradle/JibExtension.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index c455e544ce..9da46aed9d 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -140,6 +140,11 @@ public void skaffold(Action action) { action.execute(skaffold); } + /** + * Adds a new extension configuration to the extensions list. + * + * @param action closure representing an extension configuration + */ public void extensions(Action action) { ExtensionsParameters extension = project.getObjects().newInstance(ExtensionsParameters.class); action.execute(extension); From 91d9cad689cf35f80124289e873b15e9426ce7f9 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 24 Apr 2020 11:25:27 -0400 Subject: [PATCH 11/20] Rename config name to `jibExtensions` --- .../tools/jib/gradle/GradleRawConfiguration.java | 2 +- .../cloud/tools/jib/gradle/JibExtension.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 69dff60b06..d5b2473f02 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -204,6 +204,6 @@ public Path getImageJsonOutputPath() { @Override public List getPluginExtensions() { return (List) - (List) jibExtension.getExtensions().get(); + (List) jibExtension.getJibExtensions().get(); } } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 9da46aed9d..7c23ce59a0 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -64,6 +64,10 @@ * } * allowInsecureRegistries = false * containerizingMode = 'exploded' + * jibExtensions { + * implementation = 'com.example.ThirdPartyJibGradleExtension' + * properties = [customKey: 'value] + * } * } * } */ @@ -84,7 +88,7 @@ public class JibExtension { private final SkaffoldParameters skaffold; private final Property allowInsecureRegistries; private final Property containerizingMode; - private final ListProperty extensions; + private final ListProperty jibExtensions; /** * Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}. @@ -103,7 +107,7 @@ public JibExtension(Project project) { outputPaths = objectFactory.newInstance(OutputPathsParameters.class, project); skaffold = objectFactory.newInstance(SkaffoldParameters.class, project); - extensions = objectFactory.listProperty(ExtensionsParameters.class).empty(); + jibExtensions = objectFactory.listProperty(ExtensionsParameters.class).empty(); allowInsecureRegistries = objectFactory.property(Boolean.class); containerizingMode = objectFactory.property(String.class); @@ -145,10 +149,10 @@ public void skaffold(Action action) { * * @param action closure representing an extension configuration */ - public void extensions(Action action) { + public void jibExtensions(Action action) { ExtensionsParameters extension = project.getObjects().newInstance(ExtensionsParameters.class); action.execute(extension); - extensions.add(extension); + jibExtensions.add(extension); } public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { @@ -218,7 +222,7 @@ public String getContainerizingMode() { @Nested @Optional - public ListProperty getExtensions() { - return extensions; + public ListProperty getJibExtensions() { + return jibExtensions; } } From b485fed979290ae00097af4937fcddaa931bc51e Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 24 Apr 2020 11:36:48 -0400 Subject: [PATCH 12/20] Change extension class --- .../google/cloud/tools/jib/gradle/GradleProjectProperties.java | 3 +-- .../google/cloud/tools/jib/maven/MavenProjectProperties.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index c3971ebe2a..c01c8d111e 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -41,7 +41,6 @@ import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLoggerBuilder; import com.google.cloud.tools.jib.plugins.common.logging.ProgressDisplayGenerator; import com.google.cloud.tools.jib.plugins.common.logging.SingleThreadedExecutor; -import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Verify; @@ -427,7 +426,7 @@ JibContainerBuilder runPluginExtensions( extension = findConfiguredExtension(services, extensionClass); if (extension == null) { throw new JibPluginExtensionException( - JibPluginExtension.class, + JibGradlePluginExtension.class, "extension configured but not discovered on Jib runtime classpath: " + extensionClass); } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index e081efde28..75c1cd6514 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -42,7 +42,6 @@ import com.google.cloud.tools.jib.plugins.common.logging.ConsoleLoggerBuilder; import com.google.cloud.tools.jib.plugins.common.logging.ProgressDisplayGenerator; import com.google.cloud.tools.jib.plugins.common.logging.SingleThreadedExecutor; -import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -562,7 +561,7 @@ JibContainerBuilder runPluginExtensions( extension = findConfiguredExtension(services, extensionClass); if (extension == null) { throw new JibPluginExtensionException( - JibPluginExtension.class, + JibMavenPluginExtension.class, "extension configured but not discovered on Jib runtime classpath: " + extensionClass); } From b73133eae904065acb4e161e662ef27404672738 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 24 Apr 2020 11:55:32 -0400 Subject: [PATCH 13/20] Nullable --- .../google/cloud/tools/jib/gradle/GradleProjectProperties.java | 1 + .../com/google/cloud/tools/jib/maven/MavenProjectProperties.java | 1 + 2 files changed, 2 insertions(+) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index c01c8d111e..9d51894d9b 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -447,6 +447,7 @@ JibContainerBuilder runPluginExtensions( } } + @Nullable private JibGradlePluginExtension findConfiguredExtension( List extensions, String extensionClass) { Predicate matchesClassName = diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index 75c1cd6514..a514e566bf 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -582,6 +582,7 @@ JibContainerBuilder runPluginExtensions( } } + @Nullable private JibMavenPluginExtension findConfiguredExtension( List extensions, String extensionClass) { Predicate matchesClassName = From 1131bbb6567fcd8c1293cb1b0df8a51e3918f1cf Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 24 Apr 2020 11:55:50 -0400 Subject: [PATCH 14/20] Nullable --- .../com/google/cloud/tools/jib/maven/MavenProjectProperties.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index d15fab9338..b4525c3099 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -582,6 +582,7 @@ JibContainerBuilder runPluginExtensions( } } + @Nullable private JibMavenPluginExtension findConfiguredExtension( List extensions, String extensionClass) { Predicate matchesClassName = From e4fc278e5f462890a622ef3471b62de5db706a6e Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Mon, 27 Apr 2020 13:16:00 -0400 Subject: [PATCH 15/20] List --- .../cloud/tools/jib/gradle/GradleProjectProperties.java | 3 ++- .../cloud/tools/jib/gradle/GradleRawConfiguration.java | 2 +- .../cloud/tools/jib/maven/MavenProjectProperties.java | 5 +++-- .../google/cloud/tools/jib/maven/MavenRawConfiguration.java | 6 ++---- .../cloud/tools/jib/plugins/common/ProjectProperties.java | 3 ++- .../cloud/tools/jib/plugins/common/RawConfiguration.java | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index bf6fa0279c..6f469a75e5 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -398,7 +398,8 @@ public boolean isOffline() { @Override public JibContainerBuilder runPluginExtensions( - List extensionConfigs, JibContainerBuilder jibContainerBuilder) + List extensionConfigs, + JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { return runPluginExtensions( ServiceLoader.load(JibGradlePluginExtension.class).iterator(), jibContainerBuilder); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 35b0c6f894..9de3309ba0 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -202,7 +202,7 @@ public Path getImageJsonOutputPath() { } @Override - public List getPluginExtensions() { + public List getPluginExtensions() { return Collections.emptyList(); } } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java index b4525c3099..9892cfd41b 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenProjectProperties.java @@ -533,7 +533,8 @@ boolean jarRepackagedBySpringBoot() { @Override public JibContainerBuilder runPluginExtensions( - List extensionConfigs, JibContainerBuilder jibContainerBuilder) + List extensionConfigs, + JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { List services = Lists.newArrayList(ServiceLoader.load(JibMavenPluginExtension.class).iterator()); @@ -543,7 +544,7 @@ public JibContainerBuilder runPluginExtensions( @VisibleForTesting JibContainerBuilder runPluginExtensions( List services, - List extensionConfigs, + List extensionConfigs, JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException { if (extensionConfigs.isEmpty()) { diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java index e574593a74..615da85b50 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java @@ -205,10 +205,8 @@ public Path getImageJsonOutputPath() { return jibPluginConfiguration.getImageJsonOutputPath(); } - @SuppressWarnings("unchecked") @Override - public List getPluginExtensions() { - return (List) - (List) jibPluginConfiguration.getPluginExtensions(); + public List getPluginExtensions() { + return jibPluginConfiguration.getPluginExtensions(); } } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java index 16aa31cd2e..9b2b39938a 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ProjectProperties.java @@ -89,6 +89,7 @@ JibContainerBuilder createJibContainerBuilder( boolean isOffline(); JibContainerBuilder runPluginExtensions( - List extensionConfigs, JibContainerBuilder jibContainerBuilder) + List extensionConfigs, + JibContainerBuilder jibContainerBuilder) throws JibPluginExtensionException; } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java index 8263964322..e634e16b22 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java @@ -103,5 +103,5 @@ static interface ExtensionConfiguration { Path getImageJsonOutputPath(); - List getPluginExtensions(); + List getPluginExtensions(); } From d92bfe0f51cd11b3a33939f6ace31a3948ec31e4 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 30 Apr 2020 15:55:22 -0400 Subject: [PATCH 16/20] Rename extension list parameter --- ...arameters.java => ExtensionParameters.java} | 4 ++-- .../jib/gradle/GradleRawConfiguration.java | 2 +- .../cloud/tools/jib/gradle/JibExtension.java | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) rename jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/{ExtensionsParameters.java => ExtensionParameters.java} (91%) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParameters.java similarity index 91% rename from jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java rename to jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParameters.java index 593b2c9a10..2f5098edd3 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionsParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParameters.java @@ -22,8 +22,8 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; -/** Object in {@link JibExtension} that configures plugin extensions. */ -public class ExtensionsParameters implements ExtensionConfiguration { +/** Configuration of a plugin extension. */ +public class ExtensionParameters implements ExtensionConfiguration { private String implementation = ""; private Map properties = Collections.emptyMap(); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 201622f10c..c5db68e62a 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -202,6 +202,6 @@ public Path getImageJsonOutputPath() { @Override public List getPluginExtensions() { - return jibExtension.getJibExtensions().get(); + return jibExtension.getPluginExtensions().get(); } } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 7c23ce59a0..871b2f8e35 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -64,7 +64,7 @@ * } * allowInsecureRegistries = false * containerizingMode = 'exploded' - * jibExtensions { + * pluginExtensions { * implementation = 'com.example.ThirdPartyJibGradleExtension' * properties = [customKey: 'value] * } @@ -88,7 +88,7 @@ public class JibExtension { private final SkaffoldParameters skaffold; private final Property allowInsecureRegistries; private final Property containerizingMode; - private final ListProperty jibExtensions; + private final ListProperty pluginExtensions; /** * Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}. @@ -107,7 +107,7 @@ public JibExtension(Project project) { outputPaths = objectFactory.newInstance(OutputPathsParameters.class, project); skaffold = objectFactory.newInstance(SkaffoldParameters.class, project); - jibExtensions = objectFactory.listProperty(ExtensionsParameters.class).empty(); + pluginExtensions = objectFactory.listProperty(ExtensionParameters.class).empty(); allowInsecureRegistries = objectFactory.property(Boolean.class); containerizingMode = objectFactory.property(String.class); @@ -145,14 +145,14 @@ public void skaffold(Action action) { } /** - * Adds a new extension configuration to the extensions list. + * Adds a new plugin extension configuration to the extensions list. * * @param action closure representing an extension configuration */ - public void jibExtensions(Action action) { - ExtensionsParameters extension = project.getObjects().newInstance(ExtensionsParameters.class); + public void jibExtensions(Action action) { + ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); action.execute(extension); - jibExtensions.add(extension); + pluginExtensions.add(extension); } public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { @@ -222,7 +222,7 @@ public String getContainerizingMode() { @Nested @Optional - public ListProperty getJibExtensions() { - return jibExtensions; + public ListProperty getPluginExtensions() { + return pluginExtensions; } } From e52c8b20e14b373d4d95d927c2e4a2bc7c27682a Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 30 Apr 2020 15:56:35 -0400 Subject: [PATCH 17/20] missed this one --- .../java/com/google/cloud/tools/jib/gradle/JibExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 871b2f8e35..40bfb9f712 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -149,7 +149,7 @@ public void skaffold(Action action) { * * @param action closure representing an extension configuration */ - public void jibExtensions(Action action) { + public void pluginExtensions(Action action) { ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); action.execute(extension); pluginExtensions.add(extension); From 9d1d26efd14c7f6feec429e1c3198bbf904a8657 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 1 May 2020 16:54:12 -0400 Subject: [PATCH 18/20] Enable different config syntax --- .../jib/gradle/ExtensionParametersSpec.java | 42 +++++++++++++++++++ .../cloud/tools/jib/gradle/JibExtension.java | 12 ++++-- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java new file mode 100644 index 0000000000..745806849b --- /dev/null +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java @@ -0,0 +1,42 @@ +/* + * Copyright 2020 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.gradle; + +import javax.inject.Inject; +import org.gradle.api.Action; +import org.gradle.api.Project; +import org.gradle.api.provider.ListProperty; + +/** Allows to add {@link ExtensionParameters} objects to the list of plugin extensions. */ +public class ExtensionParametersSpec { + + private final Project project; + private final ListProperty pluginExtensions; + + @Inject + public ExtensionParametersSpec( + Project project, ListProperty pluginExtensions) { + this.project = project; + this.pluginExtensions = pluginExtensions; + } + + public void pluginExtension(Action action) { + ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); + action.execute(extension); + pluginExtensions.add(extension); + } +} diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 40bfb9f712..dfff0b445c 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -89,6 +89,7 @@ public class JibExtension { private final Property allowInsecureRegistries; private final Property containerizingMode; private final ListProperty pluginExtensions; + private final ExtensionParametersSpec pluginExtensionSpec; /** * Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}. @@ -108,6 +109,8 @@ public JibExtension(Project project) { skaffold = objectFactory.newInstance(SkaffoldParameters.class, project); pluginExtensions = objectFactory.listProperty(ExtensionParameters.class).empty(); + pluginExtensionSpec = + objectFactory.newInstance(ExtensionParametersSpec.class, project, pluginExtensions); allowInsecureRegistries = objectFactory.property(Boolean.class); containerizingMode = objectFactory.property(String.class); @@ -149,10 +152,11 @@ public void skaffold(Action action) { * * @param action closure representing an extension configuration */ - public void pluginExtensions(Action action) { - ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); - action.execute(extension); - pluginExtensions.add(extension); + public void pluginExtensions(Action action) { + action.execute(pluginExtensionSpec); + // ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); + // action.execute(extension); + // pluginExtensions.add(extension); } public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { From c4ad8b707307d90f68aaff099beb35c28ef9d71d Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Fri, 1 May 2020 17:00:38 -0400 Subject: [PATCH 19/20] Clean up --- .../jib/gradle/ExtensionParametersSpec.java | 7 ++++++- .../cloud/tools/jib/gradle/JibExtension.java | 17 +++-------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java index 745806849b..9971e1a6da 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtensionParametersSpec.java @@ -21,7 +21,7 @@ import org.gradle.api.Project; import org.gradle.api.provider.ListProperty; -/** Allows to add {@link ExtensionParameters} objects to the list of plugin extensions. */ +/** Allows to add {@link ExtensionParameters} objects to the list property of the same type. */ public class ExtensionParametersSpec { private final Project project; @@ -34,6 +34,11 @@ public ExtensionParametersSpec( this.pluginExtensions = pluginExtensions; } + /** + * Adds a new plugin extension configuration to the extensions list. + * + * @param action closure representing an extension configuration + */ public void pluginExtension(Action action) { ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); action.execute(extension); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index dfff0b445c..65d6301736 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -77,8 +77,6 @@ public class JibExtension { private static final boolean DEFAULT_ALLOW_INSECURE_REGISTIRIES = false; private static final String DEFAULT_CONTAINERIZING_MODE = "exploded"; - private final Project project; - private final BaseImageParameters from; private final TargetImageParameters to; private final ContainerParameters container; @@ -89,7 +87,7 @@ public class JibExtension { private final Property allowInsecureRegistries; private final Property containerizingMode; private final ListProperty pluginExtensions; - private final ExtensionParametersSpec pluginExtensionSpec; + private final ExtensionParametersSpec extensionParametersSpec; /** * Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}. @@ -97,7 +95,6 @@ public class JibExtension { * @param project the injected gradle project */ public JibExtension(Project project) { - this.project = project; ObjectFactory objectFactory = project.getObjects(); from = objectFactory.newInstance(BaseImageParameters.class); @@ -109,7 +106,7 @@ public JibExtension(Project project) { skaffold = objectFactory.newInstance(SkaffoldParameters.class, project); pluginExtensions = objectFactory.listProperty(ExtensionParameters.class).empty(); - pluginExtensionSpec = + extensionParametersSpec = objectFactory.newInstance(ExtensionParametersSpec.class, project, pluginExtensions); allowInsecureRegistries = objectFactory.property(Boolean.class); containerizingMode = objectFactory.property(String.class); @@ -147,16 +144,8 @@ public void skaffold(Action action) { action.execute(skaffold); } - /** - * Adds a new plugin extension configuration to the extensions list. - * - * @param action closure representing an extension configuration - */ public void pluginExtensions(Action action) { - action.execute(pluginExtensionSpec); - // ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class); - // action.execute(extension); - // pluginExtensions.add(extension); + action.execute(extensionParametersSpec); } public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { From 8c5a8150ae0e1ecd50d61f2b682599ad9f449c83 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Mon, 4 May 2020 10:01:01 -0400 Subject: [PATCH 20/20] Update comment --- .../com/google/cloud/tools/jib/gradle/JibExtension.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 65d6301736..6b85f6aa01 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -65,8 +65,10 @@ * allowInsecureRegistries = false * containerizingMode = 'exploded' * pluginExtensions { - * implementation = 'com.example.ThirdPartyJibGradleExtension' - * properties = [customKey: 'value] + * pluginExtension { + * implementation = 'com.example.ThirdPartyJibGradleExtension' + * properties = [customKey: 'value] + * } * } * } * }