/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software 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
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.api.common;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.springframework.orm.jpa.EntityManagerHolder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import com.abiquo.server.core.appslibrary.AppsLibraryGenerator;
import com.abiquo.server.core.appslibrary.CategoryGenerator;
import com.abiquo.server.core.appslibrary.TemplateDefinitionGenerator;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplateGenerator;
import com.abiquo.server.core.cloud.HypervisorGenerator;
import com.abiquo.server.core.cloud.NodeVirtualImageGenerator;
import com.abiquo.server.core.cloud.VirtualApplianceGenerator;
import com.abiquo.server.core.cloud.VirtualDatacenterGenerator;
import com.abiquo.server.core.cloud.VirtualImageConversionGenerator;
import com.abiquo.server.core.cloud.VirtualMachineGenerator;
import com.abiquo.server.core.cloud.stateful.NodeVirtualImageStatefulConversionGenerator;
import com.abiquo.server.core.cloud.stateful.VirtualApplianceStatefulConversionGenerator;
import com.abiquo.server.core.common.persistence.JPAConfiguration;
import com.abiquo.server.core.config.SystemPropertyGenerator;
import com.abiquo.server.core.enterprise.EnterpriseGenerator;
import com.abiquo.server.core.enterprise.PrivilegeGenerator;
import com.abiquo.server.core.enterprise.RoleGenerator;
import com.abiquo.server.core.enterprise.RoleLdapGenerator;
import com.abiquo.server.core.enterprise.UserGenerator;
import com.abiquo.server.core.infrastructure.DatacenterGenerator;
import com.abiquo.server.core.infrastructure.DatacenterLimitsGenerator;
import com.abiquo.server.core.infrastructure.DatastoreGenerator;
import com.abiquo.server.core.infrastructure.MachineGenerator;
import com.abiquo.server.core.infrastructure.RackGenerator;
import com.abiquo.server.core.infrastructure.RemoteServiceGenerator;
import com.abiquo.server.core.infrastructure.RepositoryGenerator;
import com.abiquo.server.core.infrastructure.UcsRackGenerator;
import com.abiquo.server.core.infrastructure.management.RasdGenerator;
import com.abiquo.server.core.infrastructure.management.RasdManagementGenerator;
import com.abiquo.server.core.infrastructure.network.IpPoolManagementGenerator;
import com.abiquo.server.core.infrastructure.network.VLANNetworkGenerator;
import com.abiquo.server.core.infrastructure.storage.DiskManagementGenerator;
import com.abiquo.server.core.infrastructure.storage.InitiatorMappingGenerator;
import com.abiquo.server.core.infrastructure.storage.VolumeManagementGenerator;
import com.abiquo.server.core.pricing.PricingTemplateGenerator;
import com.softwarementors.commons.test.SeedGenerator;
@TestExecutionListeners( {DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class})
@ContextConfiguration(locations = {"classpath:springresources/applicationContext-test.xml"})
public abstract class AbstractGeneratorTest extends AbstractTestNGSpringContextTests
{
protected SeedGenerator seed = new SeedGenerator();
protected VirtualDatacenterGenerator vdcGenerator = new VirtualDatacenterGenerator(seed);
protected EnterpriseGenerator enterpriseGenerator = new EnterpriseGenerator(seed);
protected VirtualApplianceGenerator vappGenerator = new VirtualApplianceGenerator(seed);
protected DatacenterGenerator datacenterGenerator = new DatacenterGenerator(seed);
protected DatacenterLimitsGenerator datacenterLimitsGenerator =
new DatacenterLimitsGenerator(seed);
protected RackGenerator rackGenerator = new RackGenerator(seed);
protected UcsRackGenerator ucsRackGenerator = new UcsRackGenerator(seed);
protected MachineGenerator machineGenerator = new MachineGenerator(seed);
protected HypervisorGenerator hypervisorGenerator = new HypervisorGenerator(seed);
protected RemoteServiceGenerator remoteServiceGenerator = new RemoteServiceGenerator(seed);
protected VirtualApplianceGenerator virtualApplianceGenerator =
new VirtualApplianceGenerator(seed);
protected RasdManagementGenerator rasdManagementGenerator = new RasdManagementGenerator(seed);
protected RasdGenerator rasdGenerator = new RasdGenerator(seed);
protected VolumeManagementGenerator volumeManagementGenerator =
new VolumeManagementGenerator(seed);
protected VirtualMachineTemplateGenerator virtualMachineTemplateGenerator =
new VirtualMachineTemplateGenerator(seed);
protected VirtualImageConversionGenerator conversionGenerator =
new VirtualImageConversionGenerator(seed);
protected NodeVirtualImageGenerator nodeVirtualImageGenerator =
new NodeVirtualImageGenerator(seed);
protected RoleGenerator roleGenerator = new RoleGenerator(seed);
protected UserGenerator userGenerator = new UserGenerator(seed);
protected VirtualMachineGenerator vmGenerator = new VirtualMachineGenerator(seed);
protected DatastoreGenerator datastoreGenerator = new DatastoreGenerator(seed);
protected IpPoolManagementGenerator ipGenerator = new IpPoolManagementGenerator(seed);
protected VLANNetworkGenerator vlanGenerator = new VLANNetworkGenerator(seed);
protected SystemPropertyGenerator systemPropertyGenerator = new SystemPropertyGenerator(seed);
protected PrivilegeGenerator privilegeGenerator = new PrivilegeGenerator(seed);
protected RoleLdapGenerator roleLdapGenerator = new RoleLdapGenerator(seed);
protected CategoryGenerator categoryGenerator = new CategoryGenerator(seed);
protected TemplateDefinitionGenerator templateDefGenerator =
new TemplateDefinitionGenerator(seed);
protected AppsLibraryGenerator appsLibraryGenerator = new AppsLibraryGenerator(seed);
protected RepositoryGenerator repositoryGenerator = new RepositoryGenerator(seed);
protected DiskManagementGenerator diskGenerator = new DiskManagementGenerator(seed);
protected InitiatorMappingGenerator initiatorMappingGenerator =
new InitiatorMappingGenerator(seed);
protected VirtualImageConversionGenerator virtualImageConversionGenerator =
new VirtualImageConversionGenerator(seed);
protected VirtualApplianceStatefulConversionGenerator virtualApplianceStatefulConversionGenerator =
new VirtualApplianceStatefulConversionGenerator(seed);
protected NodeVirtualImageStatefulConversionGenerator nodeVirtualImageStatefulConversionGenerator =
new NodeVirtualImageStatefulConversionGenerator(seed);
protected PricingTemplateGenerator pricingTemplateGenerator =
new PricingTemplateGenerator(seed);
protected void setup(final Object... entities)
{
EntityManager em = getEntityManager();
rollbackActiveTransaction(em);
em.getTransaction().begin();
for (Object entity : entities)
{
em.persist(entity);
}
em.getTransaction().commit();
em.close();
}
protected void update(final Object... entities)
{
EntityManager em = getEntityManager();
rollbackActiveTransaction(em);
em.getTransaction().begin();
for (Object entity : entities)
{
em.merge(entity);
}
em.getTransaction().commit();
em.close();
}
@BeforeMethod
public void setup()
{
// Set system properties for tests
// WARINING!!! This value should be the same than the used in the POM.xml to define the
// system property in the jetty runtime!!!
System.setProperty("abiquo.server.networking.vlanPerVdc", "4");
}
@AfterMethod
public void tearDown()
{
String[] entities =
{"ip_pool_management", "volume_management", "diskstateful_conversions",
"initiator_mapping", "rasd_management", "rasd", "nodevirtualimage", "nodenetwork",
"nodestorage", "noderelationtype", "node", "virtualmachine", "virtualimage",
"virtualimage_conversions", "node_virtual_image_stateful_conversions",
"virtual_appliance_conversions", "virtualapp", "vappstateful_conversions",
"virtualdatacenter", "vlans_dhcpOption", "dhcpOption", "vlan_network",
"vlan_network_assignment", "network_configuration", "chef_runlist", "storage_pool",
"tier", "storage_device", "remote_service", "disk_management", "datastore_assignment",
"hypervisor", "workload_machine_load_rule", "physicalmachine", "datastore", "rack",
"ucs_rack", "datacenter", "repository", "workload_fit_policy_rule", "network",
"session", "user", "roles_privileges", "role_ldap", "role", "privilege",
"enterprise_properties_map", "enterprise_properties", "enterprise",
"enterprise_limits_by_datacenter", "workload_enterprise_exclusion_rule",
"ovf_package_list_has_ovf_package", "ovf_package", "ovf_package_list", "category",
"apps_library", "license", "system_properties", "vdc_enterprise_stats",
"vapp_enterprise_stats", "dc_enterprise_stats", "enterprise_resources_stats",
"cloud_usage_stats", "metering", "tasks", "alerts", "heartbeatlog", "repository",
"register", "costCodeCurrency", "pricingCostCode", "pricingTier", "pricingTemplate",
"currency", "costCode"};
tearDown(entities);
}
protected void tearDown(final String... entities)
{
EntityManager em = getEntityManager();
rollbackActiveTransaction(em);
em.getTransaction().begin();
for (String entity : entities)
{
em.createNativeQuery("delete from " + entity).executeUpdate();
}
em.getTransaction().commit();
em.close();
// Avoid having closed EntityManagers bound to the thread
TransactionSynchronizationManager.unbindResource(getEntityManagerFactory());
}
private EntityManagerFactory getEntityManagerFactory()
{
return applicationContext.getBean(EntityManagerFactory.class);
}
protected EntityManager getEntityManagerWithAnActiveTransaction()
{
EntityManager em = getEntityManager();
em.getTransaction().begin();
return em;
}
protected EntityManager getEntityManager()
{
EntityManagerFactory emf = getEntityManagerFactory();
EntityManager em = null;
if (TransactionSynchronizationManager.hasResource(emf))
{
EntityManagerHolder emHolder = getResource(emf);
em = emHolder.getEntityManager();
if (!em.isOpen())
{
em = createEntityManager(emf);
}
}
else
{
em = createEntityManager(emf);
TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em));
}
return em;
}
protected void commitActiveTransaction(final EntityManager em)
{
if (em.getTransaction().isActive())
{
em.getTransaction().commit();
}
}
protected void rollbackActiveTransaction(final EntityManager em)
{
if (em.getTransaction().isActive())
{
em.getTransaction().rollback();
}
}
private EntityManagerHolder getResource(final EntityManagerFactory emf)
{
return (EntityManagerHolder) TransactionSynchronizationManager.getResource(emf);
}
private EntityManager createEntityManager(final EntityManagerFactory emf)
{
return JPAConfiguration.enableDefaultFilters(emf.createEntityManager());
}
}