blob: ad37efc3f83f2103d190d0568703a9e000071126 [file] [log] [blame]
YuanyouZhangb5e05302015-07-21 20:14:35 +08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
YuanyouZhangb5e05302015-07-21 20:14:35 +08003 *
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 */
16package org.onosproject.ovsdb.providers.device;
17
Michal Mach958adf62017-06-05 16:29:13 +020018import com.google.common.collect.HashMultimap;
19import com.google.common.collect.Multimap;
Yuta HIGUCHI10517fd2017-06-07 09:34:31 -070020import com.google.common.util.concurrent.MoreExecutors;
21
YuanyouZhangb5e05302015-07-21 20:14:35 +080022import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.packet.IpAddress;
Hyunsun Moon5fb20a52015-09-25 17:02:33 -070026import org.onlab.packet.TpPort;
Rafal Szaleckid4e07f42017-10-05 16:18:39 +020027import org.onosproject.mastership.MastershipServiceAdapter;
Michal Mach958adf62017-06-05 16:29:13 +020028import org.onosproject.net.Annotations;
29import org.onosproject.net.DefaultAnnotations;
30import org.onosproject.net.DefaultDevice;
31import org.onosproject.net.Device;
YuanyouZhangb5e05302015-07-21 20:14:35 +080032import org.onosproject.net.DeviceId;
33import org.onosproject.net.MastershipRole;
Michal Mach958adf62017-06-05 16:29:13 +020034import org.onosproject.net.PortNumber;
35import org.onosproject.net.device.DefaultPortDescription;
YuanyouZhangb5e05302015-07-21 20:14:35 +080036import org.onosproject.net.device.DeviceDescription;
Michal Mach958adf62017-06-05 16:29:13 +020037import org.onosproject.net.device.DeviceDescriptionDiscovery;
38import org.onosproject.net.device.DeviceEvent;
39import org.onosproject.net.device.DeviceListener;
YuanyouZhangb5e05302015-07-21 20:14:35 +080040import org.onosproject.net.device.DeviceProvider;
41import org.onosproject.net.device.DeviceProviderRegistry;
42import org.onosproject.net.device.DeviceProviderService;
Michal Mach958adf62017-06-05 16:29:13 +020043import org.onosproject.net.device.DeviceServiceAdapter;
YuanyouZhangb5e05302015-07-21 20:14:35 +080044import org.onosproject.net.device.PortDescription;
45import org.onosproject.net.device.PortStatistics;
Michal Mach958adf62017-06-05 16:29:13 +020046import org.onosproject.net.driver.AbstractHandlerBehaviour;
47import org.onosproject.net.driver.Behaviour;
YuanyouZhangb5e05302015-07-21 20:14:35 +080048import org.onosproject.net.provider.ProviderId;
49import org.onosproject.ovsdb.controller.OvsdbClientService;
50import org.onosproject.ovsdb.controller.OvsdbController;
51import org.onosproject.ovsdb.controller.OvsdbEventListener;
52import org.onosproject.ovsdb.controller.OvsdbNodeId;
53import org.onosproject.ovsdb.controller.OvsdbNodeListener;
54
Michal Mach958adf62017-06-05 16:29:13 +020055import java.util.ArrayList;
56import java.util.Collection;
57import java.util.HashSet;
58import java.util.List;
59import java.util.Set;
Michal Mach958adf62017-06-05 16:29:13 +020060import java.util.function.Consumer;
61
62import static org.junit.Assert.assertEquals;
63import static org.junit.Assert.assertNotNull;
YuanyouZhangb5e05302015-07-21 20:14:35 +080064
65/**
66 * Test for ovsdb device provider.
67 */
68public class OvsdbDeviceProviderTest {
69 private final OvsdbDeviceProvider provider = new OvsdbDeviceProvider();
70 private final TestDeviceRegistry registry = new TestDeviceRegistry();
71 private final TestController controller = new TestController();
Michal Mach958adf62017-06-05 16:29:13 +020072 private final TestDeviceService deviceService = new TestDeviceService();
Rafal Szaleckid4e07f42017-10-05 16:18:39 +020073 private final TestMastershipService mastershipService = new TestMastershipService();
Michal Mach958adf62017-06-05 16:29:13 +020074
75 private final Device ovsdbDevice = new MockDevice(
76 DeviceId.deviceId("ovsdb:127.0.0.1"),
77 DefaultAnnotations.EMPTY);
78
79 private final Device notOvsdbDevice = new MockDevice(
80 DeviceId.deviceId("other:127.0.0.1"),
81 DefaultAnnotations.EMPTY);
82
83 private final TestDescription deviceDescription = new TestDescription();
84
YuanyouZhangb5e05302015-07-21 20:14:35 +080085
86 @Before
87 public void startUp() {
88 provider.providerRegistry = registry;
89 provider.controller = controller;
Michal Mach958adf62017-06-05 16:29:13 +020090 provider.deviceService = deviceService;
Rafal Szaleckid4e07f42017-10-05 16:18:39 +020091 provider.mastershipService = mastershipService;
YuanyouZhangb5e05302015-07-21 20:14:35 +080092 provider.activate();
93 assertNotNull("provider should be registered", registry.provider);
94 }
95
96 @After
97 public void tearDown() {
98 provider.deactivate();
99 provider.controller = null;
100 provider.providerRegistry = null;
Michal Mach958adf62017-06-05 16:29:13 +0200101 provider.deviceService = null;
YuanyouZhangb5e05302015-07-21 20:14:35 +0800102 }
103
104 @Test
105 public void testNodeAdded() {
106 controller.listener.nodeAdded(new OvsdbNodeId(IpAddress
107 .valueOf("192.168.202.36"), 5000));
108 assertEquals("ovsdb node added", 1, registry.connected.size());
109 }
110
111 @Test
112 public void testNodeRemoved() {
113 controller.listener.nodeAdded(new OvsdbNodeId(IpAddress
114 .valueOf("192.168.202.36"), 5000));
115 controller.listener.nodeRemoved(new OvsdbNodeId(IpAddress
116 .valueOf("192.168.202.36"), 5000));
117 assertEquals("ovsdb node removded", 0, registry.connected.size());
118 }
119
Michal Mach958adf62017-06-05 16:29:13 +0200120 @Test
121 public void testDiscoverPortsAfterDeviceAdded() {
122 final int portCount = 5;
Yuta HIGUCHI10517fd2017-06-07 09:34:31 -0700123 provider.executor = MoreExecutors.newDirectExecutorService();
Michal Mach958adf62017-06-05 16:29:13 +0200124 prepareMocks(portCount);
125
Rafal Szaleckid4e07f42017-10-05 16:18:39 +0200126 DeviceEvent event = new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, ovsdbDevice);
127 if (deviceService.listener.isRelevant(event)) {
128 deviceService.listener.event(event);
129 }
130
131 event = new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, notOvsdbDevice);
132 if (deviceService.listener.isRelevant(event)) {
133 deviceService.listener.event(event);
134 }
Michal Mach958adf62017-06-05 16:29:13 +0200135
136 assertEquals(portCount, registry.ports.get(ovsdbDevice.id()).size());
137 assertEquals(0, registry.ports.get(notOvsdbDevice.id()).size());
138 }
139
140 private void prepareMocks(int count) {
Yuta HIGUCHI10517fd2017-06-07 09:34:31 -0700141 for (int i = 1; i <= count; i++) {
Michal Mach958adf62017-06-05 16:29:13 +0200142 deviceDescription.portDescriptions.add(new DefaultPortDescription(PortNumber.portNumber(i), true));
143 }
144 }
145
YuanyouZhangb5e05302015-07-21 20:14:35 +0800146 private class TestDeviceRegistry implements DeviceProviderRegistry {
147 DeviceProvider provider;
148
Michal Mach958adf62017-06-05 16:29:13 +0200149 final Set<DeviceId> connected = new HashSet<>();
150 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
YuanyouZhangb5e05302015-07-21 20:14:35 +0800151 PortDescription descr = null;
152
153 @Override
154 public DeviceProviderService register(DeviceProvider provider) {
155 this.provider = provider;
156 return new TestProviderService();
157 }
158
159 @Override
160 public void unregister(DeviceProvider provider) {
161 }
162
163 @Override
164 public Set<ProviderId> getProviders() {
165 return null;
166 }
167
168 private class TestProviderService implements DeviceProviderService {
169
170 @Override
171 public DeviceProvider provider() {
172 return null;
173 }
174
175 @Override
176 public void deviceConnected(DeviceId deviceId,
177 DeviceDescription deviceDescription) {
178 connected.add(deviceId);
179 }
180
181 @Override
182 public void deviceDisconnected(DeviceId deviceId) {
183 connected.remove(deviceId);
184 ports.removeAll(deviceId);
185 }
186
187 @Override
188 public void updatePorts(DeviceId deviceId,
189 List<PortDescription> portDescriptions) {
190 for (PortDescription p : portDescriptions) {
191 ports.put(deviceId, p);
192 }
193 }
194
195 @Override
196 public void portStatusChanged(DeviceId deviceId,
197 PortDescription portDescription) {
198 ports.put(deviceId, portDescription);
199 descr = portDescription;
200 }
201
202 @Override
203 public void receivedRoleReply(DeviceId deviceId,
204 MastershipRole requested,
205 MastershipRole response) {
206 }
207
208 @Override
209 public void updatePortStatistics(DeviceId deviceId,
210 Collection<PortStatistics> portStatistics) {
211
212 }
213
214 }
215 }
216
217 private class TestController implements OvsdbController {
218 OvsdbNodeListener listener = null;
219
220 @Override
221 public void addNodeListener(OvsdbNodeListener listener) {
222 this.listener = listener;
223 }
224
225 @Override
226 public void removeNodeListener(OvsdbNodeListener listener) {
227 this.listener = null;
228 }
229
230 @Override
231 public void addOvsdbEventListener(OvsdbEventListener listener) {
232
233 }
234
235 @Override
236 public void removeOvsdbEventListener(OvsdbEventListener listener) {
237
238 }
239
240 @Override
241 public List<OvsdbNodeId> getNodeIds() {
242 return null;
243 }
244
245 @Override
246 public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) {
247 return null;
248 }
249
Hyunsun Moon5fb20a52015-09-25 17:02:33 -0700250 @Override
251 public void connect(IpAddress ip, TpPort port) {
252
253 }
jaegonkim1af0ae52017-01-01 10:46:55 +0900254
255 @Override
256 public void connect(IpAddress ip, TpPort port, Consumer<Exception> failhandler) {
257
258 }
259
YuanyouZhangb5e05302015-07-21 20:14:35 +0800260 }
261
Michal Mach958adf62017-06-05 16:29:13 +0200262 private class TestDeviceService extends DeviceServiceAdapter {
263 DeviceListener listener = null;
264
265 @Override
266 public Device getDevice(DeviceId deviceId) {
267 return ovsdbDevice;
268 }
269
270 @Override
271 public void addListener(DeviceListener listener) {
272 this.listener = listener;
273 }
274
275 @Override
276 public void removeListener(DeviceListener listener) {
277 this.listener = null;
278 }
279 }
280
Rafal Szaleckid4e07f42017-10-05 16:18:39 +0200281 private class TestMastershipService extends MastershipServiceAdapter {
282 @Override
283 public MastershipRole getLocalRole(DeviceId deviceId) {
284 return MastershipRole.MASTER;
285 }
286
287 }
288
Michal Mach958adf62017-06-05 16:29:13 +0200289 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
290
291 final List<PortDescription> portDescriptions = new ArrayList<>();
292
293 @Override
294 public DeviceDescription discoverDeviceDetails() {
295 return null;
296 }
297
298 @Override
299 public List<PortDescription> discoverPortDetails() {
300 return portDescriptions;
301 }
302 }
303
304 private class MockDevice extends DefaultDevice {
305
306 MockDevice(DeviceId id,
307 Annotations... annotations) {
308 super(null, id, Type.SWITCH, null, null, null, null,
309 null, annotations);
310 }
311
312 @Override
313 public <B extends Behaviour> B as(Class<B> projectionClass) {
314 return (B) deviceDescription;
315 }
316
317 @Override
318 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
319 return true;
320 }
321
322 }
323
YuanyouZhangb5e05302015-07-21 20:14:35 +0800324}