blob: 27fcbcea88fabf5b193529ef44060383504de7ca [file] [log] [blame]
package net.onrc.onos.core.topology;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.onrc.onos.core.util.Dpid;
import net.onrc.onos.core.util.PortNumber;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Handler to Switch object stored in In-memory Topology snapshot.
*/
public class SwitchImpl extends TopologyObject implements Switch {
private final Dpid id;
/**
* Creates a Switch handler object.
*
* @param topology Topology instance this object belongs to
* @param dpid DPID
*/
SwitchImpl(BaseInternalTopology topology, Dpid dpid) {
super(topology);
this.id = checkNotNull(dpid);
}
@Override
public Dpid getDpid() {
return this.id;
}
@Override
public Collection<Port> getPorts() {
return new BaseTopologyAdaptor(topology).getPorts(getDpid());
}
@Override
public Port getPort(PortNumber number) {
return new BaseTopologyAdaptor(topology).getPort(getDpid(), number);
}
@Override
public Iterable<Switch> getNeighbors() {
Set<Switch> neighbors = new HashSet<>();
for (Link link : getOutgoingLinks()) {
neighbors.add(link.getDstSwitch());
}
// XXX should incoming considered neighbor?
for (Link link : getIncomingLinks()) {
neighbors.add(link.getSrcSwitch());
}
return neighbors;
}
@Override
public Link getLinkToNeighbor(Dpid neighborDpid) {
for (Link link : getOutgoingLinks()) {
if (link.getDstSwitch().getDpid().equals(neighborDpid)) {
return link;
}
}
return null;
}
@Override
public Collection<Host> getHosts() {
// TODO Should switch also store a list of attached devices to avoid
// calculating this every time?
List<Host> hosts = new ArrayList<Host>();
for (Port port : getPorts()) {
for (Host host : port.getHosts()) {
hosts.add(host);
}
}
return hosts;
}
/**
* Returns the switch type of this switch.
*
* @return switch type {@link net.onrc.onos.core.topology.SwitchType} of this switch.
*/
@Override
public SwitchType getSwitchType() {
return SwitchType.valueOf(getStringAttribute(TopologyElement.ELEMENT_TYPE,
SwitchType.ETHERNET_SWITCH.toString()));
}
@Override
public Iterable<Link> getOutgoingLinks() {
LinkedList<Link> links = new LinkedList<Link>();
for (Port port : getPorts()) {
Link link = port.getOutgoingLink();
if (link != null) {
links.add(link);
}
}
return links;
}
@Override
public Iterable<Link> getIncomingLinks() {
LinkedList<Link> links = new LinkedList<Link>();
for (Port port : getPorts()) {
Link link = port.getIncomingLink();
if (link != null) {
links.add(link);
}
}
return links;
}
@Override
public String getStringAttribute(String attr) {
return this.topology.getSwitchData(getDpid()).getStringAttribute(attr);
}
@Override
public String getStringAttribute(String attr, String def) {
final String v = getStringAttribute(attr);
if (v == null) {
return def;
} else {
return v;
}
}
@Override
public Map<String, String> getAllStringAttributes() {
return this.topology.getSwitchData(getDpid()).getAllStringAttributes();
}
@Override
public String toString() {
return getDpid().toString();
}
/**
* Returns the type of topology object.
*
* @return the type of the topology object
*/
@Override
public String getType() {
return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
}
/**
* Returns the config state of topology element.
*
* @return ConfigState
*/
@Override
public ConfigState getConfigState() {
return ConfigState.valueOf(getStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE));
}
/**
* Returns the status of topology element.
*
* @return AdminStatus
*/
@Override
public AdminStatus getStatus() {
return AdminStatus.valueOf(getStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS));
}
}