Update MRI projects for Aluminium
[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.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.binding.api.ReadTransaction;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
26 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
27 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
28 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
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     private static final Logger LOG = LoggerFactory.getLogger(BGPOperationalStateUtils.class);
40     static final InstanceIdentifier<Protocols> PROTOCOLS_IID = InstanceIdentifier.create(NetworkInstances.class)
41         .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
42
43     private BGPOperationalStateUtils() {
44         // Hidden on purpose
45     }
46
47     /**
48      * Display to stream operational state, rib Id is mandatory.
49      *
50      * @param dataBroker data broker
51      * @param stream     where to print
52      * @param ribId      mandatory, Operational State per given RIB Group will be printed
53      *                   if no other parameter is passed
54      * @param group      if provided, Operational State per given Neighbor Group will be printed
55      * @param neighbor   if provided, Operational State per given Neighbor will be printed
56      */
57     public static void displayBgpOperationalState(@NonNull final DataBroker dataBroker,
58             @NonNull final PrintStream stream, @NonNull final String ribId, @Nullable final String group,
59             @Nullable final String neighbor) {
60         final Bgp globalBgp = readGlobalFromDataStore(dataBroker, ribId);
61         if (globalBgp == null) {
62             stream.println(String.format("RIB not found for [%s]", ribId));
63             return;
64         }
65         if (neighbor == null && group == null) {
66             displayRibOperationalState(ribId, globalBgp.getGlobal(), stream);
67         } else {
68             if (neighbor != null) {
69                 globalBgp.getNeighbors().nonnullNeighbor().values().stream()
70                         .filter(neig -> toString(neig.key().getNeighborAddress()).matches(neighbor))
71                         .findFirst()
72                         .ifPresent(neighbor1 -> displayNeighborOperationalState(neighbor, neighbor1, stream));
73             } else {
74                 displayPeerOperationalState(globalBgp.getPeerGroups().nonnullPeerGroup().values(), stream);
75             }
76         }
77     }
78
79     private static String toString(final IpAddress addr) {
80         if (addr.getIpv4Address() != null) {
81             return addr.getIpv4Address().getValue();
82         }
83         return addr.getIpv6Address().getValue();
84     }
85
86     private static Bgp readGlobalFromDataStore(final DataBroker dataBroker, final String ribId) {
87         final InstanceIdentifier<Bgp> bgpIID = PROTOCOLS_IID
88                 .child(Protocol.class, new ProtocolKey(BGP.class, ribId))
89                 .augmentation(NetworkInstanceProtocol.class).child(Bgp.class);
90
91         final ReadTransaction rot = dataBroker.newReadOnlyTransaction();
92
93         try {
94             return rot.read(LogicalDatastoreType.OPERATIONAL, bgpIID).get().orElse(null);
95         } catch (final InterruptedException | ExecutionException e) {
96             LOG.warn("Failed to read rib {}", ribId, e);
97         }
98         return null;
99     }
100 }