/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource;
import static com.emc.storageos.api.mapper.BlockMapper.map;
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.*;
import javax.ws.rs.core.MediaType;
import com.emc.storageos.model.BulkIdParam;
import com.emc.storageos.model.block.tier.AutoTierPolicyList;
import com.emc.storageos.model.block.tier.StorageTierList;
import com.emc.storageos.model.block.tier.AutoTieringPolicyRestRep;
import com.emc.storageos.model.block.tier.AutoTieringPolicyBulkRep;
import com.emc.storageos.model.ResourceTypeEnum;
import com.emc.storageos.api.mapper.BlockMapper;
import com.emc.storageos.api.mapper.functions.MapAutoTierPolicy;
import com.emc.storageos.api.service.impl.response.BulkList;
import com.emc.storageos.db.client.constraint.AlternateIdConstraint;
import com.emc.storageos.db.client.model.AutoTieringPolicy;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.StorageTier;
import com.emc.storageos.db.client.model.VirtualPool;
import com.emc.storageos.db.exceptions.DatabaseException;
import com.emc.storageos.security.authorization.CheckPermission;
import com.emc.storageos.security.authorization.DefaultPermissions;
import com.emc.storageos.security.authorization.Role;
@Path("/vdc/auto-tier-policies")
@DefaultPermissions(readRoles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR }, writeRoles = { Role.SYSTEM_ADMIN })
public class AutoTieringService extends TaggedResource {
/**
* Gets the AutoTier Policy with the passed id from the database.
*
* @param id the URN of a ViPR auto tier policy
*
* @return A reference to the registered Policy.
*/
@Override
protected DataObject queryResource(URI id) {
ArgValidator.checkUri(id);
AutoTieringPolicy autoTierPolicy = _dbClient.queryObject(AutoTieringPolicy.class, id);
ArgValidator.checkEntityNotNull(autoTierPolicy, id, isIdEmbeddedInURL(id));
return autoTierPolicy;
}
@Override
protected URI getTenantOwner(URI id) {
return null;
}
/**
* Show the specified auto tiering policy.
*
* @param id the URN of a ViPR auto tier policy
* @prereq none
* @brief Show the details of the specified auto tiering policy
* @return Policy Object
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR })
@Path("/{id}")
public AutoTieringPolicyRestRep getAutoTierPolicy(@PathParam("id") URI id) {
ArgValidator.checkFieldUriType(id, AutoTieringPolicy.class, "id");
AutoTieringPolicy policy = _dbClient.queryObject(AutoTieringPolicy.class, id);
ArgValidator.checkEntityNotNull(policy, id, isIdEmbeddedInURL(id));
return map(policy);
}
/**
*
* @param provisionType The provisioning type associated with this policy [Thin,Thick or All]
* @param uniquePolicyNames If unique_auto_tier_policy_names is set to true, then unique auto tier policy Names alone without any
* storage system details will be returned,
* even if the same policy exists in multiple arrays. If unique_auto_tier_policy_names is set to false, then duplicate policy
* names, with the storage system details, are returned
*
* @prereq none
* @brief List all auto tier policies
* @return AutoTierPolicyList
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR })
public AutoTierPolicyList getAutoTierPolicies(@QueryParam("provisioning_type") String provisionType,
@QueryParam("unique_auto_tier_policy_names") Boolean uniquePolicyNames) {
if (null == uniquePolicyNames) {
uniquePolicyNames = false;
}
AutoTierPolicyList policyList = new AutoTierPolicyList();
List<URI> policyUris = _dbClient.queryByType(AutoTieringPolicy.class, true);
List<AutoTieringPolicy> policies = _dbClient.queryObject(AutoTieringPolicy.class, policyUris);
for (AutoTieringPolicy policy : policies) {
if (!doesGivenProvisionTypeMatchAutoTierPolicy(provisionType, policy)) {
continue;
}
BlockMapper.addAutoTierPolicy(policy, policyList, uniquePolicyNames);
}
return policyList;
}
/**
* Show the storage tiers associated with a specific auto tiering policy
* Only auto tiering policies belonging to VMAX systems have direct association to tiers.
*
* @param id the URN of a ViPR auto tier policy
*
* @prereq none
* @brief List storage tiers for auto tiering policy
* @return Policy Object
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR })
@Path("/{id}/storage-tiers")
public StorageTierList getStorageTiersForGivenPolicy(@PathParam("id") URI id) {
ArgValidator.checkFieldUriType(id, AutoTieringPolicy.class, "id");
AutoTieringPolicy policy = _dbClient.queryObject(AutoTieringPolicy.class, id);
ArgValidator.checkEntityNotNull(policy, id, isIdEmbeddedInURL(id));
StorageTierList storageTierList = new StorageTierList();
List<URI> tierUris = _dbClient.queryByConstraint(AlternateIdConstraint.Factory
.getStorageTierFASTPolicyConstraint(policy.getId().toString()));
List<StorageTier> tiers = _dbClient.queryObject(StorageTier.class, tierUris);
for (StorageTier tier : tiers) {
storageTierList.getStorageTiers().add(toNamedRelatedResource(tier, tier.getNativeGuid()));
}
return storageTierList;
}
/**
* Retrieve data of auto tier policies based on input ids.
*
* @param param POST data containing the id list.
*
* @prereq none
* @brief List data of auto tier policies.
* @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 AutoTieringPolicyBulkRep getBulkResources(BulkIdParam param) {
return (AutoTieringPolicyBulkRep) super.getBulkResources(param);
}
@Override
public AutoTieringPolicyBulkRep queryBulkResourceReps(List<URI> ids) {
Iterator<AutoTieringPolicy> dbIterator = _dbClient.queryIterativeObjects(
AutoTieringPolicy.class, ids);
return new AutoTieringPolicyBulkRep(BulkList.wrapping(dbIterator, MapAutoTierPolicy.getInstance()));
}
@Override
public AutoTieringPolicyBulkRep queryFilteredBulkResourceReps(List<URI> ids) {
verifySystemAdmin();
return queryBulkResourceReps(ids);
}
@SuppressWarnings("unchecked")
@Override
public Class<AutoTieringPolicy> getResourceClass() {
return AutoTieringPolicy.class;
}
@Override
protected ResourceTypeEnum getResourceType() {
return ResourceTypeEnum.AUTO_TIERING_POLICY;
}
private boolean doesGivenProvisionTypeMatchAutoTierPolicy(
String provisioningType, AutoTieringPolicy policy) {
if (null == provisioningType || provisioningType.isEmpty()) {
return true;
}
// for vnx case, all Policies will be set to ALL
if (AutoTieringPolicy.ProvisioningType.All.toString().equalsIgnoreCase(
policy.getProvisioningType())) {
return true;
}
if (provisioningType.equalsIgnoreCase(VirtualPool.ProvisioningType.Thick.toString())
&& AutoTieringPolicy.ProvisioningType.ThicklyProvisioned.toString()
.equalsIgnoreCase(policy.getProvisioningType())) {
return true;
}
if (provisioningType.equalsIgnoreCase(VirtualPool.ProvisioningType.Thin.toString())
&& AutoTieringPolicy.ProvisioningType.ThinlyProvisioned.toString()
.equalsIgnoreCase(policy.getProvisioningType())) {
return true;
}
return false;
}
}