blob: 6864fd74578e8e21b5fdb9c3902a431c72db7191 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.host.impl;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -07002
3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -07005import static org.junit.Assert.assertNotNull;
Jonathan Hartc884f1b2014-09-24 11:53:33 -07006import static org.junit.Assert.assertNull;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -07007import static org.junit.Assert.assertTrue;
Jonathan Hartc884f1b2014-09-24 11:53:33 -07008import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED;
9import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED;
10import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED;
11import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070012
13import java.util.List;
14import java.util.Set;
15
16import org.junit.After;
17import org.junit.Before;
18import org.junit.Test;
19import org.onlab.onos.event.Event;
20import org.onlab.onos.event.impl.TestEventDispatcher;
Jonathan Hartc884f1b2014-09-24 11:53:33 -070021import org.onlab.onos.net.ConnectPoint;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070022import org.onlab.onos.net.DeviceId;
23import org.onlab.onos.net.Host;
24import org.onlab.onos.net.HostId;
25import org.onlab.onos.net.HostLocation;
26import org.onlab.onos.net.PortNumber;
27import org.onlab.onos.net.host.DefaultHostDescription;
28import org.onlab.onos.net.host.HostDescription;
29import org.onlab.onos.net.host.HostEvent;
30import org.onlab.onos.net.host.HostListener;
31import org.onlab.onos.net.host.HostProvider;
32import org.onlab.onos.net.host.HostProviderRegistry;
33import org.onlab.onos.net.host.HostProviderService;
Jonathan Hartc884f1b2014-09-24 11:53:33 -070034import org.onlab.onos.net.host.PortAddresses;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070035import org.onlab.onos.net.provider.AbstractProvider;
36import org.onlab.onos.net.provider.ProviderId;
tomea961ff2014-10-01 12:45:15 -070037import org.onlab.onos.store.trivial.impl.SimpleHostStore;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070038import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070039import org.onlab.packet.MacAddress;
40import org.onlab.packet.VlanId;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070041
42import com.google.common.collect.Lists;
43import com.google.common.collect.Sets;
44
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070045/**
46 * Test codifying the host service & host provider service contracts.
47 */
tom202175a2014-09-19 19:00:11 -070048public class HostManagerTest {
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070049
tom7e02cda2014-09-18 12:05:46 -070050 private static final ProviderId PID = new ProviderId("of", "foo");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070051
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070052 private static final VlanId VLAN1 = VlanId.vlanId((short) 1);
53 private static final VlanId VLAN2 = VlanId.vlanId((short) 2);
54 private static final MacAddress MAC1 = MacAddress.valueOf("00:00:11:00:00:01");
55 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070056 private static final HostId HID1 = HostId.hostId(MAC1, VLAN1);
57 private static final HostId HID2 = HostId.hostId(MAC2, VLAN1);
58
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070059 private static final IpPrefix IP1 = IpPrefix.valueOf("10.0.0.1");
60 private static final IpPrefix IP2 = IpPrefix.valueOf("10.0.0.2");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070061
62 private static final DeviceId DID1 = DeviceId.deviceId("of:001");
63 private static final DeviceId DID2 = DeviceId.deviceId("of:002");
64 private static final PortNumber P1 = PortNumber.portNumber(100);
65 private static final PortNumber P2 = PortNumber.portNumber(200);
66 private static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
67 private static final HostLocation LOC2 = new HostLocation(DID1, P2, 123L);
Jonathan Hartc884f1b2014-09-24 11:53:33 -070068 private static final ConnectPoint CP1 = new ConnectPoint(DID1, P1);
69 private static final ConnectPoint CP2 = new ConnectPoint(DID2, P2);
70
71 private static final IpPrefix PREFIX1 = IpPrefix.valueOf("10.0.1.0/24");
72 private static final IpPrefix PREFIX2 = IpPrefix.valueOf("10.1.0.0/16");
73 private static final IpPrefix PREFIX3 = IpPrefix.valueOf("5.8.2.0/23");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070074
tom202175a2014-09-19 19:00:11 -070075 private HostManager mgr;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070076
77 protected TestListener listener = new TestListener();
78 protected HostProviderRegistry registry;
79 protected TestHostProvider provider;
80 protected HostProviderService providerService;
81
82 @Before
83 public void setUp() {
tom202175a2014-09-19 19:00:11 -070084 mgr = new HostManager();
tom5bcc9462014-09-19 10:11:31 -070085 mgr.store = new SimpleHostStore();
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070086 mgr.eventDispatcher = new TestEventDispatcher();
87 registry = mgr;
88 mgr.activate();
89
90 mgr.addListener(listener);
91
92 provider = new TestHostProvider();
93 providerService = registry.register(provider);
94 assertTrue("provider should be registered",
tom093340b2014-10-10 00:15:36 -070095 registry.getProviders().contains(provider.id()));
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070096 }
97
98 @After
99 public void tearDown() {
100 registry.unregister(provider);
101 assertFalse("provider should not be registered",
tom093340b2014-10-10 00:15:36 -0700102 registry.getProviders().contains(provider.id()));
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700103
104 mgr.removeListener(listener);
105 mgr.deactivate();
106 mgr.eventDispatcher = null;
107 }
108
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700109 private void detect(HostId hid, MacAddress mac, VlanId vlan,
tom093340b2014-10-10 00:15:36 -0700110 HostLocation loc, IpPrefix ip) {
111 HostDescription descr = new DefaultHostDescription(mac, vlan, loc, ip);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700112 providerService.hostDetected(hid, descr);
113 assertNotNull("host should be found", mgr.getHost(hid));
114 }
115
116 private void validateEvents(Enum... types) {
117 int i = 0;
118 assertEquals("wrong events received", types.length, listener.events.size());
119 for (Event event : listener.events) {
120 assertEquals("incorrect event type", types[i], event.type());
121 i++;
122 }
123 listener.events.clear();
124 }
125
126 @Test
127 public void hostDetected() {
128 assertNull("host shouldn't be found", mgr.getHost(HID1));
129
130 // host addition
tom093340b2014-10-10 00:15:36 -0700131 detect(HID1, MAC1, VLAN1, LOC1, IP1);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700132 assertEquals("exactly one should be found", 1, mgr.getHostCount());
tom093340b2014-10-10 00:15:36 -0700133 detect(HID2, MAC2, VLAN2, LOC2, IP1);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700134 assertEquals("two hosts should be found", 2, mgr.getHostCount());
135 validateEvents(HOST_ADDED, HOST_ADDED);
136
137 // host motion
tom093340b2014-10-10 00:15:36 -0700138 detect(HID1, MAC1, VLAN1, LOC2, IP1);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700139 validateEvents(HOST_MOVED);
140 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
141
142 // host update
tom093340b2014-10-10 00:15:36 -0700143 detect(HID1, MAC1, VLAN1, LOC2, IP2);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700144 validateEvents(HOST_UPDATED);
145 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
146 }
147
148 @Test
149 public void hostVanished() {
tom093340b2014-10-10 00:15:36 -0700150 detect(HID1, MAC1, VLAN1, LOC1, IP1);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700151 providerService.hostVanished(HID1);
152 validateEvents(HOST_ADDED, HOST_REMOVED);
153
154 assertNull("host should have been removed", mgr.getHost(HID1));
155 }
156
157 private void validateHosts(
tom093340b2014-10-10 00:15:36 -0700158 String msg, Iterable<Host> hosts, HostId... ids) {
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700159 Set<HostId> hids = Sets.newHashSet(ids);
160 for (Host h : hosts) {
161 assertTrue(msg, hids.remove(h.id()));
162 }
163 assertTrue("expected hosts not fetched from store", hids.isEmpty());
164 }
165
166 @Test
167 public void getHosts() {
tom093340b2014-10-10 00:15:36 -0700168 detect(HID1, MAC1, VLAN1, LOC1, IP1);
169 detect(HID2, MAC2, VLAN1, LOC2, IP2);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700170
171 validateHosts("host not properly stored", mgr.getHosts(), HID1, HID2);
172 validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID1, HID2);
173 validateHosts("can't get hosts by MAC", mgr.getHostsByMac(MAC1), HID1);
174 validateHosts("can't get hosts by IP", mgr.getHostsByIp(IP1), HID1);
175 validateHosts("can't get hosts by location", mgr.getConnectedHosts(LOC1), HID1);
176 assertTrue("incorrect host location", mgr.getConnectedHosts(DID2).isEmpty());
177 }
178
179 private static class TestHostProvider extends AbstractProvider
180 implements HostProvider {
181
182 protected TestHostProvider() {
183 super(PID);
184 }
185
186 @Override
187 public ProviderId id() {
188 return PID;
189 }
190
191 @Override
192 public void triggerProbe(Host host) {
193 }
194
195 }
196
197 private static class TestListener implements HostListener {
198
199 protected List<HostEvent> events = Lists.newArrayList();
200
201 @Override
202 public void event(HostEvent event) {
203 events.add(event);
204 }
205
206 }
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700207
208 @Test
209 public void bindAddressesToPort() {
210 PortAddresses add1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700211 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700212
213 mgr.bindAddressesToPort(add1);
214 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
215
216 assertTrue(add1.ips().equals(storedAddresses.ips()));
217 assertTrue(add1.mac().equals(storedAddresses.mac()));
218
219 // Add some more addresses and check that they're added correctly
220 PortAddresses add2 = new PortAddresses(CP1, Sets.newHashSet(PREFIX3), null);
221
222 mgr.bindAddressesToPort(add2);
223 storedAddresses = mgr.getAddressBindingsForPort(CP1);
224
225 assertTrue(storedAddresses.ips().equals(
226 Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
227 assertTrue(storedAddresses.mac().equals(MAC1));
228
229 PortAddresses add3 = new PortAddresses(CP1, null, MAC2);
230
231 mgr.bindAddressesToPort(add3);
232 storedAddresses = mgr.getAddressBindingsForPort(CP1);
233
234 assertTrue(storedAddresses.ips().equals(
235 Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
236 assertTrue(storedAddresses.mac().equals(MAC2));
237 }
238
239 @Test
240 public void unbindAddressesFromPort() {
241 PortAddresses add1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700242 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700243
244 mgr.bindAddressesToPort(add1);
245 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
246
247 assertTrue(storedAddresses.ips().size() == 2);
248 assertNotNull(storedAddresses.mac());
249
250 PortAddresses rem1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700251 Sets.newHashSet(PREFIX1), null);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700252
253 mgr.unbindAddressesFromPort(rem1);
254 storedAddresses = mgr.getAddressBindingsForPort(CP1);
255
256 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
257 assertTrue(storedAddresses.mac().equals(MAC1));
258
259 PortAddresses rem2 = new PortAddresses(CP1, null, MAC1);
260
261 mgr.unbindAddressesFromPort(rem2);
262 storedAddresses = mgr.getAddressBindingsForPort(CP1);
263
264 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
265 assertNull(storedAddresses.mac());
266
267 PortAddresses rem3 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700268 Sets.newHashSet(PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700269
270 mgr.unbindAddressesFromPort(rem3);
271 storedAddresses = mgr.getAddressBindingsForPort(CP1);
272
273 assertTrue(storedAddresses.ips().isEmpty());
274 assertNull(storedAddresses.mac());
275 }
276
277 @Test
278 public void clearAddresses() {
279 PortAddresses add1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700280 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700281
282 mgr.bindAddressesToPort(add1);
283 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
284
285 assertTrue(storedAddresses.ips().size() == 2);
286 assertNotNull(storedAddresses.mac());
287
288 mgr.clearAddresses(CP1);
289 storedAddresses = mgr.getAddressBindingsForPort(CP1);
290
291 assertTrue(storedAddresses.ips().isEmpty());
292 assertNull(storedAddresses.mac());
293 }
294
295 @Test
296 public void getAddressBindingsForPort() {
297 PortAddresses add1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700298 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700299
300 mgr.bindAddressesToPort(add1);
301 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
302
303 assertTrue(storedAddresses.connectPoint().equals(CP1));
304 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX1, PREFIX2)));
305 assertTrue(storedAddresses.mac().equals(MAC1));
306 }
307
308 @Test
309 public void getAddressBindings() {
310 Set<PortAddresses> storedAddresses = mgr.getAddressBindings();
311
312 assertTrue(storedAddresses.isEmpty());
313
314 PortAddresses add1 = new PortAddresses(CP1,
tom093340b2014-10-10 00:15:36 -0700315 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700316
317 mgr.bindAddressesToPort(add1);
318
319 storedAddresses = mgr.getAddressBindings();
320
321 assertTrue(storedAddresses.size() == 1);
322
323 PortAddresses add2 = new PortAddresses(CP2,
tom093340b2014-10-10 00:15:36 -0700324 Sets.newHashSet(PREFIX3), MAC2);
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700325
326 mgr.bindAddressesToPort(add2);
327
328 storedAddresses = mgr.getAddressBindings();
329
330 assertTrue(storedAddresses.size() == 2);
331 assertTrue(storedAddresses.equals(Sets.newHashSet(add1, add2)));
332 }
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700333}