Bug 5540 - MeterConvertor 70/40870/21
authorTomas Slusny <tomas.slusny@pantheon.sk>
Mon, 27 Jun 2016 13:17:39 +0000 (15:17 +0200)
committerTomas Slusny <tomas.slusny@pantheon.sk>
Wed, 3 Aug 2016 15:52:06 +0000 (15:52 +0000)
- Reworked MeterConvertor to use new ConvertorManager design
- Updated tests and usage of TableFeaturesConvertor accordingly

Change-Id: Icaf9a28d569ae76e396427d79241401f6517a46c
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.sk>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MeterService.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionConvertorData.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertorTest.java

index 73cf63f4ec0b3f0daa924f3b87aeb059b69b5233..94009f06710c4896d483b640e9f21fa801028515 100644 (file)
@@ -7,10 +7,13 @@
  */
 package org.opendaylight.openflowplugin.impl.services;
 
+import java.util.Optional;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
@@ -24,8 +27,12 @@ final class MeterService<I extends Meter, O extends DataObject> extends Abstract
 
     @Override
     protected OfHeader buildRequest(final Xid xid, final I input) {
-        final MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(input, getVersion());
-        ofMeterModInput.setXid(xid.getValue());
-        return ofMeterModInput.build();
+        final VersionConvertorData data = new VersionConvertorData(getVersion());
+        final Optional<MeterModInputBuilder> ofMeterModInput = ConvertorManager.getInstance().convert(input, data);
+        final MeterModInputBuilder meterModInputBuilder = ofMeterModInput
+                .orElse(MeterConvertor.defaultResult(getVersion()));
+
+        meterModInputBuilder.setXid(xid.getValue());
+        return meterModInputBuilder.build();
     }
-}
+}
\ No newline at end of file
index b82abb2c42c10da4c9a8e2b68d53894999ceeeae..442b51c3f4216475382e35fb5d380cd013bec141 100644 (file)
@@ -33,6 +33,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConver
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
 import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
@@ -527,15 +528,18 @@ public abstract class OFRpcTaskFactory {
             public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
                 ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
 
-                // Convert the AddGroupInput to GroupModInput
-                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
-                final Long xId = getSession().getNextXid();
-                ofMeterModInput.setXid(xId);
+                // Convert the AddMeterInput to UpdateMeterOutput
+                final java.util.Optional<MeterModInputBuilder> ofMeterModInput = ConvertorManager
+                        .getInstance()
+                        .convert(getInput(), new VersionConvertorData(getVersion()));
+
+                final MeterModInputBuilder meterModInputBuilder = ofMeterModInput
+                        .orElse(MeterConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
-                        .meterMod(ofMeterModInput.build(), getCookie());
+                        .meterMod(meterModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
                 OFRpcTaskUtil.hookFutureNotification(this, result,
                         getRpcNotificationProviderService(), createMeterAddedNotification(getInput()));
@@ -654,15 +658,17 @@ public abstract class OFRpcTaskFactory {
                 ListenableFuture<RpcResult<UpdateMeterOutput>> result = null;
 
                 // Convert the UpdateMeterInput to MeterModInput
-                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(
-                        getInput().getUpdatedMeter(), getVersion());
-                final Long xId = getSession().getNextXid();
-                ofMeterModInput.setXid(xId);
+                final java.util.Optional<MeterModInputBuilder> ofMeterModInput = ConvertorManager
+                        .getInstance()
+                        .convert(getInput().getUpdatedMeter(), new VersionConvertorData(getVersion()));
+
+                final MeterModInputBuilder meterModInputBuilder = ofMeterModInput
+                        .orElse(MeterConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateMeterOutput>> resultFromOFLib =
-                        getMessageService().meterMod(ofMeterModInput.build(), getCookie());
+                        getMessageService().meterMod(meterModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
                 OFRpcTaskUtil.hookFutureNotification(this, result,
                         getRpcNotificationProviderService(), createMeterUpdatedNotification(getInput()));
@@ -840,15 +846,18 @@ public abstract class OFRpcTaskFactory {
             public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
                 ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
 
-                // Convert the AddGroupInput to GroupModInput
-                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
-                final Long xId = getSession().getNextXid();
-                ofMeterModInput.setXid(xId);
+                // Convert the RemoveMeterInput to UpdateMeterOutput
+                final java.util.Optional<MeterModInputBuilder> ofMeterModInput = ConvertorManager
+                        .getInstance()
+                        .convert(getInput(), new VersionConvertorData(getVersion()));
+
+                final MeterModInputBuilder meterModInputBuilder = ofMeterModInput
+                        .orElse(MeterConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
-                        .meterMod(ofMeterModInput.build(), getCookie());
+                        .meterMod(meterModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
                 OFRpcTaskUtil.hookFutureNotification(this, result,
                         getRpcNotificationProviderService(), createMeterRemovedNotification(getInput()));
index e7ff5c4aaa3458bc4620c81a2b255418723f4ca0..882c4c550f4ffb9cb9d1ef8f0070d9a075b4f060 100644 (file)
@@ -34,6 +34,7 @@ public class ConvertorManager {
         // All convertors are registered here
         INSTANCE.registerConvertor(new TableFeaturesConvertor());
         INSTANCE.registerConvertor(new TableFeaturesResponseConvertor());
+        INSTANCE.registerConvertor(new MeterConvertor());
     }
 
     // Actual convertor keys
index 41a10aaf29ffaf1af3b79efd0c30f910e3cca911..07e8dd46ba40f154bccf1275017b435e39a42d55 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -8,17 +8,12 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 
-/****
- *
- * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
- *
- */
-
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
-
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 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.Meter;
 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;
@@ -44,71 +39,35 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class MeterConvertor {
+/**
+ * Converts a MD-SAL meter mod command into the OF library meter mod command.
+ * <p>
+ * Example usage:
+ * <pre>
+ * {@code
+ * VersionConvertorData data = new VersionConvertorData(version);
+ * Optional<MeterModInputBuilder> ofMeter = ConvertorManager.getInstance().convert(salMeter, data);
+ * }
+ * </pre>
+ */
+public class MeterConvertor implements ParametrizedConvertor<Meter, MeterModInputBuilder, VersionConvertorData> {
     private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
 
-    private MeterConvertor() {
-
-    }
-
-    // Get all the data for the meter from the Yang/SAL-Layer
     /**
-     * @param version of version
-     * @param source Data source
-     * @return MeterModInput required by OF Library
+     * Create default empty meter mot input builder.
+     * Use this method, if result from convertor is empty.
+     *
+     * @param version Openflow version
+     * @return default empty meter mod input builder
      */
-    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>();
-
-        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
-            meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
-        } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
-            meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
-        } else if (source instanceof UpdatedMeter) {
-            meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
-        }
-
-        meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
-
-        if (null != source.getFlags()) {
-            meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
-                .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
-        } 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;
+    public static MeterModInputBuilder defaultResult(short version) {
+        return new MeterModInputBuilder()
+                .setVersion(version)
+                .setFlags(new MeterFlags(false, false, true, false));
     }
 
     private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
-
-        Iterator<MeterBandHeader> bandHeadersIterator = meterBandHeaders.getMeterBandHeader().iterator();
-        MeterBandHeader meterBandHeader;
-
-        BandsBuilder bandsB = null;
-
-        while (bandHeadersIterator.hasNext()) {
-            meterBandHeader = bandHeadersIterator.next();
-            MeterBand meterBandItem = null;
+        for (MeterBandHeader meterBandHeader : meterBandHeaders.getMeterBandHeader()) {
             // The band types :drop,DSCP_Remark or experimenter.
             if (null != meterBandHeader.getMeterBandTypes() &&
                     null != meterBandHeader.getMeterBandTypes().getFlags()) {
@@ -122,8 +81,8 @@ public final class MeterConvertor {
                         meterBandDropBuilder.setBurstSize(drop.getDropBurstSize());
                         meterBandDropBuilder.setRate(drop.getDropRate());
                         dropCaseBuilder.setMeterBandDrop(meterBandDropBuilder.build());
-                        meterBandItem = dropCaseBuilder.build();
-                        bandsB = new BandsBuilder();
+                        MeterBand meterBandItem = dropCaseBuilder.build();
+                        BandsBuilder bandsB = new BandsBuilder();
                         bandsB.setMeterBand(meterBandItem);
                         // Bands list
                         bands.add(bandsB.build());
@@ -140,8 +99,8 @@ public final class MeterConvertor {
                         meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate());
                         meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPrecLevel());
                         dscpCaseBuilder.setMeterBandDscpRemark(meterBandDscpRemarkBuilder.build());
-                        meterBandItem = dscpCaseBuilder.build();
-                        bandsB = new BandsBuilder();
+                        MeterBand meterBandItem = dscpCaseBuilder.build();
+                        BandsBuilder bandsB = new BandsBuilder();
                         bandsB.setMeterBand(meterBandItem);
                         // Bands list
                         bands.add(bandsB.build());
@@ -161,8 +120,8 @@ public final class MeterConvertor {
                         meterBandExperimenterBuilder.addAugmentation(ExperimenterIdMeterBand.class, expBuilder.build());
                         // TODO - implement / finish experimenter meter band translation
                         experimenterCaseBuilder.setMeterBandExperimenter(meterBandExperimenterBuilder.build());
-                        meterBandItem = experimenterCaseBuilder.build();
-                        bandsB = new BandsBuilder();
+                        MeterBand meterBandItem = experimenterCaseBuilder.build();
+                        BandsBuilder bandsB = new BandsBuilder();
                         bandsB.setMeterBand(meterBandItem);
                         // Bands list
                         bands.add(bandsB.build());
@@ -170,7 +129,6 @@ public final class MeterConvertor {
                         logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER);
                     }
                 }
-
             } else {
                 LOG.error("Invalid meter band data found.");
             }
@@ -182,4 +140,50 @@ public final class MeterConvertor {
         LOG.error("BandType: {} No Band Data found", meterBandType);
     }
 
+    @Override
+    public Class<?> getType() {
+        return Meter.class;
+    }
+
+    @Override
+    public MeterModInputBuilder convert(Meter source, VersionConvertorData data) {
+        MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
+        List<Bands> bands = new ArrayList<>();
+
+        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
+            meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
+        } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
+            meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
+        } else if (source instanceof UpdatedMeter) {
+            meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
+        }
+
+        meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
+
+        if (null != source.getFlags()) {
+            meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
+                    .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
+        } 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(data.getVersion());
+        return meterModInputBuilder;
+    }
 }
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionConvertorData.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionConvertorData.java
new file mode 100644 (file)
index 0000000..af5f39b
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. 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.data;
+
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData;
+
+/**
+ * Convertor data implementation containing only Openflow version
+ */
+public class VersionConvertorData extends ConvertorData {
+    /**
+     * Instantiates a new Version convertor data.
+     *
+     * @param version the version
+     */
+    public VersionConvertorData(short version) {
+        super(version);
+    }
+}
\ No newline at end of file
index 6edaf42c04ef8a73db67ce6031763c751cf7620c..1ba7d917269476e029e88f5cf49ea06b5fec4337 100644 (file)
@@ -13,10 +13,12 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
-
+import java.util.Optional;
 import org.junit.Test;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
@@ -40,12 +42,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
 
 public class MeterConvertorTest {
-
-
-
     @Test
     public void testMeterModCommandConvertorwithAllParameters() {
-
         long BURST_SIZE = 10L;
         long DROP_RATE = 20L;
         // / DROP Band
@@ -116,8 +114,8 @@ public class MeterConvertorTest {
         AddMeterInputBuilder addMeterFromSAL = new AddMeterInputBuilder();
 
         addMeterFromSAL.setMeterBandHeaders(meterBandHeaders); // MeterBands
-                                                               // added to the
-                                                               // meter command.
+        // added to the
+        // meter command.
         Long temp = 10L;
 
         // NodeKey key = new NodeKey(new NodeId("24"));
@@ -131,7 +129,7 @@ public class MeterConvertorTest {
         addMeterFromSAL.setFlags(flagV);
 
         AddMeterInput meterInputCommand = addMeterFromSAL.build();
-        MeterModInputBuilder outMeterModInput = MeterConvertor.toMeterModInput(meterInputCommand, (short) 0X4);
+        MeterModInputBuilder outMeterModInput = convert(meterInputCommand, new VersionConvertorData((short) 0X4));
 
         assertEquals(MeterModCommand.OFPMCADD, outMeterModInput.getCommand());
         assertTrue(outMeterModInput.getFlags().isOFPMFBURST());
@@ -174,9 +172,9 @@ public class MeterConvertorTest {
         }
 
     }
+
     @Test
     public void testMeterModCommandConvertorwithNoFlags() {
-
         long BURST_SIZE = 10L;
         long DROP_RATE = 20L;
         // / DROP Band
@@ -249,8 +247,8 @@ public class MeterConvertorTest {
         AddMeterInputBuilder addMeterFromSAL = new AddMeterInputBuilder();
 
         addMeterFromSAL.setMeterBandHeaders(meterBandHeaders); // MeterBands
-                                                               // added to the
-                                                               // meter command.
+        // added to the
+        // meter command.
         Long temp = 10L;
 
         // NodeKey key = new NodeKey(new NodeId("24"));
@@ -263,7 +261,7 @@ public class MeterConvertorTest {
 
 
         AddMeterInput meterInputCommand = addMeterFromSAL.build();
-        MeterModInputBuilder outMeterModInput = MeterConvertor.toMeterModInput(meterInputCommand, (short) 0X4);
+        MeterModInputBuilder outMeterModInput = convert(meterInputCommand, new VersionConvertorData((short) 0X4));
 
         assertEquals(MeterModCommand.OFPMCADD, outMeterModInput.getCommand());
         assertFalse(outMeterModInput.getFlags().isOFPMFBURST());
@@ -307,10 +305,9 @@ public class MeterConvertorTest {
         }
 
     }
+
     @Test
     public void testMeterModCommandConvertorBandDataisNULL() {
-
-
         AddMeterInputBuilder addMeterFromSAL = new AddMeterInputBuilder();
 
         Long temp = 10L;
@@ -326,12 +323,12 @@ public class MeterConvertorTest {
         addMeterFromSAL.setFlags(flagV);
 
         AddMeterInput meterInputCommand = addMeterFromSAL.build();
-        MeterModInputBuilder outMeterModInput = MeterConvertor.toMeterModInput(meterInputCommand, (short) 0X4);
+        MeterModInputBuilder outMeterModInput = convert(meterInputCommand, new VersionConvertorData((short) 0X4));
 
         assertEquals(MeterModCommand.OFPMCADD, outMeterModInput.getCommand());
         assertTrue(outMeterModInput.getFlags().isOFPMFBURST());
         assertEquals(temp, outMeterModInput.getMeterId().getValue());
-       }
+    }
 
     @Test
     public void testMeterModCommandConvertorNoValidBandData() {
@@ -392,8 +389,8 @@ public class MeterConvertorTest {
         AddMeterInputBuilder addMeterFromSAL = new AddMeterInputBuilder();
 
         addMeterFromSAL.setMeterBandHeaders(meterBandHeaders); // MeterBands
-                                                               // added to the
-                                                               // meter command.
+        // added to the
+        // meter command.
         Long temp = 10L;
 
         // NodeKey key = new NodeKey(new NodeId("24"));
@@ -407,7 +404,7 @@ public class MeterConvertorTest {
         addMeterFromSAL.setFlags(flagV);
 
         AddMeterInput meterInputCommand = addMeterFromSAL.build();
-        MeterModInputBuilder outMeterModInput = MeterConvertor.toMeterModInput(meterInputCommand, (short) 0X4);
+        MeterModInputBuilder outMeterModInput = convert(meterInputCommand, new VersionConvertorData((short) 0X4));
 
         assertEquals(MeterModCommand.OFPMCADD, outMeterModInput.getCommand());
         assertTrue(outMeterModInput.getFlags().isOFPMFBURST());
@@ -451,4 +448,8 @@ public class MeterConvertorTest {
 
     }
 
-}
+    private MeterModInputBuilder convert(Meter source, VersionConvertorData data) {
+        Optional<MeterModInputBuilder> outMeterModInputOptional = ConvertorManager.getInstance().convert(source, data);
+        return outMeterModInputOptional.orElse(MeterConvertor.defaultResult(data.getVersion()));
+    }
+}
\ No newline at end of file