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.pcep.cli.utils;
10 import java.io.PrintStream;
11 import java.util.Arrays;
12 import java.util.concurrent.ExecutionException;
13 import org.apache.karaf.shell.support.table.ShellTable;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.opendaylight.mdsal.binding.api.DataBroker;
16 import org.opendaylight.mdsal.binding.api.ReadTransaction;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev171113.PcepEntityIdStatsAug;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev171113.StatefulCapabilitiesStatsAug;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev171113.StatefulMessagesStatsAug;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.Error;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.Preferences;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessages;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPref;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionState;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev171113.PcepTopologyNodeStatsAug;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
44 * PcepStateUtils reads Pcep Topology Node state from DS and prints to stream.
46 public final class PcepStateUtils {
48 private static final Logger LOG = LoggerFactory.getLogger(PcepStateUtils.class);
50 @SuppressWarnings("checkstyle:HideUtilityClassConstructor")
51 private PcepStateUtils() {
52 throw new UnsupportedOperationException();
56 * Display to stream operational state, rib Id is mandatory.
58 * @param dataBroker data broker
59 * @param stream where to print
60 * @param topologyId mandatory, Topology where Node pertains
61 * @param nodeId mandatory, State per given Node Id will be printed
63 public static void displayNodeState(@NonNull final DataBroker dataBroker,
64 @NonNull final PrintStream stream, @NonNull final String topologyId, @NonNull final String nodeId) {
65 final Node node = readNodeFromDataStore(dataBroker, topologyId, nodeId);
67 stream.println(String.format("Node [%s] not found", nodeId));
70 final PcepTopologyNodeStatsAug state = node.augmentation(PcepTopologyNodeStatsAug.class);
72 stream.println(String.format("State not found for [%s]", nodeId));
75 final PcepSessionState nodeState = state.getPcepSessionState();
76 displayNodeState(topologyId, nodeId, nodeState, stream);
79 private static void displayNodeState(
80 final String topologyId,
82 final PcepSessionState pcepSessionState,
83 final PrintStream stream) {
84 final ShellTable table = new ShellTable();
85 table.column("Attribute").alignLeft();
86 table.column("Value").alignLeft();
88 showNodeState(table, topologyId, nodeId, pcepSessionState);
90 addHeader(table, "Local preferences");
91 final LocalPref localPref = pcepSessionState.getLocalPref();
92 showPreferences(table, localPref);
93 final PcepEntityIdStatsAug entAug = localPref.augmentation(PcepEntityIdStatsAug.class);
95 table.addRow().addContent("Speaker Entity Identifier",
96 Arrays.toString(entAug.getSpeakerEntityIdValue()));
99 addHeader(table, "Peer preferences");
100 final PeerPref peerPref = pcepSessionState.getPeerPref();
101 showPreferences(table, peerPref);
103 showCapabilities(table, pcepSessionState.getPeerCapabilities());
105 final Messages messages = pcepSessionState.getMessages();
106 showMessages(table, messages);
108 final ErrorMessages error = messages.getErrorMessages();
109 showErrorMessages(table, error);
111 final ReplyTime reply = messages.getReplyTime();
112 showReplyMessages(table, reply);
117 private static void showNodeState(final ShellTable table, final String topologyId, final String nodeId,
118 final PcepSessionState pcepSessionState) {
119 addHeader(table, "Node state");
120 table.addRow().addContent("Topology Id", topologyId);
121 table.addRow().addContent("Node Id", nodeId);
122 table.addRow().addContent("Session duration", pcepSessionState.getSessionDuration());
123 table.addRow().addContent("Synchronized", pcepSessionState.isSynchronized());
124 table.addRow().addContent("Delegated Lsp Count", pcepSessionState.getDelegatedLspsCount());
127 private static void showCapabilities(final ShellTable table, final PeerCapabilities capa) {
131 final StatefulCapabilitiesStatsAug stateFulCapa = capa.augmentation(StatefulCapabilitiesStatsAug.class);
132 if (stateFulCapa != null) {
133 addHeader(table, "Stateful Capabilities");
134 table.addRow().addContent("Stateful", stateFulCapa.isStateful());
135 table.addRow().addContent("Active", stateFulCapa.isActive());
136 table.addRow().addContent("Instantiation", stateFulCapa.isInstantiation());
141 private static void showMessages(final ShellTable table, final Messages messages) {
142 if (messages == null) {
145 addHeader(table, "Messages");
146 table.addRow().addContent("Last Sent Msg Timestamp", messages.getLastSentMsgTimestamp());
147 table.addRow().addContent("Received Msg Count", messages.getReceivedMsgCount());
148 table.addRow().addContent("Sent Msg Count", messages.getSentMsgCount());
149 table.addRow().addContent("Unknown Msg Received", messages.getUnknownMsgReceived());
151 final StatefulMessagesStatsAug statefulMessages = messages.augmentation(StatefulMessagesStatsAug.class);
152 if (statefulMessages == null) {
155 addHeader(table, " Stateful Messages");
156 table.addRow().addContent("Last Received RptMsg Timestamp", statefulMessages
157 .getLastReceivedRptMsgTimestamp());
158 table.addRow().addContent("Received RptMsg", statefulMessages.getReceivedRptMsgCount());
159 table.addRow().addContent("Sent Init Msg", statefulMessages.getSentInitMsgCount());
160 table.addRow().addContent("Sent Upd Msg", statefulMessages.getSentUpdMsgCount());
163 private static void showReplyMessages(final ShellTable table, final ReplyTime reply) {
167 addHeader(table, "Reply Messages");
168 table.addRow().addContent("Average Time", reply.getAverageTime());
169 table.addRow().addContent("Max Timet", reply.getMaxTime());
170 table.addRow().addContent("Min Time", reply.getMinTime());
173 private static void showErrorMessages(final ShellTable table, final ErrorMessages error) {
177 addHeader(table, "Error Messages");
178 table.addRow().addContent("Sent Error Msg Count", error.getSentErrorMsgCount());
179 table.addRow().addContent("Received Error Msg Count", error.getReceivedErrorMsgCount());
181 showError(table, error.getLastSentError(), "Last Sent Error");
182 showError(table, error.getLastReceivedError(), "Last Received Error");
185 private static void showError(final ShellTable table, final Error error, final String errorMsgHeader) {
189 addHeader(table, errorMsgHeader);
190 table.addRow().addContent("Type", error.getErrorType());
191 table.addRow().addContent("Value", error.getErrorValue());
195 private static void showPreferences(final ShellTable table, final Preferences preferences) {
196 table.addRow().addContent("Session id", preferences.getSessionId());
197 table.addRow().addContent("Ip Address", preferences.getIpAddress());
198 table.addRow().addContent("Dead Timer", preferences.getDeadtimer());
199 table.addRow().addContent("Keep Alive", preferences.getKeepalive());
202 private static Node readNodeFromDataStore(final DataBroker dataBroker,
203 final String topologyId, final String nodeId) {
204 final InstanceIdentifier<Node> topology = InstanceIdentifier.builder(NetworkTopology.class)
205 .child(Topology.class, new TopologyKey(new TopologyId(topologyId)))
206 .child(Node.class, new NodeKey(new NodeId(nodeId))).build();
208 final ReadTransaction rot = dataBroker.newReadOnlyTransaction();
211 return rot.read(LogicalDatastoreType.OPERATIONAL, topology).get().orElse(null);
212 } catch (final InterruptedException | ExecutionException e) {
213 LOG.warn("Failed to read node {}", nodeId, e);
219 private static void addHeader(final ShellTable table, final String header) {
220 table.addRow().addContent(" ", "");
221 table.addRow().addContent(header, "");
222 table.addRow().addContent("======================", "");