From: Shigeru Yasuda Date: Wed, 12 Nov 2014 15:23:08 +0000 (+0900) Subject: Bug 2368: MD-SAL FRM may update/remove unexpected flow entries. X-Git-Tag: release/lithium~879 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=41d00971714a0e52d37c67734a22068103244224 Bug 2368: MD-SAL FRM may update/remove unexpected flow entries. FRM should always set strict flag into update-flow/remove-flow RPC input. Change-Id: I6027442b56f4cd93cfc3f954dc8501bb57e2d64a Signed-off-by: Shigeru Yasuda --- diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java index 698dbcb0d1..0d973d6f3b 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java @@ -1,4 +1,4 @@ -/**ab +/** * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -99,7 +99,13 @@ public class FlowForwarder extends AbstractListeningCommiter { builder.setFlowRef(new FlowRef(identifier)); builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class))); builder.setFlowTable(new FlowTableRef(nodeIdent.child(Table.class, tableKey))); - builder.setTransactionUri(new Uri(provider.getNewTransactionId())); + + // This method is called only when a given flow object has been + // removed from datastore. So FRM always needs to set strict flag + // into remove-flow input so that only a flow entry associated with + // a given flow object is removed. + builder.setTransactionUri(new Uri(provider.getNewTransactionId())). + setStrict(Boolean.TRUE); provider.getSalFlowService().removeFlow(builder.build()); } } @@ -116,8 +122,13 @@ public class FlowForwarder extends AbstractListeningCommiter { builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class))); builder.setFlowRef(new FlowRef(identifier)); builder.setTransactionUri(new Uri(provider.getNewTransactionId())); - builder.setUpdatedFlow((new UpdatedFlowBuilder(update)).build()); - builder.setOriginalFlow((new OriginalFlowBuilder(original)).build()); + + // This method is called only when a given flow object in datastore + // has been updated. So FRM always needs to set strict flag into + // update-flow input so that only a flow entry associated with + // a given flow object is updated. + builder.setUpdatedFlow((new UpdatedFlowBuilder(update)).setStrict(Boolean.TRUE).build()); + builder.setOriginalFlow((new OriginalFlowBuilder(original)).setStrict(Boolean.TRUE).build()); provider.getSalFlowService().updateFlow(builder.build()); } diff --git a/opendaylight/md-sal/forwardingrules-manager/src/test/java/test/mock/FlowListenerTest.java b/opendaylight/md-sal/forwardingrules-manager/src/test/java/test/mock/FlowListenerTest.java index 85f4b14472..91904cf8e9 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/test/java/test/mock/FlowListenerTest.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/test/java/test/mock/FlowListenerTest.java @@ -124,6 +124,8 @@ public class FlowListenerTest extends FRMTest { assertEquals(1, updateFlowCalls.size()); assertEquals("DOM-1", updateFlowCalls.get(0).getTransactionUri().getValue()); assertEquals(flowII, updateFlowCalls.get(0).getFlowRef().getValue()); + assertEquals(Boolean.TRUE, updateFlowCalls.get(0).getOriginalFlow().isStrict()); + assertEquals(Boolean.TRUE, updateFlowCalls.get(0).getUpdatedFlow().isStrict()); forwardingRulesManager.close(); } @@ -204,6 +206,7 @@ public class FlowListenerTest extends FRMTest { assertEquals(1, removeFlowCalls.size()); assertEquals("DOM-1", removeFlowCalls.get(0).getTransactionUri().getValue()); assertEquals(flowII, removeFlowCalls.get(0).getFlowRef().getValue()); + assertEquals(Boolean.TRUE, removeFlowCalls.get(0).isStrict()); forwardingRulesManager.close(); }