/* * Copyright (c) 2008-2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.ibm.xiv; import java.net.URI; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.cim.CIMInstance; import javax.cim.CIMObjectPath; import javax.cim.UnsignedInteger16; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.StoragePool; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.db.client.model.StringSet; 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.PoolProcessor; import com.emc.storageos.volumecontroller.impl.utils.ImplicitPoolMatcher; public class XIVSupportedCopyTypesProcessor extends PoolProcessor { private static final Logger _log = LoggerFactory .getLogger(XIVSupportedCopyTypesProcessor.class); private DbClient _dbClient; private List<Object> _args; @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); Map<URI, StoragePool> poolsToMatchWithVpool = (Map<URI, StoragePool>) keyMap .get(Constants.MODIFIED_STORAGEPOOLS); StorageSystem device = getStorageSystem(_dbClient, profile.getSystemId()); Iterator<CIMInstance> iterator = (Iterator<CIMInstance>) resultObj; while (iterator.hasNext()) { CIMInstance instance = iterator.next(); CIMObjectPath poolPath = getObjectPathfromCIMArgument(); String instanceId = poolPath.getKeyValue(Constants.INSTANCEID) .toString(); // instanceId is the pool's nativeId StoragePool storagePool = checkStoragePoolExistsInDB( instanceId, _dbClient, device); if (storagePool == null) { _log.warn("No storage pool"); continue; } String thinProvisionedPreAllocateSupported = instance .getPropertyValue( Constants.THIN_PROVISIONED_CLIENT_SETTABLE_RESERVE) .toString(); UnsignedInteger16[] copyTypes = (UnsignedInteger16[]) instance .getPropertyValue(Constants.SUPPORTED_COPY_TYPES); addCopyTypesToStoragePool(copyTypes, storagePool, thinProvisionedPreAllocateSupported, poolsToMatchWithVpool); } } catch (Exception e) { _log.error("Supported copy types processing failed: ", e); } } private void addCopyTypesToStoragePool(UnsignedInteger16[] copyTypes, StoragePool storagePool, String thinProvisionedPreAllocateSupported, Map<URI, StoragePool> poolsToMatchWithVpool) { StringSet set = new StringSet(); for (UnsignedInteger16 n : copyTypes) { switch (n.intValue()) { case Constants.ASYNC_COPY_TYPE: set.add(StoragePool.CopyTypes.ASYNC.name()); break; case Constants.SYNC_COPY_TYPE: set.add(StoragePool.CopyTypes.SYNC.name()); break; case Constants.UNSYNC_ASSOC_COPY_TYPE: set.add(StoragePool.CopyTypes.UNSYNC_ASSOC.name()); break; case Constants.UNSYNC_UNASSOC_COPY_TYPE: set.add(StoragePool.CopyTypes.UNSYNC_UNASSOC.name()); break; default: _log.warn("Encountered unknown copy type {} for pool {}", n.intValue(), storagePool.getId()); } } storagePool.setThinVolumePreAllocationSupported(Boolean .valueOf(thinProvisionedPreAllocateSupported)); // add to modified pools list if pool's property which is required for // vPool matcher, has changed. // If the modified list already has this pool, skip the check. if (!poolsToMatchWithVpool.containsKey(storagePool.getId()) && ImplicitPoolMatcher.checkPoolPropertiesChanged( storagePool.getSupportedCopyTypes(), set)) { poolsToMatchWithVpool.put(storagePool.getId(), storagePool); } storagePool.setSupportedCopyTypes(set); _dbClient.persistObject(storagePool); } /** * return 1st Argument in inputArguments used to call this SMI-S call. */ private CIMObjectPath getObjectPathfromCIMArgument() { Object[] arguments = (Object[]) _args.get(0); return (CIMObjectPath) arguments[0]; } @Override protected void setPrerequisiteObjects(List<Object> args) throws BaseCollectionException { _args = args; } }