/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.api.service.impl.resource.utils.CapacityUtils;
import com.emc.storageos.db.client.constraint.ContainmentConstraint;
import com.emc.storageos.db.client.constraint.URIQueryResultList;
import com.emc.storageos.db.client.model.VirtualArray;
import com.emc.storageos.db.client.model.VirtualPool;
import com.emc.storageos.model.vpool.VDCCapacities;
import com.emc.storageos.model.vpool.VirtualArrayVirtualPoolCapacity;
import com.emc.storageos.model.vpool.VirtualPoolCapacity;
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.volumecontroller.impl.utils.AttributeMatcherFramework;
@Path("/vdc/capacities")
@DefaultPermissions(readRoles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR },
writeRoles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN })
public class VirtualDataCenterCapacityService extends ResourceService {
private final Logger logger = LoggerFactory.getLogger(VirtualDataCenterCapacityService.class);
protected AttributeMatcherFramework _matcherFramework;
public void setMatcherFramework(AttributeMatcherFramework matcherFramework) {
_matcherFramework = matcherFramework;
}
/**
* List all VirtualPool capacities under the zone grouped by varray
*
* @brief List VirtualPool capacities in the zone
* @return List of VirtualPool capacities
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.SYSTEM_MONITOR })
public VDCCapacities getZoneCapacities() {
VDCCapacities zoneCap = new VDCCapacities();
zoneCap.setArrayCapacities(new ArrayList<VirtualArrayVirtualPoolCapacity>());
// get all varray ids
final List<URI> ids = _dbClient.queryByType(VirtualArray.class, true);
for (URI id : ids) {
zoneCap.getArrayCapacities().add(getVirtualArrayVirtualPoolCapacities(id));
}
return zoneCap;
}
private VirtualArrayVirtualPoolCapacity getVirtualArrayVirtualPoolCapacities(URI vArrayId) {
VirtualArrayVirtualPoolCapacity vArrayCap = new VirtualArrayVirtualPoolCapacity();
vArrayCap.setId(vArrayId);
vArrayCap.setVpoolCapacities(new ArrayList<VirtualPoolCapacity>());
URIQueryResultList resultList = new URIQueryResultList();
_dbClient.queryByConstraint(
ContainmentConstraint.Factory.getVirtualArrayVirtualPoolConstraint(vArrayId),
resultList);
Iterator<URI> vPoolIterator = resultList.iterator();
int c = 0;
while (vPoolIterator.hasNext()) {
URI vPoolId = vPoolIterator.next();
VirtualPool vPool = _permissionsHelper.getObjectById(vPoolId, VirtualPool.class);
vArrayCap.getVpoolCapacities().add(getVirtualPoolCapacities(vArrayId, vPool));
c++;
}
logger.info("{} vpool in varray {}", c, vArrayId);
return vArrayCap;
}
private VirtualPoolCapacity getVirtualPoolCapacities(URI vArrayId, VirtualPool vPool) {
VirtualPoolCapacity vPoolCap = new VirtualPoolCapacity();
vPoolCap.setId(vPool.getId());
vPoolCap.setCapacity(CapacityUtils.getCapacityForVirtualPoolAndVirtualArray(vPool, vArrayId, _dbClient, _coordinator));
return vPoolCap;
}
}