blob: 7b4d792222c4fc33305b976666f6fe0ce7ef92f1 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.provider.of.device.impl;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070017
alshabibb452fd72015-04-22 20:46:20 -070018import com.google.common.collect.HashMultimap;
19import com.google.common.collect.Lists;
20import com.google.common.collect.Multimap;
Dusan Pajinbab8a5e2015-07-24 17:37:19 +020021
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070022import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
Dusan Pajinbab8a5e2015-07-24 17:37:19 +020025import org.onosproject.cfg.ComponentConfigAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.DefaultDevice;
27import org.onosproject.net.Device;
28import org.onosproject.net.DeviceId;
29import org.onosproject.net.MastershipRole;
30import org.onosproject.net.device.DeviceDescription;
31import org.onosproject.net.device.DeviceProvider;
32import org.onosproject.net.device.DeviceProviderRegistry;
33import org.onosproject.net.device.DeviceProviderService;
34import org.onosproject.net.device.PortDescription;
sangho538108b2015-04-08 14:29:20 -070035import org.onosproject.net.device.PortStatistics;
Brian O'Connorabafb502014-12-02 22:26:20 -080036import org.onosproject.net.provider.ProviderId;
37import org.onosproject.openflow.controller.Dpid;
38import org.onosproject.openflow.controller.OpenFlowController;
39import org.onosproject.openflow.controller.OpenFlowEventListener;
40import org.onosproject.openflow.controller.OpenFlowSwitch;
41import org.onosproject.openflow.controller.OpenFlowSwitchListener;
42import org.onosproject.openflow.controller.PacketListener;
43import org.onosproject.openflow.controller.RoleState;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070044import org.projectfloodlight.openflow.protocol.OFFactory;
45import org.projectfloodlight.openflow.protocol.OFMessage;
46import org.projectfloodlight.openflow.protocol.OFPortDesc;
47import org.projectfloodlight.openflow.protocol.OFPortReason;
48import org.projectfloodlight.openflow.protocol.OFPortStatus;
49import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
50import org.projectfloodlight.openflow.types.OFPort;
51
alshabibb452fd72015-04-22 20:46:20 -070052import java.util.ArrayList;
53import java.util.Collection;
54import java.util.HashMap;
55import java.util.HashSet;
56import java.util.List;
57import java.util.Map;
58import java.util.Set;
59
60import static org.junit.Assert.*;
61import static org.onosproject.net.Device.Type.SWITCH;
62import static org.onosproject.net.MastershipRole.*;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070063
64public class OpenFlowDeviceProviderTest {
65
66 private static final ProviderId PID = new ProviderId("of", "test");
67 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
68 private static final Dpid DPID1 = Dpid.dpid(DID1.uri());
69
70 private static final OFPortDesc PD1 = portDesc(1);
71 private static final OFPortDesc PD2 = portDesc(2);
72 private static final OFPortDesc PD3 = portDesc(3);
73
74 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
75
76 private static final Device DEV1 =
alshabib7911a052014-10-16 17:49:37 -070077 new DefaultDevice(PID, DID1, SWITCH, "", "", "", "", null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070078
79 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
80
81 private final OpenFlowDeviceProvider provider = new OpenFlowDeviceProvider();
82 private final TestDeviceRegistry registry = new TestDeviceRegistry();
83 private final TestController controller = new TestController();
84
85 @Before
86 public void startUp() {
87 provider.providerRegistry = registry;
88 provider.controller = controller;
Dusan Pajinbab8a5e2015-07-24 17:37:19 +020089 provider.cfgService = new ComponentConfigAdapter();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070090 controller.switchMap.put(DPID1, SW1);
Dusan Pajinbab8a5e2015-07-24 17:37:19 +020091 provider.activate(null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070092 assertNotNull("provider should be registered", registry.provider);
93 assertNotNull("listener should be registered", controller.listener);
94 assertEquals("devices not added", 1, registry.connected.size());
95 assertEquals("ports not added", 2, registry.ports.get(DID1).size());
96 }
97
98 @After
99 public void tearDown() {
Dusan Pajinbab8a5e2015-07-24 17:37:19 +0200100 provider.deactivate(null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700101 assertNull("listener should be removed", controller.listener);
102 provider.controller = null;
103 provider.providerRegistry = null;
104 }
105
106 @Test
107 public void roleChanged() {
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700108 provider.roleChanged(DID1, MASTER);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700109 assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700110 provider.roleChanged(DID1, STANDBY);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700111 assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700112 provider.roleChanged(DID1, NONE);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700113 assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
114 }
115
116 @Test
117 public void triggerProbe() {
alshabib4785eec2014-12-04 16:45:45 -0800118
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700119 }
120
121 @Test
122 public void switchRemoved() {
123 controller.listener.switchRemoved(DPID1);
124 assertTrue("device not removed", registry.connected.isEmpty());
125 }
126
127 @Test
128 public void portChanged() {
129 OFPortStatus stat = SW1.factory().buildPortStatus()
130 .setReason(OFPortReason.ADD)
131 .setDesc(PD3)
132 .build();
133 controller.listener.portChanged(DPID1, stat);
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700134 assertNotNull("never went throught the provider service", registry.descr);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700135 assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
136 }
137
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700138 @Test
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700139 public void receivedRoleReply() {
140 // check translation capabilities
141 controller.listener.receivedRoleReply(DPID1, RoleState.MASTER, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700142 assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700143 controller.listener.receivedRoleReply(DPID1, RoleState.EQUAL, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700144 assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700145 controller.listener.receivedRoleReply(DPID1, RoleState.SLAVE, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700146 assertEquals("wrong role reported", DPID1, registry.roles.get(NONE));
147 }
148
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700149 private static OFPortDesc portDesc(int port) {
150 OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
151 builder.setPortNo(OFPort.of(port));
152
153 return builder.build();
154 }
155
156 private class TestDeviceRegistry implements DeviceProviderRegistry {
157 DeviceProvider provider;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700158
159 Set<DeviceId> connected = new HashSet<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700160 Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700161 PortDescription descr = null;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700162 Map<MastershipRole, Dpid> roles = new HashMap<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700163
164 @Override
165 public DeviceProviderService register(DeviceProvider provider) {
166 this.provider = provider;
167 return new TestProviderService();
168 }
169
170 @Override
171 public void unregister(DeviceProvider provider) {
172 }
173
174 @Override
175 public Set<ProviderId> getProviders() {
176 return null;
177 }
178
179 private class TestProviderService implements DeviceProviderService {
180
181 @Override
182 public DeviceProvider provider() {
183 return null;
184 }
185
186 @Override
187 public void deviceConnected(DeviceId deviceId,
188 DeviceDescription deviceDescription) {
189 connected.add(deviceId);
190 }
191
192 @Override
193 public void deviceDisconnected(DeviceId deviceId) {
194 connected.remove(deviceId);
195 ports.removeAll(deviceId);
196 }
197
198 @Override
199 public void updatePorts(DeviceId deviceId,
200 List<PortDescription> portDescriptions) {
201 for (PortDescription p : portDescriptions) {
202 ports.put(deviceId, p);
203 }
204 }
205
206 @Override
207 public void portStatusChanged(DeviceId deviceId,
208 PortDescription portDescription) {
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700209 ports.put(deviceId, portDescription);
210 descr = portDescription;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700211 }
212
tom3f2bbd72014-09-24 12:07:58 -0700213 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700214 public void receivedRoleReply(DeviceId deviceId,
215 MastershipRole requested, MastershipRole response) {
216 roles.put(requested, Dpid.dpid(deviceId.uri()));
tom3f2bbd72014-09-24 12:07:58 -0700217 }
218
sangho538108b2015-04-08 14:29:20 -0700219 @Override
220 public void updatePortStatistics(DeviceId deviceId, Collection<PortStatistics> portStatistics) {
221
222 }
223
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700224 }
225 }
226
227 private class TestController implements OpenFlowController {
228 OpenFlowSwitchListener listener = null;
229 Map<Dpid, RoleState> roleMap = new HashMap<Dpid, RoleState>();
230 Map<Dpid, OpenFlowSwitch> switchMap = new HashMap<Dpid, OpenFlowSwitch>();
231
232 @Override
233 public Iterable<OpenFlowSwitch> getSwitches() {
234 return switchMap.values();
235 }
236
237 @Override
238 public Iterable<OpenFlowSwitch> getMasterSwitches() {
239 return null;
240 }
241
242 @Override
243 public Iterable<OpenFlowSwitch> getEqualSwitches() {
244 return null;
245 }
246
247 @Override
248 public OpenFlowSwitch getSwitch(Dpid dpid) {
249 return switchMap.get(dpid);
250 }
251
252 @Override
253 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
254 return null;
255 }
256
257 @Override
258 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
259
260 return null;
261 }
262
263 @Override
264 public void addListener(OpenFlowSwitchListener listener) {
265 this.listener = listener;
266 }
267
268 @Override
269 public void removeListener(OpenFlowSwitchListener listener) {
270 this.listener = null;
271 }
272
273 @Override
274 public void addPacketListener(int priority, PacketListener listener) {
275 }
276
277 @Override
278 public void removePacketListener(PacketListener listener) {
279 }
280
281 @Override
282 public void addEventListener(OpenFlowEventListener listener) {
283 }
284
285 @Override
286 public void removeEventListener(OpenFlowEventListener listener) {
287 }
288
289 @Override
290 public void write(Dpid dpid, OFMessage msg) {
291 }
292
293 @Override
294 public void processPacket(Dpid dpid, OFMessage msg) {
295 }
296
297 @Override
298 public void setRole(Dpid dpid, RoleState role) {
299 roleMap.put(dpid, role);
300 }
301 }
302
303 private static class TestOpenFlowSwitch implements OpenFlowSwitch {
304
305 RoleState state;
306 List<OFMessage> sent = new ArrayList<OFMessage>();
307 OFFactory factory = OFFactoryVer10.INSTANCE;
308
309 @Override
310 public void sendMsg(OFMessage msg) {
311 sent.add(msg);
312 }
313
314 @Override
315 public void sendMsg(List<OFMessage> msgs) {
316 }
317
318 @Override
319 public void handleMessage(OFMessage fromSwitch) {
320 }
321
322 @Override
323 public void setRole(RoleState role) {
324 state = role;
325 }
326
327 @Override
328 public RoleState getRole() {
329 return state;
330 }
331
332 @Override
333 public List<OFPortDesc> getPorts() {
334 return PLIST;
335 }
336
337 @Override
338 public OFFactory factory() {
339 return factory;
340 }
341
342 @Override
343 public String getStringId() {
344 return null;
345 }
346
347 @Override
348 public long getId() {
349 return DPID1.value();
350 }
351
352 @Override
Ray Milkeyd3edd032015-01-16 11:38:58 -0800353 public String manufacturerDescription() {
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700354 return null;
355 }
356
357 @Override
358 public String datapathDescription() {
359 return null;
360 }
361
362 @Override
363 public String hardwareDescription() {
364 return null;
365 }
366
367 @Override
368 public String softwareDescription() {
369 return null;
370 }
371
372 @Override
373 public String serialNumber() {
374 return null;
375 }
376
377 @Override
Yuta HIGUCHI69a27352014-10-31 15:48:37 -0700378 public boolean isConnected() {
379 return true;
380 }
381
382 @Override
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700383 public void disconnectSwitch() {
384 }
385
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700386 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700387 public Device.Type deviceType() {
388 return Device.Type.SWITCH;
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700389 }
390
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700391 @Override
Ray Milkeye53f1712015-01-16 09:17:16 -0800392 public void returnRoleReply(RoleState requested, RoleState response) {
393 }
394
395 @Override
396 public String channelId() {
397 return "1.2.3.4:1";
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700398 }
399
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700400 }
401
402}