/** * 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.cloud; import static com.abiquo.api.resources.DatacenterResource.DATACENTER; import static com.abiquo.api.resources.EnterpriseResource.ENTERPRISE; import static com.abiquo.api.resources.cloud.VirtualDatacenterResource.createTransferObject; import java.util.Collection; import javax.annotation.Resource; import javax.validation.constraints.Min; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; 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 com.abiquo.api.exceptions.APIError; import com.abiquo.api.exceptions.NotFoundException; import com.abiquo.api.resources.AbstractResource; import com.abiquo.api.resources.DatacenterResource; import com.abiquo.api.resources.DatacentersResource; import com.abiquo.api.resources.EnterpriseResource; import com.abiquo.api.resources.EnterprisesResource; import com.abiquo.api.services.DatacenterService; import com.abiquo.api.services.EnterpriseService; import com.abiquo.api.services.UserService; import com.abiquo.api.services.cloud.VirtualDatacenterService; import com.abiquo.api.spring.security.SecurityService; import com.abiquo.api.util.IRESTBuilder; import com.abiquo.model.enumerator.Privileges; import com.abiquo.model.rest.RESTLink; import com.abiquo.server.core.cloud.VirtualDatacenter; import com.abiquo.server.core.cloud.VirtualDatacenterDto; import com.abiquo.server.core.cloud.VirtualDatacentersDto; import com.abiquo.server.core.enterprise.Enterprise; import com.abiquo.server.core.infrastructure.Datacenter; /** * @wiki The VirtualDatacenter Resource offers the functionality of managing the virtual datacenters */ @Path(VirtualDatacentersResource.VIRTUAL_DATACENTERS_PATH) @Controller @Workspace(workspaceTitle = "Abiquo cloud workspace", collectionTitle = "VirtualDatacenters") public class VirtualDatacentersResource extends AbstractResource { public static final String VIRTUAL_DATACENTERS_PATH = "cloud/virtualdatacenters"; // @Autowired @Resource(name = "virtualDatacenterService") private VirtualDatacenterService service; @Autowired private DatacenterService datacenterService; @Autowired private EnterpriseService enterpriseService; @Autowired private UserService userService; @Autowired private SecurityService securityService; /** * Returns all virtual datacenters * * @title Retrieve all virtual datacenters * @param enterpriseId identifier of an enterprise * @param datacenterId identifier of a datacenter * @param startwith * @param orderBy * @param filter * @param limit * @param descOrAsc * @param restBuilder a Context-injected object to create the links of the Dto * @return a {VirtualDatacentersDto} object with all virtual datacenters * @throws Exception */ @GET @Produces(VirtualDatacentersDto.MEDIA_TYPE) public VirtualDatacentersDto getVirtualDatacenters( @QueryParam(ENTERPRISE) final Integer enterpriseId, @QueryParam(DATACENTER) final Integer datacenterId, @QueryParam(START_WITH) @DefaultValue("0") @Min(0) final Integer startwith, @QueryParam(BY) @DefaultValue("name") final String orderBy, @QueryParam(FILTER) @DefaultValue("") final String filter, @QueryParam(LIMIT) @Min(1) @DefaultValue(DEFAULT_PAGE_LENGTH_STRING) final Integer limit, @QueryParam(ASC) @DefaultValue("true") final Boolean descOrAsc, @Context final IRESTBuilder restBuilder) throws Exception { if (!securityService.hasPrivilege(Privileges.VDC_ENUMERATE) && !securityService.hasPrivilege(Privileges.ENTERPRISE_ENUMERATE) && !securityService.hasPrivilege(Privileges.USERS_MANAGE_OTHER_ENTERPRISES)) { if (enterpriseId != null && !enterpriseId.equals(userService.getCurrentUser().getEnterprise().getId())) { // throws access denied exception securityService.requirePrivilege(Privileges.VDC_ENUMERATE); } } Datacenter datacenter = null; if (datacenterId != null) { datacenter = getDatacenter(datacenterId); } Enterprise enterprise = null; if (enterpriseId != null) { enterprise = getEnterprise(enterpriseId); } Collection<VirtualDatacenter> all = service.getVirtualDatacenters(enterprise, datacenter, null); VirtualDatacentersDto vdcs = new VirtualDatacentersDto(); for (VirtualDatacenter d : all) { vdcs.add(createTransferObject(d, restBuilder)); } return vdcs; } /** * Creates a virtual datacenter and returns it after creation * * @title Create a virtual datacenter * @param dto the virtual datacetner to create * @param datacenterId identifier of the datacenter * @param enterpriseId identifier of the enterprise * @param restBuilder a Context-injected object to create the links of the Dto * @return a {VirtualDatacenterDto} object with the created virtual datacenter * @throws Exception */ @POST @Consumes(VirtualDatacenterDto.MEDIA_TYPE) @Produces(VirtualDatacenterDto.MEDIA_TYPE) public VirtualDatacenterDto postVirtualDatacenter(final VirtualDatacenterDto dto, @QueryParam(DATACENTER) final Integer datacenterId, @QueryParam(ENTERPRISE) final Integer enterpriseId, @Context final IRESTBuilder restBuilder) throws Exception { Datacenter datacenter = null; Enterprise enterprise = null; if (datacenterId != null) { datacenter = getDatacenter(datacenterId); } else { datacenter = getDatacenter(dto.searchLink(DATACENTER)); } if (enterpriseId != null) { enterprise = getEnterprise(enterpriseId); } else { enterprise = getEnterprise(dto.searchLink(ENTERPRISE)); } userService.checkCurrentEnterpriseForPostMethods(enterprise); VirtualDatacenter vdc = service.createVirtualDatacenter(dto, datacenter, enterprise); VirtualDatacenterDto response = VirtualDatacenterResource.createTransferObject(vdc, restBuilder); return response; } private Datacenter getDatacenter(final RESTLink datacenterLink) { Integer datacenterId = getLinkId(datacenterLink, DatacentersResource.DATACENTERS_PATH, DatacenterResource.DATACENTER_PARAM, DATACENTER, APIError.NON_EXISTENT_DATACENTER); return getDatacenter(datacenterId); } private Datacenter getDatacenter(final Integer datacenterId) { Datacenter datacenter = datacenterService.getDatacenter(datacenterId); if (datacenter == null) { throw new NotFoundException(APIError.NON_EXISTENT_DATACENTER); } return datacenter; } private Enterprise getEnterprise(final RESTLink enterpriseLink) { Integer enterpriseId = getLinkId(enterpriseLink, EnterprisesResource.ENTERPRISES_PATH, EnterpriseResource.ENTERPRISE_PARAM, ENTERPRISE, APIError.NON_EXISTENT_ENTERPRISE); return getEnterprise(enterpriseId); } private Enterprise getEnterprise(final Integer enterpriseId) { Enterprise enterprise = enterpriseService.getEnterprise(enterpriseId); return enterprise; } }