Bump upstreams
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / config / GracefulRestartUtilTest.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. 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 package org.opendaylight.protocol.bgp.rib.impl.config;
9
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
15 import com.google.common.collect.ImmutableList;
16 import java.util.ArrayList;
17 import java.util.Collections;
18 import java.util.HashMap;
19 import java.util.HashSet;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Set;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
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.ietf.params.xml.ns.yang.ietf.routing.types.rev171204.Uint24;
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.rib.rev180329.rib.TablesKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
53 import org.opendaylight.yangtools.yang.common.Uint32;
54
55 @RunWith(MockitoJUnitRunner.StrictStubs.class)
56 public class GracefulRestartUtilTest {
57
58     private static final int RESTART_TIME = 5;
59     private static final int STALE_TIME = 10;
60     private static final boolean RESTARTING = true;
61     private static final AfiSafi IPV4_UNICAST_AFISAFI = new AfiSafiBuilder()
62             .setAfiSafiName(IPV4UNICAST.VALUE)
63             .setGracefulRestart(new GracefulRestartBuilder()
64                     .setConfig(new ConfigBuilder()
65                             .setEnabled(true)
66                             .build()).build()).build();
67     private static final AfiSafi IPV4_MULTICAST_AFISAFI = new AfiSafiBuilder()
68             .setAfiSafiName(IPV4LABELLEDUNICAST.VALUE)
69             .setGracefulRestart(new GracefulRestartBuilder()
70                     .setConfig(new ConfigBuilder()
71                             .setEnabled(false)
72                             .build()).build()).build();
73     private static final AfiSafi IPV6_AFISAFI = new AfiSafiBuilder()
74             .setAfiSafiName(IPV6UNICAST.VALUE)
75             .setGracefulRestart(new GracefulRestartBuilder()
76                     .setConfig(new ConfigBuilder()
77                             .setEnabled(true)
78                             .build()).build()).build();
79     private static final TablesKey IPV4_KEY = new TablesKey(Ipv4AddressFamily.VALUE,
80             UnicastSubsequentAddressFamily.VALUE);
81     private static final TablesKey IPV6_KEY = new TablesKey(Ipv6AddressFamily.VALUE,
82             UnicastSubsequentAddressFamily.VALUE);
83
84     private static final List<AfiSafi> AFISAFIS = ImmutableList.of(IPV4_UNICAST_AFISAFI, IPV4_MULTICAST_AFISAFI,
85         IPV6_AFISAFI);
86
87     @Mock
88     private BGPTableTypeRegistryConsumer tableRegistry;
89
90
91     @Before
92     public void setUp() {
93         doReturn(IPV4_KEY).when(tableRegistry).getTableKey(IPV4UNICAST.VALUE);
94         doReturn(IPV6_KEY).when(tableRegistry).getTableKey(IPV6UNICAST.VALUE);
95     }
96
97     @Test
98     public void getGracefulCapabilityTest() {
99         final Map<TablesKey, Boolean> gracefulMap = new HashMap<>();
100         gracefulMap.put(IPV4_KEY, true);
101         gracefulMap.put(IPV6_KEY, false);
102         CParameters capability = GracefulRestartUtil.getGracefulCapability(gracefulMap, RESTART_TIME, RESTARTING);
103         final CParameters1 params = capability.augmentation(CParameters1.class);
104         assertNotNull(params);
105         final GracefulRestartCapability gracefulCapability = params.getGracefulRestartCapability();
106         assertNotNull(gracefulCapability);
107         assertTrue(gracefulCapability.getRestartFlags().getRestartState());
108         assertEquals(RESTART_TIME, gracefulCapability.getRestartTime().intValue());
109         final var tables = gracefulCapability.getTables();
110         assertNotNull(tables);
111         assertEquals(2, tables.size());
112         tables.values().forEach(table -> {
113             assertTrue(isSameKey(IPV4_KEY, table.key()) && table.getAfiFlags().getForwardingState()
114                 || isSameKey(IPV6_KEY, table.key()) && !table.getAfiFlags().getForwardingState());
115         });
116     }
117
118     @Test
119     public void getGracefulTablesTest() {
120         final Set<TablesKey> gracefulTables = GracefulRestartUtil.getGracefulTables(AFISAFIS, tableRegistry);
121         assertEquals(2, gracefulTables.size());
122         assertTrue(gracefulTables.contains(IPV4_KEY));
123         assertTrue(gracefulTables.contains(IPV6_KEY));
124     }
125
126     @Test
127     public void getGracefulBgpParametersTest() {
128         final OptionalCapabilities cap1 = new OptionalCapabilitiesBuilder()
129                 .setCParameters(BgpExtendedMessageUtil.EXTENDED_MESSAGE_CAPABILITY).build();
130         final OptionalCapabilities cap2 = new OptionalCapabilitiesBuilder()
131                 .setCParameters(MultiprotocolCapabilitiesUtil.RR_CAPABILITY).build();
132         final List<OptionalCapabilities> fixedCaps = new ArrayList<>();
133         fixedCaps.add(cap1);
134         fixedCaps.add(cap2);
135         final Set<TablesKey> gracefulTables = new HashSet<>();
136         gracefulTables.add(IPV4_KEY);
137         gracefulTables.add(IPV6_KEY);
138         final Set<TablesKey> preservedTables = new HashSet<>();
139         preservedTables.add(IPV4_KEY);
140
141         final Map<TablesKey, Boolean> gracefulMap = new HashMap<>();
142         gracefulMap.put(IPV4_KEY, true);
143         gracefulMap.put(IPV6_KEY, false);
144         final OptionalCapabilities expectedGracefulCapability = new OptionalCapabilitiesBuilder()
145                 .setCParameters(GracefulRestartUtil.getGracefulCapability(gracefulMap, RESTART_TIME, RESTARTING))
146                 .build();
147         final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulDTOs = Collections.singleton(
148                 new BgpPeerUtil.LlGracefulRestartDTO(IPV4_KEY, STALE_TIME, true));
149         final OptionalCapabilities expectedLlGracefulCapability = new OptionalCapabilitiesBuilder()
150                 .setCParameters(GracefulRestartUtil.getLlGracefulCapability(llGracefulDTOs))
151                 .build();
152         final BgpParameters parameters = GracefulRestartUtil.getGracefulBgpParameters(fixedCaps, gracefulTables,
153                 preservedTables, RESTART_TIME, RESTARTING, llGracefulDTOs);
154         final List<OptionalCapabilities> capabilities = parameters.getOptionalCapabilities();
155         assertTrue(capabilities != null);
156         assertEquals(4, capabilities.size());
157         assertTrue(capabilities.contains(cap1));
158         assertTrue(capabilities.contains(cap2));
159         assertTrue(capabilities.contains(expectedGracefulCapability));
160         assertTrue(capabilities.contains(expectedLlGracefulCapability));
161     }
162
163     @Test
164     public void getLlGracefulCapabilityTest() {
165         final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulRestartDTOs = new HashSet<>();
166         llGracefulRestartDTOs.add(new BgpPeerUtil.LlGracefulRestartDTO(IPV4_KEY, STALE_TIME, true));
167         llGracefulRestartDTOs.add(new BgpPeerUtil.LlGracefulRestartDTO(IPV6_KEY, STALE_TIME, false));
168         CParameters capability = GracefulRestartUtil.getLlGracefulCapability(llGracefulRestartDTOs);
169         final CParameters1 params = capability.augmentation(CParameters1.class);
170         assertNotNull(params);
171         final LlGracefulRestartCapability llGracefulCapability = params.getLlGracefulRestartCapability();
172         assertNotNull(llGracefulCapability);
173         final var tables = llGracefulCapability.getTables();
174         assertNotNull(tables);
175         assertEquals(2, tables.size());
176         assertEquals(STALE_TIME, tables.values().iterator().next().getLongLivedStaleTime().getValue().intValue());
177         tables.values().forEach(table -> {
178             assertTrue(isSameKey(IPV4_KEY, table.key()) && table.getAfiFlags().getForwardingState()
179                 || isSameKey(IPV6_KEY, table.key()) && !table.getAfiFlags().getForwardingState());
180         });
181     }
182
183     @Test
184     public void getLlGracefulTimersTest() {
185         final List<AfiSafi> afiSafi = new ArrayList<>();
186         afiSafi.add(new AfiSafiBuilder()
187             .setAfiSafiName(IPV4UNICAST.VALUE)
188             .setGracefulRestart(new GracefulRestartBuilder()
189                 .setConfig(new ConfigBuilder()
190                     .addAugmentation(new Config1Builder()
191                         .setLlGracefulRestart(new LlGracefulRestartBuilder()
192                             .setConfig(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll
193                                 .graceful.restart.rev181112.afi.safi.ll.graceful.restart.ll.graceful.restart
194                                 .ConfigBuilder().setLongLivedStaleTime(new Uint24(Uint32.valueOf(STALE_TIME))).build())
195                             .build())
196                         .build())
197                     .build())
198                 .build())
199             .build());
200         final Map<TablesKey, Integer> llGracefulTimers = GracefulRestartUtil.getLlGracefulTimers(afiSafi,
201             tableRegistry);
202         assertNotNull(llGracefulTimers);
203         assertEquals(1, llGracefulTimers.size());
204         assertEquals(STALE_TIME, llGracefulTimers.get(IPV4_KEY).intValue());
205     }
206
207     private static boolean isSameKey(final TablesKey key1, final org.opendaylight.yang.gen.v1.urn.opendaylight.params
208             .xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.graceful.restart.capability.TablesKey key2) {
209         return key1.getAfi() == key2.getAfi() && key1.getSafi() == key2.getSafi();
210     }
211
212     private static boolean isSameKey(final TablesKey key1, final org.opendaylight.yang.gen.v1.urn.opendaylight.params
213             .xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey key2) {
214         return key1.getAfi() == key2.getAfi() && key1.getSafi() == key2.getSafi();
215     }
216 }