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