/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DiscoveredDataObject.Type;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.StorageSystem.SupportedProvisioningTypes;
import com.emc.storageos.plugins.AccessProfile;
import com.emc.storageos.plugins.BaseCollectionException;
import com.emc.storageos.plugins.common.Constants;
import com.emc.storageos.plugins.common.Processor;
import com.emc.storageos.plugins.common.domainmodel.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMInstance;
import javax.cim.UnsignedInteger16;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class StorageConfigurationCapabilitiesProcessor extends Processor {
private static final String SUPPORTED_ELEMENT_TYPES = "SupportedStorageElementTypes";
private static final String EMC_UNRESTRICTED_THIN_STORAGE_VOLUME = "32777";
private static final String EMC_UNRESTRICTED_THICK_STORAGE_VOLUME = "32778";
private static final String THINLY_PROVISIONED_STORAGE_VOLUME = "5";
private Logger _logger = LoggerFactory
.getLogger(StorageConfigurationCapabilitiesProcessor.class);
private DbClient _dbClient;
private AccessProfile _profile = null;
@Override
public void processResult(
Operation operation, Object resultObj, Map<String, Object> keyMap)
throws BaseCollectionException {
@SuppressWarnings("unchecked")
final Iterator<CIMInstance> it = (Iterator<CIMInstance>) resultObj;
_profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE);
_dbClient = (DbClient) keyMap.get(Constants.dbClient);
try {
StorageSystem system = _dbClient.queryObject(StorageSystem.class,
_profile.getSystemId());
Boolean usingSMIS80 = (Boolean) keyMap.get(Constants.USING_SMIS80_DELIMITERS);
boolean isSMIS80 = (usingSMIS80 != null && usingSMIS80);
while (it.hasNext()) {
CIMInstance storageConfigurationInstance = it.next();
if (Type.vnxblock.toString().equalsIgnoreCase(system.getSystemType())) {
updateStorageSystemCapabilityOnVolumeForVNX(storageConfigurationInstance, system);
} else {
updateStorageSystemCapabilityOnVolume(storageConfigurationInstance, system);
}
system.setUsingSmis80(isSMIS80);
}
_dbClient.persistObject(system);
} catch (Exception e) {
_logger.error(
"Finding out Storage System Capability on Volume Creation failed :",
e);
}
}
/**
*
* @param storageConfigurationInstance
* @param system
* @throws Exception
*/
private void updateStorageSystemCapabilityOnVolume(
CIMInstance storageConfigurationInstance, StorageSystem system)
throws Exception {
UnsignedInteger16[] supportedElementTypeArr = (UnsignedInteger16[]) storageConfigurationInstance
.getPropertyValue(SUPPORTED_ELEMENT_TYPES);
String supportedElementTypes = Arrays.toString(supportedElementTypeArr);
_logger.debug("Capability : {}", supportedElementTypes);
// This logic looks very simple to me , compared to looping thro' unsignedint[] Array
if (supportedElementTypes.contains(EMC_UNRESTRICTED_THIN_STORAGE_VOLUME)
&& supportedElementTypes.contains(EMC_UNRESTRICTED_THICK_STORAGE_VOLUME)) {
system.setSupportedProvisioningType(SupportedProvisioningTypes.THIN_AND_THICK.toString());
} else if (supportedElementTypes.contains(EMC_UNRESTRICTED_THIN_STORAGE_VOLUME)) {
system.setSupportedProvisioningType(SupportedProvisioningTypes.THIN.toString());
} else if (supportedElementTypes.contains(EMC_UNRESTRICTED_THICK_STORAGE_VOLUME)) {
system.setSupportedProvisioningType(SupportedProvisioningTypes.THICK.toString());
} else if (system.checkIfVmax3() && supportedElementTypes.contains(THINLY_PROVISIONED_STORAGE_VOLUME)) {
system.setSupportedProvisioningType(SupportedProvisioningTypes.THIN.toString());
} else {
system.setSupportedProvisioningType(SupportedProvisioningTypes.NONE.toString());
}
}
/**
* Set supported provisioning type for storage system based on
* SupportedStorageElementTypes for VNX
*
* @param storageConfigurationInstance
* @param system
* @throws Exception
*/
private void updateStorageSystemCapabilityOnVolumeForVNX(
CIMInstance storageConfigurationInstance, StorageSystem system)
throws Exception {
UnsignedInteger16[] supportedElementTypeArr = (UnsignedInteger16[]) storageConfigurationInstance
.getPropertyValue(SUPPORTED_ELEMENT_TYPES);
String supportedElementTypes = Arrays.toString(supportedElementTypeArr);
_logger.debug("Capability : {}", supportedElementTypes);
if (supportedElementTypes.contains(THINLY_PROVISIONED_STORAGE_VOLUME)) {
system.setSupportedProvisioningType(SupportedProvisioningTypes.THIN_AND_THICK
.toString());
} else {
// Thick volume is supported by default on VNX
system.setSupportedProvisioningType(SupportedProvisioningTypes.THICK
.toString());
}
}
@Override
protected void setPrerequisiteObjects(List<Object> inputArgs)
throws BaseCollectionException {
// TODO Auto-generated method stub
}
}