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