blob: 9b87b226019d23f518b0f1109cb7015d955fa286 [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;
43import org.onosproject.openflow.controller.OpenFlowController;
44import org.onosproject.openflow.controller.OpenFlowEventListener;
Jian Lia78cdb22016-04-21 13:03:58 -070045import org.onosproject.openflow.controller.OpenFlowMessageListener;
sanghoa09f2742015-02-06 14:49:47 -080046import org.onosproject.openflow.controller.OpenFlowSwitch;
47import org.onosproject.openflow.controller.OpenFlowSwitchListener;
48import org.onosproject.openflow.controller.PacketListener;
49import org.onosproject.openflow.controller.RoleState;
50import org.projectfloodlight.openflow.protocol.OFFactories;
51import org.projectfloodlight.openflow.protocol.OFFactory;
52import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
53import org.projectfloodlight.openflow.protocol.OFGroupMod;
54import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
55import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
56import org.projectfloodlight.openflow.protocol.OFGroupType;
57import org.projectfloodlight.openflow.protocol.OFMessage;
Jordi Ortizaa8de492016-12-01 00:21:36 +010058import org.projectfloodlight.openflow.protocol.OFMeterFeatures;
sanghoa09f2742015-02-06 14:49:47 -080059import org.projectfloodlight.openflow.protocol.OFPortDesc;
60import org.projectfloodlight.openflow.protocol.OFVersion;
61import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
62import org.projectfloodlight.openflow.types.OFGroup;
63
64import java.util.Collection;
65import java.util.List;
66import java.util.Set;
Marc De Leenheer8aba62f2017-04-25 14:33:37 -070067import java.util.concurrent.CompletableFuture;
sanghoa09f2742015-02-06 14:49:47 -080068
alshabibb452fd72015-04-22 20:46:20 -070069import static org.junit.Assert.*;
sanghoa09f2742015-02-06 14:49:47 -080070
71public class OpenFlowGroupProviderTest {
72
73 OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
74 private final OpenFlowController controller = new TestController();
75 GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
76 GroupProviderService providerService;
77
78 private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
79 private Dpid dpid1 = Dpid.dpid(deviceId.uri());
80
81 @Before
82 public void setUp() {
83 provider.controller = controller;
84 provider.providerRegistry = providerRegistry;
dvaddireb57fdb02017-06-20 00:14:08 +053085 provider.cfgService = new ComponentConfigAdapter();
Laszlo Papp84adcac2018-03-13 12:11:51 +000086 provider.driverService = new DriverServiceAdapter();
dvaddireb57fdb02017-06-20 00:14:08 +053087 provider.activate(null);
sanghoa09f2742015-02-06 14:49:47 -080088 }
89
90 @Test
91 public void basics() {
92 assertNotNull("registration expected", providerService);
93 assertEquals("incorrect provider", provider, providerService.provider());
94 }
95
96 @Test
97 public void addGroup() {
98
Yi Tsengfa394de2017-02-01 11:26:40 -080099 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -0800100
101 List<GroupBucket> bucketList = Lists.newArrayList();
102 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
103 builder.setOutput(PortNumber.portNumber(1));
104 GroupBucket bucket =
105 DefaultGroupBucket.createSelectGroupBucket(builder.build());
106 bucketList.add(bucket);
107 GroupBuckets buckets = new GroupBuckets(bucketList);
108
109 List<GroupOperation> operationList = Lists.newArrayList();
110 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
111 GroupDescription.Type.SELECT, buckets);
112 operationList.add(operation);
113 GroupOperations operations = new GroupOperations(operationList);
114
115 provider.performGroupOperation(deviceId, operations);
116
117 final Dpid dpid = Dpid.dpid(deviceId.uri());
118 TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
119 assertNotNull("Switch should not be nul", sw);
120 assertNotNull("OFGroupMsg should not be null", sw.msg);
121
122 }
123
124
125 @Test
126 public void groupModFailure() {
127 TestOpenFlowGroupProviderService testProviderService =
128 (TestOpenFlowGroupProviderService) providerService;
129
Yi Tsengfa394de2017-02-01 11:26:40 -0800130 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -0800131 List<GroupBucket> bucketList = Lists.newArrayList();
132 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
133 builder.setOutput(PortNumber.portNumber(1));
134 GroupBucket bucket =
135 DefaultGroupBucket.createSelectGroupBucket(builder.build());
136 bucketList.add(bucket);
137 GroupBuckets buckets = new GroupBuckets(bucketList);
138 List<GroupOperation> operationList = Lists.newArrayList();
139 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
140 GroupDescription.Type.SELECT, buckets);
141 operationList.add(operation);
142 GroupOperations operations = new GroupOperations(operationList);
143
144 provider.performGroupOperation(deviceId, operations);
145
146 OFGroupModFailedErrorMsg.Builder errorBuilder =
147 OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
148 OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
149 groupBuilder.setGroupType(OFGroupType.ALL);
150 groupBuilder.setGroup(OFGroup.of(1));
151 errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
152 errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
153
154 controller.processPacket(dpid1, errorBuilder.build());
155
156 assertNotNull("Operation failed should not be null",
157 testProviderService.failedOperation);
158 }
159
160
161 @Test
162 public void groupStatsEvent() {
163 TestOpenFlowGroupProviderService testProviderService =
164 (TestOpenFlowGroupProviderService) providerService;
165
166 OFGroupStatsReply.Builder rep1 =
167 OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
168 rep1.setXid(1);
169 controller.processPacket(dpid1, rep1.build());
170 OFGroupDescStatsReply.Builder rep2 =
171 OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
172 assertNull("group entries is not set yet", testProviderService.getGroupEntries());
173
174 rep2.setXid(2);
175 controller.processPacket(dpid1, rep2.build());
176 assertNotNull("group entries should be set", testProviderService.getGroupEntries());
177 }
178
179
180
181 @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 }
sanghoa09f2742015-02-06 14:49:47 -0800316 }
317
318 private class TestGroupProviderRegistry implements GroupProviderRegistry {
319
320 @Override
321 public GroupProviderService register(GroupProvider provider) {
322 providerService = new TestOpenFlowGroupProviderService(provider);
323 return providerService;
324 }
325
326 @Override
327 public void unregister(GroupProvider provider) {
328 }
329
330 @Override
331 public Set<ProviderId> getProviders() {
332 return null;
333 }
334 }
335
336 private class TestOpenFlowSwitch implements OpenFlowSwitch {
337
338 OFMessage msg = null;
339
340 @Override
341 public void sendMsg(OFMessage msg) {
342 this.msg = msg;
343 }
344
345 @Override
346 public void sendMsg(List<OFMessage> msgs) {
347
348 }
349
350 @Override
sanghoa09f2742015-02-06 14:49:47 -0800351 public void handleMessage(OFMessage fromSwitch) {
352
353 }
354
355 @Override
356 public void setRole(RoleState role) {
357
358 }
359
360 @Override
361 public RoleState getRole() {
362 return null;
363 }
364
365 @Override
366 public List<OFPortDesc> getPorts() {
367 return null;
368 }
369
370 @Override
Jordi Ortizaa8de492016-12-01 00:21:36 +0100371 public OFMeterFeatures getMeterFeatures() {
372 return null;
373 }
374
375 @Override
sanghoa09f2742015-02-06 14:49:47 -0800376 public OFFactory factory() {
377 return OFFactories.getFactory(OFVersion.OF_13);
378 }
379
380 @Override
381 public String getStringId() {
382 return null;
383 }
384
385 @Override
386 public long getId() {
387 return 0;
388 }
389
390 @Override
391 public String manufacturerDescription() {
392 return null;
393 }
394
395 @Override
396 public String datapathDescription() {
397 return null;
398 }
399
400 @Override
401 public String hardwareDescription() {
402 return null;
403 }
404
405 @Override
406 public String softwareDescription() {
407 return null;
408 }
409
410 @Override
411 public String serialNumber() {
412 return null;
413 }
414
415 @Override
416 public boolean isConnected() {
417 return false;
418 }
419
420 @Override
421 public void disconnectSwitch() {
422
423 }
424
425 @Override
426 public void returnRoleReply(RoleState requested, RoleState response) {
427
428 }
429
430 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700431 public Device.Type deviceType() {
432 return Device.Type.SWITCH;
sanghoa09f2742015-02-06 14:49:47 -0800433 }
434
435 @Override
436 public String channelId() {
437 return null;
438 }
sanghoa09f2742015-02-06 14:49:47 -0800439 }
Laszlo Papp84adcac2018-03-13 12:11:51 +0000440}