Committed by
Gerrit Code Review
Changed ProxyArpManager to make use of EdgeManager.
Change-Id: I05193146490aba6736c1815bf0d9022df8628973
Showing
3 changed files
with
81 additions
and
25 deletions
| ... | @@ -174,6 +174,8 @@ public class EdgeManager implements EdgePortService { | ... | @@ -174,6 +174,8 @@ public class EdgeManager implements EdgePortService { |
| 174 | } | 174 | } |
| 175 | }); | 175 | }); |
| 176 | } else { | 176 | } else { |
| 177 | + //FIXME special case of preexisting edgeport & no triggerless events could cause this to never hit and | ||
| 178 | + //never discover an edgeport that should have been discovered. | ||
| 177 | loadAllEdgePorts(); | 179 | loadAllEdgePorts(); |
| 178 | } | 180 | } |
| 179 | } | 181 | } |
| ... | @@ -198,6 +200,7 @@ public class EdgeManager implements EdgePortService { | ... | @@ -198,6 +200,7 @@ public class EdgeManager implements EdgePortService { |
| 198 | 200 | ||
| 199 | // Processes a device event by adding or removing its end-points in our cache. | 201 | // Processes a device event by adding or removing its end-points in our cache. |
| 200 | private void processDeviceEvent(DeviceEvent event) { | 202 | private void processDeviceEvent(DeviceEvent event) { |
| 203 | + //FIXME handle the case where a device is suspended, this may or may not come up | ||
| 201 | DeviceEvent.Type type = event.type(); | 204 | DeviceEvent.Type type = event.type(); |
| 202 | DeviceId id = event.subject().id(); | 205 | DeviceId id = event.subject().id(); |
| 203 | 206 | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.proxyarp.impl; | 16 | package org.onosproject.net.proxyarp.impl; |
| 17 | 17 | ||
| 18 | +import com.google.common.collect.Lists; | ||
| 18 | import com.google.common.collect.Sets; | 19 | import com.google.common.collect.Sets; |
| 19 | import org.junit.Before; | 20 | import org.junit.Before; |
| 20 | import org.junit.Test; | 21 | import org.junit.Test; |
| ... | @@ -36,6 +37,7 @@ import org.onosproject.net.Port; | ... | @@ -36,6 +37,7 @@ import org.onosproject.net.Port; |
| 36 | import org.onosproject.net.PortNumber; | 37 | import org.onosproject.net.PortNumber; |
| 37 | import org.onosproject.net.device.DeviceListener; | 38 | import org.onosproject.net.device.DeviceListener; |
| 38 | import org.onosproject.net.device.DeviceService; | 39 | import org.onosproject.net.device.DeviceService; |
| 40 | +import org.onosproject.net.edgeservice.impl.EdgeManager; | ||
| 39 | import org.onosproject.net.flow.instructions.Instruction; | 41 | import org.onosproject.net.flow.instructions.Instruction; |
| 40 | import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; | 42 | import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; |
| 41 | import org.onosproject.net.host.HostService; | 43 | import org.onosproject.net.host.HostService; |
| ... | @@ -53,8 +55,14 @@ import java.util.Comparator; | ... | @@ -53,8 +55,14 @@ import java.util.Comparator; |
| 53 | import java.util.List; | 55 | import java.util.List; |
| 54 | import java.util.Set; | 56 | import java.util.Set; |
| 55 | 57 | ||
| 56 | -import static org.easymock.EasyMock.*; | 58 | +import static org.easymock.EasyMock.anyObject; |
| 57 | -import static org.junit.Assert.*; | 59 | +import static org.easymock.EasyMock.createMock; |
| 60 | +import static org.easymock.EasyMock.expect; | ||
| 61 | +import static org.easymock.EasyMock.replay; | ||
| 62 | +import static org.junit.Assert.assertArrayEquals; | ||
| 63 | +import static org.junit.Assert.assertEquals; | ||
| 64 | +import static org.junit.Assert.assertFalse; | ||
| 65 | +import static org.junit.Assert.assertTrue; | ||
| 58 | 66 | ||
| 59 | /** | 67 | /** |
| 60 | * Tests for the {@link ProxyArpManager} class. | 68 | * Tests for the {@link ProxyArpManager} class. |
| ... | @@ -85,6 +93,11 @@ public class ProxyArpManagerTest { | ... | @@ -85,6 +93,11 @@ public class ProxyArpManagerTest { |
| 85 | private static final HostLocation LOC2 = new HostLocation(DID2, P1, 123L); | 93 | private static final HostLocation LOC2 = new HostLocation(DID2, P1, 123L); |
| 86 | private static final byte[] ZERO_MAC_ADDRESS = MacAddress.ZERO.toBytes(); | 94 | private static final byte[] ZERO_MAC_ADDRESS = MacAddress.ZERO.toBytes(); |
| 87 | 95 | ||
| 96 | + //Return values used for various functions of the TestPacketService inner class. | ||
| 97 | + private boolean isEdgePointReturn; | ||
| 98 | + private List<ConnectPoint> getEdgePointsNoArg; | ||
| 99 | + | ||
| 100 | + | ||
| 88 | private ProxyArpManager proxyArp; | 101 | private ProxyArpManager proxyArp; |
| 89 | 102 | ||
| 90 | private TestPacketService packetService; | 103 | private TestPacketService packetService; |
| ... | @@ -98,6 +111,8 @@ public class ProxyArpManagerTest { | ... | @@ -98,6 +111,8 @@ public class ProxyArpManagerTest { |
| 98 | packetService = new TestPacketService(); | 111 | packetService = new TestPacketService(); |
| 99 | proxyArp.packetService = packetService; | 112 | proxyArp.packetService = packetService; |
| 100 | 113 | ||
| 114 | + proxyArp.edgeService = new TestEdgePortService(); | ||
| 115 | + | ||
| 101 | // Create a host service mock here. Must be replayed by tests once the | 116 | // Create a host service mock here. Must be replayed by tests once the |
| 102 | // expectations have been set up | 117 | // expectations have been set up |
| 103 | hostService = createMock(HostService.class); | 118 | hostService = createMock(HostService.class); |
| ... | @@ -112,7 +127,7 @@ public class ProxyArpManagerTest { | ... | @@ -112,7 +127,7 @@ public class ProxyArpManagerTest { |
| 112 | 127 | ||
| 113 | /** | 128 | /** |
| 114 | * Creates a fake topology to feed into the ARP module. | 129 | * Creates a fake topology to feed into the ARP module. |
| 115 | - * <p/> | 130 | + * <p> |
| 116 | * The default topology is a unidirectional ring topology. Each switch has | 131 | * The default topology is a unidirectional ring topology. Each switch has |
| 117 | * 3 ports. Ports 2 and 3 have the links to neighbor switches, and port 1 | 132 | * 3 ports. Ports 2 and 3 have the links to neighbor switches, and port 1 |
| 118 | * is free (edge port). | 133 | * is free (edge port). |
| ... | @@ -205,12 +220,12 @@ public class ProxyArpManagerTest { | ... | @@ -205,12 +220,12 @@ public class ProxyArpManagerTest { |
| 205 | InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2); | 220 | InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2); |
| 206 | PortAddresses pa1 = | 221 | PortAddresses pa1 = |
| 207 | new PortAddresses(cp, Sets.newHashSet(ia1), | 222 | new PortAddresses(cp, Sets.newHashSet(ia1), |
| 208 | - MacAddress.valueOf(2 * i - 1), | 223 | + MacAddress.valueOf(2 * i - 1), |
| 209 | - VlanId.vlanId((short) 1)); | 224 | + VlanId.vlanId((short) 1)); |
| 210 | PortAddresses pa2 = | 225 | PortAddresses pa2 = |
| 211 | new PortAddresses(cp, Sets.newHashSet(ia2), | 226 | new PortAddresses(cp, Sets.newHashSet(ia2), |
| 212 | - MacAddress.valueOf(2 * i), | 227 | + MacAddress.valueOf(2 * i), |
| 213 | - VlanId.NONE); | 228 | + VlanId.NONE); |
| 214 | 229 | ||
| 215 | addresses.add(pa1); | 230 | addresses.add(pa1); |
| 216 | addresses.add(pa2); | 231 | addresses.add(pa2); |
| ... | @@ -223,7 +238,7 @@ public class ProxyArpManagerTest { | ... | @@ -223,7 +238,7 @@ public class ProxyArpManagerTest { |
| 223 | 238 | ||
| 224 | for (int i = 1; i <= NUM_FLOOD_PORTS; i++) { | 239 | for (int i = 1; i <= NUM_FLOOD_PORTS; i++) { |
| 225 | ConnectPoint cp = new ConnectPoint(getDeviceId(i + NUM_ADDRESS_PORTS), | 240 | ConnectPoint cp = new ConnectPoint(getDeviceId(i + NUM_ADDRESS_PORTS), |
| 226 | - P1); | 241 | + P1); |
| 227 | expect(hostService.getAddressBindingsForPort(cp)) | 242 | expect(hostService.getAddressBindingsForPort(cp)) |
| 228 | .andReturn(Collections.<PortAddresses>emptySet()).anyTimes(); | 243 | .andReturn(Collections.<PortAddresses>emptySet()).anyTimes(); |
| 229 | } | 244 | } |
| ... | @@ -266,11 +281,14 @@ public class ProxyArpManagerTest { | ... | @@ -266,11 +281,14 @@ public class ProxyArpManagerTest { |
| 266 | */ | 281 | */ |
| 267 | @Test | 282 | @Test |
| 268 | public void testReplyKnown() { | 283 | public void testReplyKnown() { |
| 284 | + //Set the return value of isEdgePoint from the edgemanager. | ||
| 285 | + isEdgePointReturn = true; | ||
| 286 | + | ||
| 269 | Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN1, getLocation(4), | 287 | Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN1, getLocation(4), |
| 270 | - Collections.singleton(IP1)); | 288 | + Collections.singleton(IP1)); |
| 271 | 289 | ||
| 272 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), | 290 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), |
| 273 | - Collections.singleton(IP2)); | 291 | + Collections.singleton(IP2)); |
| 274 | 292 | ||
| 275 | expect(hostService.getHostsByIp(IP1)) | 293 | expect(hostService.getHostsByIp(IP1)) |
| 276 | .andReturn(Collections.singleton(replyer)); | 294 | .andReturn(Collections.singleton(replyer)); |
| ... | @@ -294,17 +312,25 @@ public class ProxyArpManagerTest { | ... | @@ -294,17 +312,25 @@ public class ProxyArpManagerTest { |
| 294 | */ | 312 | */ |
| 295 | @Test | 313 | @Test |
| 296 | public void testReplyUnknown() { | 314 | public void testReplyUnknown() { |
| 315 | + isEdgePointReturn = true; | ||
| 316 | + | ||
| 297 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), | 317 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), |
| 298 | - Collections.singleton(IP2)); | 318 | + Collections.singleton(IP2)); |
| 299 | 319 | ||
| 300 | expect(hostService.getHostsByIp(IP1)) | 320 | expect(hostService.getHostsByIp(IP1)) |
| 301 | .andReturn(Collections.<Host>emptySet()); | 321 | .andReturn(Collections.<Host>emptySet()); |
| 302 | expect(hostService.getHost(HID2)).andReturn(requestor); | 322 | expect(hostService.getHost(HID2)).andReturn(requestor); |
| 303 | 323 | ||
| 324 | + | ||
| 304 | replay(hostService); | 325 | replay(hostService); |
| 305 | 326 | ||
| 306 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1); | 327 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1); |
| 307 | 328 | ||
| 329 | + //Setup the set of edge ports to be used in the reply method | ||
| 330 | + getEdgePointsNoArg = Lists.newLinkedList(); | ||
| 331 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1))); | ||
| 332 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1))); | ||
| 333 | + | ||
| 308 | proxyArp.reply(arpRequest, getLocation(6)); | 334 | proxyArp.reply(arpRequest, getLocation(6)); |
| 309 | 335 | ||
| 310 | verifyFlood(arpRequest); | 336 | verifyFlood(arpRequest); |
| ... | @@ -318,11 +344,12 @@ public class ProxyArpManagerTest { | ... | @@ -318,11 +344,12 @@ public class ProxyArpManagerTest { |
| 318 | */ | 344 | */ |
| 319 | @Test | 345 | @Test |
| 320 | public void testReplyDifferentVlan() { | 346 | public void testReplyDifferentVlan() { |
| 347 | + | ||
| 321 | Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN2, getLocation(4), | 348 | Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN2, getLocation(4), |
| 322 | - Collections.singleton(IP1)); | 349 | + Collections.singleton(IP1)); |
| 323 | 350 | ||
| 324 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), | 351 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5), |
| 325 | - Collections.singleton(IP2)); | 352 | + Collections.singleton(IP2)); |
| 326 | 353 | ||
| 327 | expect(hostService.getHostsByIp(IP1)) | 354 | expect(hostService.getHostsByIp(IP1)) |
| 328 | .andReturn(Collections.singleton(replyer)); | 355 | .andReturn(Collections.singleton(replyer)); |
| ... | @@ -332,6 +359,10 @@ public class ProxyArpManagerTest { | ... | @@ -332,6 +359,10 @@ public class ProxyArpManagerTest { |
| 332 | 359 | ||
| 333 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1); | 360 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1); |
| 334 | 361 | ||
| 362 | + //Setup for flood test | ||
| 363 | + getEdgePointsNoArg = Lists.newLinkedList(); | ||
| 364 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1))); | ||
| 365 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1))); | ||
| 335 | proxyArp.reply(arpRequest, getLocation(6)); | 366 | proxyArp.reply(arpRequest, getLocation(6)); |
| 336 | 367 | ||
| 337 | verifyFlood(arpRequest); | 368 | verifyFlood(arpRequest); |
| ... | @@ -346,13 +377,13 @@ public class ProxyArpManagerTest { | ... | @@ -346,13 +377,13 @@ public class ProxyArpManagerTest { |
| 346 | MacAddress secondMac = MacAddress.valueOf(2L); | 377 | MacAddress secondMac = MacAddress.valueOf(2L); |
| 347 | 378 | ||
| 348 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC1, | 379 | Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC1, |
| 349 | - Collections.singleton(theirIp)); | 380 | + Collections.singleton(theirIp)); |
| 350 | 381 | ||
| 351 | expect(hostService.getHost(HID2)).andReturn(requestor); | 382 | expect(hostService.getHost(HID2)).andReturn(requestor); |
| 352 | replay(hostService); | 383 | replay(hostService); |
| 353 | 384 | ||
| 354 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, theirIp, ourFirstIp); | 385 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, theirIp, ourFirstIp); |
| 355 | - | 386 | + isEdgePointReturn = true; |
| 356 | proxyArp.reply(arpRequest, LOC1); | 387 | proxyArp.reply(arpRequest, LOC1); |
| 357 | 388 | ||
| 358 | assertEquals(1, packetService.packets.size()); | 389 | assertEquals(1, packetService.packets.size()); |
| ... | @@ -378,7 +409,7 @@ public class ProxyArpManagerTest { | ... | @@ -378,7 +409,7 @@ public class ProxyArpManagerTest { |
| 378 | 409 | ||
| 379 | // Request for a valid external IP address but coming in the wrong port | 410 | // Request for a valid external IP address but coming in the wrong port |
| 380 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC1, null, theirIp, | 411 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC1, null, theirIp, |
| 381 | - Ip4Address.valueOf("10.0.3.1")); | 412 | + Ip4Address.valueOf("10.0.3.1")); |
| 382 | proxyArp.reply(arpRequest, LOC1); | 413 | proxyArp.reply(arpRequest, LOC1); |
| 383 | assertEquals(0, packetService.packets.size()); | 414 | assertEquals(0, packetService.packets.size()); |
| 384 | 415 | ||
| ... | @@ -402,8 +433,10 @@ public class ProxyArpManagerTest { | ... | @@ -402,8 +433,10 @@ public class ProxyArpManagerTest { |
| 402 | // This is a request from something inside our network (like a BGP | 433 | // This is a request from something inside our network (like a BGP |
| 403 | // daemon) to an external host. | 434 | // daemon) to an external host. |
| 404 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, ourMac, null, ourIp, theirIp); | 435 | Ethernet arpRequest = buildArp(ARP.OP_REQUEST, ourMac, null, ourIp, theirIp); |
| 405 | - proxyArp.reply(arpRequest, getLocation(5)); | 436 | + //Ensure the packet is allowed through (it is not to an internal port) |
| 437 | + isEdgePointReturn = true; | ||
| 406 | 438 | ||
| 439 | + proxyArp.reply(arpRequest, getLocation(5)); | ||
| 407 | assertEquals(1, packetService.packets.size()); | 440 | assertEquals(1, packetService.packets.size()); |
| 408 | verifyPacketOut(arpRequest, getLocation(1), packetService.packets.get(0)); | 441 | verifyPacketOut(arpRequest, getLocation(1), packetService.packets.get(0)); |
| 409 | 442 | ||
| ... | @@ -421,7 +454,7 @@ public class ProxyArpManagerTest { | ... | @@ -421,7 +454,7 @@ public class ProxyArpManagerTest { |
| 421 | @Test | 454 | @Test |
| 422 | public void testForwardToHost() { | 455 | public void testForwardToHost() { |
| 423 | Host host1 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1, | 456 | Host host1 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1, |
| 424 | - Collections.singleton(IP1)); | 457 | + Collections.singleton(IP1)); |
| 425 | 458 | ||
| 426 | expect(hostService.getHost(HID1)).andReturn(host1); | 459 | expect(hostService.getHost(HID1)).andReturn(host1); |
| 427 | replay(hostService); | 460 | replay(hostService); |
| ... | @@ -448,6 +481,13 @@ public class ProxyArpManagerTest { | ... | @@ -448,6 +481,13 @@ public class ProxyArpManagerTest { |
| 448 | 481 | ||
| 449 | Ethernet arpRequest = buildArp(ARP.OP_REPLY, MAC2, MAC1, IP2, IP1); | 482 | Ethernet arpRequest = buildArp(ARP.OP_REPLY, MAC2, MAC1, IP2, IP1); |
| 450 | 483 | ||
| 484 | + //populate the list of edges when so that when forward hits flood in the manager it contains the values | ||
| 485 | + //that should continue on | ||
| 486 | + getEdgePointsNoArg = Lists.newLinkedList(); | ||
| 487 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("3"), PortNumber.portNumber(1))); | ||
| 488 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1))); | ||
| 489 | + getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1))); | ||
| 490 | + | ||
| 451 | proxyArp.forward(arpRequest, getLocation(6)); | 491 | proxyArp.forward(arpRequest, getLocation(6)); |
| 452 | 492 | ||
| 453 | verifyFlood(arpRequest); | 493 | verifyFlood(arpRequest); |
| ... | @@ -464,17 +504,17 @@ public class ProxyArpManagerTest { | ... | @@ -464,17 +504,17 @@ public class ProxyArpManagerTest { |
| 464 | assertEquals(NUM_FLOOD_PORTS - 1, packetService.packets.size()); | 504 | assertEquals(NUM_FLOOD_PORTS - 1, packetService.packets.size()); |
| 465 | 505 | ||
| 466 | Collections.sort(packetService.packets, | 506 | Collections.sort(packetService.packets, |
| 467 | - new Comparator<OutboundPacket>() { | 507 | + new Comparator<OutboundPacket>() { |
| 468 | - @Override | 508 | + @Override |
| 469 | - public int compare(OutboundPacket o1, OutboundPacket o2) { | 509 | + public int compare(OutboundPacket o1, OutboundPacket o2) { |
| 470 | - return o1.sendThrough().uri().compareTo(o2.sendThrough().uri()); | 510 | + return o1.sendThrough().uri().compareTo(o2.sendThrough().uri()); |
| 471 | - } | 511 | + } |
| 472 | - }); | 512 | + }); |
| 473 | 513 | ||
| 474 | 514 | ||
| 475 | for (int i = 0; i < NUM_FLOOD_PORTS - 1; i++) { | 515 | for (int i = 0; i < NUM_FLOOD_PORTS - 1; i++) { |
| 476 | ConnectPoint cp = new ConnectPoint(getDeviceId(NUM_ADDRESS_PORTS + i + 1), | 516 | ConnectPoint cp = new ConnectPoint(getDeviceId(NUM_ADDRESS_PORTS + i + 1), |
| 477 | - PortNumber.portNumber(1)); | 517 | + PortNumber.portNumber(1)); |
| 478 | 518 | ||
| 479 | OutboundPacket outboundPacket = packetService.packets.get(i); | 519 | OutboundPacket outboundPacket = packetService.packets.get(i); |
| 480 | verifyPacketOut(packet, cp, outboundPacket); | 520 | verifyPacketOut(packet, cp, outboundPacket); |
| ... | @@ -572,4 +612,17 @@ public class ProxyArpManagerTest { | ... | @@ -572,4 +612,17 @@ public class ProxyArpManagerTest { |
| 572 | } | 612 | } |
| 573 | 613 | ||
| 574 | } | 614 | } |
| 615 | + | ||
| 616 | + class TestEdgePortService extends EdgeManager { | ||
| 617 | + | ||
| 618 | + @Override | ||
| 619 | + public boolean isEdgePoint(ConnectPoint connectPoint) { | ||
| 620 | + return isEdgePointReturn; | ||
| 621 | + } | ||
| 622 | + | ||
| 623 | + @Override | ||
| 624 | + public Iterable<ConnectPoint> getEdgePoints() { | ||
| 625 | + return getEdgePointsNoArg; | ||
| 626 | + } | ||
| 627 | + } | ||
| 575 | } | 628 | } | ... | ... |
-
Please register or login to post a comment