blob: cd1e7bbd740348a6bc2a39a9242d20497f55752d [file] [log] [blame]
Thomas Vachuska58de4162015-09-10 16:15:33 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Thomas Vachuska58de4162015-09-10 16:15:33 -07003 *
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 */
sanghoa09f2742015-02-06 14:49:47 -080016package org.onosproject.provider.of.group.impl;
17
18import com.google.common.collect.Lists;
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onosproject.core.DefaultGroupId;
23import org.onosproject.core.GroupId;
Marc De Leenheerb9311372015-07-09 11:36:49 -070024import org.onosproject.net.Device;
sanghoa09f2742015-02-06 14:49:47 -080025import org.onosproject.net.DeviceId;
26import org.onosproject.net.PortNumber;
27import org.onosproject.net.flow.DefaultTrafficTreatment;
28import org.onosproject.net.flow.TrafficTreatment;
29import org.onosproject.net.group.DefaultGroupBucket;
30import org.onosproject.net.group.Group;
31import org.onosproject.net.group.GroupBucket;
32import org.onosproject.net.group.GroupBuckets;
33import org.onosproject.net.group.GroupDescription;
34import org.onosproject.net.group.GroupOperation;
35import org.onosproject.net.group.GroupOperations;
36import org.onosproject.net.group.GroupProvider;
37import org.onosproject.net.group.GroupProviderRegistry;
38import org.onosproject.net.group.GroupProviderService;
39import org.onosproject.net.provider.AbstractProviderService;
40import org.onosproject.net.provider.ProviderId;
41import org.onosproject.openflow.controller.Dpid;
42import org.onosproject.openflow.controller.OpenFlowController;
43import org.onosproject.openflow.controller.OpenFlowEventListener;
Jian Lia78cdb22016-04-21 13:03:58 -070044import org.onosproject.openflow.controller.OpenFlowMessageListener;
sanghoa09f2742015-02-06 14:49:47 -080045import org.onosproject.openflow.controller.OpenFlowSwitch;
46import org.onosproject.openflow.controller.OpenFlowSwitchListener;
47import org.onosproject.openflow.controller.PacketListener;
48import org.onosproject.openflow.controller.RoleState;
49import org.projectfloodlight.openflow.protocol.OFFactories;
50import org.projectfloodlight.openflow.protocol.OFFactory;
51import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
52import org.projectfloodlight.openflow.protocol.OFGroupMod;
53import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
54import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
55import org.projectfloodlight.openflow.protocol.OFGroupType;
56import org.projectfloodlight.openflow.protocol.OFMessage;
Jordi Ortizaa8de492016-12-01 00:21:36 +010057import org.projectfloodlight.openflow.protocol.OFMeterFeatures;
sanghoa09f2742015-02-06 14:49:47 -080058import org.projectfloodlight.openflow.protocol.OFPortDesc;
59import org.projectfloodlight.openflow.protocol.OFVersion;
60import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
61import org.projectfloodlight.openflow.types.OFGroup;
62
63import java.util.Collection;
64import java.util.List;
65import java.util.Set;
66
alshabibb452fd72015-04-22 20:46:20 -070067import static org.junit.Assert.*;
sanghoa09f2742015-02-06 14:49:47 -080068
69public class OpenFlowGroupProviderTest {
70
71 OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
72 private final OpenFlowController controller = new TestController();
73 GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
74 GroupProviderService providerService;
75
76 private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
77 private Dpid dpid1 = Dpid.dpid(deviceId.uri());
78
79 @Before
80 public void setUp() {
81 provider.controller = controller;
82 provider.providerRegistry = providerRegistry;
83 provider.activate();
84 }
85
86 @Test
87 public void basics() {
88 assertNotNull("registration expected", providerService);
89 assertEquals("incorrect provider", provider, providerService.provider());
90 }
91
92 @Test
93 public void addGroup() {
94
95 GroupId groupId = new DefaultGroupId(1);
96
97 List<GroupBucket> bucketList = Lists.newArrayList();
98 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
99 builder.setOutput(PortNumber.portNumber(1));
100 GroupBucket bucket =
101 DefaultGroupBucket.createSelectGroupBucket(builder.build());
102 bucketList.add(bucket);
103 GroupBuckets buckets = new GroupBuckets(bucketList);
104
105 List<GroupOperation> operationList = Lists.newArrayList();
106 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
107 GroupDescription.Type.SELECT, buckets);
108 operationList.add(operation);
109 GroupOperations operations = new GroupOperations(operationList);
110
111 provider.performGroupOperation(deviceId, operations);
112
113 final Dpid dpid = Dpid.dpid(deviceId.uri());
114 TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
115 assertNotNull("Switch should not be nul", sw);
116 assertNotNull("OFGroupMsg should not be null", sw.msg);
117
118 }
119
120
121 @Test
122 public void groupModFailure() {
123 TestOpenFlowGroupProviderService testProviderService =
124 (TestOpenFlowGroupProviderService) providerService;
125
126 GroupId groupId = new DefaultGroupId(1);
127 List<GroupBucket> bucketList = Lists.newArrayList();
128 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
129 builder.setOutput(PortNumber.portNumber(1));
130 GroupBucket bucket =
131 DefaultGroupBucket.createSelectGroupBucket(builder.build());
132 bucketList.add(bucket);
133 GroupBuckets buckets = new GroupBuckets(bucketList);
134 List<GroupOperation> operationList = Lists.newArrayList();
135 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
136 GroupDescription.Type.SELECT, buckets);
137 operationList.add(operation);
138 GroupOperations operations = new GroupOperations(operationList);
139
140 provider.performGroupOperation(deviceId, operations);
141
142 OFGroupModFailedErrorMsg.Builder errorBuilder =
143 OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
144 OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
145 groupBuilder.setGroupType(OFGroupType.ALL);
146 groupBuilder.setGroup(OFGroup.of(1));
147 errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
148 errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
149
150 controller.processPacket(dpid1, errorBuilder.build());
151
152 assertNotNull("Operation failed should not be null",
153 testProviderService.failedOperation);
154 }
155
156
157 @Test
158 public void groupStatsEvent() {
159 TestOpenFlowGroupProviderService testProviderService =
160 (TestOpenFlowGroupProviderService) providerService;
161
162 OFGroupStatsReply.Builder rep1 =
163 OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
164 rep1.setXid(1);
165 controller.processPacket(dpid1, rep1.build());
166 OFGroupDescStatsReply.Builder rep2 =
167 OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
168 assertNull("group entries is not set yet", testProviderService.getGroupEntries());
169
170 rep2.setXid(2);
171 controller.processPacket(dpid1, rep2.build());
172 assertNotNull("group entries should be set", testProviderService.getGroupEntries());
173 }
174
175
176
177 @After
178 public void tearDown() {
179 provider.deactivate();
180 provider.providerRegistry = null;
181 provider.controller = null;
182 }
183
184 private class TestOpenFlowGroupProviderService
185 extends AbstractProviderService<GroupProvider>
186 implements GroupProviderService {
187
188 Collection<Group> groups = null;
189 GroupOperation failedOperation = null;
190
191 protected TestOpenFlowGroupProviderService(GroupProvider provider) {
192 super(provider);
193 }
194
195 @Override
sangho7ff01812015-02-09 16:21:53 -0800196 public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) {
sanghoa09f2742015-02-06 14:49:47 -0800197 this.failedOperation = operation;
198 }
199
200 @Override
201 public void pushGroupMetrics(DeviceId deviceId, Collection<Group> groupEntries) {
202 this.groups = groupEntries;
203 }
204
helenyrwu89470f12016-08-12 13:18:10 -0700205 @Override
206 public void notifyOfFailovers(Collection<Group> groups) {
207 }
208
sanghoa09f2742015-02-06 14:49:47 -0800209 public Collection<Group> getGroupEntries() {
210 return groups;
211 }
212 }
213
214 private class TestController implements OpenFlowController {
215
216 OpenFlowEventListener eventListener = null;
217 List<OpenFlowSwitch> switches = Lists.newArrayList();
218
219 public TestController() {
220 OpenFlowSwitch testSwitch = new TestOpenFlowSwitch();
221 switches.add(testSwitch);
222 }
223
224 @Override
225 public void addListener(OpenFlowSwitchListener listener) {
226 }
227
228 @Override
229 public void removeListener(OpenFlowSwitchListener listener) {
230
231 }
232
233 @Override
Jian Lia78cdb22016-04-21 13:03:58 -0700234 public void addMessageListener(OpenFlowMessageListener listener) {
235
236 }
237
238 @Override
239 public void removeMessageListener(OpenFlowMessageListener listener) {
240
241 }
242
243 @Override
sanghoa09f2742015-02-06 14:49:47 -0800244 public void addPacketListener(int priority, PacketListener listener) {
245
246 }
247
248 @Override
249 public void removePacketListener(PacketListener listener) {
250
251 }
252
253 @Override
254 public void addEventListener(OpenFlowEventListener listener) {
255 this.eventListener = listener;
256 }
257
258 @Override
259 public void removeEventListener(OpenFlowEventListener listener) {
260
261 }
262
263 @Override
264 public void write(Dpid dpid, OFMessage msg) {
265
266 }
267
268 @Override
269 public void processPacket(Dpid dpid, OFMessage msg) {
270 eventListener.handleMessage(dpid, msg);
271 }
272
273 @Override
274 public void setRole(Dpid dpid, RoleState role) {
275
276 }
277
278 @Override
279 public Iterable<OpenFlowSwitch> getSwitches() {
280 return switches;
281 }
282
283 @Override
284 public Iterable<OpenFlowSwitch> getMasterSwitches() {
285 return null;
286 }
287
288 @Override
289 public Iterable<OpenFlowSwitch> getEqualSwitches() {
290 return null;
291 }
292
293 @Override
294 public OpenFlowSwitch getSwitch(Dpid dpid) {
295 return switches.get(0);
296 }
297
298 @Override
299 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
300 return null;
301 }
302
303 @Override
304 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
305 return null;
306 }
sanghoa09f2742015-02-06 14:49:47 -0800307 }
308
309 private class TestGroupProviderRegistry implements GroupProviderRegistry {
310
311 @Override
312 public GroupProviderService register(GroupProvider provider) {
313 providerService = new TestOpenFlowGroupProviderService(provider);
314 return providerService;
315 }
316
317 @Override
318 public void unregister(GroupProvider provider) {
319 }
320
321 @Override
322 public Set<ProviderId> getProviders() {
323 return null;
324 }
325 }
326
327 private class TestOpenFlowSwitch implements OpenFlowSwitch {
328
329 OFMessage msg = null;
330
331 @Override
332 public void sendMsg(OFMessage msg) {
333 this.msg = msg;
334 }
335
336 @Override
337 public void sendMsg(List<OFMessage> msgs) {
338
339 }
340
341 @Override
sanghoa09f2742015-02-06 14:49:47 -0800342 public void handleMessage(OFMessage fromSwitch) {
343
344 }
345
346 @Override
347 public void setRole(RoleState role) {
348
349 }
350
351 @Override
352 public RoleState getRole() {
353 return null;
354 }
355
356 @Override
357 public List<OFPortDesc> getPorts() {
358 return null;
359 }
360
361 @Override
Jordi Ortizaa8de492016-12-01 00:21:36 +0100362 public OFMeterFeatures getMeterFeatures() {
363 return null;
364 }
365
366 @Override
sanghoa09f2742015-02-06 14:49:47 -0800367 public OFFactory factory() {
368 return OFFactories.getFactory(OFVersion.OF_13);
369 }
370
371 @Override
372 public String getStringId() {
373 return null;
374 }
375
376 @Override
377 public long getId() {
378 return 0;
379 }
380
381 @Override
382 public String manufacturerDescription() {
383 return null;
384 }
385
386 @Override
387 public String datapathDescription() {
388 return null;
389 }
390
391 @Override
392 public String hardwareDescription() {
393 return null;
394 }
395
396 @Override
397 public String softwareDescription() {
398 return null;
399 }
400
401 @Override
402 public String serialNumber() {
403 return null;
404 }
405
406 @Override
407 public boolean isConnected() {
408 return false;
409 }
410
411 @Override
412 public void disconnectSwitch() {
413
414 }
415
416 @Override
417 public void returnRoleReply(RoleState requested, RoleState response) {
418
419 }
420
421 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700422 public Device.Type deviceType() {
423 return Device.Type.SWITCH;
sanghoa09f2742015-02-06 14:49:47 -0800424 }
425
426 @Override
427 public String channelId() {
428 return null;
429 }
sanghoa09f2742015-02-06 14:49:47 -0800430 }
431}