Aaron Kruglikov
Committed by Gerrit Code Review

Changed ProxyArpManager to make use of EdgeManager.

Change-Id: I05193146490aba6736c1815bf0d9022df8628973
......@@ -174,6 +174,8 @@ public class EdgeManager implements EdgePortService {
}
});
} else {
//FIXME special case of preexisting edgeport & no triggerless events could cause this to never hit and
//never discover an edgeport that should have been discovered.
loadAllEdgePorts();
}
}
......@@ -198,6 +200,7 @@ public class EdgeManager implements EdgePortService {
// Processes a device event by adding or removing its end-points in our cache.
private void processDeviceEvent(DeviceEvent event) {
//FIXME handle the case where a device is suspended, this may or may not come up
DeviceEvent.Type type = event.type();
DeviceId id = event.subject().id();
......
......@@ -15,6 +15,7 @@
*/
package org.onosproject.net.proxyarp.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.Before;
import org.junit.Test;
......@@ -36,6 +37,7 @@ import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.edgeservice.impl.EdgeManager;
import org.onosproject.net.flow.instructions.Instruction;
import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
import org.onosproject.net.host.HostService;
......@@ -53,8 +55,14 @@ import java.util.Comparator;
import java.util.List;
import java.util.Set;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* Tests for the {@link ProxyArpManager} class.
......@@ -85,6 +93,11 @@ public class ProxyArpManagerTest {
private static final HostLocation LOC2 = new HostLocation(DID2, P1, 123L);
private static final byte[] ZERO_MAC_ADDRESS = MacAddress.ZERO.toBytes();
//Return values used for various functions of the TestPacketService inner class.
private boolean isEdgePointReturn;
private List<ConnectPoint> getEdgePointsNoArg;
private ProxyArpManager proxyArp;
private TestPacketService packetService;
......@@ -98,6 +111,8 @@ public class ProxyArpManagerTest {
packetService = new TestPacketService();
proxyArp.packetService = packetService;
proxyArp.edgeService = new TestEdgePortService();
// Create a host service mock here. Must be replayed by tests once the
// expectations have been set up
hostService = createMock(HostService.class);
......@@ -112,7 +127,7 @@ public class ProxyArpManagerTest {
/**
* Creates a fake topology to feed into the ARP module.
* <p/>
* <p>
* The default topology is a unidirectional ring topology. Each switch has
* 3 ports. Ports 2 and 3 have the links to neighbor switches, and port 1
* is free (edge port).
......@@ -205,12 +220,12 @@ public class ProxyArpManagerTest {
InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2);
PortAddresses pa1 =
new PortAddresses(cp, Sets.newHashSet(ia1),
MacAddress.valueOf(2 * i - 1),
VlanId.vlanId((short) 1));
MacAddress.valueOf(2 * i - 1),
VlanId.vlanId((short) 1));
PortAddresses pa2 =
new PortAddresses(cp, Sets.newHashSet(ia2),
MacAddress.valueOf(2 * i),
VlanId.NONE);
MacAddress.valueOf(2 * i),
VlanId.NONE);
addresses.add(pa1);
addresses.add(pa2);
......@@ -223,7 +238,7 @@ public class ProxyArpManagerTest {
for (int i = 1; i <= NUM_FLOOD_PORTS; i++) {
ConnectPoint cp = new ConnectPoint(getDeviceId(i + NUM_ADDRESS_PORTS),
P1);
P1);
expect(hostService.getAddressBindingsForPort(cp))
.andReturn(Collections.<PortAddresses>emptySet()).anyTimes();
}
......@@ -266,11 +281,14 @@ public class ProxyArpManagerTest {
*/
@Test
public void testReplyKnown() {
//Set the return value of isEdgePoint from the edgemanager.
isEdgePointReturn = true;
Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN1, getLocation(4),
Collections.singleton(IP1));
Collections.singleton(IP1));
Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
Collections.singleton(IP2));
Collections.singleton(IP2));
expect(hostService.getHostsByIp(IP1))
.andReturn(Collections.singleton(replyer));
......@@ -294,17 +312,25 @@ public class ProxyArpManagerTest {
*/
@Test
public void testReplyUnknown() {
isEdgePointReturn = true;
Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
Collections.singleton(IP2));
Collections.singleton(IP2));
expect(hostService.getHostsByIp(IP1))
.andReturn(Collections.<Host>emptySet());
expect(hostService.getHost(HID2)).andReturn(requestor);
replay(hostService);
Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1);
//Setup the set of edge ports to be used in the reply method
getEdgePointsNoArg = Lists.newLinkedList();
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
proxyArp.reply(arpRequest, getLocation(6));
verifyFlood(arpRequest);
......@@ -318,11 +344,12 @@ public class ProxyArpManagerTest {
*/
@Test
public void testReplyDifferentVlan() {
Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN2, getLocation(4),
Collections.singleton(IP1));
Collections.singleton(IP1));
Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
Collections.singleton(IP2));
Collections.singleton(IP2));
expect(hostService.getHostsByIp(IP1))
.andReturn(Collections.singleton(replyer));
......@@ -332,6 +359,10 @@ public class ProxyArpManagerTest {
Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1);
//Setup for flood test
getEdgePointsNoArg = Lists.newLinkedList();
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
proxyArp.reply(arpRequest, getLocation(6));
verifyFlood(arpRequest);
......@@ -346,13 +377,13 @@ public class ProxyArpManagerTest {
MacAddress secondMac = MacAddress.valueOf(2L);
Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC1,
Collections.singleton(theirIp));
Collections.singleton(theirIp));
expect(hostService.getHost(HID2)).andReturn(requestor);
replay(hostService);
Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, theirIp, ourFirstIp);
isEdgePointReturn = true;
proxyArp.reply(arpRequest, LOC1);
assertEquals(1, packetService.packets.size());
......@@ -378,7 +409,7 @@ public class ProxyArpManagerTest {
// Request for a valid external IP address but coming in the wrong port
Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC1, null, theirIp,
Ip4Address.valueOf("10.0.3.1"));
Ip4Address.valueOf("10.0.3.1"));
proxyArp.reply(arpRequest, LOC1);
assertEquals(0, packetService.packets.size());
......@@ -402,8 +433,10 @@ public class ProxyArpManagerTest {
// This is a request from something inside our network (like a BGP
// daemon) to an external host.
Ethernet arpRequest = buildArp(ARP.OP_REQUEST, ourMac, null, ourIp, theirIp);
proxyArp.reply(arpRequest, getLocation(5));
//Ensure the packet is allowed through (it is not to an internal port)
isEdgePointReturn = true;
proxyArp.reply(arpRequest, getLocation(5));
assertEquals(1, packetService.packets.size());
verifyPacketOut(arpRequest, getLocation(1), packetService.packets.get(0));
......@@ -421,7 +454,7 @@ public class ProxyArpManagerTest {
@Test
public void testForwardToHost() {
Host host1 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1,
Collections.singleton(IP1));
Collections.singleton(IP1));
expect(hostService.getHost(HID1)).andReturn(host1);
replay(hostService);
......@@ -448,6 +481,13 @@ public class ProxyArpManagerTest {
Ethernet arpRequest = buildArp(ARP.OP_REPLY, MAC2, MAC1, IP2, IP1);
//populate the list of edges when so that when forward hits flood in the manager it contains the values
//that should continue on
getEdgePointsNoArg = Lists.newLinkedList();
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("3"), PortNumber.portNumber(1)));
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
proxyArp.forward(arpRequest, getLocation(6));
verifyFlood(arpRequest);
......@@ -464,17 +504,17 @@ public class ProxyArpManagerTest {
assertEquals(NUM_FLOOD_PORTS - 1, packetService.packets.size());
Collections.sort(packetService.packets,
new Comparator<OutboundPacket>() {
@Override
public int compare(OutboundPacket o1, OutboundPacket o2) {
return o1.sendThrough().uri().compareTo(o2.sendThrough().uri());
}
});
new Comparator<OutboundPacket>() {
@Override
public int compare(OutboundPacket o1, OutboundPacket o2) {
return o1.sendThrough().uri().compareTo(o2.sendThrough().uri());
}
});
for (int i = 0; i < NUM_FLOOD_PORTS - 1; i++) {
ConnectPoint cp = new ConnectPoint(getDeviceId(NUM_ADDRESS_PORTS + i + 1),
PortNumber.portNumber(1));
PortNumber.portNumber(1));
OutboundPacket outboundPacket = packetService.packets.get(i);
verifyPacketOut(packet, cp, outboundPacket);
......@@ -572,4 +612,17 @@ public class ProxyArpManagerTest {
}
}
class TestEdgePortService extends EdgeManager {
@Override
public boolean isEdgePoint(ConnectPoint connectPoint) {
return isEdgePointReturn;
}
@Override
public Iterable<ConnectPoint> getEdgePoints() {
return getEdgePointsNoArg;
}
}
}
......