com.abiquo.abiserver.model.PopulateModelTest.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.abiserver.model.PopulateModelTest.java

Source

/**
 * 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.abiserver.model;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.DatacenterHB;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.HypervisorHB;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.PhysicalmachineHB;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.RackHB;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum;
import com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkConfigurationHB;
import com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkHB;
import com.abiquo.abiserver.business.hibernate.pojohb.networking.VlanNetworkHB;
import com.abiquo.abiserver.business.hibernate.pojohb.user.EnterpriseHB;
import com.abiquo.abiserver.business.hibernate.pojohb.user.UserHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeTypeEnum;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualDataCenterHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualappHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualmachineHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualhardware.ResourceAllocationSettingData;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualhardware.ResourceManagementHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.CategoryHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.RepositoryHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.VirtualimageHB;
import com.abiquo.abiserver.exception.PersistenceException;
import com.abiquo.abiserver.persistence.DAOFactory;
import com.abiquo.abiserver.persistence.dao.infrastructure.DataCenterDAO;
import com.abiquo.abiserver.persistence.dao.infrastructure.HyperVisorDAO;
import com.abiquo.abiserver.persistence.dao.infrastructure.PhysicalMachineDAO;
import com.abiquo.abiserver.persistence.dao.infrastructure.RackDAO;
import com.abiquo.abiserver.persistence.dao.networking.IpPoolManagementDAO;
import com.abiquo.abiserver.persistence.dao.networking.NetworkConfigurationDAO;
import com.abiquo.abiserver.persistence.dao.networking.NetworkDAO;
import com.abiquo.abiserver.persistence.dao.networking.VlanNetworkDAO;
import com.abiquo.abiserver.persistence.dao.user.EnterpriseDAO;
import com.abiquo.abiserver.persistence.dao.user.UserDAO;
import com.abiquo.abiserver.persistence.dao.virtualappliance.NodeVirtualImageDAO;
import com.abiquo.abiserver.persistence.dao.virtualappliance.VirtualApplianceDAO;
import com.abiquo.abiserver.persistence.dao.virtualappliance.VirtualDataCenterDAO;
import com.abiquo.abiserver.persistence.dao.virtualappliance.VirtualMachineDAO;
import com.abiquo.abiserver.persistence.dao.virtualhardware.ResourceAllocationSettingDataDAO;
import com.abiquo.abiserver.persistence.dao.virtualhardware.ResourceManagementDAO;
import com.abiquo.abiserver.persistence.dao.virtualimage.CategoryDAO;
import com.abiquo.abiserver.persistence.dao.virtualimage.RepositoryDAO;
import com.abiquo.abiserver.persistence.dao.virtualimage.VirtualImageDAO;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory;
import com.abiquo.abiserver.persistence.hibernate.HibernateUtil;
import com.abiquo.abiserver.pojo.infrastructure.State;
import com.abiquo.abiserver.pojo.infrastructure.VirtualMachine;
import com.abiquo.model.enumerator.DiskFormatType;
import com.abiquo.model.enumerator.HypervisorType;

/**
 * XXX TBD + Creates a DataCenter a Rack and a VirtualDatacenter named ''test''.<br>
 * + Create a VirtualAppliance (all the target images associated at this) <br>
 * + Use the default user ''user'' (id=1) and enterprise ''abiquo'' (id=1) <br>
 **/
public class PopulateModelTest {
    /** The logger object */
    private static Logger log = LoggerFactory.getLogger(PopulateModelTest.class);

    /** Test Datacenter name for all PhysicalMachines instances (to be clean at tearDown) */
    private final static String DATACENTER_TEST = "test";

    /** All added domain object's creation date. */
    protected Date date;

    /** All added domain object's creation user. */
    protected UserHB user;

    /** All added VirtualAppliances's state */
    private final StateEnum state;

    /** All added VirtualImages's category */
    private final CategoryHB category;

    /** All added PhysicalMachien's hypervisor type */
    private final HypervisorType htype;

    /** All added PhysicalMachine's Enterprise */
    private final EnterpriseHB enterprise;

    /** All added PhysicalMachine's DataCenter */
    protected DatacenterHB dc;

    /** All added PhysicalMachine's Rack */
    private final RackHB rack;

    /** All added VirtualAppliance's virtual datacenter. */
    private final VirtualDataCenterHB vdc;

    /** Virtual appliance requiring the virtual images. */
    private final VirtualappHB vApp;

    /** All added VirtualImage's image type */
    private final DiskFormatType imageType;

    /** All added VirtualImage's repository */
    private final RepositoryHB repository;

    private final HypervisorHB hypervisor;

    /** All added PhysicalPachines. */
    private final List<PhysicalmachineHB> phyMachines;

    /** Holds all the @link ResourceAllocationSettingData */
    private final List<ResourceAllocationSettingData> rasdHBs;

    /**
     * Holds a list of ResourceManagementHB objects which can be later accessed in order to deleted
     * the entries related to each on in the database
     */
    private final List<ResourceManagementHB> resourceManagementHBs;

    /** Singleton instance. */
    private static PopulateModelTest instance;

    /** DAO's factory */
    private DAOFactory factorytest;

    /**
     * Only created throw singleton access.
     * 
     * @throws PersistenceException
     */
    private PopulateModelTest() throws PersistenceException {

        date = new Date();
        htype = getDefaultHypervisorType();
        state = StateEnum.NOT_ALLOCATED;
        category = getDefaultCategory();
        user = getDefaultUser();
        enterprise = getDefaultEnterprise();

        hypervisor = getDefaultHypervisor();
        imageType = getDefaultImageType();
        repository = getDefaultRepository();

        dc = createDataCenter();

        rack = createRack(dc);
        vdc = createVirtualDataCenter(dc, enterprise, htype);

        vApp = createVirtualApp(vdc, enterprise, state);

        phyMachines = new LinkedList<PhysicalmachineHB>();

        rasdHBs = new ArrayList<ResourceAllocationSettingData>();

        resourceManagementHBs = new ArrayList<ResourceManagementHB>();

    }

    /**
     * Singleton access, return the unique instance.
     * 
     * @throws PersistenceException
     */
    public static PopulateModelTest getInstance() throws PersistenceException {
        if (instance == null) {
            instance = new PopulateModelTest();
        }

        return instance;
    }

    /**
     * @return the dataCenter for all PhysicalMachines on the test set (used to call
     *         IScheduler.select(xxx,datacenter))
     */
    public DatacenterHB getDataCenter() {
        return dc;
    }

    /**
     * @return the virtual application all the virtual images are referenced.
     */
    public VirtualappHB getVirtualApp() {
        return vApp;
    }

    /**
     * Adds on DB the PhysicalMachines from the ISchedulerTestCase
     * 
     * @param a list of configured machines.
     * @throws PersistenceException
     */
    public void initDBPhysicalMachines(final List<PhysicalmachineHB> machines) throws PersistenceException {
        for (PhysicalmachineHB pm : machines) {
            log.debug("Adding to DB PhysicalMachines " + pm.getName());

            phyMachines.add(createPhysicalMachine(pm, rack, htype));
        }
    }

    /**
     * Persist on database the input PhysicalMachine (also its DataCenter, Rack and So).
     * 
     * @throws PersistenceException
     */
    protected PhysicalmachineHB createPhysicalMachine(final PhysicalmachineHB machine, final RackHB rack,
            final HypervisorType htype) throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        PhysicalMachineDAO pmDAO = factorytest.getPhysicalMachineDAO();
        HyperVisorDAO hyperDAO = factorytest.getHyperVisorDAO();

        factorytest.beginConnection();

        HypervisorHB hyper = createHypervisor(htype);

        machine.setRack(rack);
        machine.setDataCenter(rack.getDatacenter());

        machine.setHypervisor(hyper);

        pmDAO.makePersistent(machine);

        log.debug("Added machine [{}]", machine.getName());

        hyper.setPhysicalMachine(machine);
        hyperDAO.makePersistent(hyper);

        factorytest.endConnection();

        return machine;
    }

    /** PhysicalMachine Factory construction XXX is not stored on DB. */
    public PhysicalmachineHB definePhysical(final String name, final int cpu, final int ram, final long hd) {
        PhysicalmachineHB mach = new PhysicalmachineHB();

        mach.setName(name);
        mach.setDescription("test");

        mach.setCpu(cpu);
        mach.setRam(ram);

        mach.setCpuUsed(0);
        mach.setRamUsed(0);

        return mach;
    }

    /**
     * VirtualImage Factory construction XXX is not stored on DB. (not an HB because it's not useful
     * the ''category''/''repository''...)
     * 
     * @throws PersistenceException
     * @param name
     * @param cpu
     * @param ram
     * @param hd
     * @return a reference to the newly created VirtualimageHB persistent object
     * @throws PersistenceException
     */
    public VirtualimageHB createVirtualImage(final String name, final int cpu, final int ram, final long hd)
            throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        VirtualImageDAO daoVI = factorytest.getVirtualImageDAO();

        factorytest.beginConnection();

        VirtualimageHB vImage = new VirtualimageHB();

        vImage.setName(name);
        vImage.setDescription("test");

        vImage.setCpuRequired(cpu);
        vImage.setHdRequired(hd);
        vImage.setRamRequired(ram);

        vImage.setPathName("test");

        vImage.setCategory(category);
        vImage.setType(imageType);
        vImage.setRepository(repository);

        daoVI.makePersistent(vImage);

        vImagesCreated.add(vImage);

        factorytest.endConnection();

        return vImage;
    }

    /**
     * All the created virtual images throw ''createVirtualImage'', stored in order to clean the DB.
     */
    private final List<VirtualimageHB> vImagesCreated = new LinkedList<VirtualimageHB>();

    /**
     * Creates nodes that correspond to the Virtualapp for the this object
     * 
     * @throws PersistenceException
     */
    public void createNodes() throws PersistenceException {

        VirtualMachine virtualMachine = new VirtualMachine();
        factorytest = HibernateDAOFactory.instance();
        HyperVisorDAO dao = factorytest.getHyperVisorDAO();

        factorytest.beginConnection();

        virtualMachine.setAssignedTo(dao.findById(hypervisor.getIdHyper()).toPojo());
        virtualMachine.setHd(1);
        virtualMachine.setHighDisponibility(true);
        virtualMachine.setDescription("test-virtual machine");
        virtualMachine.setCpu(2);
        virtualMachine.setRam(256);
        virtualMachine.setUUID("apophis");
        State state = new State(StateEnum.ALLOCATED);
        virtualMachine.setState(state);
        virtualMachine.setVdrpIP("vdrpIP");
        virtualMachine.setVdrpPort(5050);

        VirtualimageHB virtualImageHB = createVirtualImage("image", 4, 256, 2);
        virtualMachine.setVirtualImage(virtualImageHB.toPojo());

        createVirtualImageNode(virtualImageHB, virtualMachine);

        factorytest.endConnection();
    }

    private DatacenterHB createDataCenter() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        DataCenterDAO daoDC = factorytest.getDataCenterDAO();

        factorytest.beginConnection();
        DatacenterHB data = new DatacenterHB();

        data.setName(DATACENTER_TEST); // XXX
        data.setSituation("test");

        // XXX data.setRacks(racks);

        daoDC.makePersistent(data);
        factorytest.endConnection();

        return data;
    }

    /**
     * Rack Factory construction
     * 
     * @throws PersistenceException
     */
    private RackHB createRack(final DatacenterHB dc) throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        RackDAO daoRack = factorytest.getRackDAO();

        factorytest.beginConnection();

        RackHB rack = new RackHB();
        rack.setDatacenter(dc);
        rack.setName("test");
        rack.setShortDescription("test");
        rack.setLargeDescription("test");
        daoRack.makePersistent(rack);

        factorytest.endConnection();

        return rack;
    }

    /**
     * HyperVisor Factory construction
     * 
     * @throws PersistenceException
     */
    private HypervisorHB createHypervisor(final HypervisorType hType) throws PersistenceException {
        // Crudable<HypervisorHB, Integer> daoHyper =
        // new GenericHibernateDAO<HypervisorHB, Integer>(HypervisorHB.class);

        HypervisorHB hyp = new HypervisorHB();

        hyp.setType(hType);

        hyp.setIp("test");
        hyp.setIpService("test");
        hyp.setPort(0);

        // XXX hyp.setPhysicalMachine(physicalMachine);

        // daoHyper.makePersistent(hyp);

        return hyp;
    }

    /**
     * VirtualDataCenter Factory construction
     * 
     * @throws PersistenceException
     */
    private VirtualDataCenterHB createVirtualDataCenter(final DatacenterHB dc, final EnterpriseHB enterprise,
            final HypervisorType htype) throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        VirtualDataCenterDAO daoVdc = factorytest.getVirtualDataCenterDAO();

        factorytest.beginConnection();

        VirtualDataCenterHB vdc = new VirtualDataCenterHB();
        vdc.setEnterpriseHB(enterprise);
        vdc.setIdDataCenter(dc.getIdDataCenter());
        vdc.setName("test");
        vdc.setHypervisorType(htype);
        vdc.setNetwork(createNetwork());
        daoVdc.makePersistent(vdc);

        factorytest.endConnection();

        return vdc;
    }

    /**
     * Creates a {@link AbicloudNetworkHB} object
     * 
     * @return AbicloudNetworkHB object created
     * @throws PersistenceException
     */
    private NetworkHB createNetwork() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        NetworkDAO networkDAO = factorytest.getNetworkDAO();
        VlanNetworkDAO vlanNetworkDAO = factorytest.getVlanNetworkDAO();
        NetworkConfigurationDAO netConfDAO = factorytest.getNetworkConfigurationDAO();
        IpPoolManagementDAO hostDAO = factorytest.getIpPoolManagementDAO();

        factorytest.beginConnection();

        NetworkConfigurationHB netConf = new NetworkConfigurationHB();
        netConf.setMask(24);
        netConf.setNetmask("255.255.255.0");
        netConf.setNetworkAddress("192.168.1.0");
        netConfDAO.makePersistent(netConf);

        VlanNetworkHB vlanHB = new VlanNetworkHB();
        vlanHB.setNetworkName("Test VLAN");
        vlanHB.setConfiguration(netConf);
        vlanNetworkDAO.makePersistent(vlanHB);

        List<VlanNetworkHB> listOfVlans = new ArrayList<VlanNetworkHB>();
        listOfVlans.add(vlanHB);

        NetworkHB network = new NetworkHB();
        network.setUuid(UUID.randomUUID().toString());
        network.setNetworks(listOfVlans);
        networkDAO.makePersistent(network);

        return network;
    }

    /**
     * VirtualAppliance Factory construction
     * 
     * @throws PersistenceException
     */
    private VirtualappHB createVirtualApp(final VirtualDataCenterHB vdc, final EnterpriseHB enterprise,
            final StateEnum state) throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        VirtualApplianceDAO daoApp = factorytest.getVirtualApplianceDAO();

        factorytest.beginConnection();

        VirtualappHB vApp = new VirtualappHB();
        vApp.setEnterpriseHB(enterprise);
        vApp.setState(state);
        vApp.setVirtualDataCenterHB(vdc);
        vApp.setError(0);
        vApp.setHighDisponibility(1);
        vApp.setName("test");
        daoApp.makePersistent(vApp);

        factorytest.endConnection();

        return vApp;
    }

    /**
     * Gets the default hypervisor type (vBox id = 1)
     * 
     * @throws PersistenceException
     */
    private HypervisorType getDefaultHypervisorType() throws PersistenceException {
        return HypervisorType.VBOX;
    }

    /**
     * Retrieves the default hypervisor and returns pojo encapsulating this information
     * 
     * @return a {@link HypervisorHB} object representing the default Hypervisor stored in the DB
     * @throws PersistenceException
     */
    public HypervisorHB getDefaultHypervisor() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        HyperVisorDAO dao = factorytest.getHyperVisorDAO();

        factorytest.beginConnection();

        HypervisorHB hb = dao.findById(1);

        factorytest.endConnection();

        return hb;
    }

    /**
     * Gets the default enterprise (abiquo with id 1)
     */
    private EnterpriseHB getDefaultEnterprise() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        EnterpriseDAO daoEnt = factorytest.getEnterpriseDAO();

        factorytest.beginConnection();

        EnterpriseHB entHB = daoEnt.findById(1);

        factorytest.endConnection();

        return entHB;
    }

    /**
     * Gets the default user (named user )
     */
    protected UserHB getDefaultUser() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        UserDAO daoUser = factorytest.getUserDAO();

        factorytest.beginConnection();

        UserHB userHB = daoUser.findById(2);

        factorytest.endConnection();

        return userHB;
    }

    /**
     * Gets the default virtual image category (Others with id=1)
     * 
     * @throws PersistenceException
     */
    protected CategoryHB getDefaultCategory() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        CategoryDAO daoCategory = factorytest.getCategoryDAO();

        factorytest.beginConnection();

        CategoryHB catHB = daoCategory.findById(1);

        factorytest.endConnection();

        return catHB;

    }

    /** Log all PhysicalMachines on the DataBase */
    public void listPhysicalMachines() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        PhysicalMachineDAO daoPM = factorytest.getPhysicalMachineDAO();

        factorytest.beginConnection();

        List<PhysicalmachineHB> machines;

        machines = daoPM.findAll();

        log.debug("########## All PhysicalMachiene ##########");
        for (PhysicalmachineHB pm : machines) {
            log.debug("PhysicalMachine name:" + pm.getName() + " dc:" + pm.getRack().getDatacenter().getName()
                    + "\t cpu:" + pm.getCpu() + "(" + pm.getCpuUsed() + ")" + "\t ram:" + pm.getRam() + "("
                    + pm.getRamUsed() + ")");
        }

        factorytest.endConnection();
    }

    /**
     * Remove from DB the PhyisicalMachines from initPhysical implementation (actually remove
     * DataCenter @see dataCenter, for cascading delete physical machines disapear) Clean from DB
     * the scheduler test virtual datacenter, virtual application, icon and virtual images.
     * 
     * @throws PersistenceException
     */
    public void clearCreatedDomainObjects() throws PersistenceException {
        if (dc == null) {
            return;
        }

        factorytest = HibernateDAOFactory.instance();
        DataCenterDAO daoDc = factorytest.getDataCenterDAO();
        VirtualDataCenterDAO daoVdc = factorytest.getVirtualDataCenterDAO();
        VirtualImageDAO daoVi = factorytest.getVirtualImageDAO();

        factorytest.beginConnection();

        log.debug("Cleaning all the created objects ");

        daoDc.makeTransient(dc);
        daoVdc.makeTransient(vdc);

        // TODO: create the speciphic method by description??
        // Criterion descriptionTest = Restrictions.eq("description", "test");
        // for (VirtualimageHB vi : daoVi.findByCriteria(descriptionTest))
        // {
        // HibernateUtil.getSession().delete(vi); // XXX use DAO
        // }

        factorytest.endConnection();

    }

    /**
     * Gets the default image type (vBox id =1)
     * 
     * @throws PersistenceException
     */
    private DiskFormatType getDefaultImageType() throws PersistenceException {
        return DiskFormatType.RAW;
    }

    /**
     * Gets the default repository (main id =1)
     * 
     * @throws PersistenceException
     */
    private RepositoryHB getDefaultRepository() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        RepositoryDAO daoRep = factorytest.getRepositoryDAO();

        factorytest.beginConnection();

        RepositoryHB repHB = daoRep.findById(1);

        factorytest.endConnection();

        return repHB;
    }

    /**
     * Save the virtual machine, create and save a node virtual image with the virtual image /
     * machine relation.
     */
    public void createVirtualImageNode(final VirtualimageHB vImage, final VirtualMachine vMachine)
            throws PersistenceException {
        VirtualmachineHB vMachineHb = vMachine.toPojoHB();

        createVirtualMachine(vMachineHb);

        createNodeVirtualImage(vImage, vMachineHb);
    }

    /**
     * Save the virtual machine. XXX it do not use Crudable because the ''session.saveOrUpdate''
     * fails caused by ''Batch update returned unexpected row count from update [0]; actual row
     * count: 0; expected: 1'' TODO fix
     */
    private VirtualmachineHB createVirtualMachine(final VirtualmachineHB vMachine) throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        VirtualMachineDAO vmDAO = factorytest.getVirtualMachineDAO();

        factorytest.beginConnection();
        try {
            vmDAO.makePersistent(vMachine);
            factorytest.endConnection();
        } catch (HibernateException e) {
            factorytest.rollbackConnection();
            throw new PersistenceException("Hibernate exception", e);
        }

        return vMachine;
    }

    /**
     * TODO VirtualmachineHB vMachine (can be null)
     */
    private NodeVirtualImageHB createNodeVirtualImage(final VirtualimageHB vImage, final VirtualmachineHB vMachine)
            throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        NodeVirtualImageDAO daoNVI = factorytest.getNodeVirtualImageDAO();

        factorytest.beginConnection();

        NodeVirtualImageHB nVi = new NodeVirtualImageHB();
        // XXX nVi.setIdNode(idNode);
        nVi.setIdVirtualApp(vApp.getIdVirtualApp());
        nVi.setVirtualImageHB(vImage);
        nVi.setVirtualMachineHB(vMachine);

        nVi.setType(NodeTypeEnum.VIRTUAL_IMAGE);

        nVi.setName("test");

        nVi.setPosX(10);
        nVi.setPosY(10);

        daoNVI.makePersistent(nVi);

        factorytest.endConnection();

        return nVi;
    }

    // ResourceAllocationSettingData related methods

    /**
     * Creates the ResourceAllocationSettingData for all the types (as shown in the table below) by
     * calling each method dedicated to the creation of a specific RASD.
     * <p>
     * Each of thes method should have the format: <br>
     * <code> createRASD[idResource] </code> <br>
     * E.g The method for idResource 10 will be createRASD10
     * <p>
     * Implement methods as needed and follow examples
     * 
     * <pre>
     * +------------+-------------------------+
     * | idResource | name                    |
     * +------------+-------------------------+
     * |          1 | Other                   |
     * |          2 | Computer_System         |
     * |          3 | Processor               |
     * |          4 | Memory                  |
     * |          5 | IDE_Controller          |
     * |          6 | Parallel_SCSI_HBA       |
     * |          7 | FC_HBA                  |
     * |          8 | iSCSI_HBA               |
     * |          9 | IB_HCA                  |
     * |         10 | Ethernet_Adapter        | 
     * |         11 | Other_Network_Adapter   |
     * |         12 | IO_Slot                 |
     * |         13 | IO_Device               |
     * |         14 | Floppy_Drive            |
     * |         15 | CD_Drive                |
     * |         16 | DVD_drive               |
     * |         17 | Disk_Drive              |
     * |         18 | Tape_Drive              |
     * |         19 | Storage_Extent          |
     * |         20 | Other_storage_device    |
     * |         21 | Serial_port             |
     * |         22 | Parallel_port           |
     * |         23 | USB_Controller          |
     * |         24 | Graphics_controller     |
     * |         25 | IEEE_1394_Controller    |
     * |         26 | Partitionable_Unit      |
     * |         27 | Base_Partitionable_Unit |
     * |         28 | Power                   |
     * |         29 | Cooling_Capacity        |
     * |         30 | Ethernet_Switch_Port    |
     * |         31 | DMTF_reserved           |
     * |         32 | Vendor_Reserved         |
     * +------------+-------------------------+
     * </pre>
     */
    public void createResourceAllocationSettingData() {
        Session session = null;
        Transaction transaction = null;

        try {

            session = HibernateUtil.getSession();
            session.beginTransaction();

            // Create the Rasds
            createRASD10(session);

            // This array of integers contains a list of resource types in which a rasd_management
            // entry will be made for each one and all related to the current virtualappliance
            int[] resourceTypes = { 10 };

            transaction = session.getTransaction();

            transaction.commit();
        } catch (Exception e) {
            e.printStackTrace();

            transaction = session.getTransaction();

            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
        }
    }

    /**
     * Create a ResourceAllocatingSettingData of type 10
     * 
     * @param session
     * @throws PersistenceException
     */
    private void createRASD10(final Session session) throws PersistenceException {
        session.beginTransaction();

        ResourceAllocationSettingData rasd = new ResourceAllocationSettingData();
        rasd.setInstanceID("3");
        rasd.setAddress("00:1d:09:2c:50:d6");
        rasd.setResourceSubType("PCNet32");
        rasd.setConnection("VM Network");
        rasd.setElementName("Ethernet adapter on 'VM Network'");
        rasd.setResourceType(10);

        session.saveOrUpdate(rasd);

        // add this to the list "rasdHBs"
        rasdHBs.add(rasd);
    }

    private <T extends ResourceManagementHB> void createRasdManagement(final Session session,
            final int[] resourceTypes, final Class<T> cl) throws PersistenceException {

        VirtualappHB virtualAppHB = (VirtualappHB) session.get("VirtualappExtendedHB", vApp.getIdVirtualApp());

        VirtualDataCenterHB virtualDataCenterHB = virtualAppHB.getVirtualDataCenterHB();

        Disjunction virtualAppDisjuction = Restrictions.disjunction();
        virtualAppDisjuction.add(Restrictions.eq("idVirtualApp", virtualAppHB.getIdVirtualApp()));
        ArrayList<NodeHB> nodes = (ArrayList<NodeHB>) session.createCriteria(NodeHB.class).add(virtualAppDisjuction)
                .list();

        VirtualmachineHB virtualMachineHB;

        ArrayList<ResourceAllocationSettingData> rasds;

        ResourceManagementHB resourceManagement = null;
        Timestamp timestamp = new Timestamp(new GregorianCalendar().getTimeInMillis());
        for (NodeHB node : nodes) {
            if (node.getType() == NodeTypeEnum.VIRTUAL_IMAGE) {
                NodeVirtualImageHB nodeVirtualImage = (NodeVirtualImageHB) node;
                virtualMachineHB = nodeVirtualImage.getVirtualMachineHB();

                if (virtualMachineHB != null) {
                    for (int resourceType : resourceTypes) {
                        rasds = getRasds(session, resourceType);

                        for (ResourceAllocationSettingData rasd : rasds) {
                            try {
                                resourceManagement = cl.newInstance();
                            } catch (Exception e) {
                                throw new PersistenceException(
                                        "Unable to create a new instance of " + cl.getName());
                            }

                            resourceManagement.setIdResourceType(rasd.getResourceType() + "");
                            resourceManagement.setRasd(rasd);
                            resourceManagement.setVirtualApp(virtualAppHB);
                            resourceManagement.setVirtualMachine(virtualMachineHB);
                            resourceManagement.setVirtualDataCenter(virtualDataCenterHB);

                            session.saveOrUpdate(resourceManagement);

                            resourceManagementHBs.add(resourceManagement);

                        }
                    }

                }
            }

        }

    }

    /**
     * Gets a lists of ResourceAllocationSettingData that correspond to a particular resource type
     * 
     * @param session
     * @param resourceType
     * @return
     */
    private static ArrayList<ResourceAllocationSettingData> getRasds(final Session session,
            final int resourceType) {

        Disjunction disjunction = Restrictions.disjunction();
        disjunction.add(Restrictions.eq("resourceType", resourceType));

        ArrayList<ResourceAllocationSettingData> rasds = (ArrayList<ResourceAllocationSettingData>) session
                .createCriteria(ResourceAllocationSettingData.class).add(disjunction).list();

        if (rasds == null) {
            rasds = new ArrayList<ResourceAllocationSettingData>();
        }

        return rasds;
    }

    /**
     * Deletes entries in the rasd and rasd-management tables
     * 
     * @throws PersistenceException
     */
    private void cleanRasd() throws PersistenceException {
        factorytest = HibernateDAOFactory.instance();
        ResourceManagementDAO resourceManagementHBDao = factorytest.getResourceManagementDAO();
        ResourceAllocationSettingDataDAO rasdDao = factorytest.getResourceAllocationSettingDataDAO();

        factorytest.beginConnection();
        for (ResourceManagementHB rasdManagementHB : resourceManagementHBs) {
            resourceManagementHBDao.makeTransient(rasdManagementHB);
        }

        for (ResourceAllocationSettingData rasd : rasdHBs) {
            rasdDao.makeTransient(rasd);
        }
        factorytest.endConnection();

        log.info("Deleted rasd and rasd-management entries");

    }
}