X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fcore%2Fsal%2Fconvertor%2FMeterConvertor.java;h=1bd059bafeb4141f50ac8a314bc4c8566d46b9a1;hb=6916d4f22823d56b391d0d45cb8544260def3431;hp=03422120b1d6b17ff24032a2d51aa9e1b3eb5757;hpb=0145bcff34942fadaa4a6c4182104bd9937fa08e;p=openflowplugin.git diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java index 03422120b1..1bd059bafe 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java @@ -1,32 +1,30 @@ -/** +/* * 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 - * - * Contributor: usha.m.s@ericsson.com */ -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. - * - */ +package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import java.util.ArrayList; -import java.util.Iterator; +import java.util.Arrays; +import java.util.Collection; import java.util.List; - +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; +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.RemoveMeterInput; 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.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.rev131002.ExperimenterIdMeterBand; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMeterBandBuilder; +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; @@ -42,76 +40,40 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 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.yangtools.yang.binding.DataContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class MeterConvertor { - private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class); - private static final String PREFIX_SEPARATOR = "/"; - - private MeterConvertor() { - - } +/** + * Converts a MD-SAL meter mod command into the OF library meter mod command. + *

+ * Example usage: + *

+ * {@code
+ * VersionConvertorData data = new VersionConvertorData(version);
+ * Optional ofMeter = convertorManager.convert(salMeter, data);
+ * }
+ * 
+ */ +public class MeterConvertor extends Convertor { + private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class); + private static final List> TYPES = Arrays.asList(Meter.class, AddMeterInput.class, RemoveMeterInput.class, UpdatedMeter.class); - // Get all the data for the meter from the Yang/SAL-Layer /** - * @param version - * @param Yang - * 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 = 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 { - logger.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) { - - Iterator 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()) { @@ -125,13 +87,13 @@ 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.add(bandsB.build()); // Bands list - + // Bands list + bands.add(bandsB.build()); } else { - logger.error("BandType: " + MeterBandType.OFPMBTDROP + "No Band Data found"); + logBandTypeMissing(MeterBandType.OFPMBTDROP); } } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) { if (meterBandHeader.getBandType() != null) { @@ -141,15 +103,15 @@ public final class MeterConvertor { DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType(); meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getDscpRemarkBurstSize()); meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate()); - meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPercLevel()); + 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.add(bandsB.build()); // Bands list - + // Bands list + bands.add(bandsB.build()); } else { - logger.error("BandType: " + MeterBandType.OFPMBTDSCPREMARK + "No Band Data found"); + logBandTypeMissing(MeterBandType.OFPMBTDSCPREMARK); } } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) { if (meterBandHeader.getBandType() != null) { @@ -164,21 +126,70 @@ 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.add(bandsB.build()); // Bands list - + // Bands list + bands.add(bandsB.build()); } else { - logger.error("BandType: " + MeterBandType.OFPMBTEXPERIMENTER + "No Band Data found"); + logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER); } } - } else { - logger.error("Invalid meter band data found."); + LOG.error("Invalid meter band data found."); } } } + private static void logBandTypeMissing(final MeterBandType meterBandType) { + LOG.error("BandType: {} No Band Data found", meterBandType); + } + + @Override + public Collection> getTypes() { + return TYPES; + } + + @Override + public MeterModInputBuilder convert(Meter source, VersionConvertorData data) { + MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder(); + List bands = new ArrayList<>(); + + if (source instanceof AddMeterInput) { + meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD); + } else if (source instanceof 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; + } }