All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.geode.management.internal.cli.commands.WanCommands Maven / Gradle / Ivy

Go to download

Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing

There is a newer version: 1.15.1
Show newest version
/*
 * 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 = 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 membersToCreateGatewaySenderOn =
          CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));

      ResultCollector resultCollector =
          CliUtil.executeFunction(GatewaySenderCreateFunction.INSTANCE, gatewaySenderFunctionArgs,
              membersToCreateGatewaySenderOn);
      @SuppressWarnings("unchecked")
      List gatewaySenderCreateResults =
          (List) 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 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> callables = new ArrayList>();

      for (final DistributedMember member : dsMembers) {

        callables.add(new Callable() {

          public List call() throws Exception {

            GatewaySenderMXBean bean = null;
            ArrayList statusList = new ArrayList();
            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 memberIterator = dsMembers.iterator();
      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 future : futures) {
        DistributedMember member = memberIterator.next();
        List 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 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 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 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 = new AtomicReference<>();
    try {
      GatewayReceiverFunctionArgs gatewayReceiverFunctionArgs =
          new GatewayReceiverFunctionArgs(manualStart, startPort, endPort, bindAddress,
              socketBufferSize, maximumTimeBetweenPings, gatewayTransportFilters);

      Set membersToCreateGatewayReceiverOn =
          CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));

      ResultCollector resultCollector =
          CliUtil.executeFunction(GatewayReceiverCreateFunction.INSTANCE,
              gatewayReceiverFunctionArgs, membersToCreateGatewayReceiverOn);
      @SuppressWarnings("unchecked")
      List gatewayReceiverCreateResults =
          (List) 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 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 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 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 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> gatewaySenderBeans =
          new TreeMap>();
      Map gatewayReceiverBeans =
          new TreeMap();

      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 memberToBeanMap =
                    gatewaySenderBeans.get(senderBean.getSenderId());
                memberToBeanMap.put(member.getId(), senderBean);
              } else {
                Map memberToBeanMap =
                    new TreeMap();
                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 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 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 membersToDestroyGatewaySenderOn =
          CliUtil.findMembersOrThrow(onGroups, onMember == null ? null : onMember.split(","));

      ResultCollector resultCollector =
          CliUtil.executeFunction(GatewaySenderDestroyFunction.INSTANCE,
              gatewaySenderDestroyFunctionArgs, membersToDestroyGatewaySenderOn);
      @SuppressWarnings("unchecked")
      List gatewaySenderDestroyResults =
          (List) 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> gatewaySenderBeans,
      Map 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> entry : gatewaySenderBeans
          .entrySet()) {
        for (Map.Entry 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 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;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy