com.gemstone.gemfire.management.internal.configuration.SharedConfigurationEndToEndDUnitTest.java Source code

Java tutorial

Introduction

Here is the source code for com.gemstone.gemfire.management.internal.configuration.SharedConfigurationEndToEndDUnitTest.java

Source

/*
 * 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.
 */
package com.gemstone.gemfire.management.internal.configuration;

import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.RegionShortcut;
import com.gemstone.gemfire.cache.wan.GatewaySender.OrderPolicy;
import com.gemstone.gemfire.distributed.Locator;
import com.gemstone.gemfire.distributed.internal.DistributionConfig;
import com.gemstone.gemfire.distributed.internal.InternalLocator;
import com.gemstone.gemfire.internal.AvailablePortHelper;
import com.gemstone.gemfire.internal.ClassBuilder;
import com.gemstone.gemfire.internal.FileUtil;
import com.gemstone.gemfire.internal.JarDeployer;
import com.gemstone.gemfire.internal.admin.remote.ShutdownAllRequest;
import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
import com.gemstone.gemfire.internal.lang.StringUtils;
import com.gemstone.gemfire.management.cli.Result.Status;
import com.gemstone.gemfire.management.internal.cli.CliUtil;
import com.gemstone.gemfire.management.internal.cli.HeadlessGfsh;
import com.gemstone.gemfire.management.internal.cli.commands.CliCommandTestBase;
import com.gemstone.gemfire.management.internal.cli.i18n.CliStrings;
import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
import com.gemstone.gemfire.management.internal.cli.util.CommandStringBuilder;
import dunit.DistributedTestCase;
import dunit.Host;
import dunit.SerializableCallable;
import dunit.VM;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ExecutionException;

public class SharedConfigurationEndToEndDUnitTest extends CliCommandTestBase {
    private static final int TIMEOUT = 10000;
    private static final int INTERVAL = 500;
    private static final String REGION1 = "R1";
    private static final String REGION2 = "R2";
    private static final String INDEX1 = "ID1";
    private transient ClassBuilder classBuilder = new ClassBuilder();
    public static Set<String> serverNames = new HashSet<String>();
    public static Set<String> jarFileNames = new HashSet<String>();

    public SharedConfigurationEndToEndDUnitTest(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    private static final long serialVersionUID = -2276690105585944041L;

    public Set<String> startServers(HeadlessGfsh gfsh, String locatorString, int numServers,
            String serverNamePrefix, int startNum) throws ClassNotFoundException, IOException {
        Set<String> serverNames = new HashSet<String>();

        final int[] serverPorts = AvailablePortHelper.getRandomAvailableTCPPorts(numServers);
        for (int i = 0; i < numServers; i++) {
            int port = serverPorts[i];
            String serverName = serverNamePrefix + Integer.toString(i + startNum) + "-" + port;
            CommandStringBuilder csb = new CommandStringBuilder(CliStrings.START_SERVER);
            csb.addOption(CliStrings.START_SERVER__NAME, serverName);
            csb.addOption(CliStrings.START_SERVER__LOCATORS, locatorString);
            csb.addOption(CliStrings.START_SERVER__SERVER_PORT, Integer.toString(port));
            CommandResult cmdResult = executeCommand(gfsh, csb.getCommandString());
            assertEquals(Status.OK, cmdResult.getStatus());
        }
        return serverNames;
    }

    public void testStartServerAndExecuteCommands()
            throws InterruptedException, ClassNotFoundException, IOException, ExecutionException {
        addExpectedException("EntryDestroyedException");
        Object[] result = setup();
        final int locatorPort = (Integer) result[0];
        final String jmxHost = (String) result[1];
        final int jmxPort = (Integer) result[2];
        final int httpPort = (Integer) result[3];
        final String locatorString = "localHost[" + locatorPort + "]";

        final HeadlessGfsh gfsh = new HeadlessGfsh("gfsh2", 300);
        assertNotNull(gfsh);
        shellConnect(jmxHost, jmxPort, httpPort, gfsh);

        serverNames.addAll(startServers(gfsh, locatorString, 2, "Server", 1));
        doCreateCommands();
        serverNames.addAll(startServers(gfsh, locatorString, 1, "NewMember", 4));
        verifyRegionCreateOnAllMembers(REGION1);
        verifyRegionCreateOnAllMembers(REGION2);
        verifyIndexCreationOnAllMembers(INDEX1);
        verifyAsyncEventQueueCreation();

        //shutdown everything
        getLogWriter().info("Shutting down all the members");
        shutdownAll();
        deleteSavedJarFiles();
    }

    private void doCreateCommands() {
        createRegion(REGION1, RegionShortcut.REPLICATE, null);
        createRegion(REGION2, RegionShortcut.PARTITION, null);
        createIndex(INDEX1, "AAPL", REGION1, null);
        createAndDeployJar("Deploy1.jar");
        createAsyncEventQueue("q1");
        final String autoCompact = "true";
        final String allowForceCompaction = "true";
        final String compactionThreshold = "50";
        final String duCritical = "90";
        final String duWarning = "85";
        final String maxOplogSize = "1000";
        final String queueSize = "300";
        final String timeInterval = "10";
        final String writeBufferSize = "100";
        final String diskStoreName = "ds1";
        final String diskDirs = "ds1";

        createDiskStore(diskStoreName, diskDirs, autoCompact, allowForceCompaction, compactionThreshold, duCritical,
                duWarning, maxOplogSize, queueSize, timeInterval, writeBufferSize);
    }

    protected void executeAndVerifyCommand(String commandString) {
        CommandResult cmdResult = executeCommand(commandString);
        getLogWriter().info("Command Result : \n" + commandResultToString(cmdResult));
        assertEquals(Status.OK, cmdResult.getStatus());
        assertFalse(cmdResult.failedToPersist());
    }

    private void createRegion(String regionName, RegionShortcut regionShortCut, String group) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_REGION);
        csb.addOption(CliStrings.CREATE_REGION__REGION, regionName);
        csb.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, regionShortCut.name());
        executeAndVerifyCommand(csb.getCommandString());
    }

    private void destroyRegion(String regionName) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_REGION);
        csb.addOption(CliStrings.DESTROY_REGION__REGION, regionName);
        executeAndVerifyCommand(csb.getCommandString());
    }

    private void stopServer(String serverName) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.STOP_SERVER);
        csb.addOption(CliStrings.STOP_SERVER__MEMBER, serverName);
        executeAndVerifyCommand(csb.getCommandString());
    }

    public void createAsyncEventQueue(String queueName) {
        String queueCommandsJarName = "testEndToEndSC-QueueCommands.jar";
        final File jarFile = new File(queueCommandsJarName);

        try {
            ClassBuilder classBuilder = new ClassBuilder();
            byte[] jarBytes = classBuilder.createJarFromClassContent("com/qcdunit/QueueCommandsDUnitTestListener",
                    "package com.qcdunit;" + "import java.util.List; import java.util.Properties;"
                            + "import com.gemstone.gemfire.internal.cache.xmlcache.Declarable2; import com.gemstone.gemfire.cache.asyncqueue.AsyncEvent;"
                            + "import com.gemstone.gemfire.cache.asyncqueue.AsyncEventListener;"
                            + "public class QueueCommandsDUnitTestListener implements Declarable2, AsyncEventListener {"
                            + "Properties props;"
                            + "public boolean processEvents(List<AsyncEvent> events) { return true; }"
                            + "public void close() {}"
                            + "public void init(final Properties props) {this.props = props;}"
                            + "public Properties getConfig() {return this.props;}}");

            FileUtils.writeByteArrayToFile(jarFile, jarBytes);
            CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEPLOY);
            csb.addOption(CliStrings.DEPLOY__JAR, queueCommandsJarName);
            executeAndVerifyCommand(csb.getCommandString());

            csb = new CommandStringBuilder(CliStrings.CREATE_ASYNC_EVENT_QUEUE);
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__ID, queueName);
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__LISTENER,
                    "com.qcdunit.QueueCommandsDUnitTestListener");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__BATCH_SIZE, "100");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__BATCHTIMEINTERVAL, "200");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__DISPATCHERTHREADS, "4");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__ENABLEBATCHCONFLATION, "true");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__DISKSYNCHRONOUS, "true");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__MAXIMUM_QUEUE_MEMORY, "1000");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__ORDERPOLICY, OrderPolicy.KEY.toString());
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__PERSISTENT, "true");
            csb.addOption(CliStrings.CREATE_ASYNC_EVENT_QUEUE__PARALLEL, "true");

            executeAndVerifyCommand(csb.getCommandString());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            FileUtils.deleteQuietly(jarFile);
        }
    }

    private void createDiskStore(String diskStoreName, String diskDirs, String autoCompact,
            String allowForceCompaction, String compactionThreshold, String duCritical, String duWarning,
            String maxOplogSize, String queueSize, String timeInterval, String writeBufferSize) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_DISK_STORE);
        csb.addOption(CliStrings.CREATE_DISK_STORE__NAME, diskStoreName);
        csb.addOption(CliStrings.CREATE_DISK_STORE__DIRECTORY_AND_SIZE, diskDirs);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__AUTO_COMPACT, autoCompact);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__ALLOW_FORCE_COMPACTION, allowForceCompaction);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__COMPACTION_THRESHOLD, compactionThreshold);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__DISK_USAGE_CRITICAL_PCT, duCritical);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__DISK_USAGE_WARNING_PCT, duWarning);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__MAX_OPLOG_SIZE, maxOplogSize);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__QUEUE_SIZE, queueSize);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__TIME_INTERVAL, timeInterval);
        csb.addOptionWithValueCheck(CliStrings.CREATE_DISK_STORE__WRITE_BUFFER_SIZE, writeBufferSize);
        executeAndVerifyCommand(csb.getCommandString());
    }

    private void destroyDiskStore(String diskStoreName, String group) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_DISK_STORE);
        csb.addOption(CliStrings.DESTROY_DISK_STORE__NAME, diskStoreName);
        csb.addOptionWithValueCheck(CliStrings.DESTROY_DISK_STORE__GROUP, group);
        executeAndVerifyCommand(csb.toString());
    }

    public void createIndex(String indexName, String expression, String regionName, String group) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
        csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
        csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, expression);
        csb.addOption(CliStrings.CREATE_INDEX__REGION, regionName);
        executeAndVerifyCommand(csb.getCommandString());
    }

    public void destoyIndex(String indexName, String regionName, String group) {
        if (StringUtils.isBlank(indexName) && StringUtils.isBlank(regionName) && StringUtils.isBlank(group)) {
            return;
        }
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
        if (!StringUtils.isBlank(indexName)) {
            csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
        }

        if (!StringUtils.isBlank(regionName)) {
            csb.addOption(CliStrings.DESTROY_INDEX__REGION, regionName);
        }

        if (!StringUtils.isBlank(group)) {
            csb.addOption(CliStrings.DESTROY_INDEX__GROUP, group);
        }
        executeAndVerifyCommand(csb.getCommandString());
    }

    public void createAndDeployJar(String jarName) {
        File newDeployableJarFile = new File(jarName);
        try {
            this.classBuilder.writeJarFromName("ShareConfigClass", newDeployableJarFile);
            CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEPLOY);
            csb.addOption(CliStrings.DEPLOY__JAR, jarName);
            executeAndVerifyCommand(csb.getCommandString());
            jarFileNames.add(jarName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void deleteSavedJarFiles() {
        try {
            FileUtil.deleteMatching(new File("."), "^" + JarDeployer.JAR_PREFIX + "Deploy1.*#\\d++$");
            FileUtil.delete(new File("Deploy1.jar"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public Object[] setup() {
        disconnectAllFromDS();
        final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(3);
        final int locator1Port = ports[0];
        final String locator1Name = "locator1-" + locator1Port;
        VM locatorAndMgr = Host.getHost(0).getVM(3);

        Object[] result = (Object[]) locatorAndMgr.invoke(new SerializableCallable() {
            @Override
            public Object call() {
                int httpPort;
                int jmxPort;
                String jmxHost;

                try {
                    jmxHost = InetAddress.getLocalHost().getHostName();
                } catch (UnknownHostException ignore) {
                    jmxHost = "localhost";
                }

                final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);

                jmxPort = ports[0];
                httpPort = ports[1];

                final File locatorLogFile = new File("locator-" + locator1Port + ".log");

                final Properties locatorProps = new Properties();
                locatorProps.setProperty(DistributionConfig.NAME_NAME, locator1Name);
                locatorProps.setProperty(DistributionConfig.MCAST_PORT_NAME, "0");
                locatorProps.setProperty(DistributionConfig.LOG_LEVEL_NAME, "config");
                locatorProps.setProperty(DistributionConfig.ENABLE_CLUSTER_CONFIGURATION_NAME, "true");
                locatorProps.setProperty(DistributionConfig.JMX_MANAGER_NAME, "true");
                locatorProps.setProperty(DistributionConfig.JMX_MANAGER_START_NAME, "true");
                locatorProps.setProperty(DistributionConfig.JMX_MANAGER_BIND_ADDRESS_NAME, String.valueOf(jmxHost));
                locatorProps.setProperty(DistributionConfig.JMX_MANAGER_PORT_NAME, String.valueOf(jmxPort));
                locatorProps.setProperty(DistributionConfig.HTTP_SERVICE_PORT_NAME, String.valueOf(httpPort));

                try {
                    final InternalLocator locator = (InternalLocator) Locator.startLocatorAndDS(locator1Port,
                            locatorLogFile, null, locatorProps);
                    DistributedTestCase.WaitCriterion wc = new DistributedTestCase.WaitCriterion() {
                        @Override
                        public boolean done() {
                            return locator.isSharedConfigurationRunning();
                        }

                        @Override
                        public String description() {
                            return "Waiting for shared configuration to be started";
                        }
                    };
                    DistributedTestCase.waitForCriterion(wc, TIMEOUT, INTERVAL, true);
                } catch (IOException ioex) {
                    fail("Unable to create a locator with a shared configuration");
                }

                final Object[] result = new Object[4];
                result[0] = locator1Port;
                result[1] = jmxHost;
                result[2] = jmxPort;
                result[3] = httpPort;
                return result;
            }
        });

        HeadlessGfsh gfsh = getDefaultShell();
        String jmxHost = (String) result[1];
        int jmxPort = (Integer) result[2];
        int httpPort = (Integer) result[3];

        shellConnect(jmxHost, jmxPort, httpPort, gfsh);
        // Create a cache in VM 1
        VM dataMember = Host.getHost(0).getVM(1);
        dataMember.invoke(new SerializableCallable() {
            @Override
            public Object call() {
                Properties localProps = new Properties();
                localProps.setProperty(DistributionConfig.MCAST_PORT_NAME, "0");
                localProps.setProperty(DistributionConfig.LOCATORS_NAME, "localhost:" + locator1Port);
                localProps.setProperty(DistributionConfig.NAME_NAME, "DataMember");
                getSystem(localProps);
                Cache cache = getCache();
                assertNotNull(cache);
                return CliUtil.getAllNormalMembers(cache);
            }
        });
        return result;
    }

    private void shutdownAll() throws IOException {
        VM locatorAndMgr = Host.getHost(0).getVM(3);
        locatorAndMgr.invoke(new SerializableCallable() {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            @Override
            public Object call() throws Exception {
                GemFireCacheImpl cache = (GemFireCacheImpl) CacheFactory.getAnyInstance();
                ShutdownAllRequest.send(cache.getDistributedSystem().getDistributionManager(), -1);
                return null;
            }
        });

        locatorAndMgr.invoke(SharedConfigurationDUnitTest.locatorCleanup);
        //Clean up the directories
        if (!serverNames.isEmpty()) {
            for (String serverName : serverNames) {
                final File serverDir = new File(serverName);
                FileUtils.cleanDirectory(serverDir);
                FileUtils.deleteDirectory(serverDir);
            }
        }
        serverNames.clear();
        serverNames = null;
    }

    private void verifyRegionCreateOnAllMembers(String regionName) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESCRIBE_REGION);
        csb.addOption(CliStrings.DESCRIBE_REGION__NAME, regionName);
        CommandResult cmdResult = executeCommand(csb.getCommandString());
        String resultAsString = commandResultToString(cmdResult);

        for (String serverName : serverNames) {
            assertTrue(resultAsString.contains(serverName));
        }
    }

    private void verifyIndexCreationOnAllMembers(String indexName) {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
        CommandResult cmdResult = executeCommand(csb.getCommandString());
        String resultAsString = commandResultToString(cmdResult);

        for (String serverName : serverNames) {
            assertTrue(resultAsString.contains(serverName));
        }
    }

    private void verifyAsyncEventQueueCreation() {
        CommandStringBuilder csb = new CommandStringBuilder(CliStrings.LIST_ASYNC_EVENT_QUEUES);
        CommandResult cmdResult = executeCommand(csb.toString());
        String resultAsString = commandResultToString(cmdResult);

        for (String serverName : serverNames) {
            assertTrue(resultAsString.contains(serverName));
        }
    }

}