Yuta HIGUCHI
Committed by Gerrit Code Review

EdgeManager fixes

- Edge point update should be triggered based on TopologyEvent.
  {Device, Link}Event can be triggered before TopologyEvent,
  which will result in use of the outdated Topology to determine
  if the port is an edge port leading to incorrect edge port set.
  (ONOS-4896)
- Ports on Edge Link should not be considered part of infrastructure,
  should be candidate for Edge point.

Change-Id: I7d69cc242ba7849996c1105ccd1956975db63480
...@@ -37,6 +37,7 @@ import org.onosproject.net.DefaultPath; ...@@ -37,6 +37,7 @@ import org.onosproject.net.DefaultPath;
37 import org.onosproject.net.DeviceId; 37 import org.onosproject.net.DeviceId;
38 import org.onosproject.net.DisjointPath; 38 import org.onosproject.net.DisjointPath;
39 import org.onosproject.net.Link; 39 import org.onosproject.net.Link;
40 +import org.onosproject.net.Link.Type;
40 import org.onosproject.net.Path; 41 import org.onosproject.net.Path;
41 import org.onosproject.net.provider.ProviderId; 42 import org.onosproject.net.provider.ProviderId;
42 import org.onosproject.net.topology.ClusterId; 43 import org.onosproject.net.topology.ClusterId;
...@@ -442,14 +443,17 @@ public class DefaultTopology extends AbstractModel implements Topology { ...@@ -442,14 +443,17 @@ public class DefaultTopology extends AbstractModel implements Topology {
442 riskProfile2.put(new TopologyEdge() { 443 riskProfile2.put(new TopologyEdge() {
443 Link cur = l; 444 Link cur = l;
444 445
446 + @Override
445 public Link link() { 447 public Link link() {
446 return cur; 448 return cur;
447 } 449 }
448 450
451 + @Override
449 public TopologyVertex src() { 452 public TopologyVertex src() {
450 return () -> src; 453 return () -> src;
451 } 454 }
452 455
456 + @Override
453 public TopologyVertex dst() { 457 public TopologyVertex dst() {
454 return () -> dst; 458 return () -> dst;
455 } 459 }
...@@ -568,6 +572,12 @@ public class DefaultTopology extends AbstractModel implements Topology { ...@@ -568,6 +572,12 @@ public class DefaultTopology extends AbstractModel implements Topology {
568 private ImmutableSet<ConnectPoint> findInfrastructurePoints() { 572 private ImmutableSet<ConnectPoint> findInfrastructurePoints() {
569 ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder(); 573 ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder();
570 for (TopologyEdge edge : graph.getEdges()) { 574 for (TopologyEdge edge : graph.getEdges()) {
575 + if (edge.link().type() == Type.EDGE) {
576 + // exclude EDGE link from infrastructure link
577 + // - Device <-> Host
578 + // - Device <-> remote domain Device
579 + continue;
580 + }
571 builder.add(edge.link().src()); 581 builder.add(edge.link().src());
572 builder.add(edge.link().dst()); 582 builder.add(edge.link().dst());
573 } 583 }
......
...@@ -29,8 +29,8 @@ import org.apache.felix.scr.annotations.Service; ...@@ -29,8 +29,8 @@ import org.apache.felix.scr.annotations.Service;
29 import org.onosproject.event.AbstractListenerManager; 29 import org.onosproject.event.AbstractListenerManager;
30 import org.onosproject.net.ConnectPoint; 30 import org.onosproject.net.ConnectPoint;
31 import org.onosproject.net.DeviceId; 31 import org.onosproject.net.DeviceId;
32 +import org.onosproject.net.Link.Type;
32 import org.onosproject.net.device.DeviceEvent; 33 import org.onosproject.net.device.DeviceEvent;
33 -import org.onosproject.net.device.DeviceListener;
34 import org.onosproject.net.device.DeviceService; 34 import org.onosproject.net.device.DeviceService;
35 import org.onosproject.net.edge.EdgePortEvent; 35 import org.onosproject.net.edge.EdgePortEvent;
36 import org.onosproject.net.edge.EdgePortListener; 36 import org.onosproject.net.edge.EdgePortListener;
...@@ -38,12 +38,12 @@ import org.onosproject.net.edge.EdgePortService; ...@@ -38,12 +38,12 @@ import org.onosproject.net.edge.EdgePortService;
38 import org.onosproject.net.flow.DefaultTrafficTreatment; 38 import org.onosproject.net.flow.DefaultTrafficTreatment;
39 import org.onosproject.net.flow.TrafficTreatment; 39 import org.onosproject.net.flow.TrafficTreatment;
40 import org.onosproject.net.link.LinkEvent; 40 import org.onosproject.net.link.LinkEvent;
41 -import org.onosproject.net.link.LinkListener;
42 -import org.onosproject.net.link.LinkService;
43 import org.onosproject.net.packet.DefaultOutboundPacket; 41 import org.onosproject.net.packet.DefaultOutboundPacket;
44 import org.onosproject.net.packet.OutboundPacket; 42 import org.onosproject.net.packet.OutboundPacket;
45 import org.onosproject.net.packet.PacketService; 43 import org.onosproject.net.packet.PacketService;
46 import org.onosproject.net.topology.Topology; 44 import org.onosproject.net.topology.Topology;
45 +import org.onosproject.net.topology.TopologyEvent;
46 +import org.onosproject.net.topology.TopologyListener;
47 import org.onosproject.net.topology.TopologyService; 47 import org.onosproject.net.topology.TopologyService;
48 import org.slf4j.Logger; 48 import org.slf4j.Logger;
49 49
...@@ -72,11 +72,12 @@ public class EdgeManager ...@@ -72,11 +72,12 @@ public class EdgeManager
72 72
73 private Topology topology; 73 private Topology topology;
74 74
75 + /**
76 + * Set of edge ConnectPoints per Device.
77 + */
75 private final Map<DeviceId, Set<ConnectPoint>> connectionPoints = Maps.newConcurrentMap(); 78 private final Map<DeviceId, Set<ConnectPoint>> connectionPoints = Maps.newConcurrentMap();
76 79
77 - private final LinkListener linkListener = new InnerLinkListener(); 80 + private final TopologyListener topologyListener = new InnerTopologyListener();
78 -
79 - private final DeviceListener deviceListener = new InnerDeviceListener();
80 81
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 82 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected PacketService packetService; 83 protected PacketService packetService;
...@@ -87,23 +88,18 @@ public class EdgeManager ...@@ -87,23 +88,18 @@ public class EdgeManager
87 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
88 protected TopologyService topologyService; 89 protected TopologyService topologyService;
89 90
90 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 - protected LinkService linkService;
92 -
93 @Activate 91 @Activate
94 public void activate() { 92 public void activate() {
95 eventDispatcher.addSink(EdgePortEvent.class, listenerRegistry); 93 eventDispatcher.addSink(EdgePortEvent.class, listenerRegistry);
96 - deviceService.addListener(deviceListener); 94 + topologyService.addListener(topologyListener);
97 - linkService.addListener(linkListener);
98 loadAllEdgePorts(); 95 loadAllEdgePorts();
99 log.info("Started"); 96 log.info("Started");
100 } 97 }
101 98
102 @Deactivate 99 @Deactivate
103 public void deactivate() { 100 public void deactivate() {
101 + topologyService.removeListener(topologyListener);
104 eventDispatcher.removeSink(EdgePortEvent.class); 102 eventDispatcher.removeSink(EdgePortEvent.class);
105 - deviceService.removeListener(deviceListener);
106 - linkService.removeListener(linkListener);
107 log.info("Stopped"); 103 log.info("Stopped");
108 } 104 }
109 105
...@@ -153,21 +149,18 @@ public class EdgeManager ...@@ -153,21 +149,18 @@ public class EdgeManager
153 return new DefaultOutboundPacket(point.deviceId(), builder.build(), data); 149 return new DefaultOutboundPacket(point.deviceId(), builder.build(), data);
154 } 150 }
155 151
156 - private class InnerLinkListener implements LinkListener { 152 + private class InnerTopologyListener implements TopologyListener {
157 153
158 @Override 154 @Override
159 - public void event(LinkEvent event) { 155 + public void event(TopologyEvent event) {
160 - topology = topologyService.currentTopology(); 156 + topology = event.subject();
161 - processLinkEvent(event); 157 + event.reasons().forEach(reason -> {
162 - } 158 + if (reason instanceof DeviceEvent) {
159 + processDeviceEvent((DeviceEvent) reason);
160 + } else if (reason instanceof LinkEvent) {
161 + processLinkEvent((LinkEvent) reason);
163 } 162 }
164 - 163 + });
165 - private class InnerDeviceListener implements DeviceListener {
166 -
167 - @Override
168 - public void event(DeviceEvent event) {
169 - topology = topologyService.currentTopology();
170 - processDeviceEvent(event);
171 } 164 }
172 } 165 }
173 166
...@@ -180,12 +173,21 @@ public class EdgeManager ...@@ -180,12 +173,21 @@ public class EdgeManager
180 173
181 // Processes a link event by adding or removing its end-points in our cache. 174 // Processes a link event by adding or removing its end-points in our cache.
182 private void processLinkEvent(LinkEvent event) { 175 private void processLinkEvent(LinkEvent event) {
183 - if (event.type() == LinkEvent.Type.LINK_ADDED) { 176 + // negative Link event can result in increase of edge ports
184 - removeEdgePort(event.subject().src()); 177 + boolean addEdgePort = event.type() == LinkEvent.Type.LINK_REMOVED;
185 - removeEdgePort(event.subject().dst()); 178 +
186 - } else if (event.type() == LinkEvent.Type.LINK_REMOVED) { 179 + // but if the Link is an Edge type,
180 + // it will be the opposite
181 + if (event.subject().type() == Type.EDGE) {
182 + addEdgePort = !addEdgePort;
183 + }
184 +
185 + if (addEdgePort) {
187 addEdgePort(event.subject().src()); 186 addEdgePort(event.subject().src());
188 addEdgePort(event.subject().dst()); 187 addEdgePort(event.subject().dst());
188 + } else {
189 + removeEdgePort(event.subject().src());
190 + removeEdgePort(event.subject().dst());
189 } 191 }
190 } 192 }
191 193
...@@ -195,6 +197,8 @@ public class EdgeManager ...@@ -195,6 +197,8 @@ public class EdgeManager
195 DeviceEvent.Type type = event.type(); 197 DeviceEvent.Type type = event.type();
196 DeviceId id = event.subject().id(); 198 DeviceId id = event.subject().id();
197 199
200 + // FIXME there's still chance that Topology and Device Service
201 + // view is out-of-sync
198 if (type == DEVICE_ADDED || 202 if (type == DEVICE_ADDED ||
199 type == DEVICE_AVAILABILITY_CHANGED && deviceService.isAvailable(id)) { 203 type == DEVICE_AVAILABILITY_CHANGED && deviceService.isAvailable(id)) {
200 // When device is added or becomes available, add all its ports 204 // When device is added or becomes available, add all its ports
...@@ -202,10 +206,11 @@ public class EdgeManager ...@@ -202,10 +206,11 @@ public class EdgeManager
202 .forEach(p -> addEdgePort(new ConnectPoint(id, p.number()))); 206 .forEach(p -> addEdgePort(new ConnectPoint(id, p.number())));
203 } else if (type == DEVICE_REMOVED || 207 } else if (type == DEVICE_REMOVED ||
204 type == DEVICE_AVAILABILITY_CHANGED && !deviceService.isAvailable(id)) { 208 type == DEVICE_AVAILABILITY_CHANGED && !deviceService.isAvailable(id)) {
205 - // When device is removed or becomes unavailable, remove all its ports 209 + // When device is removed or becomes unavailable, remove all its ports.
206 - deviceService.getPorts(event.subject().id()) 210 + // Note: cannot rely on Device subsystem, ports may be gone.
207 - .forEach(p -> removeEdgePort(new ConnectPoint(id, p.number()))); 211 + Optional.ofNullable(connectionPoints.remove(id))
208 - connectionPoints.remove(id); 212 + .orElse(ImmutableSet.of())
213 + .forEach(point -> post(new EdgePortEvent(EDGE_PORT_REMOVED, point)));
209 214
210 } else if (type == DeviceEvent.Type.PORT_ADDED || 215 } else if (type == DeviceEvent.Type.PORT_ADDED ||
211 type == PORT_UPDATED && event.port().isEnabled()) { 216 type == PORT_UPDATED && event.port().isEnabled()) {
...@@ -216,14 +221,16 @@ public class EdgeManager ...@@ -216,14 +221,16 @@ public class EdgeManager
216 } 221 }
217 } 222 }
218 223
224 + private boolean isEdgePort(ConnectPoint point) {
225 + return !topologyService.isInfrastructure(topology, point) &&
226 + !point.port().isLogical();
227 + }
228 +
219 // Adds the specified connection point to the edge points if needed. 229 // Adds the specified connection point to the edge points if needed.
220 private void addEdgePort(ConnectPoint point) { 230 private void addEdgePort(ConnectPoint point) {
221 - if (!topologyService.isInfrastructure(topology, point) && !point.port().isLogical()) { 231 + if (isEdgePort(point)) {
222 - Set<ConnectPoint> set = connectionPoints.get(point.deviceId()); 232 + Set<ConnectPoint> set = connectionPoints.computeIfAbsent(point.deviceId(),
223 - if (set == null) { 233 + (k) -> Sets.newConcurrentHashSet());
224 - set = Sets.newConcurrentHashSet();
225 - connectionPoints.put(point.deviceId(), set);
226 - }
227 if (set.add(point)) { 234 if (set.add(point)) {
228 post(new EdgePortEvent(EDGE_PORT_ADDED, point)); 235 post(new EdgePortEvent(EDGE_PORT_ADDED, point));
229 } 236 }
...@@ -232,7 +239,7 @@ public class EdgeManager ...@@ -232,7 +239,7 @@ public class EdgeManager
232 239
233 // Removes the specified connection point from the edge points. 240 // Removes the specified connection point from the edge points.
234 private void removeEdgePort(ConnectPoint point) { 241 private void removeEdgePort(ConnectPoint point) {
235 - if (!point.port().isLogical()) { 242 + if (isEdgePort(point)) {
236 Set<ConnectPoint> set = connectionPoints.get(point.deviceId()); 243 Set<ConnectPoint> set = connectionPoints.get(point.deviceId());
237 if (set == null) { 244 if (set == null) {
238 return; 245 return;
...@@ -241,7 +248,13 @@ public class EdgeManager ...@@ -241,7 +248,13 @@ public class EdgeManager
241 post(new EdgePortEvent(EDGE_PORT_REMOVED, point)); 248 post(new EdgePortEvent(EDGE_PORT_REMOVED, point));
242 } 249 }
243 if (set.isEmpty()) { 250 if (set.isEmpty()) {
244 - connectionPoints.remove(point.deviceId()); 251 + connectionPoints.computeIfPresent(point.deviceId(), (k, v) -> {
252 + if (v.isEmpty()) {
253 + return v;
254 + } else {
255 + return v;
256 + }
257 + });
245 } 258 }
246 } 259 }
247 } 260 }
......
...@@ -15,13 +15,16 @@ ...@@ -15,13 +15,16 @@
15 */ 15 */
16 package org.onosproject.net.edgeservice.impl; 16 package org.onosproject.net.edgeservice.impl;
17 17
18 +import com.google.common.collect.ImmutableList;
18 import com.google.common.collect.Lists; 19 import com.google.common.collect.Lists;
19 import com.google.common.collect.Maps; 20 import com.google.common.collect.Maps;
20 import com.google.common.collect.Sets; 21 import com.google.common.collect.Sets;
22 +
21 import org.junit.After; 23 import org.junit.After;
22 import org.junit.Before; 24 import org.junit.Before;
23 import org.junit.Test; 25 import org.junit.Test;
24 import org.onosproject.common.event.impl.TestEventDispatcher; 26 import org.onosproject.common.event.impl.TestEventDispatcher;
27 +import org.onosproject.event.Event;
25 import org.onosproject.net.ConnectPoint; 28 import org.onosproject.net.ConnectPoint;
26 import org.onosproject.net.DefaultPort; 29 import org.onosproject.net.DefaultPort;
27 import org.onosproject.net.Device; 30 import org.onosproject.net.Device;
...@@ -36,11 +39,11 @@ import org.onosproject.net.edge.EdgePortEvent; ...@@ -36,11 +39,11 @@ import org.onosproject.net.edge.EdgePortEvent;
36 import org.onosproject.net.edge.EdgePortListener; 39 import org.onosproject.net.edge.EdgePortListener;
37 import org.onosproject.net.flow.TrafficTreatment; 40 import org.onosproject.net.flow.TrafficTreatment;
38 import org.onosproject.net.link.LinkEvent; 41 import org.onosproject.net.link.LinkEvent;
39 -import org.onosproject.net.link.LinkListener;
40 -import org.onosproject.net.link.LinkServiceAdapter;
41 import org.onosproject.net.packet.OutboundPacket; 42 import org.onosproject.net.packet.OutboundPacket;
42 import org.onosproject.net.packet.PacketServiceAdapter; 43 import org.onosproject.net.packet.PacketServiceAdapter;
43 import org.onosproject.net.topology.Topology; 44 import org.onosproject.net.topology.Topology;
45 +import org.onosproject.net.topology.TopologyEvent;
46 +import org.onosproject.net.topology.TopologyEvent.Type;
44 import org.onosproject.net.topology.TopologyListener; 47 import org.onosproject.net.topology.TopologyListener;
45 import org.onosproject.net.topology.TopologyServiceAdapter; 48 import org.onosproject.net.topology.TopologyServiceAdapter;
46 49
...@@ -52,6 +55,7 @@ import java.util.Map; ...@@ -52,6 +55,7 @@ import java.util.Map;
52 import java.util.Optional; 55 import java.util.Optional;
53 import java.util.Set; 56 import java.util.Set;
54 57
58 +import static org.hamcrest.Matchers.*;
55 import static org.junit.Assert.*; 59 import static org.junit.Assert.*;
56 import static org.onosproject.net.NetTestTools.injectEventDispatcher; 60 import static org.onosproject.net.NetTestTools.injectEventDispatcher;
57 import static org.onosproject.net.device.DeviceEvent.Type.*; 61 import static org.onosproject.net.device.DeviceEvent.Type.*;
...@@ -74,7 +78,6 @@ public class EdgeManagerTest { ...@@ -74,7 +78,6 @@ public class EdgeManagerTest {
74 private final Map<DeviceId, Device> devices = Maps.newConcurrentMap(); 78 private final Map<DeviceId, Device> devices = Maps.newConcurrentMap();
75 private Set<OutboundPacket> packets = Sets.newConcurrentHashSet(); 79 private Set<OutboundPacket> packets = Sets.newConcurrentHashSet();
76 private final EdgePortListener testListener = new TestListener(events); 80 private final EdgePortListener testListener = new TestListener(events);
77 - private TestLinkManager testLinkManager;
78 private TestDeviceManager testDeviceManager; 81 private TestDeviceManager testDeviceManager;
79 private TestTopologyManager testTopologyManager; 82 private TestTopologyManager testTopologyManager;
80 83
...@@ -87,8 +90,6 @@ public class EdgeManagerTest { ...@@ -87,8 +90,6 @@ public class EdgeManagerTest {
87 testDeviceManager = new TestDeviceManager(devices); 90 testDeviceManager = new TestDeviceManager(devices);
88 mgr.deviceService = testDeviceManager; 91 mgr.deviceService = testDeviceManager;
89 mgr.packetService = new TestPacketManager(); 92 mgr.packetService = new TestPacketManager();
90 - testLinkManager = new TestLinkManager();
91 - mgr.linkService = testLinkManager;
92 mgr.activate(); 93 mgr.activate();
93 mgr.addListener(testListener); 94 mgr.addListener(testListener);
94 95
...@@ -126,7 +127,7 @@ public class EdgeManagerTest { ...@@ -126,7 +127,7 @@ public class EdgeManagerTest {
126 ConnectPoint testPoint, referencePoint; 127 ConnectPoint testPoint, referencePoint;
127 128
128 //Testing link removal 129 //Testing link removal
129 - testLinkManager.listener.event(new LinkEvent(LINK_REMOVED, NetTestTools.link("a", 1, "b", 2))); 130 + postTopologyEvent(new LinkEvent(LINK_REMOVED, NetTestTools.link("a", 1, "b", 2)));
130 131
131 assertTrue("The list contained an unexpected number of events", events.size() == 2); 132 assertTrue("The list contained an unexpected number of events", events.size() == 2);
132 assertTrue("The first element is of the wrong type.", 133 assertTrue("The first element is of the wrong type.",
...@@ -147,12 +148,12 @@ public class EdgeManagerTest { ...@@ -147,12 +148,12 @@ public class EdgeManagerTest {
147 testPoint.deviceId().equals(referencePoint.deviceId())); 148 testPoint.deviceId().equals(referencePoint.deviceId()));
148 149
149 //Rebroadcast event to ensure it results in no additional events 150 //Rebroadcast event to ensure it results in no additional events
150 - testLinkManager.listener.event(new LinkEvent(LINK_REMOVED, NetTestTools.link("a", 1, "b", 2))); 151 + postTopologyEvent(new LinkEvent(LINK_REMOVED, NetTestTools.link("a", 1, "b", 2)));
151 assertTrue("The list contained an unexpected number of events", events.size() == 2); 152 assertTrue("The list contained an unexpected number of events", events.size() == 2);
152 153
153 //Testing link adding when links to remove exist 154 //Testing link adding when links to remove exist
154 events.clear(); 155 events.clear();
155 - testLinkManager.listener.event(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2))); 156 + postTopologyEvent(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2)));
156 157
157 assertTrue("The list contained an unexpected number of events", events.size() == 2); 158 assertTrue("The list contained an unexpected number of events", events.size() == 2);
158 assertTrue("The first element is of the wrong type.", 159 assertTrue("The first element is of the wrong type.",
...@@ -176,10 +177,11 @@ public class EdgeManagerTest { ...@@ -176,10 +177,11 @@ public class EdgeManagerTest {
176 177
177 //Apparent duplicate of previous method tests removal when the elements have already been removed 178 //Apparent duplicate of previous method tests removal when the elements have already been removed
178 events.clear(); 179 events.clear();
179 - testLinkManager.listener.event(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2))); 180 + postTopologyEvent(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2)));
180 assertTrue("The list should contain no events, the removed elements don't exist.", events.size() == 0); 181 assertTrue("The list should contain no events, the removed elements don't exist.", events.size() == 0);
181 } 182 }
182 183
184 +
183 @Test 185 @Test
184 public void testDeviceUpdates() { 186 public void testDeviceUpdates() {
185 //Setup 187 //Setup
...@@ -195,7 +197,7 @@ public class EdgeManagerTest { ...@@ -195,7 +197,7 @@ public class EdgeManagerTest {
195 referenceDevice = NetTestTools.device("1"); 197 referenceDevice = NetTestTools.device("1");
196 event = new DeviceEvent(DEVICE_ADDED, referenceDevice, 198 event = new DeviceEvent(DEVICE_ADDED, referenceDevice,
197 new DefaultPort(referenceDevice, PortNumber.portNumber(1), true)); 199 new DefaultPort(referenceDevice, PortNumber.portNumber(1), true));
198 - testDeviceManager.listener.event(event); 200 + postTopologyEvent(event);
199 201
200 //Check that ports were populated correctly 202 //Check that ports were populated correctly
201 assertTrue("Unexpected number of new ports added", 203 assertTrue("Unexpected number of new ports added",
...@@ -216,7 +218,7 @@ public class EdgeManagerTest { ...@@ -216,7 +218,7 @@ public class EdgeManagerTest {
216 events.clear(); 218 events.clear();
217 219
218 //Repost the event to test repeated posts 220 //Repost the event to test repeated posts
219 - testDeviceManager.listener.event(event); 221 + postTopologyEvent(event);
220 assertEquals("The redundant notification should not have created additional notifications.", 222 assertEquals("The redundant notification should not have created additional notifications.",
221 0, events.size()); 223 0, events.size());
222 //Calculate the size of the returned iterable of edge points. 224 //Calculate the size of the returned iterable of edge points.
...@@ -231,21 +233,21 @@ public class EdgeManagerTest { ...@@ -231,21 +233,21 @@ public class EdgeManagerTest {
231 events.clear(); 233 events.clear();
232 event = (new DeviceEvent(DEVICE_REMOVED, referenceDevice, 234 event = (new DeviceEvent(DEVICE_REMOVED, referenceDevice,
233 new DefaultPort(referenceDevice, PortNumber.portNumber(1), true))); 235 new DefaultPort(referenceDevice, PortNumber.portNumber(1), true)));
234 - testDeviceManager.listener.event(event); 236 + postTopologyEvent(event);
235 237
236 assertEquals("There should be five new events from removal of edge points", 238 assertEquals("There should be five new events from removal of edge points",
237 totalPorts - numInfraPorts, events.size()); 239 totalPorts - numInfraPorts, events.size());
238 for (int index = 0; index < events.size(); index++) { 240 for (int index = 0; index < events.size(); index++) {
239 //Assert that the correct port numbers were removed in the correct order 241 //Assert that the correct port numbers were removed in the correct order
240 - assertEquals("Port removed had unexpected port number.", 242 + assertThat("Port removed had unexpected port number.",
241 - events.get(index).subject().port(), 243 + events.get(index).subject().port().toLong(),
242 - (NetTestTools.connectPoint("a", index + numInfraPorts + 1).port())); 244 + is(greaterThanOrEqualTo((long) numInfraPorts)));
243 //Assert that the events are of the correct type 245 //Assert that the events are of the correct type
244 assertEquals("Unexpected type of event", events.get(index).type(), EDGE_PORT_REMOVED); 246 assertEquals("Unexpected type of event", events.get(index).type(), EDGE_PORT_REMOVED);
245 } 247 }
246 events.clear(); 248 events.clear();
247 //Rebroadcast event to check that it triggers no new behavior 249 //Rebroadcast event to check that it triggers no new behavior
248 - testDeviceManager.listener.event(event); 250 + postTopologyEvent(event);
249 assertEquals("Rebroadcast of removal event should not produce additional events", 251 assertEquals("Rebroadcast of removal event should not produce additional events",
250 0, events.size()); 252 0, events.size());
251 253
...@@ -256,14 +258,14 @@ public class EdgeManagerTest { ...@@ -256,14 +258,14 @@ public class EdgeManagerTest {
256 devices.put(referenceDevice.id(), referenceDevice); 258 devices.put(referenceDevice.id(), referenceDevice);
257 259
258 event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, referenceDevice); 260 event = new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, referenceDevice);
259 - testDeviceManager.listener.event(event); 261 + postTopologyEvent(event);
260 //An earlier setup set half of the reference device ports to infrastructure 262 //An earlier setup set half of the reference device ports to infrastructure
261 assertEquals("An unexpected number of events were generated.", totalPorts - numInfraPorts, events.size()); 263 assertEquals("An unexpected number of events were generated.", totalPorts - numInfraPorts, events.size());
262 for (int i = 0; i < 5; i++) { 264 for (int i = 0; i < 5; i++) {
263 assertEquals("The event was not of the right type", events.get(i).type(), EDGE_PORT_ADDED); 265 assertEquals("The event was not of the right type", events.get(i).type(), EDGE_PORT_ADDED);
264 } 266 }
265 events.clear(); 267 events.clear();
266 - testDeviceManager.listener.event(event); 268 + postTopologyEvent(event);
267 assertEquals("No events should have been generated for a set of existing ports.", 0, events.size()); 269 assertEquals("No events should have been generated for a set of existing ports.", 0, events.size());
268 270
269 //Test removal when state changes when the device becomes unavailable 271 //Test removal when state changes when the device becomes unavailable
...@@ -275,18 +277,20 @@ public class EdgeManagerTest { ...@@ -275,18 +277,20 @@ public class EdgeManagerTest {
275 no events will be generated since no ports will be provided in getPorts() to EdgeManager. 277 no events will be generated since no ports will be provided in getPorts() to EdgeManager.
276 */ 278 */
277 alwaysReturnPorts = true; 279 alwaysReturnPorts = true;
278 - testDeviceManager.listener.event(event); 280 + postTopologyEvent(event);
279 alwaysReturnPorts = false; 281 alwaysReturnPorts = false;
280 assertEquals("An unexpected number of events were created.", totalPorts - numInfraPorts, events.size()); 282 assertEquals("An unexpected number of events were created.", totalPorts - numInfraPorts, events.size());
281 for (int i = 0; i < 5; i++) { 283 for (int i = 0; i < 5; i++) {
282 EdgePortEvent edgeEvent = events.get(i); 284 EdgePortEvent edgeEvent = events.get(i);
283 assertEquals("The event is of an unexpected type.", 285 assertEquals("The event is of an unexpected type.",
284 EdgePortEvent.Type.EDGE_PORT_REMOVED, edgeEvent.type()); 286 EdgePortEvent.Type.EDGE_PORT_REMOVED, edgeEvent.type());
285 - assertEquals("The event pertains to an unexpected port", PortNumber.portNumber(i + numInfraPorts + 1), 287 + assertThat("The event pertains to an unexpected port",
286 - edgeEvent.subject().port()); 288 + edgeEvent.subject().port().toLong(),
289 + is(greaterThanOrEqualTo((long) numInfraPorts)));
287 } 290 }
288 } 291 }
289 292
293 +
290 @Test 294 @Test
291 public void testInternalCache() { 295 public void testInternalCache() {
292 int numDevices = 10; 296 int numDevices = 10;
...@@ -298,7 +302,7 @@ public class EdgeManagerTest { ...@@ -298,7 +302,7 @@ public class EdgeManagerTest {
298 for (int i = 0; i < numDevices; i++) { 302 for (int i = 0; i < numDevices; i++) {
299 Device newDevice = NetTestTools.device(Integer.toString(i)); 303 Device newDevice = NetTestTools.device(Integer.toString(i));
300 devices.put(newDevice.id(), newDevice); 304 devices.put(newDevice.id(), newDevice);
301 - testDeviceManager.listener.event(new DeviceEvent(DEVICE_ADDED, newDevice)); 305 + postTopologyEvent(new DeviceEvent(DEVICE_ADDED, newDevice));
302 } 306 }
303 //Check all ports have correct designations 307 //Check all ports have correct designations
304 ConnectPoint testPoint; 308 ConnectPoint testPoint;
...@@ -342,7 +346,7 @@ public class EdgeManagerTest { ...@@ -342,7 +346,7 @@ public class EdgeManagerTest {
342 } 346 }
343 for (int i = 0; i < numDevices; i++) { 347 for (int i = 0; i < numDevices; i++) {
344 referenceDevice = NetTestTools.device(Integer.toString(i)); 348 referenceDevice = NetTestTools.device(Integer.toString(i));
345 - testDeviceManager.listener.event(new DeviceEvent(DEVICE_ADDED, referenceDevice, 349 + postTopologyEvent(new DeviceEvent(DEVICE_ADDED, referenceDevice,
346 new DefaultPort(referenceDevice, 350 new DefaultPort(referenceDevice,
347 PortNumber.portNumber(1), 351 PortNumber.portNumber(1),
348 true))); 352 true)));
...@@ -373,6 +377,27 @@ public class EdgeManagerTest { ...@@ -373,6 +377,27 @@ public class EdgeManagerTest {
373 377
374 378
375 /** 379 /**
380 + * Creates TopologyEvent triggered by {@code event}.
381 + *
382 + * @param event reason of the TopologyEvent
383 + * @return TopologyEvent
384 + */
385 + private TopologyEvent topologyEventOf(Event event) {
386 + return new TopologyEvent(Type.TOPOLOGY_CHANGED, null, ImmutableList.of(event));
387 + }
388 +
389 +
390 + /**
391 + * Post Event dispatched from TopologyManager.
392 + *
393 + * @param event Event
394 + */
395 + private void postTopologyEvent(Event event) {
396 + testTopologyManager.listener.event(topologyEventOf(event));
397 + }
398 +
399 +
400 + /**
376 * @param numDevices the number of devices to populate. 401 * @param numDevices the number of devices to populate.
377 * @param numInfraPorts the number of ports to be set as infrastructure on each device, numbered base 0, ports 0 402 * @param numInfraPorts the number of ports to be set as infrastructure on each device, numbered base 0, ports 0
378 * through numInfraPorts - 1 403 * through numInfraPorts - 1
...@@ -493,15 +518,6 @@ public class EdgeManagerTest { ...@@ -493,15 +518,6 @@ public class EdgeManagerTest {
493 } 518 }
494 } 519 }
495 520
496 - private class TestLinkManager extends LinkServiceAdapter {
497 - private LinkListener listener;
498 -
499 - @Override
500 - public void addListener(LinkListener listener) {
501 - this.listener = listener;
502 - }
503 - }
504 -
505 private class TestListener implements EdgePortListener { 521 private class TestListener implements EdgePortListener {
506 private List<EdgePortEvent> events; 522 private List<EdgePortEvent> events;
507 523
......