This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git
The following commit(s) were added to refs/heads/master by this push:
new fcd3c09 SLING-10187 - Provide a Dockerfile that delegates all env
vars to sling launcher (#18)
fcd3c09 is described below
commit fcd3c092ed4a417049a4afa3d1a191ef46293698
Author: Stefan Bischof <[email protected]>
AuthorDate: Tue Mar 16 17:41:10 2021 +0100
SLING-10187 - Provide a Dockerfile that delegates all env vars to sling
launcher (#18)
---
pom.xml | 45 +++++
src/main/docker/Dockerfile | 55 ++++++
.../sling/feature/launcher/impl/Bootstrap.java | 1 +
.../apache/sling/feature/launcher/impl/Main.java | 69 +++++++-
.../sling/feature/launcher/impl/MainTest.java | 191 ++++++++++++++++++---
5 files changed, 332 insertions(+), 29 deletions(-)
diff --git a/pom.xml b/pom.xml
index e16c2a0..43a137f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,4 +166,49 @@
<scope>test</scope>
</dependency>
</dependencies>
+
+ <profiles>
+ <profile>
+ <id>container</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.34.1</version>
+ <configuration>
+ <images>
+ <image>
+
<name>apache/sling-feature-launcher:${project.version}</name>
+ <build>
+ <tags>
+ <tag>latest</tag>
+ <tag>${project.version}</tag>
+ </tags>
+ <dockerFileDir>.</dockerFileDir>
+ <assembly>
+
<descriptorRef>artifact</descriptorRef>
+ </assembly>
+ </build>
+ </image>
+ </images>
+ </configuration>
+ <executions>
+ <execution>
+ <id>docker:build</id>
+ <phase>package</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
diff --git a/src/main/docker/Dockerfile b/src/main/docker/Dockerfile
new file mode 100644
index 0000000..0a1e947
--- /dev/null
+++ b/src/main/docker/Dockerfile
@@ -0,0 +1,55 @@
+# -----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+# -----------------------------------------------------------------------------
+
+#Base
+FROM adoptopenjdk/openjdk11:alpine-slim
+LABEL maintainer [email protected]
+
+#ENV for Sling
+ENV ARTIFACT_CLASH=
+ENV CONFIG_CLASH=
+ENV REPOSITORY_URLS=
+ENV CACHE_DIR=
+ENV FRAMEWORK_PROPERTIES=
+ENV FEATURE_FILES=
+ENV HOME_DIR=
+ENV VARIABLE_VALUES=
+ENV EXTENSION_CONFIGURATION=
+ENV FELIX_FRAMEWORK_VERSION=
+ENV OSGI_FRAMEWORK_ARTIFACT=
+ENV VERBOSE=warn
+
+#ENV for java
+ENV JAVA_OPTS=
+ENV JAVA_CP=/opt/run/launcher.jar
+
+WORKDIR /opt/run
+RUN addgroup -S launcher && adduser -S launcher -G launcher && \
+ chown -R launcher:launcher /opt/run
+
+USER launcher
+
+# copy the packaged jar file into our docker image
+COPY maven/${project.artifactId}-${project.version}.jar /opt/run/launcher.jar
+
+#maybe cleanup
+#RUN echo "rm -rf launcherecho "rm -rf launcher \n"
+
+# set the startup command to execute the jar
+CMD java $JAVA_OPTS -cp $JAVA_CP org.apache.sling.feature.launcher.impl.Main
-cenv -C $ARTIFACT_CLASH -CC $CONFIG_CLASH -c $CACHE_DIR -D
$FRAMEWORK_PROPERTIES -f $FEATURE_FILES -p $HOME_DIR -u $REPOSITORY_URLS -V
$VARIABLE_VALUES -ec $EXTENSION_CONFIGURATION -fv $FELIX_FRAMEWORK_VERSION -fa
$OSGI_FRAMEWORK_ARTIFACT -v $VERBOSE
diff --git
a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
index 2008940..77a7db3 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
@@ -198,6 +198,7 @@ public class Bootstrap {
this.config.addFeatureFiles(application.toURI().toURL().toString());
}
else {
+ Main.printHelp();
throw new IllegalStateException("No feature(s) to launch found
and none where specified");
}
return FeatureProcessor.createApplication(this.logger,
this.config, artifactManager, loadedFeatures);
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
index 3d5fcc9..e8386bf 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
@@ -17,6 +17,7 @@
package org.apache.sling.feature.launcher.impl;
import java.io.File;
+import java.io.PrintWriter;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collections;
@@ -70,8 +71,12 @@ public class Main {
public static final String OPT_ARTICACT_CLASH = "C";
+ public static final String OPT_PRINT_CONTAINER_ENV_HELP = "cenv";
+
private static Logger LOGGER;
+ private static Options options;
+
private static Logger LOG() {
if (LOGGER == null) {
@@ -131,7 +136,8 @@ public class Main {
* Parse the command line parameters and update a configuration object.
*
* @param args Command line parameters
- * @return Configuration object.
+ * @param config Configuration object
+ * @return Options object.
*/
protected static void parseArgs(final LauncherConfig config, final
String[] args) {
@@ -222,7 +228,13 @@ public class Main {
.numberOfArgs(1)
.build();
- final Options options = new Options().addOption(artifactClashOverride)
+ final Option printInsideContainerHelp =
Option.builder(OPT_PRINT_CONTAINER_ENV_HELP)
+
+ .desc("print additional help information for container env
vars.")
+ .optionalArg(true)
+ .build();
+
+ options = new Options().addOption(artifactClashOverride)
.addOption(configClashOverride)
.addOption(repoOption)
.addOption(featureOption)
@@ -233,8 +245,10 @@ public class Main {
.addOption(homeOption)
.addOption(extensionConfiguration)
.addOption(frameworkVersionOption)
- .addOption(frameworkArtifactOption);
+ .addOption(frameworkArtifactOption)
+ .addOption(printInsideContainerHelp);
+
final CommandLineParser clp = new DefaultParser();
try {
final CommandLine cl = clp.parse(options, args);
@@ -295,13 +309,56 @@ public class Main {
} catch (final ParseException pe) {
Main.LOG().error("Unable to parse command line: {}",
pe.getMessage(), pe);
- HelpFormatter formatter = new HelpFormatter();
- formatter.printHelp("launcher", options);
+ printHelp();
System.exit(1);
}
}
+ static void printHelp() {
+
+ if (options == null) {
+ return;
+ }
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp("launcher", options);
+ if (options.getOption(OPT_PRINT_CONTAINER_ENV_HELP) != null) {
+
+ try (PrintWriter writer = new PrintWriter(System.out);) {
+
+ writer.println("");
+ writer.println(
+ "If you are running sling-feature-launcher as an
container please use env vars.");
+ writer.println("");
+
+ writer.println(" cli-arg - container ENV variable");
+ writer.println("-------------------------------------");
+ writer.println(" -" + OPT_ARTICACT_CLASH + " -
ARTIFACT_CLASH");
+ writer.println(" -" + OPT_CONFIG_CLASH + " -
CONFIG_CLASH");
+ writer.println(" -" + OPT_CACHE_DIR + " - CACHE_DIR");
+ writer.println(" -" + OPT_FRAMEWORK_PROPERTIES + " -
FRAMEWORK_PROPERTIES");
+ writer.println(" -" + OPT_FEATURE_FILES + " -
FEATURE_FILES");
+ writer.println(" -" + OPT_HOME_DIR + " - HOME_DIR");
+ writer.println(" -" + OPT_REPOSITORY_URLS + " -
REPOSITORY_URLS");
+ writer.println(" -" + OPT_VARIABLE_VALUES + " -
VARIABLE_VALUES");
+ writer.println(
+ " -" + OPT_EXTENSION_CONFIGURATION + " -
EXTENSION_CONFIGURATION");
+ writer.println(
+ " -" + OPT_FELIX_FRAMEWORK_VERSION + " -
FELIX_FRAMEWORK_VERSION");
+ writer.println(
+ " -" + OPT_OSGI_FRAMEWORK_ARTIFACT + " -
OSGI_FRAMEWORK_ARTIFACT");
+ writer.println(" -" + OPT_VERBOSE + " - VERBOSE");
+
+ writer.println("");
+ writer.println("Java options could be set using the env var
'JAVA_OPTS'");
+ writer.println(
+ "Classpath could be changed using the env var
'JAVA_CP' (default:`/opt/run/launcher.jar`)");
+ writer.flush();
+ }
+ }
+
+ }
+
public static void main(final String[] args) {
// setup logging
@@ -312,8 +369,8 @@ public class Main {
// check if launcher has already been created
final LauncherConfig launcherConfig = new LauncherConfig();
- parseArgs(launcherConfig, args);
+ parseArgs(launcherConfig, args);
final Bootstrap bootstrap = new Bootstrap(launcherConfig, Main.LOG());
bootstrap.run();
}
diff --git a/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
b/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
index fad9f3f..13f3431 100644
--- a/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
+++ b/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
@@ -20,17 +20,70 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import java.security.Permission;
import java.util.AbstractMap;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
import org.apache.sling.feature.ArtifactId;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
import org.junit.Test;
public class MainTest {
+ protected static class SystemExitException extends SecurityException {
+
+ private static final long serialVersionUID = 1L;
+
+ public final int status;
+
+ public SystemExitException(int status) {
+
+ super("NoExit");
+ this.status = status;
+ }
+ }
+
+ private static class NoSystemExitSecurityManager extends SecurityManager {
+
+ @Override
+ public void checkPermission(Permission perm) {
+
+ // allow anything.
+ }
+
+ @Override
+ public void checkPermission(Permission perm, Object context) {
+
+ // allow anything.
+ }
+
+ @Override
+ public void checkExit(int status) {
+
+ super.checkExit(status);
+ throw new SystemExitException(status);
+ }
+ }
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+
+ System.setSecurityManager(new NoSystemExitSecurityManager());
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+
+ System.setSecurityManager(null);
+ }
+
@Test
public void testSplitCommandlineArgs() {
@@ -65,15 +118,24 @@ public class MainTest {
}
@Test
+ public void testParseContainer() {
+
+ Options os = mock(Options.class);
+ Option o = mock(Option.class);
+ when(os.getOption(Main.OPT_PRINT_CONTAINER_ENV_HELP)).thenReturn(o);
+
+ }
+
+ @Test
public void testParseVerbose() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-v", "debug" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_VERBOSE, "debug" });
assertEquals("debug",
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
- Main.parseArgs(noActionAllowesConfig, new String[] { "-v" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_VERBOSE });
assertEquals("debug",
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
- Main.parseArgs(noActionAllowesConfig, new String[] { "-v", "warn" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_VERBOSE, "warn" });
assertEquals("warn",
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
}
@@ -81,10 +143,10 @@ public class MainTest {
@Test
public void testParseHome() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-p" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_HOME_DIR });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-p", "foo" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_HOME_DIR, "foo"
});
assertEquals("foo", config.getHomeDirectory().toString());
}
@@ -92,10 +154,10 @@ public class MainTest {
@Test
public void testParseCacheDir() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-c" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_CACHE_DIR });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-c", "foo" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_CACHE_DIR, "foo"
});
assertEquals("foo", config.getCacheDirectory().toString());
}
@@ -103,10 +165,11 @@ public class MainTest {
@Test
public void testParseFelixFwVersion() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-fv" });
+ Main.parseArgs(noActionAllowesConfig,
+ new String[] { "-" + Main.OPT_FELIX_FRAMEWORK_VERSION });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-fv", "foo" });
+ Main.parseArgs(config, new String[] { "-" +
Main.OPT_FELIX_FRAMEWORK_VERSION, "foo" });
assertEquals("foo", config.getFrameworkVersion().toString());
}
@@ -114,30 +177,100 @@ public class MainTest {
@Test
public void testParseOSGiFwArtifact() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-fa" });
+ Main.parseArgs(noActionAllowesConfig,
+ new String[] { "-" + Main.OPT_OSGI_FRAMEWORK_ARTIFACT });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-fa", "foo" });
+ Main.parseArgs(config, new String[] { "-" +
Main.OPT_OSGI_FRAMEWORK_ARTIFACT, "foo" });
assertEquals("foo", config.getFrameworkArtifact());
}
@Test
+ public void testParse_Config_Clash() {
+
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_CONFIG_CLASH });
+
+ LauncherConfig config = new LauncherConfig();
+ // -C and -CC may have a conflict
+ // Main.parseArgs(config, new String[] { "-" + Main.OPT_CONFIG_CLASH +
"a=1",
+ // "-" + Main.OPT_CONFIG_CLASH + "b=2" });
+ //
+ // assertTrue(config.getConfigClashOverrides().containsKey("a"));
+ // assertEquals("1", config.getConfigClashOverrides().get("a"));
+ // assertTrue(config.getConfigClashOverrides().containsKey("b"));
+ // assertEquals("2", config.getConfigClashOverrides().get("b"));
+
+ config = new LauncherConfig();
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_CONFIG_CLASH,
"a", "1",
+ "-" + Main.OPT_CONFIG_CLASH, "b", "2" });
+
+ assertTrue(config.getConfigClashOverrides().containsKey("a"));
+ assertEquals("1", config.getConfigClashOverrides().get("a"));
+ assertTrue(config.getConfigClashOverrides().containsKey("b"));
+ assertEquals("2", config.getConfigClashOverrides().get("b"));
+
+ }
+
+ @Test
+ public void testParse_OptVarVal() {
+
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_VARIABLE_VALUES });
+
+ LauncherConfig config = new LauncherConfig();
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_VARIABLE_VALUES +
"a=1",
+ "-" + Main.OPT_VARIABLE_VALUES + "b=2" });
+
+ assertTrue(config.getVariables().containsKey("a"));
+ assertEquals("1", config.getVariables().get("a"));
+ assertTrue(config.getVariables().containsKey("b"));
+ assertEquals("2", config.getVariables().get("b"));
+
+ config = new LauncherConfig();
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_VARIABLE_VALUES,
"a", "1",
+ "-" + Main.OPT_VARIABLE_VALUES, "b", "2" });
+
+ assertTrue(config.getVariables().containsKey("a"));
+ assertEquals("1", config.getVariables().get("a"));
+ assertTrue(config.getVariables().containsKey("b"));
+ assertEquals("2", config.getVariables().get("b"));
+
+ }
+
+ @Test
+ public void testParse_FW_Prop() {
+
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_FRAMEWORK_PROPERTIES });
+
+ LauncherConfig config = new LauncherConfig();
+ Main.parseArgs(config, new String[] { "-" +
Main.OPT_FRAMEWORK_PROPERTIES + "a=1",
+ "-" + Main.OPT_FRAMEWORK_PROPERTIES + "b=2" });
+
+
assertTrue(config.getInstallation().getFrameworkProperties().containsKey("a"));
+ assertEquals("1",
config.getInstallation().getFrameworkProperties().get("a"));
+
+
assertTrue(config.getInstallation().getFrameworkProperties().containsKey("b"));
+ assertEquals("2",
config.getInstallation().getFrameworkProperties().get("b"));
+ }
+
+ @Test
public void testParse_Artifact_Clash() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-C" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_ARTICACT_CLASH });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-C", "foo:bar:1" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_ARTICACT_CLASH,
"foo:bar:1" });
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-C", "foo:bar:1", "foo:bar:2"
});
+ Main.parseArgs(config,
+ new String[] { "-" + Main.OPT_ARTICACT_CLASH, "foo:bar:1",
"foo:bar:2" });
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:2")));
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-C", "foo:bar:1", "-C",
"foo:bar:2" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_ARTICACT_CLASH,
"foo:bar:1",
+ "-" + Main.OPT_ARTICACT_CLASH, "foo:bar:2" });
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:2")));
@@ -146,18 +279,19 @@ public class MainTest {
@Test
public void testParse_RepoUrls() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-u" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_REPOSITORY_URLS });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-u", "foo" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS,
"foo" });
assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo" });
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-u", "foo", "bar" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS,
"foo", "bar" });
assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo",
"bar" });
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-u", "foo", "-u", "bar" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS,
"foo",
+ "-" + Main.OPT_REPOSITORY_URLS, "bar" });
assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo",
"bar" });
}
@@ -165,22 +299,33 @@ public class MainTest {
@Test
public void testParse_FeatureFiles() {
- Main.parseArgs(noActionAllowesConfig, new String[] { "-f" });
+ Main.parseArgs(noActionAllowesConfig, new String[] { "-" +
Main.OPT_FEATURE_FILES });
LauncherConfig config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-f", "foo" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES,
"foo" });
assertTrue(config.getFeatureFiles().contains("foo"));
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-f", "foo", "bar" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES,
"foo", "bar" });
assertTrue(config.getFeatureFiles().contains("foo"));
assertTrue(config.getFeatureFiles().contains("bar"));
config = new LauncherConfig();
- Main.parseArgs(config, new String[] { "-f", "foo", "-f", "bar" });
+ Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES,
"foo",
+ "-" + Main.OPT_FEATURE_FILES, "bar" });
assertTrue(config.getFeatureFiles().contains("foo"));
assertTrue(config.getFeatureFiles().contains("bar"));
}
+ @Test
+ public void testMain_main() {
+
+ try {
+ Main.main(new String[] {});
+ } catch (SystemExitException e) {
+ assertEquals("Exit status", 1, e.status);
+ }
+
+ }
}