/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package util;
import static com.emc.vipr.client.core.util.ResourceUtils.createNamedRef;
import static com.emc.vipr.client.core.util.ResourceUtils.findRef;
import static com.emc.vipr.client.core.util.ResourceUtils.id;
import static com.emc.vipr.client.core.util.ResourceUtils.stringId;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import static util.BourneUtil.getViprClient;
import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.collections.CollectionUtils;
import models.ConnectivityTypes;
import play.cache.Cache;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.RelatedResourceRep;
import com.emc.storageos.model.auth.ACLAssignmentChanges;
import com.emc.storageos.model.auth.ACLEntry;
import com.emc.storageos.model.compute.ComputeSystemRestRep;
import com.emc.storageos.model.varray.VirtualArrayConnectivityRestRep;
import com.emc.storageos.model.varray.VirtualArrayCreateParam;
import com.emc.storageos.model.varray.VirtualArrayResourceRestRep;
import com.emc.storageos.model.varray.VirtualArrayRestRep;
import com.emc.storageos.model.varray.VirtualArrayUpdateParam;
import com.emc.storageos.model.vpool.VirtualPoolAvailableAttributesResourceRep;
import com.emc.vipr.client.core.util.CachedResources;
import com.emc.vipr.client.exceptions.ViPRHttpException;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import controllers.security.Security;
public class VirtualArrayUtils {
public static final String ATTRIBUTE_EXPIRATION = "2min";
public static final String ATTRIBUTE_RAID_LEVELS = "raid_levels";
public static final String ATTRIBUTE_DRIVE_TYPES = "drive_type";
public static final String ATTRIBUTE_SYSTEM_TYPES = "system_type";
public static final String ATTRIBUTE_PROTOCOLS = "protocols";
public static final String[] ATTRIBUTES = { ATTRIBUTE_RAID_LEVELS, ATTRIBUTE_DRIVE_TYPES, ATTRIBUTE_SYSTEM_TYPES,
ATTRIBUTE_PROTOCOLS };
public static boolean canUpdateACLs() {
return Security.hasAnyRole(Security.SECURITY_ADMIN, Security.SYSTEM_ADMIN, Security.RESTRICTED_SYSTEM_ADMIN);
}
public static CachedResources<VirtualArrayRestRep> createCache() {
return new CachedResources<VirtualArrayRestRep>(getViprClient().varrays());
}
public static VirtualArrayRestRep getVirtualArray(String id) {
return getVirtualArray(uri(id));
}
public static VirtualArrayRestRep getVirtualArray(URI id) {
try {
return getViprClient().varrays().get(id);
} catch (ViPRHttpException e) {
if (e.getHttpCode() == 404) {
return null;
}
throw e;
}
}
public static NamedRelatedResourceRep getVirtualArrayRef(RelatedResourceRep ref) {
return getVirtualArrayRef(id(ref));
}
public static NamedRelatedResourceRep getVirtualArrayRef(URI id) {
if (Security.hasAnyRole(Security.SYSTEM_ADMIN, Security.SYSTEM_MONITOR)) {
return createNamedRef(getViprClient().varrays().get(id));
}
else {
return findRef(getViprClient().varrays().list(), id);
}
}
public static List<VirtualArrayRestRep> getVirtualArrays() {
return getViprClient().varrays().getAll();
}
public static List<VirtualArrayRestRep> getVirtualArrays(Collection<URI> ids) {
return getViprClient().varrays().getByIds(ids);
}
/**
* Determines if the resource is assigned to the given virtual array.
*
* @param resource
* the resource.
* @param virtualArrayId
* the virtual array ID.
* @return true if the resource is assigned to the virtual array.
*/
public static boolean isAssigned(VirtualArrayResourceRestRep resource, String virtualArrayId) {
return (resource.getAssignedVirtualArrays() != null)
&& resource.getAssignedVirtualArrays().contains(virtualArrayId);
}
public static List<VirtualArrayConnectivityRestRep> getConnectivity(String id) {
return getViprClient().varrays().getConnectivity(uri(id));
}
public static List<VirtualArrayConnectivityRestRep> getConnectivity(VirtualArrayRestRep virtualArray) {
return getViprClient().varrays().getConnectivity(id(virtualArray));
}
public static Map<String, Set<NamedRelatedResourceRep>> getConnectivityMap(String id) {
Map<String, Set<NamedRelatedResourceRep>> connectivityMap = Maps.newTreeMap();
for (VirtualArrayConnectivityRestRep connectivity : getConnectivity(id)) {
for (String type : connectivity.getConnectionType()) {
Set<NamedRelatedResourceRep> virtualArrays = connectivityMap.get(type);
if (virtualArrays == null) {
virtualArrays = Sets.newTreeSet(new NamedRelatedResourceComparator());
connectivityMap.put(type, virtualArrays);
}
virtualArrays.add(connectivity.getVirtualArray());
}
}
return connectivityMap;
}
public static VirtualArrayRestRep create(String name, boolean autoSanZoning) {
VirtualArrayCreateParam virtualArray = new VirtualArrayCreateParam();
virtualArray.setLabel(name);
virtualArray.getBlockSettings().setAutoSanZoning(autoSanZoning);
return getViprClient().varrays().create(virtualArray);
}
public static VirtualArrayRestRep update(String id, String name, boolean autoSanZoning) {
VirtualArrayUpdateParam virtualArray = new VirtualArrayUpdateParam();
virtualArray.setLabel(name);
virtualArray.getBlockSettings().setAutoSanZoning(autoSanZoning);
return getViprClient().varrays().update(uri(id), virtualArray);
}
public static void deactivate(URI id) {
getViprClient().varrays().deactivate(id);
}
@SuppressWarnings("unchecked")
public static List<VirtualPoolAvailableAttributesResourceRep> getAvailableAttributes(URI id) {
String cacheKey = String.format("varray.%s.attributes", id);
List<VirtualPoolAvailableAttributesResourceRep> attributes = (List<VirtualPoolAvailableAttributesResourceRep>) Cache.get(cacheKey);
if (attributes == null) {
attributes = getViprClient().varrays().getAvailableAttributes(id);
Cache.set(cacheKey, attributes, ATTRIBUTE_EXPIRATION);
}
return attributes;
}
public static Map<String, Set<String>> getAvailableAttributes(List<URI> varrayIds) {
// get the available attributes for the given virtual arrays
Map<URI, List<VirtualPoolAvailableAttributesResourceRep>> availableAttributes = getViprClient().varrays().getAvailableAttributes(
varrayIds);
// cycle through the available attributes, adding them to the allAttributes list
Map<String, Set<String>> allAttributes = Maps.newTreeMap();
for (Entry<URI, List<VirtualPoolAvailableAttributesResourceRep>> varrayId : availableAttributes.entrySet()) {
List<VirtualPoolAvailableAttributesResourceRep> attributes = varrayId.getValue();
for (VirtualPoolAvailableAttributesResourceRep attribute : attributes) {
String attributesName = attribute.getName();
Set<String> values = allAttributes.get(attributesName);
// ensure the map has a valid set for this attribute entry
if (values == null) {
values = Sets.newTreeSet();
allAttributes.put(attributesName, values);
}
// if we have some values for this attribute type, add them to the values list
if (CollectionUtils.size(attribute.getAttributeValues()) > 0) {
values.addAll(attribute.getAttributeValues());
}
}
}
// ensure all attributes have a valid set in the map
for (String name : ATTRIBUTES) {
if (!allAttributes.containsKey(name)) {
allAttributes.put(name, new TreeSet<String>());
}
}
return allAttributes;
}
public static List<ACLEntry> getACLs(String id) {
return getViprClient().varrays().getACLs(uri(id));
}
public static List<ACLEntry> updateACLs(String id, ACLAssignmentChanges changes) {
return getViprClient().varrays().updateACLs(uri(id), changes);
}
/**
* Checks whether a virtual array supports high availability.
*
* @param varray
* the virtual array.
* @return true if the virtual array supports high availability.
*/
public static boolean isHighAvailability(VirtualArrayRestRep varray) {
return isHighAvailability(stringId(varray));
}
/**
* Checks whether a virtual array supports high availability.
*
* @param id
* the virtual array ID.
* @return true if the virtual array supports high availability.
*/
public static boolean isHighAvailability(String id) {
for (VirtualArrayConnectivityRestRep connectivity : getConnectivity(id)) {
if (connectivity.getConnectionType().contains(ConnectivityTypes.VPLEX)) {
return true;
}
}
return false;
}
public static List<ComputeSystemRestRep> getComputeSystems(URI id) {
return getViprClient().varrays().getComputeSystems(id);
}
}