diff --git a/CHANGELOG.md b/CHANGELOG.md index fd73467954..ce76ed2bc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,10 +20,11 @@ Usage: # ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber] ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` -### 1.0.0-alpha-SNAPSHOT +### 1.0.0-SNAPSHOT * Fix #182: Assembly is never null * Fix #198: Wildfly works in OpenShift with S2I binary build (Docker) -* Fix : BaseGenerator retrieves runtime mode from context (not from missing properties) +* Fix #199: BaseGenerator retrieves runtime mode from context (not from missing properties) +* Fix #201: Webapp-Wildfly supports S2I source builds too (3 modes Docker, OpenShift-Docker, OpenShift-S2I) ### 1.0.0-alpha-3 (2020-05-06) * Fix #167: Add CMD for wildfly based applications diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/FromSelector.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/FromSelector.java index 1343caaec1..427069606a 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/FromSelector.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/FromSelector.java @@ -32,7 +32,6 @@ * Helper class to encapsulate the selection of a base image * * @author roland - * @since 12/08/16 */ public abstract class FromSelector { @@ -117,4 +116,34 @@ protected String getIstagFrom() { return isRedHat() ? redhatIstag : upstreamIstag; } } + + public static final class NoRedHatSupportFromSelector extends FromSelector { + + private final String upstreamDocker; + private final String upstreamS2i; + private final String upstreamIstag; + + public NoRedHatSupportFromSelector(GeneratorContext context, String prefix) { + super(context); + DefaultImageLookup lookup = new DefaultImageLookup(NoRedHatSupportFromSelector.class); + + this.upstreamDocker = lookup.getImageName(prefix + ".upstream.docker"); + this.upstreamS2i = lookup.getImageName(prefix + ".upstream.s2i"); + this.upstreamIstag = lookup.getImageName(prefix + ".upstream.istag"); + } + + @Override + protected String getDockerBuildFrom() { + return upstreamDocker; + } + + @Override + protected String getS2iBuildFrom() { + return upstreamS2i; + } + + protected String getIstagFrom() { + return upstreamIstag; + } + } } diff --git a/jkube-kit/generator/webapp/pom.xml b/jkube-kit/generator/webapp/pom.xml index 87dec7cdfa..20c781d0e5 100644 --- a/jkube-kit/generator/webapp/pom.xml +++ b/jkube-kit/generator/webapp/pom.xml @@ -38,7 +38,10 @@ junit junit - + + org.jmockit + jmockit + diff --git a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/AppServerHandler.java b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/AppServerHandler.java index 6134e28d3b..635133f9ba 100644 --- a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/AppServerHandler.java +++ b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/AppServerHandler.java @@ -15,6 +15,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; /** * Interface encapsulating a certain application handler @@ -71,15 +72,39 @@ public interface AppServerHandler { */ List exposedPorts(); + /** + * A Map containing environment variables to add to the Image. + * + * @return the Map containing environment variables. + */ + default Map getEnv() { + return Collections.emptyMap(); + } + + /** + * The name for the assembly configuration (will also be the name of the directory where + * artifacts are placed for Dockerfile COPY). + * + * @return the assembly name. + */ + default String getAssemblyName() { + return null; + } + /** * A list of commands to run during image build phase. * - * @return the list of commands to run + * @return the list of commands to run. */ default List runCmds() { return Collections.emptyList(); } + /** + * If this handler support S2I source builds. + * + * @return true if the handler supports S2I builds, false otherwise. + */ default boolean supportsS2iBuild() { return false; } diff --git a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java index 0e8753ae98..1f74c0e724 100644 --- a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java +++ b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java @@ -133,6 +133,7 @@ private AppServerHandler createCustomAppServerHandler(String from) { protected Map getEnv(AppServerHandler handler) { Map defaultEnv = new HashMap<>(); defaultEnv.put("DEPLOY_DIR", getDeploymentDir(handler)); + defaultEnv.putAll(handler.getEnv()); return defaultEnv; } @@ -144,7 +145,10 @@ private AssemblyConfiguration createAssembly(AppServerHandler handler) { getProject().getProperties().setProperty("jkube.generator.webapp.path",path); final AssemblyConfiguration.AssemblyConfigurationBuilder builder = AssemblyConfiguration.builder(); - builder.targetDir(getDeploymentDir(handler)).descriptorRef("webapp"); + builder + .descriptorRef("webapp") + .name(handler.getAssemblyName()) + .targetDir(getDeploymentDir(handler)); String user = getUser(handler); if (user != null) { diff --git a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandler.java b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandler.java index 4a7b83e550..3093c57825 100644 --- a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandler.java +++ b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandler.java @@ -16,9 +16,12 @@ import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Map; +import org.eclipse.jkube.generator.api.FromSelector; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; +import org.eclipse.jkube.kit.config.image.build.OpenShiftBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; /** @@ -28,10 +31,14 @@ */ public class WildFlyAppSeverHandler extends AbstractAppServerHandler { - private static final String PROPERTY_IMAGE_NAME = "wildfly.upstream.docker"; + private static final String HANDLER_NAME = "wildfly"; + private static final String PROPERTY_IMAGE_NAME = HANDLER_NAME; + + private final FromSelector fromSelector; public WildFlyAppSeverHandler(GeneratorContext context) { - super("wildfly", context); + super(HANDLER_NAME, context); + this.fromSelector = new FromSelector.NoRedHatSupportFromSelector(context, PROPERTY_IMAGE_NAME); } @Override @@ -63,7 +70,7 @@ private boolean isNotThorntail() { @Override public String getFrom() { - return imageLookup.getImageName(PROPERTY_IMAGE_NAME); + return fromSelector.getFrom(); } @Override @@ -71,15 +78,28 @@ public List exposedPorts() { return Collections.singletonList("8080"); } - @Override - public String getDeploymentDir() { - return "/opt/jboss/wildfly/standalone/deployments"; - } + @Override + public String getDeploymentDir() { + // Applicable for Docker image - ignored for s2i + return "/opt/jboss/wildfly/standalone/deployments"; + } - @Override - public String getCommand() { - return "/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0"; - } + @Override + public String getCommand() { + // Applicable for Docker image - ignored for s2i + return "/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0"; + } + + @Override + public Map getEnv() { + // Applicable for s2i image - ignored for Docker + return Collections.singletonMap("GALLEON_PROVISION_LAYERS", "cloud-server,web-clustering"); + } + + @Override + public String getAssemblyName() { + return "deployments"; + } @Override public String getUser() { @@ -88,13 +108,18 @@ public String getUser() { @Override public List runCmds() { - // OpenShift runs pods in a restricted security context (SCC) which randomizes the user. - // Make required runtime directories writeable for all users - if (generatorContext.getRuntimeMode() == RuntimeMode.openshift) { + if (generatorContext.getRuntimeMode() == RuntimeMode.openshift + && generatorContext.getStrategy() == OpenShiftBuildStrategy.docker) { + // OpenShift runs pods in a restricted security context (SCC) which randomizes the user. + // Make required runtime directories writeable for all users return Collections.singletonList( - "chmod -R a+rw /opt/jboss/wildfly/standalone/" - ); + "chmod -R a+rw /opt/jboss/wildfly/standalone/"); } return super.runCmds(); } + + @Override + public boolean supportsS2iBuild() { + return true; + } } diff --git a/jkube-kit/generator/webapp/src/main/resources-filtered/META-INF/jkube/default-images.properties b/jkube-kit/generator/webapp/src/main/resources-filtered/META-INF/jkube/default-images.properties index dbd7bf3511..697971dbe0 100644 --- a/jkube-kit/generator/webapp/src/main/resources-filtered/META-INF/jkube/default-images.properties +++ b/jkube-kit/generator/webapp/src/main/resources-filtered/META-INF/jkube/default-images.properties @@ -16,4 +16,6 @@ # The images with their versions are set in the parent/pom.xml tomcat.upstream.docker=${image.tomcat.upstream} jetty.upstream.docker=${image.jetty.upstream} -wildfly.upstream.docker=${image.wildfly.upstream} +wildfly.upstream.docker=${image.wildfly.upstream.docker} +wildfly.upstream.s2i=${image.wildfly.upstream.s2i} +wildfly.upstream.istag=${image.wildfly.upstream.istag} diff --git a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandlerTest.java b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandlerTest.java new file mode 100644 index 0000000000..3280d8d0d6 --- /dev/null +++ b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandlerTest.java @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.generator.webapp.handler; + + +import java.util.Collections; + +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.config.image.build.OpenShiftBuildStrategy; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; + +import mockit.Expectations; +import mockit.Mocked; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class WildFlyAppSeverHandlerTest { + + @Mocked + private GeneratorContext generatorContext; + + @Test + public void kubernetes() { + // Given + // @formatter:off + new Expectations() {{ + generatorContext.getRuntimeMode(); result = RuntimeMode.kubernetes; +// generatorContext.getStrategy(); result = OpenShiftBuildStrategy.docker; + }}; + // @formatter:on + // When + final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext); + // Then + assertCommonValues(handler); + assertEquals("jboss/wildfly:19.0.0.Final", handler.getFrom()); + assertTrue(handler.runCmds().isEmpty()); + } + + @Test + public void openShiftDockerStrategy() { + // Given + // @formatter:off + new Expectations() {{ + generatorContext.getRuntimeMode(); result = RuntimeMode.openshift; + generatorContext.getStrategy(); result = OpenShiftBuildStrategy.docker; + }}; + // @formatter:on + // When + final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext); + // Then + assertCommonValues(handler); + assertEquals("jboss/wildfly:19.0.0.Final", handler.getFrom()); + assertEquals(Collections.singletonList("chmod -R a+rw /opt/jboss/wildfly/standalone/"), handler.runCmds()); + } + + @Test + public void openShiftSourceStrategy() { + // Given + // @formatter:off + new Expectations() {{ + generatorContext.getRuntimeMode(); result = RuntimeMode.openshift; + generatorContext.getStrategy(); result = OpenShiftBuildStrategy.s2i; + }}; + // @formatter:on + // When + final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext); + // Then + assertCommonValues(handler); + assertEquals("quay.io/wildfly/wildfly-centos7:19.0", handler.getFrom()); + assertTrue(handler.runCmds().isEmpty()); + } + + private static void assertCommonValues(WildFlyAppSeverHandler handler) { + assertTrue(handler.supportsS2iBuild()); + assertEquals("deployments", handler.getAssemblyName()); + assertEquals("/opt/jboss/wildfly/standalone/deployments", handler.getDeploymentDir()); + assertEquals("/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0", handler.getCommand()); + assertEquals("jboss:jboss:jboss", handler.getUser()); + assertEquals(Collections.singletonMap("GALLEON_PROVISION_LAYERS", "cloud-server,web-clustering"), handler.getEnv()); + assertEquals(Collections.singletonList("8080"), handler.exposedPorts()); + } +} \ No newline at end of file diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index c6bde12c85..acc5d8a7a7 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -98,7 +98,8 @@ 1.2.1 1.5.1 - 19.0.0.Final + 19.0.0.Final + 19.0 fabric8/tomcat-9:${version.image.tomcat.upstream} fabric8/jetty-9:${version.image.jetty.upstream} - jboss/wildfly:${version.image.wildfly.upstream} + jboss/wildfly:${version.image.wildfly.upstream.docker} + quay.io/wildfly/wildfly-centos7:${version.image.wildfly.upstream.s2i} + wildfly:${version.image.wildfly.upstream.s2i} + diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/generator/_webapp.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/generator/_webapp.adoc index affee99a6a..fc0a3cc321 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/generator/_webapp.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/generator/_webapp.adoc @@ -16,7 +16,7 @@ The base images chosen are: | | Docker Build | S2I Build | *Tomcat* -| `jkube.tomcat-8` +| `jkube.tomcat-9` | --- | *Jetty* @@ -25,7 +25,7 @@ The base images chosen are: | *Wildfly* | `jboss/wildfly` -| --- +| https://github.com/wildfly/wildfly-s2i[`quay.io/wildfly/wildfly-centos7`] |=== [IMPORTANT] diff --git a/quickstarts/maven/webapp-wildfly/pom.xml b/quickstarts/maven/webapp-wildfly/pom.xml index 7c2dd8e844..fec872c449 100644 --- a/quickstarts/maven/webapp-wildfly/pom.xml +++ b/quickstarts/maven/webapp-wildfly/pom.xml @@ -24,7 +24,6 @@ war - docker ${project.version} 1.8 1.8