/*
* Copyright 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.hp3par.utils;
import java.net.URI;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.hp3par.command.PortCommandResult;
import com.emc.storageos.hp3par.command.PortMembers;
import com.emc.storageos.hp3par.command.PortStatMembers;
import com.emc.storageos.hp3par.command.PortStatisticsCommandResult;
import com.emc.storageos.hp3par.connection.HP3PARApiFactory;
import com.emc.storageos.hp3par.impl.HP3PARApi;
import com.emc.storageos.hp3par.impl.HP3PARException;
import com.emc.storageos.hp3par.impl.HP3PARIngestHelper;
import com.emc.storageos.storagedriver.Registry;
import com.emc.storageos.storagedriver.model.StoragePort;
import com.emc.storageos.storagedriver.model.StorageSystem;
import com.emc.storageos.storagedriver.model.StoragePort.TransportType;
public class HP3PARUtil {
private static final Logger _log = LoggerFactory.getLogger(HP3PARUtil.class);
private HP3PARApiFactory hp3parApiFactory;
public HP3PARApi getHP3PARDevice(StorageSystem hp3parSystem) throws HP3PARException {
URI deviceURI;
_log.info("3PARDriver:getHP3PARDevice input storage system");
try {
deviceURI = new URI("https", null, hp3parSystem.getIpAddress(), hp3parSystem.getPortNumber(), "/", null,
null);
return hp3parApiFactory.getRESTClient(deviceURI, hp3parSystem.getUsername(), hp3parSystem.getPassword());
} catch (Exception e) {
e.printStackTrace();
_log.error("3PARDriver:Error in getting 3PAR device, with StorageSystem");
throw new HP3PARException("Error in getting 3PAR device");
}
}
public HP3PARApi getHP3PARDevice(String ip, String port, String user, String pass) throws HP3PARException {
URI deviceURI;
_log.info("3PARDriver:getHP3PARDevice input full details");
try {
deviceURI = new URI("https", null, ip, Integer.parseInt(port), "/", null, null);
return hp3parApiFactory.getRESTClient(deviceURI, user, pass);
} catch (Exception e) {
e.printStackTrace();
_log.error("3PARDriver:Error in getting 3PAR device with details");
throw new HP3PARException("Error in getting 3PAR device");
}
}
public HP3PARApi getHP3PARDeviceFromNativeId(String nativeId, Registry driverRegistry) throws HP3PARException {
try {
Map<String, List<String>> connectionInfo = driverRegistry
.getDriverAttributesForKey(HP3PARConstants.DRIVER_NAME, nativeId);
List<String> ipAddress = connectionInfo.get(HP3PARConstants.IP_ADDRESS);
List<String> portNumber = connectionInfo.get(HP3PARConstants.PORT_NUMBER);
List<String> userName = connectionInfo.get(HP3PARConstants.USER_NAME);
List<String> password = connectionInfo.get(HP3PARConstants.PASSWORD);
HP3PARApi hp3parApi = getHP3PARDevice(ipAddress.get(0), portNumber.get(0), userName.get(0),
password.get(0));
return hp3parApi;
} catch (Exception e) {
e.printStackTrace();
_log.error("3PARDriver:Error in getting 3PAR device with nativeId");
throw new HP3PARException("Error in getting 3PAR device");
}
}
/**
* Get storage port information
* @throws Exception
*/
public void discoverStoragePortsById(String storageSystemId, List<StoragePort> storagePorts, Registry driverRegistery) throws Exception {
//For this 3PAR system
try {
// get Api client
HP3PARApi hp3parApi = getHP3PARDeviceFromNativeId(storageSystemId, driverRegistery);
// get storage port details
PortCommandResult portResult = hp3parApi.getPortDetails();
PortStatisticsCommandResult portStatResult = hp3parApi.getPortStatisticsDetail();
// for each ViPR Storage port = 3PAR host port
for (PortMembers currMember:portResult.getMembers()) {
StoragePort port = new StoragePort();
// Consider online target ports
if (currMember.getMode() != HP3PARConstants.MODE_TARGET ||
currMember.getLinkState() != HP3PARConstants.LINK_READY) {
continue;
}
if (currMember.getLabel() == null) {
String label = String.format("port:%s:%s:%s", currMember.getPortPos().getNode(),
currMember.getPortPos().getSlot(), currMember.getPortPos().getCardPort());
port.setPortName(label);
} else {
port.setPortName(currMember.getLabel());
}
port.setStorageSystemId(storageSystemId);
switch(currMember.getProtocol()) {
case 1:
port.setTransportType(TransportType.FC);
break;
case 3:
port.setTransportType(TransportType.Ethernet);
break;
case 2:
port.setTransportType(TransportType.IP);
break;
default:
_log.warn("3PARDriver: discoverStoragePorts Invalid port {}", port.getPortName());
break;
}
for (PortStatMembers currStat:portStatResult.getMembers()) {
if (currMember.getPortPos().getNode() == currStat.getNode() &&
currMember.getPortPos().getSlot() == currStat.getSlot() &&
currMember.getPortPos().getCardPort() == currStat.getCardPort()) {
port.setPortSpeed(currStat.getSpeed() * HP3PARConstants.MEGA_BYTE);
}
}
// grouping with cluster node and slot
port.setPortGroup(currMember.getPortPos().getNode().toString());
port.setPortSubGroup(currMember.getPortPos().getSlot().toString());
// set specific properties based on protocol
if (port.getTransportType().equals(TransportType.FC.toString())) {
port.setPortNetworkId(SanUtils.formatWWN(currMember.getPortWWN()));
// rest of the values
port.setEndPointID(port.getPortNetworkId());
port.setTcpPortNumber((long)0);
} else if (port.getTransportType().equals(TransportType.IP.toString())){
port.setIpAddress(currMember.getIPAddr());
port.setPortNetworkId(currMember.getiSCSINmae());
port.setTcpPortNumber(currMember.getiSCSIPortInfo().getiSNSPort());
// rest of the values
port.setEndPointID(port.getPortNetworkId());
}
port.setAvgBandwidth(port.getPortSpeed());
port.setPortHAZone(String.format("Group-%s", currMember.getPortPos().getNode()));
String id = String.format("%s:%s:%s", currMember.getPortPos().getNode(),
currMember.getPortPos().getSlot(), currMember.getPortPos().getCardPort());
// Storage object properties
port.setNativeId(id);
port.setDeviceLabel(port.getPortName());
port.setDisplayName(port.getPortName());
port.setOperationalStatus(StoragePort.OperationalStatus.OK);
_log.info("3PARDriver: added storage port {}, native id {}", port.getPortName(), port.getNativeId());
storagePorts.add(port);
} //for each storage pool
} catch (Exception e) {
throw e;
}
}
public void saveInRegistry(String key, Map<String, List<String>> attributes, Registry driverRegistry){
driverRegistry.setDriverAttributesForKey(HP3PARConstants.DRIVER_NAME, key, attributes);
}
public Map<String, List<String>> loadFromRegistry(String key, Registry driverRegistry){
return driverRegistry.getDriverAttributesForKey(HP3PARConstants.DRIVER_NAME, key);
}
public HP3PARApiFactory getHp3parApiFactory() {
return hp3parApiFactory;
}
public void setHp3parApiFactory(HP3PARApiFactory hp3parApiFactory) {
this.hp3parApiFactory = hp3parApiFactory;
}
}