*/
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;
@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
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;
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()));
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()));
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()));
// All convertors are registered here
INSTANCE.registerConvertor(new TableFeaturesConvertor());
INSTANCE.registerConvertor(new TableFeaturesResponseConvertor());
+ INSTANCE.registerConvertor(new MeterConvertor());
}
// Actual convertor keys
-/**
+/*
* 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
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;
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()) {
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());
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());
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());
logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER);
}
}
-
} else {
LOG.error("Invalid meter band data found.");
}
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;
+ }
}
--- /dev/null
+/*
+ * 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
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;
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
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"));
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());
}
}
+
@Test
public void testMeterModCommandConvertorwithNoFlags() {
-
long BURST_SIZE = 10L;
long DROP_RATE = 20L;
// / DROP Band
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"));
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());
}
}
+
@Test
public void testMeterModCommandConvertorBandDataisNULL() {
-
-
AddMeterInputBuilder addMeterFromSAL = new AddMeterInputBuilder();
Long temp = 10L;
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() {
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"));
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());
}
-}
+ 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