Skip to content

Commit cfd946f

Browse files
committed
feat: Webapp-Wildfly supports S2I source builds too
3 build modes: - Docker (Kubernetes) - OpenShift-Docker (S2I Binary) - OpenShift-S2I (S2I Source) Signed-off-by: Marc Nuri <[email protected]>
1 parent 8ef0e0c commit cfd946f

File tree

11 files changed

+213
-27
lines changed

11 files changed

+213
-27
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ Usage:
2020
# ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber]
2121
./scripts/extract-changelog-for-version.sh 1.3.37 5
2222
```
23-
### 1.0.0-alpha-SNAPSHOT
23+
### 1.0.0-SNAPSHOT
2424
* Fix #182: Assembly is never null
2525
* Fix #198: Wildfly works in OpenShift with S2I binary build (Docker)
26-
* Fix : BaseGenerator retrieves runtime mode from context (not from missing properties)
26+
* Fix #199: BaseGenerator retrieves runtime mode from context (not from missing properties)
27+
* Fix : Webapp-Wildfly supports S2I source builds too (3 modes Docker, OpenShift-Docker, OpenShift-S2I)
2728

2829
### 1.0.0-alpha-3 (2020-05-06)
2930
* Fix #167: Add CMD for wildfly based applications

jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/FromSelector.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
* Helper class to encapsulate the selection of a base image
3333
*
3434
* @author roland
35-
* @since 12/08/16
3635
*/
3736
public abstract class FromSelector {
3837

@@ -117,4 +116,34 @@ protected String getIstagFrom() {
117116
return isRedHat() ? redhatIstag : upstreamIstag;
118117
}
119118
}
119+
120+
public static final class NoRedHatSupportFromSelector extends FromSelector {
121+
122+
private final String upstreamDocker;
123+
private final String upstreamS2i;
124+
private final String upstreamIstag;
125+
126+
public NoRedHatSupportFromSelector(GeneratorContext context, String prefix) {
127+
super(context);
128+
DefaultImageLookup lookup = new DefaultImageLookup(NoRedHatSupportFromSelector.class);
129+
130+
this.upstreamDocker = lookup.getImageName(prefix + ".upstream.docker");
131+
this.upstreamS2i = lookup.getImageName(prefix + ".upstream.s2i");
132+
this.upstreamIstag = lookup.getImageName(prefix + ".upstream.istag");
133+
}
134+
135+
@Override
136+
protected String getDockerBuildFrom() {
137+
return upstreamDocker;
138+
}
139+
140+
@Override
141+
protected String getS2iBuildFrom() {
142+
return upstreamS2i;
143+
}
144+
145+
protected String getIstagFrom() {
146+
return upstreamIstag;
147+
}
148+
}
120149
}

jkube-kit/generator/webapp/pom.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@
3838
<groupId>junit</groupId>
3939
<artifactId>junit</artifactId>
4040
</dependency>
41-
41+
<dependency>
42+
<groupId>org.jmockit</groupId>
43+
<artifactId>jmockit</artifactId>
44+
</dependency>
4245
</dependencies>
4346

4447
<build>

jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/AppServerHandler.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.util.Collections;
1717
import java.util.List;
18+
import java.util.Map;
1819

1920
/**
2021
* Interface encapsulating a certain application handler
@@ -71,15 +72,39 @@ public interface AppServerHandler {
7172
*/
7273
List<String> exposedPorts();
7374

75+
/**
76+
* A Map containing environment variables to add to the Image.
77+
*
78+
* @return the Map containing environment variables.
79+
*/
80+
default Map<String, String> getEnv() {
81+
return Collections.emptyMap();
82+
}
83+
84+
/**
85+
* The name for the assembly configuration (will also be the name of the directory where
86+
* artifacts are placed for Dockerfile COPY).
87+
*
88+
* @return the assembly name.
89+
*/
90+
default String getAssemblyName() {
91+
return null;
92+
}
93+
7494
/**
7595
* A list of commands to run during image build phase.
7696
*
77-
* @return the list of commands to run
97+
* @return the list of commands to run.
7898
*/
7999
default List<String> runCmds() {
80100
return Collections.emptyList();
81101
}
82102

103+
/**
104+
* If this handler support S2I source builds.
105+
*
106+
* @return true if the handler supports S2I builds, false otherwise.
107+
*/
83108
default boolean supportsS2iBuild() {
84109
return false;
85110
}

jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ private AppServerHandler createCustomAppServerHandler(String from) {
133133
protected Map<String, String> getEnv(AppServerHandler handler) {
134134
Map<String, String> defaultEnv = new HashMap<>();
135135
defaultEnv.put("DEPLOY_DIR", getDeploymentDir(handler));
136+
defaultEnv.putAll(handler.getEnv());
136137
return defaultEnv;
137138
}
138139

@@ -144,7 +145,10 @@ private AssemblyConfiguration createAssembly(AppServerHandler handler) {
144145
getProject().getProperties().setProperty("jkube.generator.webapp.path",path);
145146
final AssemblyConfiguration.AssemblyConfigurationBuilder builder = AssemblyConfiguration.builder();
146147

147-
builder.targetDir(getDeploymentDir(handler)).descriptorRef("webapp");
148+
builder
149+
.descriptorRef("webapp")
150+
.name(handler.getAssemblyName())
151+
.targetDir(getDeploymentDir(handler));
148152

149153
String user = getUser(handler);
150154
if (user != null) {

jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/handler/WildFlyAppSeverHandler.java

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
import java.io.IOException;
1717
import java.util.Collections;
1818
import java.util.List;
19+
import java.util.Map;
1920

21+
import org.eclipse.jkube.generator.api.FromSelector;
2022
import org.eclipse.jkube.generator.api.GeneratorContext;
2123
import org.eclipse.jkube.kit.common.util.JKubeProjectUtil;
24+
import org.eclipse.jkube.kit.config.image.build.OpenShiftBuildStrategy;
2225
import org.eclipse.jkube.kit.config.resource.RuntimeMode;
2326

2427
/**
@@ -28,10 +31,13 @@
2831
*/
2932
public class WildFlyAppSeverHandler extends AbstractAppServerHandler {
3033

31-
private static final String PROPERTY_IMAGE_NAME = "wildfly.upstream.docker";
34+
private static final String PROPERTY_IMAGE_NAME = "wildfly";
35+
36+
private final FromSelector fromSelector;
3237

3338
public WildFlyAppSeverHandler(GeneratorContext context) {
3439
super("wildfly", context);
40+
this.fromSelector = new FromSelector.NoRedHatSupportFromSelector(context, PROPERTY_IMAGE_NAME);
3541
}
3642

3743
@Override
@@ -63,23 +69,36 @@ private boolean isNotThorntail() {
6369

6470
@Override
6571
public String getFrom() {
66-
return imageLookup.getImageName(PROPERTY_IMAGE_NAME);
72+
return fromSelector.getFrom();
6773
}
6874

6975
@Override
7076
public List<String> exposedPorts() {
7177
return Collections.singletonList("8080");
7278
}
7379

74-
@Override
75-
public String getDeploymentDir() {
76-
return "/opt/jboss/wildfly/standalone/deployments";
77-
}
80+
@Override
81+
public String getDeploymentDir() {
82+
// Applicable for Docker image - ignored for s2i
83+
return "/opt/jboss/wildfly/standalone/deployments";
84+
}
7885

79-
@Override
80-
public String getCommand() {
81-
return "/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0";
82-
}
86+
@Override
87+
public String getCommand() {
88+
// Applicable for Docker image - ignored for s2i
89+
return "/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0";
90+
}
91+
92+
@Override
93+
public Map<String, String> getEnv() {
94+
// Applicable for s2i image - ignored for Docker
95+
return Collections.singletonMap("GALLEON_PROVISION_LAYERS", "cloud-server,web-clustering");
96+
}
97+
98+
@Override
99+
public String getAssemblyName() {
100+
return "deployments";
101+
}
83102

84103
@Override
85104
public String getUser() {
@@ -88,13 +107,18 @@ public String getUser() {
88107

89108
@Override
90109
public List<String> runCmds() {
91-
// OpenShift runs pods in a restricted security context (SCC) which randomizes the user.
92-
// Make required runtime directories writeable for all users
93-
if (generatorContext.getRuntimeMode() == RuntimeMode.openshift) {
110+
if (generatorContext.getRuntimeMode() == RuntimeMode.openshift
111+
&& generatorContext.getStrategy() == OpenShiftBuildStrategy.docker) {
112+
// OpenShift runs pods in a restricted security context (SCC) which randomizes the user.
113+
// Make required runtime directories writeable for all users
94114
return Collections.singletonList(
95-
"chmod -R a+rw /opt/jboss/wildfly/standalone/"
96-
);
115+
"chmod -R a+rw /opt/jboss/wildfly/standalone/");
97116
}
98117
return super.runCmds();
99118
}
119+
120+
@Override
121+
public boolean supportsS2iBuild() {
122+
return true;
123+
}
100124
}

jkube-kit/generator/webapp/src/main/resources-filtered/META-INF/jkube/default-images.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@
1616
# The images with their versions are set in the parent/pom.xml
1717
tomcat.upstream.docker=${image.tomcat.upstream}
1818
jetty.upstream.docker=${image.jetty.upstream}
19-
wildfly.upstream.docker=${image.wildfly.upstream}
19+
wildfly.upstream.docker=${image.wildfly.upstream.docker}
20+
wildfly.upstream.s2i=${image.wildfly.upstream.s2i}
21+
wildfly.upstream.istag=${image.wildfly.upstream.istag}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* Copyright (c) 2019 Red Hat, Inc.
3+
* This program and the accompanying materials are made
4+
* available under the terms of the Eclipse Public License 2.0
5+
* which is available at:
6+
*
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Red Hat, Inc. - initial API and implementation
13+
*/
14+
package org.eclipse.jkube.generator.webapp.handler;
15+
16+
17+
import java.util.Collections;
18+
19+
import org.eclipse.jkube.generator.api.GeneratorContext;
20+
import org.eclipse.jkube.kit.config.image.build.OpenShiftBuildStrategy;
21+
import org.eclipse.jkube.kit.config.resource.RuntimeMode;
22+
23+
import mockit.Expectations;
24+
import mockit.Mocked;
25+
import org.junit.Test;
26+
27+
import static org.junit.Assert.assertEquals;
28+
import static org.junit.Assert.assertTrue;
29+
30+
public class WildFlyAppSeverHandlerTest {
31+
32+
@Mocked
33+
private GeneratorContext generatorContext;
34+
35+
@Test
36+
public void kubernetes() {
37+
// Given
38+
// @formatter:off
39+
new Expectations() {{
40+
generatorContext.getRuntimeMode(); result = RuntimeMode.kubernetes;
41+
// generatorContext.getStrategy(); result = OpenShiftBuildStrategy.docker;
42+
}};
43+
// @formatter:on
44+
// When
45+
final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext);
46+
// Then
47+
assertCommonValues(handler);
48+
assertEquals("jboss/wildfly:19.0.0.Final", handler.getFrom());
49+
assertTrue(handler.runCmds().isEmpty());
50+
}
51+
52+
@Test
53+
public void openShiftDockerStrategy() {
54+
// Given
55+
// @formatter:off
56+
new Expectations() {{
57+
generatorContext.getRuntimeMode(); result = RuntimeMode.openshift;
58+
generatorContext.getStrategy(); result = OpenShiftBuildStrategy.docker;
59+
}};
60+
// @formatter:on
61+
// When
62+
final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext);
63+
// Then
64+
assertCommonValues(handler);
65+
assertEquals("jboss/wildfly:19.0.0.Final", handler.getFrom());
66+
assertEquals(Collections.singletonList("chmod -R a+rw /opt/jboss/wildfly/standalone/"), handler.runCmds());
67+
}
68+
69+
@Test
70+
public void openShiftSourceStrategy() {
71+
// Given
72+
// @formatter:off
73+
new Expectations() {{
74+
generatorContext.getRuntimeMode(); result = RuntimeMode.openshift;
75+
generatorContext.getStrategy(); result = OpenShiftBuildStrategy.s2i;
76+
}};
77+
// @formatter:on
78+
// When
79+
final WildFlyAppSeverHandler handler = new WildFlyAppSeverHandler(generatorContext);
80+
// Then
81+
assertCommonValues(handler);
82+
assertEquals("quay.io/wildfly/wildfly-centos7:19.0", handler.getFrom());
83+
assertTrue(handler.runCmds().isEmpty());
84+
}
85+
86+
private static void assertCommonValues(WildFlyAppSeverHandler handler) {
87+
assertTrue(handler.supportsS2iBuild());
88+
assertEquals("deployments", handler.getAssemblyName());
89+
assertEquals("/opt/jboss/wildfly/standalone/deployments", handler.getDeploymentDir());
90+
assertEquals("/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0", handler.getCommand());
91+
assertEquals("jboss:jboss:jboss", handler.getUser());
92+
assertEquals(Collections.singletonMap("GALLEON_PROVISION_LAYERS", "cloud-server,web-clustering"), handler.getEnv());
93+
assertEquals(Collections.singletonList("8080"), handler.exposedPorts());
94+
}
95+
}

jkube-kit/parent/pom.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@
9898
<!-- Servlet container images -->
9999
<version.image.tomcat.upstream>1.2.1</version.image.tomcat.upstream>
100100
<version.image.jetty.upstream>1.5.1</version.image.jetty.upstream>
101-
<version.image.wildfly.upstream>19.0.0.Final</version.image.wildfly.upstream>
101+
<version.image.wildfly.upstream.docker>19.0.0.Final</version.image.wildfly.upstream.docker>
102+
<version.image.wildfly.upstream.s2i>19.0</version.image.wildfly.upstream.s2i>
102103

103104
<!-- ============================================= -->
104105
<!-- Default images used in the default generators. Please note that the generators make some assumption about
@@ -125,7 +126,10 @@
125126
<!-- webapp -->
126127
<image.tomcat.upstream>fabric8/tomcat-9:${version.image.tomcat.upstream}</image.tomcat.upstream>
127128
<image.jetty.upstream>fabric8/jetty-9:${version.image.jetty.upstream}</image.jetty.upstream>
128-
<image.wildfly.upstream>jboss/wildfly:${version.image.wildfly.upstream}</image.wildfly.upstream>
129+
<image.wildfly.upstream.docker>jboss/wildfly:${version.image.wildfly.upstream.docker}</image.wildfly.upstream.docker>
130+
<image.wildfly.upstream.s2i>quay.io/wildfly/wildfly-centos7:${version.image.wildfly.upstream.s2i}</image.wildfly.upstream.s2i>
131+
<image.wildfly.upstream.istag>wildfly:${version.image.wildfly.upstream.s2i}</image.wildfly.upstream.istag>
132+
129133
</properties>
130134

131135
<dependencyManagement>

kubernetes-maven-plugin/doc/src/main/asciidoc/inc/generator/_webapp.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ The base images chosen are:
1616
| | Docker Build | S2I Build
1717

1818
| *Tomcat*
19-
| `jkube.tomcat-8`
19+
| `jkube.tomcat-9`
2020
| ---
2121

2222
| *Jetty*
@@ -25,7 +25,7 @@ The base images chosen are:
2525

2626
| *Wildfly*
2727
| `jboss/wildfly`
28-
| ---
28+
| https://github.com/wildfly/wildfly-s2i[`quay.io/wildfly/wildfly-centos7`]
2929
|===
3030

3131
[IMPORTANT]

0 commit comments

Comments
 (0)