blob: ec2708494c64a18dde2d9e13f9cbf0731b88812b [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;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070052import org.projectfloodlight.openflow.protocol.OFFactory;
53import org.projectfloodlight.openflow.protocol.OFMessage;
54import org.projectfloodlight.openflow.protocol.OFPortDesc;
55import org.projectfloodlight.openflow.protocol.OFPortReason;
56import org.projectfloodlight.openflow.protocol.OFPortStatus;
57import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
58import org.projectfloodlight.openflow.types.OFPort;
59
60import com.google.common.collect.HashMultimap;
61import com.google.common.collect.Lists;
62import com.google.common.collect.Multimap;
63
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;
89 controller.switchMap.put(DPID1, SW1);
90 provider.activate();
91 assertNotNull("provider should be registered", registry.provider);
92 assertNotNull("listener should be registered", controller.listener);
93 assertEquals("devices not added", 1, registry.connected.size());
94 assertEquals("ports not added", 2, registry.ports.get(DID1).size());
95 }
96
97 @After
98 public void tearDown() {
99 provider.deactivate();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700100 assertNull("listener should be removed", controller.listener);
101 provider.controller = null;
102 provider.providerRegistry = null;
103 }
104
105 @Test
106 public void roleChanged() {
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700107 provider.roleChanged(DID1, MASTER);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700108 assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700109 provider.roleChanged(DID1, STANDBY);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700110 assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
Yuta HIGUCHI54815322014-10-31 23:17:08 -0700111 provider.roleChanged(DID1, NONE);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700112 assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
113 }
114
115 @Test
116 public void triggerProbe() {
alshabib4785eec2014-12-04 16:45:45 -0800117
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700118 }
119
120 @Test
121 public void switchRemoved() {
122 controller.listener.switchRemoved(DPID1);
123 assertTrue("device not removed", registry.connected.isEmpty());
124 }
125
126 @Test
127 public void portChanged() {
128 OFPortStatus stat = SW1.factory().buildPortStatus()
129 .setReason(OFPortReason.ADD)
130 .setDesc(PD3)
131 .build();
132 controller.listener.portChanged(DPID1, stat);
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700133 assertNotNull("never went throught the provider service", registry.descr);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700134 assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
135 }
136
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700137 @Test
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700138 public void receivedRoleReply() {
139 // check translation capabilities
140 controller.listener.receivedRoleReply(DPID1, RoleState.MASTER, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700141 assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700142 controller.listener.receivedRoleReply(DPID1, RoleState.EQUAL, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700143 assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY));
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700144 controller.listener.receivedRoleReply(DPID1, RoleState.SLAVE, RoleState.MASTER);
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700145 assertEquals("wrong role reported", DPID1, registry.roles.get(NONE));
146 }
147
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700148 private static OFPortDesc portDesc(int port) {
149 OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
150 builder.setPortNo(OFPort.of(port));
151
152 return builder.build();
153 }
154
155 private class TestDeviceRegistry implements DeviceProviderRegistry {
156 DeviceProvider provider;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700157
158 Set<DeviceId> connected = new HashSet<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700159 Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700160 PortDescription descr = null;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700161 Map<MastershipRole, Dpid> roles = new HashMap<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700162
163 @Override
164 public DeviceProviderService register(DeviceProvider provider) {
165 this.provider = provider;
166 return new TestProviderService();
167 }
168
169 @Override
170 public void unregister(DeviceProvider provider) {
171 }
172
173 @Override
174 public Set<ProviderId> getProviders() {
175 return null;
176 }
177
178 private class TestProviderService implements DeviceProviderService {
179
180 @Override
181 public DeviceProvider provider() {
182 return null;
183 }
184
185 @Override
186 public void deviceConnected(DeviceId deviceId,
187 DeviceDescription deviceDescription) {
188 connected.add(deviceId);
189 }
190
191 @Override
192 public void deviceDisconnected(DeviceId deviceId) {
193 connected.remove(deviceId);
194 ports.removeAll(deviceId);
195 }
196
197 @Override
198 public void updatePorts(DeviceId deviceId,
199 List<PortDescription> portDescriptions) {
200 for (PortDescription p : portDescriptions) {
201 ports.put(deviceId, p);
202 }
203 }
204
205 @Override
206 public void portStatusChanged(DeviceId deviceId,
207 PortDescription portDescription) {
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700208 ports.put(deviceId, portDescription);
209 descr = portDescription;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700210 }
211
tom3f2bbd72014-09-24 12:07:58 -0700212 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700213 public void receivedRoleReply(DeviceId deviceId,
214 MastershipRole requested, MastershipRole response) {
215 roles.put(requested, Dpid.dpid(deviceId.uri()));
tom3f2bbd72014-09-24 12:07:58 -0700216 }
217
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700218 }
219 }
220
221 private class TestController implements OpenFlowController {
222 OpenFlowSwitchListener listener = null;
223 Map<Dpid, RoleState> roleMap = new HashMap<Dpid, RoleState>();
224 Map<Dpid, OpenFlowSwitch> switchMap = new HashMap<Dpid, OpenFlowSwitch>();
225
226 @Override
227 public Iterable<OpenFlowSwitch> getSwitches() {
228 return switchMap.values();
229 }
230
231 @Override
232 public Iterable<OpenFlowSwitch> getMasterSwitches() {
233 return null;
234 }
235
236 @Override
237 public Iterable<OpenFlowSwitch> getEqualSwitches() {
238 return null;
239 }
240
241 @Override
242 public OpenFlowSwitch getSwitch(Dpid dpid) {
243 return switchMap.get(dpid);
244 }
245
246 @Override
247 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
248 return null;
249 }
250
251 @Override
252 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
253
254 return null;
255 }
256
257 @Override
258 public void addListener(OpenFlowSwitchListener listener) {
259 this.listener = listener;
260 }
261
262 @Override
263 public void removeListener(OpenFlowSwitchListener listener) {
264 this.listener = null;
265 }
266
267 @Override
268 public void addPacketListener(int priority, PacketListener listener) {
269 }
270
271 @Override
272 public void removePacketListener(PacketListener listener) {
273 }
274
275 @Override
276 public void addEventListener(OpenFlowEventListener listener) {
277 }
278
279 @Override
280 public void removeEventListener(OpenFlowEventListener listener) {
281 }
282
283 @Override
284 public void write(Dpid dpid, OFMessage msg) {
285 }
286
287 @Override
288 public void processPacket(Dpid dpid, OFMessage msg) {
289 }
290
291 @Override
292 public void setRole(Dpid dpid, RoleState role) {
293 roleMap.put(dpid, role);
294 }
295 }
296
297 private static class TestOpenFlowSwitch implements OpenFlowSwitch {
298
299 RoleState state;
300 List<OFMessage> sent = new ArrayList<OFMessage>();
301 OFFactory factory = OFFactoryVer10.INSTANCE;
302
303 @Override
304 public void sendMsg(OFMessage msg) {
305 sent.add(msg);
306 }
307
308 @Override
309 public void sendMsg(List<OFMessage> msgs) {
310 }
311
312 @Override
313 public void handleMessage(OFMessage fromSwitch) {
314 }
315
316 @Override
317 public void setRole(RoleState role) {
318 state = role;
319 }
320
321 @Override
322 public RoleState getRole() {
323 return state;
324 }
325
326 @Override
327 public List<OFPortDesc> getPorts() {
328 return PLIST;
329 }
330
331 @Override
332 public OFFactory factory() {
333 return factory;
334 }
335
336 @Override
337 public String getStringId() {
338 return null;
339 }
340
341 @Override
342 public long getId() {
343 return DPID1.value();
344 }
345
346 @Override
347 public String manfacturerDescription() {
348 return null;
349 }
350
351 @Override
352 public String datapathDescription() {
353 return null;
354 }
355
356 @Override
357 public String hardwareDescription() {
358 return null;
359 }
360
361 @Override
362 public String softwareDescription() {
363 return null;
364 }
365
366 @Override
367 public String serialNumber() {
368 return null;
369 }
370
371 @Override
Yuta HIGUCHI69a27352014-10-31 15:48:37 -0700372 public boolean isConnected() {
373 return true;
374 }
375
376 @Override
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700377 public void disconnectSwitch() {
378 }
379
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700380 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700381 public boolean isOptical() {
382 return false;
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700383 }
384
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700385 @Override
Ayaka Koshibe3ef2b0d2014-10-31 13:58:27 -0700386 public void returnRoleReply(RoleState requested, RoleState reponse) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700387 }
388
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700389 }
390
391}