From: Flavio Fernandes Date: Thu, 6 Nov 2014 13:22:04 +0000 (-0500) Subject: Bug 2021 - Continuous WARN log nodeConnector creation failed at node: OF|00:00:xx... X-Git-Tag: release/lithium~882^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=6b920a7a93413ad391de07ca443b868c881a459c Bug 2021 - Continuous WARN log nodeConnector creation failed at node: OF|00:00:xx:xx:xx:xx:xx:xx This fixes the bug in ToSalConversionsUtils.actionFrom() that mistakenly passed an AD-SAL-style NodeID to a conversion utility (fromNodeConnectorRef) that was expecting a MD-SAL-style NodeID. Patch 8: Add unit test to exercise code path that exposes the issue Change-Id: Icc107bd785d6558a3351f139c1b13b8737b56ae7 Signed-off-by: Flavio Fernandes Signed-off-by: Colin Dixon --- diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java index dcc1a4660b..99e5a80a82 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java @@ -52,6 +52,7 @@ import org.opendaylight.controller.sal.action.SetVlanPcp; import org.opendaylight.controller.sal.action.SwPath; import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Node; +import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; @@ -207,10 +208,16 @@ public class ToSalConversionsUtils { Uri nodeConnector = ((OutputActionCase) sourceAction).getOutputAction().getOutputNodeConnector(); if (nodeConnector != null) { - //for (Uri uri : nodeConnectors) { - Uri fullNodeConnector = new Uri(node.getType()+":"+node.getID()+":"+nodeConnector.getValue()); + // TODO: We should really have a bi-directional map from AD-SAL node types to + // MD-SAL node types, but lets fix that later. + String type = node.getType(); + if( type.equals(NodeIDType.OPENFLOW) ){ + type = NodeMapping.OPENFLOW_ID_PREFIX; + }else{ + type = type + ":"; + } + Uri fullNodeConnector = new Uri(type+node.getID()+":"+nodeConnector.getValue()); targetAction.add(new Output(fromNodeConnectorRef(fullNodeConnector, node))); - //} } } else if (sourceAction instanceof PopMplsActionCase) { // TODO: define maping diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java index 54ffddbbe3..7c20c24bec 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.sal.compatibility.test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.CRUDP; import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.ETHERNET_ARP; @@ -199,6 +200,29 @@ public class TestToSalConversionsUtils { assertEquals("OF|1@OF|00:00:00:00:00:00:00:2a", nodeConnector.toString()); } + @Test + public void testActionFrom() throws ConstructionException { + // Bug 2021: Convert AD-SAL notation into MD-SAL notation before calling NodeConnector + Node node = new Node(NodeIDType.OPENFLOW, 42L); + List odActions = new ArrayList<>(); + + OutputActionBuilder outputActionBuilder = new OutputActionBuilder(); + outputActionBuilder.setOutputNodeConnector(new Uri("CONTROLLER")); + OutputActionCaseBuilder outputActionCaseBuilder = new OutputActionCaseBuilder(); + outputActionCaseBuilder.setOutputAction(outputActionBuilder.build()); + odActions.add(new ActionBuilder().setAction(outputActionCaseBuilder.build()).build()); + + List targetAction = + ToSalConversionsUtils.actionFrom(odActions, node); + assertNotNull(targetAction); + assertTrue( Output.class.isInstance(targetAction.get(0)) ); + Output targetActionOutput = (Output) targetAction.get(0); + NodeConnector port = targetActionOutput.getPort(); + assertNotNull(port); + assertEquals(port.getType(), NodeConnectorIDType.CONTROLLER); + assertEquals(port.getID(), org.opendaylight.controller.sal.core.NodeConnector.SPECIALNODECONNECTORID); + } + private void checkSalMatch(org.opendaylight.controller.sal.match.Match match, MtchType mt) throws ConstructionException { switch (mt) { case other: