Fix Bug 271
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / GroupConvertor.java
1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
2
3 import java.math.BigInteger;
4 import java.util.ArrayList;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsListBuilder;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 /**
24  * This Utility class decodes the SAL - Group Mod Message and encodes into a OF
25  * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
26  * Output:GroupModInput Message.
27  *
28  * @param <AddGroupInput>
29  *
30  */
31 public final class GroupConvertor {
32
33     private static final Logger logger = LoggerFactory.getLogger(GroupConvertor.class);
34     private static final String PREFIX_SEPARATOR = "/";
35
36     private static final  Integer DEFAULT_WEIGHT = new Integer(0);
37     private static final Long OFPP_ANY = Long.parseLong("ffffffff", 16);
38     private static final Long DEFAULT_WATCH_PORT = OFPP_ANY;
39     private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16);
40     private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY;
41
42     private GroupConvertor() {
43
44     }
45
46     public static GroupModInputBuilder toGroupModInput(
47
48     org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) {
49         List<BucketsList> bucketLists = null;
50         GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
51         if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput) {
52             groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
53         } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput) {
54             groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
55         } else if (source instanceof UpdatedGroup) {
56             groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
57         }
58         
59         if (source.getGroupType().getIntValue() == 0) {
60             groupModInputBuilder.setType(GroupType.OFPGTALL);
61         }
62
63         if (source.getGroupType().getIntValue() == 1) {
64             groupModInputBuilder.setType(GroupType.OFPGTSELECT);
65         }
66
67         if (source.getGroupType().getIntValue() == 2) {
68             groupModInputBuilder.setType(GroupType.OFPGTINDIRECT);
69         }
70
71         if (source.getGroupType().getIntValue() == 3) {
72             groupModInputBuilder.setType(GroupType.OFPGTFF);
73         }
74
75         groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue()));
76         // Only if the bucket is configured for the group then add it
77         if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) {
78
79             bucketLists = new ArrayList<BucketsList>();
80             getbucketList(source.getBuckets(), bucketLists, version, source.getGroupType().getIntValue(),datapathid);
81             groupModInputBuilder.setBucketsList(bucketLists);
82         }
83         groupModInputBuilder.setVersion(version);
84         return groupModInputBuilder;
85
86     }
87
88     private static void getbucketList(Buckets buckets, List<BucketsList> bucketLists, short version, int groupType,BigInteger datapathid) {
89
90         Iterator<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket> groupBucketIterator = buckets
91                 .getBucket().iterator();
92         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket;
93         
94         while (groupBucketIterator.hasNext()) {
95             groupBucket = groupBucketIterator.next();
96             BucketsListBuilder bucketBuilder = new BucketsListBuilder();
97
98             if ((groupType == GroupType.OFPGTSELECT.getIntValue()) && (groupBucket.getWeight() == null)) {
99
100                 logger.error("Weight value required for this OFPGT_SELECT");
101
102             }
103
104             if (null != groupBucket.getWeight()) {
105                 bucketBuilder.setWeight(groupBucket.getWeight().intValue());
106             } else {
107                 bucketBuilder.setWeight(DEFAULT_WEIGHT);
108             }
109
110             if ((groupType == GroupType.OFPGTFF.getIntValue()) && (groupBucket.getWatchGroup() == null)) {
111
112                 logger.error("WatchGroup required for this OFPGT_FF");
113
114             }
115             
116             if (null != groupBucket.getWatchGroup()) {
117                 bucketBuilder.setWatchGroup(groupBucket.getWatchGroup());
118             } else {
119                 bucketBuilder.setWatchGroup(BinContent.intToUnsignedLong(DEFAULT_WATCH_GROUP.intValue()));
120             }
121
122             if ((groupType == GroupType.OFPGTFF.getIntValue()) && (groupBucket.getWatchPort() == null)) {
123
124                 logger.error("WatchPort required for this OFPGT_FF");
125
126             }
127
128             if (null != groupBucket.getWatchPort()) {
129                 bucketBuilder.setWatchPort(new PortNumber(groupBucket.getWatchPort()));
130             } else {
131                 bucketBuilder.setWatchPort(new PortNumber(BinContent.intToUnsignedLong(DEFAULT_WATCH_PORT.intValue())));
132             }
133
134             List<ActionsList> bucketActionList = ActionConvertor.getActionList(groupBucket.getAction(), version,datapathid);
135             bucketBuilder.setActionsList(bucketActionList);
136             BucketsList bucket = bucketBuilder.build();
137             bucketLists.add(bucket);
138         }
139
140     }
141
142 }