Merge "BUG-4117: add support of Old Notif. for Flow Statistics"
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / MeterConvertor.java
index 98abf6c1db3f8f698908a272c5f7e57ed1b0fadf..41a10aaf29ffaf1af3b79efd0c30f910e3cca911 100644 (file)
@@ -1,3 +1,11 @@
+/**
+ * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 
 /****
@@ -10,27 +18,34 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBand;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBandBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
-
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class MeterConvertor {
+    private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
 
     private MeterConvertor() {
 
@@ -38,33 +53,50 @@ public final class MeterConvertor {
 
     // Get all the data for the meter from the Yang/SAL-Layer
     /**
-     * @param version
-     * @param Yang
-     *            Data source
+     * @param version of version
+     * @param source Data source
      * @return MeterModInput required by OF Library
      */
-    public static MeterModInput toMeterModInput(
+    public static MeterModInputBuilder toMeterModInput(
             org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source, short version) {
 
         MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
-
         List<Bands> bands = new ArrayList<Bands>();
-        MeterFlags flags = null;
-        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput)
+
+        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
             meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
-        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput)
+        } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
             meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
-        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput)
+        } else if (source instanceof UpdatedMeter) {
             meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
+        }
 
         meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
 
-        meterModInputBuilder.setFlags(flags = new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
+        if (null != source.getFlags()) {
+            meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
                 .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
-        getBandsFromSAL(source.getMeterBandHeaders(), bands);
-        meterModInputBuilder.setBands(bands);
+        } else {
+
+            /*
+             * As per 0F1.3.1,The rate field indicates the rate value above
+             * which the corresponding band may apply to packets (see 5.7.1).
+             * The rate value is in kilobit per seconds, unless the flags eld
+             * includes OFPMF_PKTPS, in which case the rate is in packets per
+             * seconds.
+             */
+
+            meterModInputBuilder.setFlags(new MeterFlags(false, false, true, false));
+        }
+        if (source.getMeterBandHeaders() != null) {
+            getBandsFromSAL(source.getMeterBandHeaders(), bands);
+            meterModInputBuilder.setBands(bands);
+        } else {
+            LOG.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
+        }
+
         meterModInputBuilder.setVersion(version);
-        return meterModInputBuilder.build();
+        return meterModInputBuilder;
     }
 
     private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
@@ -78,47 +110,76 @@ public final class MeterConvertor {
             meterBandHeader = bandHeadersIterator.next();
             MeterBand meterBandItem = null;
             // The band types :drop,DSCP_Remark or experimenter.
-
-            if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
-
-                MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
-                meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
-
-                Drop drop = (Drop) meterBandHeader.getBandType();
-
-                meterBandDropBuilder.setBurstSize(drop.getRate());
-                meterBandDropBuilder.setRate(drop.getBurstSize());
-                meterBandItem = meterBandDropBuilder.build();
-
-            } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
-                MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
-                meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
-
-                DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
-
-                meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getBurstSize());
-                meterBandDscpRemarkBuilder.setRate(dscpRemark.getRate());
-                meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPercLevel());
-                meterBandItem = meterBandDscpRemarkBuilder.build();
-
-            } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
-                MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
-                meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
-                Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
-                meterBandExperimenterBuilder.setBurstSize(experimenter.getBurstSize());
-                meterBandExperimenterBuilder.setRate(experimenter.getRate());
-                meterBandExperimenterBuilder.setExperimenter(experimenter.getExperimenter());
-                meterBandItem = meterBandExperimenterBuilder.build();
-
+            if (null != meterBandHeader.getMeterBandTypes() &&
+                    null != meterBandHeader.getMeterBandTypes().getFlags()) {
+
+                if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
+                    if (meterBandHeader.getBandType() != null) {
+                        MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
+                        MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
+                        meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
+                        Drop drop = (Drop) meterBandHeader.getBandType();
+                        meterBandDropBuilder.setBurstSize(drop.getDropBurstSize());
+                        meterBandDropBuilder.setRate(drop.getDropRate());
+                        dropCaseBuilder.setMeterBandDrop(meterBandDropBuilder.build());
+                        meterBandItem = dropCaseBuilder.build();
+                        bandsB = new BandsBuilder();
+                        bandsB.setMeterBand(meterBandItem);
+                        // Bands list
+                        bands.add(bandsB.build());
+                    } else {
+                        logBandTypeMissing(MeterBandType.OFPMBTDROP);
+                    }
+                } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
+                    if (meterBandHeader.getBandType() != null) {
+                        MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
+                        MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
+                        meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
+                        DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
+                        meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getDscpRemarkBurstSize());
+                        meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate());
+                        meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPrecLevel());
+                        dscpCaseBuilder.setMeterBandDscpRemark(meterBandDscpRemarkBuilder.build());
+                        meterBandItem = dscpCaseBuilder.build();
+                        bandsB = new BandsBuilder();
+                        bandsB.setMeterBand(meterBandItem);
+                        // Bands list
+                        bands.add(bandsB.build());
+                    } else {
+                        logBandTypeMissing(MeterBandType.OFPMBTDSCPREMARK);
+                    }
+                } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
+                    if (meterBandHeader.getBandType() != null) {
+                        MeterBandExperimenterCaseBuilder experimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
+                        MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
+                        meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
+                        Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
+                        meterBandExperimenterBuilder.setBurstSize(experimenter.getExperimenterBurstSize());
+                        meterBandExperimenterBuilder.setRate(experimenter.getExperimenterRate());
+                        ExperimenterIdMeterBandBuilder expBuilder = new ExperimenterIdMeterBandBuilder();
+                        expBuilder.setExperimenter(new ExperimenterId(experimenter.getExperimenter()));
+                        meterBandExperimenterBuilder.addAugmentation(ExperimenterIdMeterBand.class, expBuilder.build());
+                        // TODO - implement / finish experimenter meter band translation
+                        experimenterCaseBuilder.setMeterBandExperimenter(meterBandExperimenterBuilder.build());
+                        meterBandItem = experimenterCaseBuilder.build();
+                        bandsB = new BandsBuilder();
+                        bandsB.setMeterBand(meterBandItem);
+                        // Bands list
+                        bands.add(bandsB.build());
+                    } else {
+                        logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER);
+                    }
+                }
+
+            } else {
+                LOG.error("Invalid meter band data found.");
             }
-
-            bandsB = new BandsBuilder();
-            bandsB.setMeterBand(meterBandItem).build();
-
-            bands.add(bandsB.build()); // Bands list
-
         }
 
     }
 
+    private static void logBandTypeMissing(final MeterBandType meterBandType) {
+        LOG.error("BandType: {} No Band Data found", meterBandType);
+    }
+
 }