/*
* Copyright (c) 2008-2011 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.model;
import java.net.URI;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.model.valid.EnumType;
/**
* Storage port data object, represents a port of storage device.
* Storage port is connected to a transport zone and belongs
* to a storage port group of a storage device.
*/
@Cf("StoragePort")
public class StoragePort extends VirtualArrayTaggedResource implements Comparable<StoragePort>, Cloneable {
// Defines the supported port types.
public static enum PortType {
frontend,
backend,
rdf,
Unknown
};
public static enum TransportType {
FC,
IP;
}
public static enum OperationalStatus{
OK, NOT_OK, UNKNOWN
};
// storage port name used when communicating with the storage system
private String _portName;
// device native ID
private String _nativeId;
// storage port network identifier e.g. FC - port wwn, IP - network interface identifier
private String _portNetworkId;
// storage device this storage port belongs to
private URI _storageDevice;
//storageHADomain, to which this port belongs
private URI _storageHADomain;
// port type
private String _transportType;
// network this storage port is attached to
private URI _network;
// port speed
// wherever possible, we will try and set this to Gbps, Giga bits per sec.
private Long _portSpeed;
// port container tag, e.g. for front-end director
private String _portGroup;
// average bandwidth through the port
private Long _avgBandwidth;
// static load (number of exports) on the storage port
private Long _staticLoad;
private String _operationalStatus = OperationalStatus.UNKNOWN.name();
private Long _tcpPortNumber;
private String _ipAddress;
private String _endPointID;
private String _portType = PortType.frontend.name();
private String _registrationStatus = RegistrationStatus.REGISTERED.toString();
//used in finding out whether or not the port is Compatible
private String _compatibilityStatus = CompatibilityStatus.UNKNOWN.name();
private String _discoveryStatus = DiscoveryStatus.VISIBLE.name();
private StringMap _metrics;
/*************************************************
* AlternateIDIndex - portNetworkID,transportZone*
* RelationIndex - StorageDevice *
* *
************************************************/
@Name("portEndPointID")
public String getPortEndPointID() {
return _endPointID;
}
public void setPortEndPointID(String endPointID) {
_endPointID = endPointID;
setChanged("portEndPointID");
}
@Name("portName")
public String getPortName() {
return _portName;
}
public void setPortName(String portName) {
_portName = portName;
setChanged("portName");
}
@Name("nativeId")
public String getNativeId() {
return _nativeId;
}
public void setNativeId(String nativeId) {
_nativeId = nativeId;
setChanged("nativeId");
}
public void setTcpPortNumber(Long tcpPortNumber) {
_tcpPortNumber = tcpPortNumber;
setChanged("tcpPortNumber");
}
@Name("tcpPortNumber")
public Long getTcpPortNumber() {
return _tcpPortNumber;
}
public void setIpAddress(String ipAddress) {
_ipAddress = ipAddress;
setChanged("ipAddress");
}
@Name("ipAddress")
public String getIpAddress() {
return _ipAddress;
}
@AlternateId("AltIdIndex")
@Name("portNetworkId")
public String getPortNetworkId() {
return _portNetworkId;
}
public void setPortNetworkId(String portNetworkId) {
_portNetworkId = portNetworkId;
setChanged("portNetworkId");
}
@Name("transportType")
public String getTransportType() {
return _transportType;
}
public void setTransportType(String transportType) {
_transportType = transportType;
setChanged("transportType");
}
@AlternateId("SecondaryAltIdIndex")
@Name("network")
public URI getNetwork() {
return _network;
}
public void setNetwork(URI network) {
_network = network;
setChanged("network");
}
@RelationIndex(cf = "RelationIndex", type = StorageSystem.class)
@Name("storageDevice")
public URI getStorageDevice() {
return _storageDevice;
}
public void setStorageDevice(URI storageDevice) {
_storageDevice = storageDevice;
setChanged("storageDevice");
}
@Name("portSpeed")
public Long getPortSpeed() {
return _portSpeed;
}
public void setPortSpeed(Long portSpeed) {
_portSpeed = portSpeed;
setChanged("portSpeed");
}
@Name("portGroup")
public String getPortGroup() {
return _portGroup;
}
public void setPortGroup(String portGroup) {
_portGroup = portGroup;
setChanged("portGroup");
}
@Name("avgBandwidth")
public Long getAvgBandwidth() {
return _avgBandwidth;
}
public void setAvgBandwidth(Long avgBandwidth) {
_avgBandwidth = avgBandwidth;
setChanged("avgBandwidth");
}
@Name("staticLoad")
public Long getStaticLoad() {
return _staticLoad;
}
public void setStaticLoad(Long staticLoad) {
_staticLoad = staticLoad;
setChanged("staticLoad");
}
public void setStorageHADomain(URI storageHADomain) {
_storageHADomain = storageHADomain;
setChanged("storageHADomain");
}
@RelationIndex(cf = "RelationIndex", type = StorageHADomain.class)
@Name("storageHADomain")
public URI getStorageHADomain() {
return _storageHADomain;
}
@EnumType(PortType.class)
@Name("portType")
public String getPortType() {
return _portType;
}
public void setPortType(String portType) {
_portType = portType;
setChanged("portType");
}
@EnumType(OperationalStatus.class)
@Name("operationalStatus")
public String getOperationalStatus() {
return _operationalStatus;
}
public void setOperationalStatus(String operationalStatus) {
_operationalStatus = operationalStatus;
setChanged("operationalStatus");
}
public void setRegistrationStatus(String registrationStatus) {
_registrationStatus = registrationStatus;
setChanged("registrationStatus");
}
@EnumType(RegistrationStatus.class)
@Name("registrationStatus")
public String getRegistrationStatus() {
return _registrationStatus;
}
@EnumType(CompatibilityStatus.class)
@Name("compatibilityStatus")
public String getCompatibilityStatus() {
return _compatibilityStatus;
}
public void setCompatibilityStatus(String compatibilityStatus) {
_compatibilityStatus = compatibilityStatus;
setChanged("compatibilityStatus");
}
@Override
public String toString() {
StringBuilder toPrint = new StringBuilder();
toPrint.append("portName=").append(_portName);
toPrint.append(",portNetworkId=").append(_portNetworkId);
toPrint.append(",storageDevice=").append(_storageDevice);
toPrint.append(",storageHADomain=").append(_storageHADomain);
toPrint.append(",transportType=").append(_transportType);
toPrint.append(",network=").append(_network);
toPrint.append(",portSpeed=").append(_portSpeed);
toPrint.append(",portGroup=").append(_portGroup);
toPrint.append(",avgBandwidth=").append(_avgBandwidth);
toPrint.append(",operationalStatus=").append(_operationalStatus);
toPrint.append(",registrationStatus=").append(_registrationStatus);
toPrint.append(",tcpPortNumber=").append(_tcpPortNumber);
toPrint.append(",ipAddress=").append(_ipAddress);
toPrint.append(",endPointID=").append(_endPointID);
toPrint.append(",portType=").append(_portType);
return toPrint.toString();
}
// TODO: This should perhaps be done in a base class
@Override
public int compareTo(StoragePort storagePort) {
int result = 0;
if (this == storagePort) {
return result;
}
if (getNativeGuid() == null) {
result = -1;
} else if (storagePort == null || storagePort.getNativeGuid() == null) {
result = 1;
} else {
result = getNativeGuid().compareTo(storagePort.getNativeGuid());
}
return result;
}
// TODO: This should perhaps be done in a base class
@Override
public boolean equals(Object obj) {
boolean result = false;
if (obj instanceof StoragePort) {
StoragePort storagePort = (StoragePort) obj;
if (getNativeGuid() != null && storagePort.getNativeGuid() != null) {
result = getNativeGuid().equals(storagePort.getNativeGuid());
}
}
return result;
}
public boolean taggedToVirtualArray(URI virtualArrayURI) {
boolean result = false;
StringSet taggedVirtualArraysSet = getTaggedVirtualArrays();
if (taggedVirtualArraysSet != null) {
result = taggedVirtualArraysSet.contains(virtualArrayURI.toString());
}
return result;
}
// TODO: This should perhaps be done in a base class
@Override
public int hashCode() {
if (getNativeGuid() != null) {
return getNativeGuid().hashCode();
} else {
return 0;
}
}
@Name("metrics")
public StringMap getMetrics() {
if (_metrics == null) {
_metrics = new StringMap();
}
return _metrics;
}
public void setMetrics(StringMap metrics) {
this._metrics = metrics;
setChanged("metrics");
}
@EnumType(DiscoveryStatus.class)
@Name("discoveryStatus")
public String getDiscoveryStatus() {
return _discoveryStatus;
}
public void setDiscoveryStatus(String discoveryStatus) {
this._discoveryStatus = discoveryStatus;
setChanged("discoveryStatus");
}
public StoragePort clone() {
StoragePort port = null;
try {
port = (StoragePort) super.clone();
} catch (Exception e) {
// Do Nothing
}
return port;
}
/**
* Returns a port name guaranteed to have the director identification.
*
* @param port
* @return
*/
public String qualifiedPortName() {
if (getPortName().startsWith(getPortGroup())) {
return getPortName();
} else {
return getPortGroup() + ":" + getPortName();
}
}
/**
* Check if the storage port is usable for port allocation:
* must be COMPATIBLE, VISBLE, have a network ID,
* be registered, and type front end.
* @return true if the port is usable
*/
public boolean isUsable() {
URI portNetworkId = getNetwork();
boolean result = true;
if (!DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name()
.equals(getCompatibilityStatus())
|| !DiscoveryStatus.VISIBLE.name().equals(getDiscoveryStatus())
|| NullColumnValueGetter.isNullURI(portNetworkId)
|| !getRegistrationStatus().equals(RegistrationStatus.REGISTERED.name())
|| !getPortType().equals(PortType.frontend.name())) {
result = false;
}
return result;
}
}