modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java | 2 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/cloud/TopologyManagerBeanTest.java | 65 ++++++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerBean.java | 9 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerLocal.java | 4 4 files changed, 79 insertions(+), 1 deletion(-)
New commits: commit 5b5ff9067f5d90338e3628e9c0988ec6a8ef97e1 Author: Jirka Kremser jkremser@redhat.com Date: Mon May 6 21:08:45 2013 +0200
Adding criteria finder for StorageNode entity and itest for the finder.
diff --git a/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java b/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java index 25bbc69..b7073ae 100644 --- a/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java +++ b/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java @@ -113,7 +113,7 @@ public class CCMSuiteDeploymentExtension implements LoadableExtension { ccm.startCluster(false);
ClusterInitService clusterInitService = new ClusterInitService(); - clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20, 2); + clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20, 5);
SchemaManager schemaManager = new SchemaManager("cassandra", "cassandra", nodes); if (!schemaManager.schemaExists()) { diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/cloud/TopologyManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/cloud/TopologyManagerBeanTest.java index cd2523e..f091e8d 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/cloud/TopologyManagerBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/cloud/TopologyManagerBeanTest.java @@ -30,7 +30,9 @@ import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.cloud.Server.OperationMode; +import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.criteria.ServerCriteria; +import org.rhq.core.domain.criteria.StorageNodeCriteria; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.server.test.AbstractEJB3Test; @@ -546,4 +548,67 @@ public class TopologyManagerBeanTest extends AbstractEJB3Test { } }); } + + + @Test(groups = "integration.ejb3") + public void testStorageNodeCriteriaFinder() throws Exception { + + final int storageNodeCount = 42; + executeInTransaction(new TransactionCallback() { + + public void execute() throws Exception { + // verify that all storage nodes objects are actually parsed. + final Set<String> nodeAddresses = new HashSet<String>(storageNodeCount); + + final String prefix = "storage_node"; + StorageNode lastOne = null, firstOne = null; + for (int i = 0; i < storageNodeCount; i++) { + String address = prefix + String.format(" %03d", i + 1) + ".domain.com"; + StorageNode node = new StorageNode(); + node.setAddress(address); + node.setOperationMode(StorageNode.OperationMode.NORMAL); + node.setJmxPort(7299 + i); + node.setCqlPort(9142 + i); + if(i == 0) { + firstOne = node; + } else if (i == storageNodeCount - 1) { + lastOne = node; + } + + em.persist(node); + nodeAddresses.add(address); + em.flush(); + } + em.flush(); + + assertTrue("The number of created storage nodes should be " + storageNodeCount + ". Was: " + nodeAddresses.size(), + storageNodeCount == nodeAddresses.size()); + + StorageNodeCriteria criteria = new StorageNodeCriteria(); + criteria.addFilterAddress(prefix); + criteria.addSortAddress(PageOrdering.DESC); // use DESC just to make sure sorting on name is different than insert order + PageList<StorageNode> list = topologyManager.findStorageNodesByCriteria(overlord, criteria); + + assertTrue("The number of found storage nodes should be " + storageNodeCount + ". Was: " + list.size(), + storageNodeCount == list.size()); + + assertTrue("The first storage node [" + firstOne + "] should be same as the last one in the list [ " + list.get(list.size() - 1) + "]", + firstOne.equals(list.get(list.size() - 1))); + + assertTrue("The last storage node [" + lastOne + "] should be same as the first one in the list [ " + list.get(0) + "]", + lastOne.equals(list.get(0))); + + String prevAddress = null; + for (StorageNode s : list) { + assert null == prevAddress || s.getAddress().compareTo(prevAddress) < 0 : "Results should be sorted by address DESC, something is out of order"; + prevAddress = s.getAddress(); + nodeAddresses.remove(s.getAddress()); + } + + // test that entire list was parsed + assertTrue("Expected resourceNames to be empty. Still " + nodeAddresses.size() + " name(s).", + nodeAddresses.size() == 0); + } + }); + } } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerBean.java index 7926504..faa44d7 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerBean.java @@ -35,8 +35,10 @@ import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.cloud.FailoverListDetails; import org.rhq.core.domain.cloud.PartitionEventType; import org.rhq.core.domain.cloud.Server; +import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.cloud.composite.ServerWithAgentCountComposite; import org.rhq.core.domain.criteria.ServerCriteria; +import org.rhq.core.domain.criteria.StorageNodeCriteria; import org.rhq.core.domain.resource.Agent; import org.rhq.core.domain.server.PersistenceUtility; import org.rhq.core.domain.util.PageControl; @@ -313,4 +315,11 @@ public class TopologyManagerBean implements TopologyManagerLocal { CriteriaQueryRunner<Server> runner = new CriteriaQueryRunner<Server>(criteria, generator, entityManager); return runner.execute(); } + + @RequiredPermission(Permission.MANAGE_SETTINGS) + public PageList<StorageNode> findStorageNodesByCriteria(Subject subject, StorageNodeCriteria criteria) { + CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria); + CriteriaQueryRunner<StorageNode> runner = new CriteriaQueryRunner<StorageNode>(criteria, generator, entityManager); + return runner.execute(); + } } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerLocal.java index f098e54..3d66d30 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/TopologyManagerLocal.java @@ -25,8 +25,10 @@ import javax.ejb.Local; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.cloud.FailoverListDetails; import org.rhq.core.domain.cloud.Server; +import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.cloud.composite.ServerWithAgentCountComposite; import org.rhq.core.domain.criteria.ServerCriteria; +import org.rhq.core.domain.criteria.StorageNodeCriteria; import org.rhq.core.domain.resource.Agent; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; @@ -152,4 +154,6 @@ public interface TopologyManagerLocal { * @return list of servers */ PageList<Server> findServersByCriteria(Subject subject, ServerCriteria criteria); + + PageList<StorageNode> findStorageNodesByCriteria(Subject subject, StorageNodeCriteria criteria); }