blob: ea47b0c9447259df88580f82cafc92b4ef9a2a35 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.device.impl;
tome5ec3fd2014-09-04 15:18:06 -07002
tomb41d1ac2014-09-24 01:51:24 -07003import com.google.common.collect.Sets;
Ayaka Koshibec4047702014-10-07 14:43:52 -07004
tome5ec3fd2014-09-04 15:18:06 -07005import org.junit.After;
6import org.junit.Before;
tomb41d1ac2014-09-24 01:51:24 -07007import org.junit.Ignore;
tome5ec3fd2014-09-04 15:18:06 -07008import org.junit.Test;
tomb41d1ac2014-09-24 01:51:24 -07009import org.onlab.onos.cluster.MastershipServiceAdapter;
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070010import org.onlab.onos.cluster.NodeId;
tome5ec3fd2014-09-04 15:18:06 -070011import org.onlab.onos.event.Event;
tomb41d1ac2014-09-24 01:51:24 -070012import org.onlab.onos.event.impl.TestEventDispatcher;
tome5ec3fd2014-09-04 15:18:06 -070013import org.onlab.onos.net.Device;
14import org.onlab.onos.net.DeviceId;
15import org.onlab.onos.net.MastershipRole;
tom24c55cd2014-09-06 10:47:25 -070016import org.onlab.onos.net.Port;
17import org.onlab.onos.net.PortNumber;
tome5ec3fd2014-09-04 15:18:06 -070018import org.onlab.onos.net.device.DefaultDeviceDescription;
tom24c55cd2014-09-06 10:47:25 -070019import org.onlab.onos.net.device.DefaultPortDescription;
tome5ec3fd2014-09-04 15:18:06 -070020import org.onlab.onos.net.device.DeviceAdminService;
21import org.onlab.onos.net.device.DeviceDescription;
22import org.onlab.onos.net.device.DeviceEvent;
23import org.onlab.onos.net.device.DeviceListener;
24import org.onlab.onos.net.device.DeviceProvider;
25import org.onlab.onos.net.device.DeviceProviderRegistry;
26import org.onlab.onos.net.device.DeviceProviderService;
27import org.onlab.onos.net.device.DeviceService;
tom24c55cd2014-09-06 10:47:25 -070028import org.onlab.onos.net.device.PortDescription;
tome5ec3fd2014-09-04 15:18:06 -070029import org.onlab.onos.net.provider.AbstractProvider;
30import org.onlab.onos.net.provider.ProviderId;
tomea961ff2014-10-01 12:45:15 -070031import org.onlab.onos.store.trivial.impl.SimpleDeviceStore;
tome5ec3fd2014-09-04 15:18:06 -070032
33import java.util.ArrayList;
34import java.util.Iterator;
35import java.util.List;
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070036import java.util.Set;
tome5ec3fd2014-09-04 15:18:06 -070037
38import static org.junit.Assert.*;
39import static org.onlab.onos.net.Device.Type.SWITCH;
40import static org.onlab.onos.net.DeviceId.deviceId;
41import static org.onlab.onos.net.device.DeviceEvent.Type.*;
42
43/**
44 * Test codifying the device service & device provider service contracts.
45 */
tom41a2c5f2014-09-19 09:20:35 -070046public class DeviceManagerTest {
tome5ec3fd2014-09-04 15:18:06 -070047
tom7e02cda2014-09-18 12:05:46 -070048 private static final ProviderId PID = new ProviderId("of", "foo");
tome5ec3fd2014-09-04 15:18:06 -070049 private static final DeviceId DID1 = deviceId("of:foo");
50 private static final DeviceId DID2 = deviceId("of:bar");
51 private static final String MFR = "whitebox";
52 private static final String HW = "1.1.x";
53 private static final String SW1 = "3.8.1";
54 private static final String SW2 = "3.9.5";
55 private static final String SN = "43311-12345";
56
tom24c55cd2014-09-06 10:47:25 -070057 private static final PortNumber P1 = PortNumber.portNumber(1);
58 private static final PortNumber P2 = PortNumber.portNumber(2);
59 private static final PortNumber P3 = PortNumber.portNumber(3);
60
tom41a2c5f2014-09-19 09:20:35 -070061 private DeviceManager mgr;
tome5ec3fd2014-09-04 15:18:06 -070062
63 protected DeviceService service;
64 protected DeviceAdminService admin;
65 protected DeviceProviderRegistry registry;
66 protected DeviceProviderService providerService;
67 protected TestProvider provider;
68 protected TestListener listener = new TestListener();
69
70 @Before
71 public void setUp() {
tom41a2c5f2014-09-19 09:20:35 -070072 mgr = new DeviceManager();
tome5ec3fd2014-09-04 15:18:06 -070073 service = mgr;
74 admin = mgr;
75 registry = mgr;
tom41a2c5f2014-09-19 09:20:35 -070076 mgr.store = new SimpleDeviceStore();
tome5ec3fd2014-09-04 15:18:06 -070077 mgr.eventDispatcher = new TestEventDispatcher();
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070078 mgr.mastershipService = new TestMastershipService();
tome5ec3fd2014-09-04 15:18:06 -070079 mgr.activate();
80
81 service.addListener(listener);
82
83 provider = new TestProvider();
84 providerService = registry.register(provider);
85 assertTrue("provider should be registered",
86 registry.getProviders().contains(provider.id()));
87 }
88
89 @After
90 public void tearDown() {
91 registry.unregister(provider);
92 assertFalse("provider should not be registered",
93 registry.getProviders().contains(provider.id()));
94 service.removeListener(listener);
95 mgr.deactivate();
96 }
97
98 private void connectDevice(DeviceId deviceId, String swVersion) {
99 DeviceDescription description =
100 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
101 HW, swVersion, SN);
102 providerService.deviceConnected(deviceId, description);
103 assertNotNull("device should be found", service.getDevice(DID1));
104 }
105
106 @Test
107 public void deviceConnected() {
108 assertNull("device should not be found", service.getDevice(DID1));
109 connectDevice(DID1, SW1);
110 validateEvents(DEVICE_ADDED);
111
112 Iterator<Device> it = service.getDevices().iterator();
113 assertNotNull("one device expected", it.next());
114 assertFalse("only one device expected", it.hasNext());
tomad2d2092014-09-06 23:24:20 -0700115 assertEquals("incorrect device count", 1, service.getDeviceCount());
tomff7eb7c2014-09-08 12:49:03 -0700116 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700117 }
118
119 @Test
120 public void deviceDisconnected() {
121 connectDevice(DID1, SW1);
122 connectDevice(DID2, SW1);
123 validateEvents(DEVICE_ADDED, DEVICE_ADDED);
tomff7eb7c2014-09-08 12:49:03 -0700124 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700125
126 // Disconnect
127 providerService.deviceDisconnected(DID1);
128 assertNotNull("device should not be found", service.getDevice(DID1));
tomff7eb7c2014-09-08 12:49:03 -0700129 assertFalse("device should not be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700130 validateEvents(DEVICE_AVAILABILITY_CHANGED);
131
132 // Reconnect
133 connectDevice(DID1, SW1);
134 validateEvents(DEVICE_AVAILABILITY_CHANGED);
tomad2d2092014-09-06 23:24:20 -0700135
136 assertEquals("incorrect device count", 2, service.getDeviceCount());
tome5ec3fd2014-09-04 15:18:06 -0700137 }
138
139 @Test
140 public void deviceUpdated() {
141 connectDevice(DID1, SW1);
142 validateEvents(DEVICE_ADDED);
143
144 connectDevice(DID1, SW2);
145 validateEvents(DEVICE_UPDATED);
146 }
147
148 @Test
149 public void getRole() {
150 connectDevice(DID1, SW1);
tom80c0e5e2014-09-08 18:08:58 -0700151 assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700152 }
153
tomb41d1ac2014-09-24 01:51:24 -0700154 @Ignore("disabled until we settle the device-mastership wiring")
tome5ec3fd2014-09-04 15:18:06 -0700155 @Test
tom5f35f7c2014-09-08 18:38:19 -0700156 public void setRole() throws InterruptedException {
tome5ec3fd2014-09-04 15:18:06 -0700157 connectDevice(DID1, SW1);
tome5ec3fd2014-09-04 15:18:06 -0700158 validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
tom80c0e5e2014-09-08 18:08:58 -0700159 assertEquals("incorrect role", MastershipRole.STANDBY, service.getRole(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700160 assertEquals("incorrect device", DID1, provider.deviceReceived.id());
tom80c0e5e2014-09-08 18:08:58 -0700161 assertEquals("incorrect role", MastershipRole.STANDBY, provider.roleReceived);
tome5ec3fd2014-09-04 15:18:06 -0700162 }
163
tom24c55cd2014-09-06 10:47:25 -0700164 @Test
165 public void updatePorts() {
166 connectDevice(DID1, SW1);
167 List<PortDescription> pds = new ArrayList<>();
168 pds.add(new DefaultPortDescription(P1, true));
169 pds.add(new DefaultPortDescription(P2, true));
170 pds.add(new DefaultPortDescription(P3, true));
171 providerService.updatePorts(DID1, pds);
172 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED, PORT_ADDED);
173 pds.clear();
tome5ec3fd2014-09-04 15:18:06 -0700174
tom24c55cd2014-09-06 10:47:25 -0700175 pds.add(new DefaultPortDescription(P1, false));
176 pds.add(new DefaultPortDescription(P3, true));
177 providerService.updatePorts(DID1, pds);
178 validateEvents(PORT_UPDATED, PORT_REMOVED);
179 }
180
181 @Test
182 public void updatePortStatus() {
183 connectDevice(DID1, SW1);
184 List<PortDescription> pds = new ArrayList<>();
185 pds.add(new DefaultPortDescription(P1, true));
186 pds.add(new DefaultPortDescription(P2, true));
187 providerService.updatePorts(DID1, pds);
188 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
189
190 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
191 validateEvents(PORT_UPDATED);
192 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
193 assertTrue("no events expected", listener.events.isEmpty());
194 }
195
196 @Test
197 public void getPorts() {
198 connectDevice(DID1, SW1);
199 List<PortDescription> pds = new ArrayList<>();
200 pds.add(new DefaultPortDescription(P1, true));
201 pds.add(new DefaultPortDescription(P2, true));
202 providerService.updatePorts(DID1, pds);
203 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
204 assertEquals("wrong port count", 2, service.getPorts(DID1).size());
205
206 Port port = service.getPort(DID1, P1);
207 assertEquals("incorrect port", P1, service.getPort(DID1, P1).number());
208 assertEquals("incorrect state", true, service.getPort(DID1, P1).isEnabled());
209 }
210
211 @Test
212 public void removeDevice() {
213 connectDevice(DID1, SW1);
214 connectDevice(DID2, SW2);
tomad2d2092014-09-06 23:24:20 -0700215 assertEquals("incorrect device count", 2, service.getDeviceCount());
tom24c55cd2014-09-06 10:47:25 -0700216 admin.removeDevice(DID1);
217 assertNull("device should not be found", service.getDevice(DID1));
218 assertNotNull("device should be found", service.getDevice(DID2));
tomad2d2092014-09-06 23:24:20 -0700219 assertEquals("incorrect device count", 1, service.getDeviceCount());
220
tom24c55cd2014-09-06 10:47:25 -0700221 }
tome5ec3fd2014-09-04 15:18:06 -0700222
223 protected void validateEvents(Enum... types) {
224 int i = 0;
225 assertEquals("wrong events received", types.length, listener.events.size());
226 for (Event event : listener.events) {
227 assertEquals("incorrect event type", types[i], event.type());
228 i++;
229 }
230 listener.events.clear();
231 }
232
233
234 private class TestProvider extends AbstractProvider implements DeviceProvider {
235 private Device deviceReceived;
236 private MastershipRole roleReceived;
237
238 public TestProvider() {
239 super(PID);
240 }
241
242 @Override
243 public void triggerProbe(Device device) {
244 }
245
246 @Override
247 public void roleChanged(Device device, MastershipRole newRole) {
248 deviceReceived = device;
249 roleReceived = newRole;
250 }
251 }
252
253 private static class TestListener implements DeviceListener {
254 final List<DeviceEvent> events = new ArrayList<>();
255
256 @Override
257 public void event(DeviceEvent event) {
258 events.add(event);
259 }
260 }
261
Ayaka Koshibec4047702014-10-07 14:43:52 -0700262 private static class TestMastershipService
263 extends MastershipServiceAdapter {
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700264 @Override
tomb41d1ac2014-09-24 01:51:24 -0700265 public MastershipRole getLocalRole(DeviceId deviceId) {
266 return MastershipRole.MASTER;
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700267 }
268
269 @Override
270 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
271 return Sets.newHashSet(DID1, DID2);
272 }
273
274 @Override
275 public MastershipRole requestRoleFor(DeviceId deviceId) {
276 return MastershipRole.MASTER;
277 }
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700278 }
279
tome5ec3fd2014-09-04 15:18:06 -0700280}