/**
* 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.ArrayList;
import java.util.List;
import org.apache.wink.client.ClientResponse;
import org.jclouds.abiquo.domain.infrastructure.Datacenter;
import org.jclouds.rest.AuthorizationException;
import com.abiquo.abiserver.commands.impl.InfrastructureCommandImpl;
import com.abiquo.abiserver.commands.stub.AbstractAPIStub;
import com.abiquo.abiserver.commands.stub.DatacentersResourceStub;
import com.abiquo.abiserver.pojo.infrastructure.DataCenter;
import com.abiquo.abiserver.pojo.result.BasicResult;
import com.abiquo.abiserver.pojo.result.DataResult;
import com.abiquo.abiserver.pojo.service.RemoteService;
import com.abiquo.model.enumerator.RemoteServiceType;
import com.abiquo.server.core.infrastructure.DatacenterDto;
import com.abiquo.server.core.infrastructure.RemoteServiceDto;
import com.abiquo.server.core.infrastructure.RemoteServicesDto;
/**
* @author scastro
*/
public class DatacentersResourceStubImpl extends AbstractAPIStub implements DatacentersResourceStub
{
@Override
public DataResult<ArrayList<DataCenter>> getDatacenters()
{
DataResult<ArrayList<DataCenter>> result = new DataResult<ArrayList<DataCenter>>();
ArrayList<DataCenter> dcs = new ArrayList<DataCenter>();
try
{
Iterable<Datacenter> datacenters =
getApiClient().getAdministrationService().listDatacenters();
for (Datacenter dc : datacenters)
{
dcs.add(fromDtoToPojo(dc));
}
result.setSuccess(true);
result.setData(dcs);
}
catch (Exception ex)
{
populateErrors(ex, result, "getDatacenters");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<ArrayList<DataCenter>> getDatacenters(final Integer enterpriseId)
{
DataResult<ArrayList<DataCenter>> result = new DataResult<ArrayList<DataCenter>>();
ArrayList<DataCenter> dcs = new ArrayList<DataCenter>();
try
{
Iterable<Datacenter> datacenters =
getApiClient().getAdministrationService().getEnterprise(enterpriseId)
.listAllowedDatacenters();
for (Datacenter dc : datacenters)
{
dcs.add(fromDtoToPojo(dc, false));
}
result.setSuccess(true);
result.setData(dcs);
}
catch (Exception ex)
{
populateErrors(ex, result, "getDatacenters");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<DataCenter> getDatacenter(final Integer datacenterId)
{
DataResult<DataCenter> result = new DataResult<DataCenter>();
try
{
Datacenter dc = getApiClient().getAdministrationService().getDatacenter(datacenterId);
result.setSuccess(true);
result.setData(fromDtoToPojo(dc));
}
catch (Exception ex)
{
populateErrors(ex, result, "getDatacenter");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<DataCenter> createDatacenter(final DataCenter datacenter)
{
DataResult<DataCenter> result = new DataResult<DataCenter>();
if (!checkRemoteServices(datacenter.getRemoteServices()))
{
result.setSuccess(false);
result.setMessage("Some remote service URIs have invalid syntax");
return result;
}
DatacenterDto dto = fromDatacenterToDto(datacenter);
dto.setId(null);
ClientResponse response = post(createDatacenterLink(), dto);
if (response.getStatusCode() == 201)
{
DatacenterDto responseDto = response.getEntity(DatacenterDto.class);
DataCenter dc = DataCenter.create(responseDto);
dc.setRemoteServices(new ArrayList<RemoteService>());
result.setSuccess(true);
if (responseDto.getRemoteServices() != null
&& !responseDto.getRemoteServices().isEmpty())
{
for (RemoteServiceDto rsdto : responseDto.getRemoteServices().getCollection())
{
dc.getRemoteServices().add(RemoteService.create(rsdto, dc.getId()));
}
if (responseDto.getRemoteServices().getConfigErrors() != null
&& !responseDto.getRemoteServices().getConfigErrors().isEmpty())
{
result.setSuccess(false);
result
.setMessage("Datacenter '"
+ dc.getName()
+ "' has been created but some Remote Services had configuration errors. Please check the events to fix the problems.");
}
}
result.setData(dc);
}
else
{
populateErrors(response, result, "createDatacenter");
}
return result;
}
@Override
public DataResult<DataCenter> modifyDatacenter(final DataCenter datacenter)
{
DataResult<DataCenter> result = new DataResult<DataCenter>();
DatacenterDto dto = fromDatacenterToDto(datacenter);
ClientResponse response = put(createDatacenterLink(datacenter.getId()), dto);
if (response.getStatusCode() == 200)
{
DatacenterDto responseDto = response.getEntity(DatacenterDto.class);
DataCenter dc = DataCenter.create(responseDto);
result.setSuccess(true);
result.setData(dc);
}
else
{
populateErrors(response, result, "modifyDatacenter");
}
return result;
}
@Override
public DataResult<DataCenter> deleteDatacenter(final DataCenter datacenter)
{
DataResult<DataCenter> result = new DataResult<DataCenter>();
ClientResponse response = delete(createDatacenterLink(datacenter.getId()));
if (response.getStatusCode() == 204)
{
result.setSuccess(true);
}
else
{
populateErrors(response, result, "deleteDatacenter");
}
return result;
}
@Override
public BasicResult updateUsedResources(final Integer datacenterId)
{
BasicResult result = new BasicResult();
ClientResponse response = put(createDatacenterLinkUsedResources(datacenterId), null);
if (response.getStatusCode() == 204)
{
result.setSuccess(true);
result.setMessage(InfrastructureCommandImpl.getResourceManager().getMessage(
"updateUsedResourcesByDatacenter.success"));
}
else
{
populateErrors(response, result, "updateUsedResources");
}
return result;
}
// Utility functions
private boolean checkRemoteServices(final List<RemoteService> remoteServices)
{
if (remoteServices == null || remoteServices.isEmpty())
{
return false;
}
for (RemoteService rs : remoteServices)
{
if (!rs.checkUri())
{
return false;
}
}
return true;
}
private DatacenterDto fromDatacenterToDto(final DataCenter datacenter)
{
DatacenterDto newDatacenter = new DatacenterDto();
newDatacenter.setId(datacenter.getId());
newDatacenter.setLocation(datacenter.getSituation());
newDatacenter.setName(datacenter.getName());
RemoteServicesDto rsdto = new RemoteServicesDto();
for (RemoteService rs : datacenter.getRemoteServices())
{
rsdto.add(fromRemoteServicesToDto(rs));
}
newDatacenter.setRemoteServices(rsdto);
return newDatacenter;
}
private RemoteServiceDto fromRemoteServicesToDto(final RemoteService rs)
{
RemoteServiceDto rsdto = new RemoteServiceDto();
rsdto.setId(rs.getIdRemoteService());
rsdto.setStatus(rs.getStatus());
rsdto.setType(getRemoteServiceType(rs));
rsdto.setUri(rs.getUri());
return rsdto;
}
public DataCenter fromDtoToPojo(final Datacenter datacenter)
{
return fromDtoToPojo(datacenter, true);
}
public DataCenter fromDtoToPojo(final Datacenter datacenter, final boolean includeRS)
{
DataCenter dc = DataCenter.create(datacenter.unwrap());
dc.setRemoteServices(new ArrayList<RemoteService>());
if (includeRS)
{
try
{
List<org.jclouds.abiquo.domain.infrastructure.RemoteService> remoteservices =
datacenter.listRemoteServices();
for (org.jclouds.abiquo.domain.infrastructure.RemoteService rs : remoteservices)
{
dc.getRemoteServices().add(RemoteService.create(rs.unwrap(), dc.getId()));
}
}
catch (AuthorizationException ex)
{
// DO NOTHING
// If in this case we cannot acces to remote services then won't return them
}
}
return dc;
}
private RemoteServiceType getRemoteServiceType(final RemoteService rs)
{
String rst = rs.getServiceMapping();
if (rst.equals(RemoteServiceType.APPLIANCE_MANAGER.getServiceMapping()))
{
return RemoteServiceType.APPLIANCE_MANAGER;
}
else if (rst.equals(RemoteServiceType.BPM_SERVICE.getServiceMapping()))
{
return RemoteServiceType.BPM_SERVICE;
}
else if (rst.equals(RemoteServiceType.DHCP_SERVICE.getServiceMapping()))
{
return RemoteServiceType.DHCP_SERVICE;
}
else if (rst.equals(RemoteServiceType.NODE_COLLECTOR.getServiceMapping()))
{
return RemoteServiceType.NODE_COLLECTOR;
}
else if (rst.equals(RemoteServiceType.STORAGE_SYSTEM_MONITOR.getServiceMapping()))
{
return RemoteServiceType.STORAGE_SYSTEM_MONITOR;
}
else if (rst.equals(RemoteServiceType.VIRTUAL_SYSTEM_MONITOR.getServiceMapping()))
{
return RemoteServiceType.VIRTUAL_SYSTEM_MONITOR;
}
else if (rst.equals(RemoteServiceType.VIRTUAL_FACTORY.getServiceMapping()))
{
return RemoteServiceType.VIRTUAL_FACTORY;
}
return null;
}
}