blob: c83da172e72f607c1be6cea07c54f537412dbcd9 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 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
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertNull;
21import static org.junit.Assert.assertTrue;
Brian O'Connorabafb502014-12-02 22:26:20 -080022import static org.onosproject.net.Device.Type.*;
23import static org.onosproject.net.MastershipRole.*;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070024
25import java.util.ArrayList;
26import java.util.HashMap;
27import java.util.HashSet;
28import java.util.List;
29import java.util.Map;
30import java.util.Set;
31
32import org.junit.After;
33import org.junit.Before;
34import org.junit.Test;
Brian O'Connorabafb502014-12-02 22:26:20 -080035import org.onosproject.net.DefaultDevice;
36import org.onosproject.net.Device;
37import org.onosproject.net.DeviceId;
38import org.onosproject.net.MastershipRole;
39import org.onosproject.net.device.DeviceDescription;
40import org.onosproject.net.device.DeviceProvider;
41import org.onosproject.net.device.DeviceProviderRegistry;
42import org.onosproject.net.device.DeviceProviderService;
43import org.onosproject.net.device.PortDescription;
44import org.onosproject.net.provider.ProviderId;
45import org.onosproject.openflow.controller.Dpid;
46import org.onosproject.openflow.controller.OpenFlowController;
47import org.onosproject.openflow.controller.OpenFlowEventListener;
48import org.onosproject.openflow.controller.OpenFlowSwitch;
49import org.onosproject.openflow.controller.OpenFlowSwitchListener;
50import org.onosproject.openflow.controller.PacketListener;
51import org.onosproject.openflow.controller.RoleState;
Saurav Dasfa2fa932015-03-03 11:29:48 -080052import org.onosproject.openflow.controller.OpenFlowSwitch.TableType;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070053import org.projectfloodlight.openflow.protocol.OFFactory;
54import org.projectfloodlight.openflow.protocol.OFMessage;
55import org.projectfloodlight.openflow.protocol.OFPortDesc;
56import org.projectfloodlight.openflow.protocol.OFPortReason;
57import org.projectfloodlight.openflow.protocol.OFPortStatus;
58import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
59import org.projectfloodlight.openflow.types.OFPort;
Saurav Dasfa2fa932015-03-03 11:29:48 -080060import org.projectfloodlight.openflow.types.TableId;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070061
62import com.google.common.collect.HashMultimap;
63import com.google.common.collect.Lists;
64import com.google.common.collect.Multimap;
65
66public class OpenFlowDeviceProviderTest {
67
68 private static final ProviderId PID = new ProviderId("of", "test");
69 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
70 private static final Dpid DPID1 = Dpid.dpid(DID1.uri());
71
72 private static final OFPortDesc PD1 = portDesc(1);
73 private static final OFPortDesc PD2 = portDesc(2);
74 private static final OFPortDesc PD3 = portDesc(3);
75
76 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
77
78 private static final Device DEV1 =
alshabib7911a052014-10-16 17:49:37 -070079 new DefaultDevice(PID, DID1, SWITCH, "", "", "", "", null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070080
81 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
82
83 private final OpenFlowDeviceProvider provider = new OpenFlowDeviceProvider();
84 private final TestDeviceRegistry registry = new TestDeviceRegistry();
85 private final TestController controller = new TestController();
86
87 @Before
88 public void startUp() {
89 provider.providerRegistry = registry;
90 provider.controller = controller;
91 controller.switchMap.put(DPID1, SW1);
92 provider.activate();
93 assertNotNull("provider should be registered", registry.provider);
94 assertNotNull("listener should be registered", controller.listener);
95 assertEquals("devices not added", 1, registry.connected.size());
96 assertEquals("ports not added", 2, registry.ports.get(DID1).size());
97 }
98
99 @After
100 public void tearDown() {
101 provider.deactivate();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700102 assertNull("listener should be removed", controller.listener);
103 provider.controller = null;
104 provider.providerRegistry = null;
105 }
106
107 @Test
108 public void roleChanged() {
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700109 provider.roleChanged(DID1, MASTER);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700110 assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700111 provider.roleChanged(DID1, STANDBY);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700112 assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700113 provider.roleChanged(DID1, NONE);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700114 assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
115 }
116
117 @Test
118 public void triggerProbe() {
alshabib4785eec2014-12-04 16:45:45 -0800119
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700120 }
121
122 @Test
123 public void switchRemoved() {
124 controller.listener.switchRemoved(DPID1);
125 assertTrue("device not removed", registry.connected.isEmpty());
126 }
127
128 @Test
129 public void portChanged() {
130 OFPortStatus stat = SW1.factory().buildPortStatus()
131 .setReason(OFPortReason.ADD)
132 .setDesc(PD3)
133 .build();
134 controller.listener.portChanged(DPID1, stat);
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700135 assertNotNull("never went throught the provider service", registry.descr);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700136 assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
137 }
138
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700139 @Test
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700140 public void receivedRoleReply() {
141 // check translation capabilities
142 controller.listener.receivedRoleReply(DPID1, RoleState.MASTER, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700143 assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700144 controller.listener.receivedRoleReply(DPID1, RoleState.EQUAL, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700145 assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700146 controller.listener.receivedRoleReply(DPID1, RoleState.SLAVE, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700147 assertEquals("wrong role reported", DPID1, registry.roles.get(NONE));
148 }
149
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700150 private static OFPortDesc portDesc(int port) {
151 OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
152 builder.setPortNo(OFPort.of(port));
153
154 return builder.build();
155 }
156
157 private class TestDeviceRegistry implements DeviceProviderRegistry {
158 DeviceProvider provider;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700159
160 Set<DeviceId> connected = new HashSet<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700161 Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700162 PortDescription descr = null;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700163 Map<MastershipRole, Dpid> roles = new HashMap<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700164
165 @Override
166 public DeviceProviderService register(DeviceProvider provider) {
167 this.provider = provider;
168 return new TestProviderService();
169 }
170
171 @Override
172 public void unregister(DeviceProvider provider) {
173 }
174
175 @Override
176 public Set<ProviderId> getProviders() {
177 return null;
178 }
179
180 private class TestProviderService implements DeviceProviderService {
181
182 @Override
183 public DeviceProvider provider() {
184 return null;
185 }
186
187 @Override
188 public void deviceConnected(DeviceId deviceId,
189 DeviceDescription deviceDescription) {
190 connected.add(deviceId);
191 }
192
193 @Override
194 public void deviceDisconnected(DeviceId deviceId) {
195 connected.remove(deviceId);
196 ports.removeAll(deviceId);
197 }
198
199 @Override
200 public void updatePorts(DeviceId deviceId,
201 List<PortDescription> portDescriptions) {
202 for (PortDescription p : portDescriptions) {
203 ports.put(deviceId, p);
204 }
205 }
206
207 @Override
208 public void portStatusChanged(DeviceId deviceId,
209 PortDescription portDescription) {
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700210 ports.put(deviceId, portDescription);
211 descr = portDescription;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700212 }
213
tom3f2bbd72014-09-24 12:07:58 -0700214 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700215 public void receivedRoleReply(DeviceId deviceId,
216 MastershipRole requested, MastershipRole response) {
217 roles.put(requested, Dpid.dpid(deviceId.uri()));
tom3f2bbd72014-09-24 12:07:58 -0700218 }
219
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700220 }
221 }
222
223 private class TestController implements OpenFlowController {
224 OpenFlowSwitchListener listener = null;
225 Map<Dpid, RoleState> roleMap = new HashMap<Dpid, RoleState>();
226 Map<Dpid, OpenFlowSwitch> switchMap = new HashMap<Dpid, OpenFlowSwitch>();
227
228 @Override
229 public Iterable<OpenFlowSwitch> getSwitches() {
230 return switchMap.values();
231 }
232
233 @Override
234 public Iterable<OpenFlowSwitch> getMasterSwitches() {
235 return null;
236 }
237
238 @Override
239 public Iterable<OpenFlowSwitch> getEqualSwitches() {
240 return null;
241 }
242
243 @Override
244 public OpenFlowSwitch getSwitch(Dpid dpid) {
245 return switchMap.get(dpid);
246 }
247
248 @Override
249 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
250 return null;
251 }
252
253 @Override
254 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
255
256 return null;
257 }
258
259 @Override
260 public void addListener(OpenFlowSwitchListener listener) {
261 this.listener = listener;
262 }
263
264 @Override
265 public void removeListener(OpenFlowSwitchListener listener) {
266 this.listener = null;
267 }
268
269 @Override
270 public void addPacketListener(int priority, PacketListener listener) {
271 }
272
273 @Override
274 public void removePacketListener(PacketListener listener) {
275 }
276
277 @Override
278 public void addEventListener(OpenFlowEventListener listener) {
279 }
280
281 @Override
282 public void removeEventListener(OpenFlowEventListener listener) {
283 }
284
285 @Override
286 public void write(Dpid dpid, OFMessage msg) {
287 }
288
289 @Override
290 public void processPacket(Dpid dpid, OFMessage msg) {
291 }
292
293 @Override
294 public void setRole(Dpid dpid, RoleState role) {
295 roleMap.put(dpid, role);
296 }
297 }
298
299 private static class TestOpenFlowSwitch implements OpenFlowSwitch {
300
301 RoleState state;
302 List<OFMessage> sent = new ArrayList<OFMessage>();
303 OFFactory factory = OFFactoryVer10.INSTANCE;
304
305 @Override
306 public void sendMsg(OFMessage msg) {
307 sent.add(msg);
308 }
309
310 @Override
311 public void sendMsg(List<OFMessage> msgs) {
312 }
313
314 @Override
315 public void handleMessage(OFMessage fromSwitch) {
316 }
317
318 @Override
319 public void setRole(RoleState role) {
320 state = role;
321 }
322
323 @Override
324 public RoleState getRole() {
325 return state;
326 }
327
328 @Override
329 public List<OFPortDesc> getPorts() {
330 return PLIST;
331 }
332
333 @Override
334 public OFFactory factory() {
335 return factory;
336 }
337
338 @Override
339 public String getStringId() {
340 return null;
341 }
342
343 @Override
344 public long getId() {
345 return DPID1.value();
346 }
347
348 @Override
Ray Milkeyd3edd032015-01-16 11:38:58 -0800349 public String manufacturerDescription() {
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700350 return null;
351 }
352
353 @Override
354 public String datapathDescription() {
355 return null;
356 }
357
358 @Override
359 public String hardwareDescription() {
360 return null;
361 }
362
363 @Override
364 public String softwareDescription() {
365 return null;
366 }
367
368 @Override
369 public String serialNumber() {
370 return null;
371 }
372
373 @Override
Yuta HIGUCHI69a27352014-10-31 15:48:37 -0700374 public boolean isConnected() {
375 return true;
376 }
377
378 @Override
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700379 public void disconnectSwitch() {
380 }
381
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700382 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700383 public boolean isOptical() {
384 return false;
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700385 }
386
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700387 @Override
Ray Milkeye53f1712015-01-16 09:17:16 -0800388 public void returnRoleReply(RoleState requested, RoleState response) {
389 }
390
391 @Override
392 public String channelId() {
393 return "1.2.3.4:1";
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700394 }
395
Saurav Dasfa2fa932015-03-03 11:29:48 -0800396 @Override
397 public TableType getTableType(TableId tid) {
398 return TableType.NONE;
399 }
400
401 @Override
402 public void transformAndSendMsg(OFMessage msg, TableType tableType) {
403 // TODO Auto-generated method stub
404 }
405
406
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700407 }
408
409}