blob: 0b95f1d7218f9c97c61f8497bcd1d60c047fc808 [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;
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;
Marc De Leenheer8aba62f2017-04-25 14:33:37 -070066import java.util.concurrent.CompletableFuture;
sanghoa09f2742015-02-06 14:49:47 -080067
alshabibb452fd72015-04-22 20:46:20 -070068import static org.junit.Assert.*;
sanghoa09f2742015-02-06 14:49:47 -080069
70public class OpenFlowGroupProviderTest {
71
72 OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
73 private final OpenFlowController controller = new TestController();
74 GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
75 GroupProviderService providerService;
76
77 private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
78 private Dpid dpid1 = Dpid.dpid(deviceId.uri());
79
80 @Before
81 public void setUp() {
82 provider.controller = controller;
83 provider.providerRegistry = providerRegistry;
dvaddireb57fdb02017-06-20 00:14:08 +053084 provider.cfgService = new ComponentConfigAdapter();
85 provider.activate(null);
sanghoa09f2742015-02-06 14:49:47 -080086 }
87
88 @Test
89 public void basics() {
90 assertNotNull("registration expected", providerService);
91 assertEquals("incorrect provider", provider, providerService.provider());
92 }
93
94 @Test
95 public void addGroup() {
96
Yi Tsengfa394de2017-02-01 11:26:40 -080097 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -080098
99 List<GroupBucket> bucketList = Lists.newArrayList();
100 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
101 builder.setOutput(PortNumber.portNumber(1));
102 GroupBucket bucket =
103 DefaultGroupBucket.createSelectGroupBucket(builder.build());
104 bucketList.add(bucket);
105 GroupBuckets buckets = new GroupBuckets(bucketList);
106
107 List<GroupOperation> operationList = Lists.newArrayList();
108 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
109 GroupDescription.Type.SELECT, buckets);
110 operationList.add(operation);
111 GroupOperations operations = new GroupOperations(operationList);
112
113 provider.performGroupOperation(deviceId, operations);
114
115 final Dpid dpid = Dpid.dpid(deviceId.uri());
116 TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
117 assertNotNull("Switch should not be nul", sw);
118 assertNotNull("OFGroupMsg should not be null", sw.msg);
119
120 }
121
122
123 @Test
124 public void groupModFailure() {
125 TestOpenFlowGroupProviderService testProviderService =
126 (TestOpenFlowGroupProviderService) providerService;
127
Yi Tsengfa394de2017-02-01 11:26:40 -0800128 GroupId groupId = new GroupId(1);
sanghoa09f2742015-02-06 14:49:47 -0800129 List<GroupBucket> bucketList = Lists.newArrayList();
130 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
131 builder.setOutput(PortNumber.portNumber(1));
132 GroupBucket bucket =
133 DefaultGroupBucket.createSelectGroupBucket(builder.build());
134 bucketList.add(bucket);
135 GroupBuckets buckets = new GroupBuckets(bucketList);
136 List<GroupOperation> operationList = Lists.newArrayList();
137 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
138 GroupDescription.Type.SELECT, buckets);
139 operationList.add(operation);
140 GroupOperations operations = new GroupOperations(operationList);
141
142 provider.performGroupOperation(deviceId, operations);
143
144 OFGroupModFailedErrorMsg.Builder errorBuilder =
145 OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
146 OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
147 groupBuilder.setGroupType(OFGroupType.ALL);
148 groupBuilder.setGroup(OFGroup.of(1));
149 errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
150 errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
151
152 controller.processPacket(dpid1, errorBuilder.build());
153
154 assertNotNull("Operation failed should not be null",
155 testProviderService.failedOperation);
156 }
157
158
159 @Test
160 public void groupStatsEvent() {
161 TestOpenFlowGroupProviderService testProviderService =
162 (TestOpenFlowGroupProviderService) providerService;
163
164 OFGroupStatsReply.Builder rep1 =
165 OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
166 rep1.setXid(1);
167 controller.processPacket(dpid1, rep1.build());
168 OFGroupDescStatsReply.Builder rep2 =
169 OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
170 assertNull("group entries is not set yet", testProviderService.getGroupEntries());
171
172 rep2.setXid(2);
173 controller.processPacket(dpid1, rep2.build());
174 assertNotNull("group entries should be set", testProviderService.getGroupEntries());
175 }
176
177
178
179 @After
180 public void tearDown() {
181 provider.deactivate();
182 provider.providerRegistry = null;
183 provider.controller = null;
184 }
185
186 private class TestOpenFlowGroupProviderService
187 extends AbstractProviderService<GroupProvider>
188 implements GroupProviderService {
189
190 Collection<Group> groups = null;
191 GroupOperation failedOperation = null;
192
193 protected TestOpenFlowGroupProviderService(GroupProvider provider) {
194 super(provider);
195 }
196
197 @Override
sangho7ff01812015-02-09 16:21:53 -0800198 public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) {
sanghoa09f2742015-02-06 14:49:47 -0800199 this.failedOperation = operation;
200 }
201
202 @Override
203 public void pushGroupMetrics(DeviceId deviceId, Collection<Group> groupEntries) {
204 this.groups = groupEntries;
205 }
206
helenyrwu89470f12016-08-12 13:18:10 -0700207 @Override
208 public void notifyOfFailovers(Collection<Group> groups) {
209 }
210
sanghoa09f2742015-02-06 14:49:47 -0800211 public Collection<Group> getGroupEntries() {
212 return groups;
213 }
214 }
215
216 private class TestController implements OpenFlowController {
217
218 OpenFlowEventListener eventListener = null;
219 List<OpenFlowSwitch> switches = Lists.newArrayList();
220
221 public TestController() {
222 OpenFlowSwitch testSwitch = new TestOpenFlowSwitch();
223 switches.add(testSwitch);
224 }
225
226 @Override
227 public void addListener(OpenFlowSwitchListener listener) {
228 }
229
230 @Override
231 public void removeListener(OpenFlowSwitchListener listener) {
232
233 }
234
235 @Override
Jian Lia78cdb22016-04-21 13:03:58 -0700236 public void addMessageListener(OpenFlowMessageListener listener) {
237
238 }
239
240 @Override
241 public void removeMessageListener(OpenFlowMessageListener listener) {
242
243 }
244
245 @Override
sanghoa09f2742015-02-06 14:49:47 -0800246 public void addPacketListener(int priority, PacketListener listener) {
247
248 }
249
250 @Override
251 public void removePacketListener(PacketListener listener) {
252
253 }
254
255 @Override
256 public void addEventListener(OpenFlowEventListener listener) {
257 this.eventListener = listener;
258 }
259
260 @Override
261 public void removeEventListener(OpenFlowEventListener listener) {
262
263 }
264
265 @Override
266 public void write(Dpid dpid, OFMessage msg) {
267
268 }
269
270 @Override
Marc De Leenheer8aba62f2017-04-25 14:33:37 -0700271 public CompletableFuture<OFMessage> writeResponse(Dpid dpid, OFMessage msg) {
272 return null;
273 }
274
275 @Override
sanghoa09f2742015-02-06 14:49:47 -0800276 public void processPacket(Dpid dpid, OFMessage msg) {
277 eventListener.handleMessage(dpid, msg);
278 }
279
280 @Override
281 public void setRole(Dpid dpid, RoleState role) {
282
283 }
284
285 @Override
286 public Iterable<OpenFlowSwitch> getSwitches() {
287 return switches;
288 }
289
290 @Override
291 public Iterable<OpenFlowSwitch> getMasterSwitches() {
292 return null;
293 }
294
295 @Override
296 public Iterable<OpenFlowSwitch> getEqualSwitches() {
297 return null;
298 }
299
300 @Override
301 public OpenFlowSwitch getSwitch(Dpid dpid) {
302 return switches.get(0);
303 }
304
305 @Override
306 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
307 return null;
308 }
309
310 @Override
311 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
312 return null;
313 }
sanghoa09f2742015-02-06 14:49:47 -0800314 }
315
316 private class TestGroupProviderRegistry implements GroupProviderRegistry {
317
318 @Override
319 public GroupProviderService register(GroupProvider provider) {
320 providerService = new TestOpenFlowGroupProviderService(provider);
321 return providerService;
322 }
323
324 @Override
325 public void unregister(GroupProvider provider) {
326 }
327
328 @Override
329 public Set<ProviderId> getProviders() {
330 return null;
331 }
332 }
333
334 private class TestOpenFlowSwitch implements OpenFlowSwitch {
335
336 OFMessage msg = null;
337
338 @Override
339 public void sendMsg(OFMessage msg) {
340 this.msg = msg;
341 }
342
343 @Override
344 public void sendMsg(List<OFMessage> msgs) {
345
346 }
347
348 @Override
sanghoa09f2742015-02-06 14:49:47 -0800349 public void handleMessage(OFMessage fromSwitch) {
350
351 }
352
353 @Override
354 public void setRole(RoleState role) {
355
356 }
357
358 @Override
359 public RoleState getRole() {
360 return null;
361 }
362
363 @Override
364 public List<OFPortDesc> getPorts() {
365 return null;
366 }
367
368 @Override
Jordi Ortizaa8de492016-12-01 00:21:36 +0100369 public OFMeterFeatures getMeterFeatures() {
370 return null;
371 }
372
373 @Override
sanghoa09f2742015-02-06 14:49:47 -0800374 public OFFactory factory() {
375 return OFFactories.getFactory(OFVersion.OF_13);
376 }
377
378 @Override
379 public String getStringId() {
380 return null;
381 }
382
383 @Override
384 public long getId() {
385 return 0;
386 }
387
388 @Override
389 public String manufacturerDescription() {
390 return null;
391 }
392
393 @Override
394 public String datapathDescription() {
395 return null;
396 }
397
398 @Override
399 public String hardwareDescription() {
400 return null;
401 }
402
403 @Override
404 public String softwareDescription() {
405 return null;
406 }
407
408 @Override
409 public String serialNumber() {
410 return null;
411 }
412
413 @Override
414 public boolean isConnected() {
415 return false;
416 }
417
418 @Override
419 public void disconnectSwitch() {
420
421 }
422
423 @Override
424 public void returnRoleReply(RoleState requested, RoleState response) {
425
426 }
427
428 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700429 public Device.Type deviceType() {
430 return Device.Type.SWITCH;
sanghoa09f2742015-02-06 14:49:47 -0800431 }
432
433 @Override
434 public String channelId() {
435 return null;
436 }
sanghoa09f2742015-02-06 14:49:47 -0800437 }
438}