blob: 8fabaa0d07fc32b0c76936fb20c332f423115c21 [file] [log] [blame]
/*
* 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;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_TIME_STATISTICS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_HTTP_PORT;
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.LOG_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_SAMPLING_ENABLED;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.management.ObjectName;
import org.junit.Rule;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.RegionFactory;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache30.CacheTestCase;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.management.internal.SystemManagementService;
import org.apache.geode.test.awaitility.GeodeAwaitility;
import org.apache.geode.test.dunit.Host;
import org.apache.geode.test.dunit.SerializableCallable;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.WaitCriterion;
import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
@SuppressWarnings("serial")
public abstract class ManagementTestBase extends CacheTestCase {
private static final int MAX_WAIT = 70 * 1000;
protected static ManagementService managementService;
/**
* List containing all the Managed Node VM
*/
protected static List<VM> managedNodeList;
/**
* Managing Node VM
*/
protected static VM managingNode;
protected static VM managedNode1;
protected static VM managedNode2;
protected static VM managedNode3;
@Rule
public DistributedRestoreSystemProperties restoreSystemProperties =
new DistributedRestoreSystemProperties();
@Override
public final void postSetUp() throws Exception {
JUnit4DistributedTestCase.disconnectAllFromDS();
Host host = Host.getHost(0);
managingNode = host.getVM(0);
managedNode1 = host.getVM(1);
managedNode2 = host.getVM(2);
managedNode3 = host.getVM(3);
managedNodeList = new ArrayList<>();
managedNodeList.add(managedNode1);
managedNodeList.add(managedNode2);
managedNodeList.add(managedNode3);
postSetUpManagementTestBase();
}
protected void postSetUpManagementTestBase() throws Exception {
// override if needed
}
@Override
public final void preTearDownCacheTestCase() throws Exception {
preTearDownManagementTestBase();
}
@Override
public final void postTearDownCacheTestCase() throws Exception {
managementService = null;
postTearDownManagementTestBase();
}
protected void preTearDownManagementTestBase() throws Exception {
// override if needed
}
protected void postTearDownManagementTestBase() throws Exception {
// override if needed
}
/**
* managingNodeFirst variable tests for two different test cases where Managing & Managed Node
* creation time lines are reversed.
*/
protected void initManagement(final boolean managingNodeFirst) {
if (managingNodeFirst) {
createManagementCache(managingNode);
startManagingNode(managingNode);
for (VM vm : managedNodeList) {
createCache(vm);
}
} else {
for (VM vm : managedNodeList) {
createCache(vm);
}
createManagementCache(managingNode);
startManagingNode(managingNode);
}
}
protected void createCache(final VM vm) {
vm.invoke("Create Cache", () -> {
createCache(false);
});
}
protected void createCache(final VM vm, final Properties props) {
vm.invoke("Create Cache", () -> {
createCache(props);
});
}
private Cache createCache(final Properties config) {
Cache cache = getCache(config);
managementService = ManagementService.getManagementService(cache);
return cache;
}
protected Cache createCache(final boolean isManager) {
Properties props = new Properties();
if (isManager) {
props.setProperty(JMX_MANAGER, "true");
props.setProperty(JMX_MANAGER_START, "false");
props.setProperty(JMX_MANAGER_PORT, "0");
props.setProperty(JMX_MANAGER_HTTP_PORT, "0");
}
props.setProperty(ENABLE_TIME_STATISTICS, "true");
props.setProperty(STATISTIC_SAMPLING_ENABLED, "true");
props.setProperty(LOG_FILE, JUnit4DistributedTestCase.getTestMethodName() + "-.log");
Cache cache = getCache(props);
managementService = ManagementService.getManagementService(cache);
return cache;
}
protected void createManagementCache(final VM vm) {
vm.invoke("Create Management Cache", () -> {
createCache(true);
});
}
protected void closeCache(final VM vm) {
vm.invoke("Close Cache", () -> {
InternalCache existingInstance = GemFireCacheImpl.getInstance();
if (existingInstance != null) {
existingInstance.close();
}
InternalDistributedSystem ds = InternalDistributedSystem.getConnectedInstance();
if (ds != null) {
ds.disconnect();
}
});
}
protected String getMemberId(final VM vm) {
return vm.invoke("getMemberId", () -> {
InternalCache cache = GemFireCacheImpl.getInstance();
return cache.getDistributedSystem().getDistributedMember().getId();
});
}
protected static void waitForProxy(final ObjectName objectName, final Class interfaceClass) {
GeodeAwaitility.await().untilAsserted(new WaitCriterion() {
@Override
public String description() {
return "Waiting for the proxy of " + objectName.getCanonicalName()
+ " to get propagated to Manager";
}
@Override
public boolean done() {
SystemManagementService service = (SystemManagementService) managementService;
return service.getMBeanProxy(objectName, interfaceClass) != null;
}
});
}
/**
* Marks a VM as Managing
*/
protected void startManagingNode(final VM vm) {
vm.invoke("Start Being Managing Node", () -> {
Cache existingCache = GemFireCacheImpl.getInstance();
managementService = ManagementService.getManagementService(existingCache);
SystemManagementService service = (SystemManagementService) managementService;
service.createManager();
service.startManager();
});
}
/**
* Stops a VM as a Managing node
*/
protected void stopManagingNode(final VM vm) {
vm.invoke("Stop Being Managing Node", () -> {
Cache existingCache = GemFireCacheImpl.getInstance();
if (existingCache != null && !existingCache.isClosed()) {
if (managementService.isManager()) {
managementService.stopManager();
}
}
});
}
protected static List<VM> getManagedNodeList() {
return managedNodeList;
}
protected static VM getManagingNode() {
return managingNode;
}
protected static ManagementService getManagementService() {
return managementService;
}
/**
* Creates a Local region
*/
protected void createLocalRegion(final VM vm, final String localRegionName) {
vm.invoke("Create Local region", () -> {
InternalCache cache = GemFireCacheImpl.getInstance();
SystemManagementService service = (SystemManagementService) getManagementService();
RegionFactory factory = cache.createRegionFactory(RegionShortcut.LOCAL);
factory.create(localRegionName);
});
}
/**
* Creates a partition Region
*/
protected void createPartitionRegion(final VM vm, final String partitionRegionName) {
vm.invoke("Create Partitioned region", () -> {
InternalCache cache = GemFireCacheImpl.getInstance();
SystemManagementService service = (SystemManagementService) getManagementService();
RegionFactory factory = cache.createRegionFactory(RegionShortcut.PARTITION_REDUNDANT);
factory.create(partitionRegionName);
});
}
protected static void waitForRefresh(final int expectedRefreshCount,
final ObjectName objectName) {
ManagementService service = getManagementService();
GeodeAwaitility.await().untilAsserted(new WaitCriterion() {
private int actualRefreshCount = 0;
private long lastRefreshTime = service.getLastUpdateTime(objectName);
@Override
public String description() {
return "Waiting For Proxy Refresh Count = " + expectedRefreshCount;
}
@Override
public boolean done() {
long newRefreshTime = service.getLastUpdateTime(objectName);
if (newRefreshTime > lastRefreshTime) {
lastRefreshTime = newRefreshTime;
actualRefreshCount++;
}
return actualRefreshCount >= expectedRefreshCount;
}
});
}
protected DistributedMember getMember(final VM vm) {
SerializableCallable getMember = new SerializableCallable("Get Member") {
@Override
public Object call() {
InternalCache cache = GemFireCacheImpl.getInstance();
return cache.getDistributedSystem().getDistributedMember();
}
};
return (DistributedMember) vm.invoke(getMember);
}
protected <T> T getMBeanProxy(final ObjectName objectName, final Class<T> interfaceClass) {
SystemManagementService service =
(SystemManagementService) ManagementService.getManagementService(getCache());
return service.getMBeanProxy(objectName, interfaceClass);
}
}