package org.infinispan.server.test.util; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeoutException; import org.wildfly.extras.creaper.core.online.OnlineManagementClient; import org.wildfly.extras.creaper.core.online.OnlineOptions; import org.wildfly.extras.creaper.core.online.operations.Address; import org.wildfly.extras.creaper.core.online.operations.Operations; import org.wildfly.extras.creaper.core.online.operations.Values; import org.wildfly.extras.creaper.core.online.operations.admin.Administration; /** * The client connects to a running WildFly/EAP server and performs operations on DMR using * a helper project Creaper (https://github.com/wildfly-extras/creaper/). The operations include * adding and removing caches, endpoints, sockets-bindings etc. * * @author mgencur */ public class ManagementClient { public static final String NODE0_ADDRESS = System.getProperty("node0.ip", "127.0.0.1"); public static final int NODE0_PORT = Integer.valueOf(System.getProperty("node0.mgmt.port", "9990")); public static final String LOGIN = System.getProperty("login", "admin"); public static final String PASSWORD = System.getProperty("password", "admin9Pass!"); private static final int DEFAULT_JMX_PORT = 4447; private static ManagementClient client; private Operations ops; private ManagementClient(String mgmtAddress, int mgmtPort) { OnlineManagementClient onlineClient = null; try { onlineClient = org.wildfly.extras.creaper.core.ManagementClient.online(OnlineOptions.domain() .forProfile("clustered") .build() .hostAndPort(mgmtAddress, mgmtPort) .auth(LOGIN, PASSWORD) .build() ); } catch (IOException ex) { throw new IllegalStateException("Error during connecting to server CLI.", ex); } ops = new Operations(onlineClient); } public static ManagementClient getInstance(String mgmtAddress, int mgmtPort) { if (client == null) client = new ManagementClient(mgmtAddress, mgmtPort); return client; } public static ManagementClient getInstance() { if (client == null) client = new ManagementClient(NODE0_ADDRESS, NODE0_PORT); return client; } public void addDistributedCache(String name, String cacheContainer, String baseConfiguration) throws Exception { addCache(name, cacheContainer, baseConfiguration, "distributed-cache"); } public void removeDistributedCache(String name, String cacheContainer) throws Exception { removeCache(name, cacheContainer, "distributed-cache"); } public void addReplicatedCache(String name, String cacheContainer, String baseConfiguration) throws Exception { addCache(name, cacheContainer, baseConfiguration, "replicated-cache"); } public void removeReplicatedCache(String name, String cacheContainer) throws Exception { removeCache(name, cacheContainer, "replicated-cache"); } public void addLocalCache(String name, String cacheContainer, String baseConfiguration) throws Exception { addCacheConfiguration(baseConfiguration, cacheContainer, CacheTemplate.LOCAL); addCache(name, cacheContainer, baseConfiguration, "local-cache"); } public void removeLocalCache(String name, String cacheContainer) throws Exception { removeCache(name, cacheContainer, "local-cache"); } public void addCache(String name, String cacheContainer, String baseConfiguration, String cacheType) throws Exception { ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and(cacheType, name), Values.empty() .andOptional("configuration", baseConfiguration) .and("start", "EAGER") .and("mode", "SYNC")); } public void removeCache(String name, String cacheContainer, String cacheType) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and(cacheType, name)); } public void addCacheConfiguration(String name, String cacheContainer, CacheTemplate template) throws Exception { ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and("configurations", "CONFIGURATIONS") .and(template.getType(), name), Values.empty() .and("mode", "SYNC") .andOptional("start", "EAGER")); } public void addDistributedCacheConfiguration(String name, String cacheContainer) throws Exception { addCacheConfiguration(name, cacheContainer, CacheTemplate.DIST); } public void addReplicatedCacheConfiguration(String name, String cacheContainer) throws Exception { addCacheConfiguration(name, cacheContainer, CacheTemplate.REPL); } public void enableTransactionForDistConfiguration(String configurationName, String containerName, Map<String, String> txAttr) throws Exception { enableTransactionConfiguration(configurationName, containerName, txAttr, CacheTemplate.DIST); } public void enableTransactionForReplConfiguration(String configurationName, String containerName, Map<String, String> txAttr) throws Exception { enableTransactionConfiguration(configurationName, containerName, txAttr, CacheTemplate.REPL); } private void enableTransactionConfiguration(String configurationName, String containerName, Map<String, String> txAttr, CacheTemplate template) throws IOException { //Adding transaction conf to created cache configuration ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", containerName) .and("configurations", "CONFIGURATIONS") .and(template.getType(), configurationName) .and("transaction", "TRANSACTION")); //Adding attributes to transaction for (Map.Entry<String, String> attr : txAttr.entrySet()) { ops.writeAttribute(Address.subsystem("datagrid-infinispan") .and("cache-container", containerName) .and("configurations", "CONFIGURATIONS") .and(template.getType(), configurationName) .and("transaction", "TRANSACTION"), attr.getKey(), attr.getValue()); } } public void enableCompatibilityForDistConfiguration(String configurationName, String containerName) throws Exception { enableCompatibilityForConfiguration(configurationName, containerName, CacheTemplate.DIST); } public void enableCompatibilityForReplConfiguration(String configurationName, String containerName) throws Exception { enableCompatibilityForConfiguration(configurationName, containerName, CacheTemplate.REPL); } private void enableCompatibilityForConfiguration(String configurationName, String containerName, CacheTemplate template) throws Exception { //Adding compatibility conf to created cache configuration ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", containerName) .and("configurations", "CONFIGURATIONS") .and(template.getType(), configurationName) .and("compatibility", "COMPATIBILITY")); //Enabling compatibility ops.writeAttribute(Address.subsystem("datagrid-infinispan") .and("cache-container", containerName) .and("configurations", "CONFIGURATIONS") .and(template.getType(), configurationName) .and("compatibility", "COMPATIBILITY"), "enabled", true); } public void removeLocalCacheConfiguration(String name, String cacheContainer) throws Exception { removeCacheConfiguration(name, cacheContainer, CacheTemplate.LOCAL); } public void removeDistributedCacheConfiguration(String name, String cacheContainer) throws Exception { removeCacheConfiguration(name, cacheContainer, CacheTemplate.DIST); } public void removeReplicatedCacheConfiguration(String name, String cacheContainer) throws Exception { removeCacheConfiguration(name, cacheContainer, CacheTemplate.REPL); } public void removeCacheConfiguration(String name, String cacheContainer, CacheTemplate template) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and("configurations", "CONFIGURATIONS") .and(template.getType(), name)); } public void addConfigurations(String cacheContainer) throws Exception { ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and("configurations", "CONFIGURATIONS"), Values.empty()); } public void removeConfigurations(String cacheContainer) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan") .and("cache-container", cacheContainer) .and("configurations", "CONFIGURATIONS")); } public void addSocketBinding(String name, String socketBindingGroup, int port) throws Exception { ops.add(Address.of("socket-binding-group", socketBindingGroup) .and("socket-binding", name), Values.empty() .and("port", port)); } public void removeSocketBinding(String name, String socketBindingGroup) throws Exception { ops.removeIfExists(Address.of("socket-binding-group", socketBindingGroup) .and("socket-binding", name)); } public void addRemotingConnector(String socketBinding) throws Exception { ops.add(Address.subsystem("remoting") .and("connector", "remoting-connector"), Values.empty() .and("socket-binding", socketBinding) .and("security-realm", "ApplicationRealm")); ops.add(Address.subsystem("jmx") .and("remoting-connector", "jmx"), //this has to be "jmx" name Values.empty() .and("use-management-endpoint", "false")); } public void removeRemotingConnector(String socketBinding) throws Exception { ops.removeIfExists(Address.subsystem("jmx") .and("remoting-connector", "jmx")); ops.removeIfExists(Address.subsystem("remoting") .and("connector", "remoting-connector")); } public void enableJmx() throws Exception { addSocketBinding("remoting", "clustered-sockets", DEFAULT_JMX_PORT); addRemotingConnector("remoting"); } public void disableJmx() throws Exception { removeRemotingConnector("remoting"); removeSocketBinding("remoting", "clustered-sockets"); } public void addMemcachedEndpoint(String name, String cacheContainer, String cache, String socketBinding) throws Exception { ops.add(Address.subsystem("datagrid-infinispan-endpoint") .and("memcached-connector", name), Values.empty() .and("cache-container", cacheContainer) .and("cache", cache) .and("socket-binding", socketBinding)); } public void removeMemcachedEndpoint(String name) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan-endpoint") .and("memcached-connector", name)); } public void addRestEndpoint(String name, String cacheContainer, String cache, String socketBinding) throws Exception { ops.add(Address.subsystem("datagrid-infinispan-endpoint") .and("rest-connector", name), Values.empty() .and("cache-container", cacheContainer) .and("cache", cache) .and("socket-binding", socketBinding)); } public void removeRestEndpoint(String name) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan-endpoint") .and("rest-connector", name)); } public void addHotRodEndpoint(String name, String cacheContainer, String cache, String socketBinding) throws Exception { ops.add(Address.subsystem("datagrid-infinispan-endpoint") .and("hotrod-connector", name), Values.empty() .and("cache-container", cacheContainer) .and("cache", cache) .and("socket-binding", socketBinding)); } public void removeHotRodEndpoint(String name) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan-endpoint") .and("hotrod-connector", name)); } public void addCacheContainer(String name, String defaultCache) throws Exception { ops.add(Address.subsystem("datagrid-infinispan") .and("cache-container", name), Values.empty() .and("default-cache", defaultCache) .and("statistics", "true")); } public void removeCacheContainer(String name) throws Exception { ops.removeIfExists(Address.subsystem("datagrid-infinispan") .and("cache-container", name)); } public void reloadServer() throws IOException, TimeoutException, InterruptedException { Administration admin = new Administration(org.wildfly.extras.creaper.core.ManagementClient.online(OnlineOptions.domain() .forHost("master") .build() .hostAndPort(NODE0_ADDRESS, NODE0_PORT) .auth(LOGIN, PASSWORD) .build() )); admin.reload(); } private enum CacheTemplate { DIST("distributed-cache-configuration"), REPL("replicated-cache-configuration"), LOCAL("local-cache-configuration"); private String type; CacheTemplate(String type) { this.type = type; } public String getType() { return type; } } }