/*
* 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 org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.execute.ResultCollector;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.management.DistributedSystemMXBean;
import org.apache.geode.management.GatewayReceiverMXBean;
import org.apache.geode.management.GatewaySenderMXBean;
import org.apache.geode.management.ManagementService;
import org.apache.geode.management.cli.CliMetaData;
import org.apache.geode.management.cli.ConverterHint;
import org.apache.geode.management.cli.Result;
import org.apache.geode.management.internal.MBeanJMXAdapter;
import org.apache.geode.management.internal.SystemManagementService;
import org.apache.geode.management.internal.cli.CliUtil;
import org.apache.geode.management.internal.cli.LogWrapper;
import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
import org.apache.geode.management.internal.cli.functions.GatewayReceiverCreateFunction;
import org.apache.geode.management.internal.cli.functions.GatewayReceiverFunctionArgs;
import org.apache.geode.management.internal.cli.functions.GatewaySenderCreateFunction;
import org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFunction;
import org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFunctionArgs;
import org.apache.geode.management.internal.cli.functions.GatewaySenderFunctionArgs;
import org.apache.geode.management.internal.cli.i18n.CliStrings;
import org.apache.geode.management.internal.cli.result.CommandResultException;
import org.apache.geode.management.internal.cli.result.CompositeResultData;
import org.apache.geode.management.internal.cli.result.ResultBuilder;
import org.apache.geode.management.internal.cli.result.TabularResultData;
import org.apache.geode.management.internal.configuration.domain.XmlEntity;
import org.apache.geode.management.internal.security.ResourceOperation;
import org.apache.geode.security.ResourcePermission.Operation;
import org.apache.geode.security.ResourcePermission.Resource;
import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import javax.management.ObjectName;
public class WanCommands extends AbstractCommandsSupport {
@CliCommand(value = CliStrings.CREATE_GATEWAYSENDER, help = CliStrings.CREATE_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result createGatewaySender(@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.CREATE_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String[] onGroups,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
help = CliStrings.CREATE_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__ID, mandatory = true,
help = CliStrings.CREATE_GATEWAYSENDER__ID__HELP) String id,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__REMOTEDISTRIBUTEDSYSTEMID, mandatory = true,
help = CliStrings.CREATE_GATEWAYSENDER__REMOTEDISTRIBUTEDSYSTEMID__HELP) Integer remoteDistributedSystemId,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__PARALLEL,
help = CliStrings.CREATE_GATEWAYSENDER__PARALLEL__HELP) Boolean parallel,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__MANUALSTART,
help = CliStrings.CREATE_GATEWAYSENDER__MANUALSTART__HELP) Boolean manualStart,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__SOCKETBUFFERSIZE,
help = CliStrings.CREATE_GATEWAYSENDER__SOCKETBUFFERSIZE__HELP) Integer socketBufferSize,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__SOCKETREADTIMEOUT,
help = CliStrings.CREATE_GATEWAYSENDER__SOCKETREADTIMEOUT__HELP) Integer socketReadTimeout,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__ENABLEBATCHCONFLATION,
help = CliStrings.CREATE_GATEWAYSENDER__ENABLEBATCHCONFLATION__HELP) Boolean enableBatchConflation,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__BATCHSIZE,
help = CliStrings.CREATE_GATEWAYSENDER__BATCHSIZE__HELP) Integer batchSize,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__BATCHTIMEINTERVAL,
help = CliStrings.CREATE_GATEWAYSENDER__BATCHTIMEINTERVAL__HELP) Integer batchTimeInterval,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__ENABLEPERSISTENCE,
help = CliStrings.CREATE_GATEWAYSENDER__ENABLEPERSISTENCE__HELP) Boolean enablePersistence,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__DISKSTORENAME,
help = CliStrings.CREATE_GATEWAYSENDER__DISKSTORENAME__HELP) String diskStoreName,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__DISKSYNCHRONOUS,
help = CliStrings.CREATE_GATEWAYSENDER__DISKSYNCHRONOUS__HELP) Boolean diskSynchronous,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__MAXQUEUEMEMORY,
help = CliStrings.CREATE_GATEWAYSENDER__MAXQUEUEMEMORY__HELP) Integer maxQueueMemory,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__ALERTTHRESHOLD,
help = CliStrings.CREATE_GATEWAYSENDER__ALERTTHRESHOLD__HELP) Integer alertThreshold,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__DISPATCHERTHREADS,
help = CliStrings.CREATE_GATEWAYSENDER__DISPATCHERTHREADS__HELP) Integer dispatcherThreads,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__ORDERPOLICY,
help = CliStrings.CREATE_GATEWAYSENDER__ORDERPOLICY__HELP) String orderPolicy,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__GATEWAYEVENTFILTER,
help = CliStrings.CREATE_GATEWAYSENDER__GATEWAYEVENTFILTER__HELP) @CliMetaData(
valueSeparator = ",") String[] gatewayEventFilters,
@CliOption(key = CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER,
help = CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER__HELP) @CliMetaData(
valueSeparator = ",") String[] gatewayTransportFilter) {
Result result = null;
AtomicReference<XmlEntity> xmlEntity = new AtomicReference<>();
try {
GatewaySenderFunctionArgs gatewaySenderFunctionArgs = new GatewaySenderFunctionArgs(id,
remoteDistributedSystemId, parallel, manualStart, socketBufferSize, socketReadTimeout,
enableBatchConflation, batchSize, batchTimeInterval, enablePersistence, diskStoreName,
diskSynchronous, maxQueueMemory, alertThreshold, dispatcherThreads, orderPolicy,
gatewayEventFilters, gatewayTransportFilter);
Set<DistributedMember> membersToCreateGatewaySenderOn =
CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));
ResultCollector<?, ?> resultCollector =
CliUtil.executeFunction(GatewaySenderCreateFunction.INSTANCE, gatewaySenderFunctionArgs,
membersToCreateGatewaySenderOn);
@SuppressWarnings("unchecked")
List<CliFunctionResult> gatewaySenderCreateResults =
(List<CliFunctionResult>) resultCollector.getResult();
TabularResultData tabularResultData = ResultBuilder.createTabularResultData();
final String errorPrefix = "ERROR: ";
for (CliFunctionResult gatewaySenderCreateResult : gatewaySenderCreateResults) {
boolean success = gatewaySenderCreateResult.isSuccessful();
tabularResultData.accumulate("Member", gatewaySenderCreateResult.getMemberIdOrName());
tabularResultData.accumulate("Status",
(success ? "" : errorPrefix) + gatewaySenderCreateResult.getMessage());
if (success && xmlEntity.get() == null) {
xmlEntity.set(gatewaySenderCreateResult.getXmlEntity());
}
}
result = ResultBuilder.buildResult(tabularResultData);
} catch (IllegalArgumentException e) {
LogWrapper.getInstance().info(e.getMessage());
result = ResultBuilder.createUserErrorResult(e.getMessage());
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
}
if (xmlEntity.get() != null) {
persistClusterConfiguration(result,
() -> getSharedConfiguration().addXmlEntity(xmlEntity.get(), onGroups));
}
return result;
}
@CliCommand(value = CliStrings.START_GATEWAYSENDER, help = CliStrings.START_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result startGatewaySender(@CliOption(key = CliStrings.START_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.START_GATEWAYSENDER__ID__HELP) String senderId,
@CliOption(key = CliStrings.START_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.START_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.START_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.START_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
final String id = senderId.trim();
try {
final Cache cache = CacheFactory.getAnyInstance();
final SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
ExecutorService execService = Executors.newCachedThreadPool(new ThreadFactory() {
AtomicInteger threadNum = new AtomicInteger();
public Thread newThread(final Runnable r) {
Thread result =
new Thread(r, "Start Sender Command Thread " + threadNum.incrementAndGet());
result.setDaemon(true);
return result;
}
});
List<Callable<List>> callables = new ArrayList<Callable<List>>();
for (final DistributedMember member : dsMembers) {
callables.add(new Callable<List>() {
public List call() throws Exception {
GatewaySenderMXBean bean = null;
ArrayList<String> statusList = new ArrayList<String>();
if (cache.getDistributedSystem().getDistributedMember().getId()
.equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(id);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, id);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
if (bean.isRunning()) {
statusList.add(member.getId());
statusList.add(CliStrings.GATEWAY_ERROR);
statusList.add(
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_ALREADY_STARTED_ON_MEMBER_1,
new Object[] {id, member.getId()}));
} else {
bean.start();
statusList.add(member.getId());
statusList.add(CliStrings.GATEWAY_OK);
statusList.add(CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_STARTED_ON_MEMBER_1,
new Object[] {id, member.getId()}));
}
} else {
statusList.add(member.getId());
statusList.add(CliStrings.GATEWAY_ERROR);
statusList
.add(CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
new Object[] {id, member.getId()}));
}
return statusList;
}
});
}
Iterator<DistributedMember> memberIterator = dsMembers.iterator();
List<Future<List>> futures = null;
try {
futures = execService.invokeAll(callables);
} catch (InterruptedException ite) {
accumulateStartResult(resultData, null, CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_COULD_NOT_BE_INVOKED_DUE_TO_1,
new Object[] {id, ite.getMessage()}));
}
for (Future<List> future : futures) {
DistributedMember member = memberIterator.next();
List<String> memberStatus = null;
try {
memberStatus = future.get();
accumulateStartResult(resultData, memberStatus.get(0), memberStatus.get(1),
memberStatus.get(2));
} catch (InterruptedException ite) {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_COULD_NOT_BE_STARTED_ON_MEMBER_DUE_TO_1,
new Object[] {id, ite.getMessage()}));
continue;
} catch (ExecutionException ee) {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_COULD_NOT_BE_STARTED_ON_MEMBER_DUE_TO_1,
new Object[] {id, ee.getMessage()}));
continue;
}
}
execService.shutdown();
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.PAUSE_GATEWAYSENDER, help = CliStrings.PAUSE_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result pauseGatewaySender(@CliOption(key = CliStrings.PAUSE_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.PAUSE_GATEWAYSENDER__ID__HELP) String senderId,
@CliOption(key = CliStrings.PAUSE_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.PAUSE_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.PAUSE_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.PAUSE_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
if (senderId != null)
senderId = senderId.trim();
// if (memberNameOrId != null)
// memberNameOrId = memberNameOrId.trim();
//
// if (memberNameOrId != null && onGroup != null) {
// return ResultBuilder
// .createUserErrorResult(CliStrings.GATEWAY__MSG__OPTIONS);
// }
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewaySenderMXBean bean = null;
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = null;
dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(senderId);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
if (bean.isRunning()) {
if (bean.isPaused()) {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_ALREADY_PAUSED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
} else {
bean.pause();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_PAUSED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
}
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.RESUME_GATEWAYSENDER, help = CliStrings.RESUME_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result resumeGatewaySender(@CliOption(key = CliStrings.RESUME_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.RESUME_GATEWAYSENDER__ID__HELP) String senderId,
@CliOption(key = CliStrings.RESUME_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.RESUME_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.RESUME_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.RESUME_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
if (senderId != null)
senderId = senderId.trim();
// if (memberNameOrId != null)
// memberNameOrId = memberNameOrId.trim();
//
// if (memberNameOrId != null && onGroup != null) {
// return ResultBuilder
// .createUserErrorResult(CliStrings.GATEWAY__MSG__OPTIONS);
// }
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewaySenderMXBean bean = null;
//
// if (memberNameOrId != null && memberNameOrId.length() > 0) {
// InfoResultData resultData = ResultBuilder.createInfoResultData();
// DistributedMember memberToBeInvoked = CliUtil
// .getDistributedMemberByNameOrId(memberNameOrId);
//
// if (memberToBeInvoked != null) {
// String memberId = memberToBeInvoked.getId();
// if (cache.getDistributedSystem().getDistributedMember().getId()
// .equals(memberId)) {
// bean = service.getLocalGatewaySenderMXBean(senderId);
// } else {
// ObjectName objectName = service.getGatewaySenderMBeanName(memberToBeInvoked,
// senderId);
// bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
// }
// if (bean != null) {
// if (bean.isRunning()) {
// if (bean.isPaused()) {
// bean.resume();
// resultData.addLine(CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_RESUMED_ON_MEMBER_1,
// new Object[] { senderId, memberId }));
// return ResultBuilder.buildResult(resultData);
// }
// resultData.addLine(CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_NOT_PAUSED_ON_MEMBER_1,
// new Object[] { senderId, memberId }));
// return ResultBuilder.buildResult(resultData);
// }
// resultData.addLine(CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1,
// new Object[] { senderId, memberId }));
// return ResultBuilder.buildResult(resultData);
// }
// return ResultBuilder.createBadConfigurationErrorResult(CliStrings
// .format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
// new Object[] { senderId, memberId }));
// }
// return ResultBuilder.createUserErrorResult(CliStrings.format(
// CliStrings.GATEWAY_MSG_MEMBER_0_NOT_FOUND,
// new Object[] { memberNameOrId }));
// }
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = null;
// if (onGroup != null && onGroup.length > 0) {
// dsMembers = CliUtil.getDistributedMembersByGroup(cache, onGroup);
// } else {
// dsMembers = CliUtil.getAllNormalMembers(cache);
// }
// if (dsMembers.isEmpty()) {
// return ResultBuilder
// .createUserErrorResult(CliStrings.GATEWAY_MSG_MEMBERS_NOT_FOUND);
// }
dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(senderId);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
if (bean.isRunning()) {
if (bean.isPaused()) {
bean.resume();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_RESUMED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_PAUSED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
}
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.STOP_GATEWAYSENDER, help = CliStrings.STOP_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result stopGatewaySender(@CliOption(key = CliStrings.STOP_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.STOP_GATEWAYSENDER__ID__HELP) String senderId,
@CliOption(key = CliStrings.STOP_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.STOP_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.STOP_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.STOP_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
if (senderId != null)
senderId = senderId.trim();
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewaySenderMXBean bean = null;
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(senderId);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
if (bean.isRunning()) {
bean.stop();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_STOPPED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
}
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.CREATE_GATEWAYRECEIVER,
help = CliStrings.CREATE_GATEWAYRECEIVER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result createGatewayReceiver(@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.CREATE_GATEWAYRECEIVER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String[] onGroups,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
help = CliStrings.CREATE_GATEWAYRECEIVER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART,
help = CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART__HELP) Boolean manualStart,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT,
help = CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT__HELP) Integer startPort,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT,
help = CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT__HELP) Integer endPort,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__BINDADDRESS,
help = CliStrings.CREATE_GATEWAYRECEIVER__BINDADDRESS__HELP) String bindAddress,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS,
help = CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS__HELP) Integer maximumTimeBetweenPings,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE,
help = CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE__HELP) Integer socketBufferSize,
@CliOption(key = CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER,
help = CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER__HELP) @CliMetaData(
valueSeparator = ",") String[] gatewayTransportFilters) {
Result result = null;
AtomicReference<XmlEntity> xmlEntity = new AtomicReference<>();
try {
GatewayReceiverFunctionArgs gatewayReceiverFunctionArgs =
new GatewayReceiverFunctionArgs(manualStart, startPort, endPort, bindAddress,
socketBufferSize, maximumTimeBetweenPings, gatewayTransportFilters);
Set<DistributedMember> membersToCreateGatewayReceiverOn =
CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));
ResultCollector<?, ?> resultCollector =
CliUtil.executeFunction(GatewayReceiverCreateFunction.INSTANCE,
gatewayReceiverFunctionArgs, membersToCreateGatewayReceiverOn);
@SuppressWarnings("unchecked")
List<CliFunctionResult> gatewayReceiverCreateResults =
(List<CliFunctionResult>) resultCollector.getResult();
TabularResultData tabularResultData = ResultBuilder.createTabularResultData();
final String errorPrefix = "ERROR: ";
for (CliFunctionResult gatewayReceiverCreateResult : gatewayReceiverCreateResults) {
boolean success = gatewayReceiverCreateResult.isSuccessful();
tabularResultData.accumulate("Member", gatewayReceiverCreateResult.getMemberIdOrName());
tabularResultData.accumulate("Status",
(success ? "" : errorPrefix) + gatewayReceiverCreateResult.getMessage());
if (success && xmlEntity.get() == null) {
xmlEntity.set(gatewayReceiverCreateResult.getXmlEntity());
}
}
result = ResultBuilder.buildResult(tabularResultData);
} catch (IllegalArgumentException e) {
LogWrapper.getInstance().info(e.getMessage());
result = ResultBuilder.createUserErrorResult(e.getMessage());
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
}
if (xmlEntity.get() != null) {
persistClusterConfiguration(result,
() -> getSharedConfiguration().addXmlEntity(xmlEntity.get(), onGroups));
}
return result;
}
@CliCommand(value = CliStrings.LOAD_BALANCE_GATEWAYSENDER,
help = CliStrings.LOAD_BALANCE_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result loadBalanceGatewaySender(@CliOption(key = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID__HELP) String senderId) {
Result result = null;
if (senderId != null) {
senderId = senderId.trim();
}
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = CliUtil.getAllNormalMembers(cache);
if (dsMembers.isEmpty()) {
result = ResultBuilder.createInfoResult(CliStrings.GATEWAY_MSG_MEMBERS_NOT_FOUND);
} else {
boolean gatewaySenderExists = false;
for (DistributedMember member : dsMembers) {
GatewaySenderMXBean bean = null;
if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(senderId);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
gatewaySenderExists = true;
bean.rebalance();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_REBALANCED_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
new Object[] {senderId, member.getId()}));
}
}
if (gatewaySenderExists) {
result = ResultBuilder.buildResult(resultData);
} else {
result = ResultBuilder.createInfoResult(CliStrings.format(
CliStrings.GATEWAY_SENDER_0_IS_NOT_FOUND_ON_ANY_MEMBER, new Object[] {senderId}));
}
}
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.START_GATEWAYRECEIVER,
help = CliStrings.START_GATEWAYRECEIVER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result startGatewayReceiver(@CliOption(key = CliStrings.START_GATEWAYRECEIVER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.START_GATEWAYRECEIVER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.START_GATEWAYRECEIVER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.START_GATEWAYRECEIVER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewayReceiverMXBean receieverBean = null;
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
if (gatewayReceiverObjectName != null) {
receieverBean =
service.getMBeanProxy(gatewayReceiverObjectName, GatewayReceiverMXBean.class);
if (receieverBean != null) {
if (receieverBean.isRunning()) {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_ALREADY_STARTED_ON_MEMBER_0,
new Object[] {member.getId()}));
} else {
receieverBean.start();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_STARTED_ON_MEMBER_0,
new Object[] {member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
new Object[] {member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
new Object[] {member.getId()}));
}
}
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.STOP_GATEWAYRECEIVER, help = CliStrings.STOP_GATEWAYRECEIVER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result stopGatewayReceiver(
@CliOption(key = CliStrings.STOP_GATEWAYRECEIVER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.STOP_GATEWAYRECEIVER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.STOP_GATEWAYRECEIVER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.STOP_GATEWAYRECEIVER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewayReceiverMXBean receieverBean = null;
TabularResultData resultData = ResultBuilder.createTabularResultData();
Set<DistributedMember> dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
if (gatewayReceiverObjectName != null) {
receieverBean =
service.getMBeanProxy(gatewayReceiverObjectName, GatewayReceiverMXBean.class);
if (receieverBean != null) {
if (receieverBean.isRunning()) {
receieverBean.stop();
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_OK,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_STOPPED_ON_MEMBER_0,
new Object[] {member.getId()}));
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_RUNNING_ON_MEMBER_0,
new Object[] {member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
new Object[] {member.getId()}));
}
} else {
accumulateStartResult(resultData, member.getId(), CliStrings.GATEWAY_ERROR,
CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
new Object[] {member.getId()}));
}
}
result = ResultBuilder.buildResult(resultData);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.LIST_GATEWAY, help = CliStrings.LIST_GATEWAY__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
public Result listGateway(
@CliOption(key = CliStrings.LIST_GATEWAY__MEMBER, optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.LIST_GATEWAY__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember,
@CliOption(key = CliStrings.LIST_GATEWAY__GROUP, optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.LIST_GATEWAY__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup) {
Result result = null;
Cache cache = CacheFactory.getAnyInstance();
try {
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
Set<DistributedMember> dsMembers = null;
// if (onGroup != null && onGroup.length > 0) {
// dsMembers = CliUtil.getDistributedMembersByGroup(cache, onGroup);
// } else {
// dsMembers = CliUtil.getAllNormalMembers(cache);
// }
// if (dsMembers.isEmpty()) {
// return ResultBuilder
// .createUserErrorResult(CliStrings.GATEWAY_MSG_MEMBERS_NOT_FOUND);
// }
dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
Map<String, Map<String, GatewaySenderMXBean>> gatewaySenderBeans =
new TreeMap<String, Map<String, GatewaySenderMXBean>>();
Map<String, GatewayReceiverMXBean> gatewayReceiverBeans =
new TreeMap<String, GatewayReceiverMXBean>();
DistributedSystemMXBean dsMXBean = service.getDistributedSystemMXBean();
for (DistributedMember member : dsMembers) {
String memberName = member.getName();
String memberNameOrId =
(memberName != null && !memberName.isEmpty()) ? memberName : member.getId();
ObjectName gatewaySenderObjectNames[] =
dsMXBean.listGatewaySenderObjectNames(memberNameOrId);
// gateway senders : a member can have multiple gateway sendersdefined
// on it
if (gatewaySenderObjectNames != null) {
for (ObjectName name : gatewaySenderObjectNames) {
GatewaySenderMXBean senderBean = service.getMBeanProxy(name, GatewaySenderMXBean.class);
if (senderBean != null) {
if (gatewaySenderBeans.containsKey(senderBean.getSenderId())) {
Map<String, GatewaySenderMXBean> memberToBeanMap =
gatewaySenderBeans.get(senderBean.getSenderId());
memberToBeanMap.put(member.getId(), senderBean);
} else {
Map<String, GatewaySenderMXBean> memberToBeanMap =
new TreeMap<String, GatewaySenderMXBean>();
memberToBeanMap.put(member.getId(), senderBean);
gatewaySenderBeans.put(senderBean.getSenderId(), memberToBeanMap);
}
}
}
}
// gateway receivers : a member can have only one gateway receiver
ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
if (gatewayReceiverObjectName != null) {
GatewayReceiverMXBean receieverBean = null;
receieverBean =
service.getMBeanProxy(gatewayReceiverObjectName, GatewayReceiverMXBean.class);
if (receieverBean != null) {
gatewayReceiverBeans.put(member.getId(), receieverBean);
}
}
}
if (gatewaySenderBeans.isEmpty() && gatewayReceiverBeans.isEmpty()) {
return ResultBuilder
.createUserErrorResult(CliStrings.GATEWAYS_ARE_NOT_AVAILABLE_IN_CLUSTER);
}
CompositeResultData crd = ResultBuilder.createCompositeResultData();
crd.setHeader(CliStrings.HEADER_GATEWAYS);
accumulateListGatewayResult(crd, gatewaySenderBeans, gatewayReceiverBeans);
result = ResultBuilder.buildResult(crd);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.STATUS_GATEWAYSENDER, help = CliStrings.STATUS_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
public Result statusGatewaySender(@CliOption(key = CliStrings.STATUS_GATEWAYSENDER__ID,
mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.STATUS_GATEWAYSENDER__ID__HELP) String senderId,
@CliOption(key = CliStrings.STATUS_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.STATUS_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.STATUS_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.STATUS_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
if (senderId != null)
senderId = senderId.trim();
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
GatewaySenderMXBean bean = null;
CompositeResultData crd = ResultBuilder.createCompositeResultData();
TabularResultData availableSenderData =
crd.addSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
.addTable(CliStrings.TABLE_GATEWAY_SENDER);
TabularResultData notAvailableSenderData =
crd.addSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE)
.addTable(CliStrings.TABLE_GATEWAY_SENDER);
Set<DistributedMember> dsMembers = null;
dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
bean = service.getLocalGatewaySenderMXBean(senderId);
} else {
ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
}
if (bean != null) {
buildSenderStatus(member.getId(), bean, availableSenderData);
} else {
buildSenderStatus(member.getId(), bean, notAvailableSenderData);
}
}
result = ResultBuilder.buildResult(crd);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.STATUS_GATEWAYRECEIVER,
help = CliStrings.STATUS_GATEWAYRECEIVER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
public Result statusGatewayReceiver(@CliOption(key = CliStrings.STATUS_GATEWAYRECEIVER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.STATUS_GATEWAYRECEIVER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String onGroup,
@CliOption(key = CliStrings.STATUS_GATEWAYRECEIVER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
help = CliStrings.STATUS_GATEWAYRECEIVER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember) {
Result result = null;
try {
Cache cache = CacheFactory.getAnyInstance();
SystemManagementService service =
(SystemManagementService) ManagementService.getExistingManagementService(cache);
CompositeResultData crd = ResultBuilder.createCompositeResultData();
TabularResultData availableReceiverData =
crd.addSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
.addTable(CliStrings.TABLE_GATEWAY_RECEIVER);
TabularResultData notAvailableReceiverData =
crd.addSection(CliStrings.SECTION_GATEWAY_RECEIVER_NOT_AVAILABLE)
.addTable(CliStrings.TABLE_GATEWAY_RECEIVER);
Set<DistributedMember> dsMembers = CliUtil.findMembersOrThrow(onGroup, onMember);
for (DistributedMember member : dsMembers) {
ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
if (gatewayReceiverObjectName != null) {
GatewayReceiverMXBean receieverBean =
service.getMBeanProxy(gatewayReceiverObjectName, GatewayReceiverMXBean.class);
if (receieverBean != null) {
buildReceiverStatus(member.getId(), receieverBean, availableReceiverData);
continue;
}
}
buildReceiverStatus(member.getId(), null, notAvailableReceiverData);
}
result = ResultBuilder.buildResult(crd);
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
} catch (Exception e) {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(e));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + e.getMessage());
}
return result;
}
@CliCommand(value = CliStrings.DESTROY_GATEWAYSENDER,
help = CliStrings.DESTROY_GATEWAYSENDER__HELP)
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
public Result destroyGatewaySender(
@CliOption(key = CliStrings.DESTROY_GATEWAYSENDER__GROUP,
optionContext = ConverterHint.MEMBERGROUP,
help = CliStrings.DESTROY_GATEWAYSENDER__GROUP__HELP) @CliMetaData(
valueSeparator = ",") String[] onGroups,
@CliOption(key = CliStrings.DESTROY_GATEWAYSENDER__MEMBER,
optionContext = ConverterHint.MEMBERIDNAME,
unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
help = CliStrings.DESTROY_GATEWAYSENDER__MEMBER__HELP) @CliMetaData(
valueSeparator = ",") String onMember,
@CliOption(key = CliStrings.DESTROY_GATEWAYSENDER__ID, mandatory = true,
optionContext = ConverterHint.GATEWAY_SENDER_ID,
help = CliStrings.DESTROY_GATEWAYSENDER__ID__HELP) String id) {
Result result = null;
try {
GatewaySenderDestroyFunctionArgs gatewaySenderDestroyFunctionArgs =
new GatewaySenderDestroyFunctionArgs(id);
Set<DistributedMember> membersToDestroyGatewaySenderOn =
CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));
ResultCollector<?, ?> resultCollector =
CliUtil.executeFunction(GatewaySenderDestroyFunction.INSTANCE,
gatewaySenderDestroyFunctionArgs, membersToDestroyGatewaySenderOn);
@SuppressWarnings("unchecked")
List<CliFunctionResult> gatewaySenderDestroyResults =
(List<CliFunctionResult>) resultCollector.getResult();
TabularResultData tabularResultData = ResultBuilder.createTabularResultData();
final String errorPrefix = "ERROR: ";
for (CliFunctionResult gatewaySenderDestroyResult : gatewaySenderDestroyResults) {
boolean success = gatewaySenderDestroyResult.isSuccessful();
tabularResultData.accumulate("Member", gatewaySenderDestroyResult.getMemberIdOrName());
tabularResultData.accumulate("Status",
(success ? "" : errorPrefix) + gatewaySenderDestroyResult.getMessage());
}
result = ResultBuilder.buildResult(tabularResultData);
} catch (IllegalArgumentException e) {
LogWrapper.getInstance().info(e.getMessage());
result = ResultBuilder.createUserErrorResult(e.getMessage());
} catch (CommandResultException crex) {
result = handleCommandResultException(crex);
}
return result;
}
private TabularResultData buildReceiverStatus(String memberId, GatewayReceiverMXBean bean,
TabularResultData resultData) {
resultData.accumulate(CliStrings.RESULT_HOST_MEMBER, memberId);
if (bean != null) {
resultData.accumulate(CliStrings.RESULT_PORT, bean.getPort());
resultData.accumulate(CliStrings.RESULT_STATUS,
bean.isRunning() ? CliStrings.GATEWAY_RUNNING : CliStrings.GATEWAY_NOT_RUNNING);
} else {
resultData.accumulate(CliStrings.GATEWAY_ERROR,
CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_OR_STOPPED);
}
return resultData;
}
private TabularResultData buildSenderStatus(String memberId, GatewaySenderMXBean bean,
TabularResultData resultData) {
resultData.accumulate(CliStrings.RESULT_HOST_MEMBER, memberId);
if (bean != null) {
resultData.accumulate(CliStrings.RESULT_TYPE,
bean.isParallel() ? CliStrings.SENDER_PARALLEL : CliStrings.SENDER_SERIAL);
if (!bean.isParallel()) {
resultData.accumulate(CliStrings.RESULT_POLICY,
bean.isPrimary() ? CliStrings.SENDER_PRIMARY : CliStrings.SENDER_SECONADRY);
}
if (bean.isRunning()) {
if (bean.isPaused()) {
resultData.accumulate(CliStrings.RESULT_STATUS, CliStrings.SENDER_PAUSED);
} else {
resultData.accumulate(CliStrings.RESULT_STATUS, CliStrings.GATEWAY_RUNNING);
}
} else {
resultData.accumulate(CliStrings.RESULT_STATUS, CliStrings.GATEWAY_NOT_RUNNING);
}
} else {
resultData.accumulate(CliStrings.GATEWAY_ERROR, CliStrings.GATEWAY_SENDER_IS_NOT_AVAILABLE);
}
return resultData;
}
// CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_STARTED_ON_MEMBER_1,
// new Object[] {senderId, memberId });
//
// CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_ALREADY_STARTED_ON_MEMBER_1,
// new Object[] {senderId, memberId });
//
// CliStrings.format(
// CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1,
// new Object[] {senderId, memberId });
private void accumulateListGatewayResult(CompositeResultData crd,
Map<String, Map<String, GatewaySenderMXBean>> gatewaySenderBeans,
Map<String, GatewayReceiverMXBean> gatewayReceiverBeans) {
if (!gatewaySenderBeans.isEmpty()) {
TabularResultData gatewaySenderData = crd.addSection(CliStrings.SECTION_GATEWAY_SENDER)
.addTable(CliStrings.TABLE_GATEWAY_SENDER).setHeader(CliStrings.HEADER_GATEWAY_SENDER);
for (Map.Entry<String, Map<String, GatewaySenderMXBean>> entry : gatewaySenderBeans
.entrySet()) {
for (Map.Entry<String, GatewaySenderMXBean> memberToBean : entry.getValue().entrySet()) {
gatewaySenderData.accumulate(CliStrings.RESULT_GATEWAY_SENDER_ID, entry.getKey());
gatewaySenderData.accumulate(CliStrings.RESULT_HOST_MEMBER, memberToBean.getKey());
gatewaySenderData.accumulate(CliStrings.RESULT_REMOTE_CLUSTER,
memberToBean.getValue().getRemoteDSId());
gatewaySenderData.accumulate(CliStrings.RESULT_TYPE, memberToBean.getValue().isParallel()
? CliStrings.SENDER_PARALLEL : CliStrings.SENDER_SERIAL);
gatewaySenderData.accumulate(CliStrings.RESULT_STATUS, memberToBean.getValue().isRunning()
? CliStrings.GATEWAY_RUNNING : CliStrings.GATEWAY_NOT_RUNNING);
gatewaySenderData.accumulate(CliStrings.RESULT_QUEUED_EVENTS,
memberToBean.getValue().getEventQueueSize());
gatewaySenderData.accumulate(CliStrings.RESULT_RECEIVER,
memberToBean.getValue().getGatewayReceiver());
}
}
}
if (!gatewayReceiverBeans.isEmpty()) {
TabularResultData gatewayReceiverData = crd.addSection(CliStrings.SECTION_GATEWAY_RECEIVER)
.addTable(CliStrings.TABLE_GATEWAY_RECEIVER)
.setHeader(CliStrings.HEADER_GATEWAY_RECEIVER);
for (Map.Entry<String, GatewayReceiverMXBean> entry : gatewayReceiverBeans.entrySet()) {
gatewayReceiverData.accumulate(CliStrings.RESULT_HOST_MEMBER, entry.getKey());
gatewayReceiverData.accumulate(CliStrings.RESULT_PORT, entry.getValue().getPort());
gatewayReceiverData.accumulate(CliStrings.RESULT_SENDERS_COUNT,
entry.getValue().getClientConnectionCount());
gatewayReceiverData.accumulate(CliStrings.RESULT_SENDER_CONNECTED,
entry.getValue().getConnectedGatewaySenders());
}
}
}
private void accumulateStartResult(TabularResultData resultData, String member, String Status,
String message) {
if (member != null) {
resultData.accumulate("Member", member);
}
resultData.accumulate("Result", Status);
resultData.accumulate("Message", message);
}
@CliAvailabilityIndicator({CliStrings.CREATE_GATEWAYSENDER, CliStrings.START_GATEWAYSENDER,
CliStrings.PAUSE_GATEWAYSENDER, CliStrings.RESUME_GATEWAYSENDER,
CliStrings.STOP_GATEWAYSENDER, CliStrings.CREATE_GATEWAYRECEIVER,
CliStrings.START_GATEWAYRECEIVER, CliStrings.STOP_GATEWAYRECEIVER, CliStrings.LIST_GATEWAY,
CliStrings.STATUS_GATEWAYSENDER, CliStrings.STATUS_GATEWAYRECEIVER,
CliStrings.LOAD_BALANCE_GATEWAYSENDER, CliStrings.DESTROY_GATEWAYSENDER})
public boolean isWanCommandsAvailable() {
boolean isAvailable = true; // always available on server
if (CliUtil.isGfshVM()) {
isAvailable = getGfsh() != null && getGfsh().isConnectedAndReady();
}
return isAvailable;
}
private Result handleCommandResultException(CommandResultException crex) {
Result result = null;
if (crex.getResult() != null) {
result = crex.getResult();
} else {
LogWrapper.getInstance().warning(CliStrings.GATEWAY_ERROR + CliUtil.stackTraceAsString(crex));
result = ResultBuilder.createGemFireErrorResult(CliStrings.GATEWAY_ERROR + crex.getMessage());
}
return result;
}
}