/** * 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.resources.DatacenterResource.createPersistenceObject; import static com.abiquo.api.resources.DatacenterResource.createTransferObject; import static com.abiquo.api.resources.RemoteServiceResource.createPersistenceObjects; import static com.abiquo.api.resources.RemoteServiceResource.createTransferObject; import java.util.Collection; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import org.apache.wink.common.annotations.Workspace; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import com.abiquo.api.services.DatacenterService; import com.abiquo.api.services.EnterpriseService; import com.abiquo.api.services.RemoteServiceService; import com.abiquo.api.spring.security.SecurityService; import com.abiquo.api.util.IRESTBuilder; import com.abiquo.model.enumerator.Privileges; import com.abiquo.server.core.enterprise.Enterprise; import com.abiquo.server.core.infrastructure.Datacenter; import com.abiquo.server.core.infrastructure.DatacenterDto; import com.abiquo.server.core.infrastructure.DatacentersDto; import com.abiquo.server.core.infrastructure.RemoteService; import com.abiquo.server.core.infrastructure.RemoteServicesDto; @Path(DatacentersResource.DATACENTERS_PATH) @Controller @Workspace(workspaceTitle = "Abiquo administration workspace", collectionTitle = "Datacenters") public class DatacentersResource extends AbstractResource { public static final String DATACENTERS_PATH = "admin/datacenters"; // TODO get allowed datacenters on DatacentersResourcePremium @Autowired private DatacenterService service; @Autowired private RemoteServiceService remoteServiceService; @Autowired private EnterpriseService entService; @Autowired private SecurityService securityService; /** * Returns all datacenters * * @title Retrieve a list of Datacenters * @param restBuilder a Context-injected object to create the links of the Dto * @param idEnterprise identifier of an enterprise * @param pricingId identifier of a pricing template * @return a {DatacentersDto} object with all datacenters * @throws Exception */ @GET @Produces(DatacentersDto.MEDIA_TYPE) public DatacentersDto getDatacenters(@Context final IRESTBuilder restBuilder, @QueryParam(value = "idEnterprise") final String idEnterprise, @QueryParam("pricing") final Integer pricingId) throws Exception { Collection<Datacenter> list = null; if (pricingId != null) { if (!securityService.hasPrivilege(Privileges.PRICING_VIEW)) { securityService.requirePrivilege(Privileges.PRICING_VIEW); } } if (StringUtils.hasText(idEnterprise)) { Enterprise enterprise = entService.getEnterprise(new Integer(idEnterprise)); list = service.getDatacenters(enterprise); } else { list = service.getDatacenters(); } DatacentersDto datacenters = new DatacentersDto(); for (Datacenter d : list) { DatacenterDto dcdto = createTransferObject(d, restBuilder); datacenters.add(dcdto); } return datacenters; } /** * Returns all datacenters with own remote services * * @title Retrieve a list of datacenters with their Remote Services * @param restBuilder a Context-injected object to create the links of the Dto * @param idEnterprise identifier of an enterprise * @return a {DatacentersDto} object with all datacenters and own remote services * @throws Exception */ @GET @Produces(DatacentersDto.RS_MEDIA_TYPE) public DatacentersDto getDatacentersWithRS(@Context final IRESTBuilder restBuilder, @QueryParam(value = "idEnterprise") final String idEnterprise) throws Exception { Collection<Datacenter> list = null; if (StringUtils.hasText(idEnterprise)) { Enterprise enterprise = entService.getEnterprise(new Integer(idEnterprise)); list = service.getDatacenters(enterprise); } else { list = service.getDatacenters(); } DatacentersDto datacenters = new DatacentersDto(); for (Datacenter d : list) { DatacenterDto dcdto = createTransferObject(d, restBuilder); dcdto.setRemoteServices(new RemoteServicesDto()); List<RemoteService> remoteServices = remoteServiceService.getRemoteServicesByDatacenter(d.getId()); if (remoteServices != null) { for (RemoteService rs : remoteServices) { dcdto.getRemoteServices().add(createTransferObject(rs, restBuilder)); } } datacenters.add(dcdto); } return datacenters; } /** * Creates a datacenter and returns it after creation * * @title Create a new Datacenter * @wiki A datacenter can be created with remote services if you send them in the dto. In this * case if the remote services return configuration errors, then the datacenter will be * created and the response will show the configuration errors. * @param datacenterDto datacenter to create * @param restBuilder a Context-injected object to create the links of the Dto * @return a {DatacenterDto} object with the created datacenter * @throws Exception */ @POST @Produces(DatacenterDto.MEDIA_TYPE) @Consumes(DatacenterDto.MEDIA_TYPE) public DatacenterDto postDatacenter(final DatacenterDto datacenterDto, @Context final IRESTBuilder restBuilder) throws Exception { // create dacenter Datacenter datacenter = createPersistenceObject(datacenterDto); Datacenter d = service.addDatacenter(datacenter); DatacenterDto dto = createTransferObject(d, restBuilder); // create remote services if any if (datacenterDto.getRemoteServices() != null) { RemoteServicesDto rsd = service.addRemoteServices( createPersistenceObjects(datacenterDto.getRemoteServices()), datacenter); dto.setRemoteServices(rsd); } return dto; } }