/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.SRDF;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.RemoteDirectorGroup;
import com.emc.storageos.db.client.model.RemoteDirectorGroup.SupportedCopyModes;
import com.emc.storageos.db.client.model.StringSet;
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.NativeGUIDGenerator;
import com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor.StorageProcessor;
import com.google.common.base.Joiner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMObjectPath;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ConnectivityCollectionRelationshipsProcessor extends StorageProcessor {
private Logger _log = LoggerFactory
.getLogger(ConnectivityCollectionRelationshipsProcessor.class);
private static final String PROTOCOL_END_POINT = "Symm_BackEndSCSIProtocolEndpoint";
private static final String VOLUME = "Symm_StorageVolume";
private List<Object> args;
@Override
public void processResult(Operation operation, Object resultObj,
Map<String, Object> keyMap) throws BaseCollectionException {
try {
@SuppressWarnings("unchecked")
final Iterator<CIMObjectPath> it = (Iterator<CIMObjectPath>) resultObj;
boolean volumeAdded = false;
DbClient dbClient = (DbClient) keyMap.get(Constants.dbClient);
CIMObjectPath raGroupPath = getObjectPathfromCIMArgument(args);
String ragGroupId = NativeGUIDGenerator
.generateRAGroupNativeGuid(raGroupPath);
_log.debug("RA Group Id : {}", ragGroupId);
RemoteDirectorGroup rg = getRAGroupUriFromDB(dbClient, ragGroupId);
if (null == rg) {
_log.info("RA Group Not found : {}", ragGroupId);
return;
}
URI raGroupUri = rg.getId();
@SuppressWarnings("unchecked")
Map<String, URI> rAGroupMap = (Map<String, URI>) keyMap
.get(Constants.RAGROUP);
Set<String> volumeNativeGuids = new StringSet();
while (it.hasNext()) {
CIMObjectPath connCollectionRelationPaths = it.next();
String cimClass = connCollectionRelationPaths.getObjectName();
if (PROTOCOL_END_POINT.equals(cimClass)) {
String endPointId = connCollectionRelationPaths
.getKey(Constants.NAME).getValue().toString();
_log.info("End Point Added {}", connCollectionRelationPaths);
addPath(keyMap, Constants.ENDPOINTS_RAGROUP,
connCollectionRelationPaths);
rAGroupMap.put(endPointId, raGroupUri);
} else if (VOLUME.equals(cimClass)) {
String volumeNativeGuid = getVolumeNativeGuid(connCollectionRelationPaths);
if (!volumeAdded
&& !rAGroupMap.containsKey(volumeNativeGuid)) {
volumeAdded = true;
_log.info("Volume Added {}",
connCollectionRelationPaths);
addPath(keyMap, Constants.VOLUME_RAGROUP,
connCollectionRelationPaths);
rAGroupMap.put(volumeNativeGuid, raGroupUri);
} else {
_log.info("Volume {} is part of multiple RA Groups",
volumeNativeGuid);
}
volumeNativeGuids.add(volumeNativeGuid);
}
}
RemoteDirectorGroup remoteGroup = dbClient.queryObject(
RemoteDirectorGroup.class, raGroupUri);
// if no volumes, then by default this group supports both sync and
// async
if (!volumeAdded) {
remoteGroup.setSupportedCopyMode(SupportedCopyModes.ALL
.toString());
}
if (null == remoteGroup.getVolumes()
|| remoteGroup.getVolumes().isEmpty()) {
remoteGroup.setVolumes(new StringSet(volumeNativeGuids));
} else {
_log.debug("Existing Volumes {}",
Joiner.on("\t").join(remoteGroup.getVolumes()));
_log.debug("New Volumes {}",
Joiner.on("\t").join(volumeNativeGuids));
remoteGroup.getVolumes().replace(volumeNativeGuids);
_log.debug("Updated Volumes {}",
Joiner.on("\t").join(remoteGroup.getVolumes()));
}
dbClient.persistObject(remoteGroup);
} catch (Exception e) {
_log.error("Exception occurred while processing remote connectivity information.", e);
}
}
@Override
protected void setPrerequisiteObjects(List<Object> inputArgs)
throws BaseCollectionException {
args = inputArgs;
}
}