update NetworkGraph objects
- Use Object type instead of built-in
- Port number to Long
Change-Id: I30847b6cca801e58ca49dd9d1667cfd33a8ffb92
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
index ecf7b0d..0067e27 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
@@ -20,9 +20,12 @@
import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
import net.onrc.onos.ofcontroller.networkgraph.SouthboundNetworkGraph;
import net.onrc.onos.ofcontroller.networkgraph.Switch;
+import net.onrc.onos.ofcontroller.util.Dpid;
import net.onrc.onos.registry.controller.IControllerRegistryService;
import org.openflow.protocol.OFPhysicalPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/*
* I've created a copy of the NetworkGraphPublisher so I can integrate
@@ -31,33 +34,48 @@
* TODO Remove old NetworkGraphPublisher once the integration of the new
* API is complete.
* For now, we just write to the database and don't worry about sending
- * notifications.
+ * notifications.
* TODO Send notification after each database write
*/
public class RCNetworkGraphPublisher implements /*IOFSwitchListener,*/
IOFSwitchPortListener,
ILinkDiscoveryListener,
IFloodlightModule {
+ private final static Logger log = LoggerFactory.getLogger(RCNetworkGraphPublisher.class);
private IFloodlightProviderService floodlightProvider;
private ILinkDiscoveryService linkDiscovery;
private IControllerRegistryService registryService;
private IDatagridService datagridService;
private INetworkGraphService networkGraphService;
-
+
private NetworkGraph networkGraph;
private SouthboundNetworkGraph southboundNetworkGraph;
-
+
@Override
public void linkDiscoveryUpdate(LDUpdate update) {
- // TODO Auto-generated method stub
- LinkImpl link = new LinkImpl(networkGraph);
- link.setSrcSwitch(update.getSrc());
- link.setSrcPort(update.getSrcPort());
- link.setDstSwitch(update.getDst());
- link.setDstPort(update.getDstPort());
-
+
+ // TODO Move this sanity check when retrieving port to common place?
+ Switch srcSw = networkGraph.getSwitch(update.getSrc());
+ if (srcSw == null) {
+ log.error("Switch {} missing when adding Link {}",
+ new Dpid(update.getSrc()), update);
+ return;
+ }
+
+ Switch dstSw = networkGraph.getSwitch(update.getDst());
+ if (dstSw == null) {
+ log.error("Switch {} missing when adding Link {}",
+ new Dpid(update.getDst()), update);
+ return;
+ }
+
+ // XXX Is it correct to add Link object created with networkGraph to southboundNetworkGraph?
+ LinkImpl link = new LinkImpl(networkGraph,
+ srcSw.getPort((long) update.getSrcPort()),
+ dstSw.getPort((long) update.getDstPort()));
+
switch (update.getOperation()) {
case LINK_ADDED:
southboundNetworkGraph.addLink(link);
@@ -93,13 +111,13 @@
@Override
public void switchPortAdded(Long switchId, OFPhysicalPort port) {
// TODO Auto-generated method stub
-
+
}
@Override
public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
// TODO Auto-generated method stub
-
+
}
@Override
@@ -108,10 +126,10 @@
if (!registryService.hasControl(sw.getId())) {
return;
}
-
+
Switch onosSwitch = FloodlightToOnosMappers.map(networkGraph, sw);
southboundNetworkGraph.addSwitch(onosSwitch);
-
+
/*
// TODO publish ADD_SWITCH event here
TopologyElement topologyElement =
@@ -150,13 +168,13 @@
@Override
public void removedSwitch(IOFSwitch sw) {
// TODO Auto-generated method stub
-
+
}
@Override
public void switchPortChanged(Long switchId) {
// TODO Auto-generated method stub
-
+
}
@Override
@@ -168,14 +186,14 @@
/* *****************
* IFloodlightModule
* *****************/
-
+
@Override
public Collection<Class<? extends IFloodlightService>> getModuleServices() {
return null;
}
@Override
- public Map<Class<? extends IFloodlightService>, IFloodlightService>
+ public Map<Class<? extends IFloodlightService>, IFloodlightService>
getServiceImpls() {
return null;
}
@@ -199,7 +217,7 @@
linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
registryService = context.getServiceImpl(IControllerRegistryService.class);
datagridService = context.getServiceImpl(IDatagridService.class);
-
+
networkGraphService = context.getServiceImpl(INetworkGraphService.class);
}
@@ -208,7 +226,7 @@
// TODO enable cleanup thread
floodlightProvider.addOFSwitchListener(this);
linkDiscovery.addListener(this);
-
+
networkGraph = networkGraphService.getNetworkGraph();
southboundNetworkGraph = networkGraphService.getSouthboundNetworkGraph();
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
index 3fa4ad9..71ef16e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
@@ -15,82 +15,99 @@
import org.slf4j.LoggerFactory;
public class AbstractNetworkGraph implements NetworkGraph {
- @SuppressWarnings("unused")
- private static final Logger log = LoggerFactory
- .getLogger(AbstractNetworkGraph.class);
+ @SuppressWarnings("unused")
+ private static final Logger log = LoggerFactory.getLogger(AbstractNetworkGraph.class);
- // DPID -> Switch
- protected ConcurrentMap<Long, Switch> switches;
+ // DPID -> Switch
+ protected ConcurrentMap<Long, Switch> switches;
- protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
- protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
+ protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
+ protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
- public AbstractNetworkGraph() {
- // TODO: Does these object need to be stored in Concurrent Collection?
- switches = new ConcurrentHashMap<>();
- addr2Device = new ConcurrentHashMap<>();
- mac2Device = new ConcurrentHashMap<>();
- }
-
- @Override
- public Switch getSwitch(long dpid) {
- // TODO Check if it is safe to directly return this Object.
- return switches.get(dpid);
- }
-
- @Override
- public Iterable<Switch> getSwitches() {
- // TODO Check if it is safe to directly return this Object.
- return Collections.unmodifiableCollection(switches.values());
- }
-
- @Override
- public Iterable<Link> getLinks() {
- List<Link> linklist = new LinkedList<>();
-
- for (Switch sw : switches.values()) {
- Iterable<Link> links = sw.getLinks();
- for (Link l : links) {
- linklist.add(l);
- }
+ public AbstractNetworkGraph() {
+ // TODO: Does these object need to be stored in Concurrent Collection?
+ switches = new ConcurrentHashMap<>();
+ addr2Device = new ConcurrentHashMap<>();
+ mac2Device = new ConcurrentHashMap<>();
}
- return linklist;
- }
- @Override
- public Iterable<Link> getLinksFromSwitch(long dpid) {
- Switch sw = getSwitch(dpid);
- if (sw == null) {
- return Collections.emptyList();
+ @Override
+ public Switch getSwitch(Long dpid) {
+ // TODO Check if it is safe to directly return this Object.
+ return switches.get(dpid);
}
- Iterable<Link> links = sw.getLinks();
- if (links instanceof Collection) {
- return Collections.unmodifiableCollection((Collection<Link>) links);
- } else {
- List<Link> linklist = new LinkedList<>();
- for (Link l : links) {
- linklist.add(l);
- }
- return linklist;
- }
- }
- @Override
- public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
- Set<Device> devices = addr2Device.get(ipAddress);
- if (devices == null) {
- return Collections.emptyList();
+ @Override
+ public Iterable<Switch> getSwitches() {
+ // TODO Check if it is safe to directly return this Object.
+ return Collections.unmodifiableCollection(switches.values());
}
- return Collections.unmodifiableCollection(devices);
- }
- @Override
- public Iterable<Device> getDeviceByMac(MACAddress address) {
- Set<Device> devices = mac2Device.get(address);
- if (devices == null) {
- return Collections.emptyList();
+ @Override
+ public Iterable<Link> getLinks() {
+ List<Link> linklist = new LinkedList<>();
+
+ for (Switch sw : switches.values()) {
+ Iterable<Link> links = sw.getOutgoingLinks();
+ for (Link l : links) {
+ linklist.add(l);
+ }
+ }
+ return linklist;
}
- return Collections.unmodifiableCollection(devices);
- }
+ @Override
+ public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+ Switch sw = getSwitch(dpid);
+ if (sw == null) {
+ return Collections.emptyList();
+ }
+ Iterable<Link> links = sw.getOutgoingLinks();
+ if (links instanceof Collection) {
+ return Collections.unmodifiableCollection((Collection<Link>) links);
+ } else {
+ List<Link> linklist = new LinkedList<>();
+ for (Link l : links) {
+ linklist.add(l);
+ }
+ return linklist;
+ }
+ }
+
+ @Override
+ public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+ Switch sw = getSwitch(dpid);
+ if (sw == null) {
+ return Collections.emptyList();
+ }
+ Iterable<Link> links = sw.getIncomingLinks();
+ if (links instanceof Collection) {
+ return Collections.unmodifiableCollection((Collection<Link>) links);
+ } else {
+ List<Link> linklist = new LinkedList<>();
+ for (Link l : links) {
+ linklist.add(l);
+ }
+ return linklist;
+ }
+ }
+
+
+ @Override
+ public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+ Set<Device> devices = addr2Device.get(ipAddress);
+ if (devices == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableCollection(devices);
+ }
+
+ @Override
+ public Iterable<Device> getDeviceByMac(MACAddress address) {
+ Set<Device> devices = mac2Device.get(address);
+ if (devices == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableCollection(devices);
+ }
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
index 9bd8051..8139737 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
@@ -7,32 +7,24 @@
public class FloodlightToOnosMappers {
public static Switch map(NetworkGraph graph, IOFSwitch sw) {
- SwitchImpl onosSwitch = new SwitchImpl(graph);
- onosSwitch.setDpid(sw.getId());
+ SwitchImpl onosSwitch = new SwitchImpl(graph, sw.getId());
for (OFPhysicalPort port : sw.getPorts()) {
- onosSwitch.addPort(map(graph, port));
+ onosSwitch.addPort(map(graph, onosSwitch, port));
}
return onosSwitch;
}
- public static Port map(NetworkGraph graph, OFPhysicalPort port) {
- PortImpl onosPort = new PortImpl(graph);
- onosPort.setPortNumber(port.getPortNumber());
+ public static Port map(NetworkGraph graph, SwitchImpl sw, OFPhysicalPort port) {
+ PortImpl onosPort = new PortImpl(graph, sw, new Long(port.getPortNumber()));
return onosPort;
}
public static Link map(NetworkGraph graph, net.floodlightcontroller.routing.Link link) {
- LinkImpl onosLink = new LinkImpl(graph);
-
- Switch srcSw = graph.getSwitch(link.getSrc());
- onosLink.setSrcSwitch(srcSw);
- onosLink.setSrcPort(srcSw.getPort(link.getSrcPort()));
-
- Switch dstSw = graph.getSwitch(link.getDst());
- onosLink.setDstSwitch(dstSw);
- onosLink.setDstPort(dstSw.getPort(link.getDstPort()));
+ Port srcPort = graph.getSwitch(link.getSrc()).getPort(Long.valueOf(link.getSrcPort()));
+ Port dstPort = graph.getSwitch(link.getDst()).getPort(Long.valueOf(link.getDstPort()));
+ LinkImpl onosLink = new LinkImpl(graph, srcPort, dstPort);
return onosLink;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
index 0fc72f6..ef74f73 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
@@ -12,13 +12,17 @@
public Port getDestinationPort();
public Switch getSourceSwitch();
public Switch getDestinationSwitch();
-
+
public long getLastSeenTime();
+
public int getCost();
+ public Double getCapacity();
// Not sure if we want to expose these northbound
- public long getSourceSwitchDpid();
- public short getSourcePortNumber();
- public long getDestinationSwitchDpid();
- public short getDestinationPortNumber();
+ // Toshi: I think these are unnecessary because we can get them
+ // Toshi: like "this.getSourcePort().getSwitch()" etc.
+ public Long getSourceSwitchDpid();
+ public Long getSourcePortNumber();
+ public Long getDestinationSwitchDpid();
+ public Long getDestinationPortNumber();
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
index c566eea..b1fc9b8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -7,41 +7,50 @@
* but this Object itself will not issue any read/write to the DataStore.
*/
public class LinkImpl extends NetworkGraphObject implements Link {
+ protected Port srcPort;
+ protected Port dstPort;
- private Switch srcSwitch;
- private Port srcPort;
- private Switch dstSwitch;
- private Port dstPort;
+ protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
+ protected Double capacity = DEFAULT_CAPACITY;
- private static final int DEFAULT_COST = 1;
- private int cost = DEFAULT_COST;
+ protected static final int DEFAULT_COST = 1;
+ protected int cost = DEFAULT_COST;
- public LinkImpl(NetworkGraph graph) {
+ public LinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
super(graph);
+ this.srcPort = srcPort;
+ this.dstPort = dstPort;
+ setToPorts();
+ }
+
+ protected void setToPorts() {
+ ((PortImpl)srcPort).setOutgoingLink(this);
+ ((PortImpl)srcPort).setIncomingLink(this);
+ }
+
+ protected void unsetFromPorts() {
+ ((PortImpl)srcPort).setOutgoingLink(null);
+ ((PortImpl)srcPort).setIncomingLink(null);
}
@Override
public Port getSourcePort() {
- // TODO Auto-generated method stub
- return null;
+ return srcPort;
}
@Override
public Port getDestinationPort() {
- // TODO Auto-generated method stub
- return null;
+ return dstPort;
}
@Override
public Switch getSourceSwitch() {
- // TODO Auto-generated method stub
- return null;
+ return srcPort.getSwitch();
}
@Override
public Switch getDestinationSwitch() {
- // TODO Auto-generated method stub
- return null;
+ return dstPort.getSwitch();
}
@Override
@@ -60,44 +69,39 @@
}
@Override
- public long getSourceSwitchDpid() {
- return srcSwitch.getDpid();
- }
-
- public void setSrcSwitch(Switch srcSwitch) {
- // TODO null check
- this.srcSwitch = srcSwitch;
+ public Long getSourceSwitchDpid() {
+ return srcPort.getSwitch().getDpid();
}
@Override
- public short getSourcePortNumber() {
+ public Long getSourcePortNumber() {
return srcPort.getNumber();
}
- public void setSrcPort(Port srcPort) {
- // TODO null check
- this.srcPort = srcPort;
+ @Override
+ public Long getDestinationSwitchDpid() {
+ return dstPort.getSwitch().getDpid();
}
@Override
- public long getDestinationSwitchDpid() {
- return dstSwitch.getDpid();
- }
-
- public void setDstSwitch(Switch dstSwitch) {
- // TODO null check
- this.dstSwitch = dstSwitch;
- }
-
- @Override
- public short getDestinationPortNumber() {
+ public Long getDestinationPortNumber() {
return dstPort.getNumber();
}
- public void setDstPort(Port dstPort) {
- // TODO null check
- this.dstPort = dstPort;
+ @Override
+ public Double getCapacity() {
+ return capacity;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s --(cap:%f Mbps)--> %s",
+ getSourcePort().toString(),
+ getCapacity(),
+ getDestinationPort().toString());
}
-
+ public void setCapacity(Double capacity) {
+ this.capacity = capacity;
+ }
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
new file mode 100644
index 0000000..b617e47
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
@@ -0,0 +1,110 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * @author Toshio Koide (t-koide@onlab.us)
+ */
+public class MutableNetworkGraph implements NetworkGraph {
+ protected HashMap<Long, SwitchImpl> switches;
+
+ public MutableNetworkGraph() {
+ switches = new HashMap<Long, SwitchImpl>();
+ }
+
+ // Switch operations
+
+ public Switch addSwitch(Long switchId) {
+ if (switches.containsKey(switchId)) {
+ return null; // should throw exception
+ }
+ SwitchImpl sw = new SwitchImpl(this, switchId);
+ switches.put(sw.getDpid(), sw);
+ return sw;
+
+ }
+
+ @Override
+ public Switch getSwitch(Long dpid) {
+ return switches.get(dpid);
+ }
+
+ @Override
+ public Iterable<? extends Switch> getSwitches() {
+ return switches.values();
+ }
+
+ // Link operations
+
+ public Link addLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+ return new LinkImpl(
+ this,
+ getSwitch(srcDpid).getPort(srcPortNo),
+ getSwitch(dstDpid).getPort(dstPortNo));
+ }
+
+ public Link[] addBidirectionalLinks(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+ Link[] links = new Link[2];
+ links[0] = addLink(srcDpid, srcPortNo, dstDpid, dstPortNo);
+ links[1] = addLink(dstDpid, dstPortNo, srcDpid, srcPortNo);
+
+ return links;
+ }
+
+ @Override
+ public Collection<Link> getLinks() {
+ LinkedList<Link> links = new LinkedList<Link>();
+ for (Switch sw: switches.values()) {
+ for (Port port: sw.getPorts()) {
+ Link link = port.getOutgoingLink();
+ if (link != null) {
+ links.add(link);
+ }
+ }
+ }
+ return links;
+ }
+
+ @Override
+ public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+ LinkedList<Link> links = new LinkedList<Link>();
+ for (Port port: getSwitch(dpid).getPorts()) {
+ Link link = port.getOutgoingLink();
+ if (link != null) {
+ links.add(link);
+ }
+ }
+ return links;
+ }
+
+ @Override
+ public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+ LinkedList<Link> links = new LinkedList<Link>();
+ for (Port port: getSwitch(dpid).getPorts()) {
+ Link link = port.getIncomingLink();
+ if (link != null) {
+ links.add(link);
+ }
+ }
+ return links;
+ }
+
+ // Device operations
+
+ @Override
+ public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Device> getDeviceByMac(MACAddress address) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
index 867ae98..1c4a390 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -11,11 +11,12 @@
*
*/
public interface NetworkGraph {
- public Switch getSwitch(long dpid);
- public Iterable<Switch> getSwitches();
+ public Switch getSwitch(Long dpid);
+ public Iterable<? extends Switch> getSwitches();
- public Iterable<Link> getLinks();
- public Iterable<Link> getLinksFromSwitch(long dpid);
+ public Iterable<? extends Link> getLinks();
+ public Iterable<? extends Link> getOutgoingLinksFromSwitch(Long dpid); // Toshi: unnecessary
+ public Iterable<? extends Link> getIncomingLinksFromSwitch(Long dpid); // Toshi: unnecessary
public Iterable<Device> getDeviceByIp(InetAddress ipAddress);
public Iterable<Device> getDeviceByMac(MACAddress address);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 0debb70..50fda95 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -116,8 +116,7 @@
sw.read();
// TODO SwitchImpl probably should have a constructor from
// RCSwitch
- SwitchImpl memSw = new SwitchImpl(this);
- memSw.setDpid(sw.getDpid());
+ SwitchImpl memSw = new SwitchImpl(this, sw.getDpid());
addSwitch(memSw);
} catch (ObjectDoesntExistException e) {
@@ -130,16 +129,13 @@
p.read();
// TODO PortImpl probably should have a constructor from RCPort
- PortImpl memPort = new PortImpl(this);
- // FIXME remove shortValue()
- memPort.setPortNumber(p.getNumber().shortValue());
Switch sw = this.getSwitch(p.getDpid());
if (sw == null) {
log.error("Switch {} missing when adding Port {}",
new Dpid(p.getDpid()), p);
continue;
}
- memPort.setSwitch(sw);
+ PortImpl memPort = new PortImpl(this, sw, p.getNumber());
addPort(memPort);
} catch (ObjectDoesntExistException e) {
@@ -158,41 +154,38 @@
// }
for (RCLink l : RCLink.getAllLinks()) {
- try {
- l.read();
+ try {
+ l.read();
- LinkImpl memLink = new LinkImpl(this);
- Switch srcSw = this.getSwitch(l.getSrc().dpid);
- if (srcSw == null) {
- log.error("Switch {} missing when adding Link {}",
- new Dpid(l.getSrc().dpid), l);
- continue;
+ Switch srcSw = this.getSwitch(l.getSrc().dpid);
+ if (srcSw == null) {
+ log.error("Switch {} missing when adding Link {}",
+ new Dpid(l.getSrc().dpid), l);
+ continue;
+ }
+
+ Switch dstSw = this.getSwitch(l.getDst().dpid);
+ if (dstSw == null) {
+ log.error("Switch {} missing when adding Link {}",
+ new Dpid(l.getDst().dpid), l);
+ continue;
+ }
+
+ LinkImpl memLink = new LinkImpl(this,
+ srcSw.getPort(l.getSrc().number),
+ dstSw.getPort(l.getDst().number));
+
+ addLink(memLink);
+ } catch (ObjectDoesntExistException e) {
+ log.debug("Delete Link Failed", e);
}
- memLink.setSrcSwitch(srcSw);
- // FIXME remove shortValue()
- memLink.setSrcPort(srcSw.getPort(l.getSrc().number.shortValue()));
-
- Switch dstSw = this.getSwitch(l.getDst().dpid);
- if (dstSw == null) {
- log.error("Switch {} missing when adding Link {}",
- new Dpid(l.getDst().dpid), l);
- continue;
- }
- memLink.setDstSwitch(dstSw);
- // FIXME remove shortValue()
- memLink.setDstPort(srcSw.getPort(l.getDst().number.shortValue()));
-
- addLink(memLink);
- } catch (ObjectDoesntExistException e) {
- log.debug("Delete Link Failed", e);
- }
}
}
// FIXME To be removed later this class should never read from DB.
- public void readSwitchFromTopology(long dpid) {
- SwitchImpl sw = new SwitchImpl(this);
+ public void readSwitchFromTopology(Long dpid) {
+ SwitchImpl sw = new SwitchImpl(this, dpid);
RCSwitch rcSwitch = new RCSwitch(dpid);
try {
@@ -202,8 +195,6 @@
return;
}
- sw.setDpid(rcSwitch.getDpid());
-
addSwitch(sw);
for (byte[] portId : rcSwitch.getAllPortIds()) {
@@ -211,13 +202,8 @@
try {
rcPort.read();
- PortImpl port = new PortImpl(this);
- // port.setDpid(dpid);
+ PortImpl port = new PortImpl(this, sw, rcPort.getNumber());
- // TODO why are port numbers long?
- // port.setPortNumber((short)rcPort.getNumber());
-
- port.setSwitch(sw);
sw.addPort(port);
addPort(port);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
index 453dd14..126bbab 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
@@ -10,11 +10,11 @@
*
*/
public interface Port {
- public short getNumber();
- public String getName();
- public long getHardwareAddress();
+ public Long getNumber();
+ public Long getHardwareAddress();
public Switch getSwitch();
- public Link getLink();
+ public Link getOutgoingLink();
+ public Link getIncomingLink();
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
index 2e1086c..97ee8b5 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
@@ -8,43 +8,26 @@
*/
public class PortImpl extends NetworkGraphObject implements Port {
- //private long dpid;
private Switch sw;
- private short number;
+ private Long number;
+ protected Link outgoingLink;
+ protected Link incomingLink;
- public PortImpl(NetworkGraph graph) {
+ public PortImpl(NetworkGraph graph, Switch parentSwitch, Long number) {
super(graph);
- }
-
- public void setPortNumber(short portNumber) {
- number = portNumber;
+ this.sw = parentSwitch;
+ this.number = number;
}
@Override
- public short getNumber() {
+ public Long getNumber() {
return number;
}
- /*
- public void setDpid(long dpid) {
- this.dpid = dpid;
- }
-
- public long getDpid() {
- return dpid;
- }
- */
-
@Override
- public String getName() {
+ public Long getHardwareAddress() {
// TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public long getHardwareAddress() {
- // TODO Auto-generated method stub
- return 0;
+ return 0L;
}
@Override
@@ -52,14 +35,28 @@
return sw;
}
- public void setSwitch(Switch sw) {
- this.sw = sw;
+ @Override
+ public Link getOutgoingLink() {
+ return outgoingLink;
}
@Override
- public Link getLink() {
- // TODO Auto-generated method stub
- return null;
+ public Link getIncomingLink() {
+ return incomingLink;
}
+ public void setOutgoingLink(Link link) {
+ outgoingLink = link;
+ }
+
+ public void setIncomingLink(Link link) {
+ incomingLink = link;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%d:%d",
+ getSwitch().getDpid(),
+ getNumber());
+ }
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
index 7552399..95ab440 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
@@ -12,11 +12,11 @@
*
*/
public interface Switch {
- public long getDpid();
+ public Long getDpid();
public Collection<Port> getPorts();
- public Port getPort(short number);
+ public Port getPort(Long number);
// Flows
@@ -25,9 +25,10 @@
// Graph traversal API
public Iterable<Switch> getNeighbors();
- public Iterable<Link> getLinks();
+ public Iterable<Link> getOutgoingLinks();
+ public Iterable<Link> getIncomingLinks();
- public Link getLinkToNeighbor(long dpid);
+ public Link getLinkToNeighbor(Long dpid);
public Collection<Device> getDevices();
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
index 325718a..c1d1a1a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -3,9 +3,8 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedList;
import java.util.Map;
-import java.util.Set;
import net.onrc.onos.datastore.topology.RCPort;
import net.onrc.onos.datastore.topology.RCSwitch;
@@ -21,17 +20,17 @@
*/
public class SwitchImpl extends NetworkGraphObject implements Switch {
- private long dpid;
- private final Map<Short, Port> ports;
+ private Long dpid;
+ private final Map<Long, Port> ports;
- public SwitchImpl(NetworkGraph graph) {
+ public SwitchImpl(NetworkGraph graph, Long dpid) {
super(graph);
-
- ports = new HashMap<Short, Port>();
+ this.dpid = dpid;
+ ports = new HashMap<Long, Port>();
}
@Override
- public long getDpid() {
+ public Long getDpid() {
return dpid;
}
@@ -41,7 +40,7 @@
}
@Override
- public Port getPort(short number) {
+ public Port getPort(Long number) {
return ports.get(number);
}
@@ -58,8 +57,8 @@
}
@Override
- public Link getLinkToNeighbor(long neighborDpid) {
- for (Link link : graph.getLinksFromSwitch(dpid)) {
+ public Link getLinkToNeighbor(Long neighborDpid) {
+ for (Link link : graph.getOutgoingLinksFromSwitch(dpid)) {
if (link.getDestinationSwitch().getDpid() == neighborDpid) {
return link;
}
@@ -73,21 +72,14 @@
return null;
}
- public void setDpid(long dpid) {
- this.dpid = dpid;
- }
-
public void addPort(Port port) {
this.ports.put(port.getNumber(), port);
}
-
- @Override
- public Iterable<Link> getLinks() {
- Set<Link> links = new HashSet<>();
- for( Port p : ports.values()) {
- links.add(p.getLink());
- }
- return links;
+
+ public Port addPort(Long portNumber) {
+ PortImpl port = new PortImpl(graph, this, portNumber);
+ ports.put(port.getNumber(), port);
+ return port;
}
public void store() {
@@ -108,4 +100,28 @@
}
}
+
+ @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;
+ }
}