2 * Copyright (c) 2017 AT&T Intellectual Property. 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
8 package org.opendaylight.protocol.bgp.cli.utils;
10 import java.io.PrintStream;
11 import java.util.concurrent.ExecutionException;
12 import org.eclipse.jdt.annotation.NonNull;
13 import org.eclipse.jdt.annotation.Nullable;
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.binding.api.ReadTransaction;
16 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
17 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
18 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.OpenconfigNetworkInstanceData;
19 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
20 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
21 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * BGPOperationalStateUtils reads Operational state from DS and prints to stream.
35 public final class BGPOperationalStateUtils {
36 private static final Logger LOG = LoggerFactory.getLogger(BGPOperationalStateUtils.class);
37 static final InstanceIdentifier<Protocols> PROTOCOLS_IID =
38 InstanceIdentifier.builderOfInherited(OpenconfigNetworkInstanceData.class, NetworkInstances.class).build()
39 .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp"))
40 .child(Protocols.class);
42 private BGPOperationalStateUtils() {
47 * Display to stream operational state, rib Id is mandatory.
49 * @param dataBroker data broker
50 * @param stream where to print
51 * @param ribId mandatory, Operational State per given RIB Group will be printed
52 * if no other parameter is passed
53 * @param group if provided, Operational State per given Neighbor Group will be printed
54 * @param neighbor if provided, Operational State per given Neighbor will be printed
56 public static void displayBgpOperationalState(@NonNull final DataBroker dataBroker,
57 @NonNull final PrintStream stream, @NonNull final String ribId, @Nullable final String group,
58 @Nullable final String neighbor) {
59 final Bgp globalBgp = readGlobalFromDataStore(dataBroker, ribId);
60 if (globalBgp == null) {
61 stream.println(String.format("RIB not found for [%s]", ribId));
64 if (neighbor == null && group == null) {
65 GlobalStateCliUtils.displayRibOperationalState(ribId, globalBgp.getGlobal(), stream);
66 } else if (neighbor != null) {
67 globalBgp.getNeighbors().nonnullNeighbor().values().stream()
68 .filter(neig -> toString(neig.key().getNeighborAddress()).matches(neighbor))
70 .ifPresent(neighbor1 -> NeighborStateCliUtils.displayNeighborOperationalState(neighbor,
73 PeerGroupStateCliUtils.displayPeerOperationalState(
74 globalBgp.getPeerGroups().nonnullPeerGroup().values(), stream);
78 private static String toString(final IpAddress addr) {
79 if (addr.getIpv4Address() != null) {
80 return addr.getIpv4Address().getValue();
82 return addr.getIpv6Address().getValue();
85 private static Bgp readGlobalFromDataStore(final DataBroker dataBroker, final String ribId) {
86 final InstanceIdentifier<Bgp> bgpIID = PROTOCOLS_IID
87 .child(Protocol.class, new ProtocolKey(BGP.VALUE, ribId))
88 .augmentation(NetworkInstanceProtocol.class).child(Bgp.class);
90 final ReadTransaction rot = dataBroker.newReadOnlyTransaction();
93 return rot.read(LogicalDatastoreType.OPERATIONAL, bgpIID).get().orElse(null);
94 } catch (final InterruptedException | ExecutionException e) {
95 LOG.warn("Failed to read rib {}", ribId, e);