/*
* Copyright (c) 2014-2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.detailedDiscovery;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.cim.CIMInstance;
import javax.cim.CIMObjectPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.AutoTieringPolicy;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedVolume;
import com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedVolume.SupportedVolumeCharacterstics;
import com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedVolume.SupportedVolumeInformation;
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.domainmodel.Operation;
import com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.StorageProcessor;
import com.emc.storageos.volumecontroller.impl.utils.DiscoveryUtils;
/**
* This processor gets invoked only for VNX unManaged volume discoveries.
* Settings returned will always and only be Volumes with Auto_Tier configured.
* The reason being, both Auto_tier and Start_High_then_Auto are represented as Auto_Tier in Provider.
* Hence, it stores the objectPaths of Auto_tier alone. These object paths will be used to get
* VolumeSettings (next SMI-S operation), from which the exact policy is being found.
*/
public class VolumeSettingProcessor extends StorageProcessor {
private Logger _logger = LoggerFactory.getLogger(VolumeSettingProcessor.class);
private List<Object> _args;
private DbClient _dbClient;
@Override
public void processResult(Operation operation, Object resultObj, Map<String, Object> keyMap)
throws BaseCollectionException {
try {
_dbClient = (DbClient) keyMap.get(Constants.dbClient);
AccessProfile profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE);
StorageSystem system = _dbClient.queryObject(StorageSystem.class, profile.getSystemId());
final Iterator<CIMInstance> it = (Iterator<CIMInstance>) resultObj;
CIMObjectPath volumePath = getObjectPathfromCIMArgument(_args);
String nativeGuid = getUnManagedVolumeNativeGuidFromVolumePath(volumePath);
UnManagedVolume unManagedVolume = checkUnManagedVolumeExistsInDB(
nativeGuid, _dbClient);
if (null == unManagedVolume) {
return;
}
while (it.hasNext()) {
CIMInstance settingInstance = it.next();
String initialTierSetting = settingInstance.getPropertyValue(Constants.INITIAL_STORAGE_TIER_METHODOLOGY).toString();
String policyName = null;
if ("4".equalsIgnoreCase(initialTierSetting)) {
policyName = AutoTieringPolicy.VnxFastPolicy.DEFAULT_START_HIGH_THEN_AUTOTIER.name();
} else {
policyName = AutoTieringPolicy.VnxFastPolicy.DEFAULT_AUTOTIER.name();
}
_logger.info("Adding {} Policy Rule to UnManaged Volume {}", policyName, nativeGuid);
unManagedVolume.getVolumeInformation().put(SupportedVolumeInformation.AUTO_TIERING_POLICIES.toString(), policyName);
unManagedVolume.putVolumeCharacterstics(
SupportedVolumeCharacterstics.IS_AUTO_TIERING_ENABLED.toString(),
"true");
// StorageVolumeInfoProcessor updated supported_vpool_list based on its pool's presence in vPool
// Now, filter those vPools based on policy associated
DiscoveryUtils.filterSupportedVpoolsBasedOnTieringPolicy(unManagedVolume, policyName, system, _dbClient);
_dbClient.updateAndReindexObject(unManagedVolume);
}
} catch (Exception e) {
_logger.error("Updating Auto Tier Policies failed on unmanaged volumes", e);
}
}
@Override
protected void setPrerequisiteObjects(List<Object> inputArgs) throws BaseCollectionException {
_args = inputArgs;
}
}