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 static org.opendaylight.protocol.bgp.cli.utils.GlobalStateCliUtils.displayRibOperationalState;
11 import static org.opendaylight.protocol.bgp.cli.utils.NeighborStateCliUtils.displayNeighborOperationalState;
12 import static org.opendaylight.protocol.bgp.cli.utils.PeerGroupStateCliUtils.displayPeerOperationalState;
14 import java.io.PrintStream;
15 import java.util.concurrent.ExecutionException;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.protocol.util.Ipv4Util;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
26 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
27 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
28 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
29 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180321.NetworkInstanceProtocol;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * BGPOperationalStateUtils reads Operational state from DS and prints to stream.
38 public final class BGPOperationalStateUtils {
40 static final InstanceIdentifier<Protocols> PROTOCOLS_IID;
41 private static final Logger LOG = LoggerFactory.getLogger(BGPOperationalStateUtils.class);
44 PROTOCOLS_IID = InstanceIdentifier.create(NetworkInstances.class)
45 .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
48 private BGPOperationalStateUtils() {
49 throw new UnsupportedOperationException();
53 * Display to stream operational state, rib Id is mandatory.
55 * @param dataBroker data broker
56 * @param stream where to print
57 * @param ribId mandatory, Operational State per given RIB Group will be printed
58 * if no other parameter is passed
59 * @param group if provided, Operational State per given Neighbor Group will be printed
60 * @param neighbor if provided, Operational State per given Neighbor will be printed
62 public static void displayBgpOperationalState(@NonNull final DataBroker dataBroker,
63 @NonNull final PrintStream stream, @NonNull final String ribId, @Nullable final String group,
64 @Nullable final String neighbor) {
65 final Bgp globalBgp = readGlobalFromDataStore(dataBroker, ribId);
66 if (globalBgp == null) {
67 stream.println(String.format("RIB not found for [%s]", ribId));
70 if (neighbor == null && group == null) {
71 displayRibOperationalState(ribId, globalBgp.getGlobal(), stream);
73 if (neighbor != null) {
74 globalBgp.getNeighbors().getNeighbor().stream()
75 .filter(neig -> Ipv4Util.toStringIP(neig.getKey().getNeighborAddress()).matches(neighbor))
77 .ifPresent(neighbor1 -> displayNeighborOperationalState(neighbor, neighbor1, stream));
79 displayPeerOperationalState(globalBgp.getPeerGroups().getPeerGroup(), stream);
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.class, ribId))
88 .augmentation(NetworkInstanceProtocol.class).child(Bgp.class);
90 final ReadOnlyTransaction rot = dataBroker.newReadOnlyTransaction();
93 return rot.read(LogicalDatastoreType.OPERATIONAL, bgpIID).get().orNull();
94 } catch (final InterruptedException | ExecutionException e) {
95 LOG.warn("Failed to read rib {}", ribId, e);