1 package org.onosproject.provider.of.group.impl;
3 import com.google.common.collect.Lists;
4 import org.junit.After;
5 import org.junit.Before;
7 import org.onosproject.core.DefaultGroupId;
8 import org.onosproject.core.GroupId;
9 import org.onosproject.net.Device;
10 import org.onosproject.net.DeviceId;
11 import org.onosproject.net.PortNumber;
12 import org.onosproject.net.flow.DefaultTrafficTreatment;
13 import org.onosproject.net.flow.TrafficTreatment;
14 import org.onosproject.net.group.DefaultGroupBucket;
15 import org.onosproject.net.group.Group;
16 import org.onosproject.net.group.GroupBucket;
17 import org.onosproject.net.group.GroupBuckets;
18 import org.onosproject.net.group.GroupDescription;
19 import org.onosproject.net.group.GroupOperation;
20 import org.onosproject.net.group.GroupOperations;
21 import org.onosproject.net.group.GroupProvider;
22 import org.onosproject.net.group.GroupProviderRegistry;
23 import org.onosproject.net.group.GroupProviderService;
24 import org.onosproject.net.provider.AbstractProviderService;
25 import org.onosproject.net.provider.ProviderId;
26 import org.onosproject.openflow.controller.Dpid;
27 import org.onosproject.openflow.controller.OpenFlowController;
28 import org.onosproject.openflow.controller.OpenFlowEventListener;
29 import org.onosproject.openflow.controller.OpenFlowSwitch;
30 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
31 import org.onosproject.openflow.controller.PacketListener;
32 import org.onosproject.openflow.controller.RoleState;
33 import org.projectfloodlight.openflow.protocol.OFFactories;
34 import org.projectfloodlight.openflow.protocol.OFFactory;
35 import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
36 import org.projectfloodlight.openflow.protocol.OFGroupMod;
37 import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
38 import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
39 import org.projectfloodlight.openflow.protocol.OFGroupType;
40 import org.projectfloodlight.openflow.protocol.OFMessage;
41 import org.projectfloodlight.openflow.protocol.OFPortDesc;
42 import org.projectfloodlight.openflow.protocol.OFVersion;
43 import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
44 import org.projectfloodlight.openflow.types.OFGroup;
46 import java.util.Collection;
47 import java.util.List;
50 import static org.junit.Assert.*;
52 public class OpenFlowGroupProviderTest {
54 OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
55 private final OpenFlowController controller = new TestController();
56 GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
57 GroupProviderService providerService;
59 private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
60 private Dpid dpid1 = Dpid.dpid(deviceId.uri());
64 provider.controller = controller;
65 provider.providerRegistry = providerRegistry;
70 public void basics() {
71 assertNotNull("registration expected", providerService);
72 assertEquals("incorrect provider", provider, providerService.provider());
76 public void addGroup() {
78 GroupId groupId = new DefaultGroupId(1);
80 List<GroupBucket> bucketList = Lists.newArrayList();
81 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
82 builder.setOutput(PortNumber.portNumber(1));
84 DefaultGroupBucket.createSelectGroupBucket(builder.build());
85 bucketList.add(bucket);
86 GroupBuckets buckets = new GroupBuckets(bucketList);
88 List<GroupOperation> operationList = Lists.newArrayList();
89 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
90 GroupDescription.Type.SELECT, buckets);
91 operationList.add(operation);
92 GroupOperations operations = new GroupOperations(operationList);
94 provider.performGroupOperation(deviceId, operations);
96 final Dpid dpid = Dpid.dpid(deviceId.uri());
97 TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
98 assertNotNull("Switch should not be nul", sw);
99 assertNotNull("OFGroupMsg should not be null", sw.msg);
105 public void groupModFailure() {
106 TestOpenFlowGroupProviderService testProviderService =
107 (TestOpenFlowGroupProviderService) providerService;
109 GroupId groupId = new DefaultGroupId(1);
110 List<GroupBucket> bucketList = Lists.newArrayList();
111 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
112 builder.setOutput(PortNumber.portNumber(1));
114 DefaultGroupBucket.createSelectGroupBucket(builder.build());
115 bucketList.add(bucket);
116 GroupBuckets buckets = new GroupBuckets(bucketList);
117 List<GroupOperation> operationList = Lists.newArrayList();
118 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
119 GroupDescription.Type.SELECT, buckets);
120 operationList.add(operation);
121 GroupOperations operations = new GroupOperations(operationList);
123 provider.performGroupOperation(deviceId, operations);
125 OFGroupModFailedErrorMsg.Builder errorBuilder =
126 OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
127 OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
128 groupBuilder.setGroupType(OFGroupType.ALL);
129 groupBuilder.setGroup(OFGroup.of(1));
130 errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
131 errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
133 controller.processPacket(dpid1, errorBuilder.build());
135 assertNotNull("Operation failed should not be null",
136 testProviderService.failedOperation);
141 public void groupStatsEvent() {
142 TestOpenFlowGroupProviderService testProviderService =
143 (TestOpenFlowGroupProviderService) providerService;
145 OFGroupStatsReply.Builder rep1 =
146 OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
148 controller.processPacket(dpid1, rep1.build());
149 OFGroupDescStatsReply.Builder rep2 =
150 OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
151 assertNull("group entries is not set yet", testProviderService.getGroupEntries());
154 controller.processPacket(dpid1, rep2.build());
155 assertNotNull("group entries should be set", testProviderService.getGroupEntries());
161 public void tearDown() {
162 provider.deactivate();
163 provider.providerRegistry = null;
164 provider.controller = null;
167 private class TestOpenFlowGroupProviderService
168 extends AbstractProviderService<GroupProvider>
169 implements GroupProviderService {
171 Collection<Group> groups = null;
172 GroupOperation failedOperation = null;
174 protected TestOpenFlowGroupProviderService(GroupProvider provider) {
179 public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) {
180 this.failedOperation = operation;
184 public void pushGroupMetrics(DeviceId deviceId, Collection<Group> groupEntries) {
185 this.groups = groupEntries;
188 public Collection<Group> getGroupEntries() {
193 private class TestController implements OpenFlowController {
195 OpenFlowEventListener eventListener = null;
196 List<OpenFlowSwitch> switches = Lists.newArrayList();
198 public TestController() {
199 OpenFlowSwitch testSwitch = new TestOpenFlowSwitch();
200 switches.add(testSwitch);
204 public void addListener(OpenFlowSwitchListener listener) {
208 public void removeListener(OpenFlowSwitchListener listener) {
213 public void addPacketListener(int priority, PacketListener listener) {
218 public void removePacketListener(PacketListener listener) {
223 public void addEventListener(OpenFlowEventListener listener) {
224 this.eventListener = listener;
228 public void removeEventListener(OpenFlowEventListener listener) {
233 public void write(Dpid dpid, OFMessage msg) {
238 public void processPacket(Dpid dpid, OFMessage msg) {
239 eventListener.handleMessage(dpid, msg);
243 public void setRole(Dpid dpid, RoleState role) {
248 public Iterable<OpenFlowSwitch> getSwitches() {
253 public Iterable<OpenFlowSwitch> getMasterSwitches() {
258 public Iterable<OpenFlowSwitch> getEqualSwitches() {
263 public OpenFlowSwitch getSwitch(Dpid dpid) {
264 return switches.get(0);
268 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
273 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
279 private class TestGroupProviderRegistry implements GroupProviderRegistry {
282 public GroupProviderService register(GroupProvider provider) {
283 providerService = new TestOpenFlowGroupProviderService(provider);
284 return providerService;
288 public void unregister(GroupProvider provider) {
292 public Set<ProviderId> getProviders() {
297 private class TestOpenFlowSwitch implements OpenFlowSwitch {
299 OFMessage msg = null;
302 public void sendMsg(OFMessage msg) {
307 public void sendMsg(List<OFMessage> msgs) {
312 public void handleMessage(OFMessage fromSwitch) {
317 public void setRole(RoleState role) {
322 public RoleState getRole() {
327 public List<OFPortDesc> getPorts() {
332 public OFFactory factory() {
333 return OFFactories.getFactory(OFVersion.OF_13);
337 public String getStringId() {
342 public long getId() {
347 public String manufacturerDescription() {
352 public String datapathDescription() {
357 public String hardwareDescription() {
362 public String softwareDescription() {
367 public String serialNumber() {
372 public boolean isConnected() {
377 public void disconnectSwitch() {
382 public void returnRoleReply(RoleState requested, RoleState response) {
387 public Device.Type deviceType() {
388 return Device.Type.SWITCH;
392 public String channelId() {