blob: 77d3f1d1c603baf675322d760dbd715da01b9a22 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.device.impl;
tome5ec3fd2014-09-04 15:18:06 -070017
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070018import com.google.common.collect.Sets;
tome5ec3fd2014-09-04 15:18:06 -070019import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
Ray Milkeycc53abd2015-02-19 12:31:33 -080022import org.onlab.packet.ChassisId;
23import org.onlab.packet.IpAddress;
24import org.onosproject.cluster.ClusterServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.cluster.ControllerNode;
26import org.onosproject.cluster.DefaultControllerNode;
27import org.onosproject.cluster.NodeId;
Thomas Vachuska36002e62015-05-19 16:12:29 -070028import org.onosproject.common.event.impl.TestEventDispatcher;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070029import org.onosproject.event.Event;
Sahil Lele3a0cdd52015-07-21 14:16:31 -070030import org.onosproject.incubator.net.config.NetworkConfigServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080031import org.onosproject.mastership.MastershipServiceAdapter;
32import org.onosproject.mastership.MastershipTerm;
33import org.onosproject.mastership.MastershipTermService;
34import org.onosproject.net.Device;
35import org.onosproject.net.DeviceId;
36import org.onosproject.net.MastershipRole;
37import org.onosproject.net.Port;
38import org.onosproject.net.PortNumber;
39import org.onosproject.net.device.DefaultDeviceDescription;
40import org.onosproject.net.device.DefaultPortDescription;
41import org.onosproject.net.device.DeviceAdminService;
42import org.onosproject.net.device.DeviceClockProviderService;
43import org.onosproject.net.device.DeviceDescription;
44import org.onosproject.net.device.DeviceEvent;
45import org.onosproject.net.device.DeviceListener;
46import org.onosproject.net.device.DeviceProvider;
47import org.onosproject.net.device.DeviceProviderRegistry;
48import org.onosproject.net.device.DeviceProviderService;
49import org.onosproject.net.device.DeviceService;
50import org.onosproject.net.device.PortDescription;
51import org.onosproject.net.provider.AbstractProvider;
52import org.onosproject.net.provider.ProviderId;
Thomas Vachuskac97aa612015-06-23 16:00:18 -070053import org.onosproject.store.trivial.SimpleDeviceStore;
tome5ec3fd2014-09-04 15:18:06 -070054
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070055import java.util.ArrayList;
56import java.util.Iterator;
57import java.util.List;
58import java.util.Set;
59import java.util.concurrent.CompletableFuture;
tome5ec3fd2014-09-04 15:18:06 -070060
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070061import static org.junit.Assert.*;
Brian O'Connorabafb502014-12-02 22:26:20 -080062import static org.onosproject.net.Device.Type.SWITCH;
63import static org.onosproject.net.DeviceId.deviceId;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070064import static org.onosproject.net.NetTestTools.injectEventDispatcher;
65import static org.onosproject.net.device.DeviceEvent.Type.*;
tome5ec3fd2014-09-04 15:18:06 -070066
67/**
68 * Test codifying the device service & device provider service contracts.
69 */
tom41a2c5f2014-09-19 09:20:35 -070070public class DeviceManagerTest {
tome5ec3fd2014-09-04 15:18:06 -070071
tom7e02cda2014-09-18 12:05:46 -070072 private static final ProviderId PID = new ProviderId("of", "foo");
tome5ec3fd2014-09-04 15:18:06 -070073 private static final DeviceId DID1 = deviceId("of:foo");
74 private static final DeviceId DID2 = deviceId("of:bar");
75 private static final String MFR = "whitebox";
76 private static final String HW = "1.1.x";
77 private static final String SW1 = "3.8.1";
78 private static final String SW2 = "3.9.5";
79 private static final String SN = "43311-12345";
alshabib7911a052014-10-16 17:49:37 -070080 private static final ChassisId CID = new ChassisId();
tome5ec3fd2014-09-04 15:18:06 -070081
tom24c55cd2014-09-06 10:47:25 -070082 private static final PortNumber P1 = PortNumber.portNumber(1);
83 private static final PortNumber P2 = PortNumber.portNumber(2);
84 private static final PortNumber P3 = PortNumber.portNumber(3);
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -070085 private static final NodeId NID_LOCAL = new NodeId("local");
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070086 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
tom24c55cd2014-09-06 10:47:25 -070087
tom41a2c5f2014-09-19 09:20:35 -070088 private DeviceManager mgr;
tome5ec3fd2014-09-04 15:18:06 -070089
90 protected DeviceService service;
91 protected DeviceAdminService admin;
92 protected DeviceProviderRegistry registry;
93 protected DeviceProviderService providerService;
94 protected TestProvider provider;
95 protected TestListener listener = new TestListener();
96
97 @Before
98 public void setUp() {
tom41a2c5f2014-09-19 09:20:35 -070099 mgr = new DeviceManager();
tome5ec3fd2014-09-04 15:18:06 -0700100 service = mgr;
101 admin = mgr;
102 registry = mgr;
tom41a2c5f2014-09-19 09:20:35 -0700103 mgr.store = new SimpleDeviceStore();
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700104 injectEventDispatcher(mgr, new TestEventDispatcher());
Yuta HIGUCHIbcac4992014-11-22 19:27:57 -0800105 TestMastershipManager mastershipManager = new TestMastershipManager();
106 mgr.mastershipService = mastershipManager;
107 mgr.termService = mastershipManager;
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700108 mgr.clusterService = new TestClusterService();
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700109 mgr.deviceClockProviderService = new TestClockProviderService();
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700110 mgr.networkConfigService = new TestNetworkConfigService();
tome5ec3fd2014-09-04 15:18:06 -0700111 mgr.activate();
112
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700113
tome5ec3fd2014-09-04 15:18:06 -0700114 service.addListener(listener);
115
116 provider = new TestProvider();
117 providerService = registry.register(provider);
118 assertTrue("provider should be registered",
119 registry.getProviders().contains(provider.id()));
120 }
121
122 @After
123 public void tearDown() {
124 registry.unregister(provider);
125 assertFalse("provider should not be registered",
126 registry.getProviders().contains(provider.id()));
127 service.removeListener(listener);
128 mgr.deactivate();
129 }
130
131 private void connectDevice(DeviceId deviceId, String swVersion) {
132 DeviceDescription description =
133 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700134 HW, swVersion, SN, CID);
tome5ec3fd2014-09-04 15:18:06 -0700135 providerService.deviceConnected(deviceId, description);
136 assertNotNull("device should be found", service.getDevice(DID1));
137 }
138
139 @Test
140 public void deviceConnected() {
141 assertNull("device should not be found", service.getDevice(DID1));
142 connectDevice(DID1, SW1);
143 validateEvents(DEVICE_ADDED);
144
145 Iterator<Device> it = service.getDevices().iterator();
146 assertNotNull("one device expected", it.next());
147 assertFalse("only one device expected", it.hasNext());
tomad2d2092014-09-06 23:24:20 -0700148 assertEquals("incorrect device count", 1, service.getDeviceCount());
tomff7eb7c2014-09-08 12:49:03 -0700149 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700150 }
151
152 @Test
153 public void deviceDisconnected() {
154 connectDevice(DID1, SW1);
155 connectDevice(DID2, SW1);
156 validateEvents(DEVICE_ADDED, DEVICE_ADDED);
tomff7eb7c2014-09-08 12:49:03 -0700157 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700158
159 // Disconnect
160 providerService.deviceDisconnected(DID1);
161 assertNotNull("device should not be found", service.getDevice(DID1));
tomff7eb7c2014-09-08 12:49:03 -0700162 assertFalse("device should not be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700163 validateEvents(DEVICE_AVAILABILITY_CHANGED);
164
165 // Reconnect
166 connectDevice(DID1, SW1);
167 validateEvents(DEVICE_AVAILABILITY_CHANGED);
tomad2d2092014-09-06 23:24:20 -0700168
169 assertEquals("incorrect device count", 2, service.getDeviceCount());
tome5ec3fd2014-09-04 15:18:06 -0700170 }
171
172 @Test
173 public void deviceUpdated() {
174 connectDevice(DID1, SW1);
175 validateEvents(DEVICE_ADDED);
176
177 connectDevice(DID1, SW2);
178 validateEvents(DEVICE_UPDATED);
179 }
180
181 @Test
182 public void getRole() {
183 connectDevice(DID1, SW1);
tom80c0e5e2014-09-08 18:08:58 -0700184 assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700185 }
186
tom24c55cd2014-09-06 10:47:25 -0700187 @Test
188 public void updatePorts() {
189 connectDevice(DID1, SW1);
190 List<PortDescription> pds = new ArrayList<>();
191 pds.add(new DefaultPortDescription(P1, true));
192 pds.add(new DefaultPortDescription(P2, true));
193 pds.add(new DefaultPortDescription(P3, true));
194 providerService.updatePorts(DID1, pds);
195 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED, PORT_ADDED);
196 pds.clear();
tome5ec3fd2014-09-04 15:18:06 -0700197
tom24c55cd2014-09-06 10:47:25 -0700198 pds.add(new DefaultPortDescription(P1, false));
199 pds.add(new DefaultPortDescription(P3, true));
200 providerService.updatePorts(DID1, pds);
201 validateEvents(PORT_UPDATED, PORT_REMOVED);
202 }
203
204 @Test
205 public void updatePortStatus() {
206 connectDevice(DID1, SW1);
207 List<PortDescription> pds = new ArrayList<>();
208 pds.add(new DefaultPortDescription(P1, true));
209 pds.add(new DefaultPortDescription(P2, true));
210 providerService.updatePorts(DID1, pds);
211 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
212
213 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
214 validateEvents(PORT_UPDATED);
215 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
216 assertTrue("no events expected", listener.events.isEmpty());
217 }
218
219 @Test
220 public void getPorts() {
221 connectDevice(DID1, SW1);
222 List<PortDescription> pds = new ArrayList<>();
223 pds.add(new DefaultPortDescription(P1, true));
224 pds.add(new DefaultPortDescription(P2, true));
225 providerService.updatePorts(DID1, pds);
226 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
227 assertEquals("wrong port count", 2, service.getPorts(DID1).size());
228
229 Port port = service.getPort(DID1, P1);
230 assertEquals("incorrect port", P1, service.getPort(DID1, P1).number());
231 assertEquals("incorrect state", true, service.getPort(DID1, P1).isEnabled());
232 }
233
234 @Test
235 public void removeDevice() {
236 connectDevice(DID1, SW1);
237 connectDevice(DID2, SW2);
tomad2d2092014-09-06 23:24:20 -0700238 assertEquals("incorrect device count", 2, service.getDeviceCount());
tom24c55cd2014-09-06 10:47:25 -0700239 admin.removeDevice(DID1);
240 assertNull("device should not be found", service.getDevice(DID1));
241 assertNotNull("device should be found", service.getDevice(DID2));
tomad2d2092014-09-06 23:24:20 -0700242 assertEquals("incorrect device count", 1, service.getDeviceCount());
243
tom24c55cd2014-09-06 10:47:25 -0700244 }
tome5ec3fd2014-09-04 15:18:06 -0700245
246 protected void validateEvents(Enum... types) {
247 int i = 0;
248 assertEquals("wrong events received", types.length, listener.events.size());
249 for (Event event : listener.events) {
250 assertEquals("incorrect event type", types[i], event.type());
251 i++;
252 }
253 listener.events.clear();
254 }
255
256
257 private class TestProvider extends AbstractProvider implements DeviceProvider {
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700258 private DeviceId deviceReceived;
tome5ec3fd2014-09-04 15:18:06 -0700259 private MastershipRole roleReceived;
260
261 public TestProvider() {
262 super(PID);
263 }
264
265 @Override
Ayaka Koshibe78bcbc12014-11-19 14:28:58 -0800266 public void triggerProbe(DeviceId deviceId) {
tome5ec3fd2014-09-04 15:18:06 -0700267 }
268
269 @Override
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700270 public void roleChanged(DeviceId device, MastershipRole newRole) {
tome5ec3fd2014-09-04 15:18:06 -0700271 deviceReceived = device;
272 roleReceived = newRole;
273 }
Ayaka Koshibee60d4522014-10-28 15:07:00 -0700274
275 @Override
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700276 public boolean isReachable(DeviceId device) {
Ayaka Koshibee60d4522014-10-28 15:07:00 -0700277 return false;
278 }
tome5ec3fd2014-09-04 15:18:06 -0700279 }
280
281 private static class TestListener implements DeviceListener {
282 final List<DeviceEvent> events = new ArrayList<>();
283
284 @Override
285 public void event(DeviceEvent event) {
286 events.add(event);
287 }
288 }
289
Yuta HIGUCHIbcac4992014-11-22 19:27:57 -0800290 private static class TestMastershipManager
291 extends MastershipServiceAdapter implements MastershipTermService {
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700292 @Override
tomb41d1ac2014-09-24 01:51:24 -0700293 public MastershipRole getLocalRole(DeviceId deviceId) {
294 return MastershipRole.MASTER;
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700295 }
296
297 @Override
298 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
299 return Sets.newHashSet(DID1, DID2);
300 }
301
302 @Override
Madan Jampanide003d92015-05-11 17:14:20 -0700303 public CompletableFuture<MastershipRole> requestRoleFor(DeviceId deviceId) {
304 return CompletableFuture.completedFuture(MastershipRole.MASTER);
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700305 }
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700306
307 @Override
Madan Jampanic6e574f2015-05-29 13:41:52 -0700308 public CompletableFuture<Void> relinquishMastership(DeviceId deviceId) {
309 return CompletableFuture.completedFuture(null);
310 }
311
312 @Override
Yuta HIGUCHIbcac4992014-11-22 19:27:57 -0800313 public MastershipTerm getMastershipTerm(DeviceId deviceId) {
314 // FIXME: just returning something not null
315 return MastershipTerm.of(NID_LOCAL, 1);
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700316 }
Ayaka Koshibea7f044e2014-09-23 16:56:20 -0700317 }
318
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700319 // code clone
Ray Milkeycc53abd2015-02-19 12:31:33 -0800320 private final class TestClusterService extends ClusterServiceAdapter {
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700321
322 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
323
324 @Override
325 public ControllerNode getLocalNode() {
326 return local;
327 }
328
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700329 }
330
331 private final class TestClockProviderService implements
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700332 DeviceClockProviderService {
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700333
Yuta HIGUCHI13c0b872014-10-30 18:09:22 -0700334 private Set<DeviceId> registerdBefore = Sets.newConcurrentHashSet();
335
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700336 @Override
337 public void setMastershipTerm(DeviceId deviceId, MastershipTerm term) {
Yuta HIGUCHI13c0b872014-10-30 18:09:22 -0700338 registerdBefore.add(deviceId);
339 }
340
341 @Override
342 public boolean isTimestampAvailable(DeviceId deviceId) {
343 return registerdBefore.contains(deviceId);
Yuta HIGUCHI33faeaf2014-10-07 18:19:44 -0700344 }
345 }
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700346
347 private class TestNetworkConfigService extends NetworkConfigServiceAdapter {
348 }
tome5ec3fd2014-09-04 15:18:06 -0700349}