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