You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/11/13 13:44:10 UTC
[03/10] incubator-brooklyn git commit: Tomcat entity supports HTTPS
Tomcat entity supports HTTPS
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ed00435c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ed00435c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ed00435c
Branch: refs/heads/master
Commit: ed00435c7434496bf5d1ec6e7b3f679712804bd6
Parents: 46dfc41
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Wed Nov 12 23:26:09 2014 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Wed Nov 12 23:26:09 2014 +0000
----------------------------------------------------------------------
.../webapp/JavaWebAppSoftwareProcessImpl.java | 27 +++++++++++++++++++
.../entity/webapp/WebAppServiceConstants.java | 6 ++---
.../entity/webapp/jboss/JBoss7ServerImpl.java | 26 ------------------
.../entity/webapp/tomcat/Tomcat7SshDriver.java | 26 +++++++++++++-----
.../entity/webapp/tomcat/TomcatServerImpl.java | 4 ++-
.../brooklyn/entity/webapp/tomcat/server.xml | 10 +++++--
.../AbstractWebAppFixtureIntegrationTest.java | 26 ++++++++++++++++++
.../jboss/Jboss7ServerIntegrationTest.java | 23 ++--------------
...omcatServerWebAppFixtureIntegrationTest.java | 28 +++++++++++++++++---
9 files changed, 113 insertions(+), 63 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
index 04117ea..165c206 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
@@ -176,4 +176,31 @@ public abstract class JavaWebAppSoftwareProcessImpl extends SoftwareProcessImpl
setAttribute(REQUESTS_PER_SECOND_LAST, 0D);
setAttribute(REQUESTS_PER_SECOND_IN_WINDOW, 0D);
}
+
+ public boolean isHttpEnabled() {
+ return WebAppServiceMethods.isProtocolEnabled(this, "HTTP");
+ }
+
+ public boolean isHttpsEnabled() {
+ return WebAppServiceMethods.isProtocolEnabled(this, "HTTPS");
+ }
+
+ public Integer getHttpPort() {
+ return getAttribute(HTTP_PORT);
+ }
+
+ public Integer getHttpsPort() {
+ return getAttribute(HTTPS_PORT);
+ }
+
+ public String getHttpsSslKeyAlias() {
+ HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
+ return (config == null) ? null : config.getKeyAlias();
+ }
+
+ public String getHttpsSslKeystorePassword() {
+ HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
+ return (config == null) ? null : config.getKeystorePassword();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java b/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
index dbb9ec5..68ba9ae 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
@@ -20,6 +20,8 @@ package brooklyn.entity.webapp;
import java.util.Set;
+import com.google.common.collect.ImmutableSet;
+
import brooklyn.config.render.RendererHints;
import brooklyn.entity.basic.Attributes;
import brooklyn.event.AttributeSensor;
@@ -28,8 +30,6 @@ import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
import brooklyn.event.basic.Sensors;
import brooklyn.util.flags.SetFromFlag;
-import com.google.common.collect.ImmutableList;
-
public interface WebAppServiceConstants extends WebAppServiceMetrics {
@SetFromFlag("httpPort")
@@ -41,7 +41,7 @@ public interface WebAppServiceConstants extends WebAppServiceMetrics {
@SuppressWarnings({ "unchecked", "rawtypes" })
@SetFromFlag("enabledProtocols")
public static final BasicAttributeSensorAndConfigKey<Set<String>> ENABLED_PROTOCOLS = new BasicAttributeSensorAndConfigKey(
- Set.class, "webapp.enabledProtocols", "List of enabled protocols (e.g. http, https)", ImmutableList.of("http"));
+ Set.class, "webapp.enabledProtocols", "List of enabled protocols (e.g. http, https)", ImmutableSet.of("http"));
@SetFromFlag("httpsSsl")
public static final BasicAttributeSensorAndConfigKey<HttpsSslConfig> HTTPS_SSL_CONFIG = new BasicAttributeSensorAndConfigKey<HttpsSslConfig>(
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
index 76491ce..e246db3 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
@@ -181,32 +181,6 @@ public class JBoss7ServerImpl extends JavaWebAppSoftwareProcessImpl implements J
return getConfig(DEPLOYMENT_TIMEOUT);
}
- public boolean isHttpEnabled() {
- return WebAppServiceMethods.isProtocolEnabled(this, "HTTP");
- }
-
- public boolean isHttpsEnabled() {
- return WebAppServiceMethods.isProtocolEnabled(this, "HTTPS");
- }
-
- public Integer getHttpPort() {
- return getAttribute(HTTP_PORT);
- }
-
- public Integer getHttpsPort() {
- return getAttribute(HTTPS_PORT);
- }
-
- public String getHttpsSslKeyAlias() {
- HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
- return (config == null) ? null : config.getKeyAlias();
- }
-
- public String getHttpsSslKeystorePassword() {
- HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
- return (config == null) ? null : config.getKeystorePassword();
- }
-
/** Path of the keystore file on the AS7 server */
public String getHttpsSslKeystoreFile() {
return getDriver().getSslKeystoreFile();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
index 930457c..4a08242 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
@@ -20,10 +20,15 @@ package brooklyn.entity.webapp.tomcat;
import static java.lang.String.format;
+import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import brooklyn.entity.basic.Entities;
@@ -38,6 +43,9 @@ import brooklyn.util.text.StringEscapes.BashStringEscapes;
public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driver {
+ private static final Logger LOG = LoggerFactory.getLogger(Tomcat7SshDriver.class);
+ private static final String KEYSTORE_FILE = "keystore";
+
public Tomcat7SshDriver(TomcatServerImpl entity, SshMachineLocation machine) {
super(entity, machine);
}
@@ -58,12 +66,6 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
commands.add(BashCommands.INSTALL_TAR);
commands.add(format("tar xvzf %s", saveAs));
- if (getEnabledProtocols().size()!=1) {
- log.warn("TomcatServer only supports one protocol, http; ignoring requested protocols "+getEnabledProtocols());
- } else if (!"http".equalsIgnoreCase(Iterables.getOnlyElement(getEnabledProtocols()))) {
- log.warn("TomcatServer only supports one protocol, http; ignoring requested protocol "+getEnabledProtocols());
- }
-
newScript(INSTALLING)
.environmentVariablesReset()
.body.append(commands)
@@ -80,6 +82,14 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
copyTemplate(entity.getConfig(TomcatServer.SERVER_XML_RESOURCE), Os.mergePaths(getRunDir(), "conf", "server.xml"));
copyTemplate(entity.getConfig(TomcatServer.WEB_XML_RESOURCE), Os.mergePaths(getRunDir(), "conf", "web.xml"));
+ // Deduplicate same code in JBoss
+ if (isProtocolEnabled("HTTPS")) {
+ String keystoreUrl = Preconditions.checkNotNull(getSslKeystoreUrl(), "keystore URL must be specified if using HTTPS for " + entity);
+ String destinationSslKeystoreFile = getHttpsSslKeystoreFile();
+ InputStream keystoreStream = resource.getResourceFromUrl(keystoreUrl);
+ getMachine().copyTo(keystoreStream, destinationSslKeystoreFile);
+ }
+
getEntity().deployInitialWars();
}
@@ -162,4 +172,8 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
return entity.getAttribute(TomcatServerImpl.SHUTDOWN_PORT);
}
+ public String getHttpsSslKeystoreFile() {
+ return Os.mergePathsUnix(getRunDir(), "conf", KEYSTORE_FILE);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
index 5bc9204..64a4765 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
@@ -53,7 +53,9 @@ public class TomcatServerImpl extends JavaWebAppSoftwareProcessImpl implements T
if (getDriver().isJmxEnabled()) {
String requestProcessorMbeanName = "Catalina:type=GlobalRequestProcessor,name=\"http-*\"";
- String connectorMbeanName = format("Catalina:type=Connector,port=%s", getAttribute(HTTP_PORT));
+
+ Integer port = isHttpsEnabled() ? getAttribute(HTTPS_PORT) : getAttribute(HTTP_PORT);
+ String connectorMbeanName = format("Catalina:type=Connector,port=%s", port);
jmxWebFeed = JmxFeed.builder()
.entity(this)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml b/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
index 6644e17..400598a 100644
--- a/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
+++ b/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
@@ -1,3 +1,4 @@
+[#ftl]
<?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
@@ -69,9 +70,12 @@
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
+ [#if entity.httpEnabled]
<Connector port="${driver.httpPort?c}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
+ [/#if]
+
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
@@ -79,16 +83,18 @@
connectionTimeout="20000"
redirectPort="8443" />
-->
+
<!-- Define a SSL HTTP/1.1 Connector on port 8443
This connector uses the BIO implementation that requires the JSSE
style configuration. When using the APR/native implementation, the
OpenSSL style configuration is required as described in the APR/native
documentation -->
- <!--
+ [#if entity.httpsEnabled]
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
+ keystoreFile="${driver.httpsSslKeystoreFile}" keystorePass="${entity.httpsSslKeystorePassword}"
clientAuth="false" sslProtocol="TLS" />
- -->
+ [/#if]
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
index 4569a59..478f913 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
@@ -25,9 +25,12 @@ import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.io.File;
+import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -69,8 +72,11 @@ import brooklyn.test.HttpTestUtils;
import brooklyn.test.entity.LocalManagementContextForTests;
import brooklyn.test.entity.TestApplication;
import brooklyn.util.collections.MutableMap;
+import brooklyn.util.crypto.FluentKeySigner;
+import brooklyn.util.crypto.SecureKeys;
import brooklyn.util.net.Urls;
import brooklyn.util.os.Os;
+import brooklyn.util.stream.Streams;
import brooklyn.util.time.Time;
import com.google.common.base.Stopwatch;
@@ -148,6 +154,26 @@ public abstract class AbstractWebAppFixtureIntegrationTest {
}
}
+ public static File createTemporaryKeyStore(String alias, String password) throws Exception {
+ FluentKeySigner signer = new FluentKeySigner("brooklyn-test").selfsign();
+
+ KeyStore ks = SecureKeys.newKeyStore();
+ ks.setKeyEntry(
+ alias,
+ signer.getKey().getPrivate(),
+ password.toCharArray(),
+ new Certificate[]{signer.getAuthorityCertificate()});
+
+ File file = File.createTempFile("test", "keystore");
+ FileOutputStream fos = new FileOutputStream(file);
+ try {
+ ks.store(fos, "mypass".toCharArray());
+ return file;
+ } finally {
+ Streams.closeQuietly(fos);
+ }
+ }
+
/**
* Create a new instance of TestApplication and append it to applications list
* so it can be terminated suitable after each test has run.
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
index a6cf0b8..d486b21 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
@@ -36,6 +36,7 @@ import org.testng.annotations.Test;
import brooklyn.entity.basic.ApplicationBuilder;
import brooklyn.entity.basic.Entities;
import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest;
import brooklyn.entity.webapp.HttpsSslConfig;
import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
import brooklyn.test.Asserts;
@@ -66,7 +67,7 @@ public class Jboss7ServerIntegrationTest {
localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
app = ApplicationBuilder.newManagedApp(TestApplication.class);
- keystoreFile = createTemporaryKeyStore("myname", "mypass");
+ keystoreFile = AbstractWebAppFixtureIntegrationTest.createTemporaryKeyStore("myname", "mypass");
}
@AfterMethod(alwaysRun=true)
@@ -75,26 +76,6 @@ public class Jboss7ServerIntegrationTest {
if (keystoreFile != null) keystoreFile.delete();
}
- private File createTemporaryKeyStore(String alias, String password) throws Exception {
- FluentKeySigner signer = new FluentKeySigner("brooklyn-test").selfsign();
-
- KeyStore ks = SecureKeys.newKeyStore();
- ks.setKeyEntry(
- alias,
- signer.getKey().getPrivate(),
- password.toCharArray(),
- new Certificate[] { signer.getAuthorityCertificate() });
-
- File file = File.createTempFile("test", "keystore");
- FileOutputStream fos = new FileOutputStream(file);
- try {
- ks.store(fos, "mypass".toCharArray());
- return file;
- } finally {
- Streams.closeQuietly(fos);
- }
- }
-
@Test(groups = "Integration")
public void testHttp() throws Exception {
final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
index 9942dd3..ff9ed93 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
@@ -18,6 +18,7 @@
*/
package brooklyn.entity.webapp.tomcat;
+import java.io.File;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
@@ -32,16 +33,20 @@ import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+
import brooklyn.entity.basic.SoftwareProcess;
import brooklyn.entity.proxying.EntitySpec;
import brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest;
+import brooklyn.entity.webapp.HttpsSslConfig;
import brooklyn.entity.webapp.JavaWebAppSoftwareProcess;
+import brooklyn.entity.webapp.jboss.JBoss7Server;
import brooklyn.location.basic.PortRanges;
import brooklyn.test.entity.TestApplication;
+import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.repeat.Repeater;
-import com.google.common.collect.Lists;
-
public class TomcatServerWebAppFixtureIntegrationTest extends AbstractWebAppFixtureIntegrationTest {
@SuppressWarnings("unused")
@@ -52,9 +57,24 @@ public class TomcatServerWebAppFixtureIntegrationTest extends AbstractWebAppFixt
TestApplication tomcatApp = newTestApplication();
TomcatServer tomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class)
.configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT)));
-
+
+
+ File keystoreFile;
+ try {
+ keystoreFile = createTemporaryKeyStore("myname", "mypass");
+ keystoreFile.deleteOnExit();
+ } catch (Exception e) {
+ throw Exceptions.propagate(e);
+ }
+
+ TomcatServer httpsTomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class)
+ .configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))
+ .configure(TomcatServer.ENABLED_PROTOCOLS, ImmutableSet.of("https"))
+ .configure(TomcatServer.HTTPS_SSL_CONFIG,
+ new HttpsSslConfig().keyAlias("myname").keystorePassword("mypass").keystoreUrl(keystoreFile.getAbsolutePath())));
+
return new JavaWebAppSoftwareProcess[][] {
- new JavaWebAppSoftwareProcess[] {tomcat}
+ new JavaWebAppSoftwareProcess[] { tomcat, httpsTomcat }
};
}