/*
* 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.ENABLE_CLUSTER_CONFIGURATION;
import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.NAME;
import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION;
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.assertNull;
import static org.apache.geode.test.dunit.Assert.assertTrue;
import static org.apache.geode.test.dunit.Assert.fail;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.DiskStoreFactory;
import org.apache.geode.cache.EvictionAction;
import org.apache.geode.cache.EvictionAttributes;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionFactory;
import org.apache.geode.cache.query.Index;
import org.apache.geode.distributed.Locator;
import org.apache.geode.distributed.internal.ClusterConfigurationService;
import org.apache.geode.distributed.internal.InternalLocator;
import org.apache.geode.internal.AvailablePort;
import org.apache.geode.internal.AvailablePortHelper;
import org.apache.geode.management.cli.Result;
import org.apache.geode.management.cli.Result.Status;
import org.apache.geode.management.internal.cli.domain.Stock;
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.Assert;
import org.apache.geode.test.dunit.Host;
import org.apache.geode.test.dunit.LogWriterUtils;
import org.apache.geode.test.dunit.SerializableCallable;
import org.apache.geode.test.dunit.SerializableRunnable;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.Wait;
import org.apache.geode.test.dunit.WaitCriterion;
import org.apache.geode.test.junit.categories.DistributedTest;
import org.apache.geode.test.junit.categories.FlakyTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;
@Category(DistributedTest.class)
public class IndexCommandsDUnitTest extends CliCommandTestBase {
private static final long serialVersionUID = 1L;
private static final String VM1Name = "VM1";
private static final String group1 = "G1";
private static final String indexName = "Id1";
private static final String parRegPersName = "ParRegPers";
private static final String repRegPersName = "RepRegPer";
Region<?, ?> createParReg(String regionName, Cache cache, Class keyConstraint,
Class valueConstraint) {
RegionFactory regionFactory = cache.createRegionFactory();
regionFactory.setDataPolicy(DataPolicy.PARTITION);
regionFactory.setKeyConstraint(keyConstraint);
regionFactory.setValueConstraint(valueConstraint);
return regionFactory.create(regionName);
}
private Region<?, ?> createParRegWithPersistence(String regionName, String diskStoreName,
String diskDirName) {
Cache cache = getCache();
File diskStoreDirFile = new File(diskDirName);
diskStoreDirFile.deleteOnExit();
if (!diskStoreDirFile.exists()) {
diskStoreDirFile.mkdirs();
}
DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory();
diskStoreFactory.setDiskDirs(new File[] {diskStoreDirFile});
diskStoreFactory.setMaxOplogSize(1);
diskStoreFactory.setAllowForceCompaction(true);
diskStoreFactory.setAutoCompact(false);
diskStoreFactory.create(diskStoreName);
/****
* Eviction Attributes
*/
EvictionAttributes ea =
EvictionAttributes.createLRUEntryAttributes(1, EvictionAction.OVERFLOW_TO_DISK);
RegionFactory regionFactory = cache.createRegionFactory();
regionFactory.setDiskStoreName(diskStoreName);
regionFactory.setDiskSynchronous(true);
regionFactory.setDataPolicy(DataPolicy.PERSISTENT_PARTITION);
regionFactory.setEvictionAttributes(ea);
return regionFactory.create(regionName);
}
private Region<?, ?> createRepRegWithPersistence(String regionName, String diskStoreName,
String diskDirName) {
Cache cache = getCache();
File diskStoreDirFile = new File(diskDirName);
diskStoreDirFile.deleteOnExit();
if (!diskStoreDirFile.exists()) {
diskStoreDirFile.mkdirs();
}
DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory();
diskStoreFactory.setDiskDirs(new File[] {diskStoreDirFile});
diskStoreFactory.setMaxOplogSize(1);
diskStoreFactory.setAllowForceCompaction(true);
diskStoreFactory.setAutoCompact(false);
diskStoreFactory.create(diskStoreName);
/****
* Eviction Attributes
*/
EvictionAttributes ea =
EvictionAttributes.createLRUEntryAttributes(1, EvictionAction.OVERFLOW_TO_DISK);
RegionFactory regionFactory = cache.createRegionFactory();
regionFactory.setDiskStoreName(diskStoreName);
regionFactory.setDiskSynchronous(true);
regionFactory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
regionFactory.setEvictionAttributes(ea);
return regionFactory.create(regionName);
}
public void testCreateKeyIndexOnRegionWithPersistence() {
setupSystemPersist();
// Creating key indexes on Persistent Partitioned Region
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, "id1");
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "ty");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + parRegPersName);
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key");
String commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("Command Result :\n", resultAsString);
assertTrue(Status.OK.equals(commandResult.getStatus()));
// Creating key indexes on Persistent Replicated Regions
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, "id2");
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "ee");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + repRegPersName);
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key");
commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command Result :\n", resultAsString);
assertTrue(Status.OK.equals(commandResult.getStatus()));
}
public void testCreateAndDestroyIndex() {
setupSystem();
/***
* Basic Create and Destroy
*/
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
String commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("testCreateAndDestroyIndex", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(resultAsString.contains(indexName));
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg");
commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("testCreateAndDestroyIndex", resultAsString);
assertEquals(commandResult.getStatus(), Status.OK);
commandResult = executeCommand(CliStrings.LIST_INDEX);
resultAsString = commandResultToString(commandResult);
assertEquals(commandResult.getStatus(), Status.OK);
assertFalse(resultAsString.contains(indexName));
}
public void testCreateIndexMultipleIterators() {
setupSystem();
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "\"h.low\"");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "\"/StocksParReg s, s.history h\"");
String commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("testCreateIndexMultipleIterators", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("testCreateIndexMultipleIterators", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(resultAsString.contains(indexName));
}
@Category(FlakyTest.class) // GEODE-1048: HeadlessGFSH, random ports
@Test
public void testCreateMultipleIndexes() {
setupSystem();
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
String commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("testCreateMultipleIndexes", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName + "2");
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb = new CommandStringBuilder(CliStrings.CREATE_DEFINED_INDEXES);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(resultAsString.contains(indexName));
}
@Category(FlakyTest.class) // GEODE-689: random ports, unused returns, HeadlessGfsh
@Test
public void testClearMultipleIndexes() {
setupSystem();
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
String commandString = csb.toString();
writeToLog("Command String :\n ", commandString);
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("testClearMultipleIndexes", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName + "2");
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb = new CommandStringBuilder(CliStrings.CLEAR_DEFINED_INDEXES);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(!resultAsString.contains(indexName));
}
@Test
public void testCreateAndDestroyIndexOnMember() {
setupSystem();
/***
* Basic Create and Destroy
*/
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__MEMBER, VM1Name);
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key");
String commandString = csb.toString();
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnMember", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnMember", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(resultAsString.contains(indexName));
assertTrue(resultAsString.contains(VM1Name));
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.DESTROY_INDEX__MEMBER, VM1Name);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnMember", resultAsString);
assertEquals(commandResult.getStatus(), Status.OK);
commandResult = executeCommand(CliStrings.LIST_INDEX);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnMember", resultAsString);
assertEquals(commandResult.getStatus(), Status.OK);
assertFalse(resultAsString.contains(VM1Name));
}
@Category(FlakyTest.class) // GEODE-1684
@Test
public void testCreateAndDestroyIndexOnGroup() {
setupSystem();
/***
* Basic Create and Destroy
*/
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
csb.addOption(CliStrings.CREATE_INDEX__GROUP, group1);
String commandString = csb.toString();
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertEquals(true, resultAsString.contains(indexName));
assertEquals(true, resultAsString.contains(VM1Name));
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.DESTROY_INDEX__GROUP, group1);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString);
assertEquals(commandResult.getStatus(), Status.OK);
commandResult = executeCommand(CliStrings.LIST_INDEX);
resultAsString = commandResultToString(commandResult);
assertEquals(commandResult.getStatus(), Status.OK);
assertFalse(resultAsString.contains(VM1Name));
/***
* In case of a partitioned region , the index might get created on a member which hosts the
* region and is not the member of the group1
*/
if (resultAsString.contains(indexName)) {
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(commandResult.getStatus(), Status.OK);
commandResult = executeCommand(CliStrings.LIST_INDEX);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString);
assertEquals(commandResult.getStatus(), Status.OK);
assertFalse(resultAsString.contains(indexName));
assertTrue(resultAsString.contains(CliStrings.LIST_INDEX__INDEXES_NOT_FOUND_MESSAGE));
}
}
@Test
public void testCreateAndDestroyIndexWithIncorrectInput() {
setupSystem();
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
String commandString = csb.toString();
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
assertEquals(commandResult.getStatus(), Status.OK);
// CREATE the same index
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
// assertTrue(resultAsString.contains(CliStrings.format(CliStrings.CREATE_INDEX__NAME__CONFLICT,
// indexName)));
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
// Create index on a wrong regionPath
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocsParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
// assertTrue(resultAsString.contains(CliStrings.format(CliStrings.CREATE_INDEX__INVALID__REGIONPATH,
// "/StocsParReg")));
// Create index with wrong expression
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, "Id2");
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "rey");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
// Create index with wrong type
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "bash");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(resultAsString.contains(CliStrings.CREATE_INDEX__INVALID__INDEX__TYPE__MESSAGE));
assertTrue(commandResult.getStatus().equals(Status.ERROR));
// Destroy index with incorrect indexName
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, "Id2");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
assertTrue(resultAsString
.contains(CliStrings.format(CliStrings.DESTROY_INDEX__INDEX__NOT__FOUND, "Id2")));
// Destroy index with incorrect region
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "Region");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
assertTrue(resultAsString
.contains(CliStrings.format(CliStrings.DESTROY_INDEX__REGION__NOT__FOUND, "Region")));
// Destroy index with incorrect memberName
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "Region");
csb.addOption(CliStrings.DESTROY_INDEX__MEMBER, "wrongOne");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
// Destroy index with no option
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
writeToLog("Command String :\n ", commandString);
writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString);
assertTrue(commandResult.getStatus().equals(Status.ERROR));
}
@Category(FlakyTest.class) // GEODE-1315
@Test
public void testDestroyIndexWithoutIndexName() {
setupSystem();
CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
String commandString = csb.toString();
CommandResult commandResult = executeCommand(commandString);
String resultAsString = commandResultToString(commandResult);
assertEquals(commandResult.getStatus(), Status.OK);
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertEquals(true, resultAsString.contains(indexName));
assertEquals(true, resultAsString.contains(VM1Name));
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__GROUP, group1);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.CREATE_INDEX);
csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg");
csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
csb.addOption(CliStrings.DESTROY_INDEX__REGION, "StocksParReg");
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
csb = new CommandStringBuilder(CliStrings.LIST_INDEX);
commandString = csb.toString();
commandResult = executeCommand(commandString);
resultAsString = commandResultToString(commandResult);
assertEquals(Status.OK, commandResult.getStatus());
assertTrue(resultAsString.contains(CliStrings.LIST_INDEX__INDEXES_NOT_FOUND_MESSAGE));
}
/**
* Asserts that creating and destroying indexes correctly updates the shared configuration.
*/
@Category(FlakyTest.class) // GEODE-1954
@Test
public void testCreateDestroyUpdatesSharedConfig() {
disconnectAllFromDS();
final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2);
jmxPort = ports[0];
httpPort = ports[1];
try {
jmxHost = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException ignore) {
jmxHost = "localhost";
}
final String regionName = "testIndexSharedConfigRegion";
final String groupName = "testIndexSharedConfigGroup";
final Properties locatorProps = new Properties();
locatorProps.setProperty(NAME, "Locator");
locatorProps.setProperty(MCAST_PORT, "0");
locatorProps.setProperty(LOG_LEVEL, "fine");
locatorProps.setProperty(ENABLE_CLUSTER_CONFIGURATION, "true");
locatorProps.setProperty(JMX_MANAGER, "true");
locatorProps.setProperty(JMX_MANAGER_START, "true");
locatorProps.setProperty(JMX_MANAGER_BIND_ADDRESS, String.valueOf(jmxHost));
locatorProps.setProperty(JMX_MANAGER_PORT, String.valueOf(jmxPort));
locatorProps.setProperty(HTTP_SERVICE_PORT, String.valueOf(httpPort));
// Start the Locator and wait for shared configuration to be available
final int locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
Host.getHost(0).getVM(0).invoke(new SerializableRunnable() {
@Override
public void run() {
final File locatorLogFile = new File("locator-" + locatorPort + ".log");
try {
final InternalLocator locator = (InternalLocator) Locator.startLocatorAndDS(locatorPort,
locatorLogFile, null, locatorProps);
WaitCriterion wc = new WaitCriterion() {
@Override
public boolean done() {
return locator.isSharedConfigurationRunning();
}
@Override
public String description() {
return "Waiting for shared configuration to be started";
}
};
Wait.waitForCriterion(wc, 5000, 500, true);
} catch (IOException ioex) {
fail("Unable to create a locator with a shared configuration");
}
}
});
// Start the default manager
connect(jmxHost, jmxPort, httpPort, getDefaultShell());
// Create a cache in VM 1
VM vm = Host.getHost(0).getVM(1);
vm.invoke(new SerializableRunnable() {
@Override
public void run() {
Properties localProps = new Properties();
localProps.setProperty(MCAST_PORT, "0");
localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]");
localProps.setProperty(GROUPS, groupName);
getSystem(localProps);
assertNotNull(getCache());
Region parReg = createParReg(regionName, getCache(), String.class, Stock.class);
parReg.put("VMW", new Stock("VMW", 98));
}
});
// Test creating the index
CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_INDEX);
commandStringBuilder.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key");
commandStringBuilder.addOption(CliStrings.CREATE_INDEX__NAME, indexName);
commandStringBuilder.addOption(CliStrings.CREATE_INDEX__GROUP, groupName);
commandStringBuilder.addOption(CliStrings.CREATE_INDEX__REGION, "\"/" + regionName + " p\"");
CommandResult cmdResult = executeCommand(commandStringBuilder.toString());
assertEquals(Result.Status.OK, cmdResult.getStatus());
// Make sure the index exists in the shared config
Host.getHost(0).getVM(0).invoke(new SerializableRunnable() {
@Override
public void run() {
ClusterConfigurationService sharedConfig =
((InternalLocator) Locator.getLocator()).getSharedConfiguration();
String xmlFromConfig;
try {
xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent();
assertTrue(xmlFromConfig.contains(indexName));
} catch (Exception e) {
Assert.fail("Error occurred in cluster configuration service", e);
}
}
});
// Restart a member and make sure he gets the shared configuration
vm = Host.getHost(0).getVM(1);
vm.invoke(new SerializableRunnable() {
@Override
public void run() {
getCache().close();
Properties localProps = new Properties();
localProps.setProperty(MCAST_PORT, "0");
localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]");
localProps.setProperty(GROUPS, groupName);
localProps.setProperty(USE_CLUSTER_CONFIGURATION, "true");
getSystem(localProps);
Cache cache = getCache();
assertNotNull(cache);
Region region = cache.getRegion(regionName);
assertNotNull(region);
Index index = cache.getQueryService().getIndex(region, indexName);
assertNotNull(index);
}
});
// Test destroying the index
commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_INDEX);
commandStringBuilder.addOption(CliStrings.DESTROY_INDEX__NAME, indexName);
commandStringBuilder.addOption(CliStrings.DESTROY_INDEX__GROUP, groupName);
commandStringBuilder.addOption(CliStrings.DESTROY_INDEX__REGION, "/" + regionName);
cmdResult = executeCommand(commandStringBuilder.toString());
assertEquals(Result.Status.OK, cmdResult.getStatus());
// Make sure the index was removed from the shared config
Host.getHost(0).getVM(0).invoke(new SerializableRunnable() {
@Override
public void run() {
ClusterConfigurationService sharedConfig =
((InternalLocator) Locator.getLocator()).getSharedConfiguration();
String xmlFromConfig;
try {
xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent();
assertFalse(xmlFromConfig.contains(indexName));
} catch (Exception e) {
Assert.fail("Error occurred in cluster configuration service", e);
}
}
});
// Restart the data member cache to make sure that the index is destroyed.
vm = Host.getHost(0).getVM(1);
vm.invoke(new SerializableRunnable() {
@Override
public void run() {
getCache().close();
Properties localProps = new Properties();
localProps.setProperty(MCAST_PORT, "0");
localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]");
localProps.setProperty(GROUPS, groupName);
localProps.setProperty(USE_CLUSTER_CONFIGURATION, "true");
getSystem(localProps);
Cache cache = getCache();
assertNotNull(cache);
Region region = cache.getRegion(regionName);
assertNotNull(region);
Index index = cache.getQueryService().getIndex(region, indexName);
assertNull(index);
}
});
}
private void writeToLog(String text, String resultAsString) {
LogWriterUtils.getLogWriter().info(getTestMethodName() + "\n");
LogWriterUtils.getLogWriter().info(resultAsString);
}
private void setupSystem() {
disconnectAllFromDS();
setUpJmxManagerOnVm0ThenConnect(null);
final String parRegName = "StocksParReg";
final VM manager = Host.getHost(0).getVM(0);
final VM vm1 = Host.getHost(0).getVM(1);
manager.invoke(new SerializableCallable() {
public Object call() {
Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class);
parReg.put("VMW", new Stock("VMW", 98));
return parReg.put("APPL", new Stock("APPL", 600));
}
});
vm1.invoke(new SerializableCallable() {
@Override
public Object call() throws Exception {
Properties props = new Properties();
props.setProperty(NAME, VM1Name);
props.setProperty(GROUPS, group1);
getSystem(props);
Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class);
parReg.put("MSFT", new Stock("MSFT", 27));
return parReg.put("GOOG", new Stock("GOOG", 540));
}
});
}
private void setupSystemPersist() {
disconnectAllFromDS();
setUpJmxManagerOnVm0ThenConnect(null);
final String parRegName = "StocksParReg";
final VM manager = Host.getHost(0).getVM(0);
final VM vm1 = Host.getHost(0).getVM(1);
manager.invoke(new SerializableCallable() {
public Object call() {
Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class);
parReg.put("VMW", new Stock("VMW", 98));
Region parRegPers = createParRegWithPersistence(parRegPersName, "testCreateIndexDiskstore1",
"testCreateIndexDiskDir1");
Region repRegPers = createRepRegWithPersistence(repRegPersName, "testCreateIndexDiskstore1",
"testCreateIndexDiskDir1");
return parReg.put("APPL", new Stock("APPL", 600));
}
});
vm1.invoke(new SerializableCallable() {
@Override
public Object call() throws Exception {
Properties props = new Properties();
props.setProperty(NAME, VM1Name);
props.setProperty(GROUPS, group1);
getSystem(props);
Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class);
parReg.put("MSFT", new Stock("MSFT", 27));
Region parRegPers = createParRegWithPersistence(parRegPersName, "testCreateIndexDiskstore2",
"testCreateIndexDiskDir2");
Region repRegPers = createRepRegWithPersistence(repRegPersName, "testCreateIndexDiskstore2",
"testCreateIndexDiskDir2");
return parReg.put("GOOG", new Stock("GOOG", 540));
}
});
}
}