BUG-2794: Incorporated model Action api changes in OFJava to openflowplugin
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / GroupConvertor.java
1 /**
2  * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributor: hema.gopalkrishnan@ericsson.com
9  */
10 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
11
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
13
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
15 import java.math.BigInteger;
16 import java.util.ArrayList;
17 import java.util.List;
18 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * This Utility class decodes the SAL - Group Mod Message and encodes into a OF
34  * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
35  * Output:GroupModInput Message.
36  *
37  *
38  */
39 public final class GroupConvertor {
40
41     private static final Logger LOG = LoggerFactory.getLogger(GroupConvertor.class);
42
43     private static final Integer DEFAULT_WEIGHT = 0;
44     private static final Long OFPP_ANY = Long.parseLong("ffffffff", 16);
45     private static final Long DEFAULT_WATCH_PORT = OFPP_ANY;
46     private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16);
47     private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY;
48
49     private GroupConvertor() {
50
51     }
52
53     public static GroupModInputBuilder toGroupModInput(
54
55     org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) {
56         List<BucketsList> bucketLists = null;
57         GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
58         if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput) {
59             groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
60         } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput) {
61             groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
62         } else if (source instanceof UpdatedGroup) {
63             groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
64         }
65
66         if (GroupTypes.GroupAll.equals(source.getGroupType())) {
67             groupModInputBuilder.setType(GroupType.OFPGTALL);
68         }
69
70         if (GroupTypes.GroupSelect.equals(source.getGroupType())) {
71             groupModInputBuilder.setType(GroupType.OFPGTSELECT);
72         }
73
74         if (GroupTypes.GroupIndirect.equals(source.getGroupType())) {
75             groupModInputBuilder.setType(GroupType.OFPGTINDIRECT);
76         }
77
78         if (GroupTypes.GroupFf.equals(source.getGroupType())) {
79             groupModInputBuilder.setType(GroupType.OFPGTFF);
80         }
81
82         groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue()));
83         // Only if the bucket is configured for the group then add it
84         if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) {
85
86             bucketLists = salToOFBucketList(source.getBuckets(), version, source.getGroupType().getIntValue(),datapathid);
87             groupModInputBuilder.setBucketsList(bucketLists);
88         }
89         groupModInputBuilder.setVersion(version);
90         return groupModInputBuilder;
91
92     }
93
94     private static List<BucketsList> salToOFBucketList(Buckets buckets, short version, int groupType,BigInteger datapathid) {
95         final List<BucketsList> bucketLists = new ArrayList<>();
96         for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket : buckets
97                 .getBucket()) {
98             BucketsListBuilder bucketBuilder = new BucketsListBuilder();
99
100             salToOFBucketListWeight(groupBucket, bucketBuilder, groupType);
101             salToOFBucketListWatchGroup(groupBucket, bucketBuilder, groupType);
102             salToOFBucketListWatchPort(groupBucket, bucketBuilder, groupType);
103
104             List<Action> bucketActionList = ActionConvertor.getActions(groupBucket.getAction(), version, datapathid, null);
105             bucketBuilder.setAction(bucketActionList);
106             BucketsList bucket = bucketBuilder.build();
107             bucketLists.add(bucket);
108         }
109         return bucketLists;
110
111     }
112
113     private static void salToOFBucketListWatchPort(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
114         if (null != groupBucket.getWatchPort()) {
115             bucketBuilder.setWatchPort(new PortNumber(groupBucket.getWatchPort()));
116         } else {
117             bucketBuilder.setWatchPort(new PortNumber(BinContent.intToUnsignedLong(DEFAULT_WATCH_PORT.intValue())));
118             if (groupType == GroupType.OFPGTFF.getIntValue()) {
119                 LOG.error("WatchPort required for this OFPGT_FF");
120             }
121         }
122     }
123
124     private static void salToOFBucketListWatchGroup(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
125         if (null != groupBucket.getWatchGroup()) {
126             bucketBuilder.setWatchGroup(groupBucket.getWatchGroup());
127         } else {
128             bucketBuilder.setWatchGroup(BinContent.intToUnsignedLong(DEFAULT_WATCH_GROUP.intValue()));
129             if (groupType == GroupType.OFPGTFF.getIntValue()) {
130                 LOG.error("WatchGroup required for this OFPGT_FF");
131             }
132         }
133     }
134
135     private static void salToOFBucketListWeight(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
136         if (null != groupBucket.getWeight()) {
137             bucketBuilder.setWeight(groupBucket.getWeight().intValue());
138         } else {
139             bucketBuilder.setWeight(DEFAULT_WEIGHT);
140             if (groupType == GroupType.OFPGTSELECT.getIntValue()) {
141                 LOG.error("Weight value required for this OFPGT_SELECT");
142             }
143         }
144     }
145
146 }