Bug 5540 - ActionConvertor, ActionResponseConvertor
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / GroupStatsResponseConvertor.java
1 /*
2  * Copyright (c) 2013, 2015 IBM Corporation 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
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
10
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.Optional;
15 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
18 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.BucketsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.DurationBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounterBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounterKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;
44
45 /**
46  * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
47  * messages.
48  * @author avishnoi@in.ibm.com
49  *
50  */
51 public class GroupStatsResponseConvertor {
52
53     public List<GroupStats> toSALGroupStatsList(
54             List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply
55             .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats> allGroupStats){
56         List<GroupStats> convertedSALGroups = new ArrayList<>();
57         for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply
58                 .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats group: allGroupStats){
59             convertedSALGroups.add(toSALGroupStats(group));
60         }
61         return convertedSALGroups;
62
63     }
64     /**
65      * Method convert GroupStats message from library to MD SAL defined GroupStats
66      * @param groupStats GroupStats from library
67      * @return GroupStats -- GroupStats defined in MD-SAL
68      */
69     public GroupStats toSALGroupStats(
70             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.
71             multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats groupStats){
72
73         GroupStatsBuilder salGroupStats = new GroupStatsBuilder();
74
75         salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats()));
76         salGroupStats.setByteCount(new Counter64(groupStats.getByteCount()));
77
78         DurationBuilder time = new DurationBuilder();
79         time.setSecond(new Counter32(groupStats.getDurationSec()));
80         time.setNanosecond(new Counter32(groupStats.getDurationNsec()));
81
82         salGroupStats.setDuration(time.build());
83         salGroupStats.setGroupId(new GroupId(groupStats.getGroupId().getValue()));
84         salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount()));
85         salGroupStats.setRefCount(new Counter32(groupStats.getRefCount()));
86         salGroupStats.setKey(new GroupStatsKey(salGroupStats.getGroupId()));
87
88         return salGroupStats.build();
89     }
90
91     public Buckets toSALBuckets(
92             List<BucketStats> bucketStats ){
93
94         BucketsBuilder salBuckets  = new BucketsBuilder();
95
96         List<BucketCounter> allBucketStats = new ArrayList<>();
97         int bucketKey = 0;
98         for(BucketStats bucketStat : bucketStats){
99             BucketCounterBuilder bucketCounter = new BucketCounterBuilder();
100             bucketCounter.setByteCount(new Counter64(bucketStat.getByteCount()));
101             bucketCounter.setPacketCount(new Counter64(bucketStat.getPacketCount()));
102             BucketId bucketId = new BucketId((long)bucketKey);
103             bucketCounter.setKey(new BucketCounterKey(bucketId));
104             bucketCounter.setBucketId(bucketId);
105             bucketKey++;
106             allBucketStats.add(bucketCounter.build());
107         }
108         salBuckets.setBucketCounter(allBucketStats);
109         return salBuckets.build();
110     }
111
112
113     public List<GroupDescStats> toSALGroupDescStatsList(
114             List<GroupDesc> allGroupDescStats, OpenflowVersion ofVersion){
115
116         List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<>();
117         for(GroupDesc groupDesc: allGroupDescStats){
118             convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc, ofVersion));
119         }
120         return convertedSALGroupsDesc;
121
122     }
123     /**
124      * Method convert GroupStats message from library to MD SAL defined GroupStats
125      * @param groupDesc GroupStats from library
126      * @param ofVersion current ofp version
127      * @return GroupStats -- GroupStats defined in MD-SAL
128      */
129     public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc, OpenflowVersion ofVersion){
130
131         GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
132
133         salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), ofVersion));
134         salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue()));
135         salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue()));
136         salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId()));
137
138         return salGroupDescStats.build();
139     }
140
141     public  org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(
142             List<BucketsList> bucketDescStats, OpenflowVersion ofVersion ){
143         final ActionResponseConvertorData data = new ActionResponseConvertorData(ofVersion.getVersion());
144         data.setActionPath(ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION);
145
146         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc  =
147                 new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder();
148         List<Bucket> allBuckets = new ArrayList<>();
149         int bucketKey = 0;
150         for(BucketsList bucketDetails : bucketDescStats){
151             BucketBuilder bucketDesc = new BucketBuilder();
152             final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>> convertedSalActions =
153                     ConvertorManager.getInstance().convert(bucketDetails.getAction(), data);
154
155             if (convertedSalActions.isPresent()) {
156                 List<Action> actions = new ArrayList<>();
157                 int actionKey = 0;
158                 for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions.get()) {
159                     ActionBuilder wrappedAction = new ActionBuilder();
160                     wrappedAction.setAction(action);
161                     wrappedAction.setKey(new ActionKey(actionKey));
162                     wrappedAction.setOrder(actionKey);
163                     actions.add(wrappedAction.build());
164                     actionKey++;
165                 }
166
167                 bucketDesc.setAction(actions);
168             } else {
169                 bucketDesc.setAction(Collections.emptyList());
170             }
171
172             bucketDesc.setWeight(bucketDetails.getWeight());
173             bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue());
174             bucketDesc.setWatchGroup(bucketDetails.getWatchGroup());
175             BucketId bucketId = new BucketId((long)bucketKey);
176             bucketDesc.setBucketId(bucketId);
177             bucketDesc.setKey(new BucketKey(bucketId));
178             bucketKey++;
179             allBuckets.add(bucketDesc.build());
180         }
181         salBucketsDesc.setBucket(allBuckets);
182         return salBucketsDesc.build();
183     }
184
185 }