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