blob: b951ebc6bb85407c6051fbddff2fa0e7573e493d [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;
sanghoa09f2742015-02-06 14:49:47 -080022import org.onosproject.core.GroupId;
Marc De Leenheerb9311372015-07-09 11:36:49 -070023import org.onosproject.net.Device;
sanghoa09f2742015-02-06 14:49:47 -080024import org.onosproject.net.DeviceId;
25import org.onosproject.net.PortNumber;
26import org.onosproject.net.flow.DefaultTrafficTreatment;
27import org.onosproject.net.flow.TrafficTreatment;
28import org.onosproject.net.group.DefaultGroupBucket;
29import org.onosproject.net.group.Group;
30import org.onosproject.net.group.GroupBucket;
31import org.onosproject.net.group.GroupBuckets;
32import org.onosproject.net.group.GroupDescription;
33import org.onosproject.net.group.GroupOperation;
34import org.onosproject.net.group.GroupOperations;
35import org.onosproject.net.group.GroupProvider;
36import org.onosproject.net.group.GroupProviderRegistry;
37import org.onosproject.net.group.GroupProviderService;
38import org.onosproject.net.provider.AbstractProviderService;
39import org.onosproject.net.provider.ProviderId;
40import org.onosproject.openflow.controller.Dpid;
41import org.onosproject.openflow.controller.OpenFlowController;
42import org.onosproject.openflow.controller.OpenFlowEventListener;
Jian Lia78cdb22016-04-21 13:03:58 -070043import org.onosproject.openflow.controller.OpenFlowMessageListener;
sanghoa09f2742015-02-06 14:49:47 -080044import org.onosproject.openflow.controller.OpenFlowSwitch;
45import org.onosproject.openflow.controller.OpenFlowSwitchListener;
46import org.onosproject.openflow.controller.PacketListener;
47import org.onosproject.openflow.controller.RoleState;
48import org.projectfloodlight.openflow.protocol.OFFactories;
49import org.projectfloodlight.openflow.protocol.OFFactory;
50import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
51import org.projectfloodlight.openflow.protocol.OFGroupMod;
52import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
53import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
54import org.projectfloodlight.openflow.protocol.OFGroupType;
55import org.projectfloodlight.openflow.protocol.OFMessage;
Jordi Ortizaa8de492016-12-01 00:21:36 +010056import org.projectfloodlight.openflow.protocol.OFMeterFeatures;
sanghoa09f2742015-02-06 14:49:47 -080057import org.projectfloodlight.openflow.protocol.OFPortDesc;
58import org.projectfloodlight.openflow.protocol.OFVersion;
59import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
60import org.projectfloodlight.openflow.types.OFGroup;
61
62import java.util.Collection;
63import java.util.List;
64import java.util.Set;
Marc De Leenheer8aba62f2017-04-25 14:33:37 -070065import java.util.concurrent.CompletableFuture;
sanghoa09f2742015-02-06 14:49:47 -080066
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
Yi Tsengfa394de2017-02-01 11:26:40 -080095 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -080096
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
Yi Tsengfa394de2017-02-01 11:26:40 -0800126 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -0800127 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
Marc De Leenheer8aba62f2017-04-25 14:33:37 -0700269 public CompletableFuture<OFMessage> writeResponse(Dpid dpid, OFMessage msg) {
270 return null;
271 }
272
273 @Override
sanghoa09f2742015-02-06 14:49:47 -0800274 public void processPacket(Dpid dpid, OFMessage msg) {
275 eventListener.handleMessage(dpid, msg);
276 }
277
278 @Override
279 public void setRole(Dpid dpid, RoleState role) {
280
281 }
282
283 @Override
284 public Iterable<OpenFlowSwitch> getSwitches() {
285 return switches;
286 }
287
288 @Override
289 public Iterable<OpenFlowSwitch> getMasterSwitches() {
290 return null;
291 }
292
293 @Override
294 public Iterable<OpenFlowSwitch> getEqualSwitches() {
295 return null;
296 }
297
298 @Override
299 public OpenFlowSwitch getSwitch(Dpid dpid) {
300 return switches.get(0);
301 }
302
303 @Override
304 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
305 return null;
306 }
307
308 @Override
309 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
310 return null;
311 }
sanghoa09f2742015-02-06 14:49:47 -0800312 }
313
314 private class TestGroupProviderRegistry implements GroupProviderRegistry {
315
316 @Override
317 public GroupProviderService register(GroupProvider provider) {
318 providerService = new TestOpenFlowGroupProviderService(provider);
319 return providerService;
320 }
321
322 @Override
323 public void unregister(GroupProvider provider) {
324 }
325
326 @Override
327 public Set<ProviderId> getProviders() {
328 return null;
329 }
330 }
331
332 private class TestOpenFlowSwitch implements OpenFlowSwitch {
333
334 OFMessage msg = null;
335
336 @Override
337 public void sendMsg(OFMessage msg) {
338 this.msg = msg;
339 }
340
341 @Override
342 public void sendMsg(List<OFMessage> msgs) {
343
344 }
345
346 @Override
sanghoa09f2742015-02-06 14:49:47 -0800347 public void handleMessage(OFMessage fromSwitch) {
348
349 }
350
351 @Override
352 public void setRole(RoleState role) {
353
354 }
355
356 @Override
357 public RoleState getRole() {
358 return null;
359 }
360
361 @Override
362 public List<OFPortDesc> getPorts() {
363 return null;
364 }
365
366 @Override
Jordi Ortizaa8de492016-12-01 00:21:36 +0100367 public OFMeterFeatures getMeterFeatures() {
368 return null;
369 }
370
371 @Override
sanghoa09f2742015-02-06 14:49:47 -0800372 public OFFactory factory() {
373 return OFFactories.getFactory(OFVersion.OF_13);
374 }
375
376 @Override
377 public String getStringId() {
378 return null;
379 }
380
381 @Override
382 public long getId() {
383 return 0;
384 }
385
386 @Override
387 public String manufacturerDescription() {
388 return null;
389 }
390
391 @Override
392 public String datapathDescription() {
393 return null;
394 }
395
396 @Override
397 public String hardwareDescription() {
398 return null;
399 }
400
401 @Override
402 public String softwareDescription() {
403 return null;
404 }
405
406 @Override
407 public String serialNumber() {
408 return null;
409 }
410
411 @Override
412 public boolean isConnected() {
413 return false;
414 }
415
416 @Override
417 public void disconnectSwitch() {
418
419 }
420
421 @Override
422 public void returnRoleReply(RoleState requested, RoleState response) {
423
424 }
425
426 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700427 public Device.Type deviceType() {
428 return Device.Type.SWITCH;
sanghoa09f2742015-02-06 14:49:47 -0800429 }
430
431 @Override
432 public String channelId() {
433 return null;
434 }
sanghoa09f2742015-02-06 14:49:47 -0800435 }
436}