blob: eff79bf0bf5e2ee8fce952f968eea2cb5d93a383 [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++) {
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800142 deviceDescription.portDescriptions.add(DefaultPortDescription.builder()
143 .withPortNumber(PortNumber.portNumber(i)).isEnabled(true).build());
Michal Mach958adf62017-06-05 16:29:13 +0200144 }
145 }
146
YuanyouZhangb5e05302015-07-21 20:14:35 +0800147 private class TestDeviceRegistry implements DeviceProviderRegistry {
148 DeviceProvider provider;
149
Michal Mach958adf62017-06-05 16:29:13 +0200150 final Set<DeviceId> connected = new HashSet<>();
151 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
YuanyouZhangb5e05302015-07-21 20:14:35 +0800152 PortDescription descr = null;
153
154 @Override
155 public DeviceProviderService register(DeviceProvider provider) {
156 this.provider = provider;
157 return new TestProviderService();
158 }
159
160 @Override
161 public void unregister(DeviceProvider provider) {
162 }
163
164 @Override
165 public Set<ProviderId> getProviders() {
166 return null;
167 }
168
169 private class TestProviderService implements DeviceProviderService {
170
171 @Override
172 public DeviceProvider provider() {
173 return null;
174 }
175
176 @Override
177 public void deviceConnected(DeviceId deviceId,
178 DeviceDescription deviceDescription) {
179 connected.add(deviceId);
180 }
181
182 @Override
183 public void deviceDisconnected(DeviceId deviceId) {
184 connected.remove(deviceId);
185 ports.removeAll(deviceId);
186 }
187
188 @Override
189 public void updatePorts(DeviceId deviceId,
190 List<PortDescription> portDescriptions) {
191 for (PortDescription p : portDescriptions) {
192 ports.put(deviceId, p);
193 }
194 }
195
196 @Override
197 public void portStatusChanged(DeviceId deviceId,
198 PortDescription portDescription) {
199 ports.put(deviceId, portDescription);
200 descr = portDescription;
201 }
202
203 @Override
204 public void receivedRoleReply(DeviceId deviceId,
205 MastershipRole requested,
206 MastershipRole response) {
207 }
208
209 @Override
210 public void updatePortStatistics(DeviceId deviceId,
211 Collection<PortStatistics> portStatistics) {
212
213 }
214
215 }
216 }
217
218 private class TestController implements OvsdbController {
219 OvsdbNodeListener listener = null;
220
221 @Override
222 public void addNodeListener(OvsdbNodeListener listener) {
223 this.listener = listener;
224 }
225
226 @Override
227 public void removeNodeListener(OvsdbNodeListener listener) {
228 this.listener = null;
229 }
230
231 @Override
232 public void addOvsdbEventListener(OvsdbEventListener listener) {
233
234 }
235
236 @Override
237 public void removeOvsdbEventListener(OvsdbEventListener listener) {
238
239 }
240
241 @Override
242 public List<OvsdbNodeId> getNodeIds() {
243 return null;
244 }
245
246 @Override
247 public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) {
248 return null;
249 }
250
Hyunsun Moon5fb20a52015-09-25 17:02:33 -0700251 @Override
252 public void connect(IpAddress ip, TpPort port) {
253
254 }
jaegonkim1af0ae52017-01-01 10:46:55 +0900255
256 @Override
257 public void connect(IpAddress ip, TpPort port, Consumer<Exception> failhandler) {
258
259 }
260
Jian Lieaf31032018-05-03 15:54:03 +0900261 @Override
262 public void setServerMode(boolean serverMode) {
263
264 }
265
YuanyouZhangb5e05302015-07-21 20:14:35 +0800266 }
267
Michal Mach958adf62017-06-05 16:29:13 +0200268 private class TestDeviceService extends DeviceServiceAdapter {
269 DeviceListener listener = null;
270
271 @Override
272 public Device getDevice(DeviceId deviceId) {
273 return ovsdbDevice;
274 }
275
276 @Override
277 public void addListener(DeviceListener listener) {
278 this.listener = listener;
279 }
280
281 @Override
282 public void removeListener(DeviceListener listener) {
283 this.listener = null;
284 }
285 }
286
Rafal Szaleckid4e07f42017-10-05 16:18:39 +0200287 private class TestMastershipService extends MastershipServiceAdapter {
288 @Override
289 public MastershipRole getLocalRole(DeviceId deviceId) {
290 return MastershipRole.MASTER;
291 }
292
293 }
294
Michal Mach958adf62017-06-05 16:29:13 +0200295 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
296
297 final List<PortDescription> portDescriptions = new ArrayList<>();
298
299 @Override
300 public DeviceDescription discoverDeviceDetails() {
301 return null;
302 }
303
304 @Override
305 public List<PortDescription> discoverPortDetails() {
306 return portDescriptions;
307 }
308 }
309
310 private class MockDevice extends DefaultDevice {
311
312 MockDevice(DeviceId id,
313 Annotations... annotations) {
314 super(null, id, Type.SWITCH, null, null, null, null,
315 null, annotations);
316 }
317
318 @Override
319 public <B extends Behaviour> B as(Class<B> projectionClass) {
320 return (B) deviceDescription;
321 }
322
323 @Override
324 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
325 return true;
326 }
327
328 }
329
YuanyouZhangb5e05302015-07-21 20:14:35 +0800330}