/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.api; import static com.emc.sa.api.mapper.CatalogImageMapper.createNewObject; import static com.emc.sa.api.mapper.CatalogImageMapper.map; import static com.emc.sa.api.mapper.CatalogImageMapper.updateObject; import static com.emc.storageos.db.client.URIUtil.uri; import static com.emc.storageos.api.mapper.DbObjectMapper.toNamedRelatedResource; import java.net.URI; import java.util.Iterator; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import com.emc.sa.api.mapper.CatalogImageFilter; import com.emc.sa.api.mapper.CatalogImageMapper; import com.emc.sa.catalog.CatalogImageManager; import com.emc.storageos.db.client.model.uimodels.CatalogImage; import com.emc.storageos.api.service.impl.resource.ArgValidator; import com.emc.storageos.api.service.impl.response.BulkList; import com.emc.storageos.db.exceptions.DatabaseException; import com.emc.storageos.model.BulkIdParam; import com.emc.storageos.model.NamedRelatedResourceRep; import com.emc.storageos.model.ResourceTypeEnum; import com.emc.storageos.security.authentication.StorageOSUser; import com.emc.storageos.security.authorization.ACL; import com.emc.storageos.security.authorization.CheckPermission; import com.emc.storageos.security.authorization.DefaultPermissions; import com.emc.storageos.security.authorization.Role; import com.emc.storageos.services.OperationTypeEnum; import com.emc.storageos.volumecontroller.impl.monitoring.RecordableEventManager; import com.emc.vipr.client.catalog.impl.SearchConstants; import com.emc.vipr.model.catalog.CatalogImageBulkRep; import com.emc.vipr.model.catalog.CatalogImageCommonParam; import com.emc.vipr.model.catalog.CatalogImageCreateParam; import com.emc.vipr.model.catalog.CatalogImageList; import com.emc.vipr.model.catalog.CatalogImageRestRep; import com.emc.vipr.model.catalog.CatalogImageUpdateParam; @DefaultPermissions( readRoles = { Role.TENANT_ADMIN, Role.SYSTEM_MONITOR, Role.SYSTEM_ADMIN }, writeRoles = { Role.TENANT_ADMIN }, readAcls = { ACL.ANY }) @Path("/catalog/images") public class CatalogImageService extends CatalogTaggedResourceService { private static final String EVENT_SERVICE_TYPE = "catalog-image"; @Autowired private CatalogImageManager catalogImageManager; @Autowired private RecordableEventManager eventManager; @Override protected CatalogImage queryResource(URI id) { return getCatalogImageById(id, false); } @Override protected URI getTenantOwner(URI id) { CatalogImage catalogImage = queryResource(id); return uri(catalogImage.getTenant()); } @Override protected ResourceTypeEnum getResourceType() { return ResourceTypeEnum.CATALOG_IMAGE; } @Override public String getServiceType() { return EVENT_SERVICE_TYPE; } /** * Get info for catalog image * * @param id the URN of a Catalog Image * @prereq none * @brief Show catalog image * @return Catalog Image details */ @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Path("/{id}") public CatalogImageRestRep getCatalogImage(@PathParam("id") URI id) { CatalogImage catalogImage = queryResource(id); return map(catalogImage); } /** * Creates a new catalog image * * @param createParam * the parameter to create a new catalog image * @prereq none * @brief Create Catalog Image * @return none */ @POST @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @CheckPermission(roles = { Role.TENANT_ADMIN }, acls = { ACL.OWN }) @Path("") public CatalogImageRestRep createCatalogImage(CatalogImageCreateParam createParam) { StorageOSUser user = getUserFromContext(); verifyAuthorizedInTenantOrg(createParam.getTenant(), user); validateParam(createParam.getTenant(), createParam, null); CatalogImage catalogImage = createNewObject(createParam.getTenant(), createParam); catalogImageManager.createCatalogImage(catalogImage); auditOpSuccess(OperationTypeEnum.CREATE_CATALOG_IMAGE, catalogImage.auditParameters()); return map(catalogImage); } /** * Update catalog image * * @param param Catalog Image update parameters * @param id the URN the catalog image * @prereq none * @brief Update Catalog Image * @return No data returned in response body */ @PUT @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Path("/{id}") @CheckPermission(roles = { Role.TENANT_ADMIN }, acls = { ACL.OWN }) public CatalogImageRestRep updateCatalogImage(@PathParam("id") URI id, CatalogImageUpdateParam param) { CatalogImage catalogImage = getCatalogImageById(id, true); StorageOSUser user = getUserFromContext(); verifyAuthorizedInTenantOrg(uri(catalogImage.getTenant()), user); validateParam(uri(catalogImage.getTenant()), param, catalogImage); updateObject(catalogImage, param); catalogImageManager.updateCatalogImage(catalogImage); auditOpSuccess(OperationTypeEnum.UPDATE_CATALOG_IMAGE, catalogImage.auditParameters()); catalogImage = catalogImageManager.getCatalogImageById(catalogImage.getId()); return map(catalogImage); } /** * Deactivates the catalog image * * @param id the URN of an catalog image to be deactivated * @brief Deactivate Catalog Image * @return OK if deactivation completed successfully * @throws DatabaseException when a DB error occurs */ @POST @Path("/{id}/deactivate") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @CheckPermission(roles = { Role.TENANT_ADMIN }) public Response deactivateCatalogImage(@PathParam("id") URI id) throws DatabaseException { CatalogImage catalogImage = queryResource(id); ArgValidator.checkEntity(catalogImage, id, true); catalogImageManager.deleteCatalogImage(catalogImage); auditOpSuccess(OperationTypeEnum.DELETE_CATALOG_IMAGE, catalogImage.auditParameters()); return Response.ok().build(); } /** * Gets the list of catalog images * * @param tenantId the URN of a tenant * @brief List Catalog Images * @return a list of catalog images * @throws DatabaseException when a DB error occurs */ @GET @Path("") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public CatalogImageList getCatalogImages(@DefaultValue("") @QueryParam(SearchConstants.TENANT_ID_PARAM) String tenantId) throws DatabaseException { StorageOSUser user = getUserFromContext(); if (StringUtils.isBlank(tenantId)) { tenantId = user.getTenantId(); } verifyAuthorizedInTenantOrg(uri(tenantId), getUserFromContext()); List<CatalogImage> catalogImages = catalogImageManager.getCatalogImages(uri(tenantId)); CatalogImageList list = new CatalogImageList(); for (CatalogImage catalogImage : catalogImages) { NamedRelatedResourceRep resourceRep = toNamedRelatedResource(ResourceTypeEnum.CATALOG_IMAGE, catalogImage.getId(), catalogImage.getLabel()); list.getCatalogImages().add(resourceRep); } return list; } private CatalogImage getCatalogImageById(URI id, boolean checkInactive) { CatalogImage catalogImage = catalogImageManager.getCatalogImageById(id); ArgValidator.checkEntity(catalogImage, id, isIdEmbeddedInURL(id), checkInactive); return catalogImage; } private void validateParam(URI tenantId, CatalogImageCommonParam input, CatalogImage existing) { } /** * List data for the specified catalog images. * * @param param POST data containing the id list. * @prereq none * @brief List data of specified images * @return list of representations. * * @throws DatabaseException When an error occurs querying the database. */ @POST @Path("/bulk") @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Override public CatalogImageBulkRep getBulkResources(BulkIdParam param) { return (CatalogImageBulkRep) super.getBulkResources(param); } @SuppressWarnings("unchecked") @Override public Class<CatalogImage> getResourceClass() { return CatalogImage.class; } @Override public CatalogImageBulkRep queryBulkResourceReps(List<URI> ids) { Iterator<CatalogImage> _dbIterator = _dbClient.queryIterativeObjects(getResourceClass(), ids); return new CatalogImageBulkRep(BulkList.wrapping(_dbIterator, CatalogImageMapper.getInstance())); } @Override public CatalogImageBulkRep queryFilteredBulkResourceReps(List<URI> ids) { Iterator<CatalogImage> _dbIterator = _dbClient.queryIterativeObjects(getResourceClass(), ids); BulkList.ResourceFilter filter = new CatalogImageFilter(getUserFromContext(), _permissionsHelper); return new CatalogImageBulkRep(BulkList.wrapping(_dbIterator, CatalogImageMapper.getInstance(), filter)); } }