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