Bug-4866 - [Clustering]: Switch state resync is not 07/34207/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Fri, 5 Feb 2016 04:50:18 +0000 (20:50 -0800)
committerAnil Vishnoi <vishnoianil@gmail.com>
Sat, 6 Feb 2016 05:46:44 +0000 (05:46 +0000)
happening after controller restart [Routed RPC issue]

Change-Id: I6ca6b8c2a4a38b908571300eab0fda3cda078af7
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
15 files changed:
applications/forwardingrules-manager-config/src/main/resources/initial/30-forwardingrules-manager.xml
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/config/yang/forwardingrules_manager/ForwardingRulesManagerModule.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/FlowNodeReconciliation.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesCommiter.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeReconciliationImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java
applications/forwardingrules-manager/src/main/yang/forwarding-manager.yang
applications/forwardingrules-manager/src/test/java/test/mock/FlowListenerTest.java
applications/forwardingrules-manager/src/test/java/test/mock/GroupListenerTest.java
applications/forwardingrules-manager/src/test/java/test/mock/MeterListenerTest.java
applications/forwardingrules-manager/src/test/java/test/mock/NodeListenerTest.java
applications/forwardingrules-manager/src/test/java/test/mock/TableFeaturesListenerTest.java
applications/forwardingrules-manager/src/test/java/test/mock/util/EntityOwnershipServiceMock.java [new file with mode: 0644]

index 3dbae91e5af0041af6e9c3f26e2d5ebde6275b47..90894b15d18c4c584792d5dbe33420766a2d5adb 100644 (file)
                     <forwarding-manager-settings>
                         <stale-marking-enabled>false</stale-marking-enabled>
                     </forwarding-manager-settings>
+                    <entity-ownership-service>
+                        <type xmlns:entity-ownership="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">entity-ownership:entity-ownership-service</type>
+                        <name>entity-ownership-service</name>
+                    </entity-ownership-service>
                 </module>
             </modules>
         </data>
@@ -60,6 +64,9 @@
         <capability>
             urn:opendaylight:table:service?module=sal-table&amp;revision=2013-10-26
         </capability>
+        <capability>
+            urn:opendaylight:params:xml:ns:yang:controller:config:distributed-entity-ownership-service?module=distributed-entity-ownership-service&amp;revision=2015-08-10
+        </capability>
     </required-capabilities>
 
 </snapshot>
index c8ebd1e887aad83627c9d84634fd9e36034058b3..8d9b1a2ef0ff157902a6142cfb684cbc488500a5 100644 (file)
@@ -36,7 +36,7 @@ public class ForwardingRulesManagerModule extends org.opendaylight.openflowplugi
         LOG.info("FRM module initialization.");
         final ForwardingRulesManagerConfig config = readConfig();
         final ForwardingRulesManagerImpl forwardingrulessManagerProvider =
-                new ForwardingRulesManagerImpl(getDataBrokerDependency(), getRpcRegistryDependency(), config);
+                new ForwardingRulesManagerImpl(getDataBrokerDependency(), getRpcRegistryDependency(), config, getEntityOwnershipServiceDependency());
         forwardingrulessManagerProvider.start();
         LOG.info("FRM module started successfully.");
         return new AutoCloseable() {
index 4b762c1a7ffc58706612e014e01b50ab9c208e8c..5e891b1721188c1eaf69e75ba80f396e48bcd53c 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.openflowplugin.applications.frm;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -34,7 +35,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  *
  * Created: Aug 26, 2014
  */
-public interface FlowNodeReconciliation extends DataChangeListener, AutoCloseable {
+public interface FlowNodeReconciliation extends ClusteredDataChangeListener, AutoCloseable {
 
     /**
      * Method contains Node registration to {@link ForwardingRulesManager} functionality
index 9bce7e2000adda5cff596fa4982847fe29c2f5b7..d5a11eedf90db4fb07779d8a6d04d11cc154adf0 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.openflowplugin.applications.frm;
 
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -29,7 +29,7 @@ import java.util.concurrent.Future;
  *
  * Created: Aug 25, 2014
  */
-public interface ForwardingRulesCommiter <D extends DataObject> extends AutoCloseable, DataTreeChangeListener<D> {
+public interface ForwardingRulesCommiter <D extends DataObject> extends AutoCloseable, ClusteredDataTreeChangeListener<D> {
 
     /**
      * Method removes DataObject which is identified by InstanceIdentifier
index 81cc3f5b60da96684af320982a5d39ae159b0227..d76dc97be9e04a4ebfde5c7449101d9aa310d903 100644 (file)
@@ -154,5 +154,12 @@ public interface ForwardingRulesManager extends AutoCloseable {
      */
     public ForwardingRulesManagerConfig getConfiguration();
 
+    /**
+     * Method checks if *this* instance of openflowplugin is owner of
+     * the given openflow node.
+     * @return True if owner, else false
+     */
+    public boolean isNodeOwner(InstanceIdentifier<FlowCapableNode> ident);
+
 }
 
index 3cc3bed6e79be1e387918a58f4e7ac9ac513d46b..2fa433f0ca7bf51cb898f57fb5ee00a4004b2beb 100644 (file)
@@ -109,6 +109,8 @@ public abstract class AbstractListeningCommiter <T extends DataObject> implement
         // node from operational data store and if it's present it calls flowNodeConnected to explictly
         // trigger the event of new node connected.
 
+        if(!provider.isNodeOwner(nodeIdent)) { return false; }
+
         if (!provider.isNodeActive(nodeIdent)) {
             if (provider.checkNodeInOperationalDataStore(nodeIdent)) {
                 provider.getFlowNodeReconciliation().flowNodeConnected(nodeIdent);
index afa9c35573ba280f711ed09e5cad130b8bbd6f58..ac4ca0b240040c992006bd60815f462f8d7e452f 100644 (file)
@@ -157,6 +157,9 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
     public void flowNodeConnected(InstanceIdentifier<FlowCapableNode> connectedNode) {
         if ( ! provider.isNodeActive(connectedNode)) {
             provider.registrateNewNode(connectedNode);
+
+            if(!provider.isNodeOwner(connectedNode)) { return; }
+
             if (provider.getConfiguration().isStaleMarkingEnabled()) {
                 LOG.info("Stale-Marking is ENABLED and proceeding with deletion of stale-marked entities on switch {}",
                         connectedNode.toString());
index 0d83de55baf18be8c0049b39b3b9bdb8b217f22d..198ff12a7a4160795728cd2dd065b026d6033dba 100644 (file)
@@ -18,6 +18,9 @@ import java.util.concurrent.atomic.AtomicLong;
 import com.google.common.util.concurrent.CheckedFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
@@ -30,6 +33,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
@@ -72,12 +76,15 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
     private FlowNodeReconciliation nodeListener;
 
     private final ForwardingRulesManagerConfig forwardingRulesManagerConfig;
+    private final EntityOwnershipService entityOwnershipService;
 
     public ForwardingRulesManagerImpl(final DataBroker dataBroker,
                                       final RpcConsumerRegistry rpcRegistry,
-                                      final ForwardingRulesManagerConfig config) {
+                                      final ForwardingRulesManagerConfig config,
+                                      final EntityOwnershipService eos) {
         this.dataService = Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
         this.forwardingRulesManagerConfig = Preconditions.checkNotNull(config, "Configuration for FRM cannot be null");
+        this.entityOwnershipService = Preconditions.checkNotNull(eos, "EntityOwnership service can not be null");
 
         Preconditions.checkArgument(rpcRegistry != null, "RpcConsumerRegistry can not be null !");
 
@@ -244,5 +251,16 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
     public ForwardingRulesManagerConfig getConfiguration() {
         return forwardingRulesManagerConfig;
     }
+
+    @Override
+    public boolean isNodeOwner(InstanceIdentifier<FlowCapableNode> ident) {
+        NodeId nodeId = ident.firstKeyOf(Node.class).getId();
+        Entity entity = new Entity("openflow", nodeId.getValue());
+        Optional<EntityOwnershipState> eState = this.entityOwnershipService.getOwnershipState(entity);
+        if(eState.isPresent()) {
+            return eState.get().isOwner();
+        }
+        return false;
+    }
 }
 
index aab257666427a3f168bda8f6d28f42986f8b3e5f..e6bf78ed74056bbe64b7246faa6268b37ede2b0a 100644 (file)
@@ -6,6 +6,7 @@ module forwardingrules-manager {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+    import opendaylight-entity-ownership-service { prefix eos; }
 
     description
         "This module contains the base YANG definitions for
@@ -50,6 +51,15 @@ module forwardingrules-manager {
 
             }
 
+            container entity-ownership-service {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                            config:required-identity eos:entity-ownership-service;
+                    }
+                }
+            }
+
         }
     }
 
index 7f20dd78a9593f31a9608d7a1e5718d33568a356..44cc0055163a93ef8545c883348d997011c71fa1 100644 (file)
@@ -9,6 +9,7 @@ package test.mock;
 
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerConfig;
@@ -33,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
+import test.mock.util.EntityOwnershipServiceMock;
 import test.mock.util.FRMTest;
 import test.mock.util.RpcProviderRegistryMock;
 import test.mock.util.SalFlowServiceMock;
@@ -44,6 +46,8 @@ import static org.junit.Assert.assertEquals;
 
 public class FlowListenerTest extends FRMTest {
     RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+    EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
     NodeKey s1Key = new NodeKey(new NodeId("S1"));
     TableKey tableKey = new TableKey((short) 2);
 
@@ -52,7 +56,8 @@ public class FlowListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(),
+                eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -96,7 +101,8 @@ public class FlowListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(),
+                eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -141,7 +147,8 @@ public class FlowListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(),
+                eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -188,7 +195,8 @@ public class FlowListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(),
+                eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
index 8b1a92623c87442b3a0647bba4109888abc3781e..9e9dff9121b1f777c6989a63415c60b94f97bd4b 100644 (file)
@@ -9,6 +9,7 @@ package test.mock;
 
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
@@ -24,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
+import test.mock.util.EntityOwnershipServiceMock;
 import test.mock.util.FRMTest;
 import test.mock.util.RpcProviderRegistryMock;
 import test.mock.util.SalGroupServiceMock;
@@ -34,12 +36,14 @@ import static org.junit.Assert.assertEquals;
 
 public class GroupListenerTest extends FRMTest {
     RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+    EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
     NodeKey s1Key = new NodeKey(new NodeId("S1"));
 
     @Test
     public void addTwoGroupsTest() throws Exception {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(getDataBroker(), rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -77,7 +81,7 @@ public class GroupListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -112,7 +116,7 @@ public class GroupListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
index 1acc15c2dcef69cae71f377b5070c90d4d58ec8f..457c5dd3c96c019dadc6bc647ece3443cb379e32 100644 (file)
@@ -9,6 +9,7 @@ package test.mock;
 
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
@@ -24,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Upd
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
+import test.mock.util.EntityOwnershipServiceMock;
 import test.mock.util.FRMTest;
 import test.mock.util.RpcProviderRegistryMock;
 import test.mock.util.SalMeterServiceMock;
@@ -34,6 +36,8 @@ import static org.junit.Assert.assertEquals;
 
 public class MeterListenerTest extends FRMTest {
     RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+    EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
     NodeKey s1Key = new NodeKey(new NodeId("S1"));
 
     @Test
@@ -41,7 +45,7 @@ public class MeterListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -80,7 +84,7 @@ public class MeterListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
@@ -116,7 +120,7 @@ public class MeterListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(), eos);
         forwardingRulesManager.start();
 
         addFlowCapableNode(s1Key);
index 5ee4b07290fff5fb3eaf11c7f3dc4c7d02ca21e8..d2c153c62ea1a75c7e41e3ce269af8ccba597c1f 100644 (file)
@@ -10,6 +10,7 @@ package test.mock;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -18,12 +19,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import test.mock.util.EntityOwnershipServiceMock;
 import test.mock.util.FRMTest;
 import test.mock.util.RpcProviderRegistryMock;
 
 public class NodeListenerTest extends FRMTest {
 
     RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+    EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
     NodeKey s1Key = new NodeKey(new NodeId("S1"));
 
     @Test
@@ -31,7 +35,8 @@ public class NodeListenerTest extends FRMTest {
         try (ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig())) {
+                getConfig(),
+                eos)) {
             forwardingRulesManager.start();
 
             addFlowCapableNode(s1Key);
index 48c79be4cb77274775c46e15b876222a3b901798..c90d3507bde6a7f0c9453325f3848248d54275ef 100644 (file)
@@ -7,9 +7,11 @@
  */
 package test.mock;
 
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
+import test.mock.util.EntityOwnershipServiceMock;
 import test.mock.util.SalTableServiceMock;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
@@ -33,6 +35,8 @@ import static org.junit.Assert.assertEquals;
 
 public class TableFeaturesListenerTest extends FRMTest {
     RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+    EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
 
     @Test
     public void updateFlowTest() throws Exception {
@@ -42,7 +46,8 @@ public class TableFeaturesListenerTest extends FRMTest {
         ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
                 getDataBroker(),
                 rpcProviderRegistryMock,
-                getConfig());
+                getConfig(),
+                eos);
         forwardingRulesManager.start();
 
         addTable(tableKey, s1Key);
diff --git a/applications/forwardingrules-manager/src/test/java/test/mock/util/EntityOwnershipServiceMock.java b/applications/forwardingrules-manager/src/test/java/test/mock/util/EntityOwnershipServiceMock.java
new file mode 100644 (file)
index 0000000..6df960f
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016 Brocade Communications 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 test.mock.util;
+
+import com.google.common.base.Optional;
+import org.opendaylight.controller.md.sal.common.api.clustering.*;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Created by vishnoianil on 2/4/16.
+ */
+public class EntityOwnershipServiceMock implements EntityOwnershipService {
+    @Override
+    public EntityOwnershipCandidateRegistration registerCandidate(@Nonnull Entity entity) throws CandidateAlreadyRegisteredException {
+        return null;
+    }
+
+    @Override
+    public EntityOwnershipListenerRegistration registerListener(@Nonnull String entityType, @Nonnull EntityOwnershipListener listener) {
+        return null;
+    }
+
+    @Override
+    public Optional<EntityOwnershipState> getOwnershipState(@Nonnull Entity forEntity) {
+        return Optional.of(new EntityOwnershipState(true, true));
+    }
+
+    @Override
+    public boolean isCandidateRegistered(@Nonnull Entity entity) {
+        return false;
+    }
+}