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