Wire ip-sgt-distribution-service - service part 82/49082/6
authorMichal Rehak <mirehak@cisco.com>
Wed, 7 Dec 2016 08:08:49 +0000 (09:08 +0100)
committerVladimir Lavor <vlavor@cisco.com>
Wed, 14 Dec 2016 10:53:54 +0000 (10:53 +0000)
    - changed rpc service registration
    - added missing sxp values to binding container
    - fixed missing propagation of version leaf (mandatory)

Change-Id: I6fa23bd7c1af35c09e0d0a354070d9c63b28da34
Signed-off-by: Michal Rehak <mirehak@cisco.com>
ip-sgt-distribution-service/pom.xml
ip-sgt-distribution-service/src/main/java/org/opendaylight/controller/config/yang/config/ip/sgt/distribution/service/cfg/IpSgtDistributionServiceInstance.java
ip-sgt-distribution-service/src/main/java/org/opendaylight/groupbasedpolicy/ip/sgt/distribution/service/impl/IpSgtDistributionServiceImpl.java
ip-sgt-distribution-service/src/main/java/org/opendaylight/groupbasedpolicy/ip/sgt/distribution/service/impl/SxpCapableNodeListener.java
ip-sgt-distribution-service/src/main/resources/org/opendaylight/blueprint/ip-sgt-distribution-service.xml
ip-sgt-distribution-service/src/test/java/org/opendaylight/groupbasedpolicy/ip/sgt/distribution/service/impl/IpSgtDistributionServiceImplTest.java

index dd956335a37757ae945607744c420aad5065c3ab..6d3279216a44017088bd1d51ef3189cff081fc57 100644 (file)
             <groupId>org.opendaylight.sxp</groupId>
             <artifactId>sxp-controller</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.sxp</groupId>
+            <artifactId>sxp-core</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.groupbasedpolicy</groupId>
             <artifactId>groupbasedpolicy</artifactId>
             <version>${project.version}</version>
         </dependency>
-    <!-- testing dependencies -->
+        <!-- testing dependencies -->
         <dependency>
             <groupId>org.opendaylight.groupbasedpolicy</groupId>
             <artifactId>groupbasedpolicy</artifactId>
index 7e9c87e566eed0b40460bd8d45e6cbef5974bbca..e1f9638661288e1ba20099ba2df656df61dbfdba 100644 (file)
@@ -8,10 +8,14 @@
 
 package org.opendaylight.controller.config.yang.config.ip.sgt.distribution.service.cfg;
 
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.Future;
-
 import org.opendaylight.controller.config.yang.config.groupbasedpolicy.GroupbasedpolicyInstance;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.ip.sgt.distribution.service.impl.IpSgtDistributionServiceImpl;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
@@ -26,10 +30,6 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
 public class IpSgtDistributionServiceInstance
         implements ClusterSingletonService, IpSgtDistributionService, AutoCloseable {
 
@@ -37,18 +37,22 @@ public class IpSgtDistributionServiceInstance
     private static final ServiceGroupIdentifier IDENTIFIER =
             ServiceGroupIdentifier.create(GroupbasedpolicyInstance.GBP_SERVICE_GROUP_IDENTIFIER);
     private IpSgtDistributionServiceImpl ipSgtDistributionServiceImpl;
-    private DataBroker dataBroker;
-    private SxpControllerService sxpService;
-    private IpAddress sourceIp;
-    private ClusterSingletonServiceProvider clusterSingletonService;
+    private final DataBroker dataBroker;
+    private final SxpControllerService sxpService;
+    private final IpAddress sourceIp;
+    private final ClusterSingletonServiceProvider clusterSingletonService;
+    private final RpcProviderRegistry rpcProviderRegistry;
     private ClusterSingletonServiceRegistration singletonServiceRegistration;
+    private BindingAwareBroker.RpcRegistration<IpSgtDistributionService> rpcRegistration;
 
-    public IpSgtDistributionServiceInstance(final DataBroker dataBroker, final SxpControllerService sxpService,
-            final String sourceIp, final ClusterSingletonServiceProvider clusterSingletonService) {
+    public IpSgtDistributionServiceInstance(final DataBroker dataBroker,
+                                            final String sourceIp, final ClusterSingletonServiceProvider clusterSingletonService,
+                                            final RpcProviderRegistry rpcProviderRegistry) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
-        this.sxpService = Preconditions.checkNotNull(sxpService);
+        this.sxpService = Preconditions.checkNotNull(rpcProviderRegistry.getRpcService(SxpControllerService.class));
         this.sourceIp = new IpAddress(Preconditions.checkNotNull(sourceIp.toCharArray()));
         this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService);
+        this.rpcProviderRegistry = Preconditions.checkNotNull(rpcProviderRegistry);
     }
 
     public void initialize() {
@@ -89,6 +93,7 @@ public class IpSgtDistributionServiceInstance
         LOG.info("Instance {} closed", this.getClass().getSimpleName());
         try {
             ipSgtDistributionServiceImpl.close();
+            rpcRegistration.close();
         } catch (Exception e) {
             LOG.error("Closing {} wasnt succesfull", ipSgtDistributionServiceImpl.getClass().getSimpleName());
         }
@@ -98,6 +103,7 @@ public class IpSgtDistributionServiceInstance
     @Override
     public void instantiateServiceInstance() {
         ipSgtDistributionServiceImpl = new IpSgtDistributionServiceImpl(dataBroker, sxpService, sourceIp);
+        rpcRegistration = rpcProviderRegistry.addRpcImplementation(IpSgtDistributionService.class, this);
     }
 
 }
index 766431f4ae77c771c0979fc968d07f7d6e53a45b..8a405d4f4a7836e5fd8f79e8387a4776fa82734b 100644 (file)
@@ -8,16 +8,24 @@
 
 package org.opendaylight.groupbasedpolicy.ip.sgt.distribution.service.impl;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.Future;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.sxp.util.time.TimeConv;
 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.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SendIpSgtBindingToPeerInput;
@@ -31,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequenceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
@@ -49,14 +58,6 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
-
 public class IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistributionService {
 
     private static final Logger LOG = LoggerFactory.getLogger(IpSgtDistributionServiceImpl.class);
@@ -84,12 +85,12 @@ public class IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistrib
 
     private void createSxpNode(SxpControllerService sxpService) {
         AddNodeInput addNodeInput = new AddNodeInputBuilder().setNodeId(new NodeId(SXP_NODE_ID))
-            .setSourceIp(sourceIp)
-            .setDescription(SXP_NODE_DESCRIPTION)
-            .build();
+                .setSourceIp(sourceIp)
+                .setDescription(SXP_NODE_DESCRIPTION)
+                .build();
         Future<RpcResult<AddNodeOutput>> addNodeResult = sxpService.addNode(addNodeInput);
         try {
-            if (!addNodeResult.get().getResult().isResult()) {
+            if (! addNodeResult.get().getResult().isResult()) {
                 LOG.error("RPC add-node wasn't successfull");
             }
         } catch (Exception e) {
@@ -103,11 +104,11 @@ public class IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistrib
         boolean success = true;
         for (Binding binding : input.getBinding()) {
             success = transformChanges(binding, bindingsMap);
-            if (!success) {
+            if (! success) {
                 break;
             }
         }
-        if (!success) {
+        if (! success) {
             return Futures.immediateCheckedFuture(RpcResultBuilder.<Void>failed().build());
         }
         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
@@ -162,23 +163,27 @@ public class IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistrib
 
     private InstanceIdentifier<MasterDatabaseBinding> bindingIid(String domainId, IpPrefix prefix) {
         return InstanceIdentifier.builder(NetworkTopology.class)
-            .child(Topology.class, new TopologyKey(new TopologyId(SXP_TOPOLOGY_ID)))
-            .child(Node.class,
-                    new NodeKey(
-                            new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId(
-                                    SXP_NODE_ID)))
-            .augmentation(SxpNodeIdentity.class)
-            .child(SxpDomains.class)
-            .child(SxpDomain.class, new SxpDomainKey(domainId))
-            .child(MasterDatabase.class)
-            .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(prefix))
-            .build();
+                .child(Topology.class, new TopologyKey(new TopologyId(SXP_TOPOLOGY_ID)))
+                .child(Node.class,
+                        new NodeKey(
+                                new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId(
+                                        SXP_NODE_ID)))
+                .augmentation(SxpNodeIdentity.class)
+                .child(SxpDomains.class)
+                .child(SxpDomain.class, new SxpDomainKey(domainId))
+                .child(MasterDatabase.class)
+                .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(prefix))
+                .build();
     }
 
     private MasterDatabaseBinding createBinding(Entry<Sgt, IpPrefix> binding) {
-        return new MasterDatabaseBindingBuilder().setIpPrefix(binding.getValue())
-            .setSecurityGroupTag(binding.getKey())
-            .build();
+        final DateAndTime nowDateTime = TimeConv.toDt(System.currentTimeMillis());
+        return new MasterDatabaseBindingBuilder()
+                .setIpPrefix(binding.getValue())
+                .setSecurityGroupTag(binding.getKey())
+                .setPeerSequence(new PeerSequenceBuilder().build())
+                .setTimestamp(nowDateTime)
+                .build();
     }
 
     @Override
@@ -187,11 +192,11 @@ public class IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistrib
         boolean success = true;
         for (Binding binding : input.getBinding()) {
             success = transformChanges(binding, bindingsMap);
-            if (!success) {
+            if (! success) {
                 break;
             }
         }
-        if (!success) {
+        if (! success) {
             return Futures.immediateCheckedFuture(RpcResultBuilder.<Void>failed().build());
         }
         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
index af6c39aa8636fe39786d16e7bce4de7ddd4ce3e5..1fbc607d3573fdbcbece19633fcf8311f37c69af 100644 (file)
@@ -12,7 +12,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
@@ -104,16 +103,18 @@ public class SxpCapableNodeListener implements DataTreeChangeListener<SxpConnect
         String password = sxpData.getPassword();
         InstanceIdentifier<SxpDomain> iid = sxpDomainIid(domainId);
         SxpDomain domain = new SxpDomainBuilder().setDomainName(domainId)
-            .setConnections(new ConnectionsBuilder()
-                .setConnection(Collections.singletonList(new ConnectionBuilder().setPeerAddress(peerAddr)
-                    .setTcpPort(port)
-                    .setMode(ConnectionMode.Speaker)
-                    .setPassword(password)
-                    .setConnectionTimers(new ConnectionTimersBuilder().build())
-                    .setDescription("Connection to " + domainId)
-                    .build()))
-                .build())
-            .build();
+                .setConnections(new ConnectionsBuilder()
+                        .setConnection(Collections.singletonList(new ConnectionBuilder()
+                                .setPeerAddress(peerAddr)
+                                .setTcpPort(port)
+                                .setMode(ConnectionMode.Speaker)
+                                .setPassword(password)
+                                .setConnectionTimers(new ConnectionTimersBuilder().build())
+                                .setDescription("Connection to " + domainId)
+                                .setVersion(sxpData.getVersion())
+                                .build()))
+                        .build())
+                .build();
         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
         wtx.merge(LogicalDatastoreType.CONFIGURATION, iid, domain);
         wtx.submit();
index b2c15399f60cb1e1d5c0bfcc58dd3d4fda304d7f..77f2107b1099699d00996ab4e4bdd7073a4b82b0 100644 (file)
@@ -5,14 +5,14 @@
 
     <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"/>
     <reference id="clusterSingletonService" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
-    <odl:rpc-service id="sxpControllerService" interface="org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.controller.rev141002.SxpControllerService"/>
+    <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"/>
 
     <!-- Modules /-->
     <bean id="ipSgtDistributionService" class="org.opendaylight.controller.config.yang.config.ip.sgt.distribution.service.cfg.IpSgtDistributionServiceInstance"
-        init-method="initialize" destroy-method="close">
+          init-method="initialize" destroy-method="close">
         <argument ref="dataBroker"/>
-        <argument ref="sxpControllerService"/>
         <argument value="127.0.0.1"/>
         <argument ref="clusterSingletonService"/>
+        <argument ref="rpcRegistry"/>
     </bean>
 </blueprint>
\ No newline at end of file
index 2be74955249b0f04012d4e3a343204a40769d76d..2661fcfa238a76500159cd35da1394a61cc37e1f 100644 (file)
@@ -16,21 +16,25 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.util.concurrent.Futures;
 import java.util.Collections;
 import java.util.concurrent.Future;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Matchers;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.sxp.util.time.TimeConv;
 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.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SendIpSgtBindingToPeerInput;
@@ -46,6 +50,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequence;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequenceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
@@ -65,12 +71,12 @@ import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.common.util.concurrent.Futures;
-
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(IpSgtDistributionServiceImpl.class)
 public class IpSgtDistributionServiceImplTest {
 
+    private static final PeerSequence EMPTY_PEER_SEQUENCE = new PeerSequenceBuilder().build();
+    private static final DateAndTime DUMMY_DT = TimeConv.toDt(123456L);
     private final IpAddress ADDR = new IpAddress(new Ipv4Address("10.0.0.1"));
     private final IpPrefix BINDING_ADDR = new IpPrefix(new Ipv4Prefix("192.168.50.1/32"));
     private final Sgt BINDING_SGT = new Sgt(1010);
@@ -139,21 +145,38 @@ public class IpSgtDistributionServiceImplTest {
         when(wtx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
         when(nodeListener.getDomainIdForPeer(PEER_IID)).thenReturn(DOMAIN_ID);
         Future<RpcResult<Void>> response = impl.sendIpSgtBindingToPeer(input);
-        new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR).setSecurityGroupTag(BINDING_SGT).build();
+        final MasterDatabaseBinding expectedMasterDBBinding = new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR)
+                .setSecurityGroupTag(BINDING_SGT)
+                .setPeerSequence(EMPTY_PEER_SEQUENCE)
+                .setTimestamp(DUMMY_DT)
+                .build();
         verify(wtx).put(eq(LogicalDatastoreType.CONFIGURATION),
                 eq(InstanceIdentifier.builder(SXP_NODE_IID)
-                    .augmentation(SxpNodeIdentity.class)
-                    .child(SxpDomains.class)
-                    .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
-                    .child(MasterDatabase.class)
-                    .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(BINDING_ADDR))
-                    .build()),
-                eq(new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR)
-                    .setSecurityGroupTag(BINDING_SGT)
-                    .build()));
+                        .augmentation(SxpNodeIdentity.class)
+                        .child(SxpDomains.class)
+                        .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
+                        .child(MasterDatabase.class)
+                        .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(BINDING_ADDR))
+                        .build()),
+                Matchers.argThat(createMasterBDBindingMatcher(expectedMasterDBBinding)));
         assertTrue(response.get().isSuccessful());
     }
 
+    private static ArgumentMatcher<MasterDatabaseBinding> createMasterBDBindingMatcher(final MasterDatabaseBinding expectedMasterDBBinding) {
+        return new ArgumentMatcher<MasterDatabaseBinding>() {
+            @Override
+            public boolean matches(final Object o) {
+                boolean verdict = false;
+                if (o instanceof MasterDatabaseBinding) {
+                    final MasterDatabaseBinding otherMasterDBBinding =
+                            new MasterDatabaseBindingBuilder((MasterDatabaseBinding) o).setTimestamp(DUMMY_DT).build();
+                    verdict = expectedMasterDBBinding.equals(otherMasterDBBinding);
+                }
+                return verdict;
+            }
+        };
+    }
+
     @Test
     public void testSendIpSgtBindingToPeer_failedWrite() throws Exception {
         SendIpSgtBindingToPeerInput input =