GEODE-3337: Refactoring LauncherLifecycleCommandsDUnitTest This closes #701
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/210ff9f1 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/210ff9f1 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/210ff9f1 Branch: refs/heads/develop Commit: 210ff9f15460c993f2bf7fd682d50ee65462cd23 Parents: 6316969 Author: YehEmily <emilyyeh1...@gmail.com> Authored: Fri Aug 11 10:22:33 2017 -0700 Committer: Kirk Lund <kl...@apache.org> Committed: Fri Aug 11 15:10:52 2017 -0700 ---------------------------------------------------------------------- .../commands/GfshCommandIntegrationTest.java | 69 +- .../LauncherLifecycleCommandsDUnitTest.java | 1115 ------------------ .../cli/commands/StartLocatorCommandTest.java | 4 +- .../cli/commands/StartServerCommandTest.java | 4 +- .../test/dunit/rules/gfsh/ProcessLogger.java | 10 +- .../cli/commands/StartLocatorCommand.java | 67 +- .../cli/commands/StartMemberCommand.java | 248 ++++ .../internal/cli/commands/StartMemberUtils.java | 251 ---- .../cli/commands/StartServerCommand.java | 117 +- .../commands/lifecycle/StopLocatorCommand.java | 16 +- .../cli/commands/GfshCommandJUnitTest.java | 219 +--- .../commands/StartLocatorCommandUnitTest.java | 59 + .../cli/commands/StartMemberCommandTest.java | 335 ++++++ .../commands/StartServerCommandUnitTest.java | 78 ++ .../commands/StatusLocatorCommandUnitTest.java | 53 + .../lifecycle/StopLocatorCommandUnitTest.java | 74 ++ .../rules/RetryRuleLocalWithErrorTest.java | 2 +- 17 files changed, 961 insertions(+), 1760 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java ---------------------------------------------------------------------- diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java index 263b12c..a191905 100644 --- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java +++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/GfshCommandIntegrationTest.java @@ -15,16 +15,11 @@ package org.apache.geode.management.internal.cli.commands; -import static org.assertj.core.api.Java6Assertions.assertThat; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; -import java.io.FileWriter; import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -33,14 +28,12 @@ import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; -import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.TemporaryFolder; import org.junit.rules.TestName; -import org.apache.geode.internal.util.IOUtils; import org.apache.geode.test.junit.categories.IntegrationTest; @Category(IntegrationTest.class) @@ -52,60 +45,8 @@ public class GfshCommandIntegrationTest { public TestName testName = new TestName(); @Test - public void workingDirDefaultsToMemberName() { - StartServerCommand startServer = new StartServerCommand(); - String workingDir = StartMemberUtils.resolveWorkingDir(null, "server1"); - assertThat(new File(workingDir)).exists(); - assertThat(workingDir).endsWith("server1"); - } - - @Test - public void workingDirGetsCreatedIfNecessary() throws Exception { - File workingDir = temporaryFolder.newFolder("foo"); - FileUtils.deleteQuietly(workingDir); - String workingDirString = workingDir.getAbsolutePath(); - - StartServerCommand startServer = new StartServerCommand(); - - String resolvedWorkingDir = StartMemberUtils.resolveWorkingDir(workingDirString, "server1"); - assertThat(new File(resolvedWorkingDir)).exists(); - assertThat(workingDirString).endsWith("foo"); - } - - @Test - public void testWorkingDirWithRelativePath() throws Exception { - Path relativePath = Paths.get("some").resolve("relative").resolve("path"); - assertThat(relativePath.isAbsolute()).isFalse(); - - StartServerCommand startServer = new StartServerCommand(); - - String resolvedWorkingDir = - StartMemberUtils.resolveWorkingDir(relativePath.toString(), "server1"); - - assertThat(resolvedWorkingDir).isEqualTo(relativePath.toAbsolutePath().toString()); - } - - @Test - public void testReadPid() throws IOException { - final int expectedPid = 12345; - - File folder = temporaryFolder.newFolder(); - File pidFile = - new File(folder, getClass().getSimpleName() + "_" + testName.getMethodName() + ".pid"); - - assertTrue(pidFile.createNewFile()); - - pidFile.deleteOnExit(); - writePid(pidFile, expectedPid); - - final int actualPid = StartMemberUtils.readPid(pidFile); - - assertEquals(expectedPid, actualPid); - } - - @Test public void testGemFireCoreClasspath() throws IOException { - File coreDependenciesJar = new File(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME); + File coreDependenciesJar = new File(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME); assertNotNull(coreDependenciesJar); assertTrue(coreDependenciesJar + " is not a file", coreDependenciesJar.isFile()); Collection<String> expectedJarDependencies = @@ -167,11 +108,5 @@ public class GfshCommandIntegrationTest { missingExpectedJarDependenciesList.isEmpty()); } - private void writePid(final File pidFile, final int pid) throws IOException { - final FileWriter fileWriter = new FileWriter(pidFile, false); - fileWriter.write(String.valueOf(pid)); - fileWriter.write("\n"); - fileWriter.flush(); - IOUtils.close(fileWriter); - } + } http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java deleted file mode 100644 index 6e5d17c..0000000 --- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommandsDUnitTest.java +++ /dev/null @@ -1,1115 +0,0 @@ -/* - * 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 org.apache.geode.management.internal.cli.commands; - -import static org.apache.geode.distributed.ConfigurationProperties.DURABLE_CLIENT_ID; -import static org.apache.geode.distributed.ConfigurationProperties.START_LOCATOR; -import static org.apache.geode.test.dunit.Assert.assertEquals; -import static org.apache.geode.test.dunit.Assert.assertFalse; -import static org.apache.geode.test.dunit.Assert.assertNotNull; -import static org.apache.geode.test.dunit.Assert.assertTrue; -import static org.apache.geode.test.dunit.Wait.waitForCriterion; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.lang.management.ManagementFactory; -import java.net.InetAddress; -import java.nio.charset.Charset; -import java.text.DateFormat; -import java.text.MessageFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentLinkedDeque; -import java.util.concurrent.TimeUnit; - -import javax.management.MBeanServerConnection; -import javax.management.ObjectName; -import javax.management.Query; -import javax.management.QueryExp; -import javax.management.remote.JMXConnector; -import javax.management.remote.JMXConnectorFactory; -import javax.management.remote.JMXServiceURL; - -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runners.MethodSorters; - -import org.apache.geode.cache.Region; -import org.apache.geode.cache.client.ClientCache; -import org.apache.geode.cache.client.ClientCacheFactory; -import org.apache.geode.cache.client.ClientRegionFactory; -import org.apache.geode.cache.client.ClientRegionShortcut; -import org.apache.geode.cache.client.Pool; -import org.apache.geode.cache.client.PoolFactory; -import org.apache.geode.cache.client.PoolManager; -import org.apache.geode.distributed.AbstractLauncher.ServiceState; -import org.apache.geode.distributed.AbstractLauncher.Status; -import org.apache.geode.distributed.LocatorLauncher; -import org.apache.geode.distributed.LocatorLauncher.Builder; -import org.apache.geode.distributed.LocatorLauncher.Command; -import org.apache.geode.distributed.LocatorLauncher.LocatorState; -import org.apache.geode.distributed.ServerLauncher; -import org.apache.geode.distributed.ServerLauncher.ServerState; -import org.apache.geode.distributed.internal.DistributionConfig; -import org.apache.geode.internal.AvailablePortHelper; -import org.apache.geode.internal.lang.ObjectUtils; -import org.apache.geode.internal.lang.StringUtils; -import org.apache.geode.internal.lang.SystemUtils; -import org.apache.geode.internal.process.ProcessType; -import org.apache.geode.internal.process.ProcessUtils; -import org.apache.geode.internal.util.IOUtils; -import org.apache.geode.management.cli.Result; -import org.apache.geode.management.internal.cli.i18n.CliStrings; -import org.apache.geode.management.internal.cli.result.CommandResult; -import org.apache.geode.management.internal.cli.util.CommandStringBuilder; -import org.apache.geode.test.dunit.WaitCriterion; -import org.apache.geode.test.junit.categories.DistributedTest; - -/** - * The LauncherLifecycleCommandsDUnitTest class is a test suite of integration tests testing the - * contract and functionality of the GemFire launcher lifecycle commands inside Gfsh. - * - * @see javax.management.MBeanServerConnection - * @see javax.management.remote.JMXConnector - * @see org.apache.geode.distributed.AbstractLauncher - * @see org.apache.geode.distributed.LocatorLauncher - * @see org.apache.geode.distributed.ServerLauncher - * @see org.apache.geode.internal.AvailablePortHelper - * @see org.apache.geode.management.internal.cli.shell.Gfsh - * @see org.apache.geode.management.internal.cli.commands.CliCommandTestBase - * @see org.apache.geode.management.internal.cli.util.CommandStringBuilder - * @since GemFire 7.0 - */ -@Category(DistributedTest.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class LauncherLifecycleCommandsDUnitTest extends CliCommandTestBase { - - protected static final DateFormat TIMESTAMP = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - - private final Queue<Integer> processIds = new ConcurrentLinkedDeque<>(); - - protected static String getMemberId(final int jmxManagerPort, final String memberName) - throws Exception { - return getMemberId(InetAddress.getLocalHost().getHostName(), jmxManagerPort, memberName); - } - - protected static String getMemberId(final String jmxManagerHost, final int jmxManagerPort, - final String memberName) throws Exception { - JMXConnector connector = null; - - try { - connector = JMXConnectorFactory.connect(new JMXServiceURL(String.format( - "service:jmx:rmi://%1$s/jndi/rmi://%1$s:%2$d/jmxrmi", jmxManagerHost, jmxManagerPort))); - - MBeanServerConnection connection = connector.getMBeanServerConnection(); - - ObjectName objectNamePattern = ObjectName.getInstance("GemFire:type=Member,*"); - - QueryExp query = Query.eq(Query.attr("Name"), Query.value(memberName)); - - Set<ObjectName> objectNames = connection.queryNames(objectNamePattern, query); - - assertNotNull(objectNames); - assertFalse(objectNames.isEmpty()); - assertEquals(1, objectNames.size()); - - // final ObjectName objectName = ObjectName.getInstance("GemFire:type=Member,Name=" + - // memberName); - ObjectName objectName = objectNames.iterator().next(); - - // System.err.printf("ObjectName for Member with Name (%1$s) is %2$s%n", memberName, - // objectName); - - return ObjectUtils.toString(connection.getAttribute(objectName, "Id")); - } finally { - IOUtils.close(connector); - } - } - - @Override - public final void postTearDown() throws Exception { - Integer pid; - - while ((pid = processIds.poll()) != null) { - if (ProcessUtils.isProcessAlive(pid)) { - try { - String killCommand = String.format("%1$s %2$d", - SystemUtils.isWindows() ? "taskkill /F /PID" : "kill -9", pid); - Runtime.getRuntime().exec(killCommand); - } catch (Throwable ignore) { - } - } - } - } - - @SuppressWarnings("unused") - protected void assertStatus(final LocatorState expectedStatus, final LocatorState actualStatus) { - assertEquals(expectedStatus.getStatus(), actualStatus.getStatus()); - assertEquals(expectedStatus.getTimestamp(), actualStatus.getTimestamp()); - assertEquals(expectedStatus.getServiceLocation(), actualStatus.getServiceLocation()); - assertTrue(ObjectUtils.equalsIgnoreNull(expectedStatus.getPid(), actualStatus.getPid())); - assertEquals(expectedStatus.getUptime(), actualStatus.getUptime()); - assertEquals(expectedStatus.getWorkingDirectory(), actualStatus.getWorkingDirectory()); - assertEquals(expectedStatus.getJvmArguments(), actualStatus.getJvmArguments()); - assertEquals(expectedStatus.getClasspath(), actualStatus.getClasspath()); - assertEquals(expectedStatus.getGemFireVersion(), actualStatus.getGemFireVersion()); - assertEquals(expectedStatus.getJavaVersion(), actualStatus.getJavaVersion()); - } - - protected Integer readPid(final File workingDirectory) throws IOException { - assertTrue(String.format("The working directory (%1$s) must exist!", workingDirectory), - workingDirectory != null && workingDirectory.isDirectory()); - - File[] files = workingDirectory.listFiles(pathname -> (pathname != null && pathname.isFile() - && pathname.getAbsolutePath().endsWith(".pid"))); - - assertNotNull(files); - assertTrue(files.length > 0); - - File pidFile = files[0]; - - BufferedReader fileReader = null; - - try { - fileReader = new BufferedReader(new FileReader(pidFile), 1024); - return Integer.parseInt(fileReader.readLine().trim()); - } catch (Exception ignore) { - return null; - } finally { - IOUtils.close(fileReader); - } - } - - protected String serviceStateStatusStringNormalized(final ServiceState serviceState) { - return serviceStateStatusStringNormalized(serviceState.toString()); - } - - protected String serviceStateStatusStringNormalized(final String serviceStateStatus) { - assertNotNull(serviceStateStatus); - assertTrue("serviceStateStatus is missing 'Uptime': " + serviceStateStatus, - serviceStateStatus.contains("Uptime")); - assertTrue("serviceStateStatus is missing 'JVM Arguments': " + serviceStateStatus, - serviceStateStatus.contains("JVM Arguments")); - - return serviceStateStatus.substring(0, serviceStateStatus.indexOf("Uptime")) - .concat(serviceStateStatus.substring(serviceStateStatus.indexOf("JVM Arguments"))); - } - - protected Status stopLocator(final File workingDirectory) { - return stopLocator(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectory)); - } - - protected Status stopLocator(final String workingDirectory) { - return waitForGemFireProcessToStop( - new Builder().setCommand(Command.STOP).setWorkingDirectory(workingDirectory).build().stop(), - workingDirectory); - } - - protected Status stopServer(final String workingDirectory) { - return waitForGemFireProcessToStop( - new ServerLauncher.Builder().setCommand(ServerLauncher.Command.STOP) - .setWorkingDirectory(workingDirectory).build().stop(), - workingDirectory); - } - - protected String toString(final Result result) { - assert result != null : "The Result object from the command execution cannot be null!"; - - StringBuilder buffer = new StringBuilder(StringUtils.LINE_SEPARATOR); - - while (result.hasNextLine()) { - buffer.append(result.nextLine()); - buffer.append(StringUtils.LINE_SEPARATOR); - } - - return buffer.toString(); - } - - protected Status waitForGemFireProcessToStop(final ServiceState serviceState, - final String workingDirectory) { - if (!Status.STOPPED.equals(serviceState.getStatus())) { - try { - final Integer pid = readPid(new File(workingDirectory)); - - if (pid != null) { - WaitCriterion waitCriteria = new WaitCriterion() { - @Override - public boolean done() { - return !ProcessUtils.isProcessAlive(pid); - } - - @Override - public String description() { - return String.format("Waiting for GemFire Process with PID (%1$d) to stop.", pid); - } - }; - - waitForCriterion(waitCriteria, TimeUnit.SECONDS.toMillis(15), - TimeUnit.SECONDS.toMillis(5), false); - - if (!waitCriteria.done()) { - processIds.offer(pid); - } - } - } catch (IOException ignore) { - } - } - - return serviceState.getStatus(); - } - - protected void writePid(final File pidFile, final int pid) throws IOException { - assertTrue("The PID file must actually exist!", pidFile != null && pidFile.isFile()); - - FileWriter writer = null; - - try { - writer = new FileWriter(pidFile, false); - writer.write(String.valueOf(pid)); - writer.write(System.getProperty("line.separator")); - writer.flush(); - } finally { - IOUtils.close(writer); - } - } - - @Test - public void test000StartLocatorCapturesOutputOnError() throws IOException { - final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort(); - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - File pidFile = new File(workingDirectory, ProcessType.LOCATOR.getPidFileName()); - - assertTrue(pidFile.createNewFile()); - - writePid(pidFile, getPidOrOne()); - pidFile.deleteOnExit(); - - assertTrue(pidFile.isFile()); - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, "-D" + DistributionConfig.GEMFIRE_PREFIX - + "jmx-manager-port=" + AvailablePortHelper.getRandomAvailableTCPPort()); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, - resultString.contains( - "Exception in thread \"main\" java.lang.RuntimeException: A PID file already exists and a Locator may be running in " - + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(workingDirectory))); - assertTrue(resultString, - resultString.contains( - "Caused by: org.apache.geode.internal.process.FileAlreadyExistsException: Pid file already exists: " - + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(pidFile))); - } - - /* - * This method makes an effort to get the PID of the running process. If it is unable to determine - * accurately, it simply returns 1. - */ - private int getPidOrOne() { - int pid = 1; - String[] name = ManagementFactory.getRuntimeMXBean().getName().split("@"); - if (name.length > 1) { - try { - pid = Integer.parseInt(name[0]); - } catch (NumberFormatException nex) { - // Ignored - } - } - - return pid; - } - - @Test - public void test001StartLocatorFailsFastOnMissingGemFirePropertiesFile() throws IOException { - String gemfirePropertiesPathname = "/path/to/missing/gemfire.properties"; - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathName); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, "0"); - command.addOption(CliStrings.START_LOCATOR__PROPERTIES, gemfirePropertiesPathname); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager=false"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-start=false"); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, - resultString - .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE, - StringUtils.EMPTY, gemfirePropertiesPathname))); - } - - /** - * Test to verify GEODE-2138 - * - * @throws IOException - */ - @Test - public void testVersionTitleForStartServerAndLocator() throws IOException { - final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort(); - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - String pathnameLoc = pathname + "_loc"; - String pathnameSer = pathname + "_ser"; - - File workingDirectoryLoc = temporaryFolder.newFolder(pathnameLoc); - File workingDirectorySer = temporaryFolder.newFolder(pathnameSer); - - assertTrue(workingDirectoryLoc.isDirectory() || workingDirectoryLoc.mkdir()); - assertTrue(workingDirectorySer.isDirectory() || workingDirectorySer.mkdir()); - - try { - // verify the start locator output does not contain string "gemfire" - CommandStringBuilder locCommand = new CommandStringBuilder(CliStrings.START_LOCATOR); - locCommand.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathnameLoc); - locCommand.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - locCommand.addOption(CliStrings.START_LOCATOR__DIR, workingDirectoryLoc.getCanonicalPath()); - locCommand.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - - CommandResult locResult = executeCommand(locCommand.toString()); - assertNotNull(locResult); - assertEquals(Result.Status.OK, locResult.getStatus()); - String locatorOutput = toString(locResult); - assertNotNull(locatorOutput); - assertTrue("Locator output was: " + locatorOutput, !locatorOutput.contains("Gemfire")); - - // verify the start server output does not contain string "gemfire" - CommandStringBuilder serCommand = new CommandStringBuilder(CliStrings.START_SERVER); - serCommand.addOption(CliStrings.START_SERVER__NAME, pathnameSer); - serCommand.addOption(CliStrings.START_SERVER__DIR, workingDirectorySer.getCanonicalPath()); - - CommandResult serResult = executeCommand(serCommand.toString()); - assertNotNull(serResult); - assertEquals(Result.Status.OK, serResult.getStatus()); - String serverOutput = toString(serResult); - - assertTrue("Server start output was: " + serverOutput, !serverOutput.contains("Gemfire")); - } finally { - stopLocator(workingDirectoryLoc); - stopServer(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectorySer)); - } - } - - @Test - public void test002StartLocatorFailsFastOnMissingGemFireSecurityPropertiesFile() - throws IOException { - String gemfireSecurityPropertiesPathname = "/path/to/missing/gemfire-security.properties"; - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathName); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, "0"); - command.addOption(CliStrings.START_LOCATOR__SECURITY_PROPERTIES, - gemfireSecurityPropertiesPathname); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager=false"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-start=false"); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, - resultString - .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE, - "Security ", gemfireSecurityPropertiesPathname))); - } - - @Test - public void test003StartServerFailsFastOnMissingCacheXmlFile() throws IOException { - String cacheXmlPathname = "/path/to/missing/cache.xml"; - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER); - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - command.addOption(CliStrings.START_SERVER__NAME, pathName); - command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_SERVER__CACHE_XML_FILE, cacheXmlPathname); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, resultString - .contains(MessageFormat.format(CliStrings.CACHE_XML_NOT_FOUND_MESSAGE, cacheXmlPathname))); - } - - @Test - public void test004StartServerFailsFastOnMissingGemFirePropertiesFile() throws IOException { - String gemfirePropertiesFile = "/path/to/missing/gemfire.properties"; - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER); - - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - command.addOption(CliStrings.START_SERVER__NAME, pathName); - command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_SERVER__PROPERTIES, gemfirePropertiesFile); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, - resultString - .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE, - StringUtils.EMPTY, gemfirePropertiesFile))); - } - - @Test - public void testStartServerFailsFastOnMissingPassword() throws IOException { - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER); - - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - command.addOption(CliStrings.START_SERVER__NAME, pathName); - command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_SERVER__USERNAME, "test"); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, resultString.contains("password must be specified")); - } - - @Test - public void test005StartServerFailsFastOnMissingGemFireSecurityPropertiesFile() - throws IOException { - String gemfireSecuritiesPropertiesFile = "/path/to/missing/gemfire-securities.properties"; - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER); - - String pathName = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - final File workingDirectory = temporaryFolder.newFolder(pathName); - - command.addOption(CliStrings.START_SERVER__NAME, pathName); - command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_SERVER__SECURITY_PROPERTIES, - gemfireSecuritiesPropertiesFile); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - - String resultString = toString(result); - - assertTrue(resultString, - resultString - .contains(MessageFormat.format(CliStrings.GEODE_0_PROPERTIES_1_NOT_FOUND_MESSAGE, - "Security ", gemfireSecuritiesPropertiesFile))); - } - - @Test - public void test006StartLocatorInRelativeDirectory() { - final int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort(); - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = new File(pathname); - - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - try { - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__DIR, pathname); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, "-D" + DistributionConfig.GEMFIRE_PREFIX - + "jmx-manager-port=" + AvailablePortHelper.getRandomAvailableTCPPort()); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - String locatorOutput = toString(result); - - assertNotNull(locatorOutput); - assertTrue("Locator output was: " + locatorOutput, locatorOutput.contains( - "Locator in " + IOUtils.tryGetCanonicalFileElseGetAbsoluteFile(workingDirectory))); - } finally { - stopLocator(workingDirectory); - } - } - - @Test - public void test007StatusLocatorUsingMemberNameIDWhenGfshIsNotConnected() { - CommandResult result = - executeCommand(CliStrings.STATUS_LOCATOR + " --name=" + getTestMethodName()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - assertEquals( - CliStrings.format(CliStrings.STATUS_SERVICE__GFSH_NOT_CONNECTED_ERROR_MESSAGE, "Locator"), - StringUtils.trim(toString(result))); - } - - @Test - public void test008StatusLocatorUsingMemberName() throws IOException { - final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); - - final int jmxManagerPort = ports[0]; - final int locatorPort = ports[1]; - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - try { - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - LocatorLauncher locatorLauncher = new LocatorLauncher.Builder() - .setCommand(LocatorLauncher.Command.STATUS).setBindAddress(null).setPort(locatorPort) - .setWorkingDirectory(workingDirectory.getPath()).build(); - - assertNotNull(locatorLauncher); - - LocatorState expectedLocatorState = - locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS); - - assertNotNull(expectedLocatorState); - assertEquals(Status.ONLINE, expectedLocatorState.getStatus()); - - result = executeCommand( - String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - result = executeCommand( - String.format("%1$s --name=invalidLocatorMemberName", CliStrings.STATUS_LOCATOR)); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - assertEquals( - CliStrings.format(CliStrings.STATUS_LOCATOR__NO_LOCATOR_FOUND_FOR_MEMBER_ERROR_MESSAGE, - "invalidLocatorMemberName"), - StringUtils.trim(toString(result))); - - result = - executeCommand(String.format("%1$s --name=%2$s", CliStrings.STATUS_LOCATOR, pathname)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - assertTrue(serviceStateStatusStringNormalized(toString(result)) - .contains(serviceStateStatusStringNormalized(expectedLocatorState))); - } finally { - stopLocator(workingDirectory); - } - } - - @Test - public void test009StatusLocatorUsingMemberId() throws Exception { - final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); - - final int jmxManagerPort = ports[0]; - final int locatorPort = ports[1]; - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - try { - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - LocatorLauncher locatorLauncher = new LocatorLauncher.Builder() - .setCommand(LocatorLauncher.Command.STATUS).setBindAddress(null).setPort(locatorPort) - .setWorkingDirectory(workingDirectory.getPath()).build(); - - assertNotNull(locatorLauncher); - - LocatorState expectedLocatorState = - locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS); - - assertNotNull(expectedLocatorState); - assertEquals(Status.ONLINE, expectedLocatorState.getStatus()); - - result = executeCommand( - String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STATUS_LOCATOR, - getMemberId(jmxManagerPort, pathname))); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - assertTrue(serviceStateStatusStringNormalized(toString(result)) - .contains(serviceStateStatusStringNormalized(expectedLocatorState))); - } finally { - stopLocator(workingDirectory); - } - } - - @Test - public void test010StopLocatorUsingMemberNameIDWhenGfshIsNotConnected() { - CommandResult result = - executeCommand(CliStrings.STOP_LOCATOR + " --name=" + getTestMethodName()); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - assertEquals( - CliStrings.format(CliStrings.STOP_SERVICE__GFSH_NOT_CONNECTED_ERROR_MESSAGE, "Locator"), - StringUtils.trim(toString(result))); - } - - @Test - public void test011StopLocatorUsingMemberName() throws IOException { - final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); - - final int jmxManagerPort = ports[0]; - final int locatorPort = ports[1]; - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - try { - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - final LocatorLauncher locatorLauncher = - new Builder().setCommand(Command.STOP).setBindAddress(null).setPort(locatorPort) - .setWorkingDirectory(workingDirectory.getPath()).build(); - - assertNotNull(locatorLauncher); - - LocatorState locatorStatus = locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS); - - assertNotNull(locatorStatus); - assertEquals(Status.ONLINE, locatorStatus.getStatus()); - - result = executeCommand( - String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - result = executeCommand( - String.format("%1$s --name=invalidLocatorMemberName", CliStrings.STOP_LOCATOR)); - - assertNotNull(result); - assertEquals(Result.Status.ERROR, result.getStatus()); - assertEquals( - CliStrings.format(CliStrings.STOP_LOCATOR__NO_LOCATOR_FOUND_FOR_MEMBER_ERROR_MESSAGE, - "invalidLocatorMemberName"), - StringUtils.trim(toString(result))); - - locatorStatus = locatorLauncher.status(); - - assertNotNull(locatorStatus); - assertEquals(Status.ONLINE, locatorStatus.getStatus()); - - result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STOP_LOCATOR, pathname)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - // TODO figure out what output to assert and validate on now that 'stop locator' uses Gfsh's - // logger - // and standard err/out... - // assertIndexDetailsEquals(CliStrings.format(CliStrings.STOP_LOCATOR__SHUTDOWN_MEMBER_MESSAGE, - // pathname), - // StringUtils.trim(toString(result))); - - WaitCriterion waitCriteria = new WaitCriterion() { - @Override - public boolean done() { - final LocatorState locatorStatus = locatorLauncher.status(); - return (locatorStatus != null && Status.NOT_RESPONDING.equals(locatorStatus.getStatus())); - } - - @Override - public String description() { - return "wait for the Locator to stop; the Locator will no longer respond after it stops"; - } - }; - - waitForCriterion(waitCriteria, 15 * 1000, 5000, true); - - locatorStatus = locatorLauncher.status(); - - assertNotNull(locatorStatus); - assertEquals(Status.NOT_RESPONDING, locatorStatus.getStatus()); - } finally { - } - - } - - // @see Trac Bug # 46760 - @Test - public void test012StopLocatorUsingMemberId() throws Exception { - final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); - - final int jmxManagerPort = ports[0]; - final int locatorPort = ports[1]; - - String pathname = (getClass().getSimpleName() + "_" + getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - try { - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_LOCATOR); - - command.addOption(CliStrings.START_LOCATOR__MEMBER_NAME, pathname); - command.addOption(CliStrings.START_LOCATOR__CONNECT, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_LOCATOR__PORT, String.valueOf(locatorPort)); - command.addOption(CliStrings.START_LOCATOR__ENABLE__SHARED__CONFIGURATION, - Boolean.FALSE.toString()); - command.addOption(CliStrings.START_LOCATOR__FORCE, Boolean.TRUE.toString()); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "http-service-port=0"); - command.addOption(CliStrings.START_LOCATOR__J, - "-D" + DistributionConfig.GEMFIRE_PREFIX + "jmx-manager-port=" + jmxManagerPort); - - CommandResult result = executeCommand(command.toString()); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - final LocatorLauncher locatorLauncher = - new Builder().setCommand(Command.STOP).setBindAddress(null).setPort(locatorPort) - .setWorkingDirectory(workingDirectory.getPath()).build(); - - assertNotNull(locatorLauncher); - - LocatorState locatorState = locatorLauncher.waitOnStatusResponse(60, 10, TimeUnit.SECONDS); - - assertNotNull(locatorState); - assertEquals(Status.ONLINE, locatorState.getStatus()); - - result = executeCommand( - String.format("%1$s --locator=localhost[%2$d]", CliStrings.CONNECT, locatorPort)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - String memberId = getMemberId(jmxManagerPort, pathname); - - result = executeCommand(String.format("%1$s --name=%2$s", CliStrings.STOP_LOCATOR, memberId)); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - // TODO figure out what output to assert and validate on now that 'stop locator' uses Gfsh's - // logger - // and standard err/out... - // assertIndexDetailsEquals(CliStrings.format(CliStrings.STOP_LOCATOR__SHUTDOWN_MEMBER_MESSAGE, - // memberId), - // StringUtils.trim(toString(result))); - - WaitCriterion waitCriteria = new WaitCriterion() { - @Override - public boolean done() { - LocatorState locatorState = locatorLauncher.status(); - return (locatorState != null && Status.NOT_RESPONDING.equals(locatorState.getStatus())); - } - - @Override - public String description() { - return "wait for the Locator to stop; the Locator will no longer respond after it stops"; - } - }; - - waitForCriterion(waitCriteria, 15 * 1000, 5000, true); - - locatorState = locatorLauncher.status(); - - assertNotNull(locatorState); - assertEquals(Status.NOT_RESPONDING, locatorState.getStatus()); - } finally { - } - } - - @Test - public void test014GemFireServerJvmProcessTerminatesOnOutOfMemoryError() throws Exception { - int ports[] = AvailablePortHelper.getRandomAvailableTCPPorts(2); - final int serverPort = ports[0]; - final int locatorPort = ports[1]; - - String pathname = getClass().getSimpleName().concat("_").concat(getTestMethodName()); - File workingDirectory = temporaryFolder.newFolder(pathname); - - assertTrue(workingDirectory.isDirectory() || workingDirectory.mkdir()); - - CommandStringBuilder command = new CommandStringBuilder(CliStrings.START_SERVER); - - command.addOption(CliStrings.START_SERVER__NAME, - pathname + TIMESTAMP.format(Calendar.getInstance().getTime())); - command.addOption(CliStrings.START_SERVER__SERVER_PORT, String.valueOf(serverPort)); - command.addOption(CliStrings.START_SERVER__USE_CLUSTER_CONFIGURATION, Boolean.FALSE.toString()); - command.addOption(CliStrings.START_SERVER__MAXHEAP, "10M"); - command.addOption(CliStrings.START_SERVER__LOG_LEVEL, "config"); - command.addOption(CliStrings.START_SERVER__DIR, workingDirectory.getCanonicalPath()); - command.addOption(CliStrings.START_SERVER__CACHE_XML_FILE, - IOUtils.tryGetCanonicalPathElseGetAbsolutePath(writeAndGetCacheXmlFile(workingDirectory))); - command.addOption(CliStrings.START_SERVER__INCLUDE_SYSTEM_CLASSPATH); - command.addOption(CliStrings.START_SERVER__J, "-D" + DistributionConfig.GEMFIRE_PREFIX + "" - + START_LOCATOR + "=localhost[" + locatorPort + "]"); - - - CommandResult result = executeCommand(command.toString()); - System.out.println("result=" + result); - - assertNotNull(result); - assertEquals(Result.Status.OK, result.getStatus()); - - ServerLauncher serverLauncher = - new ServerLauncher.Builder().setCommand(ServerLauncher.Command.STATUS) - .setWorkingDirectory(IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDirectory)) - .build(); - - assertNotNull(serverLauncher); - - ServerState serverState = serverLauncher.status(); - - assertNotNull(serverState); - assertEquals(Status.ONLINE, serverState.getStatus()); - - // Verify our GemFire Server JVM process is running! - assertTrue(serverState.isVmWithProcessIdRunning()); - - ClientCache clientCache = setupClientCache(pathname + String.valueOf(serverPort), serverPort); - - assertNotNull(clientCache); - - try { - Region<Long, String> exampleRegion = clientCache.getRegion("/Example"); - // run the GemFire Server "out-of-town" with an OutOfMemoryError! - for (long index = 0; index < Long.MAX_VALUE; index++) { - exampleRegion.put(index, String.valueOf(index)); - } - } catch (Exception ignore) { - System.err.printf("%1$s: %2$s%n", ignore.getClass().getName(), ignore.getMessage()); - } finally { - clientCache.close(); - - final int serverPid = serverState.getPid(); - - WaitCriterion waitCriteria = new WaitCriterion() { - @Override - public boolean done() { - return !ProcessUtils.isProcessAlive(serverPid); - } - - @Override - public String description() { - return "Wait for the GemFire Server JVM process that ran out-of-memory to exit."; - } - }; - - waitForCriterion(waitCriteria, TimeUnit.SECONDS.toMillis(30), TimeUnit.SECONDS.toMillis(10), - true); - - // Verify our GemFire Server JVM process is was terminated! - assertFalse(serverState.isVmWithProcessIdRunning()); - - serverState = serverLauncher.status(); - - assertNotNull(serverState); - assertEquals(Status.NOT_RESPONDING, serverState.getStatus()); - } - } - - private File writeAndGetCacheXmlFile(final File workingDirectory) throws IOException { - File cacheXml = new File(workingDirectory, "cache.xml"); - StringBuilder buffer = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); - - buffer.append(StringUtils.LINE_SEPARATOR); - buffer.append( - "<!DOCTYPE cache PUBLIC \"-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN\""); - buffer.append(StringUtils.LINE_SEPARATOR); - buffer.append(" \"http://www.gemstone.com/dtd/cache7_0.dtd\">"); - buffer.append(StringUtils.LINE_SEPARATOR); - buffer.append("<cache>"); - buffer.append(StringUtils.LINE_SEPARATOR); - buffer.append(" <region name=\"Example\" refid=\"REPLICATE\"/>"); - buffer.append(StringUtils.LINE_SEPARATOR); - buffer.append("</cache>"); - - BufferedWriter fileWriter = null; - - try { - fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cacheXml, false), - Charset.forName("UTF-8").newEncoder())); - fileWriter.write(buffer.toString()); - fileWriter.flush(); - } finally { - IOUtils.close(fileWriter); - } - - return cacheXml; - } - - private ClientCache setupClientCache(final String durableClientId, final int serverPort) { - ClientCache clientCache = - new ClientCacheFactory().set(DURABLE_CLIENT_ID, durableClientId).create(); - - PoolFactory poolFactory = PoolManager.createFactory(); - - poolFactory.setMaxConnections(10); - poolFactory.setMinConnections(1); - poolFactory.setReadTimeout(5000); - poolFactory.addServer("localhost", serverPort); - - Pool pool = poolFactory.create("serverConnectionPool"); - - assertNotNull("The 'serverConnectionPool' was not properly configured and initialized!", pool); - - ClientRegionFactory<Long, String> regionFactory = - clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY); - - regionFactory.setPoolName(pool.getName()); - regionFactory.setKeyConstraint(Long.class); - regionFactory.setValueConstraint(String.class); - - Region<Long, String> exampleProxy = regionFactory.create("Example"); - - assertNotNull("The 'Example' Client Region was not properly configured and initialized", - exampleProxy); - - return clientCache; - } - -} http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java ---------------------------------------------------------------------- diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java index 5a7c11c..e9ca6dc 100644 --- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java +++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommandTest.java @@ -56,9 +56,9 @@ public class StartLocatorCommandTest { public void testLocatorClasspathOrder() { String userClasspath = "/path/to/user/lib/app.jar:/path/to/user/classes"; String expectedClasspath = - StartMemberUtils.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath) + locatorCommands.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath) .concat(File.pathSeparator).concat(System.getProperty("java.class.path")) - .concat(File.pathSeparator).concat(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME); + .concat(File.pathSeparator).concat(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME); String actualClasspath = locatorCommands.getLocatorClasspath(true, userClasspath); assertEquals(expectedClasspath, actualClasspath); } http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java ---------------------------------------------------------------------- diff --git a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java index e704248..a5012f3 100644 --- a/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java +++ b/geode-assembly/src/test/java/org/apache/geode/management/internal/cli/commands/StartServerCommandTest.java @@ -54,8 +54,8 @@ public class StartServerCommandTest { public void testServerClasspathOrder() { String userClasspath = "/path/to/user/lib/app.jar:/path/to/user/classes"; String expectedClasspath = - StartMemberUtils.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath) - .concat(File.pathSeparator).concat(StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME); + serverCommands.getGemFireJarPath().concat(File.pathSeparator).concat(userClasspath) + .concat(File.pathSeparator).concat(StartMemberCommand.CORE_DEPENDENCIES_JAR_PATHNAME); String actualClasspath = serverCommands.getServerClasspath(false, userClasspath); assertEquals(expectedClasspath, actualClasspath); } http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-assembly/src/test/java/org/apache/geode/test/dunit/rules/gfsh/ProcessLogger.java ---------------------------------------------------------------------- diff --git a/geode-assembly/src/test/java/org/apache/geode/test/dunit/rules/gfsh/ProcessLogger.java b/geode-assembly/src/test/java/org/apache/geode/test/dunit/rules/gfsh/ProcessLogger.java index 47f0304..85a94fa 100644 --- a/geode-assembly/src/test/java/org/apache/geode/test/dunit/rules/gfsh/ProcessLogger.java +++ b/geode-assembly/src/test/java/org/apache/geode/test/dunit/rules/gfsh/ProcessLogger.java @@ -36,14 +36,14 @@ public class ProcessLogger { private final Queue<String> stdOutLines = new ConcurrentLinkedQueue<>(); private final Queue<String> stdErrorLines = new ConcurrentLinkedQueue<>(); - private final StreamGobbler stdOutGobbler; - private final StreamGobbler stdErrGobbler; public ProcessLogger(Process process, String name) { this.logger = LOGGER_CONTEXT.getLogger(name); - this.stdOutGobbler = new StreamGobbler(process.getInputStream(), this::consumeInfoMessage); - this.stdErrGobbler = new StreamGobbler(process.getErrorStream(), this::consumeErrorMessage); + StreamGobbler stdOutGobbler = + new StreamGobbler(process.getInputStream(), this::consumeInfoMessage); + StreamGobbler stdErrGobbler = + new StreamGobbler(process.getErrorStream(), this::consumeErrorMessage); stdOutGobbler.startInNewThread(); stdErrGobbler.startInNewThread(); @@ -84,7 +84,7 @@ public class ProcessLogger { } public List<String> getStdErrLines() { - return Lists.newArrayList(stdOutLines.iterator()); + return Lists.newArrayList(stdErrorLines.iterator()); } } http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommand.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommand.java index 72ccfbb..5e1df6f 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartLocatorCommand.java @@ -57,7 +57,7 @@ import org.apache.geode.management.internal.cli.util.HostUtils; import org.apache.geode.management.internal.configuration.utils.ClusterConfigurationStatusRetriever; import org.apache.geode.security.AuthenticationFailedException; -public class StartLocatorCommand implements GfshCommand { +public class StartLocatorCommand extends StartMemberCommand implements GfshCommand { @CliCommand(value = CliStrings.START_LOCATOR, help = CliStrings.START_LOCATOR__HELP) @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_LOCATOR, CliStrings.TOPIC_GEODE_LIFECYCLE}) @@ -123,10 +123,10 @@ public class StartLocatorCommand implements GfshCommand { try { if (StringUtils.isBlank(memberName)) { // when the user doesn't give us a name, we make one up! - memberName = StartMemberUtils.getNameGenerator().generate('-'); + memberName = getNameGenerator().generate('-'); } - workingDirectory = StartMemberUtils.resolveWorkingDir(workingDirectory, memberName); + workingDirectory = resolveWorkingDir(workingDirectory, memberName); if (gemfirePropertiesFile != null && !gemfirePropertiesFile.exists()) { return ResultBuilder.createUserErrorResult( @@ -142,32 +142,28 @@ public class StartLocatorCommand implements GfshCommand { File locatorPidFile = new File(workingDirectory, ProcessType.LOCATOR.getPidFileName()); - final int oldPid = StartMemberUtils.readPid(locatorPidFile); + final int oldPid = readPid(locatorPidFile); Properties gemfireProperties = new Properties(); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.GROUPS, - group); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.LOCATORS, - locators); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.LOG_LEVEL, - logLevel); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, - ConfigurationProperties.MCAST_ADDRESS, mcastBindAddress); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.MCAST_PORT, - mcastPort); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, - ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION, enableSharedConfiguration); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.GROUPS, group); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.LOCATORS, locators); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.LOG_LEVEL, logLevel); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.MCAST_ADDRESS, + mcastBindAddress); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.MCAST_PORT, mcastPort); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION, + enableSharedConfiguration); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.LOAD_CLUSTER_CONFIGURATION_FROM_DIR, loadSharedConfigurationFromDirectory); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, - ConfigurationProperties.CLUSTER_CONFIGURATION_DIR, clusterConfigDir); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, - ConfigurationProperties.HTTP_SERVICE_PORT, httpServicePort); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, - ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS, httpServiceBindAddress); - StartMemberUtils.setPropertyIfNotNull(gemfireProperties, + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.CLUSTER_CONFIGURATION_DIR, + clusterConfigDir); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.HTTP_SERVICE_PORT, + httpServicePort); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS, + httpServiceBindAddress); + setPropertyIfNotNull(gemfireProperties, ConfigurationProperties.JMX_MANAGER_HOSTNAME_FOR_CLIENTS, jmxManagerHostnameForClients); // read the OSProcess enable redirect system property here @@ -258,7 +254,7 @@ public class StartLocatorCommand implements GfshCommand { && locatorState.isStartingOrNotResponding()); } finally { // stop will close - stderrReader.stopAsync(StartMemberUtils.PROCESS_STREAM_READER_ASYNC_STOP_TIMEOUT_MILLIS); + stderrReader.stopAsync(PROCESS_STREAM_READER_ASYNC_STOP_TIMEOUT_MILLIS); // ErrorStream getGfsh().getSignalHandler().unregisterListener(locatorSignalListener); @@ -324,6 +320,7 @@ public class StartLocatorCommand implements GfshCommand { SystemFailure.initiateFailure(e); throw e; } catch (Throwable t) { + t.printStackTrace(); SystemFailure.checkFailure(); String errorMessage = String.format(CliStrings.START_LOCATOR__GENERAL_ERROR_MESSAGE, StringUtils.defaultIfBlank(workingDirectory, memberName), @@ -439,19 +436,19 @@ public class StartLocatorCommand implements GfshCommand { final String maxHeap) throws MalformedObjectNameException { List<String> commandLine = new ArrayList<>(); - commandLine.add(StartMemberUtils.getJavaPath()); + commandLine.add(getJavaPath()); commandLine.add("-server"); commandLine.add("-classpath"); commandLine .add(getLocatorClasspath(Boolean.TRUE.equals(includeSystemClasspath), userClasspath)); - StartMemberUtils.addCurrentLocators(this, commandLine, gemfireProperties); - StartMemberUtils.addGemFirePropertyFile(commandLine, gemfirePropertiesFile); - StartMemberUtils.addGemFireSecurityPropertyFile(commandLine, gemfireSecurityPropertiesFile); - StartMemberUtils.addGemFireSystemProperties(commandLine, gemfireProperties); - StartMemberUtils.addJvmArgumentsAndOptions(commandLine, jvmArgsOpts); - StartMemberUtils.addInitialHeap(commandLine, initialHeap); - StartMemberUtils.addMaxHeap(commandLine, maxHeap); + addCurrentLocators(this, commandLine, gemfireProperties); + addGemFirePropertyFile(commandLine, gemfirePropertiesFile); + addGemFireSecurityPropertyFile(commandLine, gemfireSecurityPropertiesFile); + addGemFireSystemProperties(commandLine, gemfireProperties); + addJvmArgumentsAndOptions(commandLine, jvmArgsOpts); + addInitialHeap(commandLine, initialHeap); + addMaxHeap(commandLine, maxHeap); commandLine.add( "-D".concat(AbstractLauncher.SIGNAL_HANDLER_REGISTRATION_SYSTEM_PROPERTY.concat("=true"))); @@ -492,7 +489,7 @@ public class StartLocatorCommand implements GfshCommand { } String getLocatorClasspath(final boolean includeSystemClasspath, final String userClasspath) { - return StartMemberUtils.toClasspath(includeSystemClasspath, - new String[] {StartMemberUtils.CORE_DEPENDENCIES_JAR_PATHNAME}, userClasspath); + return toClasspath(includeSystemClasspath, new String[] {CORE_DEPENDENCIES_JAR_PATHNAME}, + userClasspath); } } http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberCommand.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberCommand.java new file mode 100644 index 0000000..6bdc25c --- /dev/null +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberCommand.java @@ -0,0 +1,248 @@ +/* + * 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 org.apache.geode.management.internal.cli.commands; + +import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS; +import static org.apache.geode.management.internal.cli.shell.MXBeanProvider.getDistributedSystemMXBean; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import javax.management.MalformedObjectNameException; + +import org.apache.commons.lang.ArrayUtils; + +import org.apache.geode.distributed.internal.DistributionConfig; +import org.apache.geode.internal.GemFireVersion; +import org.apache.geode.internal.process.ProcessLauncherContext; +import org.apache.geode.internal.util.IOUtils; +import org.apache.geode.management.DistributedSystemMXBean; +import org.apache.geode.management.internal.cli.util.ThreePhraseGenerator; + +/** + * Encapsulates methods used by StartServerCommand and StartLocatorCommand and their associated + * tests. + * + * @see StartLocatorCommand + * @see StartServerCommand + */ +public class StartMemberCommand { + public static final String GEODE_HOME = System.getenv("GEODE_HOME"); + + private static final String JAVA_HOME = System.getProperty("java.home"); + static final int CMS_INITIAL_OCCUPANCY_FRACTION = 60; + private static final ThreePhraseGenerator nameGenerator = new ThreePhraseGenerator(); + + static final String CORE_DEPENDENCIES_JAR_PATHNAME = + IOUtils.appendToPath(GEODE_HOME, "lib", "geode-dependencies.jar"); + static final String GEODE_JAR_PATHNAME = + IOUtils.appendToPath(GEODE_HOME, "lib", GemFireVersion.getGemFireJarFileName()); + static final long PROCESS_STREAM_READER_ASYNC_STOP_TIMEOUT_MILLIS = 5 * 1000; + static final int INVALID_PID = -1; + + static ThreePhraseGenerator getNameGenerator() { + return nameGenerator; + } + + void setPropertyIfNotNull(Properties properties, String key, Object value) { + if (key != null && value != null) { + properties.setProperty(key, value.toString()); + } + } + + String resolveWorkingDir(String userSpecifiedDir, String memberName) { + File workingDir = + (userSpecifiedDir == null) ? new File(memberName) : new File(userSpecifiedDir); + String workingDirPath = IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDir); + if (!workingDir.exists()) { + if (!workingDir.mkdirs()) { + throw new IllegalStateException(String.format( + "Could not create directory %s. Please verify directory path or user permissions.", + workingDirPath)); + } + } + return workingDirPath; + } + + void addGemFirePropertyFile(final List<String> commandLine, final File gemfirePropertiesFile) { + if (gemfirePropertiesFile != null) { + commandLine.add("-DgemfirePropertyFile=" + gemfirePropertiesFile.getAbsolutePath()); + } + } + + void addGemFireSecurityPropertyFile(final List<String> commandLine, + final File gemfireSecurityPropertiesFile) { + if (gemfireSecurityPropertiesFile != null) { + commandLine + .add("-DgemfireSecurityPropertyFile=" + gemfireSecurityPropertiesFile.getAbsolutePath()); + } + } + + void addGemFireSystemProperties(final List<String> commandLine, + final Properties gemfireProperties) { + for (final Object property : gemfireProperties.keySet()) { + final String propertyName = property.toString(); + final String propertyValue = gemfireProperties.getProperty(propertyName); + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(propertyValue)) { + commandLine.add( + "-D" + DistributionConfig.GEMFIRE_PREFIX + "" + propertyName + "=" + propertyValue); + } + } + } + + void addJvmArgumentsAndOptions(final List<String> commandLine, final String[] jvmArgsOpts) { + if (jvmArgsOpts != null) { + commandLine.addAll(Arrays.asList(jvmArgsOpts)); + } + } + + void addInitialHeap(final List<String> commandLine, final String initialHeap) { + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(initialHeap)) { + commandLine.add("-Xms" + initialHeap); + } + } + + void addMaxHeap(final List<String> commandLine, final String maxHeap) { + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(maxHeap)) { + commandLine.add("-Xmx" + maxHeap); + commandLine.add("-XX:+UseConcMarkSweepGC"); + commandLine.add("-XX:CMSInitiatingOccupancyFraction=" + CMS_INITIAL_OCCUPANCY_FRACTION); + // commandLine.add("-XX:MinHeapFreeRatio=" + MINIMUM_HEAP_FREE_RATIO); + } + } + + void addCurrentLocators(GfshCommand gfshCommand, final List<String> commandLine, + final Properties gemfireProperties) throws MalformedObjectNameException { + if (org.apache.geode.internal.lang.StringUtils + .isBlank(gemfireProperties.getProperty(LOCATORS))) { + String currentLocators = getCurrentLocators(gfshCommand); + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(currentLocators)) { + commandLine.add("-D".concat(ProcessLauncherContext.OVERRIDDEN_DEFAULTS_PREFIX) + .concat(LOCATORS).concat("=").concat(currentLocators)); + } + } + } + + String getCurrentLocators(GfshCommand gfshCommand) throws MalformedObjectNameException { + String delimitedLocators = ""; + try { + if (gfshCommand.isConnectedAndReady()) { + final DistributedSystemMXBean dsMBeanProxy = getDistributedSystemMXBean(); + if (dsMBeanProxy != null) { + final String[] locators = dsMBeanProxy.listLocators(); + if (locators != null && locators.length > 0) { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < locators.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(locators[i]); + } + delimitedLocators = sb.toString(); + } + } + } + } catch (IOException e) { // thrown by getDistributedSystemMXBean + // leave delimitedLocators = "" + gfshCommand.getGfsh().logWarning("DistributedSystemMXBean is unavailable\n", e); + } + return delimitedLocators; + } + + int readPid(final File pidFile) { + assert pidFile != null : "The file from which to read the process ID (pid) cannot be null!"; + if (pidFile.isFile()) { + BufferedReader fileReader = null; + try { + fileReader = new BufferedReader(new FileReader(pidFile)); + return Integer.parseInt(fileReader.readLine()); + } catch (IOException | NumberFormatException ignore) { + } finally { + IOUtils.close(fileReader); + } + } + return INVALID_PID; + } + + String getJavaPath() { + return new File(new File(JAVA_HOME, "bin"), "java").getPath(); + } + + String getSystemClasspath() { + return System.getProperty("java.class.path"); + } + + String toClasspath(final boolean includeSystemClasspath, String[] jarFilePathnames, + String... userClasspaths) { + // gemfire jar must absolutely be the first JAR file on the CLASSPATH!!! + StringBuilder classpath = new StringBuilder(getGemFireJarPath()); + + userClasspaths = (userClasspaths != null ? userClasspaths : ArrayUtils.EMPTY_STRING_ARRAY); + + // Then, include user-specified classes on CLASSPATH to enable the user to override GemFire JAR + // dependencies + // with application-specific versions; this logic/block corresponds to classes/jar-files + // specified with the + // --classpath option to the 'start locator' and 'start server commands'; also this will + // override any + // System CLASSPATH environment variable setting, which is consistent with the Java platform + // behavior... + for (String userClasspath : userClasspaths) { + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(userClasspath)) { + classpath.append((classpath.length() == 0) + ? org.apache.geode.internal.lang.StringUtils.EMPTY : File.pathSeparator); + classpath.append(userClasspath); + } + } + + // Now, include any System-specified CLASSPATH environment variable setting... + if (includeSystemClasspath) { + classpath.append(File.pathSeparator); + classpath.append(getSystemClasspath()); + } + + jarFilePathnames = + (jarFilePathnames != null ? jarFilePathnames : ArrayUtils.EMPTY_STRING_ARRAY); + + // And finally, include all GemFire dependencies on the CLASSPATH... + for (String jarFilePathname : jarFilePathnames) { + if (org.apache.geode.internal.lang.StringUtils.isNotBlank(jarFilePathname)) { + classpath.append((classpath.length() == 0) + ? org.apache.geode.internal.lang.StringUtils.EMPTY : File.pathSeparator); + classpath.append(jarFilePathname); + } + } + return classpath.toString(); + } + + String getGemFireJarPath() { + String classpath = getSystemClasspath(); + String gemfireJarPath = GEODE_JAR_PATHNAME; + for (String classpathElement : classpath.split(File.pathSeparator)) { + // MUST CHANGE THIS TO REGEX SINCE VERSION CHANGES IN JAR NAME + if (classpathElement.endsWith("gemfire-core-8.2.0.0-SNAPSHOT.jar")) { + gemfireJarPath = classpathElement; + break; + } + } + return gemfireJarPath; + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/210ff9f1/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberUtils.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberUtils.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberUtils.java deleted file mode 100644 index 3e1053a..0000000 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartMemberUtils.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * 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 org.apache.geode.management.internal.cli.commands; - -import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS; -import static org.apache.geode.management.internal.cli.shell.MXBeanProvider.getDistributedSystemMXBean; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; - -import javax.management.MalformedObjectNameException; - -import org.apache.commons.lang.ArrayUtils; - -import org.apache.geode.distributed.internal.DistributionConfig; -import org.apache.geode.internal.GemFireVersion; -import org.apache.geode.internal.process.ProcessLauncherContext; -import org.apache.geode.internal.util.IOUtils; -import org.apache.geode.management.DistributedSystemMXBean; -import org.apache.geode.management.internal.cli.util.ThreePhraseGenerator; - -/** - * Encapsulates methods used by StartServerCommand and StartLocatorCommand and their associated - * tests. - * - * @see StartLocatorCommand - * @see StartServerCommand - */ -public class StartMemberUtils { - public static final String GEODE_HOME = System.getenv("GEODE_HOME"); - - private static final String JAVA_HOME = System.getProperty("java.home"); - static final int CMS_INITIAL_OCCUPANCY_FRACTION = 60; - private static final ThreePhraseGenerator nameGenerator = new ThreePhraseGenerator(); - - static final String CORE_DEPENDENCIES_JAR_PATHNAME = - IOUtils.appendToPath(GEODE_HOME, "lib", "geode-dependencies.jar"); - static final String GEODE_JAR_PATHNAME = - IOUtils.appendToPath(GEODE_HOME, "lib", GemFireVersion.getGemFireJarFileName()); - static final long PROCESS_STREAM_READER_ASYNC_STOP_TIMEOUT_MILLIS = 5 * 1000; - static final int INVALID_PID = -1; - - static ThreePhraseGenerator getNameGenerator() { - return nameGenerator; - } - - static void setPropertyIfNotNull(Properties properties, String key, Object value) { - if (key != null && value != null) { - properties.setProperty(key, value.toString()); - } - } - - static String resolveWorkingDir(String userSpecifiedDir, String memberName) { - File workingDir = - (userSpecifiedDir == null) ? new File(memberName) : new File(userSpecifiedDir); - String workingDirPath = IOUtils.tryGetCanonicalPathElseGetAbsolutePath(workingDir); - if (!workingDir.exists()) { - if (!workingDir.mkdirs()) { - throw new IllegalStateException(String.format( - "Could not create directory %s. Please verify directory path or user permissions.", - workingDirPath)); - } - } - return workingDirPath; - } - - static void addGemFirePropertyFile(final List<String> commandLine, - final File gemfirePropertiesFile) { - if (gemfirePropertiesFile != null) { - commandLine.add("-DgemfirePropertyFile=" + gemfirePropertiesFile.getAbsolutePath()); - } - } - - static void addGemFireSecurityPropertyFile(final List<String> commandLine, - final File gemfireSecurityPropertiesFile) { - if (gemfireSecurityPropertiesFile != null) { - commandLine - .add("-DgemfireSecurityPropertyFile=" + gemfireSecurityPropertiesFile.getAbsolutePath()); - } - } - - static void addGemFireSystemProperties(final List<String> commandLine, - final Properties gemfireProperties) { - for (final Object property : gemfireProperties.keySet()) { - final String propertyName = property.toString(); - final String propertyValue = gemfireProperties.getProperty(propertyName); - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(propertyValue)) { - commandLine.add( - "-D" + DistributionConfig.GEMFIRE_PREFIX + "" + propertyName + "=" + propertyValue); - } - } - } - - static void addJvmArgumentsAndOptions(final List<String> commandLine, - final String[] jvmArgsOpts) { - if (jvmArgsOpts != null) { - commandLine.addAll(Arrays.asList(jvmArgsOpts)); - } - } - - static void addInitialHeap(final List<String> commandLine, final String initialHeap) { - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(initialHeap)) { - commandLine.add("-Xms" + initialHeap); - } - } - - static void addMaxHeap(final List<String> commandLine, final String maxHeap) { - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(maxHeap)) { - commandLine.add("-Xmx" + maxHeap); - commandLine.add("-XX:+UseConcMarkSweepGC"); - commandLine.add("-XX:CMSInitiatingOccupancyFraction=" + CMS_INITIAL_OCCUPANCY_FRACTION); - // commandLine.add("-XX:MinHeapFreeRatio=" + MINIMUM_HEAP_FREE_RATIO); - } - } - - static void addCurrentLocators(GfshCommand gfshCommand, final List<String> commandLine, - final Properties gemfireProperties) throws MalformedObjectNameException { - if (org.apache.geode.internal.lang.StringUtils - .isBlank(gemfireProperties.getProperty(LOCATORS))) { - String currentLocators = getCurrentLocators(gfshCommand); - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(currentLocators)) { - commandLine.add("-D".concat(ProcessLauncherContext.OVERRIDDEN_DEFAULTS_PREFIX) - .concat(LOCATORS).concat("=").concat(currentLocators)); - } - } - } - - private static String getCurrentLocators(GfshCommand gfshCommand) - throws MalformedObjectNameException { - String delimitedLocators = ""; - try { - if (gfshCommand.isConnectedAndReady()) { - final DistributedSystemMXBean dsMBeanProxy = getDistributedSystemMXBean(); - if (dsMBeanProxy != null) { - final String[] locators = dsMBeanProxy.listLocators(); - if (locators != null && locators.length > 0) { - final StringBuilder sb = new StringBuilder(); - for (int i = 0; i < locators.length; i++) { - if (i > 0) { - sb.append(","); - } - sb.append(locators[i]); - } - delimitedLocators = sb.toString(); - } - } - } - } catch (IOException e) { // thrown by getDistributedSystemMXBean - // leave delimitedLocators = "" - gfshCommand.getGfsh().logWarning("DistributedSystemMXBean is unavailable\n", e); - } - return delimitedLocators; - } - - public static int readPid(final File pidFile) { - assert pidFile != null : "The file from which to read the process ID (pid) cannot be null!"; - if (pidFile.isFile()) { - BufferedReader fileReader = null; - try { - fileReader = new BufferedReader(new FileReader(pidFile)); - return Integer.parseInt(fileReader.readLine()); - } catch (IOException | NumberFormatException ignore) { - } finally { - IOUtils.close(fileReader); - } - } - return INVALID_PID; - } - - static String getJavaPath() { - return new File(new File(JAVA_HOME, "bin"), "java").getPath(); - } - - static String getSystemClasspath() { - return System.getProperty("java.class.path"); - } - - static String toClasspath(final boolean includeSystemClasspath, String[] jarFilePathnames, - String... userClasspaths) { - // gemfire jar must absolutely be the first JAR file on the CLASSPATH!!! - StringBuilder classpath = new StringBuilder(getGemFireJarPath()); - - userClasspaths = (userClasspaths != null ? userClasspaths : ArrayUtils.EMPTY_STRING_ARRAY); - - // Then, include user-specified classes on CLASSPATH to enable the user to override GemFire JAR - // dependencies - // with application-specific versions; this logic/block corresponds to classes/jar-files - // specified with the - // --classpath option to the 'start locator' and 'start server commands'; also this will - // override any - // System CLASSPATH environment variable setting, which is consistent with the Java platform - // behavior... - for (String userClasspath : userClasspaths) { - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(userClasspath)) { - classpath.append((classpath.length() == 0) - ? org.apache.geode.internal.lang.StringUtils.EMPTY : File.pathSeparator); - classpath.append(userClasspath); - } - } - - // Now, include any System-specified CLASSPATH environment variable setting... - if (includeSystemClasspath) { - classpath.append(File.pathSeparator); - classpath.append(getSystemClasspath()); - } - - jarFilePathnames = - (jarFilePathnames != null ? jarFilePathnames : ArrayUtils.EMPTY_STRING_ARRAY); - - // And finally, include all GemFire dependencies on the CLASSPATH... - for (String jarFilePathname : jarFilePathnames) { - if (org.apache.geode.internal.lang.StringUtils.isNotBlank(jarFilePathname)) { - classpath.append((classpath.length() == 0) - ? org.apache.geode.internal.lang.StringUtils.EMPTY : File.pathSeparator); - classpath.append(jarFilePathname); - } - } - return classpath.toString(); - } - - static String getGemFireJarPath() { - String classpath = getSystemClasspath(); - String gemfireJarPath = GEODE_JAR_PATHNAME; - for (String classpathElement : classpath.split(File.pathSeparator)) { - // MUST CHANGE THIS TO REGEX SINCE VERSION CHANGES IN JAR NAME - if (classpathElement.endsWith("gemfire-core-8.2.0.0-SNAPSHOT.jar")) { - gemfireJarPath = classpathElement; - break; - } - } - return gemfireJarPath; - } -}