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