9d54f7e60b3328feb6e713980afa1c04976e8848
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / config / OpenConfigMappingUtilTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.protocol.bgp.rib.impl.config;
10
11 import static junit.framework.TestCase.assertFalse;
12 import static org.junit.Assert.assertArrayEquals;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
16 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
17 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
18 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
19 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
20 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
21 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
22 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
23 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
24 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.HOLDTIMER;
25 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
26
27 import com.google.common.collect.ImmutableList;
28 import com.google.common.collect.Lists;
29 import com.google.common.primitives.Shorts;
30 import java.math.BigDecimal;
31 import java.nio.charset.StandardCharsets;
32 import java.util.ArrayList;
33 import java.util.Collections;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37 import org.junit.Assert;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.mockito.Mock;
41 import org.mockito.Mockito;
42 import org.mockito.MockitoAnnotations;
43 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
44 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
45 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
46 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
47 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
48 import org.opendaylight.protocol.bgp.rib.impl.BGPPeerTrackerImpl;
49 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
50 import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.Config;
61 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
62 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
63 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
64 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
65 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
66 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
67 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
68 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
69 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
70 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
71 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST;
72 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
73 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
74 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
75 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
76 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
77 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
78 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
79 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
80 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
81 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.SendReceive;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.mp.capabilities.add.path.capability.AddressFamilies;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Config1;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Config1Builder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Config2;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Config2Builder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.GlobalConfigAugmentation;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.GlobalConfigAugmentationBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Protocol1;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.ApplicationRibId;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.RibId;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
110 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
111
112 public class OpenConfigMappingUtilTest {
113     private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
114     private static final String KEY = "bgp";
115     private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
116         .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
117         .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(Protocol1.class).child(Bgp.class);
118     private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
119     private static final Ipv4Address ROUTER_ID = new Ipv4Address("1.2.3.4");
120     private static final Ipv4Address CLUSTER_ID = new Ipv4Address("4.3.2.1");
121
122     private static final Long ALL_PATHS = 0L;
123     private static final Long N_PATHS = 2L;
124     private static final BGPPeerTracker PEER_TRACKER = new BGPPeerTrackerImpl();
125     private static final PathSelectionMode ADD_PATH_BEST_N_PATH_SELECTION = new AddPathBestNPathSelection(N_PATHS,
126             PEER_TRACKER);
127     private static final PathSelectionMode ADD_PATH_BEST_ALL_PATH_SELECTION = new AllPathSelection(PEER_TRACKER);
128     private static final BgpTableType BGP_TABLE_TYPE_IPV4 = new BgpTableTypeImpl(Ipv4AddressFamily.class,
129             UnicastSubsequentAddressFamily.class);
130     private static final BgpTableType BGP_TABLE_TYPE_IPV6
131             = new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class);
132     private static final AfiSafi AFISAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build();
133     private static final TablesKey K4 = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
134
135     private static final ClusterIdentifier CLUSTER_IDENTIFIER = new ClusterIdentifier("192.168.1.2");
136     private static final AsNumber AS = new AsNumber(72L);
137     private static final BgpId BGP_ID = new BgpId(NEIGHBOR_ADDRESS.getIpv4Address());
138     private static final RibId RIB_ID = new RibId("bgp");
139     private static final List<AddressFamilies> FAMILIES;
140     private static final List<BgpTableType> TABLE_TYPES;
141     private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
142     private static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
143     private static final PortNumber PORT_NUMBER = new PortNumber(179);
144
145     static {
146         FAMILIES = new ArrayList<>();
147         FAMILIES.add(new AddressFamiliesBuilder()
148                 .setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
149                 .setSendReceive(SendReceive.Both).build());
150         FAMILIES.add(new AddressFamiliesBuilder()
151                 .setAfi(Ipv6AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
152                 .setSendReceive(SendReceive.Send).build());
153         FAMILIES.add(new AddressFamiliesBuilder()
154                 .setAfi(Ipv6AddressFamily.class).setSafi(MplsLabeledVpnSubsequentAddressFamily.class)
155                 .setSendReceive(SendReceive.Receive).build());
156         TABLE_TYPES = new ArrayList<>();
157         TABLE_TYPES.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
158         TABLE_TYPES.add(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class));
159         AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
160                 .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true)
161                         .setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
162         AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
163                 .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true)
164                         .setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
165     }
166
167     @Mock
168     private BGPTableTypeRegistryConsumer tableTypeRegistry;
169
170     @Mock
171     private RIB rib;
172
173     @Before
174     public void setUp() {
175         MockitoAnnotations.initMocks(this);
176         Mockito.doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV4))
177             .when(this.tableTypeRegistry).getTableType(IPV4UNICAST.class);
178         Mockito.doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV6))
179             .when(this.tableTypeRegistry).getTableType(IPV6UNICAST.class);
180         Mockito.doReturn(java.util.Optional.of(new BgpTableTypeImpl(Ipv6AddressFamily.class,
181                 MplsLabeledVpnSubsequentAddressFamily.class)))
182             .when(this.tableTypeRegistry).getTableType(IPV6LABELLEDUNICAST.class);
183         Mockito.doReturn(java.util.Optional.of(IPV4UNICAST.class))
184             .when(this.tableTypeRegistry).getAfiSafiType(BGP_TABLE_TYPE_IPV4);
185         Mockito.doReturn(java.util.Optional.of(IPV6UNICAST.class))
186             .when(this.tableTypeRegistry).getAfiSafiType(BGP_TABLE_TYPE_IPV6);
187         Mockito.doReturn(AS).when(this.rib).getLocalAs();
188     }
189
190     @Test
191     public void testGetRibInstanceName() {
192         assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
193     }
194
195     @Test
196     public void testGetHoldTimer() {
197         TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
198                 .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setHoldTime(BigDecimal.TEN).build());
199
200         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
201                 OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, null));
202         assertEquals(HOLDTIMER,
203                 OpenConfigMappingUtil.getHoldTimer(new NeighborBuilder().build(), null));
204
205         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
206                 OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder().build()));
207         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder()
208                 .setTimers(builder.build()).build()));
209     }
210
211     @Test
212     public void testGetPeerAs() {
213         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null, null));
214         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), null, this.rib.getLocalAs()));
215
216         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, new PeerGroupBuilder().build(), null));
217         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), new PeerGroupBuilder().build(),
218                 this.rib.getLocalAs()));
219
220         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(null, new PeerGroupBuilder()
221                         .setConfig(new ConfigBuilder().setPeerAs(AS).build()).build(), null));
222     }
223
224     @Test
225     public void testIsActive() {
226         final TransportBuilder builder = new TransportBuilder();
227         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(), null));
228         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder()
229                 .setTransport(builder.build()).build(), null));
230
231         final Transport activeFalse = builder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
232                 .rev151009.bgp.neighbor.group.transport.ConfigBuilder().setPassiveMode(true).build()).build();
233         assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(activeFalse).build(),
234                 null));
235
236         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(),
237                 new PeerGroupBuilder().build()));
238         assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(),
239                 new PeerGroupBuilder().setTransport(activeFalse).build()));
240     }
241
242     @Test
243     public void testGetRetryTimer() {
244         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
245                 OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, null));
246         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
247                 OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build(), null));
248         TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
249                 .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setConnectRetry(BigDecimal.TEN).build());
250         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder()
251                 .setTimers(builder.build()).build(), null));
252
253         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
254                 OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, new PeerGroupBuilder().build()));
255         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR,
256                 new PeerGroupBuilder().setTimers(builder.build()).build()));
257     }
258
259     @Test
260     public void testGetNeighborKey() {
261         assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
262             OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
263         assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
264         assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder()
265                 .build()).build()));
266     }
267
268     @Test
269     public void testGetNeighborInstanceIdentifier() {
270         assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
271             OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
272
273     }
274
275     @Test
276     public void testGetNeighborInstanceName() {
277         assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(), OpenConfigMappingUtil
278                 .getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
279     }
280
281     @Test
282     public void testGetPort() {
283         final TransportBuilder transport = new TransportBuilder();
284         assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR, null));
285         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder()
286                 .setTransport(transport.build()).build(), null));
287         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
288                 transport.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
289                         .group.transport.ConfigBuilder().build()).build()).build(), null));
290         final PortNumber newPort = new PortNumber(111);
291         final Config portConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
292                 .group.transport.ConfigBuilder().addAugmentation(Config1.class, new Config1Builder()
293                 .setRemotePort(newPort).build()).build();
294         assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
295                 transport.setConfig(portConfig).build()).build(), null));
296
297         assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder()
298                 .setTransport(transport.setConfig(portConfig).build()).build(), new PeerGroupBuilder().build()));
299     }
300
301     @Test
302     public void testGetAfiSafiWithDefault() {
303         final ImmutableList<AfiSafi> defaultValue = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
304         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
305         final AfiSafis afiSafi = new AfiSafisBuilder().build();
306         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
307
308         final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).addAugmentation(AfiSafi1.class,
309             new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
310         final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
311         afiSafiIpv6List.add(afiSafiIpv6);
312
313         final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
314         expected.add(AFI_SAFI_IPV4);
315         assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(0));
316         assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
317             OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(1));
318         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
319
320         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
321         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
322         assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(0));
323         assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
324             OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(1));
325         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
326     }
327
328     @Test
329     public void testGetClusterIdentifier() {
330         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();
331         configBuilder.setRouterId(ROUTER_ID);
332         assertEquals(ROUTER_ID.getValue(), OpenConfigMappingUtil.getClusterIdentifier(configBuilder.build()).getValue());
333
334         configBuilder.addAugmentation(GlobalConfigAugmentation.class,
335                 new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
336         assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getClusterIdentifier(configBuilder.build()).getValue());
337     }
338
339     @Test
340     public void isAppNeighbor() {
341         assertFalse(OpenConfigMappingUtil.isApplicationPeer(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
342         final Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder()
343             .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build())
344             .build()).build();
345         assertTrue(OpenConfigMappingUtil.isApplicationPeer(neighbor));
346     }
347
348     @Test
349     public void testToAfiSafis() {
350         final List<AfiSafi> afiSafis = OpenConfigMappingUtil.toAfiSafis(Lists.newArrayList(BGP_TABLE_TYPE_IPV4), (afisafi, tableType) -> afisafi,
351                 this.tableTypeRegistry);
352         Assert.assertEquals(Collections.singletonList(AFISAFI_IPV4), afiSafis);
353     }
354
355     @Test
356     public void toPeerType() {
357         Assert.assertEquals(PeerType.EXTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.Ebgp));
358         Assert.assertEquals(PeerType.INTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.Ibgp));
359         Assert.assertNull(OpenConfigMappingUtil.toPeerType(PeerRole.Internal));
360         Assert.assertEquals(PeerType.INTERNAL, OpenConfigMappingUtil.toPeerType(PeerRole.RrClient));
361     }
362
363     @Test
364     public void toNeighborAfiSafiAddPath() {
365         final AfiSafi afiSafi = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.emptyList());
366         Assert.assertEquals(AFISAFI_IPV4, afiSafi);
367
368         final AfiSafi afisafiIpv6Both = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
369             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
370                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
371                     .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(true).build()).build();
372         final AfiSafi afiSafi6 = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6Both, BGP_TABLE_TYPE_IPV6,
373             Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Both).build()));
374         Assert.assertEquals(afisafiIpv6Both, afiSafi6);
375
376         final AfiSafi afisafiIpv6ReceiveExpected = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
377             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
378                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
379                     .setReceive(true).build()).build();
380         final AfiSafi afiSafi6ReceiveResult = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6ReceiveExpected, BGP_TABLE_TYPE_IPV6,
381             Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Receive).build()));
382         Assert.assertEquals(afisafiIpv6ReceiveExpected, afiSafi6ReceiveResult);
383
384         final AfiSafi afisafiIpv6SendExpected = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
385             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
386                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
387                     .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(false).build()).build();
388         final AfiSafi afiSafi6SendResult = OpenConfigMappingUtil.toNeighborAfiSafiAddPath(afisafiIpv6ReceiveExpected, BGP_TABLE_TYPE_IPV6,
389             Collections.singletonList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV6).setSendReceive(SendReceive.Send).build()));
390         Assert.assertEquals(afisafiIpv6SendExpected, afiSafi6SendResult);
391     }
392
393     @Test
394     public void toGlobalAfiSafiAddPath() {
395         final AfiSafi afiSafi = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.emptyMap());
396         Assert.assertEquals(AFISAFI_IPV4, afiSafi);
397
398         final AfiSafi afiSafiResult = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.singletonMap(K4,
399             ADD_PATH_BEST_N_PATH_SELECTION));
400         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2 addPath =
401             new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder()
402                 .setSendMax(Shorts.checkedCast(N_PATHS)).setReceive(true).build();
403         final AfiSafi afisafiIpv4Psm2 = new AfiSafiBuilder(afiSafi)
404             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2.class,
405                 addPath).build();
406         Assert.assertEquals(afisafiIpv4Psm2, afiSafiResult);
407
408         final AfiSafi afiSafiAllResult = OpenConfigMappingUtil.toGlobalAfiSafiAddPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4,
409             Collections.singletonMap(K4, ADD_PATH_BEST_ALL_PATH_SELECTION));
410         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2 addPathAll =
411             new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder()
412                 .setSendMax(Shorts.checkedCast(ALL_PATHS)).setReceive(true).build();
413         final AfiSafi afiAll = new AfiSafiBuilder(afiSafi)
414             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2.class,
415                 addPathAll).build();
416         Assert.assertEquals(afiAll, afiSafiAllResult);
417     }
418
419     @Test
420     public void toPathSelectionMode() {
421         final List<AfiSafi> families = new ArrayList<>();
422         families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
423             .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
424         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
425             .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
426         final Map<BgpTableType, PathSelectionMode> result = OpenConfigMappingUtil
427                 .toPathSelectionMode(families, this.tableTypeRegistry, PEER_TRACKER);
428         final Map<BgpTableType, PathSelectionMode> expected = new HashMap<>();
429         expected.put(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_N_PATH_SELECTION);
430         expected.put(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_ALL_PATH_SELECTION);
431         assertEquals(expected.get(0), result.get(0));
432         assertEquals(expected.get(1), result.get(1));
433     }
434
435     @Test
436     public void toPeerRole() {
437         Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder().setPeerType(PeerType.EXTERNAL).build()).build();
438         PeerRole peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
439         Assert.assertEquals(PeerRole.Ebgp, peerRoleResult);
440
441         neighbor = new NeighborBuilder().setConfig(new ConfigBuilder().setPeerType(PeerType.INTERNAL).build()).build();
442         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
443         Assert.assertEquals(PeerRole.Ibgp, peerRoleResult);
444
445         neighbor = new NeighborBuilder()
446             .setRouteReflector(new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
447                 .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(true).build()).build()).build();
448         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
449         Assert.assertEquals(PeerRole.RrClient, peerRoleResult);
450     }
451
452     @Test
453     public void toAddPathCapability() {
454         final List<AfiSafi> families = new ArrayList<>();
455         families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
456             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
457                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
458                     .setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
459         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
460             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
461                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
462                     .setReceive(false).setSendMax(Shorts.checkedCast(N_PATHS)).build()).build());
463         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.class)
464             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1.class,
465                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi1Builder()
466                     .setReceive(false).build()).build());
467         final List<AddressFamilies> result = OpenConfigMappingUtil.toAddPathCapability(families, this.tableTypeRegistry);
468         assertEquals(FAMILIES, result);
469     }
470
471     @Test
472     public void toSendReceiveMode() {
473         final Map<TablesKey, PathSelectionMode> bgpTableKeyPsm = new HashMap<>();
474         bgpTableKeyPsm.put(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_N_PATH_SELECTION);
475         bgpTableKeyPsm.put(new TablesKey(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class), ADD_PATH_BEST_ALL_PATH_SELECTION);
476
477         final Global result = OpenConfigMappingUtil.fromRib(BGP_ID, CLUSTER_IDENTIFIER, RIB_ID, AS, TABLE_TYPES, bgpTableKeyPsm, this.tableTypeRegistry);
478         final Global expected = new GlobalBuilder()
479                 .setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder().setAfiSafi(AFISAFIS).build())
480                 .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
481                     .ConfigBuilder()
482                     .setAs(AS)
483                     .setRouterId(BGP_ID)
484                     .addAugmentation(GlobalConfigAugmentation.class,
485                             new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_IDENTIFIER)).build())
486                     .build()).build();
487         assertEquals(expected, result);
488     }
489
490     @Test
491     public void fromBgpPeer() {
492         final Neighbor result = OpenConfigMappingUtil.fromBgpPeer(FAMILIES, TABLE_TYPES, 30, NEIGHBOR_ADDRESS, true, null, PORT_NUMBER, 30, AS, PeerRole.Ibgp, this.tableTypeRegistry);
493         final List<AfiSafi> afisafis = new ArrayList<>();
494         afisafis.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
495             .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
496         afisafis.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
497             .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(false).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
498         final Neighbor expected = new NeighborBuilder()
499             .setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder().setAfiSafi(afisafis).build())
500             .setConfig(new ConfigBuilder().setPeerAs(AS).setPeerType(PeerType.INTERNAL).setRouteFlapDamping(false).setSendCommunity(CommunityType.NONE).build())
501             .setNeighborAddress(NEIGHBOR_ADDRESS)
502             .setRouteReflector(new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
503                 .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(false).build()).build())
504             .setTimers(new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
505                 .timers.ConfigBuilder().setHoldTime(DEFAULT_TIMERS).setMinimumAdvertisementInterval(DEFAULT_TIMERS)
506                 .setKeepaliveInterval(DEFAULT_TIMERS).setConnectRetry(DEFAULT_TIMERS).build()).build())
507             .setTransport(new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
508                 .group.transport.ConfigBuilder().setMtuDiscovery(false).setPassiveMode(false).addAugmentation(Config1.class, new Config1Builder()
509                 .setRemotePort(new PortNumber(179)).build()).build()).build())
510             .build();
511         assertEquals(expected, result);
512     }
513
514     @Test
515     public void fromApplicationPeer() {
516         final ApplicationRibId app = new ApplicationRibId("app");
517         final Neighbor result = OpenConfigMappingUtil.fromApplicationPeer(app, BGP_ID);
518         final Neighbor expected = new NeighborBuilder().setConfig(new ConfigBuilder().setDescription(app.getValue())
519             .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build()).build())
520             .setNeighborAddress(NEIGHBOR_ADDRESS).build();
521         assertEquals(expected, result);
522     }
523 }