blob: 23a806afcfcefbb01f624f93d032240681f7203d [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070019package org.onlab.onos.provider.of.device.impl;
20
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertNotNull;
23import static org.junit.Assert.assertNull;
24import static org.junit.Assert.assertTrue;
25import static org.onlab.onos.net.Device.Type.*;
26import static org.onlab.onos.net.MastershipRole.*;
27
28import java.util.ArrayList;
29import java.util.HashMap;
30import java.util.HashSet;
31import java.util.List;
32import java.util.Map;
33import java.util.Set;
34
35import org.junit.After;
36import org.junit.Before;
37import org.junit.Test;
38import org.onlab.onos.net.DefaultDevice;
39import org.onlab.onos.net.Device;
40import org.onlab.onos.net.DeviceId;
tom3f2bbd72014-09-24 12:07:58 -070041import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070042import org.onlab.onos.net.device.DeviceDescription;
43import org.onlab.onos.net.device.DeviceProvider;
44import org.onlab.onos.net.device.DeviceProviderRegistry;
45import org.onlab.onos.net.device.DeviceProviderService;
46import org.onlab.onos.net.device.PortDescription;
47import org.onlab.onos.net.provider.ProviderId;
48import org.onlab.onos.openflow.controller.Dpid;
49import org.onlab.onos.openflow.controller.OpenFlowController;
50import org.onlab.onos.openflow.controller.OpenFlowEventListener;
51import org.onlab.onos.openflow.controller.OpenFlowSwitch;
52import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
53import org.onlab.onos.openflow.controller.PacketListener;
54import org.onlab.onos.openflow.controller.RoleState;
55import org.projectfloodlight.openflow.protocol.OFFactory;
56import org.projectfloodlight.openflow.protocol.OFMessage;
57import org.projectfloodlight.openflow.protocol.OFPortDesc;
58import org.projectfloodlight.openflow.protocol.OFPortReason;
59import org.projectfloodlight.openflow.protocol.OFPortStatus;
60import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
61import org.projectfloodlight.openflow.types.OFPort;
62
63import com.google.common.collect.HashMultimap;
64import com.google.common.collect.Lists;
65import com.google.common.collect.Multimap;
66
67public class OpenFlowDeviceProviderTest {
68
69 private static final ProviderId PID = new ProviderId("of", "test");
70 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
71 private static final Dpid DPID1 = Dpid.dpid(DID1.uri());
72
73 private static final OFPortDesc PD1 = portDesc(1);
74 private static final OFPortDesc PD2 = portDesc(2);
75 private static final OFPortDesc PD3 = portDesc(3);
76
77 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
78
79 private static final Device DEV1 =
alshabib7911a052014-10-16 17:49:37 -070080 new DefaultDevice(PID, DID1, SWITCH, "", "", "", "", null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070081
82 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
83
84 private final OpenFlowDeviceProvider provider = new OpenFlowDeviceProvider();
85 private final TestDeviceRegistry registry = new TestDeviceRegistry();
86 private final TestController controller = new TestController();
87
88 @Before
89 public void startUp() {
90 provider.providerRegistry = registry;
91 provider.controller = controller;
92 controller.switchMap.put(DPID1, SW1);
93 provider.activate();
94 assertNotNull("provider should be registered", registry.provider);
95 assertNotNull("listener should be registered", controller.listener);
96 assertEquals("devices not added", 1, registry.connected.size());
97 assertEquals("ports not added", 2, registry.ports.get(DID1).size());
98 }
99
100 @After
101 public void tearDown() {
102 provider.deactivate();
103 assertTrue("devices should be removed", registry.connected.isEmpty());
104 assertNull("listener should be removed", controller.listener);
105 provider.controller = null;
106 provider.providerRegistry = null;
107 }
108
109 @Test
110 public void roleChanged() {
111 provider.roleChanged(DEV1, MASTER);
112 assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
113 provider.roleChanged(DEV1, STANDBY);
114 assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
115 provider.roleChanged(DEV1, NONE);
116 assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
117 }
118
119 @Test
120 public void triggerProbe() {
121 // TODO
122 }
123
124 @Test
125 public void switchRemoved() {
126 controller.listener.switchRemoved(DPID1);
127 assertTrue("device not removed", registry.connected.isEmpty());
128 }
129
130 @Test
131 public void portChanged() {
132 OFPortStatus stat = SW1.factory().buildPortStatus()
133 .setReason(OFPortReason.ADD)
134 .setDesc(PD3)
135 .build();
136 controller.listener.portChanged(DPID1, stat);
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700137 assertNotNull("never went throught the provider service", registry.descr);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700138 assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
139 }
140
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700141 @Test
142 public void roleAssertFailed() {
143 controller.listener.roleAssertFailed(DPID1, RoleState.MASTER);
144 assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER));
145 controller.listener.roleAssertFailed(DPID1, RoleState.EQUAL);
146 assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY));
147 controller.listener.roleAssertFailed(DPID1, RoleState.SLAVE);
148 assertEquals("wrong role reported", DPID1, registry.roles.get(NONE));
149 }
150
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700151 private static OFPortDesc portDesc(int port) {
152 OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
153 builder.setPortNo(OFPort.of(port));
154
155 return builder.build();
156 }
157
158 private class TestDeviceRegistry implements DeviceProviderRegistry {
159 DeviceProvider provider;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700160
161 Set<DeviceId> connected = new HashSet<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700162 Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700163 PortDescription descr = null;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700164 Map<MastershipRole, Dpid> roles = new HashMap<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700165
166 @Override
167 public DeviceProviderService register(DeviceProvider provider) {
168 this.provider = provider;
169 return new TestProviderService();
170 }
171
172 @Override
173 public void unregister(DeviceProvider provider) {
174 }
175
176 @Override
177 public Set<ProviderId> getProviders() {
178 return null;
179 }
180
181 private class TestProviderService implements DeviceProviderService {
182
183 @Override
184 public DeviceProvider provider() {
185 return null;
186 }
187
188 @Override
189 public void deviceConnected(DeviceId deviceId,
190 DeviceDescription deviceDescription) {
191 connected.add(deviceId);
192 }
193
194 @Override
195 public void deviceDisconnected(DeviceId deviceId) {
196 connected.remove(deviceId);
197 ports.removeAll(deviceId);
198 }
199
200 @Override
201 public void updatePorts(DeviceId deviceId,
202 List<PortDescription> portDescriptions) {
203 for (PortDescription p : portDescriptions) {
204 ports.put(deviceId, p);
205 }
206 }
207
208 @Override
209 public void portStatusChanged(DeviceId deviceId,
210 PortDescription portDescription) {
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700211 ports.put(deviceId, portDescription);
212 descr = portDescription;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700213 }
214
tom3f2bbd72014-09-24 12:07:58 -0700215 @Override
216 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700217 roles.put(role, 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
349 public String manfacturerDescription() {
350 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
374 public void disconnectSwitch() {
375 }
376
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700377 @Override
378 public void returnRoleAssertFailure(RoleState role) {
379 }
380
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700381 @Override
382 public boolean isOptical() {
383 return false;
384 }
385
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700386 }
387
388}