/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.vnxunity;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.constraint.AlternateIdConstraint;
import com.emc.storageos.db.client.constraint.URIQueryResultList;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.HostInterface.Protocol;
import com.emc.storageos.vnxe.VNXeApiClient;
import com.emc.storageos.vnxe.VNXeException;
import com.emc.storageos.vnxe.models.HostLun;
import com.emc.storageos.vnxe.models.VNXeBase;
import com.emc.storageos.vnxe.models.VNXeHost;
import com.emc.storageos.vnxe.models.VNXeHostInitiator;
import com.emc.storageos.volumecontroller.impl.vnxe.VNXeExportOperations;
import com.google.common.base.Joiner;
public class VNXUnityExportOperations extends VNXeExportOperations {
private static final Logger log = LoggerFactory.getLogger(VNXUnityExportOperations.class);
@Override
protected VNXeApiClient getVnxeClient(StorageSystem storage) {
VNXeApiClient client = _clientFactory.getUnityClient(storage.getIpAddress(),
storage.getPortNumber(), storage.getUsername(),
storage.getPassword());
return client;
}
@Override
public Set<Integer> findHLUsForInitiators(StorageSystem storage, List<String> initiatorNames, boolean mustHaveAllPorts) {
Set<Integer> usedHLUs = new HashSet<Integer>();
try {
Set<String> vnxeHostIds = new HashSet<String>();
VNXeApiClient apiClient = getVnxeClient(storage);
for (String initiatorName : initiatorNames) {
initiatorName = Initiator.toPortNetworkId(initiatorName);
URIQueryResultList initiatorResult = new URIQueryResultList();
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getInitiatorPortInitiatorConstraint(initiatorName),
initiatorResult);
if (initiatorResult.iterator().hasNext()) {
Initiator initiator = _dbClient.queryObject(Initiator.class, initiatorResult.iterator().next());
String initiatorId = initiator.getInitiatorPort();
if (Protocol.FC.name().equals(initiator.getProtocol())) {
initiatorId = initiator.getInitiatorNode() + ":" + initiatorId;
}
// query VNX Unity initiator
VNXeHostInitiator vnxeInitiator = apiClient.getInitiatorByWWN(initiatorId);
if (vnxeInitiator != null) {
VNXeBase parentHost = vnxeInitiator.getParentHost();
if (parentHost != null) {
vnxeHostIds.add(parentHost.getId());
}
}
}
}
if (vnxeHostIds.isEmpty()) {
log.info("No Host found on array for initiators {}", Joiner.on(',').join(initiatorNames));
} else {
log.info("Found matching hosts {} on array", vnxeHostIds);
for (String vnxeHostId : vnxeHostIds) {
// Get vnxeHost from vnxeHostId
VNXeHost vnxeHost = apiClient.getHostById(vnxeHostId);
List<VNXeBase> hostLunIds = vnxeHost.getHostLUNs();
if (hostLunIds != null && !hostLunIds.isEmpty()) {
for (VNXeBase hostLunId : hostLunIds) {
HostLun hostLun = apiClient.getHostLun(hostLunId.getId());
log.info("Looking at Host Lun {}; Lun: {}, HLU: {}", hostLunId.getId(), hostLun.getLun(), hostLun.getHlu());
usedHLUs.add(hostLun.getHlu());
}
}
}
}
log.info(String.format("HLUs found for Initiators { %s }: %s",
Joiner.on(',').join(initiatorNames), usedHLUs));
} catch (Exception e) {
String errMsg = "Encountered an error when attempting to query used HLUs for initiators: " + e.getMessage();
log.error(errMsg, e);
throw VNXeException.exceptions.hluRetrievalFailed(errMsg, e);
}
return usedHLUs;
}
}