/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.SRDF;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.RemoteDirectorGroup;
import com.emc.storageos.db.client.model.StoragePort;
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;
import com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.StorageProcessor;
public class ProtocolEndPointToPortProcessor extends StorageProcessor {
private Logger _log = LoggerFactory.getLogger(ProtocolEndPointToPortProcessor.class);
private List<Object> args;
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;
CIMObjectPath protocolEndPointPath = getObjectPathfromCIMArgument(args);
AccessProfile profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE);
_dbClient = (DbClient) keyMap.get(Constants.dbClient);
StorageSystem device = _dbClient.queryObject(StorageSystem.class, profile.getSystemId());
String protocolEndPointId = protocolEndPointPath.getKey(Constants.NAME).getValue().toString();
_log.info("Protocol End Point ID :" + protocolEndPointId);
@SuppressWarnings("unchecked")
Map<String, URI> volumeToRAGroupMap = (Map<String, URI>) keyMap.get(Constants.RAGROUP);
URI remoteRAGroupUri = volumeToRAGroupMap.get(protocolEndPointId);
_log.info("Remote RA Group URI :" + remoteRAGroupUri);
String sourceSystemSerialId = keyMap.get(Constants._serialID).toString();
_log.info("Source Serial ID :" + sourceSystemSerialId);
RemoteDirectorGroup remoteGroup = _dbClient.queryObject(RemoteDirectorGroup.class, remoteRAGroupUri);
if (remoteGroup == null) {
_log.info("RA Group Not Found {}", remoteRAGroupUri);
}
while (it.hasNext()) {
CIMInstance portInstance = it.next();
StoragePort port = checkStoragePortExistsInDB(portInstance, device, _dbClient);
if (null == port) {
_log.info("RA Group Port Not Found {}", portInstance.getObjectPath());
continue;
}
if (portInstance.getObjectPath().toString().contains(sourceSystemSerialId)) {
remoteGroup.setSourcePort(port.getId());
_log.info("Source Port added :" + portInstance.getObjectPath());
} else {
remoteGroup.setRemotePort(port.getId());
_log.info("Remote Port added :" + portInstance.getObjectPath());
}
_dbClient.persistObject(remoteGroup);
}
} catch (Exception e) {
_log.error("Discovering Ports for RA Groups failed", e);
}
}
@Override
protected void setPrerequisiteObjects(List<Object> inputArgs)
throws BaseCollectionException {
args = inputArgs;
}
}