/**
* 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.Assert.assertErrors;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualApplianceDeployURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualApplianceStateURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualApplianceURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualApplianceUndeployURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineDeployURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineResetURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineStateURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineURI;
import static com.abiquo.api.common.UriTestResolver.resolveVirtualMachineUndeployURI;
import static org.testng.Assert.assertEquals;
import junit.framework.Assert;
import org.apache.wink.client.ClientResponse;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.api.exceptions.APIError;
import com.abiquo.api.resources.AbstractJpaGeneratorIT;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.model.transport.AcceptedRequestDto;
import com.abiquo.server.core.cloud.VirtualAppliance;
import com.abiquo.server.core.cloud.VirtualApplianceDto;
import com.abiquo.server.core.cloud.VirtualApplianceState;
import com.abiquo.server.core.cloud.VirtualApplianceStateDto;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.cloud.VirtualMachineDto;
import com.abiquo.server.core.cloud.VirtualMachineState;
import com.abiquo.server.core.cloud.VirtualMachineStateDto;
import com.abiquo.server.core.cloud.VirtualMachineTaskDto;
import com.abiquo.server.core.common.EnvironmentGenerator;
/**
* Integration tests to verify virtual machine locking logic.
*
* @author Ignasi Barrera
*/
public class VirtualMachineLockIT extends AbstractJpaGeneratorIT
{
private EnvironmentGenerator env;
private VirtualDatacenter vdc;
private VirtualAppliance vapp;
private VirtualMachine vm;
@BeforeMethod
@Override
public void setup()
{
super.setup();
env = new EnvironmentGenerator(seed);
env.generateEnterprise();
env.generateInfrastructure();
env.generateVirtualDatacenter();
env.generateAllocatedVirtualMachine();
setup(env.getEnvironment().toArray());
vdc = env.get(VirtualDatacenter.class);
vapp = env.get(VirtualAppliance.class);
vm = env.get(VirtualMachine.class);
}
@Test
public void testDeleteVirtualMachineReturns409IfLocked()
{
vm.setState(VirtualMachineState.LOCKED);
update(vm);
String uri = resolveVirtualMachineURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_INVALID_STATE_DELETE);
}
@Test
public void testDeleteVirtualMachineIfNotAllocated()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertEquals(response.getStatusCode(), 204);
assertGetVmResponseIs(404);
}
@Test
public void testDeleteVirtualMachineIfDeployed()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualMachineURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertEquals(response.getStatusCode(), 204);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testDeployVirtualMachineReturns409IfInvalidState()
{
vm.setState(VirtualMachineState.OFF);
update(vm);
String uri = resolveVirtualMachineDeployURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
post(uri, null, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, null);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_INVALID_STATE_DEPLOY);
}
@Test
public void testDeployVirtualMachine()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineDeployURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
post(uri, null, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, null);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testDeployVirtualMachineWithForce()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineDeployURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceEnterpriseSoftLimits(true);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testUndeployVirtualMachine()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualMachineUndeployURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceUndeploy(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testUndeployVirtualMachineReturns202IfNotInHypervisor()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineUndeployURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceUndeploy(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
Assert.assertEquals(response.getStatusCode(), 202);
}
@Test
public void testPowerStateVirtualMachine()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(VirtualMachineState.OFF);
ClientResponse response =
put(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testPowerStateVirtualMachineReturns409IfInvalidTransition()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(VirtualMachineState.ON);
ClientResponse response =
put(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_STATE_CHANGE_ERROR);
}
@Test
public void testPowerStateVirtualMachineReturns409IfPauseAndXen()
{
vm.setState(VirtualMachineState.ON);
vm.getHypervisor().setType(HypervisorType.XEN_3);
update(vm.getHypervisor(), vm);
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(VirtualMachineState.PAUSED);
ClientResponse response =
put(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_PAUSE_UNSUPPORTED);
}
@Test
public void testPowerStateVirtualMachineReturns409IfNotAllocated()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(VirtualMachineState.PAUSED);
ClientResponse response =
put(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_UNALLOCATED_STATE);
}
@Test
public void testPowerStateVirtualMachinePauseAndNotXen()
{
vm.setState(VirtualMachineState.ON);
vm.getHypervisor().setType(HypervisorType.VMX_04);
update(vm.getHypervisor(), vm);
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(VirtualMachineState.PAUSED);
ClientResponse response =
put(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testResetVirtualMachine()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualMachineResetURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
post(uri, null, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertEquals(response.getStatusCode(), 202);
assertVmState(VirtualMachineState.LOCKED);
}
@Test
public void testResetVirtualMachineReturns409IfInvalidState()
{
vm.setState(VirtualMachineState.OFF);
update(vm);
String uri = resolveVirtualMachineResetURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
post(uri, null, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_INVALID_STATE_RESET);
}
@Test
public void testResetVirtualMachineReturns409IfNotAllocated()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualMachineResetURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
post(uri, null, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_UNALLOCATED_STATE);
}
@Test
public void testDeployVirtualAppliance()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualApplianceDeployURI(vdc.getId(), vapp.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceEnterpriseSoftLimits(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVappState(VirtualApplianceState.LOCKED);
}
@Test
public void testDeployVirtualApplianceReturns409IfInvalidState()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualApplianceDeployURI(vdc.getId(), vapp.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceEnterpriseSoftLimits(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
assertErrors(response, 409, APIError.VIRTUAL_MACHINE_INVALID_STATE_DEPLOY);
}
@Test
public void testUndeployVirtualAppliance()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualApplianceUndeployURI(vdc.getId(), vapp.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceEnterpriseSoftLimits(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 202);
assertVappState(VirtualApplianceState.LOCKED);
}
@Test
public void testUndeployVirtualApplianceReturns202IfNotInHypervisor()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualApplianceUndeployURI(vdc.getId(), vapp.getId());
VirtualMachineTaskDto dto = new VirtualMachineTaskDto();
dto.setForceEnterpriseSoftLimits(false);
ClientResponse response =
post(uri, dto, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTaskDto.MEDIA_TYPE);
Assert.assertEquals(response.getStatusCode(), 202);
}
@Test
public void testDeleteVirtualApplianceIfNotDeployed()
{
vm.setState(VirtualMachineState.NOT_ALLOCATED);
update(vm);
String uri = resolveVirtualApplianceURI(vdc.getId(), vapp.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertEquals(response.getStatusCode(), 204);
assertGetVappResponseIs(404);
}
@Test
public void testDeleteVirtualApplianceReturns409IfDeployed()
{
vm.setState(VirtualMachineState.ON);
update(vm);
String uri = resolveVirtualApplianceURI(vdc.getId(), vapp.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertErrors(response, 409, APIError.VIRTUALAPPLIANCE_INVALID_STATE_DELETE);
}
@Test
public void testDeleteVirtualApplianceReturns409IfLocked()
{
vm.setState(VirtualMachineState.LOCKED);
update(vm);
String uri = resolveVirtualApplianceURI(vdc.getId(), vapp.getId());
ClientResponse response =
delete(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN);
assertErrors(response, 409, APIError.VIRTUALAPPLIANCE_INVALID_STATE_DELETE);
}
private void assertVmState(final VirtualMachineState state)
{
String uri = resolveVirtualMachineStateURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
get(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
VirtualMachineStateDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualMachineStateDto dto = response.getEntity(VirtualMachineStateDto.class);
assertEquals(dto.getState(), state);
}
private void assertVappState(final VirtualApplianceState state)
{
String uri = resolveVirtualApplianceStateURI(vdc.getId(), vapp.getId());
ClientResponse response =
get(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
VirtualApplianceStateDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
VirtualApplianceStateDto dto = response.getEntity(VirtualApplianceStateDto.class);
assertEquals(dto.getPower(), state);
}
private void assertGetVmResponseIs(final int responseCode)
{
String uri = resolveVirtualMachineURI(vdc.getId(), vapp.getId(), vm.getId());
ClientResponse response =
get(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
VirtualMachineDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), responseCode);
}
private void assertGetVappResponseIs(final int responseCode)
{
String uri = resolveVirtualApplianceURI(vdc.getId(), vapp.getId());
ClientResponse response =
get(uri, EnvironmentGenerator.SYSADMIN, EnvironmentGenerator.SYSADMIN,
VirtualApplianceDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), responseCode);
}
}