Jonathan Hart
Committed by Gerrit Code Review

Probe immediately when IPs are added to host monitor

rather than waiting for the next polling cycle.

Change-Id: Iffaf50f7a589b52be659b82b8a289e04a5de4ca6
...@@ -107,6 +107,7 @@ public class HostMonitor implements TimerTask { ...@@ -107,6 +107,7 @@ public class HostMonitor implements TimerTask {
107 */ 107 */
108 void addMonitoringFor(IpAddress ip) { 108 void addMonitoringFor(IpAddress ip) {
109 monitoredAddresses.add(ip); 109 monitoredAddresses.add(ip);
110 + probe(ip);
110 } 111 }
111 112
112 /** 113 /**
...@@ -151,7 +152,14 @@ public class HostMonitor implements TimerTask { ...@@ -151,7 +152,14 @@ public class HostMonitor implements TimerTask {
151 152
152 @Override 153 @Override
153 public void run(Timeout timeout) throws Exception { 154 public void run(Timeout timeout) throws Exception {
154 - for (IpAddress ip : monitoredAddresses) { 155 + monitoredAddresses.forEach(this::probe);
156 +
157 + synchronized (this) {
158 + this.timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
159 + }
160 + }
161 +
162 + private void probe(IpAddress ip) {
155 Set<Host> hosts = hostManager.getHostsByIp(ip); 163 Set<Host> hosts = hostManager.getHostsByIp(ip);
156 164
157 if (hosts.isEmpty()) { 165 if (hosts.isEmpty()) {
...@@ -168,11 +176,6 @@ public class HostMonitor implements TimerTask { ...@@ -168,11 +176,6 @@ public class HostMonitor implements TimerTask {
168 } 176 }
169 } 177 }
170 178
171 - synchronized (this) {
172 - this.timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
173 - }
174 - }
175 -
176 /** 179 /**
177 * Sends an ARP or NDP request for the given IP address. 180 * Sends an ARP or NDP request for the given IP address.
178 * 181 *
......
...@@ -35,10 +35,8 @@ import org.onosproject.net.ConnectPoint; ...@@ -35,10 +35,8 @@ import org.onosproject.net.ConnectPoint;
35 import org.onosproject.net.Device; 35 import org.onosproject.net.Device;
36 import org.onosproject.net.DeviceId; 36 import org.onosproject.net.DeviceId;
37 import org.onosproject.net.Host; 37 import org.onosproject.net.Host;
38 -import org.onosproject.net.MastershipRole;
39 import org.onosproject.net.Port; 38 import org.onosproject.net.Port;
40 import org.onosproject.net.PortNumber; 39 import org.onosproject.net.PortNumber;
41 -import org.onosproject.net.device.DeviceListener;
42 import org.onosproject.net.device.DeviceServiceAdapter; 40 import org.onosproject.net.device.DeviceServiceAdapter;
43 import org.onosproject.net.edge.EdgePortService; 41 import org.onosproject.net.edge.EdgePortService;
44 import org.onosproject.net.flow.instructions.Instruction; 42 import org.onosproject.net.flow.instructions.Instruction;
...@@ -101,56 +99,37 @@ public class HostMonitorTest { ...@@ -101,56 +99,37 @@ public class HostMonitorTest {
101 99
102 @Test 100 @Test
103 public void testMonitorIpv4HostExists() throws Exception { 101 public void testMonitorIpv4HostExists() throws Exception {
104 - ProviderId id = new ProviderId("fake://", "id"); 102 + testMonitorHostExists(TARGET_IPV4_ADDR);
105 -
106 - Host host = createMock(Host.class);
107 - expect(host.providerId()).andReturn(id);
108 - replay(host);
109 -
110 - HostManager hostManager = createMock(HostManager.class);
111 - expect(hostManager.getHostsByIp(TARGET_IPV4_ADDR))
112 - .andReturn(Collections.singleton(host));
113 - replay(hostManager);
114 -
115 - HostProvider hostProvider = createMock(HostProvider.class);
116 - expect(hostProvider.id()).andReturn(id).anyTimes();
117 - hostProvider.triggerProbe(host);
118 - expectLastCall().once();
119 - replay(hostProvider);
120 -
121 - hostMonitor = new HostMonitor(null, hostManager, null, edgePortService);
122 -
123 - hostMonitor.registerHostProvider(hostProvider);
124 - hostMonitor.addMonitoringFor(TARGET_IPV4_ADDR);
125 -
126 - hostMonitor.run(null);
127 -
128 - verify(hostProvider);
129 } 103 }
130 104
131 @Test 105 @Test
132 public void testMonitorIpv6HostExists() throws Exception { 106 public void testMonitorIpv6HostExists() throws Exception {
107 + testMonitorHostExists(TARGET_IPV6_ADDR);
108 + }
109 +
110 + private void testMonitorHostExists(IpAddress hostIp) throws Exception {
133 ProviderId id = new ProviderId("fake://", "id"); 111 ProviderId id = new ProviderId("fake://", "id");
134 112
135 Host host = createMock(Host.class); 113 Host host = createMock(Host.class);
136 - expect(host.providerId()).andReturn(id); 114 + expect(host.providerId()).andReturn(id).anyTimes();
137 replay(host); 115 replay(host);
138 116
139 HostManager hostManager = createMock(HostManager.class); 117 HostManager hostManager = createMock(HostManager.class);
140 - expect(hostManager.getHostsByIp(TARGET_IPV6_ADDR)) 118 + expect(hostManager.getHostsByIp(hostIp))
141 - .andReturn(Collections.singleton(host)); 119 + .andReturn(Collections.singleton(host))
120 + .anyTimes();
142 replay(hostManager); 121 replay(hostManager);
143 122
144 HostProvider hostProvider = createMock(HostProvider.class); 123 HostProvider hostProvider = createMock(HostProvider.class);
145 expect(hostProvider.id()).andReturn(id).anyTimes(); 124 expect(hostProvider.id()).andReturn(id).anyTimes();
146 hostProvider.triggerProbe(host); 125 hostProvider.triggerProbe(host);
147 - expectLastCall().once(); 126 + expectLastCall().times(2);
148 replay(hostProvider); 127 replay(hostProvider);
149 128
150 hostMonitor = new HostMonitor(null, hostManager, null, edgePortService); 129 hostMonitor = new HostMonitor(null, hostManager, null, edgePortService);
151 130
152 hostMonitor.registerHostProvider(hostProvider); 131 hostMonitor.registerHostProvider(hostProvider);
153 - hostMonitor.addMonitoringFor(TARGET_IPV6_ADDR); 132 + hostMonitor.addMonitoringFor(hostIp);
154 133
155 hostMonitor.run(null); 134 hostMonitor.run(null);
156 135
...@@ -202,7 +181,7 @@ public class HostMonitorTest { ...@@ -202,7 +181,7 @@ public class HostMonitorTest {
202 181
203 // Check that a packet was sent to our PacketService and that it has 182 // Check that a packet was sent to our PacketService and that it has
204 // the properties we expect 183 // the properties we expect
205 - assertEquals(1, packetService.packets.size()); 184 + assertEquals(2, packetService.packets.size());
206 OutboundPacket packet = packetService.packets.get(0); 185 OutboundPacket packet = packetService.packets.get(0);
207 186
208 // Check the output port is correct 187 // Check the output port is correct
...@@ -271,7 +250,7 @@ public class HostMonitorTest { ...@@ -271,7 +250,7 @@ public class HostMonitorTest {
271 250
272 // Check that a packet was sent to our PacketService and that it has 251 // Check that a packet was sent to our PacketService and that it has
273 // the properties we expect 252 // the properties we expect
274 - assertEquals(1, packetService.packets.size()); 253 + assertEquals(2, packetService.packets.size());
275 OutboundPacket packet = packetService.packets.get(0); 254 OutboundPacket packet = packetService.packets.get(0);
276 255
277 // Check the output port is correct 256 // Check the output port is correct
...@@ -342,7 +321,7 @@ public class HostMonitorTest { ...@@ -342,7 +321,7 @@ public class HostMonitorTest {
342 321
343 // Check that a packet was sent to our PacketService and that it has 322 // Check that a packet was sent to our PacketService and that it has
344 // the properties we expect 323 // the properties we expect
345 - assertEquals(1, packetService.packets.size()); 324 + assertEquals(2, packetService.packets.size());
346 OutboundPacket packet = packetService.packets.get(0); 325 OutboundPacket packet = packetService.packets.get(0);
347 326
348 // Check the output port is correct 327 // Check the output port is correct
...@@ -412,7 +391,7 @@ public class HostMonitorTest { ...@@ -412,7 +391,7 @@ public class HostMonitorTest {
412 391
413 // Check that a packet was sent to our PacketService and that it has 392 // Check that a packet was sent to our PacketService and that it has
414 // the properties we expect 393 // the properties we expect
415 - assertEquals(1, packetService.packets.size()); 394 + assertEquals(2, packetService.packets.size());
416 OutboundPacket packet = packetService.packets.get(0); 395 OutboundPacket packet = packetService.packets.get(0);
417 396
418 // Check the output port is correct 397 // Check the output port is correct
...@@ -460,26 +439,11 @@ public class HostMonitorTest { ...@@ -460,26 +439,11 @@ public class HostMonitorTest {
460 } 439 }
461 440
462 @Override 441 @Override
463 - public int getDeviceCount() {
464 - return 0;
465 - }
466 -
467 - @Override
468 public Iterable<Device> getDevices() { 442 public Iterable<Device> getDevices() {
469 return devices; 443 return devices;
470 } 444 }
471 445
472 @Override 446 @Override
473 - public Device getDevice(DeviceId deviceId) {
474 - return null;
475 - }
476 -
477 - @Override
478 - public MastershipRole getRole(DeviceId deviceId) {
479 - return null;
480 - }
481 -
482 - @Override
483 public List<Port> getPorts(DeviceId deviceId) { 447 public List<Port> getPorts(DeviceId deviceId) {
484 List<Port> ports = Lists.newArrayList(); 448 List<Port> ports = Lists.newArrayList();
485 for (Port p : devicePorts.get(deviceId)) { 449 for (Port p : devicePorts.get(deviceId)) {
...@@ -487,23 +451,5 @@ public class HostMonitorTest { ...@@ -487,23 +451,5 @@ public class HostMonitorTest {
487 } 451 }
488 return ports; 452 return ports;
489 } 453 }
490 -
491 - @Override
492 - public Port getPort(DeviceId deviceId, PortNumber portNumber) {
493 - return null;
494 - }
495 -
496 - @Override
497 - public boolean isAvailable(DeviceId deviceId) {
498 - return false;
499 - }
500 -
501 - @Override
502 - public void addListener(DeviceListener listener) {
503 - }
504 -
505 - @Override
506 - public void removeListener(DeviceListener listener) {
507 - }
508 } 454 }
509 } 455 }
......