Shard Status logic in genius 96/89996/15
authorEdw7n <n.edwin.anthony@ericsson.com>
Tue, 23 Apr 2019 11:22:59 +0000 (16:52 +0530)
committerAnkit Jain <ankit.j.jain@ericsson.com>
Mon, 27 Jul 2020 07:43:16 +0000 (13:13 +0530)
- idmanager mbean waits on shards specified in network constants
- this reference will be available to others only when shard leader
  election is done
- any mbean which reads/writes to the data store would have to wait
- ItmProvider and Ifmprovider already wait on idmanager, hence not
  included
- other mbeans which are directly or inderectly on such providers/mbeans
  do not need idmanager reference explicitly

Change-Id: Ia1c77ebcc978da51a3897e0741ea7570937d16a4
Signed-off-by: Edw7n <n.edwin.anthony@ericsson.com>
Signed-off-by: Faseela K <faseela.k@ericsson.com>
14 files changed:
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java
idmanager/idmanager-impl/src/test/java/org/opendaylight/genius/idmanager/test/IdManagerTestModule.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/listeners/FlowBasedServicesInterfaceStateListener.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/listeners/FlowBasedServicesNodeStateListener.java
interfacemanager/interfacemanager-impl/src/test/java/org/opendaylight/genius/interfacemanager/test/InterfaceManagerTestModule.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/listeners/OvsdbNodeListener.java
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/tests/ItmTestModule.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/NwConstants.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/interfaces/ShardStatusMonitor.java [new file with mode: 0644]
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/ShardStatusMonitorImpl.java [new file with mode: 0644]
mdsalutil/mdsalutil-impl/src/main/resources/OSGI-INF/blueprint/mdsalutil.xml
mdsalutil/mdsalutil-testutils/pom.xml
mdsalutil/mdsalutil-testutils/src/main/java/org/opendaylight/genius/mdsalutil/testutils/TestShardStatusMonitor.java [new file with mode: 0644]
networkutils/networkutils/src/test/java/org/opendaylight/genius/networkutils/test/NetworkUtilTestModule.java

index 9c43f90eefeefa81e1e3bad3dc42fe984c23fa1e..cc2de9953d0569eb14abf66193a5c0df503ec221 100644 (file)
@@ -53,6 +53,8 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -112,7 +114,8 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
 
     @Inject
     public IdManager(DataBroker db, LockManagerService lockManager, IdUtils idUtils,
-                     @Reference DataImportBootReady dataImportBootReady, @Reference JobCoordinator jobCoordinator)
+                     @Reference DataImportBootReady dataImportBootReady,
+                     @Reference JobCoordinator jobCoordinator, @Reference ShardStatusMonitor shardStatusMonitor)
                     throws ReadFailedException, InterruptedException {
         this.broker = db;
         this.txRunner = new ManagedNewTransactionRunnerImpl(db);
@@ -130,7 +133,28 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         // it appears to be (is) un-used from a Java code PoV!
 
         this.localPool = new ConcurrentHashMap<>();
-        populateCache();
+        boolean isDatastoreAvailable = false;
+        int retryCount = 0;
+        int totalRetry = 1000;
+        try {
+            while (retryCount < totalRetry) {
+                isDatastoreAvailable = shardStatusMonitor.getShardStatus(NwConstants.IdManagerShards.getShardList());
+                if (isDatastoreAvailable) {
+                    LOG.info("IDManager is UP");
+                    populateCache();
+                    break;
+                }
+                LOG.error("IdManager: retrying shard status check for the {} time, pending retries {}",
+                        ++retryCount, totalRetry - retryCount);
+                Thread.sleep(2000);
+            }
+        } catch (InterruptedException e) {
+            LOG.error("IDManager is DOWN, shard status check failed");
+        }
+
+        if (!isDatastoreAvailable) {
+            LOG.error("IDManager is DOWN, as shards were not available at bundle bringup");
+        }
     }
 
     @Override
index 207d50b2ba363de73242dd6c67f02334cb183fa3..89038413a2fb01fa11a7536602ddb7f84c6cf335 100644 (file)
@@ -15,7 +15,9 @@ import org.opendaylight.genius.idmanager.IdPoolListener;
 import org.opendaylight.genius.lockmanager.impl.LockListener;
 import org.opendaylight.genius.lockmanager.impl.LockManagerServiceImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
 import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.testutils.TestShardStatusMonitor;
 import org.opendaylight.infrautils.inject.guice.testutils.AbstractGuiceJsr250Module;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.testutils.DataBrokerTestModule;
@@ -38,5 +40,6 @@ public class IdManagerTestModule extends AbstractGuiceJsr250Module {
         bind(JobCoordinatorEventsWaiter.class).to(TestableJobCoordinatorEventsWaiter.class);
         DataBroker dataBroker = DataBrokerTestModule.dataBroker();
         bind(DataBroker.class).toInstance(dataBroker);
+        bind(ShardStatusMonitor.class).toInstance(TestShardStatusMonitor.newInstance());
     }
 }
index 17c9602b6af626a6cc4fbaa367f6a2e31e9a7345..888d4795c3be1218599a72027abd4114e108414b 100644 (file)
@@ -37,6 +37,7 @@ import org.opendaylight.serviceutils.tools.listener.AbstractClusteredSyncDataTre
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Other;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -62,7 +63,8 @@ public class FlowBasedServicesInterfaceStateListener extends AbstractClusteredSy
                                                            flowBasedServicesStateRendererFactoryResolver,
                                                    final InterfaceServiceRecoveryHandler
                                                            interfaceServiceRecoveryHandler,
-                                                   @Reference final ServiceRecoveryRegistry serviceRecoveryRegistry) {
+                                                   @Reference final ServiceRecoveryRegistry serviceRecoveryRegistry,
+                                                   final IdManagerService idManagerService) {
         super(dataBroker, LogicalDatastoreType.OPERATIONAL,
               InstanceIdentifier.create(InterfacesState.class).child(Interface.class));
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
index 78014d5bd50375b02e040e4d8884dc310ec54c3b..077c99df1c483894e56694f724c358a16785520b 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.serviceutils.tools.listener.AbstractSyncDataTreeChangeListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -42,7 +43,8 @@ public class FlowBasedServicesNodeStateListener extends AbstractSyncDataTreeChan
     public FlowBasedServicesNodeStateListener(@Reference final DataBroker dataBroker,
                                               @Reference final JobCoordinator jobCoordinator,
                                               final FlowBasedServicesStateRendererFactoryResolver
-                                                      flowBasedServicesStateRendererFactoryResolver) {
+                                                      flowBasedServicesStateRendererFactoryResolver,
+                                              final IdManagerService idManagerService) {
         super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class));
         this.jobCoordinator = jobCoordinator;
         this.flowBasedServicesStateRendererFactoryResolver = flowBasedServicesStateRendererFactoryResolver;
index bea808cbb4b43a574979456f32b7f12c591f2851..85b430689fe4045d97f5434559dcaf3817f4bde3 100644 (file)
@@ -38,7 +38,9 @@ import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.listen
 import org.opendaylight.genius.lockmanager.impl.LockListener;
 import org.opendaylight.genius.lockmanager.impl.LockManagerServiceImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
 import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.testutils.TestShardStatusMonitor;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.infrautils.caches.CacheProvider;
@@ -83,6 +85,7 @@ public class InterfaceManagerTestModule extends AbstractGuiceJsr250Module {
         bind(LockManagerService.class).to(LockManagerServiceImpl.class);
         bind(LockListener.class);
         bind(IdManagerService.class).to(IdManager.class);
+        bind(ShardStatusMonitor.class).toInstance(TestShardStatusMonitor.newInstance());
         bind(IInterfaceManager.class).to(InterfacemgrProvider.class);
 
         TestIMdsalApiManager mdsalManager = TestIMdsalApiManager.newInstance();
index 0a13ed9af59ded6561477167956f7a934bc3f5f6..fc27517846d4ecbc5da49836b08083bb84684728 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.serviceutils.tools.listener.AbstractSyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
@@ -66,7 +67,8 @@ public class OvsdbNodeListener extends AbstractSyncDataTreeChangeListener<Node>
 
     @Inject
     public OvsdbNodeListener(DataBroker dataBroker, ItmConfig itmConfig, JobCoordinator jobCoordinator,
-                             DataTreeEventCallbackRegistrar eventCallbacks) {
+                             DataTreeEventCallbackRegistrar eventCallbacks,
+                             final IdManagerService idManagerService) {
         super(dataBroker, LogicalDatastoreType.OPERATIONAL,
               InstanceIdentifier.create(NetworkTopology.class).child(Topology.class).child(Node.class));
         this.dataBroker = dataBroker;
index 0f1ba8936dd5851f587b5bb8a6df4b3e496e9ece..d7dd64237311109db61f8956130afb483072f4e3 100644 (file)
@@ -34,7 +34,9 @@ import org.opendaylight.genius.itm.monitoring.ItmTunnelEventListener;
 import org.opendaylight.genius.itm.rpc.ItmManagerRpcService;
 import org.opendaylight.genius.lockmanager.impl.LockManagerServiceImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
 import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.testutils.TestShardStatusMonitor;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.diagstatus.DiagStatusService;
 import org.opendaylight.infrautils.inject.guice.testutils.AbstractGuiceJsr250Module;
@@ -114,6 +116,7 @@ public class ItmTestModule extends AbstractGuiceJsr250Module {
         bind(TestIMdsalApiManager.class).toInstance(mdsalManager);
         bind(DataImportBootReady.class).toInstance(new DataImportBootReady() {});
         bind(DiagStatusService.class).toInstance(mock(DiagStatusService.class));
+        bind(ShardStatusMonitor.class).toInstance(TestShardStatusMonitor.newInstance());
     }
 
 }
index 0bdefd45ea25d3fff73dbdbc633d922b6c057dcf..ae6aada76ba75191f624442e0515149c01cfb620 100644 (file)
@@ -7,6 +7,9 @@
  */
 package org.opendaylight.genius.mdsalutil;
 
+
+import java.util.ArrayList;
+import java.util.List;
 import org.opendaylight.yangtools.yang.common.Uint64;
 
 public interface NwConstants {
@@ -279,4 +282,28 @@ public interface NwConstants {
             return flowModHeaderLen;
         }
     }
+
+    enum IdManagerShards {
+        DefaultConfig("default:config"),
+        DefaultOper("default:oper"),
+        InventoryConfig("inventory:config"),
+        InventoryOper("inventory:oper"),
+        TopologyConfig("topology:config"),
+        TopologyOper("topology:oper"),
+        EntityOper("entity:oper");
+
+        private String shardName;
+
+        IdManagerShards(String shardName) {
+            this.shardName = shardName;
+        }
+
+        public static List<String> getShardList() {
+            List<String> list = new ArrayList<>();
+            for (IdManagerShards val : IdManagerShards.values()) {
+                list.add(val.shardName);
+            }
+            return list;
+        }
+    }
 }
diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/interfaces/ShardStatusMonitor.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/interfaces/ShardStatusMonitor.java
new file mode 100644 (file)
index 0000000..8474289
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2019 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.genius.mdsalutil.interfaces;
+
+import java.util.List;
+
+public interface ShardStatusMonitor {
+
+    String JMX_OBJECT_NAME_LIST_OF_CONFIG_SHARDS =
+            "org.opendaylight.controller:type=DistributedConfigDatastore,"
+                    + "Category=ShardManager,name=shard-manager-config";
+    String JMX_OBJECT_NAME_LIST_OF_OPER_SHARDS =
+            "org.opendaylight.controller:type=DistributedOperationalDatastore,"
+                    + "Category=ShardManager,name=shard-manager-operational";
+
+    boolean getShardStatus(List<String> shards);
+}
\ No newline at end of file
diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/ShardStatusMonitorImpl.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/ShardStatusMonitorImpl.java
new file mode 100644 (file)
index 0000000..55e3275
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2019 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.genius.mdsalutil.internal;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Singleton
+public final class ShardStatusMonitorImpl implements ShardStatusMonitor {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ShardStatusMonitorImpl.class);
+
+    @Inject
+    public ShardStatusMonitorImpl() {
+        // Do nothing
+    }
+
+    public boolean getShardStatus(List<String> shards) {
+        boolean status = true;
+        for (String shard : shards) {
+            String[] params = shard.split(":");
+            if (!getDataStoreStatus(params[0], params[1]).equalsIgnoreCase("operational")) {
+                status = false;
+                break;
+            }
+        }
+        return status;
+    }
+
+    @SuppressWarnings("IllegalCatch")
+    private static String getDataStoreStatus(String name, String type) {
+        boolean statusResult = true;
+        try {
+            ArrayList listOfShards;
+            if (type.equalsIgnoreCase("config")) {
+                listOfShards = getAttributeJMXCommand(JMX_OBJECT_NAME_LIST_OF_CONFIG_SHARDS, "LocalShards");
+            } else {
+                listOfShards = getAttributeJMXCommand(JMX_OBJECT_NAME_LIST_OF_OPER_SHARDS, "LocalShards");
+            }
+            if (listOfShards != null) {
+                for (int i = 0; i < listOfShards.size(); i++) {
+                    if (listOfShards.get(i).toString().contains(name)) {
+                        String jmxObjectShardStatus;
+                        if (type.equalsIgnoreCase("config")) {
+                            jmxObjectShardStatus = "org.opendaylight.controller:Category=Shards,name="
+                                    + listOfShards.get(i) + ",type=DistributedConfigDatastore";
+                        } else {
+                            jmxObjectShardStatus = "org.opendaylight.controller:Category=Shards,name="
+                                    + listOfShards.get(i) + ",type=DistributedOperationalDatastore";
+                        }
+                        LOG.info(jmxObjectShardStatus);
+                        String leader = getLeaderJMX(jmxObjectShardStatus,"Leader");
+                        if (leader != null && leader.length() > 1) {
+                            if (type.equalsIgnoreCase("config")) {
+                                LOG.info("{} ::Config DS has the Leader as:: {}", listOfShards.get(i), leader);
+                            } else {
+                                LOG.info("{} ::Oper DS has the Leader as:: {}", listOfShards.get(i), leader);
+                            }
+                        } else {
+                            statusResult = false;
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            LOG.error("ERROR::", e);
+            statusResult = false;
+        }
+        if (statusResult) {
+            return "OPERATIONAL";
+        } else {
+            return "ERROR";
+        }
+    }
+
+    @SuppressWarnings("IllegalCatch")
+    private static ArrayList getAttributeJMXCommand(String objectName, String attributeName) {
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        ArrayList listOfShards = new ArrayList();
+        if (mbs != null) {
+            try {
+                listOfShards = (ArrayList) mbs.getAttribute(new ObjectName(objectName), attributeName);
+            } catch (MalformedObjectNameException monEx) {
+                LOG.error("CRITICAL EXCEPTION : Malformed Object Name Exception");
+            } catch (MBeanException mbEx) {
+                LOG.error("CRITICAL EXCEPTION : MBean Exception");
+            } catch (InstanceNotFoundException infEx) {
+                LOG.error("CRITICAL EXCEPTION : Instance Not Found Exception");
+            } catch (ReflectionException rEx) {
+                LOG.error("CRITICAL EXCEPTION : Reflection Exception");
+            } catch (Exception e) {
+                LOG.error("Attribute not found");
+            }
+        }
+        return listOfShards;
+    }
+
+    @SuppressWarnings("IllegalCatch")
+    private static String getLeaderJMX(String objectName, String atrName) {
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        String leader = "";
+        if (mbs != null) {
+            try {
+                leader  = (String) mbs.getAttribute(new ObjectName(objectName), atrName);
+            } catch (MalformedObjectNameException monEx) {
+                LOG.error("CRITICAL EXCEPTION : Malformed Object Name Exception");
+            } catch (MBeanException mbEx) {
+                LOG.error("CRITICAL EXCEPTION : MBean Exception");
+            } catch (InstanceNotFoundException infEx) {
+                LOG.error("CRITICAL EXCEPTION : Instance Not Found Exception");
+            } catch (ReflectionException rEx) {
+                LOG.error("CRITICAL EXCEPTION : Reflection Exception");
+            } catch (Exception e) {
+                LOG.error("Attribute not found");
+            }
+        }
+        return leader;
+    }
+}
\ No newline at end of file
index 89f2dad20d1ea1925980d9864971cf573335e4d6..2842b7e195f03fbf2ee4c0ec51b48a97b933472f 100644 (file)
@@ -18,5 +18,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 
   <service ref="hwvtepNodeHACacheImpl"
            interface="org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache"/>
+  <service ref="shardStatusMonitorImpl"
+           interface="org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor" />
 
 </blueprint>
index fa950a00d6ce9995ea67f1b4a0c8693822ffd6f3..dc36263f000db63dbb7cd8945dcf2ee228dd535a 100644 (file)
@@ -97,7 +97,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>blueprint-maven-plugin-annotation</artifactId>
       <optional>true</optional>
     </dependency>
-
+        <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>compile</scope>
+    </dependency>
     <!-- Now all <scope>test here: -->
     <dependency>
       <groupId>org.opendaylight.infrautils</groupId>
diff --git a/mdsalutil/mdsalutil-testutils/src/main/java/org/opendaylight/genius/mdsalutil/testutils/TestShardStatusMonitor.java b/mdsalutil/mdsalutil-testutils/src/main/java/org/opendaylight/genius/mdsalutil/testutils/TestShardStatusMonitor.java
new file mode 100644 (file)
index 0000000..7db5c41
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2019 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.genius.mdsalutil.testutils;
+
+import static org.opendaylight.yangtools.testutils.mockito.MoreAnswers.realOrException;
+
+import java.util.List;
+import org.mockito.Mockito;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
+
+public abstract class TestShardStatusMonitor implements ShardStatusMonitor {
+
+    public static TestShardStatusMonitor newInstance() {
+        return Mockito.mock(TestShardStatusMonitor.class, realOrException());
+    }
+
+    @Override
+    public  boolean getShardStatus(List<String> shards) {
+        return true;
+    }
+}
\ No newline at end of file
index c3ed6194b421cf21bfed8ad366e7e721f678c786..61de7bd0e86578cda556f010f6b2ff49dbaa52df 100644 (file)
@@ -12,6 +12,8 @@ import static org.mockito.Mockito.mock;
 import org.opendaylight.daexim.DataImportBootReady;
 import org.opendaylight.genius.idmanager.IdManager;
 import org.opendaylight.genius.lockmanager.impl.LockManagerServiceImpl;
+import org.opendaylight.genius.mdsalutil.interfaces.ShardStatusMonitor;
+import org.opendaylight.genius.mdsalutil.testutils.TestShardStatusMonitor;
 import org.opendaylight.genius.networkutils.RDUtils;
 import org.opendaylight.genius.networkutils.VniUtils;
 import org.opendaylight.genius.networkutils.impl.RDUtilsImpl;
@@ -32,6 +34,7 @@ public class NetworkUtilTestModule extends AbstractGuiceJsr250Module {
         bind(DataBroker.class).toInstance(dataBroker);
         bind(NetworkConfig.class).toInstance(mock(NetworkConfig.class));
         bind(IdManagerService.class).to(IdManager.class);
+        bind(ShardStatusMonitor.class).toInstance(TestShardStatusMonitor.newInstance());
         bind(DataImportBootReady.class).toInstance(new DataImportBootReady() {});
         bind(LockManagerService.class).to(LockManagerServiceImpl.class);
         bind(VniUtils.class).to(VniUtilsImpl.class);