2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.protocol.bgp.state;
11 import com.google.common.primitives.UnsignedLong;
12 import java.math.BigDecimal;
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Objects;
18 import java.util.Optional;
20 import java.util.stream.Collectors;
21 import javax.annotation.Nonnull;
22 import javax.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.BGPPeerMessagesState;
28 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
29 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
30 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
31 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
32 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
33 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState.SessionState;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
39 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
40 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandling;
41 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
42 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.State;
43 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.StateBuilder;
44 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ADDPATHS;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ASN32;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpCapability;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentation;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentationBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentation;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentation;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentationBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentation;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentationBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentation;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentationBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborStateAugmentation;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborStateAugmentationBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentation;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentationBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentation;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentationBuilder;
76 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;
77 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;
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.messages.ReceivedBuilder;
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.Sent;
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.SentBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
84 * Util for create OpenConfig Neighbor with corresponding openConfig state.
86 public final class NeighborUtil {
87 private NeighborUtil() {
88 throw new UnsupportedOperationException();
92 * Build a Openconfig Neighbors container with all Neighbors Stats from a list of
95 * @param peerStats List of BGPPeerState containing Neighbor state counters
96 * @param bgpTableTypeRegistry BGP TableType Registry
97 * @return Openconfig Neighbors Stats
100 public static Neighbors buildNeighbors(@Nonnull final List<BGPPeerState> peerStats,
101 @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
102 if (peerStats.isEmpty()) {
105 return new NeighborsBuilder().setNeighbor(peerStats.stream()
106 .filter(Objects::nonNull)
107 .map(neighbor -> buildNeighbor(neighbor, bgpTableTypeRegistry))
108 .collect(Collectors.toList())).build();
112 * Build a list of neighbors containing Operational State from a list of BGPPeerState.
114 * @param neighbor containing Neighbor state counters
115 * @return neighbor containing Neighbor State
118 public static Neighbor buildNeighbor(@Nonnull final BGPPeerState neighbor,
119 @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
120 return new NeighborBuilder()
121 .setNeighborAddress(neighbor.getNeighborAddress())
122 .setState(buildNeighborState(neighbor.getBGPSessionState(), neighbor.getBGPPeerMessagesState()))
123 .setTimers(buildTimer(neighbor.getBGPTimersState()))
124 .setTransport(buildTransport(neighbor.getBGPTransportState()))
125 .setErrorHandling(buildErrorHandling(neighbor.getBGPErrorHandlingState()))
126 .setGracefulRestart(buildGracefulRestart(neighbor.getBGPGracelfulRestart()))
127 .setAfiSafis(buildAfisSafis(neighbor, bgpTableTypeRegistry))
132 * Builds Neighbor State from BGPPeerState counters.
134 * @param sessionState BGPPeerState containing Operational state counters
135 * @param bgpPeerMessagesState message state
136 * @return Neighbor State
139 public static State buildNeighborState(@Nullable final BGPSessionState sessionState,
140 final BGPPeerMessagesState bgpPeerMessagesState) {
141 if (sessionState == null && bgpPeerMessagesState == null) {
144 final StateBuilder builder = new StateBuilder();
145 if (sessionState != null) {
146 builder.addAugmentation(NeighborStateAugmentation.class, buildCapabilityState(sessionState));
148 if (bgpPeerMessagesState != null) {
149 builder.addAugmentation(BgpNeighborStateAugmentation.class, buildMessageState(bgpPeerMessagesState));
151 return builder.build();
155 * Builds Neighbor State from BGPPeerState counters.
157 * @param neighbor BGPPeerState containing Operational state counters
158 * @return Timer State
161 public static Timers buildTimer(@Nullable final BGPTimersState neighbor) {
162 if (neighbor == null) {
165 final NeighborTimersStateAugmentation timerState = new NeighborTimersStateAugmentationBuilder()
166 .setNegotiatedHoldTime(BigDecimal.valueOf(neighbor.getNegotiatedHoldTime()))
167 .setUptime(new Timeticks(neighbor.getUpTime())).build();
169 return new TimersBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
170 .neighbor.group.timers.StateBuilder()
171 .addAugmentation(NeighborTimersStateAugmentation.class, timerState).build()).build();
175 * Builds Transport State from BGPTransportState counters.
177 * @param neighbor BGPPeerState containing Operational state counters
178 * @return Transport State
181 public static Transport buildTransport(@Nullable final BGPTransportState neighbor) {
182 if (neighbor == null) {
185 final NeighborTransportStateAugmentation transportState = new NeighborTransportStateAugmentationBuilder()
186 .setLocalPort(neighbor.getLocalPort()).setRemoteAddress(neighbor.getRemoteAddress())
187 .setRemotePort(neighbor.getRemotePort()).build();
189 return new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
190 .bgp.neighbor.group.transport.StateBuilder()
191 .addAugmentation(NeighborTransportStateAugmentation.class, transportState).build()).build();
195 * Builds Error Handling State from BGPPeerState counters.
197 * @param errorHandlingState BGPErrorHandlingState containing ErrorHandlingState Operational state counters
198 * @return Error Handling State
200 public static ErrorHandling buildErrorHandling(@Nullable final BGPErrorHandlingState errorHandlingState) {
201 if (errorHandlingState == null) {
204 return new ErrorHandlingBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
205 .rev151009.bgp.neighbor.group.error.handling.StateBuilder()
206 .addAugmentation(NeighborErrorHandlingStateAugmentation.class,
207 buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount())).build()).build();
211 * Builds Graceful Restart containing Graceful Restart State from BGPGracelfulRestartState counters.
213 * @param neighbor BGPPeerState containing Operational state counters
214 * @return Graceful Restart
217 public static GracefulRestart buildGracefulRestart(@Nonnull final BGPGracelfulRestartState neighbor) {
218 final NeighborGracefulRestartStateAugmentation gracefulRestartState =
219 new NeighborGracefulRestartStateAugmentationBuilder()
220 .setLocalRestarting(neighbor.isLocalRestarting())
221 .setPeerRestartTime(neighbor.getPeerRestartTime())
222 //.setMode(mode) TBD once implemented
223 .setPeerRestarting(neighbor.isPeerRestarting()).build();
225 return new GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
226 .rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
227 .addAugmentation(NeighborGracefulRestartStateAugmentation.class, gracefulRestartState).build()).build();
231 * Builds Neighbor Afi Safi containing AfiSafi State.
233 * @param neighbor BGPPeerState containing Operational state counters
236 public static AfiSafis buildAfisSafis(@Nonnull final BGPPeerState neighbor,
237 @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
238 return new AfiSafisBuilder().setAfiSafi(buildAfisSafisState(neighbor.getBGPAfiSafiState(),
239 bgpTableTypeRegistry)).build();
243 * Builds Neighbor State containing Capabilities State, session State.
245 * @return Neighbor State
247 public static NeighborStateAugmentation buildCapabilityState(@Nonnull final BGPSessionState neighbor) {
249 final List<Class<? extends BgpCapability>> supportedCapabilities = buildSupportedCapabilities(neighbor);
250 SessionState sessionState = null;
251 switch (neighbor.getSessionState()) {
253 sessionState = SessionState.IDLE;
256 sessionState = SessionState.ESTABLISHED;
259 sessionState = SessionState.OPENCONFIRM;
263 return new NeighborStateAugmentationBuilder().setSupportedCapabilities(supportedCapabilities)
264 .setSessionState(sessionState).build();
268 * Builds Bgp Neighbor State containing Message State.
270 * @return BgpNeighborState containing Message State
273 public static BgpNeighborStateAugmentation buildMessageState(@Nonnull final BGPPeerMessagesState neighbor) {
274 return new BgpNeighborStateAugmentationBuilder()
275 .setMessages(new MessagesBuilder()
276 .setReceived(buildMessagesReceived(neighbor))
277 .setSent(buildMessagesSent(neighbor)).build()).build();
280 private static Received buildMessagesReceived(@Nonnull final BGPPeerMessagesState neighbor) {
281 return new ReceivedBuilder()
282 .setUPDATE(toBigInteger(neighbor.getUpdateMessagesReceivedCount()))
283 .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesReceivedCount()))
287 public static BigInteger toBigInteger(final long updateReceivedCounter) {
288 return UnsignedLong.valueOf(updateReceivedCounter).bigIntegerValue();
291 private static Sent buildMessagesSent(@Nonnull final BGPPeerMessagesState neighbor) {
292 return new SentBuilder()
293 .setUPDATE(toBigInteger(neighbor.getUpdateMessagesSentCount()))
294 .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesSentCount()))
299 * Builds Neighbor Error Handling State.
301 * @param erroneousUpdateCount erroneous Update Count
302 * @return Error Handling State
305 public static NeighborErrorHandlingStateAugmentation buildErrorHandlingState(final long erroneousUpdateCount) {
306 return new NeighborErrorHandlingStateAugmentationBuilder()
307 .setErroneousUpdateMessages(erroneousUpdateCount).build();
311 * Build List of afi safi containing State per Afi Safi.
313 * @return AfiSafi List
316 public static List<AfiSafi> buildAfisSafisState(@Nonnull final BGPAfiSafiState neighbor,
317 @Nonnull final 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());
325 private static AfiSafi buildAfiSafi(@Nonnull final BGPAfiSafiState neighbor,
326 @Nonnull final TablesKey tablesKey, @Nonnull final 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);
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(@Nonnull final BGPAfiSafiState neighbor,
336 @Nonnull final 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());
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();
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 @Nonnull final BGPGracelfulRestartState neighbor, @Nonnull final TablesKey tablesKey) {
353 final NeighborAfiSafiGracefulRestartStateAugmentation builder =
354 new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
355 .setAdvertised(neighbor.isGracefulRestartAdvertized(tablesKey))
356 .setReceived(neighbor.isGracefulRestartReceived(tablesKey)).build();
357 return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
358 .safi.list.afi.safi.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
359 .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder()
360 .addAugmentation(NeighborAfiSafiGracefulRestartStateAugmentation.class, builder).build()).build();
364 * Builds List of BgpCapability supported capabilities.
366 * @return List containing supported capabilities
369 public static List<Class<? extends BgpCapability>> buildSupportedCapabilities(
370 @Nonnull final BGPSessionState neighbor) {
371 final List<Class<? extends BgpCapability>> supportedCapabilities = new ArrayList<>();
372 if (neighbor.isAddPathCapabilitySupported()) {
373 supportedCapabilities.add(ADDPATHS.class);
375 if (neighbor.isAsn32CapabilitySupported()) {
376 supportedCapabilities.add(ASN32.class);
378 if (neighbor.isGracefulRestartCapabilitySupported()) {
379 supportedCapabilities.add(GRACEFULRESTART.class);
381 if (neighbor.isMultiProtocolCapabilitySupported()) {
382 supportedCapabilities.add(MPBGP.class);
384 if (neighbor.isRouterRefreshCapabilitySupported()) {
385 supportedCapabilities.add(ROUTEREFRESH.class);
387 return supportedCapabilities;