Bump versions to 0.21.8-SNAPSHOT
[bgpcep.git] / bgp / cli / src / main / java / org / opendaylight / protocol / bgp / cli / utils / BGPOperationalStateUtils.java
1 /*
2  * Copyright (c) 2017 AT&T Intellectual Property. 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 package org.opendaylight.protocol.bgp.cli.utils;
9
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;
31
32 /**
33  * BGPOperationalStateUtils reads Operational state from DS and prints to stream.
34  */
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);
41
42     private BGPOperationalStateUtils() {
43         // Hidden on purpose
44     }
45
46     /**
47      * Display to stream operational state, rib Id is mandatory.
48      *
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
55      */
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));
62             return;
63         }
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))
69                 .findFirst()
70                 .ifPresent(neighbor1 -> NeighborStateCliUtils.displayNeighborOperationalState(neighbor,
71                     neighbor1, stream));
72         } else {
73             PeerGroupStateCliUtils.displayPeerOperationalState(
74                 globalBgp.getPeerGroups().nonnullPeerGroup().values(), stream);
75         }
76     }
77
78     private static String toString(final IpAddress addr) {
79         if (addr.getIpv4Address() != null) {
80             return addr.getIpv4Address().getValue();
81         }
82         return addr.getIpv6Address().getValue();
83     }
84
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);
89
90         final ReadTransaction rot = dataBroker.newReadOnlyTransaction();
91
92         try {
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);
96         }
97         return null;
98     }
99 }