/* * Copyright (c) 2008-2011 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor; 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.DiscoveredDataObject; import com.emc.storageos.db.client.model.StorageSystem; 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; /** * Refer StoragePool processor before looking into below * For each VNX Pool Capability, generate default expected Pool Setting keys * Each VNX Storage Pool, we need 4 default pool Setting Objects. * * Each pool Setting is associated with InitialStorageTierMethodology * Setting with InitailStorageTierMethodology to 0, means NO_DATA_MOVEMENT * Setting would be set to 2 , means this setting would be used to create Volumes * configured to be put under Auto_Tier. * Setting with InitailStorageTierMethodology to 6, refers this setting would be used to * create Volumes configured to be put under High_Available_tier. * Setting with InitailStorageTierMethodology to 7, refers this setting would be used to * create Volumes configured to be put under Low_Available_tier. * * This generated Setting Names plays the key role of this design, would be used later. * */ public class PoolCapabilitiesProcessor extends PoolProcessor { private Logger _logger = LoggerFactory.getLogger(PoolCapabilitiesProcessor.class); private DbClient _dbClient; @Override public void processResult( Operation operation, Object resultObj, Map<String, Object> keyMap) throws BaseCollectionException { try { @SuppressWarnings("unchecked") final Iterator<CIMInstance> it = (Iterator<CIMInstance>) resultObj; _dbClient = (DbClient) keyMap.get(Constants.dbClient); AccessProfile profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE); StorageSystem device = getStorageSystem(_dbClient, profile.getSystemId()); while (it.hasNext()) { CIMInstance capabilitiesInstance = null; try { capabilitiesInstance = it.next(); String instanceID = capabilitiesInstance.getPropertyValue( Constants.INSTANCEID).toString(); if (DiscoveredDataObject.Type.vnxblock.toString().equalsIgnoreCase( device.getSystemType())) { insertExpectedPoolSettingsPerTier( capabilitiesInstance.getObjectPath(), keyMap); addPath(keyMap, Constants.VNXPOOLCAPABILITIES, capabilitiesInstance.getObjectPath()); } addPath(keyMap, operation.getResult(), capabilitiesInstance.getObjectPath()); } catch (Exception e) { _logger.warn("Pool Capabilities Discovery failed for {}-->{}", capabilitiesInstance.getObjectPath(), getMessage(e)); } } } catch (Exception e) { _logger.error("Pool Capabilities Discovery failed -->{}", getMessage(e)); } } /** * In VNX, 4 default policies are present, and this method creates expected Settings per PoolCapability. * * @param capabilitiesPath * @param keyMap */ private void insertExpectedPoolSettingsPerTier( CIMObjectPath capabilitiesPath, Map<String, Object> keyMap) { List<String> expectedPoolSettingsTier = (List<String>) keyMap .get(Constants.VNXPOOLCAPABILITIES_TIER); expectedPoolSettingsTier.add(capabilitiesPath.toString() + Constants.HYPHEN + Constants.NO_DATA_MOVEMENT); expectedPoolSettingsTier.add(capabilitiesPath.toString() + Constants.HYPHEN + Constants.AUTO_TIER); expectedPoolSettingsTier.add(capabilitiesPath.toString() + Constants.HYPHEN + Constants.HIGH_AVAILABLE_TIER); expectedPoolSettingsTier.add(capabilitiesPath.toString() + Constants.HYPHEN + Constants.LOW_AVAILABLE_TIER); expectedPoolSettingsTier.add(capabilitiesPath.toString() + Constants.HYPHEN + Constants.START_HIGH_THEN_AUTO_TIER); } /** * Commenting this out, as we don't have Pool Capabilities Model in place * once we have that, will enable this. */ /* * private void addStoragePoolCapabilities( * StoragePool pool, CIMInstance capabilitiesInstance) throws IOException { * StringMap capabilities; * if ( null == pool.getPoolCapabilities()) { * capabilities = new StringMap(); * } else { * capabilities = pool.getPoolCapabilities(); * capabilities.clear(); * } * capabilities.put(DATAREDUNDANCYGOAL, getCIMPropertyValue(capabilitiesInstance, DATAREDUNDANCYGOAL)); * capabilities.put(DATAREDUNDANCYMAX, getCIMPropertyValue(capabilitiesInstance, DATAREDUNDANCYMAX)); * capabilities.put(DATAREDUNDANCYMIN, getCIMPropertyValue(capabilitiesInstance, DATAREDUNDANCYMIN)); * capabilities.put(PACKAGEREDUNDANCYGOAL, getCIMPropertyValue(capabilitiesInstance, * PACKAGEREDUNDANCYGOAL)); * capabilities.put(PACKAGEREDUNDANCYMAX, getCIMPropertyValue(capabilitiesInstance, * PACKAGEREDUNDANCYMAX)); * capabilities.put(PACKAGEREDUNDANCYMIN, getCIMPropertyValue(capabilitiesInstance, * PACKAGEREDUNDANCYMIN)); * * _dbClient.persistObject(pool); * } */ @Override protected void setPrerequisiteObjects(List<Object> inputArgs) throws BaseCollectionException { // TODO Auto-generated method stub } }