Added ability to remove host by CLI and by the provider on device/port down events.
Change-Id: I28de4b6b5bbfb5a00f35e1808bcd916369d7d1a4
diff --git a/providers/host/src/test/java/org/onlab/onos/provider/host/impl/HostLocationProviderTest.java b/providers/host/src/test/java/org/onlab/onos/provider/host/impl/HostLocationProviderTest.java
index e42d657..00c467a 100644
--- a/providers/host/src/test/java/org/onlab/onos/provider/host/impl/HostLocationProviderTest.java
+++ b/providers/host/src/test/java/org/onlab/onos/provider/host/impl/HostLocationProviderTest.java
@@ -15,25 +15,28 @@
*/
package org.onlab.onos.provider.host.impl;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import java.nio.ByteBuffer;
-import java.util.Set;
-
+import com.google.common.collect.ImmutableSet;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DefaultDevice;
+import org.onlab.onos.net.DefaultHost;
+import org.onlab.onos.net.DefaultPort;
+import org.onlab.onos.net.Device;
import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Host;
import org.onlab.onos.net.HostId;
-import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.HostLocation;
+import org.onlab.onos.net.device.DeviceEvent;
+import org.onlab.onos.net.device.DeviceListener;
+import org.onlab.onos.net.device.DeviceServiceAdapter;
import org.onlab.onos.net.flow.TrafficTreatment;
import org.onlab.onos.net.host.HostDescription;
import org.onlab.onos.net.host.HostProvider;
import org.onlab.onos.net.host.HostProviderRegistry;
import org.onlab.onos.net.host.HostProviderService;
+import org.onlab.onos.net.host.HostServiceAdapter;
import org.onlab.onos.net.packet.DefaultInboundPacket;
import org.onlab.onos.net.packet.InboundPacket;
import org.onlab.onos.net.packet.OutboundPacket;
@@ -43,13 +46,30 @@
import org.onlab.onos.net.provider.AbstractProviderService;
import org.onlab.onos.net.provider.ProviderId;
import org.onlab.onos.net.topology.Topology;
-
import org.onlab.onos.net.topology.TopologyServiceAdapter;
+import org.onlab.osgi.ComponentContextAdapter;
import org.onlab.packet.ARP;
+import org.onlab.packet.ChassisId;
import org.onlab.packet.Ethernet;
+import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
+import java.nio.ByteBuffer;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+import static org.onlab.onos.net.Device.Type.SWITCH;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.HostId.hostId;
+import static org.onlab.onos.net.PortNumber.portNumber;
+import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_REMOVED;
+import static org.onlab.onos.net.device.DeviceEvent.Type.PORT_UPDATED;
+import static org.onlab.packet.VlanId.vlanId;
+
public class HostLocationProviderTest {
private static final Integer INPORT = 10;
@@ -57,14 +77,44 @@
private static final String DEV2 = "of:2";
private static final String DEV3 = "of:3";
- private static final VlanId VLAN = VlanId.vlanId();
+ private static final VlanId VLAN = vlanId();
private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
private static final byte[] IP = new byte[]{10, 0, 0, 1};
+ private static final IpAddress IP_ADDRESS =
+ IpAddress.valueOf(IpAddress.Version.INET, IP);
+ private static final HostLocation LOCATION =
+ new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
+
+ private static final DefaultHost HOST =
+ new DefaultHost(ProviderId.NONE, hostId(MAC), MAC,
+ vlanId(VlanId.UNTAGGED), LOCATION,
+ ImmutableSet.of(IP_ADDRESS));
+
+ private static final ComponentContextAdapter CTX_FOR_REMOVE =
+ new ComponentContextAdapter() {
+ @Override
+ public Dictionary getProperties() {
+ Hashtable<String, String> props = new Hashtable<>();
+ props.put("hostRemovalEnabled", "true");
+ return props;
+ }
+ };
+
+ public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
+ new ComponentContextAdapter() {
+ @Override
+ public Dictionary getProperties() {
+ return new Hashtable();
+ }
+ };
+
private final HostLocationProvider provider = new HostLocationProvider();
- private final TestHostRegistry hostService = new TestHostRegistry();
+ private final TestHostRegistry hostRegistry = new TestHostRegistry();
private final TestTopologyService topoService = new TestTopologyService();
+ private final TestDeviceService deviceService = new TestDeviceService();
+ private final TestHostService hostService = new TestHostService();
private final TestPacketService packetService = new TestPacketService();
private PacketProcessor testProcessor;
@@ -72,12 +122,13 @@
@Before
public void setUp() {
- provider.providerRegistry = hostService;
+ provider.providerRegistry = hostRegistry;
provider.topologyService = topoService;
provider.pktService = packetService;
+ provider.deviceService = deviceService;
+ provider.hostService = hostService;
- provider.activate();
-
+ provider.activate(CTX_FOR_NO_REMOVE);
}
@Test
@@ -89,8 +140,6 @@
@Test
public void events() {
// new host
-
-
testProcessor.process(new TestPacketContext(DEV1));
assertNotNull("new host expected", providerService.added);
assertNull("host motion unexpected", providerService.moved);
@@ -104,6 +153,39 @@
assertNull("host misheard on spine switch", providerService.spine);
}
+ @Test
+ public void removeHostByDeviceRemove() {
+ provider.modified(CTX_FOR_REMOVE);
+ testProcessor.process(new TestPacketContext(DEV1));
+ Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
+ "m", "h", "s", "n", new ChassisId(0L));
+ deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
+ assertEquals("incorrect remove count", 1, providerService.removeCount);
+ }
+
+ @Test
+ public void removeHostByDeviceOffline() {
+ provider.modified(CTX_FOR_REMOVE);
+ testProcessor.process(new TestPacketContext(DEV1));
+ Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
+ "m", "h", "s", "n", new ChassisId(0L));
+ deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
+ assertEquals("incorrect remove count", 1, providerService.removeCount);
+ }
+
+ @Test
+ public void removeHostByDevicePortDown() {
+ provider.modified(CTX_FOR_REMOVE);
+ testProcessor.process(new TestPacketContext(DEV1));
+ Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
+ "m", "h", "s", "n", new ChassisId(0L));
+ deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
+ new DefaultPort(device, portNumber(INPORT),
+ false)));
+ assertEquals("incorrect remove count", 1, providerService.removeCount);
+ }
+
+
@After
public void tearDown() {
provider.deactivate();
@@ -137,6 +219,7 @@
DeviceId added = null;
DeviceId moved = null;
DeviceId spine = null;
+ public int removeCount;
protected TestHostProviderService(HostProvider provider) {
super(provider);
@@ -156,6 +239,7 @@
@Override
public void hostVanished(HostId hostId) {
+ removeCount++;
}
}
@@ -169,12 +253,10 @@
@Override
public void removeProcessor(PacketProcessor processor) {
-
}
@Override
public void emit(OutboundPacket packet) {
-
}
}
@@ -184,7 +266,7 @@
public boolean isInfrastructure(Topology topology,
ConnectPoint connectPoint) {
//simulate DPID3 as an infrastructure switch
- if ((connectPoint.deviceId()).equals(DeviceId.deviceId(DEV3))) {
+ if ((connectPoint.deviceId()).equals(deviceId(DEV3))) {
return true;
}
return false;
@@ -218,8 +300,8 @@
.setSourceMACAddress(MAC.toBytes())
.setDestinationMACAddress(BCMAC)
.setPayload(arp);
- ConnectPoint receivedFrom = new ConnectPoint(DeviceId.deviceId(deviceId),
- PortNumber.portNumber(INPORT));
+ ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
+ portNumber(INPORT));
return new DefaultInboundPacket(receivedFrom, eth,
ByteBuffer.wrap(eth.serialize()));
}
@@ -249,4 +331,26 @@
return false;
}
}
+
+ private class TestDeviceService extends DeviceServiceAdapter {
+ private DeviceListener listener;
+
+ @Override
+ public void addListener(DeviceListener listener) {
+ this.listener = listener;
+ }
+ }
+
+ private class TestHostService extends HostServiceAdapter {
+ @Override
+ public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
+ return ImmutableSet.of(HOST);
+ }
+
+ @Override
+ public Set<Host> getConnectedHosts(DeviceId deviceId) {
+ return ImmutableSet.of(HOST);
+ }
+
+ }
}