For OutputAction:PortNumber size is different for OF versions.
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / MeterStatsResponseConvertor.java
1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
7 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
9
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.ExperimenterBuilder;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStatsBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.DurationBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.MeterBandStatsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStat;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStatBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStatsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDrop;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemark;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenter;
27
28 /**
29  * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
30  * messages.
31  * @author avishnoi@in.ibm.com
32  *
33  */
34 public class MeterStatsResponseConvertor {
35
36     /**
37      * Method converts list of OF Meter Stats to SAL Meter Stats.
38      * @param allMeterStats
39      * @return List of MeterStats
40      */
41     public List<MeterStats> toSALMeterStatsList(
42             List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats> allMeterStats){
43         List<MeterStats> convertedSALMeters = new ArrayList<MeterStats>();
44         for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meter: allMeterStats){
45             convertedSALMeters.add(toSALMeterStats(meter));
46         }
47         return convertedSALMeters;
48         
49     }
50     
51     /**
52      * Method convert MeterStats message from library to MD SAL defined MeterStats  
53      * @param meterStats MeterStats from library
54      * @return MeterStats -- MeterStats defined in MD-SAL
55      */
56     public MeterStats toSALMeterStats(
57             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meterStats){
58         
59         MeterStatsBuilder salMeterStats = new MeterStatsBuilder();
60         salMeterStats.setByteInCount(new Counter64(meterStats.getByteInCount()));
61         
62         DurationBuilder time = new DurationBuilder();
63         time.setSecond(new Counter32(meterStats.getDurationSec()));
64         time.setNanosecond(new Counter32(meterStats.getDurationNsec()));
65         salMeterStats.setDuration(time.build());
66         
67         salMeterStats.setFlowCount(new Counter32(meterStats.getFlowCount()));
68         salMeterStats.setMeterId(meterStats.getMeterId().intValue());
69         salMeterStats.setPacketInCount(new Counter64(meterStats.getPacketInCount()));
70         
71         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
72         .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
73         .meter.stats.MeterBandStats> allMeterBandStats = meterStats.getMeterBandStats();
74         
75         MeterBandStatsBuilder meterBandStatsBuilder = new MeterBandStatsBuilder();
76         List<BandStat> listAllBandStats = new ArrayList<BandStat>();
77         for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
78                 .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
79                 .meter.stats.MeterBandStats meterBandStats : allMeterBandStats){
80             BandStatBuilder bandStatBuilder = new BandStatBuilder(); 
81             bandStatBuilder.setByteBandCount(new Counter64(meterBandStats.getByteBandCount()));
82             bandStatBuilder.setPacketBandCount(new Counter64(meterBandStats.getPacketBandCount()));
83             listAllBandStats.add(bandStatBuilder.build());
84         }
85         meterBandStatsBuilder.setBandStat(listAllBandStats);
86         salMeterStats.setMeterBandStats(meterBandStatsBuilder.build());
87         return salMeterStats.build();
88     }
89     
90     /**
91      * Method convert list of OF Meter config Stats to SAL Meter Config stats 
92      * @param allMeterConfigs
93      * @return list of MeterConfigStats
94      */
95     public List<MeterConfigStats> toSALMeterConfigList(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig> allMeterConfigs){
96         
97         List<MeterConfigStats> listMeterConfigStats = new ArrayList<MeterConfigStats>();
98         for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig meterConfig : allMeterConfigs){
99             MeterConfigStatsBuilder meterConfigStatsBuilder = new MeterConfigStatsBuilder();
100             meterConfigStatsBuilder.setMeterId(new MeterId(meterConfig.getMeterId()));
101             //TODO: Set flag should be bitmap and not once enum value.
102             //Need to discuss with openflowjava team.
103             //meterConfigStatsBuilder.setFlags(value);
104             
105             MeterBandHeadersBuilder meterBandHeadersBuilder = new MeterBandHeadersBuilder();
106             List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands> bands = meterConfig.getBands();
107             
108             List<MeterBandHeader> listBandHeaders = new ArrayList<MeterBandHeader>();
109             for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands band : bands){
110                 MeterBandHeaderBuilder meterBandHeaderBuilder = new MeterBandHeaderBuilder();
111                 if(band.getMeterBand() instanceof MeterBandDrop){
112                     MeterBandDrop dropBand = (MeterBandDrop)band.getMeterBand();
113                     DropBuilder dropBuilder = new DropBuilder();
114                     dropBuilder.setBurstSize(dropBand.getBurstSize());
115                     dropBuilder.setRate(dropBand.getRate());
116                     meterBandHeaderBuilder.setBandType(dropBuilder.build());
117                     
118                     meterBandHeaderBuilder.setBurstSize(dropBand.getBurstSize());
119                     meterBandHeaderBuilder.setRate(dropBand.getRate());
120                     listBandHeaders.add(meterBandHeaderBuilder.build());
121                 }else if (band.getMeterBand() instanceof MeterBandDscpRemark){
122                     MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark)band.getMeterBand();
123                     DscpRemarkBuilder dscpRemarkBuilder = new DscpRemarkBuilder();
124                     dscpRemarkBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
125                     dscpRemarkBuilder.setRate(dscpRemarkBand.getRate());
126                     meterBandHeaderBuilder.setBandType(dscpRemarkBuilder.build());
127                     
128                     meterBandHeaderBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
129                     meterBandHeaderBuilder.setRate(dscpRemarkBand.getRate());
130                     listBandHeaders.add(meterBandHeaderBuilder.build());
131                     
132                 }else if (band.getMeterBand() instanceof MeterBandExperimenter){
133                     MeterBandExperimenter experimenterBand = (MeterBandExperimenter)band.getMeterBand();
134                     ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
135                     experimenterBuilder.setBurstSize(experimenterBand.getBurstSize());
136                     experimenterBuilder.setRate(experimenterBand.getRate());
137                     meterBandHeaderBuilder.setBandType(experimenterBuilder.build());
138                     
139                     meterBandHeaderBuilder.setBurstSize(experimenterBand.getBurstSize());
140                     meterBandHeaderBuilder.setRate(experimenterBand.getRate());
141                     listBandHeaders.add(meterBandHeaderBuilder.build());
142                     
143                 }
144             }
145             meterBandHeadersBuilder.setMeterBandHeader(listBandHeaders);
146             meterConfigStatsBuilder.setMeterBandHeaders(meterBandHeadersBuilder.build());
147             listMeterConfigStats.add(meterConfigStatsBuilder.build());
148         }
149         
150         return listMeterConfigStats;
151     }
152 }