07e8dd46ba40f154bccf1275017b435e39a42d55
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / MeterConvertor.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
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
10
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBand;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBandBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * Converts a MD-SAL meter mod command into the OF library meter mod command.
44  * <p>
45  * Example usage:
46  * <pre>
47  * {@code
48  * VersionConvertorData data = new VersionConvertorData(version);
49  * Optional<MeterModInputBuilder> ofMeter = ConvertorManager.getInstance().convert(salMeter, data);
50  * }
51  * </pre>
52  */
53 public class MeterConvertor implements ParametrizedConvertor<Meter, MeterModInputBuilder, VersionConvertorData> {
54     private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
55
56     /**
57      * Create default empty meter mot input builder.
58      * Use this method, if result from convertor is empty.
59      *
60      * @param version Openflow version
61      * @return default empty meter mod input builder
62      */
63     public static MeterModInputBuilder defaultResult(short version) {
64         return new MeterModInputBuilder()
65                 .setVersion(version)
66                 .setFlags(new MeterFlags(false, false, true, false));
67     }
68
69     private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
70         for (MeterBandHeader meterBandHeader : meterBandHeaders.getMeterBandHeader()) {
71             // The band types :drop,DSCP_Remark or experimenter.
72             if (null != meterBandHeader.getMeterBandTypes() &&
73                     null != meterBandHeader.getMeterBandTypes().getFlags()) {
74
75                 if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
76                     if (meterBandHeader.getBandType() != null) {
77                         MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
78                         MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
79                         meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
80                         Drop drop = (Drop) meterBandHeader.getBandType();
81                         meterBandDropBuilder.setBurstSize(drop.getDropBurstSize());
82                         meterBandDropBuilder.setRate(drop.getDropRate());
83                         dropCaseBuilder.setMeterBandDrop(meterBandDropBuilder.build());
84                         MeterBand meterBandItem = dropCaseBuilder.build();
85                         BandsBuilder bandsB = new BandsBuilder();
86                         bandsB.setMeterBand(meterBandItem);
87                         // Bands list
88                         bands.add(bandsB.build());
89                     } else {
90                         logBandTypeMissing(MeterBandType.OFPMBTDROP);
91                     }
92                 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
93                     if (meterBandHeader.getBandType() != null) {
94                         MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
95                         MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
96                         meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
97                         DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
98                         meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getDscpRemarkBurstSize());
99                         meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate());
100                         meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPrecLevel());
101                         dscpCaseBuilder.setMeterBandDscpRemark(meterBandDscpRemarkBuilder.build());
102                         MeterBand meterBandItem = dscpCaseBuilder.build();
103                         BandsBuilder bandsB = new BandsBuilder();
104                         bandsB.setMeterBand(meterBandItem);
105                         // Bands list
106                         bands.add(bandsB.build());
107                     } else {
108                         logBandTypeMissing(MeterBandType.OFPMBTDSCPREMARK);
109                     }
110                 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
111                     if (meterBandHeader.getBandType() != null) {
112                         MeterBandExperimenterCaseBuilder experimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
113                         MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
114                         meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
115                         Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
116                         meterBandExperimenterBuilder.setBurstSize(experimenter.getExperimenterBurstSize());
117                         meterBandExperimenterBuilder.setRate(experimenter.getExperimenterRate());
118                         ExperimenterIdMeterBandBuilder expBuilder = new ExperimenterIdMeterBandBuilder();
119                         expBuilder.setExperimenter(new ExperimenterId(experimenter.getExperimenter()));
120                         meterBandExperimenterBuilder.addAugmentation(ExperimenterIdMeterBand.class, expBuilder.build());
121                         // TODO - implement / finish experimenter meter band translation
122                         experimenterCaseBuilder.setMeterBandExperimenter(meterBandExperimenterBuilder.build());
123                         MeterBand meterBandItem = experimenterCaseBuilder.build();
124                         BandsBuilder bandsB = new BandsBuilder();
125                         bandsB.setMeterBand(meterBandItem);
126                         // Bands list
127                         bands.add(bandsB.build());
128                     } else {
129                         logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER);
130                     }
131                 }
132             } else {
133                 LOG.error("Invalid meter band data found.");
134             }
135         }
136
137     }
138
139     private static void logBandTypeMissing(final MeterBandType meterBandType) {
140         LOG.error("BandType: {} No Band Data found", meterBandType);
141     }
142
143     @Override
144     public Class<?> getType() {
145         return Meter.class;
146     }
147
148     @Override
149     public MeterModInputBuilder convert(Meter source, VersionConvertorData data) {
150         MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
151         List<Bands> bands = new ArrayList<>();
152
153         if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
154             meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
155         } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
156             meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
157         } else if (source instanceof UpdatedMeter) {
158             meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
159         }
160
161         meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
162
163         if (null != source.getFlags()) {
164             meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
165                     .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
166         } else {
167
168             /*
169              * As per 0F1.3.1,The rate field indicates the rate value above
170              * which the corresponding band may apply to packets (see 5.7.1).
171              * The rate value is in kilobit per seconds, unless the flags eld
172              * includes OFPMF_PKTPS, in which case the rate is in packets per
173              * seconds.
174              */
175
176             meterModInputBuilder.setFlags(new MeterFlags(false, false, true, false));
177         }
178
179         if (source.getMeterBandHeaders() != null) {
180             getBandsFromSAL(source.getMeterBandHeaders(), bands);
181             meterModInputBuilder.setBands(bands);
182         } else {
183             LOG.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
184         }
185
186         meterModInputBuilder.setVersion(data.getVersion());
187         return meterModInputBuilder;
188     }
189 }