2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.bgp.rib.impl.config;
10 import static junit.framework.TestCase.assertFalse;
11 import static org.junit.Assert.assertArrayEquals;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.MockitoAnnotations.initMocks;
17 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
18 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
19 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
20 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
21 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
22 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
23 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
24 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
25 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.HOLDTIMER;
26 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
28 import com.google.common.collect.ImmutableList;
29 import java.math.BigDecimal;
30 import java.nio.charset.StandardCharsets;
31 import java.util.ArrayList;
32 import java.util.HashMap;
33 import java.util.List;
35 import org.junit.Assert;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.mockito.Mock;
39 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
40 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
41 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
42 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
43 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
44 import org.opendaylight.protocol.bgp.parser.spi.pojo.RevisedErrorHandlingSupportImpl;
45 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.Config;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
61 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
62 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
63 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
64 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
65 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
66 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
67 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST;
68 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
69 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
70 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
71 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
72 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
73 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
74 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
75 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
76 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
77 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.SendReceive;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamilies;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalAddPathsConfig;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalAddPathsConfigBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalConfigAugmentation;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.GlobalConfigAugmentationBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfig;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfigBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborPeerGroupConfig;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborPeerGroupConfigBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportConfig;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportConfigBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfig;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfigBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.MplsLabeledVpnSubsequentAddressFamily;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily;
106 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
107 import org.opendaylight.yangtools.yang.common.Uint16;
108 import org.opendaylight.yangtools.yang.common.Uint32;
109 import org.opendaylight.yangtools.yang.common.Uint8;
111 public class OpenConfigMappingUtilTest {
112 private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
113 private static final String KEY = "bgp";
114 private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
115 .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
116 .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(NetworkInstanceProtocol.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 private static final Ipv4AddressNoZone LOCAL_HOST = new Ipv4AddressNoZone("127.0.0.1");
123 private static final Uint8 ALL_PATHS = Uint8.ZERO;
124 private static final Uint8 N_PATHS = Uint8.TWO;
125 private static final PathSelectionMode ADD_PATH_BEST_N_PATH_SELECTION =
126 new AddPathBestNPathSelection(N_PATHS.toJava());
127 private static final PathSelectionMode ADD_PATH_BEST_ALL_PATH_SELECTION = new AllPathSelection();
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);
133 private static final AsNumber AS = new AsNumber(Uint32.valueOf(72));
134 private static final AsNumber GLOBAL_AS = new AsNumber(Uint32.valueOf(73));
135 private static final List<AddressFamilies> FAMILIES;
136 private static final List<BgpTableType> TABLE_TYPES;
137 private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
138 private static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
141 FAMILIES = new ArrayList<>();
142 FAMILIES.add(new AddressFamiliesBuilder()
143 .setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
144 .setSendReceive(SendReceive.Both).build());
145 FAMILIES.add(new AddressFamiliesBuilder()
146 .setAfi(Ipv6AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
147 .setSendReceive(SendReceive.Send).build());
148 FAMILIES.add(new AddressFamiliesBuilder()
149 .setAfi(Ipv6AddressFamily.class).setSafi(MplsLabeledVpnSubsequentAddressFamily.class)
150 .setSendReceive(SendReceive.Receive).build());
151 TABLE_TYPES = new ArrayList<>();
152 TABLE_TYPES.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
153 TABLE_TYPES.add(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class));
154 AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
155 .addAugmentation(GlobalAddPathsConfig.class, new GlobalAddPathsConfigBuilder().setReceive(Boolean.TRUE)
156 .setSendMax(N_PATHS).build()).build());
157 AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
158 .addAugmentation(GlobalAddPathsConfig.class, new GlobalAddPathsConfigBuilder().setReceive(Boolean.TRUE)
159 .setSendMax(ALL_PATHS).build()).build());
163 private BGPTableTypeRegistryConsumer tableTypeRegistry;
169 public void setUp() {
171 doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV4))
172 .when(this.tableTypeRegistry).getTableType(IPV4UNICAST.class);
173 doReturn(java.util.Optional.of(BGP_TABLE_TYPE_IPV6))
174 .when(this.tableTypeRegistry).getTableType(IPV6UNICAST.class);
175 doReturn(java.util.Optional.of(new BgpTableTypeImpl(Ipv6AddressFamily.class,
176 MplsLabeledVpnSubsequentAddressFamily.class)))
177 .when(this.tableTypeRegistry).getTableType(IPV6LABELLEDUNICAST.class);
178 doReturn(java.util.Optional.of(IPV4UNICAST.class))
179 .when(this.tableTypeRegistry).getAfiSafiType(BGP_TABLE_TYPE_IPV4);
180 doReturn(java.util.Optional.of(IPV6UNICAST.class))
181 .when(this.tableTypeRegistry).getAfiSafiType(BGP_TABLE_TYPE_IPV6);
182 doReturn(AS).when(this.rib).getLocalAs();
186 public void testGetRibInstanceName() {
187 assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
191 public void testGetHoldTimer() {
192 assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
193 OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, null));
194 assertEquals(HOLDTIMER,
195 OpenConfigMappingUtil.getHoldTimer(new NeighborBuilder().build(), null));
197 assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
198 OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder().build()));
199 TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
200 .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setHoldTime(BigDecimal.TEN).build());
201 assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder()
202 .setTimers(builder.build()).build()));
206 public void testGetRemotePeerAs() {
207 final ConfigBuilder configBuilder = new ConfigBuilder();
208 assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), null, null));
209 assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), null,
210 this.rib.getLocalAs()));
212 assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(),
213 new PeerGroupBuilder().build(), null));
214 assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), new PeerGroupBuilder().build(),
215 this.rib.getLocalAs()));
217 assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(null, new PeerGroupBuilder()
218 .setConfig(new ConfigBuilder().setPeerAs(AS).build()).build(), null));
222 public void testGetLocalPeerAs() {
223 final ConfigBuilder configBuilder = new ConfigBuilder();
224 assertEquals(GLOBAL_AS,OpenConfigMappingUtil.getLocalPeerAs(null, GLOBAL_AS));
225 assertEquals(AS, OpenConfigMappingUtil.getLocalPeerAs(configBuilder.setLocalAs(AS).build(), GLOBAL_AS));
229 public void testIsActive() {
230 final TransportBuilder builder = new TransportBuilder();
231 assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(), null));
232 assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder()
233 .setTransport(builder.build()).build(), null));
235 final Transport activeFalse = builder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
236 .rev151009.bgp.neighbor.group.transport.ConfigBuilder().setPassiveMode(true).build()).build();
237 assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(activeFalse).build(),
240 assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(),
241 new PeerGroupBuilder().build()));
242 assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().build(),
243 new PeerGroupBuilder().setTransport(activeFalse).build()));
247 public void testGetRetryTimer() {
248 assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
249 OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, null));
250 assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
251 OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build(), null));
252 TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
253 .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setConnectRetry(BigDecimal.TEN).build());
254 assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder()
255 .setTimers(builder.build()).build(), null));
257 assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
258 OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, new PeerGroupBuilder().build()));
259 assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR,
260 new PeerGroupBuilder().setTimers(builder.build()).build()));
264 public void testGetNeighborKey() {
265 assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
266 OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
267 assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
268 assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder()
273 public void testGetNeighborInstanceIdentifier() {
274 assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
275 OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
280 public void testGetNeighborInstanceName() {
281 assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(), OpenConfigMappingUtil
282 .getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
286 public void testGetPort() {
287 final TransportBuilder transport = new TransportBuilder();
288 assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR, null));
289 assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder()
290 .setTransport(transport.build()).build(), null));
291 assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
292 transport.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
293 .group.transport.ConfigBuilder().build()).build()).build(), null));
294 final PortNumber newPort = new PortNumber(Uint16.valueOf(111));
295 final Config portConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
296 .group.transport.ConfigBuilder().addAugmentation(NeighborTransportConfig.class,
297 new NeighborTransportConfigBuilder().setRemotePort(newPort).build()).build();
298 assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
299 transport.setConfig(portConfig).build()).build(), null));
301 assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder()
302 .setTransport(transport.setConfig(portConfig).build()).build(), new PeerGroupBuilder().build()));
304 final Config portConfigGroup = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
305 .neighbor.group.transport.ConfigBuilder().addAugmentation(PeerGroupTransportConfig.class,
306 new PeerGroupTransportConfigBuilder().setRemotePort(newPort).build()).build();
307 assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().build(), new PeerGroupBuilder()
308 .setTransport(transport.setConfig(portConfigGroup).build()).build()));
312 public void testGetLocalAddress() {
313 assertNull(OpenConfigMappingUtil.getLocalAddress(null));
314 final TransportBuilder transport = new TransportBuilder();
315 assertNull(OpenConfigMappingUtil.getLocalAddress(transport.build()));
316 assertNull(OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
317 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
318 .ConfigBuilder().build()).build()));
319 assertEquals(new IpAddressNoZone(LOCAL_HOST), OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
320 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
321 .ConfigBuilder().setLocalAddress(new BgpNeighborTransportConfig
322 .LocalAddress(new IpAddress(new Ipv4Address(LOCAL_HOST.getValue())))).build()).build()));
326 public void testGetAfiSafiWithDefault() {
327 final ImmutableList<AfiSafi> defaultValue
328 = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
329 assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
330 final AfiSafis afiSafi = new AfiSafisBuilder().build();
331 assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
333 final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
334 .addAugmentation(NeighborAddPathsConfig.class,
335 new NeighborAddPathsConfigBuilder().setReceive(true).setSendMax(SHORT).build()).build();
336 final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
337 afiSafiIpv6List.add(afiSafiIpv6);
339 final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
340 expected.add(AFI_SAFI_IPV4);
341 assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
342 .setAfiSafi(afiSafiIpv6List).build(), true).get(0));
343 assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
344 OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(),
346 assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
348 assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
349 assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
350 assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
351 .setAfiSafi(afiSafiIpv6List).build(), false).get(0));
352 assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
356 public void testGetGlobalClusterIdentifier() {
357 final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
358 .ConfigBuilder configBuilder = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
359 .bgp.global.base.ConfigBuilder();
360 configBuilder.setRouterId(ROUTER_ID);
361 assertEquals(ROUTER_ID.getValue(),
362 OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
364 configBuilder.addAugmentation(GlobalConfigAugmentation.class, new GlobalConfigAugmentationBuilder()
365 .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
366 assertEquals(CLUSTER_ID.getValue(),
367 OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
371 public void testGetNeighborClusterIdentifier() {
373 assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, null));
375 final PeerGroupBuilder peerGroup = new PeerGroupBuilder();
376 assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, peerGroup.build()));
378 final RouteReflectorBuilder configBuilder = new RouteReflectorBuilder();
379 assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(), peerGroup.build()));
381 configBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
382 .group.route.reflector.ConfigBuilder()
383 .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
384 assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(),
385 peerGroup.build()).getValue());
387 assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(null,
388 peerGroup.setRouteReflector(configBuilder.build()).build()).getValue());
392 public void isAppNeighbor() {
393 assertFalse(OpenConfigMappingUtil.isApplicationPeer(new NeighborBuilder()
394 .setConfig(new ConfigBuilder().build()).build()));
395 final Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder()
396 .addAugmentation(NeighborPeerGroupConfig.class, new NeighborPeerGroupConfigBuilder()
397 .setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build()).build()).build();
398 assertTrue(OpenConfigMappingUtil.isApplicationPeer(neighbor));
402 public void toPathSelectionMode() {
403 final List<AfiSafi> families = new ArrayList<>();
404 families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
405 .addAugmentation(GlobalAddPathsConfig.class, new GlobalAddPathsConfigBuilder()
406 .setSendMax(N_PATHS).build()).build());
407 families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
408 .addAugmentation(GlobalAddPathsConfig.class, new GlobalAddPathsConfigBuilder()
409 .setSendMax(ALL_PATHS).build()).build());
410 final Map<BgpTableType, PathSelectionMode> result = OpenConfigMappingUtil
411 .toPathSelectionMode(families, this.tableTypeRegistry);
412 final Map<BgpTableType, PathSelectionMode> expected = new HashMap<>();
413 expected.put(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class),
414 ADD_PATH_BEST_N_PATH_SELECTION);
415 expected.put(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class),
416 ADD_PATH_BEST_ALL_PATH_SELECTION);
417 assertEquals(expected.get(0), result.get(0));
418 assertEquals(expected.get(1), result.get(1));
422 public void toPeerRole() {
423 Neighbor neighbor = new NeighborBuilder().setConfig(new ConfigBuilder()
424 .setPeerType(PeerType.EXTERNAL).build()).build();
425 PeerRole peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
426 Assert.assertEquals(PeerRole.Ebgp, peerRoleResult);
428 neighbor = new NeighborBuilder().setConfig(new ConfigBuilder().setPeerType(PeerType.INTERNAL).build()).build();
429 peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
430 Assert.assertEquals(PeerRole.Ibgp, peerRoleResult);
432 neighbor = new NeighborBuilder()
433 .setRouteReflector(new RouteReflectorBuilder().setConfig(
434 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
435 .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(true).build()).build()).build();
436 peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
437 Assert.assertEquals(PeerRole.RrClient, peerRoleResult);
441 public void toAddPathCapability() {
442 final List<AfiSafi> families = new ArrayList<>();
443 families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
444 .addAugmentation(NeighborAddPathsConfig.class,
445 new NeighborAddPathsConfigBuilder()
446 .setReceive(Boolean.TRUE).setSendMax(ALL_PATHS).build()).build());
447 families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
448 .addAugmentation(NeighborAddPathsConfig.class,
449 new NeighborAddPathsConfigBuilder()
450 .setReceive(Boolean.FALSE).setSendMax(N_PATHS).build()).build());
451 families.add(new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.class)
452 .addAugmentation(NeighborAddPathsConfig.class,
453 new NeighborAddPathsConfigBuilder().setReceive(Boolean.FALSE).build()).build());
454 final List<AddressFamilies> result = OpenConfigMappingUtil
455 .toAddPathCapability(families, this.tableTypeRegistry);
456 assertEquals(FAMILIES, result);
460 public void getGracefulRestartTimerTest() {
461 final int neighborTimer = 5;
462 final int peerGroupTimer = 10;
463 final Neighbor emptyNeighbor = new NeighborBuilder().build();
464 final PeerGroup emptyPeer = new PeerGroupBuilder().build();
465 Neighbor neighbor = new NeighborBuilder()
466 .setGracefulRestart(new GracefulRestartBuilder()
467 .setConfig(createGracefulConfig(Uint16.valueOf(neighborTimer)))
469 PeerGroup peerGroup = new PeerGroupBuilder()
470 .setGracefulRestart(new GracefulRestartBuilder()
471 .setConfig(createGracefulConfig(Uint16.valueOf(peerGroupTimer)))
473 // both timers present, pick peer group one
474 int timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, peerGroup, HOLDTIMER);
475 assertEquals(peerGroupTimer, timer);
477 // peer group missing graceful restart, use neighbor timer
478 timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, emptyPeer, HOLDTIMER);
479 assertEquals(neighborTimer, timer);
481 // graceful restart enabled but timer not set, use hold time
482 peerGroup = new PeerGroupBuilder()
483 .setGracefulRestart(new GracefulRestartBuilder()
484 .setConfig(createGracefulConfig(null))
486 timer = OpenConfigMappingUtil.getGracefulRestartTimer(emptyNeighbor, peerGroup, HOLDTIMER);
487 assertEquals(HOLDTIMER, timer);
490 private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
491 .restart.Config createGracefulConfig(final Uint16 restartTimer) {
492 return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
493 .restart.ConfigBuilder().setRestartTime(restartTimer).build();
497 public void getRevisedErrorHandlingTest() {
498 final NeighborBuilder neighbor = new NeighborBuilder();
499 final PeerGroupBuilder peerGroup = new PeerGroupBuilder();
500 final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.error.handling
501 .ConfigBuilder errorHandlingConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
502 .rev151009.bgp.neighbor.group.error.handling.ConfigBuilder();
503 // error handling not set -> null
504 assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
506 // error handling for peer group disabled, neighbor not set -> null
507 peerGroup.setErrorHandling(new ErrorHandlingBuilder()
508 .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
510 assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
512 // error handling for peer group enabled, neighbor not set, Igp -> error handling for internal peer
513 peerGroup.setErrorHandling(new ErrorHandlingBuilder()
514 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
516 assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
517 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
518 // error handling for peer group enabled, neighbor disabled -> null
519 neighbor.setErrorHandling(new ErrorHandlingBuilder()
520 .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
522 assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
524 // error handling for peer group enabled, neighbor enabled, Igb -> error handling for internal peer
525 neighbor.setErrorHandling(new ErrorHandlingBuilder()
526 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
528 assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
529 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
530 // error handling for peer group enabled, neighbor enabled, Egb -> error handling for external peer
531 neighbor.setErrorHandling(new ErrorHandlingBuilder()
532 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
534 assertEquals(RevisedErrorHandlingSupportImpl.forExternalPeer(),
535 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ebgp, peerGroup.build(), neighbor.build()));