blob: 49ac5b85b88d2bf9438406f8d03c96fe577fd437 [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;
tom202175a2014-09-19 19:00:11 -070037import org.onlab.onos.net.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");
61 private static final Set<IpPrefix> IPSET1 = Sets.newHashSet(IP1);
62 private static final Set<IpPrefix> IPSET2 = Sets.newHashSet(IP2);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070063
64 private static final DeviceId DID1 = DeviceId.deviceId("of:001");
65 private static final DeviceId DID2 = DeviceId.deviceId("of:002");
66 private static final PortNumber P1 = PortNumber.portNumber(100);
67 private static final PortNumber P2 = PortNumber.portNumber(200);
68 private static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
69 private static final HostLocation LOC2 = new HostLocation(DID1, P2, 123L);
Jonathan Hartc884f1b2014-09-24 11:53:33 -070070 private static final ConnectPoint CP1 = new ConnectPoint(DID1, P1);
71 private static final ConnectPoint CP2 = new ConnectPoint(DID2, P2);
72
73 private static final IpPrefix PREFIX1 = IpPrefix.valueOf("10.0.1.0/24");
74 private static final IpPrefix PREFIX2 = IpPrefix.valueOf("10.1.0.0/16");
75 private static final IpPrefix PREFIX3 = IpPrefix.valueOf("5.8.2.0/23");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070076
tom202175a2014-09-19 19:00:11 -070077 private HostManager mgr;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070078
79 protected TestListener listener = new TestListener();
80 protected HostProviderRegistry registry;
81 protected TestHostProvider provider;
82 protected HostProviderService providerService;
83
84 @Before
85 public void setUp() {
tom202175a2014-09-19 19:00:11 -070086 mgr = new HostManager();
tom5bcc9462014-09-19 10:11:31 -070087 mgr.store = new SimpleHostStore();
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070088 mgr.eventDispatcher = new TestEventDispatcher();
89 registry = mgr;
90 mgr.activate();
91
92 mgr.addListener(listener);
93
94 provider = new TestHostProvider();
95 providerService = registry.register(provider);
96 assertTrue("provider should be registered",
97 registry.getProviders().contains(provider.id()));
98 }
99
100 @After
101 public void tearDown() {
102 registry.unregister(provider);
103 assertFalse("provider should not be registered",
104 registry.getProviders().contains(provider.id()));
105
106 mgr.removeListener(listener);
107 mgr.deactivate();
108 mgr.eventDispatcher = null;
109 }
110
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700111 private void detect(HostId hid, MacAddress mac, VlanId vlan,
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700112 HostLocation loc, Set<IpPrefix> ips) {
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700113 HostDescription descr = new DefaultHostDescription(mac, vlan, loc, ips);
114 providerService.hostDetected(hid, descr);
115 assertNotNull("host should be found", mgr.getHost(hid));
116 }
117
118 private void validateEvents(Enum... types) {
119 int i = 0;
120 assertEquals("wrong events received", types.length, listener.events.size());
121 for (Event event : listener.events) {
122 assertEquals("incorrect event type", types[i], event.type());
123 i++;
124 }
125 listener.events.clear();
126 }
127
128 @Test
129 public void hostDetected() {
130 assertNull("host shouldn't be found", mgr.getHost(HID1));
131
132 // host addition
133 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
134 assertEquals("exactly one should be found", 1, mgr.getHostCount());
135 detect(HID2, MAC2, VLAN2, LOC2, IPSET1);
136 assertEquals("two hosts should be found", 2, mgr.getHostCount());
137 validateEvents(HOST_ADDED, HOST_ADDED);
138
139 // host motion
140 detect(HID1, MAC1, VLAN1, LOC2, IPSET1);
141 validateEvents(HOST_MOVED);
142 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
143
144 // host update
145 detect(HID1, MAC1, VLAN1, LOC2, IPSET2);
146 validateEvents(HOST_UPDATED);
147 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
148 }
149
150 @Test
151 public void hostVanished() {
152 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
153 providerService.hostVanished(HID1);
154 validateEvents(HOST_ADDED, HOST_REMOVED);
155
156 assertNull("host should have been removed", mgr.getHost(HID1));
157 }
158
159 private void validateHosts(
160 String msg, Iterable<Host> hosts, HostId ... ids) {
161 Set<HostId> hids = Sets.newHashSet(ids);
162 for (Host h : hosts) {
163 assertTrue(msg, hids.remove(h.id()));
164 }
165 assertTrue("expected hosts not fetched from store", hids.isEmpty());
166 }
167
168 @Test
169 public void getHosts() {
170 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
171 detect(HID2, MAC2, VLAN1, LOC2, IPSET2);
172
173 validateHosts("host not properly stored", mgr.getHosts(), HID1, HID2);
174 validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID1, HID2);
175 validateHosts("can't get hosts by MAC", mgr.getHostsByMac(MAC1), HID1);
176 validateHosts("can't get hosts by IP", mgr.getHostsByIp(IP1), HID1);
177 validateHosts("can't get hosts by location", mgr.getConnectedHosts(LOC1), HID1);
178 assertTrue("incorrect host location", mgr.getConnectedHosts(DID2).isEmpty());
179 }
180
181 private static class TestHostProvider extends AbstractProvider
182 implements HostProvider {
183
184 protected TestHostProvider() {
185 super(PID);
186 }
187
188 @Override
189 public ProviderId id() {
190 return PID;
191 }
192
193 @Override
194 public void triggerProbe(Host host) {
195 }
196
197 }
198
199 private static class TestListener implements HostListener {
200
201 protected List<HostEvent> events = Lists.newArrayList();
202
203 @Override
204 public void event(HostEvent event) {
205 events.add(event);
206 }
207
208 }
Jonathan Hartc884f1b2014-09-24 11:53:33 -0700209
210 @Test
211 public void bindAddressesToPort() {
212 PortAddresses add1 = new PortAddresses(CP1,
213 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
214
215 mgr.bindAddressesToPort(add1);
216 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
217
218 assertTrue(add1.ips().equals(storedAddresses.ips()));
219 assertTrue(add1.mac().equals(storedAddresses.mac()));
220
221 // Add some more addresses and check that they're added correctly
222 PortAddresses add2 = new PortAddresses(CP1, Sets.newHashSet(PREFIX3), null);
223
224 mgr.bindAddressesToPort(add2);
225 storedAddresses = mgr.getAddressBindingsForPort(CP1);
226
227 assertTrue(storedAddresses.ips().equals(
228 Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
229 assertTrue(storedAddresses.mac().equals(MAC1));
230
231 PortAddresses add3 = new PortAddresses(CP1, null, MAC2);
232
233 mgr.bindAddressesToPort(add3);
234 storedAddresses = mgr.getAddressBindingsForPort(CP1);
235
236 assertTrue(storedAddresses.ips().equals(
237 Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
238 assertTrue(storedAddresses.mac().equals(MAC2));
239 }
240
241 @Test
242 public void unbindAddressesFromPort() {
243 PortAddresses add1 = new PortAddresses(CP1,
244 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
245
246 mgr.bindAddressesToPort(add1);
247 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
248
249 assertTrue(storedAddresses.ips().size() == 2);
250 assertNotNull(storedAddresses.mac());
251
252 PortAddresses rem1 = new PortAddresses(CP1,
253 Sets.newHashSet(PREFIX1), null);
254
255 mgr.unbindAddressesFromPort(rem1);
256 storedAddresses = mgr.getAddressBindingsForPort(CP1);
257
258 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
259 assertTrue(storedAddresses.mac().equals(MAC1));
260
261 PortAddresses rem2 = new PortAddresses(CP1, null, MAC1);
262
263 mgr.unbindAddressesFromPort(rem2);
264 storedAddresses = mgr.getAddressBindingsForPort(CP1);
265
266 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
267 assertNull(storedAddresses.mac());
268
269 PortAddresses rem3 = new PortAddresses(CP1,
270 Sets.newHashSet(PREFIX2), MAC1);
271
272 mgr.unbindAddressesFromPort(rem3);
273 storedAddresses = mgr.getAddressBindingsForPort(CP1);
274
275 assertTrue(storedAddresses.ips().isEmpty());
276 assertNull(storedAddresses.mac());
277 }
278
279 @Test
280 public void clearAddresses() {
281 PortAddresses add1 = new PortAddresses(CP1,
282 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
283
284 mgr.bindAddressesToPort(add1);
285 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
286
287 assertTrue(storedAddresses.ips().size() == 2);
288 assertNotNull(storedAddresses.mac());
289
290 mgr.clearAddresses(CP1);
291 storedAddresses = mgr.getAddressBindingsForPort(CP1);
292
293 assertTrue(storedAddresses.ips().isEmpty());
294 assertNull(storedAddresses.mac());
295 }
296
297 @Test
298 public void getAddressBindingsForPort() {
299 PortAddresses add1 = new PortAddresses(CP1,
300 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
301
302 mgr.bindAddressesToPort(add1);
303 PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
304
305 assertTrue(storedAddresses.connectPoint().equals(CP1));
306 assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX1, PREFIX2)));
307 assertTrue(storedAddresses.mac().equals(MAC1));
308 }
309
310 @Test
311 public void getAddressBindings() {
312 Set<PortAddresses> storedAddresses = mgr.getAddressBindings();
313
314 assertTrue(storedAddresses.isEmpty());
315
316 PortAddresses add1 = new PortAddresses(CP1,
317 Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
318
319 mgr.bindAddressesToPort(add1);
320
321 storedAddresses = mgr.getAddressBindings();
322
323 assertTrue(storedAddresses.size() == 1);
324
325 PortAddresses add2 = new PortAddresses(CP2,
326 Sets.newHashSet(PREFIX3), MAC2);
327
328 mgr.bindAddressesToPort(add2);
329
330 storedAddresses = mgr.getAddressBindings();
331
332 assertTrue(storedAddresses.size() == 2);
333 assertTrue(storedAddresses.equals(Sets.newHashSet(add1, add2)));
334 }
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700335}