/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.resource.cluster; import java.util.List; import javax.persistence.EntityManager; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.authz.Role; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ClusterKey; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.util.ResourceTreeHelper; import org.rhq.enterprise.server.util.SessionTestHelper; /** * Test for {@link ClusterManagerBean} SLSB. * @author jshaughnessy * */ @Test(groups = { "resource.manager" }) public class ClusterManagerBeanTest extends AbstractEJB3Test { static private final boolean TESTS_ENABLED = true; private ClusterManagerLocal clusterManager; private ResourceGroupManagerLocal resourceGroupManager; private ResourceManagerLocal resourceManager; @Override protected void beforeMethod() { clusterManager = LookupUtil.getClusterManager(); resourceGroupManager = LookupUtil.getResourceGroupManager(); resourceManager = LookupUtil.getResourceManager(); } @Test(enabled = TESTS_ENABLED) public void testClusterKey() throws Throwable { getTransactionManager().begin(); try { EntityManager em = getEntityManager(); // setup simple test structures Subject subject = SessionTestHelper.createNewSubject(em, "subject-ClusterManagerBeanTest"); Role role = SessionTestHelper.createNewRoleForSubject(em, subject, "role-ClusterManagerBeanTest", Permission.MANAGE_INVENTORY); ResourceGroup clusterGroup = SessionTestHelper.createNewCompatibleGroupForRole(em, role, "clusterGroup-ClusterManagerBeanTest"); // setup two test resource trees to make into a resource cluster. Two compatible root nodes // with the exact same child hierarchy List<Resource> treeA = ResourceTreeHelper.createTree(em, "A=d1c1,d1c2; d1c1=d2c1,d2c2; d2c1=d3c1,d3c2; d2c2=d3c3,d3c4"); List<Resource> treeB = ResourceTreeHelper.createTree(em, "B=d1c1,d1c2; d1c1=d2c1,d2c2; d2c1=d3c1,d3c2; d2c2=d3c3,d3c4"); // test simple implicit resources Resource nodeA = ResourceTreeHelper.findNode(treeA, "A"); Resource nodeB = ResourceTreeHelper.findNode(treeB, "B"); resourceGroupManager.addResourcesToGroup(subject, clusterGroup.getId(), new int[] { nodeA.getId(), nodeB.getId() }); PageList<Resource> AChildren = resourceManager.findChildResources(subject, nodeA.getId(), PageControl .getUnlimitedInstance()); assert !AChildren.isEmpty() : "Expected Children for Node A"; int AChildResourceTypeId = AChildren.get(0).getResourceType().getId(); String AChildResourceKey = AChildren.get(0).getResourceKey(); ClusterKey clusterKey = new ClusterKey(clusterGroup.getId(), AChildResourceTypeId, AChildResourceKey); assert clusterKey.getClusterGroupId() == clusterGroup.getId(); assert clusterKey.getDepth() == 1; assert AChildResourceKey.equals(clusterKey.getHierarchy().get(0).getResourceKey()); assert AChildResourceTypeId == clusterKey.getHierarchy().get(0).getResourceTypeId(); assert AChildResourceTypeId == ClusterKey.getResourceType(clusterKey); assert ClusterKey.valueOf(clusterKey.toString()) != null; List<Resource> resources = clusterManager.getAutoClusterResources(subject, clusterKey); assert resources.size() == 2; assert resources.get(0).getId() != resources.get(1).getId(); assert resources.get(0).getParentResource().getId() != resources.get(1).getParentResource().getId(); assert resources.get(0).getParentResource().getId() == nodeA.getId() || resources.get(0).getParentResource().getId() == nodeB.getId(); assert resources.get(1).getParentResource().getId() == nodeA.getId() || resources.get(1).getParentResource().getId() == nodeB.getId(); assertNull(clusterManager.getAutoClusterBackingGroup(subject, clusterKey)); ResourceGroup backingGroup = clusterManager.createAutoClusterBackingGroup(subject, clusterKey, true); assertNotNull(backingGroup); assertEquals(backingGroup.getClusterKey(), clusterKey.toString()); assertEquals(backingGroup.getClusterResourceGroup(), clusterGroup); //Set<Resource> backingGroupResources = backingGroup.getExplicitResources(); // explicitResources for backingGroup is lazy, so we need to hit resourceManager for the answer List<Resource> backingGroupResources = resourceManager.findExplicitResourcesByResourceGroup(subject, backingGroup, PageControl.getUnlimitedInstance()); assertEquals(backingGroupResources.size(), resources.size()); for (Resource resource : backingGroupResources) { assert resources.contains(resource); } } catch (Throwable t) { t.printStackTrace(); throw t; } finally { getTransactionManager().rollback(); } } @Test(enabled = TESTS_ENABLED) public void testClusterKeyDepth2() throws Throwable { getTransactionManager().begin(); try { EntityManager em = getEntityManager(); // setup simple test structures Subject subject = SessionTestHelper.createNewSubject(em, "subject-ClusterManagerBeanTest"); Role role = SessionTestHelper.createNewRoleForSubject(em, subject, "role-ClusterManagerBeanTest", Permission.MANAGE_INVENTORY); ResourceGroup clusterGroup = SessionTestHelper.createNewCompatibleGroupForRole(em, role, "clusterGroup-ClusterManagerBeanTest"); // setup two test resource trees to make into a resource cluster. Two compatible root nodes // with the exact same child hierarchy List<Resource> treeA = ResourceTreeHelper.createTree(em, "A=d1c1,d1c2; d1c1=d2c1,d2c2; d2c1=d3c1,d3c2; d2c2=d3c3,d3c4"); List<Resource> treeB = ResourceTreeHelper.createTree(em, "B=d1c1,d1c2; d1c1=d2c1,d2c2; d2c1=d3c1,d3c2; d2c2=d3c3,d3c4"); // test simple implicit resources Resource nodeA = ResourceTreeHelper.findNode(treeA, "A"); Resource nodeB = ResourceTreeHelper.findNode(treeB, "B"); resourceGroupManager.addResourcesToGroup(subject, clusterGroup.getId(), new int[] { nodeA.getId(), nodeB.getId() }); PageList<Resource> AChildren = resourceManager.findChildResources(subject, nodeA.getId(), PageControl .getUnlimitedInstance()); assert !AChildren.isEmpty() : "Expected Children for Node A"; Resource AChild = AChildren.get(0); int AChildResourceTypeId = AChild.getResourceType().getId(); String AChildResourceKey = AChild.getResourceKey(); PageList<Resource> AGrandChildren = resourceManager.findChildResources(subject, AChild.getId(), PageControl .getUnlimitedInstance()); Resource AGrandChild = AGrandChildren.get(0); int AGrandChildResourceTypeId = AGrandChild.getResourceType().getId(); String AGrandChildResourceKey = AGrandChild.getResourceKey(); ClusterKey clusterKey = new ClusterKey(clusterGroup.getId(), AChildResourceTypeId, AChildResourceKey); clusterKey.addChildToHierarchy(AGrandChildResourceTypeId, AGrandChildResourceKey); assert clusterKey.getClusterGroupId() == clusterGroup.getId(); assert clusterKey.getDepth() == 2; assert AChildResourceKey.equals(clusterKey.getHierarchy().get(0).getResourceKey()); assert AChildResourceTypeId == clusterKey.getHierarchy().get(0).getResourceTypeId(); assert AGrandChildResourceKey.equals(clusterKey.getHierarchy().get(1).getResourceKey()); assert AGrandChildResourceTypeId == clusterKey.getHierarchy().get(1).getResourceTypeId(); assert AGrandChildResourceTypeId == ClusterKey.getResourceType(clusterKey); assert ClusterKey.valueOf(clusterKey.toString()) != null; List<Resource> resources = clusterManager.getAutoClusterResources(subject, clusterKey); assert resources.size() == 2; assert resources.get(0).getId() != resources.get(1).getId(); assert resources.get(0).getParentResource().getId() != resources.get(1).getParentResource().getId(); assert resources.get(0).getParentResource().getParentResource().getId() == nodeA.getId() || resources.get(0).getParentResource().getParentResource().getId() == nodeB.getId(); assert resources.get(1).getParentResource().getParentResource().getId() == nodeA.getId() || resources.get(1).getParentResource().getParentResource().getId() == nodeB.getId(); } catch (Throwable t) { t.printStackTrace(); throw t; } finally { getTransactionManager().rollback(); } } }