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