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