OPNFLWPLUG-1015 : OF Bundle add message failing with incorrect XID 13/72513/11
authorgobinath <gobinath@ericsson.com>
Thu, 31 May 2018 06:34:05 +0000 (12:04 +0530)
committergobinath <gobinath@ericsson.com>
Wed, 6 Jun 2018 06:34:24 +0000 (12:04 +0530)
When more number of flow/groups being pushed via OF bundle down to openflow switch. OVS rejects some of the bundle add messages with error OFPBFC_MSG_BAD_XID (inconsistent or duplicate transaction ID).

On further analysis, it was found that the OVS (in compliance with
openflow protocol) rejects the add bundle messages if the transaction id
in the OFP header containing the bundle add msg is different to that of
the flow/group mod present in the bundle body.

This may be due to synchronization issues in the creation of the bundle
inner msg which could have resulted in the incorrect transaction Id
being set in the bundle msg. Changes have been made to avoid the
synchronization issue now which could fix this bug.

Change-Id: Ia575eee9616607402f625e09588b84758b1e4fe2
Signed-off-by: gobinath <gobinath@ericsson.com>
22 files changed:
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/BundleMessageDataInjector.java [deleted file]
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConverterMessageToOFJava.java
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorData.java [new file with mode: 0644]
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConvertorData.java [new file with mode: 0644]
extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/core/extension/ExtensionConverterProvider.java
extension/openflowplugin-extension-onf/src/main/java/org/opendaylight/openflowplugin/extension/onf/converter/BundleAddMessageConverter.java
extension/openflowplugin-extension-onf/src/main/java/org/opendaylight/openflowplugin/extension/onf/converter/BundleControlConverter.java
extension/openflowplugin-extension-onf/src/test/java/org/opendaylight/openflowplugin/extension/onf/converter/BundleAddMessageConverterTest.java
extension/openflowplugin-extension-onf/src/test/java/org/opendaylight/openflowplugin/extension/onf/converter/BundleControlConverterTest.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/multipart/MultipartRequestExperimenterSerializer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/multilayer/MultiLayerExperimenterMultipartService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/sal/PacketProcessingServiceImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/sal/SalExperimenterMessageServiceImpl.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/ServiceMocking.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/sal/SalExperimenterMessageServiceImplTest.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/XidConvertorData.java [moved from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/PacketOutConvertorData.java with 69% similarity]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertorTest.java

diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/BundleMessageDataInjector.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/BundleMessageDataInjector.java
deleted file mode 100644 (file)
index 99f465e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.extension.api;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-
-/**
- * Interface for bundle data injection.
- */
-public interface BundleMessageDataInjector {
-    /**
-     * Set xid.
-     *
-     * @param xid request id
-     */
-    void setXid(long xid);
-
-    /**
-     * Set node id.
-     *
-     * @param node node id
-     */
-    void setNode(NodeRef node);
-}
index 98dfd271a6c3ff7f3bc75844b9387cd0e2be8dd9..3abfb4715f5e0dc47e71206dd08ec5b37405fab1 100644 (file)
@@ -18,15 +18,17 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
  * @param <F> input message model - MD-SAL model
  * @param <T> output message model - OFJava-API
  */
-public interface ConverterMessageToOFJava<F extends ExperimenterMessageOfChoice, T extends DataContainer> {
+public interface ConverterMessageToOFJava<F extends ExperimenterMessageOfChoice, T extends DataContainer,
+        D extends ConvertorData> {
 
     /**
      * Converts a message to MD-SAL model.
      *
      * @param experimenterMessageCase where is vendor's augmentation
+     * @param data which contains the Xid and datapathId
      * @return message converted to OFJava-API
      */
-    T convert(F experimenterMessageCase) throws ConversionException;
+    T convert(F experimenterMessageCase, D data) throws ConversionException;
 
     /**
      * Returns the corresponding experimenter id (vendor id).
diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorData.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorData.java
new file mode 100644 (file)
index 0000000..a894a2c
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2018 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.extension.api;
+
+/**
+ * The base class for all convertor data.
+ */
+public abstract class ConvertorData {
+    private short version;
+    /**
+     *Instantiates a new Convertor data.
+     * @param version the version
+     */
+
+    public ConvertorData(final short version) {
+        this.version = version;
+    }
+
+    /**
+     * Gets Openflow version.
+     *
+     * @return the version
+     */
+    public short getVersion() {
+        return version;
+    }
+}
index 928b99e5fd755823f38781c043558dae2887f500..4eecd04fb8bba26a8e283a36b2ac18f6fd0487e1 100644 (file)
@@ -68,8 +68,9 @@ public interface ExtensionConverterRegistrator {
      * @param converter TO OFJava (suitable for both: symmetric and multipart)
      * @return closeable registration
      */
-    <I extends ExperimenterMessageOfChoice, O extends DataContainer> ObjectRegistration<ConverterMessageToOFJava<I, O>>
-        registerMessageConvertor(TypeVersionKey<I> key, ConverterMessageToOFJava<I, O> converter);
+    <I extends ExperimenterMessageOfChoice, O extends DataContainer, D extends ConvertorData>
+        ObjectRegistration<ConverterMessageToOFJava<I, O, D>>
+        registerMessageConvertor(TypeVersionKey<I> key, ConverterMessageToOFJava<I, O, D> converter);
 
     /**
      * Registers a message converter.
diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConvertorData.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConvertorData.java
new file mode 100644 (file)
index 0000000..bccbf61
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018 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.extension.api;
+
+import java.math.BigInteger;
+
+public class ExtensionConvertorData extends ConvertorData {
+    private Long xid;
+
+    private BigInteger datapathId;
+
+
+    /**
+     * Instantiates a new ExtensionConvertor data.
+     *
+     * @param version the version
+     */
+    public ExtensionConvertorData(short version) {
+        super(version);
+    }
+
+    /**
+     * Gets xid.
+     *
+     * @return the xid
+     */
+    public Long getXid() {
+        return xid;
+    }
+
+    /**
+     * Sets xid.
+     *
+     * @param xid the xid
+     */
+    public void setXid(Long xid) {
+        this.xid = xid;
+    }
+
+    /**
+     * Gets datapath id.
+     *
+     * @return the datapath id
+     */
+    public BigInteger getDatapathId() {
+        return datapathId;
+    }
+
+    /**
+     * Sets datapath id.
+     *
+     * @param datapathId the datapath id
+     */
+    public void setDatapathId(BigInteger datapathId) {
+        this.datapathId = datapathId;
+    }
+}
index 2d6428f9242f33851a9c1a55b3940ac57d55d919..d02741b3209c886c9f2ce66c5620b4cb9962f9db 100644 (file)
@@ -12,6 +12,7 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
@@ -63,8 +64,8 @@ public interface ExtensionConverterProvider {
      * @param key the type version key
      * @return found converter
      */
-    <F extends ExperimenterMessageOfChoice, T extends DataContainer> ConverterMessageToOFJava<F, T> getMessageConverter(
-            TypeVersionKey<F> key);
+    <F extends ExperimenterMessageOfChoice, T extends DataContainer,
+        D extends ConvertorData> ConverterMessageToOFJava<F, T, D> getMessageConverter(TypeVersionKey<F> key);
 
     /**
      * Lookup converter for experimenter message.
index af6c5c238dbfcfaca8d92b65d8ce742a538d3bcf..9c74354327b7bb8962589890d47fb6a561c1f1cc 100644 (file)
@@ -8,20 +8,17 @@
 
 package org.opendaylight.openflowplugin.extension.onf.converter;
 
-import java.math.BigInteger;
 import java.util.List;
 import java.util.Optional;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.extension.api.BundleMessageDataInjector;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
 import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
 import org.opendaylight.openflowplugin.extension.api.path.MessagePath;
 import org.opendaylight.openflowplugin.extension.onf.OnfConstants;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
@@ -29,8 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.p
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
@@ -58,29 +53,33 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.on
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleAddMessageOnf;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleAddMessageOnfBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.bundle.add.message.onf.OnfAddMessageGroupingDataBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Converter for BundleAddMessage messages (ONF approved extension #230).
  */
 public class BundleAddMessageConverter implements
-        ConverterMessageToOFJava<BundleAddMessageSal, BundleAddMessageOnf>,
-        ConvertorMessageFromOFJava<BundleAddMessageOnf, MessagePath>,
-        BundleMessageDataInjector {
+        ConverterMessageToOFJava<BundleAddMessageSal, BundleAddMessageOnf, ExtensionConvertorData>,
+        ConvertorMessageFromOFJava<BundleAddMessageOnf, MessagePath> {
 
+    private static final Logger LOG = LoggerFactory.getLogger(BundleAddMessageConverter.class);
     private static final ConvertorExecutor CONVERTER_EXECUTOR = ConvertorManagerFactory.createDefaultManager();
-    private long xid;
-    private NodeRef node;
 
     @Override
-    public BundleAddMessageOnf convert(BundleAddMessageSal experimenterMessageCase) throws ConversionException {
+    public BundleAddMessageOnf convert(BundleAddMessageSal experimenterMessageCase,
+            ExtensionConvertorData extensionData) throws ConversionException {
         final OnfAddMessageGroupingDataBuilder dataBuilder = new OnfAddMessageGroupingDataBuilder();
         dataBuilder.setBundleId(experimenterMessageCase.getSalAddMessageData().getBundleId());
         dataBuilder.setFlags(experimenterMessageCase.getSalAddMessageData().getFlags());
         dataBuilder.setBundleProperty(experimenterMessageCase.getSalAddMessageData().getBundleProperty());
         final BundleInnerMessage innerMessage = experimenterMessageCase.getSalAddMessageData().getBundleInnerMessage();
-        final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
-        data.setDatapathId(digDatapathId(node));
-
+        final XidConvertorData data = new XidConvertorData(extensionData.getVersion());
+        data.setDatapathId(extensionData.getDatapathId());
+        data.setXid(extensionData.getXid());
+        LOG.trace("Flow or group pushed to the node: {} with transaction id : {} is {}",
+                data.getDatapathId(), data.getXid(),
+                experimenterMessageCase.getSalAddMessageData().getBundleInnerMessage());
         if (innerMessage.getImplementedInterface().equals(BundleAddFlowCase.class)
                 || innerMessage.getImplementedInterface().equals(BundleUpdateFlowCase.class)
                 || innerMessage.getImplementedInterface().equals(BundleRemoveFlowCase.class)) {
@@ -108,7 +107,7 @@ public class BundleAddMessageConverter implements
     }
 
     private BundleFlowModCase convertBundleFlowCase(final BundleInnerMessage messageCase,
-            final VersionDatapathIdConvertorData data) throws ConversionException {
+            final XidConvertorData data) throws ConversionException {
         Optional<List<FlowModInputBuilder>> flowModInputs = Optional.empty();
         final Class clazz = messageCase.getImplementedInterface();
         if (clazz.equals(BundleAddFlowCase.class)) {
@@ -131,7 +130,7 @@ public class BundleAddMessageConverter implements
                                         flowModInputs
                                                 .get()
                                                 .get(0)
-                                                .setXid(xid)
+                                                .setXid(data.getXid())
                                                 .build())
                                         .build())
                         .build();
@@ -145,7 +144,7 @@ public class BundleAddMessageConverter implements
     }
 
     private BundleGroupModCase convertBundleGroupCase(final BundleInnerMessage messageCase,
-            final VersionDatapathIdConvertorData data) throws ConversionException {
+            final XidConvertorData data) throws ConversionException {
         Optional<GroupModInputBuilder> groupModInput = Optional.empty();
         final Class clazz = messageCase.getImplementedInterface();
         if (clazz.equals(BundleAddGroupCase.class)) {
@@ -165,7 +164,7 @@ public class BundleAddMessageConverter implements
             return new BundleGroupModCaseBuilder()
                     .setGroupModCaseData(
                             new GroupModCaseDataBuilder(groupModInput.get()
-                                    .setXid(xid)
+                                    .setXid(data.getXid())
                                     .build())
                             .build()
                     )
@@ -176,7 +175,7 @@ public class BundleAddMessageConverter implements
     }
 
     private BundlePortModCase convertBundlePortCase(final BundleInnerMessage messageCase,
-            final VersionDatapathIdConvertorData data) throws ConversionException {
+            final XidConvertorData data) throws ConversionException {
         Optional<PortModInput> portModInput = Optional.empty();
         final Class<?> clazz = messageCase.getImplementedInterface();
         if (clazz.equals(BundleUpdatePortCase.class)) {
@@ -189,7 +188,7 @@ public class BundleAddMessageConverter implements
             return new BundlePortModCaseBuilder()
                     .setPortModCaseData(
                             new PortModCaseDataBuilder(portModInput.get())
-                                    .setXid(xid)
+                                    .setXid(data.getXid())
                                     .build()
                     )
                     .build();
@@ -198,10 +197,6 @@ public class BundleAddMessageConverter implements
         }
     }
 
-    private static BigInteger digDatapathId(final NodeRef ref) {
-        return InventoryDataServiceUtil.dataPathIdFromNodeId(ref.getValue().firstKeyOf(Node.class).getId());
-    }
-
     @Override
     public ExperimenterId getExperimenterId() {
         return new ExperimenterId(OnfConstants.ONF_EXPERIMENTER_ID);
@@ -211,14 +206,4 @@ public class BundleAddMessageConverter implements
     public long getType() {
         return OnfConstants.ONF_ET_BUNDLE_ADD_MESSAGE;
     }
-
-    @Override
-    public void setXid(long xid) {
-        this.xid = xid;
-    }
-
-    @Override
-    public void setNode(NodeRef node) {
-        this.node = node;
-    }
 }
index c00adad4acb55bbfc920fa5589ac6ac1350c6b4d..6ea9f081e5afd15e7e5dd5ae2c63ba6137877e57 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.openflowplugin.extension.onf.converter;
 
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
+import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
 import org.opendaylight.openflowplugin.extension.api.path.MessagePath;
 import org.opendaylight.openflowplugin.extension.onf.OnfConstants;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
@@ -24,12 +26,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.on
  * Converter for BundleControl messages (ONF approved extension #230).
  */
 public class BundleControlConverter implements
-        ConverterMessageToOFJava<BundleControlSal, BundleControlOnf>,
+        ConverterMessageToOFJava<BundleControlSal, BundleControlOnf, ExtensionConvertorData>,
         ConvertorMessageFromOFJava<BundleControlOnf, MessagePath> {
 
     @Override
-    public BundleControlOnf
-            convert(final BundleControlSal experimenterMessageCase) {
+    public BundleControlOnf convert(final BundleControlSal experimenterMessageCase, final ExtensionConvertorData data)
+            throws ConversionException {
         return new BundleControlOnfBuilder().setOnfControlGroupingData(
                 new OnfControlGroupingDataBuilder(experimenterMessageCase.getSalControlData()).build()).build();
     }
index 3fa8ac9f9029cddd203d6559413589938ee51f0d..aadcfdce08abc14733750913c0559785da338754 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.openflowplugin.extension.onf.converter;
 
+import static org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil.extractDatapathId;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -15,6 +17,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
 import org.opendaylight.openflowplugin.extension.onf.BundleTestUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig;
@@ -69,7 +73,6 @@ public class BundleAddMessageConverterTest {
 
     @Before
     public void setUp() throws Exception {
-        converter.setNode(NODE_REF);
     }
 
     @Test
@@ -163,7 +166,9 @@ public class BundleAddMessageConverterTest {
     private void testConvert(final BundleInnerMessage message, Class clazz, final boolean withProperty)
             throws Exception {
         final BundleAddMessageSal original = createMessage(withProperty, message);
-        final BundleAddMessageOnf converted = converter.convert(original);
+        final ExtensionConvertorData data = new ExtensionConvertorData(OFConstants.OFP_VERSION_1_3);
+        data.setDatapathId(extractDatapathId(NODE_REF));
+        final BundleAddMessageOnf converted = converter.convert(original, data);
         Assert.assertEquals("Wrong BundleId", new BundleId(original.getSalAddMessageData().getBundleId().getValue()),
                 converted.getOnfAddMessageGroupingData().getBundleId());
         Assert.assertEquals("Wrong flags",
index 24d21188b96ad4492374a9e21e7f5edad4dad044..f7e68c2fb78f7041c12211da17a1266ffa3c744f 100644 (file)
@@ -47,12 +47,12 @@ public class BundleControlConverterTest {
     }
 
     @Test
-    public void testConvertDownWithProperty() {
+    public void testConvertDownWithProperty() throws Exception {
         testConvertDown(true);
     }
 
     @Test
-    public void testConvertDownWithoutProperty() {
+    public void testConvertDownWithoutProperty() throws Exception {
         testConvertDown(false);
     }
 
@@ -66,9 +66,9 @@ public class BundleControlConverterTest {
         testConvertUp(true);
     }
 
-    private void testConvertDown(final boolean withProperty) {
+    private void testConvertDown(final boolean withProperty) throws Exception {
         final BundleControlSal original = createOFPMessage(withProperty);
-        final BundleControlOnf converted = converter.convert(original);
+        final BundleControlOnf converted = converter.convert(original, null);
         testConvert(original, converted, withProperty);
     }
 
index 9be1f02f7c57b6590cfae0f30aa18d1bab53e328..fc73026c96fe4b697ea92dd13241850d7e4772c0 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
 import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
 import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
@@ -43,7 +44,7 @@ public class MultipartRequestExperimenterSerializer implements OFSerializer<Mult
         } catch (ClassCastException | IllegalStateException ex) {
             Optional
                     .ofNullable(OFSessionUtil.getExtensionConvertorProvider().<ExperimenterMessageOfChoice,
-                            ExperimenterDataOfChoice>getMessageConverter(new TypeVersionKey<>(
+                            ExperimenterDataOfChoice, ConvertorData>getMessageConverter(new TypeVersionKey<>(
                             (Class<ExperimenterMessageOfChoice>) multipartRequestExperimenter
                                     .getExperimenterMessageOfChoice().getImplementedInterface(),
                             OFConstants.OFP_VERSION_1_3)))
@@ -57,7 +58,7 @@ public class MultipartRequestExperimenterSerializer implements OFSerializer<Mult
 
                         try {
                             serializer.serialize(converter.convert(multipartRequestExperimenter
-                                    .getExperimenterMessageOfChoice()), byteBuf);
+                                    .getExperimenterMessageOfChoice(), null), byteBuf);
                         } catch (ConversionException e) {
                             throw new IllegalStateException(e);
                         }
index ddc13630d783cd70108999600c62022a181f2f80..29e59d10596477f6662dd8fb030705717eb86e3b 100644 (file)
@@ -23,6 +23,7 @@ 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.extension.api.ConverterMessageToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
@@ -67,8 +68,8 @@ public class MultiLayerExperimenterMultipartService extends AbstractExperimenter
             input.getExperimenterMessageOfChoice().getImplementedInterface(),
             getVersion());
 
-        final ConverterMessageToOFJava<ExperimenterMessageOfChoice, ExperimenterDataOfChoice> messageConverter =
-            getExtensionConverterProvider().getMessageConverter(key);
+        final ConverterMessageToOFJava<ExperimenterMessageOfChoice, ExperimenterDataOfChoice,
+            ConvertorData> messageConverter = getExtensionConverterProvider().getMessageConverter(key);
 
         if (Objects.isNull(messageConverter)) {
             throw new ServiceException(new ConverterNotFoundException(key.toString()));
@@ -82,7 +83,7 @@ public class MultiLayerExperimenterMultipartService extends AbstractExperimenter
                         .setExperimenter(messageConverter.getExperimenterId())
                         .setExpType(messageConverter.getType())
                         .setExperimenterDataOfChoice(messageConverter
-                            .convert(input.getExperimenterMessageOfChoice()))
+                            .convert(input.getExperimenterMessageOfChoice(), null))
                         .build())
                     .build())
                 .build();
index 5747461243c9225932dd1a0d350aeb8280e01fb4..dea40a78f39befd820fa30311f267de6012025a7 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService;
 import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
@@ -43,7 +43,7 @@ public final class PacketProcessingServiceImpl extends AbstractSimpleService<Tra
 
     @Override
     protected OfHeader buildRequest(final Xid xid, final TransmitPacketInput input) throws ServiceException {
-        final PacketOutConvertorData data = new PacketOutConvertorData(getVersion());
+        final XidConvertorData data = new XidConvertorData(getVersion());
         data.setDatapathId(getDatapathId());
         data.setXid(xid.getValue());
 
index 008913f8392d494bbf27a469486929752939bc99..810ab35e71920adb850bf7b95393bc8899da7cbe 100644 (file)
@@ -7,12 +7,15 @@
  */
 package org.opendaylight.openflowplugin.impl.services.sal;
 
+import static org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil.extractDatapathId;
+
 import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.openflowplugin.api.OFConstants;
 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.extension.api.BundleMessageDataInjector;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
 import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
@@ -22,22 +25,15 @@ import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSal;
 import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 
 public class SalExperimenterMessageServiceImpl extends AbstractSimpleService<SendExperimenterInput,
-        SendExperimenterOutput>
-                                               implements SalExperimenterMessageService {
+        SendExperimenterOutput> implements SalExperimenterMessageService {
 
-    private static final Logger LOG = LoggerFactory.getLogger(SalExperimenterMessageServiceImpl.class);
     private final ExtensionConverterProvider extensionConverterProvider;
 
     public SalExperimenterMessageServiceImpl(final RequestContextStack requestContextStack,
@@ -51,30 +47,21 @@ public class SalExperimenterMessageServiceImpl extends AbstractSimpleService<Sen
     protected OfHeader buildRequest(Xid xid, SendExperimenterInput input) throws ServiceException {
         final TypeVersionKey key =
                 new TypeVersionKey(input.getExperimenterMessageOfChoice().getImplementedInterface(), getVersion());
-        final ConverterMessageToOFJava<ExperimenterMessageOfChoice, ExperimenterDataOfChoice> messageConverter =
-                extensionConverterProvider.getMessageConverter(key);
+        final ConverterMessageToOFJava<ExperimenterMessageOfChoice, ExperimenterDataOfChoice,
+            ExtensionConvertorData> messageConverter = extensionConverterProvider.getMessageConverter(key);
 
         if (messageConverter == null) {
             throw new ServiceException(new ConverterNotFoundException(key.toString()));
         }
-
         final ExperimenterInputBuilder experimenterInputBld;
-
-        if (messageConverter instanceof BundleMessageDataInjector) {
-            ((BundleMessageDataInjector) messageConverter).setNode(input.getNode());
-            ((BundleMessageDataInjector) messageConverter).setXid(xid.getValue());
-            LOG.trace("Flow or group pushed to the node: {} with transaction id : {} is {}",
-                    ((BundleAddMessageSal) input.getExperimenterMessageOfChoice())
-                            .getSalAddMessageData().getBundleInnerMessage(),
-                    input.getNode().getValue().firstKeyOf(Node.class).getId(),
-                    xid);
-        }
-
         try {
+            final ExtensionConvertorData data = new ExtensionConvertorData(OFConstants.OFP_VERSION_1_3);
+            data.setXid(xid.getValue());
+            data.setDatapathId(extractDatapathId(input.getNode()));
             experimenterInputBld = new ExperimenterInputBuilder()
                     .setExperimenter(messageConverter.getExperimenterId())
                     .setExpType(messageConverter.getType())
-                    .setExperimenterDataOfChoice(messageConverter.convert(input.getExperimenterMessageOfChoice()))
+                    .setExperimenterDataOfChoice(messageConverter.convert(input.getExperimenterMessageOfChoice(), data))
                     .setVersion(getVersion())
                     .setXid(xid.getValue());
         } catch (ConversionException e) {
index 71d3b210627da3843781f620bb817abdb7f0efb6..3a489cb17a30097d907a65683fa2796889a48a72 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.openflowplugin.api.openflow.device.Xid;
 import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector;
 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
 import org.opendaylight.openflowplugin.impl.device.DeviceContextImpl;
@@ -56,7 +57,7 @@ public abstract class ServiceMocking {
     protected static final Xid DUMMY_XID = new Xid(DUMMY_XID_VALUE);
     protected static final long DUMMY_EXPERIMENTER_ID = 42L;
 
-    protected static final String DUMMY_NODE_ID = "dummyNodeID";
+    protected static final String DUMMY_NODE_ID = "444";
     protected static final KeyedInstanceIdentifier<Node, NodeKey> DUMMY_NODE_II = InstanceIdentifier
             .create(Nodes.class)
             .child(Node.class, new NodeKey(new NodeId(DUMMY_NODE_ID)));
@@ -90,7 +91,8 @@ public abstract class ServiceMocking {
     @Mock
     protected ExtensionConverterProvider mockedExtensionConverterProvider;
     @Mock
-    protected ConverterMessageToOFJava<ExperimenterMessageOfChoice, DataContainer> mockedExtensionConverter;
+    protected ConverterMessageToOFJava<ExperimenterMessageOfChoice, DataContainer,
+        ConvertorData> mockedExtensionConverter;
 
     @Before
     @SuppressWarnings("unchecked")
index f17e82a5498933f533ebca01df8645c95f0d9c45..866cc862db70907a740a248fe4037e1dff018ab9 100644 (file)
@@ -18,6 +18,7 @@ import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
 import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
@@ -63,7 +64,6 @@ public class SalExperimenterMessageServiceImplTest extends ServiceMocking {
     @Test
     public void testBuildRequest() throws Exception {
         SendExperimenterInput sendExperimenterInput = buildSendExperimenterInput();
-
         final OfHeader request =
                 salExperimenterMessageService.buildRequest(new Xid(DUMMY_XID_VALUE), sendExperimenterInput);
         assertEquals(DUMMY_XID_VALUE, request.getXid());
@@ -71,8 +71,8 @@ public class SalExperimenterMessageServiceImplTest extends ServiceMocking {
         final ExperimenterInput input = (ExperimenterInput) request;
         assertEquals(43L, input.getExperimenter().getValue().longValue());
         assertEquals(44L, input.getExpType().longValue());
-
-        Mockito.verify(extensionConverter).convert(sendExperimenterInput.getExperimenterMessageOfChoice());
+        Mockito.verify(extensionConverter).convert(Matchers.eq(sendExperimenterInput.getExperimenterMessageOfChoice()),
+                Matchers.any(ExtensionConvertorData.class));
     }
 
     private SendExperimenterInput buildSendExperimenterInput() {
index 19d61e0dbca3885dfe81e1431d5212e5fac9b3bf..88c907635bc055d0467ea2d16278bdbb014f7daf 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
@@ -52,7 +53,7 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager
             ? extends DataContainer>> registryActionToOFJAva;
     private final Map<MessageTypeKey<?>, ConvertorActionFromOFJava<?, ?>> registryActionFromOFJAva;
     private final Map<TypeVersionKey<?>, ConverterMessageToOFJava<? extends ExperimenterMessageOfChoice,
-            ? extends DataContainer>> registryMessageToOFJAva;
+            ? extends DataContainer, ? extends ConvertorData>> registryMessageToOFJAva;
     private final Map<MessageTypeKey<?>, ConvertorMessageFromOFJava<? extends ExperimenterDataOfChoice, MessagePath>>
             registryMessageFromOFJAva;
 
@@ -142,9 +143,10 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager
      * @param extConvertor extension convertor
      * @return registration closure
      */
-    private <T extends DataContainer, K extends ExperimenterMessageOfChoice> RegistrationCloserMessageToOFJava<T, K>
-            hireMessageJanitor(final TypeVersionKey<K> key, final ConverterMessageToOFJava<K, T> extConvertor) {
-        RegistrationCloserMessageToOFJava<T, K> janitor = new RegistrationCloserMessageToOFJava<>();
+    private <T extends DataContainer, K extends ExperimenterMessageOfChoice,
+        D extends ConvertorData> RegistrationCloserMessageToOFJava<T, K,
+        D> hireMessageJanitor(final TypeVersionKey<K> key, final ConverterMessageToOFJava<K, T, D> extConvertor) {
+        RegistrationCloserMessageToOFJava<T, K, D> janitor = new RegistrationCloserMessageToOFJava<>();
         janitor.setConverter(extConvertor);
         janitor.setKey(key);
         janitor.setRegistrator(this);
@@ -239,8 +241,8 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager
      * @param key message key
      * @param converter extension convertor
      */
-    public void unregister(final TypeVersionKey<?> key, final ConverterMessageToOFJava<?, ?> converter) {
-        ConverterMessageToOFJava<?, ?> registeredConverter = registryMessageToOFJAva.get(key);
+    public void unregister(final TypeVersionKey<?> key, final ConverterMessageToOFJava<?, ?, ?> converter) {
+        ConverterMessageToOFJava<?, ?, ?> registeredConverter = registryMessageToOFJAva.get(key);
         if (registeredConverter != null && registeredConverter == converter) {
             registryMessageToOFJAva.remove(key);
         }
@@ -309,9 +311,9 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager
     }
 
     @Override
-    public <I extends ExperimenterMessageOfChoice, O extends DataContainer>
-            ObjectRegistration<ConverterMessageToOFJava<I, O>> registerMessageConvertor(
-                TypeVersionKey<I> key, ConverterMessageToOFJava<I, O> convertor) {
+    public <I extends ExperimenterMessageOfChoice, O extends DataContainer, D extends ConvertorData>
+            ObjectRegistration<ConverterMessageToOFJava<I, O, D>> registerMessageConvertor(
+                TypeVersionKey<I> key, ConverterMessageToOFJava<I, O, D> convertor) {
         registryMessageToOFJAva.put(key, convertor);
         return hireMessageJanitor(key, convertor);
     }
@@ -324,9 +326,9 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager
     }
 
     @Override
-    public <F extends ExperimenterMessageOfChoice, T extends DataContainer> ConverterMessageToOFJava<F, T>
-            getMessageConverter(TypeVersionKey<F> key) {
-        return (ConverterMessageToOFJava<F, T>) registryMessageToOFJAva.get(key);
+    public <F extends ExperimenterMessageOfChoice, T extends DataContainer,
+        D extends ConvertorData> ConverterMessageToOFJava<F, T, D> getMessageConverter(TypeVersionKey<F> key) {
+        return (ConverterMessageToOFJava<F, T, D>) registryMessageToOFJAva.get(key);
     }
 
     @Override
index 8bd6975333b59db1228f5febf1083220c806a7c5..a320993aa4bd70f71775540ef1c83372466b7572 100644 (file)
@@ -12,6 +12,7 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorData;
 import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
@@ -151,8 +152,8 @@ public abstract class RegistrationCloser<K, C> implements ObjectRegistration<C>
      * @param <T> target type of wrapped convertor
      */
     public static class RegistrationCloserMessageToOFJava<T extends DataContainer,
-            K extends ExperimenterMessageOfChoice>
-                extends RegistrationCloser<TypeVersionKey<K>, ConverterMessageToOFJava<K, T>> {
+            K extends ExperimenterMessageOfChoice, D extends ConvertorData>
+                extends RegistrationCloser<TypeVersionKey<K>, ConverterMessageToOFJava<K, T, D>> {
 
         @Override
         public void close() {
index 0965f6159881bbf5ad311c0032beb379530258b9..ce2640231b68f55e80fd87d4e0b42e7903f10c60 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
@@ -44,14 +44,14 @@ import org.slf4j.LoggerFactory;
  * Example usage:
  * <pre>
  * {@code
- * PacketOutConvertorData data = new PacketOutConvertorData(version);
+ * XidConvertorData data = new XidConvertorData(version);
  * data.setDatapathId(datapathId);
  * data.setXid(xid);
  * Optional<PacketOutInput> ofPacketInput = convertorManager.convert(salPacket, data);
  * }
  * </pre>
  */
-public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOutInput, PacketOutConvertorData> {
+public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOutInput, XidConvertorData> {
     private static final Logger LOG = LoggerFactory.getLogger(PacketOutConvertor.class);
     private static final Set<Class<?>> TYPES = Collections.singleton(TransmitPacketInput.class);
 
@@ -84,7 +84,7 @@ public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOut
     }
 
     @Override
-    public PacketOutInput convert(TransmitPacketInput source, PacketOutConvertorData data) {
+    public PacketOutInput convert(TransmitPacketInput source, XidConvertorData data) {
         LOG.trace("toPacketOutInput for datapathId:{}, xid:{}", data.getDatapathId(), data.getXid());
         // Build Port ID from TransmitPacketInput.Ingress
         PortNumber inPortNr;
@@ -9,18 +9,17 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data;
 
 /**
- * Convertor data used in {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor}
- * containing Openflow version and XID.
+ * Convertor data used in containing Openflow version and XID.
  */
-public class PacketOutConvertorData extends VersionDatapathIdConvertorData {
+public class XidConvertorData extends VersionDatapathIdConvertorData {
     private Long xid;
 
     /**
-     * Instantiates a new Packet out convertor data.
+     * Instantiates a new Xid convertor data.
      *
      * @param version the version
      */
-    public PacketOutConvertorData(short version) {
+    public XidConvertorData(short version) {
         super(version);
     }
 
index 18a17a09a8852b0f305630f57208e690a8414c06..4b834db095ef83e54c2d6f3c5f1607f8a7ee5dd7 100644 (file)
@@ -159,4 +159,8 @@ public abstract class InventoryDataServiceUtil {
     public static String bigIntegerToPaddedHex(final BigInteger dataPathId) {
         return StringUtils.leftPad(dataPathId.toString(16), 16, "0");
     }
+
+    public static BigInteger extractDatapathId(final NodeRef ref) {
+        return InventoryDataServiceUtil.dataPathIdFromNodeId(ref.getValue().firstKeyOf(Node.class).getId());
+    }
 }
index 416ce84673760cff8d33c42a42242cb9f14eeffb..bdfa74df2048d59e03951f83509eaaaa7601b01c 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
@@ -59,7 +59,8 @@ public class PacketOutConvertorTest {
     }
 
     /**
-     * Test for {@link PacketOutConvertor} with null parameters.
+     * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor}
+     *  with null parameters.
      */
     @Test
     public void toPacketOutInputAllParmNullTest() {
@@ -88,7 +89,7 @@ public class PacketOutConvertorTest {
 
         Short version = (short) 0x04;
         Long xid = null;
-        PacketOutConvertorData data = new PacketOutConvertorData(version);
+        XidConvertorData data = new XidConvertorData(version);
         PacketOutInput message = convert(transmitPacketInput, data);
 
         //FIXME : this has to be fixed along with actions changed in openflowjava
@@ -103,7 +104,7 @@ public class PacketOutConvertorTest {
     }
 
     /**
-     * Test for PacketOutConvertor.
+     * Test for XidConvertorData.
      */
     @Test
     public void toPacketOutInputAllParmTest() {
@@ -166,7 +167,7 @@ public class PacketOutConvertorTest {
         BigInteger datapathId = new BigInteger(1, datapathIdByte);
         Long xid = 0xfffffL;
 
-        PacketOutConvertorData data = new PacketOutConvertorData(version);
+        XidConvertorData data = new XidConvertorData(version);
         data.setXid(xid);
         data.setDatapathId(datapathId);
         PacketOutInput message = convert(transmitPacketInput, data);
@@ -243,7 +244,7 @@ public class PacketOutConvertorTest {
         return new NodeRef(path);
     }
 
-    private PacketOutInput convert(TransmitPacketInput transmitPacketInput, PacketOutConvertorData data) {
+    private PacketOutInput convert(TransmitPacketInput transmitPacketInput, XidConvertorData data) {
         Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);
         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));
     }