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