blob: 89644f07e1091e79ca4653c0817f4ae9095cf0ed [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.internal.cache.extension.mock;
import java.util.List;
import java.util.Set;
import org.springframework.shell.core.CommandMarker;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.execute.Function;
import com.gemstone.gemfire.cache.execute.ResultCollector;
import com.gemstone.gemfire.distributed.DistributedMember;
import com.gemstone.gemfire.management.cli.CliMetaData;
import com.gemstone.gemfire.management.cli.Result;
import com.gemstone.gemfire.management.cli.Result.Status;
import com.gemstone.gemfire.management.internal.cli.CliUtil;
import com.gemstone.gemfire.management.internal.cli.functions.CliFunctionResult;
import com.gemstone.gemfire.management.internal.cli.result.ResultBuilder;
import com.gemstone.gemfire.management.internal.cli.result.TabularResultData;
import com.gemstone.gemfire.management.internal.configuration.SharedConfigurationWriter;
import com.gemstone.gemfire.management.internal.configuration.domain.XmlEntity;
/**
* Mock Extension gfsh commands.
*
* @author jbarrett@pivotal.io
*
* @since 8.1
*/
public class MockExtensionCommands implements CommandMarker {
public static final String OPTION_VALUE = "value";
public static final String OPTION_REGION_NAME = "region-name";
public static final String CREATE_MOCK_REGION_EXTENSION = "create mock region extension";
public static final String ALTER_MOCK_REGION_EXTENSION = "alter mock region extension";
public static final String DESTROY_MOCK_REGION_EXTENSION = "destroy mock region extension";
public static final String CREATE_MOCK_CACHE_EXTENSION = "create mock cache extension";
public static final String ALTER_MOCK_CACHE_EXTENSION = "alter mock cache extension";
public static final String DESTROY_MOCK_CACHE_EXTENSION = "destroy mock cache extension";
/**
* Creates a {@link MockRegionExtension} on the given <code>regionName</code>.
*
* @param regionName
* {@link Region} name on which to create {@link MockRegionExtension}
* .
* @param value
* {@link String} value to set on
* {@link MockRegionExtension#setValue(String)}.
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = CREATE_MOCK_REGION_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result createMockRegionExtension(@CliOption(key = OPTION_REGION_NAME, mandatory = true) final String regionName,
@CliOption(key = OPTION_VALUE, mandatory = true) final String value) {
return executeFunctionOnAllMembersTabulateResultPersist(CreateMockRegionExtensionFunction.INSTANCE, true,
CreateMockRegionExtensionFunction.toArgs(regionName, value));
}
/**
* Alters a {@link MockRegionExtension} on the given <code>regionName</code>.
*
* @param regionName
* {@link Region} name on which to create {@link MockRegionExtension}
* .
* @param value
* {@link String} value to set on
* {@link MockRegionExtension#setValue(String)}.
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = ALTER_MOCK_REGION_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result alterMockRegionExtension(@CliOption(key = OPTION_REGION_NAME, mandatory = true) final String regionName,
@CliOption(key = OPTION_VALUE, mandatory = true) final String value) {
return executeFunctionOnAllMembersTabulateResultPersist(AlterMockRegionExtensionFunction.INSTANCE, true,
AlterMockRegionExtensionFunction.toArgs(regionName, value));
}
/**
* Destroy the {@link MockRegionExtension} on the given
* <code>regionName</code>.
*
* @param regionName
* {@link Region} name on which to create {@link MockRegionExtension}
* .
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = DESTROY_MOCK_REGION_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result destroyMockRegionExtension(@CliOption(key = OPTION_REGION_NAME, mandatory = true) final String regionName) {
return executeFunctionOnAllMembersTabulateResultPersist(DestroyMockRegionExtensionFunction.INSTANCE, true,
DestroyMockRegionExtensionFunction.toArgs(regionName));
}
/**
* Creates a {@link MockCacheExtension}.
*
* @param value
* {@link String} value to set on
* {@link MockCacheExtension#setValue(String)}.
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = CREATE_MOCK_CACHE_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result createMockCacheExtension(@CliOption(key = OPTION_VALUE, mandatory = true) final String value) {
return executeFunctionOnAllMembersTabulateResultPersist(CreateMockCacheExtensionFunction.INSTANCE, true, CreateMockCacheExtensionFunction.toArgs(value));
}
/**
* Alter a {@link MockCacheExtension}.
*
* @param value
* {@link String} value to set on
* {@link MockCacheExtension#setValue(String)}.
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = ALTER_MOCK_CACHE_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result alterMockCacheExtension(@CliOption(key = OPTION_VALUE, mandatory = true) final String value) {
return executeFunctionOnAllMembersTabulateResultPersist(AlterMockCacheExtensionFunction.INSTANCE, true, AlterMockCacheExtensionFunction.toArgs(value));
}
/**
* Destroy a {@link MockCacheExtension}.
*
* @return {@link Result}
* @since 8.1
*/
@CliCommand(value = DESTROY_MOCK_CACHE_EXTENSION)
@CliMetaData(writesToSharedConfiguration = true)
public Result destroyMockCacheExtension() {
return executeFunctionOnAllMembersTabulateResultPersist(DestroyMockCacheExtensionFunction.INSTANCE, false);
}
/**
* Call <code>function</code> with <code>args</code> on all members, tabulate
* results and persist shared config if changed.
*
* @param function
* {@link Function} to execute.
* @param addXmlElement
* If <code>true</code> then add result {@link XmlEntity} to the
* config, otherwise delete it.
* @param args
* Arguments to pass to function.
* @return {@link TabularResultData}
* @since 8.1
*/
protected Result executeFunctionOnAllMembersTabulateResultPersist(final Function function, final boolean addXmlElement, final Object... args) {
final Cache cache = CacheFactory.getAnyInstance();
final Set<DistributedMember> members = CliUtil.getAllNormalMembers(cache);
@SuppressWarnings("unchecked")
final ResultCollector<CliFunctionResult, List<CliFunctionResult>> resultCollector = (ResultCollector<CliFunctionResult, List<CliFunctionResult>>) CliUtil
.executeFunction(function, args, members);
final List<CliFunctionResult> functionResults = (List<CliFunctionResult>) resultCollector.getResult();
XmlEntity xmlEntity = null;
final TabularResultData tabularResultData = ResultBuilder.createTabularResultData();
final String errorPrefix = "ERROR: ";
for (CliFunctionResult functionResult : functionResults) {
boolean success = functionResult.isSuccessful();
tabularResultData.accumulate("Member", functionResult.getMemberIdOrName());
if (success) {
tabularResultData.accumulate("Status", functionResult.getMessage());
xmlEntity = functionResult.getXmlEntity();
} else {
tabularResultData.accumulate("Status", errorPrefix + functionResult.getMessage());
tabularResultData.setStatus(Status.ERROR);
}
}
final Result result = ResultBuilder.buildResult(tabularResultData);
System.out.println("MockExtensionCommands: persisting xmlEntity=" + xmlEntity);
if (null != xmlEntity) {
if (addXmlElement) {
result.setCommandPersisted((new SharedConfigurationWriter()).addXmlEntity(xmlEntity, null));
} else {
result.setCommandPersisted((new SharedConfigurationWriter()).deleteXmlEntity(xmlEntity, null));
}
}
return result;
}
}