/**
* 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.resources.cloud;
import static com.abiquo.api.common.UriTestResolver.resolveDiskUri;
import static com.abiquo.api.common.UriTestResolver.resolveDisksUri;
import static com.abiquo.testng.TestConfig.STORAGE_INTEGRATION_TESTS;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import javax.ws.rs.core.Response.Status;
import org.apache.wink.client.ClientResponse;
import org.springframework.security.context.SecurityContextHolder;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.api.common.BasicUserAuthentication;
import com.abiquo.api.exceptions.BadRequestException;
import com.abiquo.api.resources.AbstractJpaGeneratorIT;
import com.abiquo.api.services.StorageService;
import com.abiquo.api.services.cloud.DiskManagementServiceTest;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.server.core.cloud.NodeVirtualImage;
import com.abiquo.server.core.cloud.VirtualAppliance;
import com.abiquo.server.core.cloud.VirtualApplianceState;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.enterprise.DatacenterLimits;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.Role;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.infrastructure.storage.DiskManagement;
import com.abiquo.server.core.infrastructure.storage.DiskManagementDto;
import com.abiquo.server.core.infrastructure.storage.DisksManagementDto;
/**
* Acceptance test for the creation of Disks and retrieve of a list of them. This class only test
* the use causes that can cause a {@link BadRequestException} due a client's bad call. The rest of
* the use cases are tested in class {@link DiskManagementServiceTest}. Tests at the uri:
* http://host/api/cloud/virtualdatacenters/{id_vdc}/disks
*
* @author jdevesa@abiquo.com
*/
@Test(groups = {STORAGE_INTEGRATION_TESTS})
public class DisksResourceIT extends AbstractJpaGeneratorIT
{
/** Service we are testing */
protected StorageService service;
protected VirtualAppliance vapp;
protected VirtualDatacenter vdc;
private VirtualDatacenter vdcKVM;
protected VirtualMachine vm;
@BeforeMethod(groups = {STORAGE_INTEGRATION_TESTS})
public void setUp()
{
Enterprise e = enterpriseGenerator.createInstanceNoLimits("test enterprise");
Role r = roleGenerator.createInstance();
User u = userGenerator.createInstance(e, r, "basicUser", "basicUser");
setup(e, r, u);
vdc = vdcGenerator.createInstance(e);
vdcKVM = vdcGenerator.createInstance(vdc.getDatacenter(), e, HypervisorType.KVM);
vapp = vappGenerator.createInstance(vdc);
vapp.setState(VirtualApplianceState.NOT_DEPLOYED);
vm = vmGenerator.createInstance(e);
NodeVirtualImage nvi = nodeVirtualImageGenerator.createInstance(vapp, vm);
nvi.getVirtualImage().setDiskFileSize(2000000);
DatacenterLimits dclimit = new DatacenterLimits(vdc.getEnterprise(), vdc.getDatacenter());
// Set the correct properties to virtualmachine
vm.getHypervisor().getMachine().setDatacenter(vdc.getDatacenter());
vm.getHypervisor().getMachine().getRack().setDatacenter(vdc.getDatacenter());
vm.setUser(u);
// TODO vdc datacenter and virutal image datacenter ARE NOT THE SAME
setup(vdc.getDatacenter(), vdc, vdcKVM, dclimit, vapp, vm.getVirtualMachineTemplate()
.getCategory(), vm.getVirtualMachineTemplate().getRepository().getDatacenter(), vm
.getVirtualMachineTemplate().getRepository(), vm.getVirtualMachineTemplate(), vm
.getHypervisor().getMachine().getRack(), vm.getHypervisor().getMachine(),
vm.getHypervisor(), vm, nvi);
SecurityContextHolder.getContext().setAuthentication(new BasicUserAuthentication());
}
@Override
@AfterMethod(groups = {STORAGE_INTEGRATION_TESTS})
public void tearDown()
{
super.tearDown();
}
/**
* Just check the entity can be created throught the API.
*/
@Test
public void createHardDiskEndToEndTest()
{
String uri = resolveDisksUri(vdc.getId());
DiskManagementDto newDisk = new DiskManagementDto();
newDisk.setSizeInMb(12000L);
ClientResponse response = post(uri, newDisk, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.CREATED.getStatusCode());
}
@Test
public void createHardDiskInKVMRaises409()
{
String uri = resolveDisksUri(vdcKVM.getId());
DiskManagementDto newDisk = new DiskManagementDto();
newDisk.setSizeInMb(12000L);
ClientResponse response = post(uri, newDisk, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.CONFLICT.getStatusCode());
}
/**
* Identifier of VDC always should be bigger or equal than 0 when creating
*/
@Test
public void createHardDiskRaises400WhenVDCIdIsLowerThan1()
{
String uri = resolveDisksUri(-40);
DiskManagementDto newDisk = new DiskManagementDto();
newDisk.setSizeInMb(12000L);
ClientResponse response = post(uri, newDisk, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
}
/**
* Just check the get of multiple hard disks works.
*/
@Test
public void getListHardDisksEndToEndTest()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
DiskManagement disk2 = diskGenerator.createInstance(vdc);
DiskManagement disk3 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk2.getRasd(), disk3.getRasd(), disk1, disk2, disk3);
String uri = resolveDisksUri(vdc.getId());
ClientResponse response =
get(uri, "basicUser", "basicUser", DisksManagementDto.MEDIA_TYPE, null);
assertEquals(response.getStatusCode(), Status.OK.getStatusCode());
assertNotNull(response.getEntity(DisksManagementDto.class));
DisksManagementDto dtos = response.getEntity(DisksManagementDto.class);
assertEquals(dtos.getCollection().size(), 3);
}
/**
* Identifier of VDC always should be bigger or equal than 0 when getting the list of HDs
*/
@Test
public void getListHardDisksRaises400WhenVDCIdIsLowerThan1()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
DiskManagement disk2 = diskGenerator.createInstance(vdc);
DiskManagement disk3 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk2.getRasd(), disk3.getRasd(), disk1, disk2, disk3);
String uri = resolveDisksUri(-12);
ClientResponse response =
get(uri, "basicUser", "basicUser", DisksManagementDto.MEDIA_TYPE, null);
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
}
/**
* Just check the get of hard disk works.
*/
@Test
public void getHardDiskEndToEndTest()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk1);
String uri = resolveDiskUri(vdc.getId(), disk1.getId());
ClientResponse response =
get(uri, "basicUser", "basicUser", DiskManagementDto.MEDIA_TYPE, null);
assertEquals(response.getStatusCode(), Status.OK.getStatusCode());
assertNotNull(response.getEntity(DiskManagementDto.class));
}
/**
* Identifier of VDC and identifier of the disk always should be bigger or equal than 0 when
* getting the list of HDs
*/
@Test
public void getHardDisksRaises400WhenValuesLowerThan1()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk1);
String uri = resolveDiskUri(-12, disk1.getId());
ClientResponse response = get(uri, DiskManagementDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
uri = resolveDiskUri(vdc.getId(), -21);
response = get(uri, DiskManagementDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
}
/**
* Just check the delte of hard disk works.
*/
@Test
public void deleteHardDisksEndToEndTest()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk1);
String uri = resolveDiskUri(vdc.getId(), disk1.getId());
ClientResponse response = delete(uri, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.NO_CONTENT.getStatusCode());
// Not found should be raised afeter delete the disk
response = get(uri, "basicUser", "basicUser", DiskManagementDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode());
}
/**
* Identifier of VDC and identifier of the disk always should be bigger or equal than 0 when
* deleting the list of HDs
*/
@Test
public void deleteHardDisksRaises400WhenValuesLowerThan1()
{
DiskManagement disk1 = diskGenerator.createInstance(vdc);
setup(disk1.getRasd(), disk1);
String uri = resolveDiskUri(-12, disk1.getId());
ClientResponse response = delete(uri, "basicUser", "basicUser");
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
uri = resolveDiskUri(vdc.getId(), -21);
response = delete(uri);
assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode());
}
}