/**
* 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 static java.lang.String.valueOf;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.wink.client.ClientResponse;
import com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkConfigurationHB;
import com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkHB;
import com.abiquo.abiserver.commands.stub.AbstractAPIStub;
import com.abiquo.abiserver.commands.stub.VirtualDatacenterResourceStub;
import com.abiquo.abiserver.persistence.DAOFactory;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory;
import com.abiquo.abiserver.pojo.infrastructure.HyperVisorType;
import com.abiquo.abiserver.pojo.result.BasicResult;
import com.abiquo.abiserver.pojo.result.DataResult;
import com.abiquo.abiserver.pojo.result.ListRequest;
import com.abiquo.abiserver.pojo.user.Enterprise;
import com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter;
import com.abiquo.abiserver.pojo.virtualappliance.VirtualDatacentersListResult;
import com.abiquo.abiserver.pojo.virtualhardware.Limit;
import com.abiquo.abiserver.pojo.virtualhardware.ResourceAllocationLimit;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.model.rest.RESTLink;
import com.abiquo.server.core.cloud.VirtualDatacenterDto;
import com.abiquo.server.core.cloud.VirtualDatacentersDto;
import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
import com.abiquo.util.URIResolver;
import com.abiquo.util.resources.ResourceManager;
import edu.emory.mathcs.backport.java.util.Collections;
public class VirtualDatacenterResourceStubImpl extends AbstractAPIStub implements
VirtualDatacenterResourceStub
{
public VirtualDatacenterResourceStubImpl()
{
super();
}
/*
* (non-Javadoc)
* @see
* com.abiquo.abiserver.commands.stub.impl.VirtualDatacenterResourceStub#createVirtualDatacenter
* (com.abiquo.abiserver.pojo.authentication.UserSession,
* com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter, java.lang.String,
* com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkConfigurationHB,
* com.abiquo.util.resources.ResourceManager, com.abiquo.util.ErrorManager)
*/
@Override
@SuppressWarnings("unchecked")
public DataResult<VirtualDataCenter> createVirtualDatacenter(final VirtualDataCenter vdc,
final String networkName, final NetworkConfigurationHB netConfig,
final ResourceManager resourceManager)
{
VirtualDatacenterDto dto = new VirtualDatacenterDto();
dto.setName(vdc.getName());
dto.setHypervisorType(HypervisorType.fromValue(vdc.getHyperType().getName()));
addLimits(vdc, dto);
// TODO: Review these values!
VLANNetworkDto vlanDto = new VLANNetworkDto();
vlanDto.setName(networkName);
vlanDto.setName(networkName);
vlanDto.setAddress(netConfig.getNetworkAddress());
vlanDto.setGateway(netConfig.getGateway());
vlanDto.setMask(netConfig.getMask());
vlanDto.setPrimaryDNS(netConfig.getPrimaryDNS());
vlanDto.setSecondaryDNS(netConfig.getSecondaryDNS());
vlanDto.setSufixDNS(netConfig.getSufixDNS());
String datacenterLink =
URIResolver.resolveURI(apiUri, "admin/datacenters/{datacenter}",
Collections.singletonMap("datacenter", String.valueOf(vdc.getIdDataCenter())));
String enterpriseLink = createEnterpriseLink(vdc.getEnterprise().getId());
URIResolver.resolveURI(apiUri, "cloud/virtualdatacenters", new HashMap<String, String>());
dto.addLink(new RESTLink("datacenter", datacenterLink));
dto.addLink(new RESTLink("enterprise", enterpriseLink));
dto.setVlan(vlanDto);
String uri = createVirtualDatacentersLink();
ClientResponse response = post(uri, dto);
DataResult<VirtualDataCenter> dataResult = new DataResult<VirtualDataCenter>();
if (response.getStatusCode() != 201)
{
populateErrors(response, dataResult, "updateVirtualDatacenter");
}
else
{
dataResult.setSuccess(true);
VirtualDatacenterDto responseDto = response.getEntity(VirtualDatacenterDto.class);
DAOFactory factory = HibernateDAOFactory.instance();
factory.beginConnection();
NetworkHB network =
factory.getNetworkDAO().findByVirtualDatacenter(responseDto.getId());
VirtualDataCenter responseVdc =
VirtualDataCenter.create(responseDto, vdc.getIdDataCenter(), vdc.getEnterprise(),
network.toPojo());
responseVdc.setLimits(vdc.getLimits());
responseVdc.setDefaultVlan(responseVdc.getDefaultVlan());
dataResult.setData(responseVdc);
dataResult.setMessage(resourceManager.getMessage("createVirtualDataCenter.success"));
factory.endConnection();
}
return dataResult;
}
private void addLimits(final VirtualDataCenter vdc, final VirtualDatacenterDto dto)
{
if (vdc.getLimits() != null)
{
dto.setCpuCountLimits((int) vdc.getLimits().getCpu().getSoft(), (int) vdc.getLimits()
.getCpu().getHard());
dto.setHdLimitsInMb(vdc.getLimits().getHd().getSoft(), vdc.getLimits().getHd()
.getHard());
dto.setRamLimitsInMb((int) vdc.getLimits().getRam().getSoft(), (int) vdc.getLimits()
.getRam().getHard());
dto.setStorageLimits(vdc.getLimits().getStorage().getSoft(), vdc.getLimits()
.getStorage().getHard());
dto.setVlansLimits(vdc.getLimits().getVlan().getSoft(), vdc.getLimits().getVlan()
.getHard());
dto.setPublicIPLimits(vdc.getLimits().getPublicIP().getSoft(), vdc.getLimits()
.getPublicIP().getHard());
}
}
/*
* (non-Javadoc)
* @see
* com.abiquo.abiserver.commands.stub.impl.VirtualDatacenterResourceStub#updateVirtualDatacenter
* (com.abiquo.abiserver.pojo.authentication.UserSession,
* com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter,
* com.abiquo.util.resources.ResourceManager, com.abiquo.util.ErrorManager)
*/
@Override
@SuppressWarnings("unchecked")
public DataResult<VirtualDataCenter> updateVirtualDatacenter(final VirtualDataCenter vdc,
final ResourceManager resourceManager)
{
DataResult<VirtualDataCenter> dataResult = new DataResult<VirtualDataCenter>();
String uri =
URIResolver.resolveURI(apiUri, "cloud/virtualdatacenters/{virtualDatacenter}",
Collections.singletonMap("virtualDatacenter", String.valueOf(vdc.getId())));
VirtualDatacenterDto dto = new VirtualDatacenterDto();
dto.setId(vdc.getId());
dto.setName(vdc.getName());
addLimits(vdc, dto);
ClientResponse response = put(uri, dto);
if (response.getStatusCode() != 200)
{
populateErrors(response, dataResult, "updateVirtualDatacenter");
}
else
{
VirtualDatacenterDto vdcDto = response.getEntity(VirtualDatacenterDto.class);
vdc.setHyperType(new HyperVisorType(vdcDto.getHypervisorType()));
vdc.setName(vdcDto.getName());
dataResult.setData(vdc);
dataResult.setSuccess(true);
dataResult.setMessage(resourceManager.getMessage("editVirtualDataCenter.success"));
}
return dataResult;
}
/*
* (non-Javadoc)
* @see
* com.abiquo.abiserver.commands.stub.impl.VirtualDatacenterResourceStub#deleteVirtualDatacenter
* (com.abiquo.abiserver.pojo.authentication.UserSession,
* com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter,
* com.abiquo.util.resources.ResourceManager)
*/
@Override
@SuppressWarnings("unchecked")
public BasicResult deleteVirtualDatacenter(final VirtualDataCenter vdc,
final ResourceManager resourceManager)
{
BasicResult basicResult = new BasicResult();
String uri =
URIResolver.resolveURI(apiUri, "cloud/virtualdatacenters/{virtualDatacenter}",
Collections.singletonMap("virtualDatacenter", String.valueOf(vdc.getId())));
ClientResponse response = delete(uri);
if (response.getStatusCode() != 204)
{
populateErrors(response, basicResult, "deleteVirtualDatacenter");
}
else
{
basicResult.setSuccess(true);
basicResult.setMessage(resourceManager.getMessage("deleteVirtualDataCenter.success"));
}
return basicResult;
}
@Override
public DataResult<Collection<VirtualDataCenter>> getVirtualDatacentersByEnterprise(
final Enterprise enterprise)
{
DataResult<Collection<VirtualDataCenter>> result =
new DataResult<Collection<VirtualDataCenter>>();
// Build request URI
String uri =
URIResolver.resolveURI(apiUri, "cloud/virtualdatacenters", Collections.emptyMap(),
Collections.singletonMap("enterprise", new String[] {valueOf(enterprise.getId())}));
ClientResponse response = get(uri, VirtualDatacentersDto.MEDIA_TYPE);
if (response.getStatusCode() == 200)
{
VirtualDatacentersDto dto = response.getEntity(VirtualDatacentersDto.class);
Collection<VirtualDataCenter> collection = new LinkedHashSet<VirtualDataCenter>();
for (VirtualDatacenterDto vdc : dto.getCollection())
{
int datacenterId =
URIResolver.getLinkId(vdc.searchLink("datacenter"), "admin/datacenters",
"{datacenter}", "datacenter");
// TODO set all limits
ResourceAllocationLimit limits = new ResourceAllocationLimit();
Limit publicIpLimit = new Limit();
publicIpLimit.setHard(vdc.getPublicIpsHard());
publicIpLimit.setSoft(vdc.getPublicIpsSoft());
limits.setPublicIP(publicIpLimit);
VirtualDataCenter pojo = new VirtualDataCenter();
pojo.setId(vdc.getId());
pojo.setName(vdc.getName());
pojo.setLimits(limits);
pojo.setIdDataCenter(datacenterId);
pojo.setHyperType(new HyperVisorType(vdc.getHypervisorType()));
collection.add(pojo);
}
result.setSuccess(true);
result.setData(collection);
}
else
{
populateErrors(response, result, "getVirtualDatacenters");
}
return result;
}
@Override
public DataResult<VirtualDatacentersListResult> getVirtualDatacentersByEnterprise(
final Enterprise enterprise, final ListRequest listRequest)
{
DataResult<VirtualDatacentersListResult> result =
new DataResult<VirtualDatacentersListResult>();
StringBuilder buildRequest =
new StringBuilder(createVirtualDatacentersFromEnterpriseLink(enterprise.getId()));
VirtualDatacentersListResult listResult = new VirtualDatacentersListResult();
if (listRequest != null)
{
buildRequest.append("?startwith=" + listRequest.getOffset());
buildRequest.append("&limit=" + listRequest.getNumberOfNodes());
if (listRequest.getOrderBy() != null && !listRequest.getOrderBy().isEmpty())
{
buildRequest.append("&by=" + listRequest.getOrderBy());
}
buildRequest.append("&asc=" + (listRequest.getAsc() == true ? "true" : "false"));
if (listRequest.getFilterLike() != null && !listRequest.getFilterLike().isEmpty())
{
try
{
buildRequest.append("&has=" + URIUtil.encodeQuery(listRequest.getFilterLike()));
}
catch (URIException e)
{
}
}
}
ClientResponse response = get(buildRequest.toString(), VirtualDatacentersDto.MEDIA_TYPE);
if (response.getStatusCode() == 200)
{
VirtualDatacentersDto dto = response.getEntity(VirtualDatacentersDto.class);
Collection<VirtualDataCenter> collection = new LinkedHashSet<VirtualDataCenter>();
for (VirtualDatacenterDto vdc : dto.getCollection())
{
int datacenterId =
URIResolver.getLinkId(vdc.searchLink("datacenter"), "admin/datacenters",
"{datacenter}", "datacenter");
VirtualDataCenter vdctoadd =
VirtualDataCenter.create(vdc, datacenterId, enterprise);
// Get the default network of the vdc.
RESTLink link = vdc.searchLink("defaultnetwork");
response = get(link.getHref(), VLANNetworkDto.MEDIA_TYPE);
VLANNetworkDto vlanDto = response.getEntity(VLANNetworkDto.class);
vdctoadd.setDefaultVlan(NetworkResourceStubImpl.createFlexObject(vlanDto));
collection.add(vdctoadd);
}
Integer total =
dto.getTotalSize() != null ? dto.getTotalSize() : dto.getCollection().size();
listResult.setTotalVirtualDatacenters(total);
listResult.setVirtualDatacentersList(collection);
result.setSuccess(true);
result.setData(listResult);
}
else
{
populateErrors(response, result, "getVirtualDatacenters");
}
return result;
}
}