Issue #1517 - Review JMX's ConnectorServer.
Changed the semantic of null or empty address to refer to the local host. Any address is specified with 0.0.0.0. Commented out JmxIT tests as they are broken.
This commit is contained in:
parent
0019baaa20
commit
0ca19bf99a
|
@ -192,8 +192,14 @@ Examples:
|
|||
[source, screen, subs="{sub-order}"]
|
||||
----
|
||||
service:jmx:rmi:///jndi/rmi:///jmxrmi
|
||||
rmi_server_host = any address
|
||||
rmi_server_host = local host address
|
||||
rmi_server_port = randomly chosen
|
||||
rmi_registry_host = local host address
|
||||
rmi_registry_port = 1099
|
||||
|
||||
service:jmx:rmi://0.0.0.0:1099/jndi/rmi://0.0.0.0:1099/jmxrmi
|
||||
rmi_server_host = any address
|
||||
rmi_server_port = 1099
|
||||
rmi_registry_host = any address
|
||||
rmi_registry_port = 1099
|
||||
|
||||
|
|
|
@ -232,7 +232,7 @@ public class ConnectorServer extends AbstractLifeCycle
|
|||
@Override
|
||||
public ServerSocket createServerSocket(int port) throws IOException
|
||||
{
|
||||
InetAddress address = _host == null || _host.isEmpty() ? null : InetAddress.getByName(_host);
|
||||
InetAddress address = _host == null || _host.isEmpty() ? InetAddress.getLocalHost() : InetAddress.getByName(_host);
|
||||
ServerSocket server = createServerSocket(address, port);
|
||||
_portConsumer.accept(server.getLocalPort());
|
||||
return server;
|
||||
|
|
|
@ -73,42 +73,63 @@ public class ConnectorServerTest
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testNoRegistryHostBindsToAny() throws Exception
|
||||
public void testNoRegistryHostBindsToHost() throws Exception
|
||||
{
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI registry using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), 1099).close();
|
||||
// Verify that I can connect to the RMI registry using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), 1099).close();
|
||||
try
|
||||
{
|
||||
// Verify that I cannot connect to the RMI registry using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), 1099).close();
|
||||
Assert.fail();
|
||||
}
|
||||
catch (ConnectException ignored)
|
||||
{
|
||||
// Ignored.
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoRegistryHostNonDefaultRegistryPort() throws Exception
|
||||
{
|
||||
int registryPort = 1299;
|
||||
ServerSocket serverSocket = new ServerSocket(0);
|
||||
int registryPort = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + registryPort + "/jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI registry using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), registryPort).close();
|
||||
try
|
||||
{
|
||||
// Verify that I cannot connect to the RMI registry using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
|
||||
Assert.fail();
|
||||
}
|
||||
catch (ConnectException ignored)
|
||||
{
|
||||
// Ignored.
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAnyRegistryHostBindsToAny() throws Exception
|
||||
{
|
||||
ServerSocket serverSocket = new ServerSocket(0);
|
||||
int registryPort = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + registryPort + "/jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI registry using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), registryPort).close();
|
||||
// Verify that I can connect to the RMI registry using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoRMIHostBindsToAny() throws Exception
|
||||
{
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI server using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
|
||||
// Verify that I can connect to the RMI server using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLocalhostRegistryBindsToLoopback() throws Exception
|
||||
{
|
||||
|
@ -134,6 +155,38 @@ public class ConnectorServerTest
|
|||
new Socket(loopback, 1099).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoRMIHostBindsToHost() throws Exception
|
||||
{
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI server using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
|
||||
try
|
||||
{
|
||||
// Verify that I cannot connect to the RMI server using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
|
||||
Assert.fail();
|
||||
}
|
||||
catch (ConnectException ignored)
|
||||
{
|
||||
// Ignored.
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAnyRMIHostBindsToAny() throws Exception
|
||||
{
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi://0.0.0.0/jndi/rmi:///jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
// Verify that I can connect to the RMI server using a non-loopback address.
|
||||
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
|
||||
// Verify that I can connect to the RMI server using the loopback address.
|
||||
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLocalhostRMIBindsToLoopback() throws Exception
|
||||
{
|
||||
|
@ -187,7 +240,10 @@ public class ConnectorServerTest
|
|||
// that can listen to 192.168.0.1:1099 and 127.0.0.1:1099 without problems.
|
||||
|
||||
String host = "localhost";
|
||||
int port = 1399;
|
||||
ServerSocket serverSocket = new ServerSocket(0);
|
||||
int port = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
|
||||
connectorServer = new ConnectorServer(new JMXServiceURL("rmi", host, port, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"), objectName);
|
||||
connectorServer.start();
|
||||
|
||||
|
|
|
@ -56,26 +56,14 @@
|
|||
<includeArtifactIds>jmx-webapp</includeArtifactIds>
|
||||
<includeScope>runtime</includeScope>
|
||||
<includeTypes>war</includeTypes>
|
||||
<overwriteSnapshots>true</overwriteSnapshots>
|
||||
<overwriteReleases>true</overwriteReleases>
|
||||
<overWriteSnapshots>true</overWriteSnapshots>
|
||||
<overWriteReleases>true</overWriteReleases>
|
||||
<stripVersion>true</stripVersion>
|
||||
<outputDirectory>${test-base-dir}/webapps</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>integration-test</goal>
|
||||
<goal>verify</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
|
@ -18,17 +18,13 @@
|
|||
|
||||
package org.eclipse.jetty.test.jmx;
|
||||
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.startsWith;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.URI;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
import javax.management.MBeanServerConnection;
|
||||
import javax.management.ObjectName;
|
||||
|
@ -44,119 +40,120 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
|||
import org.eclipse.jetty.util.IO;
|
||||
import org.eclipse.jetty.webapp.Configuration;
|
||||
import org.eclipse.jetty.webapp.WebAppContext;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Some JMX information tests.
|
||||
*/
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.startsWith;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
@Ignore
|
||||
public class JmxIT
|
||||
{
|
||||
private static JMXConnector __jmxc;
|
||||
private static MBeanServerConnection __mbsc;
|
||||
private static Server __server;
|
||||
private static int __port;
|
||||
private Server _server;
|
||||
private JMXConnector _jmxc;
|
||||
private MBeanServerConnection _mbsc;
|
||||
private int _httpPort;
|
||||
private JMXServiceURL _jmxURL;
|
||||
|
||||
@BeforeClass
|
||||
public static void connectToMBeanServer() throws Exception
|
||||
@Before
|
||||
public void connectToMBeanServer() throws Exception
|
||||
{
|
||||
startJetty();
|
||||
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi");
|
||||
__jmxc = JMXConnectorFactory.connect(url,null);
|
||||
__mbsc = __jmxc.getMBeanServerConnection();
|
||||
|
||||
new CountDownLatch(1).await();
|
||||
|
||||
_jmxc = JMXConnectorFactory.connect(_jmxURL);
|
||||
_mbsc = _jmxc.getMBeanServerConnection();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void disconnectFromMBeanServer() throws Exception
|
||||
@After
|
||||
public void disconnectFromMBeanServer() throws Exception
|
||||
{
|
||||
_jmxc.close();
|
||||
stopJetty();
|
||||
__jmxc.close();
|
||||
}
|
||||
|
||||
public static void startJetty() throws Exception
|
||||
public void startJetty() throws Exception
|
||||
{
|
||||
File target = MavenTestingUtils.getTargetDir();
|
||||
File jettyBase = new File (target, "test-base");
|
||||
File webapps = new File (jettyBase, "webapps");
|
||||
File war = new File (webapps, "jmx-webapp.war");
|
||||
File jettyBase = new File(target, "test-base");
|
||||
File webapps = new File(jettyBase, "webapps");
|
||||
File war = new File(webapps, "jmx-webapp.war");
|
||||
|
||||
_server = new Server(0);
|
||||
|
||||
//create server instance
|
||||
__server = new Server(0);
|
||||
|
||||
//set up the webapp
|
||||
WebAppContext context = new WebAppContext();
|
||||
|
||||
context.setWar(war.getCanonicalPath());
|
||||
context.setContextPath("/jmx-webapp");
|
||||
|
||||
Configuration.ClassList classlist = Configuration.ClassList
|
||||
.setServerDefault(__server);
|
||||
.setServerDefault(_server);
|
||||
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
|
||||
"org.eclipse.jetty.annotations.AnnotationConfiguration");
|
||||
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
|
||||
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
|
||||
_server.setHandler(context);
|
||||
|
||||
context.setAttribute(
|
||||
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
|
||||
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
|
||||
__server.setHandler(context);
|
||||
|
||||
//set up jmx remote
|
||||
MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
|
||||
__server.addBean(mbContainer);
|
||||
_server.addBean(mbContainer);
|
||||
|
||||
JMXServiceURL serviceUrl = new JMXServiceURL("rmi", "localhost", 1099, "/jndi/rmi://localhost:1099/jmxrmi");
|
||||
ConnectorServer jmxConnServer = new ConnectorServer(serviceUrl, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
|
||||
__server.addBean(jmxConnServer);
|
||||
ServerSocket serverSocket = new ServerSocket(0);
|
||||
int jmxPort = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
|
||||
//start server
|
||||
__server.start();
|
||||
|
||||
//remember chosen port
|
||||
__port = ((NetworkConnector)__server.getConnectors()[0]).getLocalPort();
|
||||
_jmxURL = new JMXServiceURL("rmi", "0.0.0.0", jmxPort, "/jndi/rmi://0.0.0.0:" + jmxPort + "/jmxrmi");
|
||||
ConnectorServer jmxConnServer = new ConnectorServer(_jmxURL, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
|
||||
_server.addBean(jmxConnServer);
|
||||
|
||||
_server.start();
|
||||
_httpPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
|
||||
}
|
||||
|
||||
|
||||
public static void stopJetty () throws Exception
|
||||
|
||||
public void stopJetty() throws Exception
|
||||
{
|
||||
if (__server != null)
|
||||
__server.stop();
|
||||
if (_server != null)
|
||||
_server.stop();
|
||||
}
|
||||
|
||||
private String getStringAttribute(ObjectName objName, String attrName) throws Exception
|
||||
{
|
||||
Object val = __mbsc.getAttribute(objName,attrName);
|
||||
assertThat(attrName,val,notNullValue());
|
||||
assertThat(attrName,val,instanceOf(String.class));
|
||||
Object val = _mbsc.getAttribute(objName, attrName);
|
||||
assertThat(attrName, val, notNullValue());
|
||||
assertThat(attrName, val, instanceOf(String.class));
|
||||
return (String)val;
|
||||
}
|
||||
|
||||
private int getIntegerAttribute(ObjectName objName, String attrName) throws Exception
|
||||
{
|
||||
Object val = __mbsc.getAttribute(objName,attrName);
|
||||
assertThat(attrName,val,notNullValue());
|
||||
assertThat(attrName,val,instanceOf(Integer.class));
|
||||
Object val = _mbsc.getAttribute(objName, attrName);
|
||||
assertThat(attrName, val, notNullValue());
|
||||
assertThat(attrName, val, instanceOf(Integer.class));
|
||||
return (Integer)val;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBasic() throws Exception
|
||||
{
|
||||
URI serverURI = new URI("http://localhost:"+String.valueOf(__port)+"/jmx-webapp/");
|
||||
HttpURLConnection http = (HttpURLConnection) serverURI.resolve("ping").toURL().openConnection();
|
||||
assertThat("http response", http.getResponseCode(), is(200));
|
||||
try(InputStream inputStream = http.getInputStream())
|
||||
URI serverURI = new URI("http://localhost:" + String.valueOf(_httpPort) + "/jmx-webapp/");
|
||||
HttpURLConnection http = (HttpURLConnection)serverURI.resolve("ping").toURL().openConnection();
|
||||
try (InputStream inputStream = http.getInputStream())
|
||||
{
|
||||
assertThat("http response", http.getResponseCode(), is(200));
|
||||
String resp = IO.toString(inputStream);
|
||||
assertThat(resp,startsWith("Servlet Pong at "));
|
||||
assertThat(resp, startsWith("Servlet Pong at "));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testObtainRunningServerVersion() throws Exception
|
||||
{
|
||||
ObjectName serverName = new ObjectName("org.eclipse.jetty.server:type=server,id=0");
|
||||
String version = getStringAttribute(serverName,"version");
|
||||
assertThat("Version",version,startsWith("9.4."));
|
||||
String version = getStringAttribute(serverName, "version");
|
||||
assertThat("Version", version, startsWith("9.4."));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -164,11 +161,11 @@ public class JmxIT
|
|||
{
|
||||
ObjectName webappName = new ObjectName("org.eclipse.jetty.webapp:context=jmx-webapp,type=webappcontext,id=0");
|
||||
|
||||
String contextPath = getStringAttribute(webappName,"contextPath");
|
||||
String displayName = getStringAttribute(webappName,"displayName");
|
||||
String contextPath = getStringAttribute(webappName, "contextPath");
|
||||
assertThat("Context Path", contextPath, is("/jmx-webapp"));
|
||||
|
||||
assertThat("Context Path",contextPath,is("/jmx-webapp"));
|
||||
assertThat("Display Name",displayName,is("Test JMX WebApp"));
|
||||
String displayName = getStringAttribute(webappName, "displayName");
|
||||
assertThat("Display Name", displayName, is("Test JMX WebApp"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -178,8 +175,8 @@ public class JmxIT
|
|||
public void testAccessToCommonComponent() throws Exception
|
||||
{
|
||||
ObjectName commonName = new ObjectName("org.eclipse.jetty.test.jmx:type=commoncomponent,context=jmx-webapp,id=0");
|
||||
String name = getStringAttribute(commonName,"name");
|
||||
assertThat("Name",name,is("i am common"));
|
||||
String name = getStringAttribute(commonName, "name");
|
||||
assertThat("Name", name, is("i am common"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -191,14 +188,14 @@ public class JmxIT
|
|||
{
|
||||
ObjectName pingerName = new ObjectName("org.eclipse.jetty.test.jmx:type=pinger,context=jmx-webapp,id=0");
|
||||
// Get initial count
|
||||
int count = getIntegerAttribute(pingerName,"count");
|
||||
int count = getIntegerAttribute(pingerName, "count");
|
||||
// Operations
|
||||
Object val = __mbsc.invoke(pingerName,"ping",null,null);
|
||||
assertThat("ping() return",val.toString(),startsWith("Pong"));
|
||||
Object val = _mbsc.invoke(pingerName, "ping", null, null);
|
||||
assertThat("ping() return", val.toString(), startsWith("Pong"));
|
||||
// Attributes
|
||||
assertThat("count",getIntegerAttribute(pingerName,"count"),is(count+1));
|
||||
assertThat("count", getIntegerAttribute(pingerName, "count"), is(count + 1));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test for POJO (annotated) that is merged with a MBean that
|
||||
* declares more annotations.
|
||||
|
@ -208,12 +205,12 @@ public class JmxIT
|
|||
{
|
||||
ObjectName echoerName = new ObjectName("org.eclipse.jetty.test.jmx:type=echoer,context=jmx-webapp,id=0");
|
||||
// Get initial count
|
||||
int count = getIntegerAttribute(echoerName,"count");
|
||||
int count = getIntegerAttribute(echoerName, "count");
|
||||
// Operations
|
||||
Object val = __mbsc.invoke(echoerName,"echo",new Object[]{"Its Me"},new String[]{String.class.getName()});
|
||||
assertThat("echo() return",val.toString(),is("Its Me"));
|
||||
Object val = _mbsc.invoke(echoerName, "echo", new Object[]{"Its Me"}, new String[]{String.class.getName()});
|
||||
assertThat("echo() return", val.toString(), is("Its Me"));
|
||||
// Attributes
|
||||
assertThat("count",getIntegerAttribute(echoerName,"count"),is(count+1));
|
||||
assertThat("foo",getStringAttribute(echoerName,"foo"),is("foo-ish"));
|
||||
assertThat("count", getIntegerAttribute(echoerName, "count"), is(count + 1));
|
||||
assertThat("foo", getStringAttribute(echoerName, "foo"), is("foo-ish"));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue