/* * 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.util; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import javax.persistence.EntityManager; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.authz.Permission.Target; import org.rhq.core.domain.authz.Role; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.configuration.definition.PropertySimpleType; import org.rhq.core.domain.measurement.Availability; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.measurement.ResourceAvailability; import org.rhq.core.domain.resource.Agent; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.enterprise.server.auth.SessionManager; public class SessionTestHelper { private static AtomicInteger idGenerator = new AtomicInteger(0); /* * supporting methods to help carry out primary tests */ public static boolean samePermissions(Set<Permission> one, Set<Permission> two) { return one.containsAll(two) && two.containsAll(one); } public static Set<Permission> getAllGlobalPerms() { Permission[] allPermissions = Permission.values(); Set<Permission> globalPermissions = EnumSet.noneOf(Permission.class); for (Permission permission : allPermissions) { if (permission.getTarget() == Target.GLOBAL) { globalPermissions.add(permission); } } return globalPermissions; } public static Set<Permission> getAllResourcePerms() { Permission[] allPermissions = Permission.values(); Set<Permission> globalPermissions = EnumSet.noneOf(Permission.class); for (Permission permission : allPermissions) { if (permission.getTarget() == Target.RESOURCE) { globalPermissions.add(permission); } } return globalPermissions; } public static Subject createNewSubject(EntityManager em, String subjectName) { subjectName = preprocess(subjectName); Subject newSubject = new Subject(); newSubject.setName(subjectName); newSubject.setFactive(true); newSubject.setFsystem(false); em.persist(newSubject); em.flush(); // We want to return the attached object but sessionmanager.put will return a detached copy of newSubject. // Copy over the sessionId and pass back the attached Subject. Subject sessionSubject = SessionManager.getInstance().put(newSubject, 1000 * 60 * 10); // 10 mins timeout newSubject.setSessionId(sessionSubject.getSessionId()); return newSubject; } public static void simulateLogin(Subject subject) { Subject sessionSubject = SessionManager.getInstance().put(subject, 1000 * 60 * 10); // 10 mins timeout subject.setSessionId(sessionSubject.getSessionId()); return; } public static void simulateLogout(Subject subject) { Integer sessionId = subject.getSessionId(); if (sessionId != null) { SessionManager.getInstance().invalidate(sessionId); } return; } public static Role createNewRoleForSubject(EntityManager em, Subject subject, String roleName) { return createNewRoleForSubject(em, subject, roleName, new Permission[0]); } public static Role createNewRoleForSubject(EntityManager em, Subject subject, String roleName, Permission... permissions) { roleName = preprocess(roleName); Role newRole = new Role(roleName); newRole.setFsystem(false); for (Permission perm : permissions) { newRole.addPermission(perm); } subject.getRoles().add(newRole); newRole.getSubjects().add(subject); em.persist(subject); em.persist(newRole); em.flush(); return newRole; } public static void addRolePermissions(EntityManager em, Role role, Permission... permissions) { role.getPermissions().addAll(Arrays.asList(permissions)); em.merge(role); em.flush(); } public static void removeRolePermissions(EntityManager em, Role role, Permission... permissions) { role.getPermissions().removeAll(Arrays.asList(permissions)); em.merge(role); em.flush(); } public static ResourceType createNewResourceType(EntityManager em) { ResourceType type = new ResourceType(preprocess("testType"), "testPlugin", ResourceCategory.PLATFORM, null); ConfigurationDefinition resourceConfigDef = new ConfigurationDefinition("Fake resconfig def", "Resource config def for fake test resource"); resourceConfigDef.put(new PropertyDefinitionSimple("fake", "fake property", false, PropertySimpleType.BOOLEAN)); resourceConfigDef.put(new PropertyDefinitionSimple("fakeReadOnly", "fake readonly property", false, PropertySimpleType.BOOLEAN)); resourceConfigDef.getPropertyDefinitions().get("fakeReadOnly").setReadOnly(true); type.setResourceConfigurationDefinition(resourceConfigDef); ConfigurationDefinition pluginConfigDef = new ConfigurationDefinition("Fake pluginconfig def", "Plugin config def for fake test resource"); pluginConfigDef.put(new PropertyDefinitionSimple("fake", "fake property", false, PropertySimpleType.BOOLEAN)); pluginConfigDef.put(new PropertyDefinitionSimple("fakeReadOnly", "fake readonly property", false, PropertySimpleType.BOOLEAN)); pluginConfigDef.getPropertyDefinitions().get("fakeReadOnly").setReadOnly(true); type.setPluginConfigurationDefinition(pluginConfigDef); em.persist(type); em.flush(); return type; } public static ResourceGroup createNewCompatibleGroupForRole(EntityManager em, Role role, String groupName) { return createNewCompatibleGroupForRole(em, role, groupName, null); } public static ResourceGroup createNewCompatibleGroupForRole(EntityManager em, Role role, String groupName, ResourceType type) { if (type == null) { type = createNewResourceType(em); } return createNewGroupForRoleHelper(em, role, groupName, type, false); } public static ResourceGroup createNewMixedGroupForRole(EntityManager em, Role role, String groupName, boolean recursive) { return createNewGroupForRoleHelper(em, role, groupName, null, recursive); } private static ResourceGroup createNewGroupForRoleHelper(EntityManager em, Role role, String groupName, ResourceType type, boolean recursive) { ResourceGroup newGroup = null; groupName = preprocess(groupName); if (type == null) { newGroup = new ResourceGroup(groupName); newGroup.setRecursive(recursive); } else { newGroup = new ResourceGroup(groupName, type); } if (role != null) { role.getResourceGroups().add(newGroup); newGroup.addRole(role); em.persist(role); } em.persist(newGroup); em.flush(); return newGroup; } /** This uses only EM, it does not call the SLSB for adding resources to a group! */ public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName) { ResourceType type = group.getResourceType(); return createNewResourceForGroup(em, group, resourceName, type, true); } /** This uses only EM, it does not call the SLSB for adding resources to a group! */ public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName, ResourceType type, boolean doFlush) { return createNewResourceForGroup(em, group, resourceName, type, AvailabilityType.UP, doFlush); } /** This uses only EM, it does not call the SLSB for adding resources to a group! */ public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName, ResourceType type, AvailabilityType avail, boolean doFlush) { if (type == null) { type = createNewResourceType(em); } resourceName = preprocess(resourceName); Resource resource = new Resource(resourceName, resourceName, type); resource.setUuid("" + new Random().nextInt()); resource.setInventoryStatus(InventoryStatus.COMMITTED); resource.initCurrentAvailability(); // the only way I can see to intialize the avail list resource.setCurrentAvailability(new ResourceAvailability(resource, avail)); resource.getAvailability().clear(); resource.getAvailability().add(new Availability(resource, 0L, avail)); group.addExplicitResource(resource); resource.getExplicitGroups().add(group); /* * Single resource implies the implicit resource list should mirror the explicit one */ group.addImplicitResource(resource); resource.getImplicitGroups().add(group); em.persist(resource); if (doFlush) { em.flush(); } return resource; } public static Agent createNewAgent(EntityManager em, String agentName) { agentName = preprocess(agentName); String address = preprocess("localhost"); int port = 16163; String endPoint = "socket://" + address + ":" + port + "/?rhq.communications.connector.rhqtype=agent"; Agent agent = new Agent(agentName, address, port, endPoint, agentName); em.persist(agent); em.flush(); return agent; } public static Resource createNewResource(EntityManager em, String resourceName) { return createNewResource(em, resourceName, null); } public static Resource createNewResource(EntityManager em, String resourceName, ResourceType type) { if (type == null) { type = new ResourceType(preprocess("testType"), "testPlugin", ResourceCategory.PLATFORM, null); em.persist(type); } resourceName = preprocess(resourceName); Resource resource = new Resource(resourceName, resourceName, type); resource.setUuid("" + new Random().nextInt()); resource.setInventoryStatus(InventoryStatus.COMMITTED); resource.setCurrentAvailability(new ResourceAvailability(resource, AvailabilityType.UP)); em.persist(resource); em.flush(); return resource; } public static Collection<Integer> getResourceList(Resource... resources) { Collection<Integer> resourceIdList = new ArrayList<Integer>(resources.length + 1); for (Resource resource : resources) { resourceIdList.add(resource.getId()); } return resourceIdList; } private static String preprocess(String name) { return name += (System.currentTimeMillis() + "-" + idGenerator.getAndIncrement()); } }