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