Use a switch expression in NeighborUtil
[bgpcep.git] / bgp / openconfig-state / src / main / java / org / opendaylight / protocol / bgp / state / NeighborUtil.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.state;
10
11 import com.google.common.collect.ImmutableSet;
12 import com.google.common.primitives.UnsignedInteger;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Objects;
17 import java.util.Set;
18 import org.eclipse.jdt.annotation.NonNull;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
21 import org.opendaylight.protocol.bgp.rib.spi.state.BGPAfiSafiState;
22 import org.opendaylight.protocol.bgp.rib.spi.state.BGPErrorHandlingState;
23 import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
24 import org.opendaylight.protocol.bgp.rib.spi.state.BGPLlGracelfulRestartState;
25 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
26 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
27 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
28 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
29 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
30 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
31 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
32 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiKey;
33 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState.SessionState;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
39 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandling;
40 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
41 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.State;
42 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.StateBuilder;
43 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
44 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ADDPATHS;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ASN32;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpCapability;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.BgpNeighborStateAugmentation;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.BgpNeighborStateAugmentationBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiGracefulRestartStateAugmentation;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiStateAugmentationBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborErrorHandlingStateAugmentation;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborErrorHandlingStateAugmentationBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborGracefulRestartStateAugmentation;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborGracefulRestartStateAugmentationBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborStateAugmentation;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborStateAugmentationBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTimersStateAugmentationBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTransportStateAugmentationBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.MessagesBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.Received;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.ReceivedBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.Sent;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.SentBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
81 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
82 import org.opendaylight.yangtools.yang.common.Decimal64;
83 import org.opendaylight.yangtools.yang.common.Uint16;
84 import org.opendaylight.yangtools.yang.common.Uint32;
85 import org.opendaylight.yangtools.yang.common.Uint64;
86
87 /**
88  * Util for create OpenConfig Neighbor with corresponding openConfig state.
89  */
90 public final class NeighborUtil {
91     private static final long TIMETICK_ROLLOVER_VALUE = UnsignedInteger.MAX_VALUE.longValue() + 1;
92
93     private NeighborUtil() {
94         // Hidden on purpose
95     }
96
97     /**
98      * Build a Openconfig Neighbors container with all Neighbors Stats from a list of
99      * BGPPeerGroupState.
100      *
101      * @param peerStats            List of BGPPeerState containing Neighbor state counters
102      * @param bgpTableTypeRegistry BGP TableType Registry
103      * @return Openconfig Neighbors Stats
104      */
105     public static @Nullable Neighbors buildNeighbors(final @NonNull List<BGPPeerState> peerStats,
106             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
107         if (peerStats.isEmpty()) {
108             return null;
109         }
110         return new NeighborsBuilder().setNeighbor(peerStats.stream()
111                 .filter(Objects::nonNull)
112                 .map(neighbor -> buildNeighbor(neighbor, bgpTableTypeRegistry))
113                 .collect(BindingMap.toMap())).build();
114     }
115
116     /**
117      * Build a list of neighbors containing Operational State from a list of BGPPeerState.
118      *
119      * @param neighbor containing Neighbor state counters
120      * @return neighbor containing Neighbor State
121      */
122     public static @NonNull Neighbor buildNeighbor(final @NonNull BGPPeerState neighbor,
123             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
124         return new NeighborBuilder()
125                 .setNeighborAddress(convertIpAddress(neighbor.getNeighborAddress()))
126                 .setState(buildNeighborState(neighbor.getBGPSessionState(), neighbor.getBGPPeerMessagesState()))
127                 .setTimers(buildTimer(neighbor.getBGPTimersState()))
128                 .setTransport(buildTransport(neighbor.getBGPTransportState()))
129                 .setErrorHandling(buildErrorHandling(neighbor.getBGPErrorHandlingState()))
130                 .setGracefulRestart(buildGracefulRestart(neighbor.getBGPGracelfulRestart()))
131                 .setAfiSafis(buildAfisSafis(neighbor, bgpTableTypeRegistry))
132                 .build();
133     }
134
135     private static IpAddress convertIpAddress(final IpAddressNoZone addr) {
136         if (addr == null) {
137             return null;
138         }
139         final Ipv4AddressNoZone ipv4 = addr.getIpv4AddressNoZone();
140         if (ipv4 != null) {
141             return new IpAddress(ipv4);
142         }
143         return new IpAddress(addr.getIpv6AddressNoZone());
144     }
145
146     /**
147      * Builds Neighbor State from BGPPeerState counters.
148      *
149      * @param sessionState         BGPPeerState containing Operational state counters
150      * @param bgpPeerMessagesState message state
151      * @return Neighbor State
152      */
153     public static @Nullable State buildNeighborState(final @Nullable BGPSessionState sessionState,
154             final BGPPeerMessagesState bgpPeerMessagesState) {
155         if (sessionState == null && bgpPeerMessagesState == null) {
156             return null;
157         }
158         final StateBuilder builder = new StateBuilder();
159         if (sessionState != null) {
160             builder.addAugmentation(buildCapabilityState(sessionState));
161         }
162         if (bgpPeerMessagesState != null) {
163             builder.addAugmentation(buildMessageState(bgpPeerMessagesState));
164         }
165         return builder.build();
166     }
167
168     /**
169      * Builds Neighbor State from BGPPeerState counters.
170      *
171      * @param neighbor BGPPeerState containing Operational state counters
172      * @return Timer State
173      */
174     public static @Nullable Timers buildTimer(final @Nullable BGPTimersState neighbor) {
175         if (neighbor == null) {
176             return null;
177         }
178         // convert neighbor uptime which is in milliseconds to time-ticks which is
179         // hundredth of a second, and handle roll-over scenario
180         final long uptimeTicks = neighbor.getUpTime() / 10 % TIMETICK_ROLLOVER_VALUE;
181
182         return new TimersBuilder()
183                 .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
184                     .timers.StateBuilder()
185                         .addAugmentation(new NeighborTimersStateAugmentationBuilder()
186                             .setNegotiatedHoldTime(Decimal64.valueOf(2, neighbor.getNegotiatedHoldTime()))
187                             .setUptime(new Timeticks(Uint32.valueOf(uptimeTicks))).build())
188                         .build())
189                 .build();
190     }
191
192     /**
193      * Builds Transport State from BGPTransportState counters.
194      *
195      * @param neighbor BGPPeerState containing Operational state counters
196      * @return Transport State
197      */
198     public static @Nullable Transport buildTransport(final @Nullable BGPTransportState neighbor) {
199         if (neighbor == null) {
200             return null;
201         }
202
203         return new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
204                 .bgp.neighbor.group.transport.StateBuilder()
205                     .addAugmentation(new NeighborTransportStateAugmentationBuilder()
206                         .setLocalPort(neighbor.getLocalPort())
207                         .setRemoteAddress(convertIpAddress(neighbor.getRemoteAddress()))
208                         .setRemotePort(neighbor.getRemotePort())
209                         .build())
210                     .build())
211                 .build();
212     }
213
214     /**
215      * Builds Error Handling State from BGPPeerState counters.
216      *
217      * @param errorHandlingState BGPErrorHandlingState containing ErrorHandlingState Operational state counters
218      * @return Error Handling State
219      */
220     public static ErrorHandling buildErrorHandling(final @Nullable BGPErrorHandlingState errorHandlingState) {
221         if (errorHandlingState == null) {
222             return null;
223         }
224         return new ErrorHandlingBuilder()
225                 .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
226                     .error.handling.StateBuilder()
227                         .addAugmentation(buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount()))
228                         .build())
229                 .build();
230     }
231
232     /**
233      * Builds Graceful Restart containing Graceful Restart State from BGPGracelfulRestartState counters.
234      *
235      * @param neighbor BGPPeerState containing Operational state counters
236      * @return Graceful Restart
237      */
238     public static @NonNull GracefulRestart buildGracefulRestart(final @NonNull BGPGracelfulRestartState neighbor) {
239         final NeighborGracefulRestartStateAugmentation gracefulRestartState =
240                 new NeighborGracefulRestartStateAugmentationBuilder()
241                         .setLocalRestarting(neighbor.isLocalRestarting())
242                         .setPeerRestartTime(Uint16.valueOf(neighbor.getPeerRestartTime()))
243                         .setMode(neighbor.getMode())
244                         .setPeerRestarting(neighbor.isPeerRestarting()).build();
245
246         return new GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
247                 .rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
248                 .addAugmentation(gracefulRestartState).build()).build();
249     }
250
251     /**
252      * Builds  Neighbor Afi Safi containing AfiSafi State.
253      *
254      * @param neighbor BGPPeerState containing Operational state counters
255      * @return Afi Safis
256      */
257     public static AfiSafis buildAfisSafis(final @NonNull BGPPeerState neighbor,
258             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
259         return new AfiSafisBuilder().setAfiSafi(buildAfisSafisState(neighbor.getBGPAfiSafiState(),
260                 bgpTableTypeRegistry)).build();
261     }
262
263     /**
264      * Builds  Neighbor State containing Capabilities State, session State.
265      *
266      * @return Neighbor State
267      */
268     public static NeighborStateAugmentation buildCapabilityState(final @NonNull BGPSessionState neighbor) {
269         final var state = switch (neighbor.getSessionState()) {
270             case IDLE -> SessionState.IDLE;
271             case UP -> SessionState.ESTABLISHED;
272             case OPEN_CONFIRM -> SessionState.OPENCONFIRM;
273         };
274         return new NeighborStateAugmentationBuilder()
275             .setSupportedCapabilities(buildSupportedCapabilities(neighbor))
276             .setSessionState(state)
277             .build();
278     }
279
280     /**
281      * Builds Bgp Neighbor State containing Message State.
282      *
283      * @return BgpNeighborState containing Message State
284      */
285     public static @NonNull BgpNeighborStateAugmentation buildMessageState(
286             final @NonNull BGPPeerMessagesState neighbor) {
287         return new BgpNeighborStateAugmentationBuilder()
288                 .setMessages(new MessagesBuilder()
289                         .setReceived(buildMessagesReceived(neighbor))
290                         .setSent(buildMessagesSent(neighbor)).build()).build();
291     }
292
293     private static Received buildMessagesReceived(final @NonNull BGPPeerMessagesState neighbor) {
294         return new ReceivedBuilder()
295                 .setUPDATE(Uint64.valueOf(neighbor.getUpdateMessagesReceivedCount()))
296                 .setNOTIFICATION(Uint64.valueOf(neighbor.getNotificationMessagesReceivedCount()))
297                 .build();
298     }
299
300     private static Sent buildMessagesSent(final @NonNull BGPPeerMessagesState neighbor) {
301         return new SentBuilder()
302                 .setUPDATE(Uint64.valueOf(neighbor.getUpdateMessagesSentCount()))
303                 .setNOTIFICATION(Uint64.valueOf(neighbor.getNotificationMessagesSentCount()))
304                 .build();
305     }
306
307     /**
308      * Builds Neighbor Error Handling State.
309      *
310      * @param erroneousUpdateCount erroneous Update Count
311      * @return Error Handling State
312      */
313     public static @NonNull NeighborErrorHandlingStateAugmentation buildErrorHandlingState(
314             final long erroneousUpdateCount) {
315         return new NeighborErrorHandlingStateAugmentationBuilder()
316                 .setErroneousUpdateMessages(saturatedUint32(erroneousUpdateCount)).build();
317     }
318
319     /**
320      * Build List of afi safi containing State per Afi Safi.
321      *
322      * @return AfiSafi List
323      */
324     public static @NonNull Map<AfiSafiKey, AfiSafi> buildAfisSafisState(final @NonNull BGPAfiSafiState neighbor,
325             final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
326         final Set<TablesKey> afiSafiJoin = new HashSet<>(neighbor.getAfiSafisAdvertized());
327         afiSafiJoin.addAll(neighbor.getAfiSafisReceived());
328         return afiSafiJoin.stream().map(tableKey -> buildAfiSafi(neighbor, tableKey, bgpTableTypeRegistry))
329                 .filter(Objects::nonNull)
330                 .collect(BindingMap.toMap());
331     }
332
333     private static @Nullable AfiSafi buildAfiSafi(final @NonNull BGPAfiSafiState neighbor,
334             final @NonNull TablesKey tablesKey, final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
335         final AfiSafiType afiSafi = bgpTableTypeRegistry.getAfiSafiType(tablesKey);
336         return afiSafi == null ? null : new AfiSafiBuilder()
337             .setAfiSafiName(afiSafi)
338             .setState(buildAfiSafiState(neighbor, tablesKey, neighbor.isAfiSafiSupported(tablesKey)))
339             .setGracefulRestart(buildAfiSafiGracefulRestartState(neighbor, tablesKey))
340             .build();
341     }
342
343     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
344             .safi.list.afi.safi.State buildAfiSafiState(final @NonNull BGPAfiSafiState neighbor,
345             final @NonNull TablesKey tablesKey, final boolean afiSafiSupported) {
346         final NeighborAfiSafiStateAugmentationBuilder builder = new NeighborAfiSafiStateAugmentationBuilder();
347         builder.setActive(afiSafiSupported);
348         if (afiSafiSupported) {
349             builder.setPrefixes(new PrefixesBuilder()
350                     .setInstalled(saturatedUint32(neighbor.getPrefixesInstalledCount(tablesKey)))
351                     .setReceived(saturatedUint32(neighbor.getPrefixesReceivedCount(tablesKey)))
352                     .setSent(saturatedUint32(neighbor.getPrefixesSentCount(tablesKey))).build());
353         }
354         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
355                 .safi.list.afi.safi.StateBuilder().addAugmentation(builder.build()).build();
356     }
357
358     // FIXME: remove this with YANGTOOLS-5.0.7+
359     private static Uint32 saturatedUint32(final long value) {
360         return value < 4294967295L ? Uint32.valueOf(value) : Uint32.MAX_VALUE;
361     }
362
363     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
364             .safi.list.afi.safi.GracefulRestart buildAfiSafiGracefulRestartState(
365             final @NonNull BGPLlGracelfulRestartState neighbor, final @NonNull TablesKey tablesKey) {
366         final NeighborAfiSafiGracefulRestartStateAugmentation builder =
367                 new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
368                         .setAdvertised(neighbor.isGracefulRestartAdvertized(tablesKey))
369                         .setReceived(neighbor.isGracefulRestartReceived(tablesKey))
370                         .setLlAdvertised(neighbor.isLlGracefulRestartAdvertised(tablesKey))
371                         .setLlReceived(neighbor.isLlGracefulRestartReceived(tablesKey))
372                         .setLlStaleTimer(Uint32.valueOf(neighbor.getLlGracefulRestartTimer(tablesKey))).build();
373         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
374                 .safi.list.afi.safi.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
375                 .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder()
376                 .addAugmentation(builder).build()).build();
377     }
378
379     /**
380      * Builds List of BgpCapability supported capabilities.
381      *
382      * @return List containing supported capabilities
383      */
384     public static @NonNull Set<BgpCapability> buildSupportedCapabilities(final @NonNull BGPSessionState neighbor) {
385         final var supportedCapabilities = ImmutableSet.<BgpCapability>builder();
386         if (neighbor.isAddPathCapabilitySupported()) {
387             supportedCapabilities.add(ADDPATHS.VALUE);
388         }
389         if (neighbor.isAsn32CapabilitySupported()) {
390             supportedCapabilities.add(ASN32.VALUE);
391         }
392         if (neighbor.isGracefulRestartCapabilitySupported()) {
393             supportedCapabilities.add(GRACEFULRESTART.VALUE);
394         }
395         if (neighbor.isMultiProtocolCapabilitySupported()) {
396             supportedCapabilities.add(MPBGP.VALUE);
397         }
398         if (neighbor.isRouterRefreshCapabilitySupported()) {
399             supportedCapabilities.add(ROUTEREFRESH.VALUE);
400         }
401         return supportedCapabilities.build();
402     }
403 }