d770d9a12b822bab9ff86a00cd927245d33d87e8
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / MeterConvertor.java
1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
2
3 /****
4  *
5  * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
6  *
7  */
8
9 import java.util.ArrayList;
10 import java.util.Iterator;
11 import java.util.List;
12
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 public final class MeterConvertor {
34     private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class);
35     private static final String PREFIX_SEPARATOR = "/";
36
37     private MeterConvertor() {
38
39     }
40
41     // Get all the data for the meter from the Yang/SAL-Layer
42     /**
43      * @param version
44      * @param Yang
45      *            Data source
46      * @return MeterModInput required by OF Library
47      */
48     public static MeterModInput toMeterModInput(
49             org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source, short version) {
50
51         MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
52
53         List<Bands> bands = new ArrayList<Bands>();
54         MeterFlags flags = null;
55         if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput)
56             meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
57         else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput)
58             meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
59         else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput)
60             meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
61
62         meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
63
64         if (source.getFlags() != null) {
65             meterModInputBuilder.setFlags(flags = new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
66                     .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
67         } else {
68
69             /*
70              * As per 0F1.3.1,The rate field indicates the rate value above
71              * which the corresponding band may apply to packets (see 5.7.1).
72              * The rate value is in kilobit per seconds, unless the flags eld
73              * includes OFPMF_PKTPS, in which case the rate is in packets per
74              * seconds.
75              */
76
77             meterModInputBuilder.setFlags(flags = new MeterFlags(false, false, true, false));
78         }
79         if (source.getMeterBandHeaders() != null) {
80             getBandsFromSAL(source.getMeterBandHeaders(), bands);
81         } else {
82             logger.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
83         }
84
85         meterModInputBuilder.setBands(bands);
86         meterModInputBuilder.setVersion(version);
87         return meterModInputBuilder.build();
88     }
89
90     private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
91
92         Iterator<MeterBandHeader> bandHeadersIterator = meterBandHeaders.getMeterBandHeader().iterator();
93         MeterBandHeader meterBandHeader;
94
95         BandsBuilder bandsB = null;
96
97         while (bandHeadersIterator.hasNext()) {
98             meterBandHeader = bandHeadersIterator.next();
99             MeterBand meterBandItem = null;
100             // The band types :drop,DSCP_Remark or experimenter.
101             if (null != meterBandHeader.getMeterBandTypes() && null != meterBandHeader.getMeterBandTypes().getFlags()) {
102
103                 if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
104                     if (meterBandHeader.getBandType() != null) {
105                         MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
106                         meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
107
108                         Drop drop = (Drop) meterBandHeader.getBandType();
109
110                         meterBandDropBuilder.setBurstSize(drop.getRate());
111                         meterBandDropBuilder.setRate(drop.getBurstSize());
112                         meterBandItem = meterBandDropBuilder.build();
113                         bandsB = new BandsBuilder();
114                         bandsB.setMeterBand(meterBandItem).build();
115
116                         bands.add(bandsB.build()); // Bands list
117
118                     } else {
119                         logger.error("BandType: " + MeterBandType.OFPMBTDROP + "No Band Data found");
120                     }
121                 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
122                     if (meterBandHeader.getBandType() != null) {
123                         MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
124                         meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
125
126                         DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
127
128                         meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getBurstSize());
129                         meterBandDscpRemarkBuilder.setRate(dscpRemark.getRate());
130                         meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPercLevel());
131                         meterBandItem = meterBandDscpRemarkBuilder.build();
132                         bandsB = new BandsBuilder();
133                         bandsB.setMeterBand(meterBandItem).build();
134
135                         bands.add(bandsB.build()); // Bands list
136
137                     } else {
138                         logger.error("BandType: " + MeterBandType.OFPMBTDSCPREMARK + "No Band Data found");
139                     }
140                 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
141                     if (meterBandHeader.getBandType() != null) {
142                         MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
143                         meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
144                         Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
145                         meterBandExperimenterBuilder.setBurstSize(experimenter.getBurstSize());
146                         meterBandExperimenterBuilder.setRate(experimenter.getRate());
147                         meterBandExperimenterBuilder.setExperimenter(experimenter.getExperimenter());
148                         meterBandItem = meterBandExperimenterBuilder.build();
149                         bandsB = new BandsBuilder();
150                         bandsB.setMeterBand(meterBandItem).build();
151
152                         bands.add(bandsB.build()); // Bands list
153
154                     } else {
155                         logger.error("BandType: " + MeterBandType.OFPMBTEXPERIMENTER + "No Band Data found");
156                     }
157                 }
158
159             } else {
160                 logger.error("Invalid meter band data found.");
161             }
162         }
163
164     }
165
166 }