Provide Add Path support for all AFI/SAFI
[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 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;
13
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.rev180329.NetworkInstanceProtocol;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * BGPOperationalStateUtils reads Operational state from DS and prints to stream.
37  */
38 public final class BGPOperationalStateUtils {
39
40     static final InstanceIdentifier<Protocols> PROTOCOLS_IID;
41     private static final Logger LOG = LoggerFactory.getLogger(BGPOperationalStateUtils.class);
42
43     static {
44         PROTOCOLS_IID = InstanceIdentifier.create(NetworkInstances.class)
45                 .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
46     }
47
48     private BGPOperationalStateUtils() {
49         throw new UnsupportedOperationException();
50     }
51
52     /**
53      * Display to stream operational state, rib Id is mandatory.
54      *
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
61      */
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));
68             return;
69         }
70         if (neighbor == null && group == null) {
71             displayRibOperationalState(ribId, globalBgp.getGlobal(), stream);
72         } else {
73             if (neighbor != null) {
74                 globalBgp.getNeighbors().getNeighbor().stream()
75                         .filter(neig -> Ipv4Util.toStringIP(neig.getKey().getNeighborAddress()).matches(neighbor))
76                         .findFirst()
77                         .ifPresent(neighbor1 -> displayNeighborOperationalState(neighbor, neighbor1, stream));
78             } else {
79                 displayPeerOperationalState(globalBgp.getPeerGroups().getPeerGroup(), stream);
80             }
81         }
82
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.class, ribId))
88                 .augmentation(NetworkInstanceProtocol.class).child(Bgp.class);
89
90         final ReadOnlyTransaction rot = dataBroker.newReadOnlyTransaction();
91
92         try {
93             return rot.read(LogicalDatastoreType.OPERATIONAL, bgpIID).get().orNull();
94         } catch (final InterruptedException | ExecutionException e) {
95             LOG.warn("Failed to read rib {}", ribId, e);
96         }
97         return null;
98     }
99 }