/**
* 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.server.core.infrastructure.storage;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.validation.ConstraintViolationException;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.model.enumerator.StorageTechnologyType;
import com.abiquo.server.core.cloud.VirtualAppliance;
import com.abiquo.server.core.cloud.VirtualApplianceGenerator;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.cloud.VirtualDatacenterGenerator;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.cloud.VirtualMachineGenerator;
import com.abiquo.server.core.common.persistence.DefaultDAOTestBase;
import com.abiquo.server.core.common.persistence.JPAConfiguration;
import com.abiquo.server.core.common.persistence.TestDataAccessManager;
import com.abiquo.server.core.infrastructure.management.Rasd;
import com.abiquo.server.core.infrastructure.management.RasdManagement;
import com.softwarementors.bzngine.engines.jpa.test.configuration.EntityManagerFactoryForTesting;
import com.softwarementors.bzngine.entities.test.PersistentInstanceTester;
public class VolumeManagementDAOTest extends
DefaultDAOTestBase<VolumeManagementDAO, VolumeManagement>
{
private VirtualDatacenterGenerator vdcGenerator;
private StoragePoolGenerator poolGenerator;
private VirtualMachineGenerator vmGenerator;
private VirtualApplianceGenerator vappGenerator;
@Override
@BeforeMethod
protected void methodSetUp()
{
super.methodSetUp();
vdcGenerator = new VirtualDatacenterGenerator(getSeed());
poolGenerator = new StoragePoolGenerator(getSeed());
vmGenerator = new VirtualMachineGenerator(getSeed());
vappGenerator = new VirtualApplianceGenerator(getSeed());
}
@Override
protected VolumeManagementDAO createDao(final EntityManager entityManager)
{
return new VolumeManagementDAO(entityManager);
}
@Override
protected PersistentInstanceTester<VolumeManagement> createEntityInstanceGenerator()
{
return new VolumeManagementGenerator(getSeed());
}
@Override
protected EntityManagerFactoryForTesting getFactory()
{
return TestDataAccessManager.getFactory();
}
@Override
public VolumeManagementGenerator eg()
{
return (VolumeManagementGenerator) super.eg();
}
@Test
public void testGetVolumesByPool()
{
VolumeManagement volume = eg().createUniqueInstance();
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getVolumesByPool(volume.getStoragePool());
assertSize(results, 1);
assertAllEntityPropertiesEqual(results.iterator().next(), volume);
}
@Test
public void testGetVolumesByVirtualDatacenter()
{
// Test without filtering
VolumeManagement volume = eg().createUniqueInstance();
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results =
dao.getVolumesByVirtualDatacenter(volume.getVirtualDatacenter());
assertSize(results, 1);
assertAllEntityPropertiesEqual(results.iterator().next(), volume);
}
@Test
public void testGetVolumeByVirtualDatacenter()
{
// Test without filtering
VolumeManagement volume = eg().createUniqueInstance();
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
VolumeManagement result =
dao.getVolumeByVirtualDatacenter(volume.getVirtualDatacenter(), volume.getId());
eg().assertAllPropertiesEqual(result, volume);
}
// @Test
// public void testGetVolumesByRasd()
// {
// VolumeManagement volume = eg().createUniqueInstance();
// List<Object> entitiesToPersist = new ArrayList<Object>();
// eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
// persistAll(ds(), entitiesToPersist, volume);
// Rasd rasd = volume.getRasd();
// VolumeManagementDAO dao = createDaoForRollbackTransaction();
// VolumeManagement vol = dao.getVolumeByRasd(rasd);
// eg().assertAllPropertiesEqual(vol, volume);
// }
@Test
public void testGetStatefulCandidatesWithoutVolumes()
{
VirtualDatacenter vdc = vdcGenerator.createUniqueInstance();
List<Object> entitiesToPersist = new ArrayList<Object>();
vdcGenerator.addAuxiliaryEntitiesToPersist(vdc, entitiesToPersist);
persistAll(ds(), entitiesToPersist, vdc);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(vdc);
assertEmpty(results);
}
@Test
public void testGetStatefulCandidatesWithAssociatedState()
{
VolumeManagement volume = eg().createUniqueInstance();
VirtualMachine vm =
vmGenerator.createInstance(volume.getVirtualDatacenter().getEnterprise());
volume.attach(RasdManagement.FIRST_ATTACHMENT_SEQUENCE, vm);
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(volume.getVirtualDatacenter());
assertEmpty(results);
}
@Test
public void testGetStatefulCandidatesWithDifferentVirtualDatacenter()
{
VirtualDatacenter vdc = vdcGenerator.createUniqueInstance();
VirtualDatacenter other =
vdcGenerator.createInstance(vdc.getDatacenter(), vdc.getEnterprise());
VolumeManagement volume = eg().createInstance(vdc);
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume, other);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(other);
assertEmpty(results);
}
@Test
public void testGetStatefulCandidatesWithNormalPool()
{
StoragePool pool = poolGenerator.createUniqueInstance();
VolumeManagement volume = eg().createInstance(pool);
pool.getDevice().setStorageTechnology(StorageTechnologyType.NEXENTA);
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(volume.getVirtualDatacenter());
assertEmpty(results);
}
@Test
public void testGetStatefulCandidates()
{
StoragePool pool = poolGenerator.createUniqueInstance();
VolumeManagement volume = eg().createInstance(pool);
pool.getDevice().setStorageTechnology(StorageTechnologyType.GENERIC_ISCSI);
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(volume.getVirtualDatacenter());
assertSize(results, 1);
assertAllEntityPropertiesEqual(results.iterator().next(), volume);
}
@Test
public void testGetStatefulCandidatesInISCSIPoolWithMultipleVolumes()
{
StoragePool pool = poolGenerator.createUniqueInstance();
VolumeManagement volume1 = eg().createInstance(pool);
VolumeManagement volume2 = eg().createInstance(pool, volume1.getVirtualDatacenter());
pool.getDevice().setStorageTechnology(StorageTechnologyType.GENERIC_ISCSI);
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume1, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume1, volume2.getRasd(), volume2);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getStatefulCandidates(volume1.getVirtualDatacenter());
assertSize(results, 2);
}
@Test(expectedExceptions = ConstraintViolationException.class)
public void testCreateVolumeWithTooLargeName()
{
VolumeManagement volume = eg().createUniqueInstance();
StringBuilder name = new StringBuilder();
for (int i = 0; i < Rasd.ELEMENT_NAME_LENGTH_MAX + 10; i++)
{
name.append("v");
}
volume.setName(name.toString());
List<Object> entitiesToPersist = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(volume, entitiesToPersist);
persistAll(ds(), entitiesToPersist, volume);
}
/**
* Create five resources, three with the temporal value set, and two without the temporal values
* set. Disable the filter {@link RasdManagement.NOT_TEMP}. Check the behaviour (
* {@link RasdManagement} entity filters) is to return all the resources. Whatever happens,
* enable the filter
*/
@Test(enabled = false)
public void findAllWithoutFilters()
{
createFiveVolumesWithTemporalAndNotTemporalValueSetAndPersistThem();
VolumeManagementDAO dao = createDaoForRollbackTransaction();
try
{
JPAConfiguration.disableAllFilters(dao.getEntityManager());
List<VolumeManagement> all = dao.findAll();
assertEquals(all.size(), 5);
}
finally
{
JPAConfiguration.enableDefaultFilters(dao.getEntityManager());
}
}
/**
* Create five resources, three with the temporal value set, and two without the temporal values
* set. Disable the filter {@link RasdManagement.NOT_TEMP} and enable the
* {@link RasdManagement.ONLY_TEMP} one. Check the behaviour ({@link RasdManagement} entity
* filters) is to return only the ones with the temporal values. Whatever happens, enable the
* filter
*/
@Test(enabled = false)
public void findAllOnlyTempFilters()
{
createFiveVolumesWithTemporalAndNotTemporalValueSetAndPersistThem();
VolumeManagementDAO dao = createDaoForRollbackTransaction();
try
{
JPAConfiguration.enableOnlyTemporalFilters(dao.getEntityManager());
List<VolumeManagement> all = dao.findAll();
assertEquals(all.size(), 3);
}
finally
{
JPAConfiguration.enableDefaultFilters(dao.getEntityManager());
}
}
/**
* Create five resources, three with the temporal value set, and two without the temporal values
* set.
*/
private void createFiveVolumesWithTemporalAndNotTemporalValueSetAndPersistThem()
{
VolumeManagement rm1 = eg().createUniqueInstance();
rm1.setTemporal(23);
List<Object> resourceList = new ArrayList<Object>();
eg().addAuxiliaryEntitiesToPersist(rm1, resourceList);
VolumeManagement rm2 = eg().createUniqueInstance();
rm2.setTemporal(24);
eg().addAuxiliaryEntitiesToPersist(rm2, resourceList);
VolumeManagement rm3 = eg().createUniqueInstance();
rm3.setTemporal(35);
eg().addAuxiliaryEntitiesToPersist(rm3, resourceList);
VolumeManagement rm4 = eg().createUniqueInstance();
eg().addAuxiliaryEntitiesToPersist(rm4, resourceList);
VolumeManagement rm5 = eg().createUniqueInstance();
eg().addAuxiliaryEntitiesToPersist(rm5, resourceList);
persistAll(ds(), resourceList, rm1, rm2, rm3, rm4, rm5);
}
/**
* Create five machines, three with the temporal value set, and two without the temporal values
* set. Check the default behaviour (check {@link VirtualMachine} entity filters) is to return
* only the ones without the temporal values.
*/
@Test(enabled = false)
public void findAllWithNotTemporalFilters()
{
createFiveVolumesWithTemporalAndNotTemporalValueSetAndPersistThem();
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> all = dao.findAll();
assertEquals(all.size(), 2);
}
@Test
public void testGetSameVirtualAppliance()
{
VirtualDatacenter vdc = vdcGenerator.createUniqueInstance();
VirtualAppliance vapp = vappGenerator.createInstance(vdc);
VirtualAppliance vapp1 = vappGenerator.createInstance(vdc);
VolumeManagement volume = eg().createInstance(vdc);
VolumeManagement volume1 = eg().createInstance(vdc);
VolumeManagement volume2 = eg().createInstance(vdc);
volume.setVirtualAppliance(vapp);
volume1.setVirtualAppliance(vapp);
volume2.setVirtualAppliance(vapp1);
List<Object> entitiesToPersist = new ArrayList<Object>();
vdcGenerator.addAuxiliaryEntitiesToPersist(vdc, entitiesToPersist);
persistAll(ds(), entitiesToPersist, vdc.getDatacenter(), vdc.getEnterprise(), vdc, volume
.getStoragePool().getDevice(), volume.getStoragePool().getTier(),
volume.getStoragePool(), volume.getRasd(), volume,
volume1.getStoragePool().getDevice(), volume1.getStoragePool().getTier(),
volume1.getStoragePool(), volume1.getRasd(), volume1, volume2.getStoragePool()
.getDevice(), volume2.getStoragePool().getTier(), volume2.getStoragePool(),
volume2.getRasd(), volume2, vapp, vapp1);
VolumeManagementDAO dao = createDaoForRollbackTransaction();
List<VolumeManagement> results = dao.getVolumesByVirtualAppliance(vapp);
assertEquals(results.size(), 2);
}
}