/**
* 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.commands.stub.impl;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.Response.Status;
import org.apache.wink.client.ClientResponse;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum;
import com.abiquo.abiserver.commands.stub.AbstractAPIStub;
import com.abiquo.abiserver.commands.stub.VirtualMachineResourceStub;
import com.abiquo.abiserver.pojo.infrastructure.State;
import com.abiquo.abiserver.pojo.infrastructure.VirtualMachine;
import com.abiquo.abiserver.pojo.result.BasicResult;
import com.abiquo.abiserver.pojo.result.DataResult;
import com.abiquo.model.transport.AcceptedRequestDto;
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.VirtualMachinesDto;
import com.abiquo.util.URIResolver;
public class VirtualMachineResourceStubImpl extends AbstractAPIStub implements
VirtualMachineResourceStub
{
public VirtualMachineResourceStubImpl()
{
super();
}
@Override
public BasicResult updateVirtualMachine(final Integer virtualDatacenterId,
final Integer virtualApplianceId, final VirtualMachine virtualMachine, final boolean force)
{
BasicResult result = new BasicResult();
try
{
// Retrieve the VirtualDatacenter to associate the new virtual appliance
org.jclouds.abiquo.domain.cloud.VirtualAppliance vapp =
getApiClient().getCloudService().getVirtualDatacenter(virtualDatacenterId)
.getVirtualAppliance(virtualApplianceId);
org.jclouds.abiquo.domain.cloud.VirtualMachine vm =
vapp.getVirtualMachine(virtualMachine.getId());
if (!vm.getDescription().equals(virtualMachine.getDescription())
|| vm.getCpu() != virtualMachine.getCpu() || vm.getRam() != virtualMachine.getRam()
|| virtualMachine.getPassword() != null
&& !virtualMachine.getPassword().equals(vm.getPassword()))
{
vm.setCpu(virtualMachine.getCpu());
vm.setRam(virtualMachine.getRam());
vm.setDescription(virtualMachine.getDescription());
vm.setPassword(virtualMachine.getPassword());
// Here we actually perform the request to create the virtual machine
vm.update(force);
}
// else all updated
result.setSuccess(Boolean.TRUE);
}
catch (Exception e)
{
populateErrors(e, result, "updateVirtualMachine");
}
finally
{
releaseApiClient();
}
return result;
}
protected String resolveVirtualMachineUrl(final Integer virtualDatacenterId,
final Integer virtualApplianceId, final Integer virtualMachineId)
{
Map<String, String> params = new HashMap<String, String>();
params.put("virtualDatacenter", String.valueOf(virtualDatacenterId));
params.put("vapp", String.valueOf(virtualApplianceId));
params.put("virtualMachine", String.valueOf(virtualMachineId));
return URIResolver
.resolveURI(
apiUri,
"cloud/virtualdatacenters/{virtualDatacenter}/virtualappliances/{vapp}/virtualmachines/{virtualMachine}",
params);
}
protected VirtualMachineDto createTransferObject(final VirtualMachine virtualMachine)
{
VirtualMachineDto dto = new VirtualMachineDto();
dto.setCpu(virtualMachine.getCpu());
dto.setRam(virtualMachine.getRam());
dto.setDescription(virtualMachine.getDescription());
dto.setHdInBytes(virtualMachine.getHd());
dto.setHighDisponibility(virtualMachine.getHighDisponibility() ? 1 : 0);
dto.setPassword(virtualMachine.getPassword());
dto.setName(virtualMachine.getName());
dto.setVdrpIP(virtualMachine.getVdrpIP());
dto.setVdrpPort(virtualMachine.getVdrpPort());
dto.setUuid(virtualMachine.getUUID());
return dto;
}
@Override
public BasicResult deleteVirtualMachine(final Integer virtualDatacenterId,
final Integer virtualApplianceId, final VirtualMachine virtualMachine)
{
BasicResult result = new BasicResult();
String vmachineUrl =
resolveVirtualMachineUrl(virtualDatacenterId, virtualApplianceId, virtualMachine
.getId());
ClientResponse response = delete(vmachineUrl);
if (response.getStatusCode() == Status.NO_CONTENT.getStatusCode())
{
result.setSuccess(true);
}
else
{
populateErrors(response, result, "deleteVirtualMachine");
}
return result;
}
@Override
public DataResult editVirtualMachineState(final Integer virtualDatacenterId,
final Integer virtualApplianceId, final VirtualMachine virtualMachine,
final VirtualMachineState virtualMachineState)
{
DataResult result = new DataResult();
String url =
createEditVirtualMachineStateUrl(virtualDatacenterId, virtualApplianceId,
virtualMachine.getId());
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(virtualMachineState);
ClientResponse response =
put(url, dto, AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
if (response.getStatusCode() == Status.ACCEPTED.getStatusCode())
{
result.setSuccess(true);
try
{
// Retrieve the VirtualDatacenter to associate the new virtual appliance
org.jclouds.abiquo.domain.cloud.VirtualAppliance vapp =
getApiClient().getCloudService().getVirtualDatacenter(virtualDatacenterId)
.getVirtualAppliance(virtualApplianceId);
org.jclouds.abiquo.domain.cloud.VirtualMachine vm =
vapp.getVirtualMachine(virtualMachine.getId());
result.setData(new State(StateEnum.valueOf(vm.getState().name())));
}
finally
{
releaseApiClient();
}
}
else
{
populateErrors(response, result, "editVirtualMachineState");
}
return result;
}
@Override
public DataResult rebootVirtualMachine(final Integer virtualDatacenterId,
final Integer virtualApplianceId, final VirtualMachine virtualMachine)
{
DataResult result = new DataResult();
String url =
createVirtualMachineResetUrl(virtualDatacenterId, virtualApplianceId, virtualMachine
.getId());
ClientResponse response = post(url, null, AcceptedRequestDto.MEDIA_TYPE);
if (response.getStatusCode() == Status.ACCEPTED.getStatusCode())
{
result.setSuccess(true);
try
{
// Retrieve the VirtualDatacenter to associate the new virtual appliance
org.jclouds.abiquo.domain.cloud.VirtualAppliance vapp =
getApiClient().getCloudService().getVirtualDatacenter(virtualDatacenterId)
.getVirtualAppliance(virtualApplianceId);
org.jclouds.abiquo.domain.cloud.VirtualMachine vm =
vapp.getVirtualMachine(virtualMachine.getId());
result.setData(new State(StateEnum.valueOf(vm.getState().name())));
}
finally
{
releaseApiClient();
}
}
else
{
populateErrors(response, result, "rebootVirtualMachine");
}
return result;
}
@Override
public BasicResult rebootInfrastructureVirtualMachine(final Integer datacenterId,
final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine)
{
String uri = createMachineLinkVm(datacenterId, rackId, machineId, virtualMachine.getId());
DataResult result = new DataResult();
ClientResponse response = get(uri, VirtualMachineDto.MEDIA_TYPE);
if (response.getStatusCode() == 200)
{
VirtualMachineDto vmDto = response.getEntity(VirtualMachineDto.class);
String url = vmDto.searchLink("virtualmachine").getHref() + "/action/reset";
response = post(url, null, AcceptedRequestDto.MEDIA_TYPE);
if (response.getStatusCode() == Status.ACCEPTED.getStatusCode())
{
result.setSuccess(true);
response = get(uri, VirtualMachinesDto.MEDIA_TYPE);
result.setData(new State(StateEnum.valueOf(response.getEntity(
VirtualMachineDto.class).getState().name())));
}
else
{
populateErrors(response, result, "editVirtualMachineState");
}
}
else
{
populateErrors(response, result, "editInfrastructureVirtualMachineState");
}
return result;
}
@Override
public BasicResult editInfrastructureVirtualMachineState(final Integer datacenterId,
final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine,
final VirtualMachineState off)
{
String uri = createMachineLinkVm(datacenterId, rackId, machineId, virtualMachine.getId());
DataResult result = new DataResult();
ClientResponse response = get(uri, VirtualMachineDto.MEDIA_TYPE);
if (response.getStatusCode() == 200)
{
VirtualMachineDto vmDto = response.getEntity(VirtualMachineDto.class);
String url = vmDto.searchLink("virtualmachine").getHref() + "/state";
VirtualMachineStateDto dto = new VirtualMachineStateDto();
dto.setState(off);
response =
put(url, dto, AcceptedRequestDto.MEDIA_TYPE, VirtualMachineStateDto.MEDIA_TYPE);
if (response.getStatusCode() == Status.ACCEPTED.getStatusCode())
{
result.setSuccess(true);
response = get(uri, VirtualMachinesDto.MEDIA_TYPE);
result.setData(new State(StateEnum.valueOf(response.getEntity(
VirtualMachineDto.class).getState().name())));
}
else
{
populateErrors(response, result, "editVirtualMachineState");
}
}
else
{
populateErrors(response, result, "editInfrastructureVirtualMachineState");
}
return result;
}
}