Bump upstreams
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / config / OpenConfigMappingUtilTest.java
index eb4023c63bda4b4106744727c77a1eceb4783039..a73930b0b57dd99e0857e089251fb1bc42dc871a 100644 (file)
@@ -5,7 +5,6 @@
  * 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.protocol.bgp.rib.impl.config;
 
 import static junit.framework.TestCase.assertFalse;
@@ -13,62 +12,63 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
-import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
-import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport;
-import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getSimpleRoutingPolicy;
-import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
+import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.HOLDTIMER;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Shorts;
+import com.google.common.collect.ImmutableMap;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.parser.spi.pojo.RevisedErrorHandlingSupportImpl;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.Config;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.OpenconfigNetworkInstanceData;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
@@ -77,327 +77,339 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.re
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
 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.IpAddressNoZone;
 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.Ipv4AddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborConfigAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborConfigAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.SendReceive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamilies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.GlobalAddPathsConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.GlobalConfigAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAddPathsConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborPeerGroupConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTransportConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.PeerGroupTransportConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.MplsLabeledVpnSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingMap;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint8;
 
+@RunWith(MockitoJUnitRunner.class)
 public class OpenConfigMappingUtilTest {
     private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
+    private static final Neighbor EMPTY_NEIGHBOR = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS).build();
+
+    private static final PeerGroup EMPTY_PEERGROUP = new PeerGroupBuilder().setPeerGroupName("foo").build();
+
     private static final String KEY = "bgp";
-    private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
-        .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
-        .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(Protocol1.class).child(Bgp.class);
+    private static final InstanceIdentifier<Bgp> BGP_II =
+        InstanceIdentifier.builderOfInherited(OpenconfigNetworkInstanceData.class, NetworkInstances.class).build()
+        .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test"))
+        .child(Protocols.class)
+        .child(Protocol.class, new ProtocolKey(BGP.VALUE, KEY))
+        .augmentation(NetworkInstanceProtocol.class)
+        .child(Bgp.class);
     private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
     private static final Ipv4Address ROUTER_ID = new Ipv4Address("1.2.3.4");
     private static final Ipv4Address CLUSTER_ID = new Ipv4Address("4.3.2.1");
+    private static final Ipv4AddressNoZone LOCAL_HOST = new Ipv4AddressNoZone("127.0.0.1");
 
-    private static final Long ALL_PATHS = 0L;
-    private static final Long N_PATHS = 2L;
-    private static final PathSelectionMode ADD_PATH_BEST_N_PATH_SELECTION = new AddPathBestNPathSelection(N_PATHS);
+    private static final Uint8 ALL_PATHS = Uint8.ZERO;
+    private static final Uint8 N_PATHS = Uint8.TWO;
+    private static final PathSelectionMode ADD_PATH_BEST_N_PATH_SELECTION =
+            new AddPathBestNPathSelection(N_PATHS.toJava());
     private static final PathSelectionMode ADD_PATH_BEST_ALL_PATH_SELECTION = new AllPathSelection();
-    private static final BgpTableType BGP_TABLE_TYPE_IPV4 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
-    private static final BgpTableType BGP_TABLE_TYPE_IPV6 = new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class);
-    private static final AfiSafi AFISAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build();
-    private static final TablesKey K4 = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
-
-    private static final ClusterIdentifier CLUSTER_IDENTIFIER = new ClusterIdentifier("192.168.1.2");
-    private static final AsNumber AS = new AsNumber(72L);
-    private static final IpAddress IPADDRESS = new IpAddress(new Ipv4Address("127.0.0.1"));
-    private static final BgpId BGP_ID = new BgpId(IPADDRESS.getIpv4Address());
-    private static final RibId RIB_ID = new RibId("bgp");
-    private static final List<AddressFamilies> FAMILIES;
-    private static final List<BgpTableType> TABLE_TYPES;
-    private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
-    private static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
-    private static final PortNumber PORT_NUMBER = new PortNumber(179);
-
-    static {
-        FAMILIES = new ArrayList<>();
-        FAMILIES.add(new AddressFamiliesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
-            .setSendReceive(SendReceive.Both).build());
-        FAMILIES.add(new AddressFamiliesBuilder().setAfi(Ipv6AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
-            .setSendReceive(SendReceive.Send).build());
-        FAMILIES.add(new AddressFamiliesBuilder().setAfi(Ipv6AddressFamily.class).setSafi(MplsLabeledVpnSubsequentAddressFamily.class)
+    private static final BgpTableType BGP_TABLE_TYPE_IPV4 = new BgpTableTypeImpl(Ipv4AddressFamily.VALUE,
+            UnicastSubsequentAddressFamily.VALUE);
+    private static final BgpTableType BGP_TABLE_TYPE_IPV6
+            = new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE);
+
+    private static final AsNumber AS = new AsNumber(Uint32.valueOf(72));
+    private static final AsNumber GLOBAL_AS = new AsNumber(Uint32.valueOf(73));
+    private static final List<AddressFamilies> FAMILIES = List.of(
+        new AddressFamiliesBuilder()
+            .setAfi(Ipv4AddressFamily.VALUE).setSafi(UnicastSubsequentAddressFamily.VALUE)
+            .setSendReceive(SendReceive.Both).build(),
+        new AddressFamiliesBuilder()
+            .setAfi(Ipv6AddressFamily.VALUE).setSafi(UnicastSubsequentAddressFamily.VALUE)
+            .setSendReceive(SendReceive.Send).build(),
+        new AddressFamiliesBuilder()
+            .setAfi(Ipv6AddressFamily.VALUE).setSafi(MplsLabeledVpnSubsequentAddressFamily.VALUE)
             .setSendReceive(SendReceive.Receive).build());
-        TABLE_TYPES = new ArrayList<>();
-        TABLE_TYPES.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
-        TABLE_TYPES.add(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class));
-        AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
-            .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true).setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
-        AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
-    }
+    private static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
 
     @Mock
-    private BGPOpenConfigMappingService mappingService;
+    private BGPTableTypeRegistryConsumer tableTypeRegistry;
 
     @Mock
     private RIB rib;
 
     @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        Mockito.doReturn(Collections.singletonList(BGP_TABLE_TYPE_IPV4))
-            .when(this.mappingService).toTableTypes(any());
-        Mockito.doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV4))
-            .when(this.mappingService).toBgpTableType(IPV4UNICAST.class);
-        Mockito.doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV6))
-            .when(this.mappingService).toBgpTableType(IPV6UNICAST.class);
-        Mockito.doReturn(java.util.Optional.of(new BgpTableTypeImpl(Ipv6AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class)))
-            .when(this.mappingService).toBgpTableType(IPV6LABELLEDUNICAST.class);
-        Mockito.doReturn(java.util.Optional.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build()))
-            .when(this.mappingService).toAfiSafi(BGP_TABLE_TYPE_IPV4);
-        Mockito.doReturn(java.util.Optional.of(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).build()))
-            .when(this.mappingService).toAfiSafi(BGP_TABLE_TYPE_IPV6);
-        Mockito.doReturn(AS).when(this.rib).getLocalAs();
+    public void setUp() {
+        doReturn(BGP_TABLE_TYPE_IPV4).when(tableTypeRegistry).getTableType(IPV4UNICAST.VALUE);
+        doReturn(BGP_TABLE_TYPE_IPV6).when(tableTypeRegistry).getTableType(IPV6UNICAST.VALUE);
+        doReturn(new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, MplsLabeledVpnSubsequentAddressFamily.VALUE))
+            .when(tableTypeRegistry).getTableType(IPV6LABELLEDUNICAST.VALUE);
+        doReturn(AS).when(rib).getLocalAs();
     }
 
     @Test
-    public void testGetRibInstanceName() throws Exception {
+    public void testGetRibInstanceName() {
         assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
     }
 
     @Test
-    public void testGetHoldTimer() throws Exception {
-        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR));
+    public void testGetHoldTimer() {
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, null));
+        assertEquals(HOLDTIMER, OpenConfigMappingUtil.getHoldTimer(EMPTY_NEIGHBOR, null));
+
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
+                OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, EMPTY_PEERGROUP));
+        TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
+                .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setHoldTime(Decimal64.valueOf(2, 10))
+                .build());
+        assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder()
+                .setPeerGroupName("foo").setTimers(builder.build()).build()));
     }
 
     @Test
-    public void testGetPeerAs() throws Exception {
-        assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null));
-        assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), this.rib));
+    public void testGetRemotePeerAs() {
+        final ConfigBuilder configBuilder = new ConfigBuilder();
+        assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), null, null));
+        assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), null, rib.getLocalAs()));
+
+        assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), EMPTY_PEERGROUP, null));
+        assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), EMPTY_PEERGROUP,
+                rib.getLocalAs()));
+
+        assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(null, new PeerGroupBuilder().setPeerGroupName("foo")
+                        .setConfig(new ConfigBuilder().setPeerAs(AS).build()).build(), null));
     }
 
     @Test
-    public void testIsActive() throws Exception {
-        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build()));
-        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
-        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(createTransport()).build()));
+    public void testGetLocalPeerAs() {
+        final ConfigBuilder configBuilder = new ConfigBuilder();
+        assertEquals(GLOBAL_AS,OpenConfigMappingUtil.getLocalPeerAs(null, GLOBAL_AS));
+        assertEquals(AS, OpenConfigMappingUtil.getLocalPeerAs(configBuilder.setLocalAs(AS).build(), GLOBAL_AS));
     }
 
     @Test
-    public void testGetRetryTimer() throws Exception {
-        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR));
-        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build()));
+    public void testIsActive() {
+        final TransportBuilder builder = new TransportBuilder();
+        assertTrue(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, null));
+        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(builder.build()).build(), null));
+
+        final Transport activeFalse = builder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
+                .rev151009.bgp.neighbor.group.transport.ConfigBuilder().setPassiveMode(true).build()).build();
+        assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(activeFalse).build(), null));
+
+        assertTrue(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, EMPTY_PEERGROUP));
+        assertFalse(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, new PeerGroupBuilder().setPeerGroupName("foo")
+            .setTransport(activeFalse).build()));
     }
 
     @Test
-    public void testGetNeighborKey() throws Exception {
+    public void testGetRetryTimer() {
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, null));
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
+                OpenConfigMappingUtil.getRetryTimer(EMPTY_NEIGHBOR, null));
+        TimersBuilder builder = new TimersBuilder()
+            .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers
+                .ConfigBuilder().setConnectRetry(Decimal64.valueOf(2, 10)).build());
+        assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder()
+                .setNeighborAddress(NEIGHBOR_ADDRESS).setTimers(builder.build()).build(), null));
+
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
+                OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, EMPTY_PEERGROUP));
+        assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR,
+                new PeerGroupBuilder().setPeerGroupName("foo").setTimers(builder.build()).build()));
+    }
+
+    @Test
+    public void testGetNeighborKey() {
         assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
-            OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
-        assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
-        assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
+            OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).asMap().get(IetfInetUtil.inetAddressFor(NEIGHBOR_ADDRESS)));
+        assertNull(OpenConfigMappingUtil.getNeighborKey(EMPTY_NEIGHBOR));
+        assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setConfig(new ConfigBuilder().build()).build()));
     }
 
     @Test
-    public void testGetNeighborInstanceIdentifier() throws Exception {
+    public void testGetNeighborInstanceIdentifier() {
         assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
             OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
 
     }
 
     @Test
-    public void testGetNeighborInstanceName() throws Exception {
-        assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(),
-            OpenConfigMappingUtil.getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
+    public void testGetNeighborInstanceName() {
+        assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(), OpenConfigMappingUtil.getNeighborInstanceName(
+            BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
     }
 
     @Test
-    public void testGetPort() throws Exception {
-        assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR));
-        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
-        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
-            new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
-                ConfigBuilder().build()).build()).build()));
-        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
-            new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
-                ConfigBuilder().addAugmentation(Config1.class, new Config1Builder().build()).build()).build()).build()));
+    public void testGetPort() {
+        final TransportBuilder transport = new TransportBuilder();
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR, null));
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(transport.build()).build(), null));
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(transport.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
+                        .rev151009.bgp.neighbor.group.transport.ConfigBuilder().build()).build()).build(), null));
+        final PortNumber newPort = new PortNumber(Uint16.valueOf(111));
+        final Config portConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
+                .group.transport.ConfigBuilder()
+                    .addAugmentation(new NeighborTransportConfigBuilder().setRemotePort(newPort).build()).build();
+        assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(transport.setConfig(portConfig).build()).build(), null));
+
+        assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setTransport(transport.setConfig(portConfig).build()).build(), EMPTY_PEERGROUP));
+
+        final Config portConfigGroup = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
+                .neighbor.group.transport.ConfigBuilder()
+                    .addAugmentation(new PeerGroupTransportConfigBuilder().setRemotePort(newPort).build()).build();
+        assertEquals(newPort, OpenConfigMappingUtil.getPort(EMPTY_NEIGHBOR, new PeerGroupBuilder()
+                .setPeerGroupName("foo").setTransport(transport.setConfig(portConfigGroup).build()).build()));
     }
 
     @Test
-    public void testGetAfiSafiWithDefault() throws Exception {
-        final ImmutableList<AfiSafi> defaultValue = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
+    public void testGetLocalAddress() {
+        assertNull(OpenConfigMappingUtil.getLocalAddress(null));
+        final TransportBuilder transport = new TransportBuilder();
+        assertNull(OpenConfigMappingUtil.getLocalAddress(transport.build()));
+        assertNull(OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+                        .ConfigBuilder().build()).build()));
+        assertEquals(new IpAddressNoZone(LOCAL_HOST), OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+                        .ConfigBuilder().setLocalAddress(new BgpNeighborTransportConfig
+                        .LocalAddress(new IpAddress(new Ipv4Address(LOCAL_HOST.getValue())))).build()).build()));
+    }
+
+    @Test
+    public void testGetAfiSafiWithDefault() {
+        final AfiSafi v4afi = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE).build();
+        final ImmutableMap<AfiSafiKey, AfiSafi> defaultValue = ImmutableMap.of(v4afi.key(), v4afi);
         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
         final AfiSafis afiSafi = new AfiSafisBuilder().build();
         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
 
-        final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).addAugmentation(AfiSafi1.class,
-            new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
-        final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
-        afiSafiIpv6List.add(afiSafiIpv6);
+        final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
+                .addAugmentation(new NeighborAddPathsConfigBuilder().setReceive(true).setSendMax(SHORT).build())
+                .build();
+        final Map<AfiSafiKey, AfiSafi> afiSafiIpv6List = BindingMap.of(afiSafiIpv6);
 
-        final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
-        expected.add(AFI_SAFI_IPV4);
-        assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(0));
-        assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
-            OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(1));
+        final Map<AfiSafiKey, AfiSafi> v6 = OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
+            .setAfiSafi(afiSafiIpv6List).build(), true);
+        assertEquals(2, v6.size());
+        assertTrue(v6.containsValue(afiSafiIpv6));
+        assertTrue(v6.containsValue(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE).build()));
         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
 
         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
-        assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(0));
-        assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
-            OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(1));
+        assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
+                .setAfiSafi(afiSafiIpv6List).build(), false).values().iterator().next());
         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
     }
 
     @Test
-    public void testGetClusterIdentifier() {
-        final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder configBuilder = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder();
+    public void testGetGlobalClusterIdentifier() {
+        final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
+                .ConfigBuilder configBuilder = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
+                .bgp.global.base.ConfigBuilder();
         configBuilder.setRouterId(ROUTER_ID);
-        assertEquals(ROUTER_ID.getValue(), OpenConfigMappingUtil.getClusterIdentifier(configBuilder.build()).getValue());
+        assertEquals(ROUTER_ID.getValue(),
+                OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
 
-        configBuilder.addAugmentation(GlobalConfigAugmentation.class,
-                new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
-        assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getClusterIdentifier(configBuilder.build()).getValue());
+        configBuilder.addAugmentation(new GlobalConfigAugmentationBuilder()
+                .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
+        assertEquals(CLUSTER_ID.getValue(),
+                OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
     }
 
     @Test
-    public void testGetSimpleRoutingPolicy() {
-        final NeighborBuilder neighborBuilder = new NeighborBuilder();
-        assertNull(getSimpleRoutingPolicy(neighborBuilder.build()));
-        neighborBuilder.setConfig(new ConfigBuilder()
-                .addAugmentation(NeighborConfigAugmentation.class,
-                        new NeighborConfigAugmentationBuilder().setSimpleRoutingPolicy(SimpleRoutingPolicy.LearnNone).build()).build());
-        assertEquals(SimpleRoutingPolicy.LearnNone, getSimpleRoutingPolicy(neighborBuilder.build()));
-    }
+    public void testGetNeighborClusterIdentifier() {
 
-    @Test
-    public void isAppNeighbor() {
-        assertFalse(OpenConfigMappingUtil.isApplicationPeer(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
-        final Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder()
-            .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build())
-            .build()).build();
-        assertTrue(OpenConfigMappingUtil.isApplicationPeer(neighbor));
-    }
+        assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, null));
 
-    @Test
-    public void testToAfiSafis() {
-        final List<AfiSafi> afiSafis = OpenConfigMappingUtil.toAfiSafis(Lists.newArrayList(BGP_TABLE_TYPE_IPV4), (afisafi, tableType) -> afisafi,
-                this.mappingService);
-        Assert.assertEquals(Collections.singletonList(AFISAFI_IPV4), afiSafis);
-    }
+        final PeerGroupBuilder peerGroup = new PeerGroupBuilder().setPeerGroupName("foo");
+        assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, peerGroup.build()));
 
-    @Test
-    public void toPeerType() {
-        Assert.assertEquals(PeerType.EXTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.Ebgp));
-        Assert.assertEquals(PeerType.INTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.Ibgp));
-        Assert.assertNull(OpenConfigMappingUtil.toPeerType(PeerRole.Internal));
-        Assert.assertEquals(PeerType.INTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.RrClient));
-    }
+        final RouteReflectorBuilder configBuilder = new RouteReflectorBuilder();
+        assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(), peerGroup.build()));
 
-    @Test
-    public void toNeighborAfiSafiAddPath() {
-        final AfiSafi afiSafi = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.emptyList());
-        Assert.assertEquals(AFISAFI_IPV4, afiSafi);
-
-        final AfiSafi afisafiIpv6Both = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(true).build()).build();
-        final AfiSafi afiSafi6 = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6Both, BGP_TABLE_TYPE_IPV6,
-            Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Both).build()));
-        Assert.assertEquals(afisafiIpv6Both, afiSafi6);
-
-        final AfiSafi afisafiIpv6ReceiveExpected = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setReceive(true).build()).build();
-        final AfiSafi afiSafi6ReceiveResult = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6ReceiveExpected, BGP_TABLE_TYPE_IPV6,
-            Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Receive).build()));
-        Assert.assertEquals(afisafiIpv6ReceiveExpected, afiSafi6ReceiveResult);
-
-        final AfiSafi afisafiIpv6SendExpected = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(false).build()).build();
-        final AfiSafi afiSafi6SendResult = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6ReceiveExpected, BGP_TABLE_TYPE_IPV6,
-            Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Send).build()));
-        Assert.assertEquals(afisafiIpv6SendExpected, afiSafi6SendResult);
+        configBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
+                .group.route.reflector.ConfigBuilder()
+                .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
+        assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(),
+                peerGroup.build()).getValue());
+
+        assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(null,
+                peerGroup.setRouteReflector(configBuilder.build()).build()).getValue());
     }
 
     @Test
-    public void toGlobalAfiSafiAddPath() {
-        final AfiSafi afiSafi = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.emptyMap());
-        Assert.assertEquals(AFISAFI_IPV4, afiSafi);
-
-        final AfiSafi afiSafiResult = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.singletonMap(K4,
-            ADD_PATH_BEST_N_PATH_SELECTION));
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2 addPath =
-            new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder()
-                .setSendMax(Shorts.checkedCast(N_PATHS)).setReceive(true).build();
-        final AfiSafi afisafiIpv4Psm2 = new AfiSafiBuilder(afiSafi)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2.class,
-                addPath).build();
-        Assert.assertEquals(afisafiIpv4Psm2, afiSafiResult);
-
-        final AfiSafi afiSafiAllResult = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4,
-            Collections.singletonMap(K4, ADD_PATH_BEST_ALL_PATH_SELECTION));
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2 addPathAll =
-            new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder()
-                .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(true).build();
-        final AfiSafi afiAll = new AfiSafiBuilder(afiSafi)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2.class,
-                addPathAll).build();
-        Assert.assertEquals(afiAll, afiSafiAllResult);
+    public void isAppNeighbor() {
+        assertFalse(OpenConfigMappingUtil.isApplicationPeer(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setConfig(new ConfigBuilder().build()).build()));
+        final Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setConfig(new ConfigBuilder()
+                    .addAugmentation(new NeighborPeerGroupConfigBuilder()
+                        .setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build()).build()).build();
+        assertTrue(OpenConfigMappingUtil.isApplicationPeer(neighbor));
     }
 
     @Test
     public void toPathSelectionMode() {
         final List<AfiSafi> families = new ArrayList<>();
-        families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
-            .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
-        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
-        final Map<BgpTableType, PathSelectionMode> result = OpenConfigMappingUtil.toPathSelectionMode(families, this.mappingService);
+        families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE)
+            .addAugmentation(new GlobalAddPathsConfigBuilder().setSendMax(N_PATHS).build()).build());
+        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
+            .addAugmentation(new GlobalAddPathsConfigBuilder().setSendMax(ALL_PATHS).build()).build());
+        final Map<BgpTableType, PathSelectionMode> result = OpenConfigMappingUtil
+                .toPathSelectionMode(families, tableTypeRegistry);
         final Map<BgpTableType, PathSelectionMode> expected = new HashMap<>();
-        expected.put(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_N_PATH_SELECTION);
-        expected.put(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_ALL_PATH_SELECTION);
+        expected.put(new BgpTableTypeImpl(Ipv4AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE),
+                ADD_PATH_BEST_N_PATH_SELECTION);
+        expected.put(new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE),
+                ADD_PATH_BEST_ALL_PATH_SELECTION);
+        // FIXME: these assertions are wrong, as they perform lookup on non-existing keys
         assertEquals(expected.get(0), result.get(0));
         assertEquals(expected.get(1), result.get(1));
     }
 
     @Test
     public void toPeerRole() {
-        Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder().setPeerType(PeerType.EXTERNAL).build()).build();
+        Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS).setConfig(new ConfigBuilder()
+                .setPeerType(PeerType.EXTERNAL).build()).build();
         PeerRole peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
         Assert.assertEquals(PeerRole.Ebgp, peerRoleResult);
 
-        neighbor = new NeighborBuilder().setConfig(new ConfigBuilder().setPeerType(PeerType.INTERNAL).build()).build();
+        neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+            .setConfig(new ConfigBuilder().setPeerType(PeerType.INTERNAL).build())
+            .build();
         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
         Assert.assertEquals(PeerRole.Ibgp, peerRoleResult);
 
-        neighbor = new NeighborBuilder()
-            .setRouteReflector(new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
+        neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+            .setRouteReflector(new RouteReflectorBuilder().setConfig(
+                    new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
                 .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(true).build()).build()).build();
         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
         Assert.assertEquals(PeerRole.RrClient, peerRoleResult);
@@ -406,72 +418,92 @@ public class OpenConfigMappingUtilTest {
     @Test
     public void toAddPathCapability() {
         final List<AfiSafi> families = new ArrayList<>();
-        families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
-        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setReceive(false).setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
-        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.class)
-            .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder()
-                    .setReceive(false).build()).build());
-        final List<AddressFamilies> result = OpenConfigMappingUtil.toAddPathCapability(families, this.mappingService);
+        families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE)
+            .addAugmentation(new NeighborAddPathsConfigBuilder()
+                .setReceive(Boolean.TRUE).setSendMax(ALL_PATHS).build()).build());
+        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
+            .addAugmentation(new NeighborAddPathsConfigBuilder()
+                .setReceive(Boolean.FALSE).setSendMax(N_PATHS).build()).build());
+        families.add(new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.VALUE)
+            .addAugmentation(new NeighborAddPathsConfigBuilder().setReceive(Boolean.FALSE).build()).build());
+        final List<AddressFamilies> result = OpenConfigMappingUtil .toAddPathCapability(families, tableTypeRegistry);
         assertEquals(FAMILIES, result);
     }
 
     @Test
-    public void toSendReceiveMode() {
-        final Map<TablesKey, PathSelectionMode> bgpTableKeyPsm = new HashMap<>();
-        bgpTableKeyPsm.put(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_N_PATH_SELECTION);
-        bgpTableKeyPsm.put(new TablesKey(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_ALL_PATH_SELECTION);
-
-        final Global result = OpenConfigMappingUtil.fromRib(BGP_ID, CLUSTER_IDENTIFIER, RIB_ID, AS, TABLE_TYPES, bgpTableKeyPsm, this.mappingService);
-        final Global expected = new GlobalBuilder()
-                .setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder().setAfiSafi(AFISAFIS).build())
-                .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
-                    .ConfigBuilder()
-                    .setAs(AS)
-                    .setRouterId(BGP_ID)
-                    .addAugmentation(GlobalConfigAugmentation.class,
-                            new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_IDENTIFIER)).build())
-                    .build()).build();
-        assertEquals(expected, result);
+    public void getGracefulRestartTimerTest() {
+        final int neighborTimer = 5;
+        final int peerGroupTimer = 10;
+        Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
+                .setGracefulRestart(new GracefulRestartBuilder()
+                        .setConfig(createGracefulConfig(Uint16.valueOf(neighborTimer)))
+                        .build()).build();
+        PeerGroup peerGroup = new PeerGroupBuilder().setPeerGroupName("foo")
+                .setGracefulRestart(new GracefulRestartBuilder()
+                        .setConfig(createGracefulConfig(Uint16.valueOf(peerGroupTimer)))
+                        .build()).build();
+        // both timers present, pick peer group one
+        int timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, peerGroup, HOLDTIMER);
+        assertEquals(peerGroupTimer, timer);
+
+        // peer group missing graceful restart, use neighbor timer
+        timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, EMPTY_PEERGROUP, HOLDTIMER);
+        assertEquals(neighborTimer, timer);
+
+        // graceful restart enabled but timer not set, use hold time
+        peerGroup = new PeerGroupBuilder().setPeerGroupName("bar")
+                .setGracefulRestart(new GracefulRestartBuilder()
+                        .setConfig(createGracefulConfig(null))
+                        .build()).build();
+        timer = OpenConfigMappingUtil.getGracefulRestartTimer(EMPTY_NEIGHBOR, peerGroup, HOLDTIMER);
+        assertEquals(HOLDTIMER, timer);
     }
 
-    @Test
-    public void fromBgpPeer() {
-        final Neighbor result = OpenConfigMappingUtil.fromBgpPeer(FAMILIES, TABLE_TYPES, 30, IPADDRESS, true, null, PORT_NUMBER, 30, AS, PeerRole.Ibgp, null, this.mappingService);
-        final List<AfiSafi> afisafis = new ArrayList<>();
-        afisafis.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
-            .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
-        afisafis.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
-            .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(false).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
-        final Neighbor expected = new NeighborBuilder()
-            .setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder().setAfiSafi(afisafis).build())
-            .setConfig(new ConfigBuilder().setPeerAs(AS).setPeerType(PeerType.INTERNAL).setRouteFlapDamping(false).setSendCommunity(CommunityType.NONE).build())
-            .setNeighborAddress(IPADDRESS)
-            .setRouteReflector(new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
-                .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(false).build()).build())
-            .setTimers(new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
-                .timers.ConfigBuilder().setHoldTime(DEFAULT_TIMERS).setMinimumAdvertisementInterval(DEFAULT_TIMERS)
-                .setKeepaliveInterval(DEFAULT_TIMERS).setConnectRetry(DEFAULT_TIMERS).build()).build())
-            .setTransport(new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
-                .group.transport.ConfigBuilder().setMtuDiscovery(false).setPassiveMode(false).addAugmentation(Config1.class, new Config1Builder()
-                .setRemotePort(new PortNumber(179)).build()).build()).build())
-            .build();
-        assertEquals(expected, result);
+    private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
+            .restart.Config createGracefulConfig(final Uint16 restartTimer) {
+        return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
+                .restart.ConfigBuilder().setRestartTime(restartTimer).build();
     }
 
     @Test
-    public void fromApplicationPeer() {
-        final ApplicationRibId app = new ApplicationRibId("app");
-        final Neighbor result = OpenConfigMappingUtil.fromApplicationPeer(app, BGP_ID);
-        final Neighbor expected = new NeighborBuilder().setConfig(new ConfigBuilder().setDescription(app.getValue())
-            .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build()).build())
-            .setNeighborAddress(IPADDRESS).build();
-        assertEquals(expected, result);
+    public void getRevisedErrorHandlingTest() {
+        final NeighborBuilder neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS);
+        final PeerGroupBuilder peerGroup = new PeerGroupBuilder().setPeerGroupName("foo");
+        final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.error.handling
+                .ConfigBuilder errorHandlingConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
+                        .rev151009.bgp.neighbor.group.error.handling.ConfigBuilder();
+        // error handling not set -> null
+        assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
+                neighbor.build()));
+        // error handling for peer group disabled, neighbor not set -> null
+        peerGroup.setErrorHandling(new ErrorHandlingBuilder()
+                .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
+                .build());
+        assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
+                neighbor.build()));
+        // error handling for peer group enabled, neighbor not set, Igp -> error handling for internal peer
+        peerGroup.setErrorHandling(new ErrorHandlingBuilder()
+                .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
+                .build());
+        assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
+                OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
+        // error handling for peer group enabled, neighbor disabled -> null
+        neighbor.setErrorHandling(new ErrorHandlingBuilder()
+                .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
+                .build());
+        assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
+                neighbor.build()));
+        // error handling for peer group enabled, neighbor enabled, Igb -> error handling for internal peer
+        neighbor.setErrorHandling(new ErrorHandlingBuilder()
+                .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
+                .build());
+        assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
+                OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
+        // error handling for peer group enabled, neighbor enabled, Egb -> error handling for external peer
+        neighbor.setErrorHandling(new ErrorHandlingBuilder()
+                .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
+                .build());
+        assertEquals(RevisedErrorHandlingSupportImpl.forExternalPeer(),
+                OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ebgp, peerGroup.build(), neighbor.build()));
     }
-}
\ No newline at end of file
+}