/**
* 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.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.wink.client.ClientResponse;
import org.jclouds.abiquo.domain.infrastructure.Datacenter;
import org.jclouds.abiquo.predicates.infrastructure.RemoteServicePredicates;
import com.abiquo.abiserver.abicloudws.RemoteServiceClient;
import com.abiquo.abiserver.commands.BasicCommand;
import com.abiquo.abiserver.commands.stub.AbstractAPIStub;
import com.abiquo.abiserver.commands.stub.RemoteServicesResourceStub;
import com.abiquo.abiserver.exception.RemoteServiceException;
import com.abiquo.abiserver.pojo.authentication.UserSession;
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.RemoteServiceDto;
import com.abiquo.tracer.ComponentType;
import com.abiquo.tracer.EventType;
import com.abiquo.tracer.SeverityType;
public class RemoteServicesResourceStubImpl extends AbstractAPIStub implements
RemoteServicesResourceStub
{
@Override
public DataResult<RemoteService> addRemoteService(final RemoteService remoteService)
{
DataResult<RemoteService> result = new DataResult<RemoteService>();
try
{
Datacenter dc =
getApiClient().getAdministrationService().getDatacenter(
remoteService.getIdDataCenter());
org.jclouds.abiquo.domain.infrastructure.RemoteService rs =
org.jclouds.abiquo.domain.infrastructure.RemoteService
.builder(getApiClient(), dc)
.ip(remoteService.getDomainName())
.type(
RemoteServiceType
.valueOf(remoteService.getRemoteServiceType().getValueOf()))
.port(remoteService.getPort()).build();
rs.save();
result.setData(RemoteService.create(rs.unwrap(), remoteService.getIdDataCenter()));
result.setSuccess(Boolean.TRUE);
// ApplianceManager with errors isn't added
if (rs.getType() == RemoteServiceType.APPLIANCE_MANAGER)
{
boolean amError = !rs.unwrap().getConfigurationErrors().isEmpty();
if (amError)
{
result.setSuccess(Boolean.FALSE);
result.setData(null);
result.setMessage(rs.unwrap().getConfigurationErrors().toString());
}
}
}
catch (Exception ex)
{
populateErrors(ex, result, "addRemoteService");
}
finally
{
releaseApiClient();
}
return result;
}
private RemoteService getReponseService(final RemoteService remoteService,
final DataResult<RemoteService> result, final ClientResponse response,
final EventType eventType)
{
RemoteServiceDto responseDto = response.getEntity(RemoteServiceDto.class);
RemoteService responseService =
RemoteService.create(responseDto, remoteService.getIdDataCenter());
if (responseDto.getConfigurationErrors() != null
&& !responseDto.getConfigurationErrors().isEmpty())
{
result.setSuccess(false);
result.setMessage(responseDto.getConfigurationErrors().toString());
BasicCommand.traceLog(SeverityType.MAJOR, ComponentType.DATACENTER, eventType,
currentSession, null, null, responseDto.getConfigurationErrors().toString(), null,
null, null, null, null);
}
return responseService;
}
@Override
public DataResult<Boolean> deleteRemoteService(final RemoteService remoteService)
{
DataResult<Boolean> result = new DataResult<Boolean>();
try
{
Datacenter dc =
getApiClient().getAdministrationService().getDatacenter(
remoteService.getIdDataCenter());
org.jclouds.abiquo.domain.infrastructure.RemoteService rs =
dc.findRemoteService(RemoteServicePredicates.type(RemoteServiceType
.valueOf(remoteService.getRemoteServiceType().getValueOf())));
rs.delete();
result.setData(Boolean.TRUE);
result.setSuccess(Boolean.TRUE);
}
catch (Exception ex)
{
populateErrors(ex, result, "deleteRemoteService");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<RemoteService> modifyRemoteService(final RemoteService remoteService)
{
DataResult<RemoteService> result = new DataResult<RemoteService>();
try
{
Datacenter dc =
getApiClient().getAdministrationService().getDatacenter(
remoteService.getIdDataCenter());
org.jclouds.abiquo.domain.infrastructure.RemoteService rs =
dc.findRemoteService(RemoteServicePredicates.type(RemoteServiceType
.valueOf(remoteService.getRemoteServiceType().getValueOf())));
rs.setUri(remoteService.getUri());
rs.update();
result.setData(RemoteService.create(rs.unwrap(), dc.getId()));
result.setSuccess(Boolean.TRUE);
}
catch (Exception ex)
{
populateErrors(ex, result, "modifyRemoteService");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<List<RemoteService>> getRemoteServices(final Integer idDatacenter,
final String type)
{
DataResult<List<RemoteService>> result = new DataResult<List<RemoteService>>();
result.setData(new ArrayList<RemoteService>());
try
{
Datacenter dc = getApiClient().getAdministrationService().getDatacenter(idDatacenter);
org.jclouds.abiquo.domain.infrastructure.RemoteService rs =
dc.findRemoteService(RemoteServicePredicates.type(RemoteServiceType.valueOf(type)));
result.getData().add(RemoteService.create(rs.unwrap(), idDatacenter));
result.setSuccess(Boolean.TRUE);
}
catch (Exception ex)
{
populateErrors(ex, result, "getRemoteServices");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<Boolean> checkRemoteService(final Integer idDatacenter, final String type)
{
DataResult<Boolean> result = new DataResult<Boolean>();
try
{
Datacenter dc = getApiClient().getAdministrationService().getDatacenter(idDatacenter);
org.jclouds.abiquo.domain.infrastructure.RemoteService rs =
dc.findRemoteService(RemoteServicePredicates.type(RemoteServiceType.valueOf(type)));
result.setData(rs.isAvailable());
result.setSuccess(Boolean.TRUE);
}
catch (Exception ex)
{
populateErrors(ex, result, "checkRemoteService");
}
finally
{
releaseApiClient();
}
return result;
}
@Override
public DataResult<Boolean> checkRemoteService(final UserSession userSession, final String type,
final String uri)
{
DataResult<Boolean> result = new DataResult<Boolean>();
RemoteServiceType rsType = RemoteServiceType.valueOf(type);
// If a Remote Service cannot be checked by definition, we assume it is
// OK
if (!rsType.canBeChecked())
{
result.setSuccess(Boolean.TRUE);
result.setData(Boolean.TRUE);
return result;
}
try
{
new URL(uri);
}
catch (MalformedURLException ex)
{
result.setSuccess(Boolean.FALSE);
result.setData(Boolean.FALSE);
result.setMessage("Inavlid url to check (" + uri + ")");
return result;
}
RemoteServiceClient remoteServiceClient = new RemoteServiceClient(uri);
try
{
remoteServiceClient.ping();
result.setSuccess(Boolean.TRUE);
result.setData(Boolean.TRUE);
}
catch (RemoteServiceException ex)
{
result.setSuccess(Boolean.TRUE);
result.setData(Boolean.FALSE);
}
catch (IllegalArgumentException ex)
{
result.setSuccess(Boolean.FALSE);
result.setData(Boolean.FALSE);
result.setMessage(ex.getMessage());
}
return result;
}
}