2 * Copyright (c) 2018 AT&T Intellectual Property. 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 org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.MockitoAnnotations.initMocks;
16 import com.google.common.collect.ImmutableList;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.List;
23 import java.util.Optional;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
29 import org.opendaylight.protocol.bgp.parser.BgpExtendedMessageUtil;
30 import org.opendaylight.protocol.bgp.parser.spi.MultiprotocolCapabilitiesUtil;
31 import org.opendaylight.protocol.bgp.rib.impl.BgpPeerUtil;
32 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
33 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.GracefulRestartBuilder;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.ConfigBuilder;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4LABELLEDUNICAST;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.Config1;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.Config1Builder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.afi.safi.ll.graceful.restart.LlGracefulRestartBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParameters;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilities;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParameters;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.GracefulRestartCapability;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapability;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.graceful.restart.capability.Tables;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.uint24.rev200104.Uint24;
55 import org.opendaylight.yangtools.yang.common.Uint32;
57 public class GracefulRestartUtilTest {
59 private static final int RESTART_TIME = 5;
60 private static final int STALE_TIME = 10;
61 private static final boolean RESTARTING = true;
62 private static final AfiSafi IPV4_UNICAST_AFISAFI = new AfiSafiBuilder()
63 .setAfiSafiName(IPV4UNICAST.class)
64 .setGracefulRestart(new GracefulRestartBuilder()
65 .setConfig(new ConfigBuilder()
67 .build()).build()).build();
68 private static final AfiSafi IPV4_MULTICAST_AFISAFI = new AfiSafiBuilder()
69 .setAfiSafiName(IPV4LABELLEDUNICAST.class)
70 .setGracefulRestart(new GracefulRestartBuilder()
71 .setConfig(new ConfigBuilder()
73 .build()).build()).build();
74 private static final AfiSafi IPV6_AFISAFI = new AfiSafiBuilder()
75 .setAfiSafiName(IPV6UNICAST.class)
76 .setGracefulRestart(new GracefulRestartBuilder()
77 .setConfig(new ConfigBuilder()
79 .build()).build()).build();
80 private static final TablesKey IPV4_KEY = new TablesKey(Ipv4AddressFamily.class,
81 UnicastSubsequentAddressFamily.class);
82 private static final TablesKey IPV6_KEY = new TablesKey(Ipv6AddressFamily.class,
83 UnicastSubsequentAddressFamily.class);
85 private static final List<AfiSafi> AFISAFIS = ImmutableList.of(IPV4_UNICAST_AFISAFI, IPV4_MULTICAST_AFISAFI,
89 private BGPTableTypeRegistryConsumer tableRegistry;
95 doReturn(Optional.of(IPV4_KEY)).when(tableRegistry).getTableKey(IPV4UNICAST.class);
96 doReturn(Optional.of(IPV6_KEY)).when(tableRegistry).getTableKey(IPV6UNICAST.class);
100 public void getGracefulCapabilityTest() {
101 final Map<TablesKey, Boolean> gracefulMap = new HashMap<>();
102 gracefulMap.put(IPV4_KEY, true);
103 gracefulMap.put(IPV6_KEY, false);
104 CParameters capability = GracefulRestartUtil.getGracefulCapability(gracefulMap, RESTART_TIME, RESTARTING);
105 final CParameters1 params = capability.augmentation(CParameters1.class);
106 assertNotNull(params);
107 final GracefulRestartCapability gracefulCapability = params.getGracefulRestartCapability();
108 assertNotNull(gracefulCapability);
109 assertTrue(gracefulCapability.getRestartFlags().isRestartState());
110 assertEquals(RESTART_TIME, gracefulCapability.getRestartTime().intValue());
111 final List<Tables> tables = gracefulCapability.getTables();
112 assertNotNull(tables);
113 assertEquals(2, tables.size());
114 tables.forEach(table -> {
115 assertTrue(isSameKey(IPV4_KEY, table.key()) && table.getAfiFlags().isForwardingState()
116 || isSameKey(IPV6_KEY, table.key()) && !table.getAfiFlags().isForwardingState());
121 public void getGracefulTablesTest() {
122 final Set<TablesKey> gracefulTables = GracefulRestartUtil.getGracefulTables(AFISAFIS, tableRegistry);
123 assertEquals(2, gracefulTables.size());
124 assertTrue(gracefulTables.contains(IPV4_KEY));
125 assertTrue(gracefulTables.contains(IPV6_KEY));
129 public void getGracefulBgpParametersTest() {
130 final OptionalCapabilities cap1 = new OptionalCapabilitiesBuilder()
131 .setCParameters(BgpExtendedMessageUtil.EXTENDED_MESSAGE_CAPABILITY).build();
132 final OptionalCapabilities cap2 = new OptionalCapabilitiesBuilder()
133 .setCParameters(MultiprotocolCapabilitiesUtil.RR_CAPABILITY).build();
134 final List<OptionalCapabilities> fixedCaps = new ArrayList<>();
137 final Set<TablesKey> gracefulTables = new HashSet<>();
138 gracefulTables.add(IPV4_KEY);
139 gracefulTables.add(IPV6_KEY);
140 final Set<TablesKey> preservedTables = new HashSet<>();
141 preservedTables.add(IPV4_KEY);
143 final Map<TablesKey, Boolean> gracefulMap = new HashMap<>();
144 gracefulMap.put(IPV4_KEY, true);
145 gracefulMap.put(IPV6_KEY, false);
146 final OptionalCapabilities expectedGracefulCapability = new OptionalCapabilitiesBuilder()
147 .setCParameters(GracefulRestartUtil.getGracefulCapability(gracefulMap, RESTART_TIME, RESTARTING))
149 final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulDTOs = Collections.singleton(
150 new BgpPeerUtil.LlGracefulRestartDTO(IPV4_KEY, STALE_TIME, true));
151 final OptionalCapabilities expectedLlGracefulCapability = new OptionalCapabilitiesBuilder()
152 .setCParameters(GracefulRestartUtil.getLlGracefulCapability(llGracefulDTOs))
154 final BgpParameters parameters = GracefulRestartUtil.getGracefulBgpParameters(fixedCaps, gracefulTables,
155 preservedTables, RESTART_TIME, RESTARTING, llGracefulDTOs);
156 final List<OptionalCapabilities> capabilities = parameters.getOptionalCapabilities();
157 assertTrue(capabilities != null);
158 assertEquals(4, capabilities.size());
159 assertTrue(capabilities.contains(cap1));
160 assertTrue(capabilities.contains(cap2));
161 assertTrue(capabilities.contains(expectedGracefulCapability));
162 assertTrue(capabilities.contains(expectedLlGracefulCapability));
166 public void getLlGracefulCapabilityTest() {
167 final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulRestartDTOs = new HashSet<>();
168 llGracefulRestartDTOs.add(new BgpPeerUtil.LlGracefulRestartDTO(IPV4_KEY, STALE_TIME, true));
169 llGracefulRestartDTOs.add(new BgpPeerUtil.LlGracefulRestartDTO(IPV6_KEY, STALE_TIME, false));
170 CParameters capability = GracefulRestartUtil.getLlGracefulCapability(llGracefulRestartDTOs);
171 final CParameters1 params = capability.augmentation(CParameters1.class);
172 assertNotNull(params);
173 final LlGracefulRestartCapability llGracefulCapability = params.getLlGracefulRestartCapability();
174 assertNotNull(llGracefulCapability);
175 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp
176 .capabilities.ll.graceful.restart.capability.Tables> tables = llGracefulCapability.getTables();
177 assertNotNull(tables);
178 assertEquals(2, tables.size());
179 assertEquals(STALE_TIME, tables.get(0).getLongLivedStaleTime().getValue().intValue());
180 tables.forEach(table -> {
181 assertTrue(isSameKey(IPV4_KEY, table.key()) && table.getAfiFlags().isForwardingState()
182 || isSameKey(IPV6_KEY, table.key()) && !table.getAfiFlags().isForwardingState());
187 public void getLlGracefulTimersTest() {
188 final List<AfiSafi> afiSafi = new ArrayList<>();
189 afiSafi.add(new AfiSafiBuilder()
190 .setAfiSafiName(IPV4UNICAST.class)
191 .setGracefulRestart(new GracefulRestartBuilder()
192 .setConfig(new ConfigBuilder()
193 .addAugmentation(Config1.class, new Config1Builder()
194 .setLlGracefulRestart(new LlGracefulRestartBuilder()
195 .setConfig(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll
196 .graceful.restart.rev181112.afi.safi.ll.graceful.restart.ll.graceful.restart
197 .ConfigBuilder().setLongLivedStaleTime(new Uint24(Uint32.valueOf(STALE_TIME))).build())
203 final Map<TablesKey, Integer> llGracefulTimers = GracefulRestartUtil.getLlGracefulTimers(afiSafi,
205 assertNotNull(llGracefulTimers);
206 assertEquals(1, llGracefulTimers.size());
207 assertEquals(STALE_TIME, llGracefulTimers.get(IPV4_KEY).intValue());
210 private static boolean isSameKey(final TablesKey key1, final org.opendaylight.yang.gen.v1.urn.opendaylight.params
211 .xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.graceful.restart.capability.TablesKey key2) {
212 return key1.getAfi() == key2.getAfi() && key1.getSafi() == key2.getSafi();
215 private static boolean isSameKey(final TablesKey key1, final org.opendaylight.yang.gen.v1.urn.opendaylight.params
216 .xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey key2) {
217 return key1.getAfi() == key2.getAfi() && key1.getSafi() == key2.getSafi();