package org.jboss.as.clustering.infinispan.subsystem;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import java.util.Collections;
import org.jboss.as.clustering.controller.Attribute;
import org.jboss.as.clustering.controller.Operations;
import org.jboss.as.clustering.controller.SimpleAttribute;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.subsystem.test.KernelServices;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.junit.Assert;
import org.junit.Test;
/**
* Test case for testing individual management operations.
*
* These test cases are based on the XML config in subsystem-infinispan-test,
* a non-exhaustive subsystem configuration.
*
* @author Richard Achmatowicz (c) 2011 Red Hat Inc.
*/
public class OperationsTestCase extends OperationTestCaseBase {
/*
* Tests access to cache container attributes
*/
@Test
public void testCacheContainerReadWriteOperation() throws Exception {
// Parse and install the XML into the controller
String subsystemXml = getSubsystemXml();
KernelServices servicesA = this.createKernelServicesBuilder().setSubsystemXml(subsystemXml).build();
// read the cache container default cache attribute
ModelNode result = servicesA.executeOperation(getCacheContainerReadOperation("maximal", CacheContainerResourceDefinition.Attribute.DEFAULT_CACHE));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("local", result.get(RESULT).asString());
// write the default cache attribute
result = servicesA.executeOperation(getCacheContainerWriteOperation("maximal", CacheContainerResourceDefinition.Attribute.DEFAULT_CACHE, "new-default-cache"));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
// re-read the default cache attribute
result = servicesA.executeOperation(getCacheContainerReadOperation("maximal", CacheContainerResourceDefinition.Attribute.DEFAULT_CACHE));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("new-default-cache", result.get(RESULT).asString());
}
/*
* Tests access to local cache attributes
*/
@Test
public void testLocalCacheReadWriteOperation() throws Exception {
// Parse and install the XML into the controller
String subsystemXml = getSubsystemXml();
KernelServices servicesA = this.createKernelServicesBuilder().setSubsystemXml(subsystemXml).build();
ModelNode readOperation = getCacheReadOperation("maximal", LocalCacheResourceDefinition.WILDCARD_PATH.getKey(), "local", CacheResourceDefinition.Attribute.STATISTICS_ENABLED);
// read the cache container batching attribute
ModelNode result = servicesA.executeOperation(readOperation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertTrue(result.get(RESULT).asBoolean());
ModelNode writeOperation = getCacheWriteOperation("maximal", LocalCacheResourceDefinition.WILDCARD_PATH.getKey(), "local", CacheResourceDefinition.Attribute.STATISTICS_ENABLED, "false");
// write the batching attribute
result = servicesA.executeOperation(writeOperation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
// re-read the batching attribute
result = servicesA.executeOperation(readOperation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).asBoolean());
}
/*
* Tests access to local cache attributes
*/
@SuppressWarnings("deprecation")
@Test
public void testDistributedCacheMixedJDBCStoreReadWriteOperation() throws Exception {
ModelNode stringKeyedTable = createStringKeyedTable();
// Parse and install the XML into the controller
String subsystemXml = getSubsystemXml();
KernelServices servicesA = this.createKernelServicesBuilder().setSubsystemXml(subsystemXml).build();
// read the distributed cache mixed-keyed-jdbc-store datasource attribute
ModelNode result = servicesA.executeOperation(getMixedKeyedJDBCCacheStoreReadOperation("maximal", DistributedCacheResourceDefinition.WILDCARD_PATH.getKey(), "dist", JDBCStoreResourceDefinition.Attribute.DATA_SOURCE));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("ExampleDS", result.get(RESULT).asString());
// write the batching attribute
result = servicesA.executeOperation(getMixedKeyedJDBCCacheStoreWriteOperation("maximal", DistributedCacheResourceDefinition.WILDCARD_PATH.getKey(), "dist", JDBCStoreResourceDefinition.Attribute.DATA_SOURCE, "new-datasource"));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
// re-read the batching attribute
result = servicesA.executeOperation(getMixedKeyedJDBCCacheStoreReadOperation("maximal", DistributedCacheResourceDefinition.WILDCARD_PATH.getKey(), "dist", JDBCStoreResourceDefinition.Attribute.DATA_SOURCE));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals("new-datasource", result.get(RESULT).asString());
// read the string-keyed-table attribute
result = servicesA.executeOperation(getMixedKeyedJDBCCacheStoreReadOperation("maximal", DistributedCacheResourceDefinition.WILDCARD_PATH.getKey(), "dist", MixedKeyedJDBCStoreResourceDefinition.DeprecatedAttribute.STRING_TABLE));
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(stringKeyedTable.asPropertyList().size(), result.get(RESULT).asPropertyList().size());
for (Property property : stringKeyedTable.asPropertyList()) {
Assert.assertTrue(result.get(RESULT).hasDefined(property.getName()));
Assert.assertEquals(property.getValue(), result.get(RESULT).get(property.getName()));
}
}
private static ModelNode createStringKeyedTable() {
// create a string-keyed-table complex attribute
ModelNode stringKeyedTable = new ModelNode().setEmptyObject();
stringKeyedTable.get(StringTableResourceDefinition.Attribute.PREFIX.getName()).set("ispn_bucket");
stringKeyedTable.get(TableResourceDefinition.Attribute.BATCH_SIZE.getName()).set(100);
stringKeyedTable.get(TableResourceDefinition.Attribute.FETCH_SIZE.getName()).set(100);
ModelNode idColumn = stringKeyedTable.get(TableResourceDefinition.ColumnAttribute.ID.getName()).setEmptyObject();
idColumn.get(TableResourceDefinition.ColumnAttribute.ID.getColumnName().getName()).set("id");
idColumn.get(TableResourceDefinition.ColumnAttribute.ID.getColumnType().getName()).set("VARCHAR");
ModelNode dataColumn = stringKeyedTable.get(TableResourceDefinition.ColumnAttribute.DATA.getName()).setEmptyObject();
dataColumn.get(TableResourceDefinition.ColumnAttribute.DATA.getColumnName().getName()).set("datum");
dataColumn.get(TableResourceDefinition.ColumnAttribute.DATA.getColumnType().getName()).set("BINARY");
ModelNode timestampColumn = stringKeyedTable.get(TableResourceDefinition.ColumnAttribute.TIMESTAMP.getName()).setEmptyObject();
timestampColumn.get(TableResourceDefinition.ColumnAttribute.TIMESTAMP.getColumnName().getName()).set("version");
timestampColumn.get(TableResourceDefinition.ColumnAttribute.TIMESTAMP.getColumnType().getName()).set("BIGINT");
return stringKeyedTable;
}
@SuppressWarnings("deprecation")
@Test
public void testStoreProperties() throws Exception {
KernelServices services = this.createKernelServicesBuilder().setSubsystemXml(this.getSubsystemXml()).build();
PathAddress address = getRemoteCacheStoreAddress("maximal", InvalidationCacheResourceDefinition.WILDCARD_PATH.getKey(), "invalid");
String key = "infinispan.client.hotrod.ping_on_startup";
String value = "true";
ModelNode operation = Operations.createMapPutOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key, value);
ModelNode result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createMapGetOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(value, result.get(RESULT).asString());
operation = Operations.createMapRemoveOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createMapGetOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
// Validate that properties can still be added/removed/updated via child property resources
PathAddress propertyAddress = address.append(StorePropertyResourceDefinition.pathElement(key));
operation = Operations.createAddOperation(propertyAddress, Collections.<Attribute, ModelNode>singletonMap(new SimpleAttribute(StorePropertyResourceDefinition.VALUE), new ModelNode(value)));
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createMapGetOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(value, result.get(RESULT).asString());
value = "false";
operation = Operations.createWriteAttributeOperation(propertyAddress, new SimpleAttribute(StorePropertyResourceDefinition.VALUE), new ModelNode(value));
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createMapGetOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(value, result.get(RESULT).asString());
operation = Operations.createReadAttributeOperation(propertyAddress, new SimpleAttribute(StorePropertyResourceDefinition.VALUE));
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(value, result.get(RESULT).asString());
operation = Util.createRemoveOperation(propertyAddress);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createMapGetOperation(address, StoreResourceDefinition.Attribute.PROPERTIES, key);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
}
@Test
public void testAliases() throws Exception {
KernelServices services = this.createKernelServicesBuilder().setSubsystemXml(this.getSubsystemXml()).build();
PathAddress address = getCacheContainerAddress("minimal");
String alias = "alias0";
ModelNode operation = Operations.createListAddOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, alias);
ModelNode result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createListGetOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, 0);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertEquals(new ModelNode(alias), result.get(RESULT));
operation = Operations.createListRemoveOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, 0);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createListGetOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, 0);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
// Validate that aliases can still be added/removed via legacy operations
operation = Util.createOperation("add-alias", address);
operation.get(ModelDescriptionConstants.NAME).set(alias);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createListGetOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, 0);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
/* This currently fails due to WFCORE-626, requires wildfly-core-1.0.0.Beta4
Assert.assertEquals(new ModelNode(alias), result.get(RESULT));
*/
operation = Util.createOperation("remove-alias", address);
operation.get(ModelDescriptionConstants.NAME).set(alias);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
operation = Operations.createListGetOperation(address, CacheContainerResourceDefinition.Attribute.ALIASES, 0);
result = services.executeOperation(operation);
Assert.assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
Assert.assertFalse(result.get(RESULT).isDefined());
}
}