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