/* * Copyright (c) 2008-2011 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.cim.CIMInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.constraint.AlternateIdConstraint; import com.emc.storageos.db.client.model.StorageHADomain.HADomainType; import com.emc.storageos.db.client.model.StorageHADomain; 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.Processor; import com.emc.storageos.plugins.common.domainmodel.Operation; import com.emc.storageos.volumecontroller.impl.NativeGUIDGenerator; /** * Processor responsible for discovering Storage Adapters */ public class StorageAdapterProcessor extends Processor { private static final String NAME = "Name"; private static final String EMCNUMPORTS = "EMCNumPorts"; private static final String EMCPROTOCOL = "EMCProtocol"; private static final String EMCSERIALNUMBER = "EMCSerialNumber"; private static final String EMCSLOTNUMBER = "EMCSlotNumber"; private static final String EMCADAPTERNAME = "EMCAdapterName"; private Logger _logger = LoggerFactory.getLogger(StorageAdapterProcessor.class); private DbClient _dbClient; private AccessProfile profile = null; private List<StorageHADomain> _storageAdapterList = null; private static final String ROLES = "Roles"; /** * {@inheritDoc} */ @Override public void processResult( Operation operation, Object resultObj, Map<String, Object> keyMap) throws BaseCollectionException { try { @SuppressWarnings("unchecked") final Iterator<CIMInstance> it = (Iterator<CIMInstance>) resultObj; profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE); _dbClient = (DbClient) keyMap.get(Constants.dbClient); _storageAdapterList = new ArrayList<StorageHADomain>(); StorageSystem device = _dbClient.queryObject(StorageSystem.class, profile.getSystemId()); while (it.hasNext()) { CIMInstance adapterInstance = null; try { adapterInstance = it.next(); StorageHADomain adapter = checkStorageAdapterExistsInDB(adapterInstance, device); createStorageAdapter(adapter, adapterInstance, profile); addPath(keyMap, operation.getResult(), adapterInstance.getObjectPath()); } catch (Exception e) { _logger.warn("Adapter Discovery failed for {}-->{}", "", getMessage(e)); } } _dbClient.createObject(_storageAdapterList); } catch (Exception e) { _logger.error("Adapter Discovery failed -->{}", getMessage(e)); } finally { _storageAdapterList = null; } } /** * create StorageAdapter Record, if not present already, else update only the properties. * * @param adapter * @param adapterInstance * @throws URISyntaxException * @throws IOException */ private void createStorageAdapter( StorageHADomain adapter, CIMInstance adapterInstance, AccessProfile profile) throws URISyntaxException, IOException { if (null == adapter) { adapter = new StorageHADomain(); adapter.setId(URIUtil.createId(StorageHADomain.class)); adapter.setStorageDeviceURI(profile.getSystemId()); adapter.setName(getCIMPropertyValue(adapterInstance, NAME)); adapter.setAdapterName(getCIMPropertyValue(adapterInstance, EMCADAPTERNAME)); // Don't change the order of setting this nativeGuid as nativeGuid depends on adapter name. adapter.setNativeGuid(NativeGUIDGenerator.generateNativeGuid(_dbClient, adapter)); } adapter.setNumberofPorts(getCIMPropertyValue(adapterInstance, EMCNUMPORTS)); adapter.setProtocol(getCIMPropertyValue(adapterInstance, EMCPROTOCOL)); adapter.setSlotNumber(getCIMPropertyValue(adapterInstance, EMCSLOTNUMBER)); String[] roles = (String[]) adapterInstance.getPropertyValue(ROLES); adapter.setAdapterType(HADomainType.getHADomainTypeName(roles[0])); _storageAdapterList.add(adapter); } /** * Check if Adapter exists in DB. * * @param adapterInstance * @return * @throws IOException */ private StorageHADomain checkStorageAdapterExistsInDB(CIMInstance adapterInstance, StorageSystem device) throws IOException { StorageHADomain adapter = null; String adapterNativeGuid = NativeGUIDGenerator.generateNativeGuid( device, adapterInstance.getPropertyValue(EMCADAPTERNAME) .toString(), NativeGUIDGenerator.ADAPTER); @SuppressWarnings("deprecation") List<URI> adapterURIs = _dbClient .queryByConstraint(AlternateIdConstraint.Factory .getStorageHADomainByNativeGuidConstraint(adapterNativeGuid)); if (!adapterURIs.isEmpty()) { adapter = _dbClient.queryObject(StorageHADomain.class, adapterURIs.get(0)); } return adapter; } @Override protected void setPrerequisiteObjects(List<Object> arg0) throws BaseCollectionException { // TODO Auto-generated method stub } }