/**
* 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;
import static com.abiquo.api.common.Assert.assertLinkExist;
import static com.abiquo.api.common.Assert.assertNonEmptyErrors;
import static com.abiquo.api.common.UriTestResolver.resolveDatastoresURI;
import static com.abiquo.api.common.UriTestResolver.resolveEnterpriseURI;
import static com.abiquo.api.common.UriTestResolver.resolveMachineActionGetVirtualMachinesURI;
import static com.abiquo.api.common.UriTestResolver.resolveMachineURI;
import static com.abiquo.api.common.UriTestResolver.resolveRackURI;
import static com.abiquo.api.common.UriTestResolver.resolveUserURI;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response.Status;
import junit.framework.Assert;
import org.apache.wink.client.ClientResponse;
import org.apache.wink.client.ClientWebException;
import org.apache.wink.client.Resource;
import org.apache.wink.client.RestClient;
import org.springframework.security.context.SecurityContextHolder;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.api.common.SysadminAuthentication;
import com.abiquo.api.services.stub.NodecollectorServiceStubMock;
import com.abiquo.model.enumerator.RemoteServiceType;
import com.abiquo.model.transport.error.ErrorsDto;
import com.abiquo.server.core.cloud.Hypervisor;
import com.abiquo.server.core.cloud.NodeVirtualImage;
import com.abiquo.server.core.cloud.VirtualAppliance;
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.VirtualMachinesDto;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.Privilege;
import com.abiquo.server.core.enterprise.Role;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.infrastructure.Machine;
import com.abiquo.server.core.infrastructure.MachineDto;
import com.abiquo.server.core.infrastructure.RemoteService;
public class MachineResourceIT extends AbstractJpaGeneratorIT
{
private String validMachineUri;
private Machine validMachine;
private Hypervisor validHypervisor;
private Enterprise e;
private User u;
@Override
@BeforeMethod
public void setup()
{
Hypervisor hypervisor = hypervisorGenerator.createUniqueInstance();
hypervisor.setIpService(NodecollectorServiceStubMock.IP_DISCOVER_FIRST);
Machine machine = hypervisor.getMachine();
RemoteService rs =
machine.getDatacenter().createRemoteService(RemoteServiceType.VIRTUAL_SYSTEM_MONITOR,
"http://localhost:8080/fooo", 1);
setup(machine.getDatacenter(), machine.getRack(), machine, hypervisor, rs);
validMachine = machine;
validHypervisor = hypervisor;
validMachineUri =
resolveMachineURI(machine.getDatacenter().getId(), machine.getRack().getId(),
machine.getId());
e = enterpriseGenerator.createUniqueInstance();
Role r = roleGenerator.createInstanceSysAdmin();
u = userGenerator.createInstance(e, r, "sysadmin", "sysadmin");
List<Object> entitiesToSetup = new ArrayList<Object>();
entitiesToSetup.add(e);
for (Privilege p : r.getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(r);
entitiesToSetup.add(u);
setup(entitiesToSetup.toArray());
}
@Test
public void getMachine() throws ClientWebException
{
MachineDto machine = getValidMachine();
assertNotNull(machine);
// Verify that the credentials are not returned
assertNull(machine.getUser());
assertNull(machine.getPassword());
}
@Test
public void testGetMachineWithCredentials()
{
ClientResponse response = get(validMachineUri + "?credentials=true", MachineDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.OK.getStatusCode());
MachineDto machine = response.getEntity(MachineDto.class);
// Verify that the credentials are not returned
assertNotNull(machine);
assertNotNull(machine.getUser());
assertNotNull(machine.getPassword());
}
@Test
public void getMachineDoesntExist() throws Exception
{
String machineUri = resolveMachineURI(1, 1, 123);
ClientResponse response = get(machineUri, MachineDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode());
assertNonEmptyErrors(response.getEntity(ErrorsDto.class));
}
@Test
public void getMachineWithWrongDatacenter() throws ClientWebException
{
String machineUri = resolveMachineURI(1234, 1, 1);
ClientResponse response = get(machineUri, MachineDto.MEDIA_TYPE);
assertEquals(404, response.getStatusCode());
assertNonEmptyErrors(response.getEntity(ErrorsDto.class));
}
@Test
public void getMachineWithWrongRack() throws ClientWebException
{
String machineUri = resolveMachineURI(1, 1234, 1);
ClientResponse response = get(machineUri, MachineDto.MEDIA_TYPE);
assertEquals(404, response.getStatusCode());
assertNonEmptyErrors(response.getEntity(ErrorsDto.class));
}
@Test
public void machineContainsLink() throws ClientWebException
{
assertLinkExist(getValidMachine(), validMachineUri, "edit");
assertLinkExist(getValidMachine(),
resolveRackURI(validMachine.getDatacenter().getId(), validMachine.getRack().getId()),
"rack");
assertLinkExist(
getValidMachine(),
resolveDatastoresURI(validMachine.getDatacenter().getId(), validMachine.getRack()
.getId(), validMachine.getId()), DatastoresResource.DATASTORES_PATH);
}
@Test
public void modifyMachine() throws ClientWebException
{
MachineDto machine = get(validMachineUri, MachineDto.MEDIA_TYPE).getEntity(MachineDto.class);
machine.setName("dummy_name");
ClientResponse response = put(validMachineUri, machine);
assertEquals(200, response.getStatusCode());
MachineDto modified = response.getEntity(MachineDto.class);
assertEquals("dummy_name", modified.getName());
}
@Test
public void modifyMachineDoesntExist() throws ClientWebException
{
MachineDto machine = getValidMachine();
machine.setName("dummy_name");
ClientResponse response = put(resolveMachineURI(1, 1, 123), machine);
assertEquals(404, response.getStatusCode());
}
@Test
public void modifyMachineWrongDatacenter() throws ClientWebException
{
MachineDto machine = getValidMachine();
String old = machine.getName();
machine.setName("dummy_name");
String machineUri = resolveMachineURI(123, validMachine.getRack().getId(),
validMachine.getId());
ClientResponse response = put(machineUri, machine);
assertEquals(404, response.getStatusCode());
assertNonEmptyErrors(response.getEntity(ErrorsDto.class));
machine = get(validMachineUri, MachineDto.MEDIA_TYPE).getEntity(MachineDto.class);
assertEquals(old, machine.getName());
}
@Test
public void modifyMachineWrongRack() throws ClientWebException
{
MachineDto machine = getValidMachine();
String old = machine.getName();
machine.setName("dummy_name");
String machineUri = resolveMachineURI(validMachine.getDatacenter().getId(), 1234,
validMachine.getId());
ClientResponse response = put(machineUri, machine);
assertEquals(404, response.getStatusCode());
assertNonEmptyErrors(response.getEntity(ErrorsDto.class));
machine = get(validMachineUri, MachineDto.MEDIA_TYPE).getEntity(MachineDto.class);
assertEquals(old, machine.getName());
}
@Test
public void removeMachine() throws ClientWebException
{
Resource resource = client.resource(validMachineUri);
ClientResponse response = resource.accept(MediaType.APPLICATION_XML).delete();
assertEquals(response.getStatusCode(), 204);
}
@Test
public void removeMachineDoesntExist() throws ClientWebException
{
Resource resource =
client.resource(resolveMachineURI(validMachine.getDatacenter().getId(), validMachine
.getRack().getId(), 1234));
ClientResponse response = resource.accept(MediaType.APPLICATION_XML).delete();
assertEquals(404, response.getStatusCode());
}
@Test
public void removeMachineWrongDatacenter() throws ClientWebException
{
ClientResponse response = delete(resolveMachineURI(1234, validMachine.getRack().getId(),
validMachine.getId()));
assertEquals(response.getStatusCode(), Status.NOT_FOUND.getStatusCode());
response = get(validMachineUri, MachineDto.MEDIA_TYPE);
MachineDto machine = response.getEntity(MachineDto.class);
assertEquals(200, response.getStatusCode());
assertNotNull(machine);
}
@Test
public void removeMachineWrongRack() throws ClientWebException
{
ClientResponse response = delete(resolveMachineURI(validMachine.getDatacenter().getId(), 1234,
validMachine.getId()));
assertEquals(404, response.getStatusCode());
response = get(validMachineUri, MachineDto.MEDIA_TYPE);
MachineDto machine = response.getEntity(MachineDto.class);
assertEquals(200, response.getStatusCode());
assertNotNull(machine);
}
@Test
public void getMachineActionVirtualMachines()
{
VirtualMachine vm = vmGenerator.createInstance(validHypervisor, e, u);
VirtualDatacenter vdc =
vdcGenerator.createInstance(vm.getHypervisor().getMachine().getDatacenter(),
vm.getEnterprise());
VirtualAppliance vapp = vappGenerator.createInstance(vdc);
NodeVirtualImage nvi = nodeVirtualImageGenerator.createInstance(vapp, vm);
vm.getVirtualMachineTemplate().getRepository()
.setDatacenter(vm.getHypervisor().getMachine().getDatacenter());
List<Object> entitiesToSetup = new ArrayList<Object>();
entitiesToSetup.add(vm.getVirtualMachineTemplate().getRepository());
entitiesToSetup.add(vm.getVirtualMachineTemplate().getCategory());
entitiesToSetup.add(vm.getVirtualMachineTemplate());
entitiesToSetup.add(vm);
entitiesToSetup.add(vdc);
entitiesToSetup.add(vapp);
entitiesToSetup.add(nvi);
setup(entitiesToSetup.toArray());
SecurityContextHolder.getContext().setAuthentication(new SysadminAuthentication());
Machine m = vm.getHypervisor().getMachine();
String uri =
resolveMachineActionGetVirtualMachinesURI(m.getDatacenter().getId(), m.getRack()
.getId(), m.getId());
// Resource resource = client.resource(uri);
// ClientResponse response = resource.accept(MediaType.APPLICATION_XML).get();
ClientResponse response = get(uri, "sysadmin", "sysadmin", VirtualMachinesDto.MEDIA_TYPE);
Assert.assertEquals(Status.OK.getStatusCode(), response.getStatusCode());
VirtualMachinesDto vms = response.getEntity(VirtualMachinesDto.class);
Assert.assertEquals(vms.getCollection().size(), 1);
VirtualMachineDto vmDto = vms.getCollection().get(0);
assertLinkExist(vmDto, resolveEnterpriseURI(vm.getEnterprise().getId()), "enterprise");
assertLinkExist(vmDto, resolveUserURI(vm.getEnterprise().getId(), vm.getUser().getId()),
"user");
assertLinkExist(vmDto,
resolveMachineURI(m.getDatacenter().getId(), m.getRack().getId(), m.getId()), "machine");
}
@Test
public void notManagedActionVirtualMachines()
{
VirtualMachine vm = vmGenerator.createInstance(validHypervisor, e, u);
vm.setIdType(VirtualMachine.NOT_MANAGED);
VirtualMachine vm2 = vmGenerator.createInstance(validHypervisor, e, u);
vm.setIdType(VirtualMachine.MANAGED);
vm.getVirtualMachineTemplate().getRepository()
.setDatacenter(vm.getHypervisor().getMachine().getDatacenter());
vm2.getVirtualMachineTemplate().getRepository()
.setDatacenter(vm2.getHypervisor().getMachine().getDatacenter());
VirtualDatacenter vdc =
vdcGenerator.createInstance(vm.getHypervisor().getMachine().getDatacenter(),
vm.getEnterprise());
VirtualAppliance vapp = vappGenerator.createInstance(vdc);
NodeVirtualImage nvi = nodeVirtualImageGenerator.createInstance(vapp, vm);
VirtualDatacenter vdc2 =
vdcGenerator.createInstance(vm2.getHypervisor().getMachine().getDatacenter(),
vm2.getEnterprise());
VirtualAppliance vapp2 = vappGenerator.createInstance(vdc2);
NodeVirtualImage nvi2 = nodeVirtualImageGenerator.createInstance(vapp2, vm2);
List<Object> entitiesToSetup = new ArrayList<Object>();
entitiesToSetup.add(vm.getVirtualMachineTemplate().getRepository());
entitiesToSetup.add(vm.getVirtualMachineTemplate().getCategory());
entitiesToSetup.add(vm.getVirtualMachineTemplate());
entitiesToSetup.add(vm);
entitiesToSetup.add(vm2.getVirtualMachineTemplate().getRepository());
entitiesToSetup.add(vm2.getVirtualMachineTemplate().getCategory());
entitiesToSetup.add(vm2.getVirtualMachineTemplate());
entitiesToSetup.add(vm2);
entitiesToSetup.add(vdc);
entitiesToSetup.add(vapp);
entitiesToSetup.add(nvi);
entitiesToSetup.add(vdc2);
entitiesToSetup.add(vapp2);
entitiesToSetup.add(nvi2);
setup(entitiesToSetup.toArray());
Machine m = vm.getHypervisor().getMachine();
String uri =
resolveMachineActionGetVirtualMachinesURI(m.getDatacenter().getId(), m.getRack()
.getId(), m.getId());
ClientResponse response = get(uri, "sysadmin", "sysadmin", VirtualMachinesDto.MEDIA_TYPE);
VirtualMachinesDto vms = response.getEntity(VirtualMachinesDto.class);
Assert.assertEquals(vms.getCollection().size(), 2);
response = delete(uri);
Assert.assertEquals(response.getStatusCode(), Status.NO_CONTENT.getStatusCode());
response = get(uri, "sysadmin", "sysadmin", VirtualMachinesDto.MEDIA_TYPE);
vms = response.getEntity(VirtualMachinesDto.class);
Assert.assertEquals(vms.getCollection().size(), 1);
}
private MachineDto getValidMachine()
{
ClientResponse response = get(validMachineUri, MachineDto.MEDIA_TYPE);
assertEquals(200, response.getStatusCode());
return response.getEntity(MachineDto.class);
}
}