/* * Copyright (c) 2012-2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource; 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.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.springframework.beans.factory.annotation.Autowired; import com.emc.storageos.api.mapper.functions.MapVirtualNas; import com.emc.storageos.api.service.impl.response.BulkList; import com.emc.storageos.db.client.model.DiscoveredDataObject.RegistrationStatus; import com.emc.storageos.db.client.model.VirtualNAS; import com.emc.storageos.model.BulkIdParam; import com.emc.storageos.model.ResourceTypeEnum; import com.emc.storageos.model.vnas.VirtualNASBulkRep; import com.emc.storageos.model.vnas.VirtualNASList; import com.emc.storageos.model.vnas.VirtualNASRestRep; 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.svcs.errorhandling.resources.APIException; import com.emc.storageos.volumecontroller.impl.monitoring.RecordableEventManager; /** * VirtualNasService resource implementation */ @Path("/vdc/vnas-servers") @DefaultPermissions(readRoles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR }, writeRoles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN }) public class VirtualNasService extends TaggedResource { protected static final String EVENT_SERVICE_SOURCE = "VirtualNasService"; @Autowired private RecordableEventManager _evtMgr; @Autowired private NetworkService networkSvc; private static final String EVENT_SERVICE_TYPE = "virtualNAS"; @Override public String getServiceType() { return EVENT_SERVICE_TYPE; } // how many times to retry a procedure before returning failure to the user. // Is used with "system delete" operation. private int _retry_attempts; public void setRetryAttempts(int retries) { _retry_attempts = retries; } @Override protected URI getTenantOwner(URI id) { return null; } /** * Gets the virtual NAS with the passed id from the database. * * @param id the URN of a ViPR virtual NAS. * @return A reference to the registered VirtualNAS. * @throws BadRequestException When the vNAS is not registered. */ protected VirtualNAS queryRegisteredResource(URI id) { ArgValidator.checkUri(id); VirtualNAS vNas = _dbClient.queryObject(VirtualNAS.class, id); ArgValidator.checkEntity(vNas, id, isIdEmbeddedInURL(id)); if (!RegistrationStatus.REGISTERED.toString().equalsIgnoreCase( vNas.getRegistrationStatus())) { throw APIException.badRequests.resourceNotRegistered( VirtualNAS.class.getSimpleName(), id); } return vNas; } @Override protected VirtualNAS queryResource(URI id) { ArgValidator.checkUri(id); VirtualNAS vNas = _dbClient.queryObject(VirtualNAS.class, id); ArgValidator.checkEntity(vNas, id, isIdEmbeddedInURL(id)); return vNas; } /** * Gets the ids and self links for all virtual NAS. * * @brief List virtual NAS servers * @return A VirtualNASList reference specifying the ids and self links for * the virtual NAS servers. */ @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR }) public VirtualNASList getVirtualNasServers() { VirtualNASList vNasList = new VirtualNASList(); List<URI> ids = _dbClient.queryByType(VirtualNAS.class, true); for (URI id : ids) { VirtualNAS vNas = _dbClient.queryObject(VirtualNAS.class, id); if ((vNas != null)) { vNasList.getVNASServers().add( toNamedRelatedResource(vNas, vNas.getNasName())); } } return vNasList; } /** * Gets the details of virtual NAS. * * @param id the URN of a ViPR virtual NAS. * * @brief Show virtual NAS * @return A VirtualNASRestRep reference specifying the data for the * virtual NAS with the passed id. */ @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Path("/{id}") @CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR }) public VirtualNASRestRep getVirtualNasServer(@PathParam("id") URI id) { ArgValidator.checkFieldUriType(id, VirtualNAS.class, "id"); VirtualNAS vNas = queryResource(id); return MapVirtualNas.getInstance(_dbClient).toVirtualNasRestRep(vNas); } @Override protected ResourceTypeEnum getResourceType() { return ResourceTypeEnum.VIRTUAL_NAS; } /** * Retrieve resource representations based on input ids. * * @param param POST data containing the id list. * @brief List data of virtual NAS resources * @return list of representations. */ @POST @Path("/bulk") @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Override public VirtualNASBulkRep getBulkResources(BulkIdParam param) { return (VirtualNASBulkRep) super.getBulkResources(param); } @SuppressWarnings("unchecked") @Override public Class<VirtualNAS> getResourceClass() { return VirtualNAS.class; } @Override public VirtualNASBulkRep queryBulkResourceReps(List<URI> ids) { Iterator<VirtualNAS> _dbIterator = _dbClient.queryIterativeObjects( getResourceClass(), ids); return new VirtualNASBulkRep(BulkList.wrapping(_dbIterator, MapVirtualNas.getInstance(_dbClient))); } @Override public VirtualNASBulkRep queryFilteredBulkResourceReps(List<URI> ids) { verifySystemAdmin(); return queryBulkResourceReps(ids); } }