| | |
| | | |
| | | import java.io.IOException; |
| | | import java.net.MalformedURLException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import javax.management.Attribute; |
| | | import javax.management.AttributeNotFoundException; |
| | | import javax.management.InstanceNotFoundException; |
| | | import javax.management.MBeanException; |
| | | import javax.management.MBeanServerConnection; |
| | | import javax.management.MalformedObjectNameException; |
| | | import javax.management.ObjectName; |
| | | import javax.management.ReflectionException; |
| | | import javax.management.remote.JMXConnector; |
| | | import javax.management.remote.JMXConnectorFactory; |
| | | import javax.management.remote.JMXServiceURL; |
| | | |
| | | import org.opends.server.TestCaseUtils; |
| | | import org.opends.server.api.ConnectionHandler; |
| | | import org.opends.server.config.ConfigEntry; |
| | | import org.opends.server.config.JMXMBean; |
| | | import org.opends.server.core.DirectoryException; |
| | | import org.opends.server.core.DirectoryServer; |
| | | import org.opends.server.types.ConfigChangeResult; |
| | | import org.opends.server.types.DN; |
| | | import org.opends.server.types.ResultCode; |
| | | import org.testng.annotations.BeforeClass; |
| | | import org.testng.annotations.DataProvider; |
| | | import org.testng.annotations.Test; |
| | | import static org.testng.Assert.*; |
| | | |
| | | /** |
| | | * A simple test for JMX connection establishment. |
| | | * |
| | | * A simple test for : |
| | | * - JMX connection establishment withou using SSL |
| | | * - JMX get and set |
| | | * - configuration change |
| | | */ |
| | | public class JmxConnectTest extends JmxTestCase |
| | | { |
| | |
| | | { |
| | | // Make sure that the server is up and running. |
| | | TestCaseUtils.startServer(); |
| | | synchronized (this) |
| | | { |
| | | this.wait(500); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Build data for the simpleConnect test. |
| | | * |
| | | * @return the data. |
| | | */ |
| | | @DataProvider(name="simpleConnect") |
| | | Object[][] createCredentials() |
| | | { |
| | |
| | | } |
| | | |
| | | /** |
| | | * That that simple (ot using SSL) connections to the JMX service are |
| | | * Check that simple (no SSL) connections to the JMX service are |
| | | * accepted when the given |
| | | * credentials are OK and refused when the credentials are invalid. |
| | | * |
| | | * @param user |
| | | * @param password |
| | | * @param expectedResult |
| | | * @throws Exception |
| | | */ |
| | | @Test(dataProvider="simpleConnect") |
| | | public void simpleConnect(String user, String password, |
| | | boolean expectedResult) throws Exception |
| | | { |
| | | JMXConnector jmxc = connect(user, password); |
| | | MBeanServerConnection jmxc = |
| | | connect(user, password, TestCaseUtils.getServerJmxPort()); |
| | | |
| | | assertEquals((jmxc!= null), expectedResult); |
| | | assertEquals((jmxc != null), expectedResult); |
| | | } |
| | | |
| | | /** |
| | | * Build some data for the simpleGet test. |
| | | */ |
| | | @DataProvider(name="simpleGet") |
| | | Object[][] createNames() |
| | | { |
| | |
| | | "objectclass", null}, |
| | | {"cn=JMX Connection Handler,cn=Connection Handlers,cn=config", |
| | | "ds-cfg-ssl-cert-nickname", "adm-server-cert"}, |
| | | // not working at the moment see issue 655 |
| | | // {"cn=JE Database,ds-cfg-backend-id=userRoot,cn=Backends,cn=config", |
| | | // "ds-cfg-database-cache-percent", 10}, |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Test simple JMX get. |
| | | * |
| | | * @throws Exception |
| | | */ |
| | | @Test(dataProvider="simpleGet") |
| | | public void simpleGet(String dn, String attributeName, Object value) |
| | | throws Exception |
| | | { |
| | | JMXConnector jmxc = connect("cn=directory manager", "password"); |
| | | MBeanServerConnection jmxc = |
| | | connect("cn=directory manager", "password", |
| | | TestCaseUtils.getServerJmxPort()); |
| | | assertNotNull(jmxc); |
| | | MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); |
| | | |
| | | // Get status of the JMX connection handler |
| | | String jmxName = JMXMBean.getJmxName(DN.decode(dn)); |
| | | ObjectName name = ObjectName.getInstance(jmxName); |
| | | Attribute status = (Attribute) mbsc.getAttribute(name, attributeName); |
| | | Object val = jmxGet(dn, attributeName, jmxc); |
| | | |
| | | if (value != null) |
| | | { |
| | | Object val = status.getValue(); |
| | | assertEquals(val, value); |
| | | } |
| | | else |
| | | { |
| | | assertTrue(status == null); |
| | | assertTrue(val == null); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Test setting some config attribute through jmx. |
| | | */ |
| | | @Test() |
| | | public void simpleSet() throws Exception |
| | | { |
| | | MBeanServerConnection jmxc = connect("cn=directory manager", "password", |
| | | TestCaseUtils.getServerJmxPort()); |
| | | assertNotNull(jmxc); |
| | | |
| | | Set<ObjectName> names = jmxc.queryNames(null, null); |
| | | names.clear(); |
| | | |
| | | final String dn = "cn=config"; |
| | | final String attribute = "ds-cfg-size-limit"; |
| | | |
| | | Long val = (Long) jmxGet(dn, attribute, jmxc); |
| | | |
| | | jmxSet(dn, attribute, val + 1, jmxc); |
| | | |
| | | Long newVal = (Long) jmxGet(dn, attribute, jmxc); |
| | | |
| | | assertEquals((long)newVal, (long)val+1); |
| | | |
| | | jmxSet(dn, attribute, val + 1, jmxc); |
| | | } |
| | | |
| | | /** |
| | | * Test that disabling JMX connection handler does its job by |
| | | * - opening a JMX connection |
| | | * - changing the JMX connection handler state to disable |
| | |
| | | @Test() |
| | | public void disable() throws Exception |
| | | { |
| | | JMXConnector jmxc = connect("cn=directory manager", "password"); |
| | | MBeanServerConnection jmxc = connect("cn=directory manager", "password", |
| | | TestCaseUtils.getServerJmxPort()); |
| | | assertNotNull(jmxc); |
| | | // This test can not pass at the moment |
| | | // because disabling JMX through JMX is not possible |
| | |
| | | // JMXConnector jmxcDisabled = connect("cn=directory manager", "password"); |
| | | // assertNull(jmxcDisabled); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Test changing JMX port through LDAP |
| | | * @throws Exception |
| | | */ |
| | | @Test() |
| | | public void changePort() throws Exception |
| | | { |
| | | // Connect to the JMX service and get the current port |
| | | final String dn = |
| | | "cn=JMX Connection Handler,cn=Connection Handlers,cn=config"; |
| | | final String attribute = "ds-cfg-listen-port"; |
| | | |
| | | MBeanServerConnection jmxc = connect("cn=directory manager", "password", |
| | | TestCaseUtils.getServerJmxPort()); |
| | | assertNotNull(jmxc); |
| | | Long initJmxPort = (Long) jmxGet(dn, attribute, jmxc); |
| | | assertNotNull(initJmxPort); |
| | | |
| | | // Get the Jmx connection handler from the core server |
| | | List<ConnectionHandler> handlers = DirectoryServer.getConnectionHandlers(); |
| | | assertNotNull(handlers); |
| | | JmxConnectionHandler jmxConnectionHandler = null; |
| | | for (ConnectionHandler handler : handlers) |
| | | { |
| | | if (handler instanceof JmxConnectionHandler) |
| | | { |
| | | jmxConnectionHandler = (JmxConnectionHandler) handler; |
| | | break; |
| | | } |
| | | } |
| | | assertNotNull(jmxConnectionHandler); |
| | | |
| | | // change the configuration of the connection handler to use |
| | | // the current port + 1 as the new port number |
| | | ConfigEntry config = new ConfigEntry(TestCaseUtils.makeEntry( |
| | | "dn: cn=JMX Connection Handler,cn=Connection Handlers,cn=config", |
| | | "objectClass: top", |
| | | "objectClass: ds-cfg-connection-handler", |
| | | "objectClass: ds-cfg-jmx-connection-handler", |
| | | "ds-cfg-ssl-cert-nickname: adm-server-cert", |
| | | "ds-cfg-connection-handler-class: org.opends.server.protocols.jmx.JmxConnectionHandler", |
| | | "ds-cfg-connection-handler-enabled: true", |
| | | "ds-cfg-use-ssl: false", |
| | | "ds-cfg-listen-port: " + (initJmxPort+1), |
| | | "cn: JMX Connection Handler" |
| | | ), null); |
| | | ArrayList<String> reasons = new ArrayList<String>(); |
| | | assertTrue( |
| | | jmxConnectionHandler.hasAcceptableConfiguration(config, reasons)); |
| | | ConfigChangeResult configResult = |
| | | jmxConnectionHandler.applyNewConfiguration(config, false); |
| | | assertEquals(configResult.getResultCode(), ResultCode.SUCCESS); |
| | | |
| | | // connect the the JMX service using the new port |
| | | jmxc = connect("cn=directory manager", "password", initJmxPort+1); |
| | | assertNotNull(jmxc); |
| | | Long val = (Long) jmxGet(dn, attribute, jmxc); |
| | | assertEquals((long) val, (long) initJmxPort+1); |
| | | |
| | | // re-establish the initial configuration of the JMX service |
| | | config = new ConfigEntry(TestCaseUtils.makeEntry( |
| | | "dn: cn=JMX Connection Handler,cn=Connection Handlers,cn=config", |
| | | "objectClass: top", |
| | | "objectClass: ds-cfg-connection-handler", |
| | | "objectClass: ds-cfg-jmx-connection-handler", |
| | | "ds-cfg-ssl-cert-nickname: adm-server-cert", |
| | | "ds-cfg-connection-handler-class: org.opends.server.protocols.jmx.JmxConnectionHandler", |
| | | "ds-cfg-connection-handler-enabled: true", |
| | | "ds-cfg-use-ssl: false", |
| | | "ds-cfg-listen-port: " + initJmxPort, |
| | | "cn: JMX Connection Handler" |
| | | ), null); |
| | | assertTrue( |
| | | jmxConnectionHandler.hasAcceptableConfiguration(config, reasons)); |
| | | configResult = |
| | | jmxConnectionHandler.applyNewConfiguration(config, false); |
| | | assertEquals(configResult.getResultCode(), ResultCode.SUCCESS); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Connect to the JMX service. |
| | | * @param user |
| | | * @param password |
| | | * @return |
| | | * @throws MalformedURLException |
| | | * @throws IOException |
| | | */ |
| | | private JMXConnector connect(String user, String password) |
| | | throws MalformedURLException, IOException |
| | | private MBeanServerConnection connect( |
| | | String user, String password, long jmxPort) |
| | | throws MalformedURLException, IOException |
| | | { |
| | | HashMap<String, String[]> env = new HashMap<String, String[]>(); |
| | | long jmxPort = TestCaseUtils.getServerJmxPort(); |
| | | |
| | | // Provide the credentials required by the server to successfully |
| | | // perform user authentication |
| | |
| | | try |
| | | { |
| | | jmxc = JMXConnectorFactory.connect(url, env); |
| | | return jmxc.getMBeanServerConnection(); |
| | | } catch (SecurityException e) |
| | | {} |
| | | return jmxc; |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * disable the JMX front-end thorugh JMX operation. |
| | | * @throws IOException |
| | | * @throws DirectoryException |
| | | * @throws NullPointerException |
| | | * @throws MalformedObjectNameException |
| | | * @throws ReflectionException |
| | | * @throws MBeanException |
| | | * @throws InstanceNotFoundException |
| | | * @throws AttributeNotFoundException |
| | | * |
| | | */ |
| | | |
| | | private void disableJmx(JMXConnector jmxc) |
| | | throws Exception |
| | | { |
| | |
| | | |
| | | status = null; |
| | | } |
| | | */ |
| | | |
| | | /** |
| | | * Get an attrbiue value through JMX. |
| | | */ |
| | | private Object jmxGet(String dn, String attributeName, |
| | | MBeanServerConnection mbsc) |
| | | throws Exception |
| | | { |
| | | String jmxName = JMXMBean.getJmxName(DN.decode(dn)); |
| | | ObjectName name = ObjectName.getInstance(jmxName); |
| | | Attribute status = (Attribute) mbsc.getAttribute(name, attributeName); |
| | | if (status == null) |
| | | return null; |
| | | else |
| | | return status.getValue(); |
| | | } |
| | | |
| | | /** |
| | | * Set an attrbiue value through JMX. |
| | | */ |
| | | private void jmxSet(String dn, String attributeName, |
| | | Object value, MBeanServerConnection mbsc) |
| | | throws Exception |
| | | { |
| | | String jmxName = JMXMBean.getJmxName(DN.decode(dn)); |
| | | ObjectName name = ObjectName.getInstance(jmxName); |
| | | Attribute attr = new Attribute(attributeName, value); |
| | | |
| | | mbsc.setAttribute(name, attr); |
| | | } |
| | | } |