/* * Copyright 2017-present Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.routing.cli; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Option; import org.onosproject.cli.AbstractShellCommand; import org.onosproject.routing.bgp.BgpInfoService; import org.onosproject.routing.bgp.BgpSession; import java.util.Collection; /** * Command to show the BGP neighbors. */ @Command(scope = "onos", name = "bgp-neighbors", description = "Lists the BGP neighbors") public class BgpNeighborsListCommand extends AbstractShellCommand { @Option(name = "-n", aliases = "--neighbor", description = "BGP neighbor to display information about", required = false, multiValued = false) private String bgpNeighbor; private static final String FORMAT_NEIGHBOR_LINE1 = "BGP neighbor is %s, remote AS %d, local AS %d"; private static final String FORMAT_NEIGHBOR_LINE2 = " Remote router ID %s, IP %s, BGP version %d, Hold time %d"; private static final String FORMAT_NEIGHBOR_LINE3 = " Remote AFI/SAFI IPv4 Unicast %s Multicast %s, IPv6 Unicast %s Multicast %s"; private static final String FORMAT_NEIGHBOR_LINE4 = " Local router ID %s, IP %s, BGP version %d, Hold time %d"; private static final String FORMAT_NEIGHBOR_LINE5 = " Local AFI/SAFI IPv4 Unicast %s Multicast %s, IPv6 Unicast %s Multicast %s"; private static final String FORMAT_NEIGHBOR_LINE6 = " 4 Octet AS Capability: %s %s"; @Override protected void execute() { BgpInfoService service = AbstractShellCommand.get(BgpInfoService.class); Collection<BgpSession> bgpSessions = service.getBgpSessions(); if (bgpNeighbor != null) { // Print a single neighbor (if found) BgpSession foundBgpSession = null; for (BgpSession bgpSession : bgpSessions) { if (bgpSession.remoteInfo().bgpId().toString().equals(bgpNeighbor)) { foundBgpSession = bgpSession; break; } } if (foundBgpSession != null) { printNeighbor(foundBgpSession); } else { print("BGP neighbor %s not found", bgpNeighbor); } return; } // Print all neighbors printNeighbors(bgpSessions); } /** * Prints all BGP neighbors. * * @param bgpSessions the BGP sessions for the neighbors to print */ private void printNeighbors(Collection<BgpSession> bgpSessions) { if (outputJson()) { print("%s", json(bgpSessions)); } else { for (BgpSession bgpSession : bgpSessions) { printNeighbor(bgpSession); } } } /** * Prints a BGP neighbor. * * @param bgpSession the BGP session for the neighbor to print */ private void printNeighbor(BgpSession bgpSession) { print(FORMAT_NEIGHBOR_LINE1, bgpSession.remoteInfo().bgpId().toString(), bgpSession.remoteInfo().asNumber(), bgpSession.localInfo().asNumber()); print(FORMAT_NEIGHBOR_LINE2, bgpSession.remoteInfo().bgpId().toString(), bgpSession.remoteInfo().address().toString(), bgpSession.remoteInfo().bgpVersion(), bgpSession.remoteInfo().holdtime()); print(FORMAT_NEIGHBOR_LINE3, bgpSession.remoteInfo().ipv4Unicast() ? "YES" : "NO", bgpSession.remoteInfo().ipv4Multicast() ? "YES" : "NO", bgpSession.remoteInfo().ipv6Unicast() ? "YES" : "NO", bgpSession.remoteInfo().ipv6Multicast() ? "YES" : "NO"); print(FORMAT_NEIGHBOR_LINE4, bgpSession.localInfo().bgpId().toString(), bgpSession.localInfo().address().toString(), bgpSession.localInfo().bgpVersion(), bgpSession.localInfo().holdtime()); print(FORMAT_NEIGHBOR_LINE5, bgpSession.localInfo().ipv4Unicast() ? "YES" : "NO", bgpSession.localInfo().ipv4Multicast() ? "YES" : "NO", bgpSession.localInfo().ipv6Unicast() ? "YES" : "NO", bgpSession.localInfo().ipv6Multicast() ? "YES" : "NO"); if (bgpSession.localInfo().as4OctetCapability() || bgpSession.remoteInfo().as4OctetCapability()) { print(FORMAT_NEIGHBOR_LINE6, bgpSession.localInfo().as4OctetCapability() ? "Advertised" : "", bgpSession.remoteInfo().as4OctetCapability() ? "Received" : ""); } } /** * Produces a JSON array of BGP neighbors. * * @param bgpSessions the BGP sessions with the data * @return JSON array with the neighbors */ private JsonNode json(Collection<BgpSession> bgpSessions) { ObjectMapper mapper = new ObjectMapper(); ArrayNode result = mapper.createArrayNode(); for (BgpSession bgpSession : bgpSessions) { result.add(json(mapper, bgpSession)); } return result; } /** * Produces JSON object for a BGP neighbor. * * @param mapper the JSON object mapper to use * @param bgpSession the BGP session with the data * @return JSON object for the route */ private ObjectNode json(ObjectMapper mapper, BgpSession bgpSession) { ObjectNode result = mapper.createObjectNode(); result.put("remoteAddress", bgpSession.remoteInfo().address().toString()); result.put("remoteBgpVersion", bgpSession.remoteInfo().bgpVersion()); result.put("remoteAs", bgpSession.remoteInfo().asNumber()); result.put("remoteAs4", bgpSession.remoteInfo().as4Number()); result.put("remoteHoldtime", bgpSession.remoteInfo().holdtime()); result.put("remoteBgpId", bgpSession.remoteInfo().bgpId().toString()); result.put("remoteIpv4Unicast", bgpSession.remoteInfo().ipv4Unicast()); result.put("remoteIpv4Multicast", bgpSession.remoteInfo().ipv4Multicast()); result.put("remoteIpv6Unicast", bgpSession.remoteInfo().ipv6Unicast()); result.put("remoteIpv6Multicast", bgpSession.remoteInfo().ipv6Multicast()); // result.put("localAddress", bgpSession.localInfo().address().toString()); result.put("localBgpVersion", bgpSession.localInfo().bgpVersion()); result.put("localAs", bgpSession.localInfo().asNumber()); result.put("localAs4", bgpSession.localInfo().as4Number()); result.put("localHoldtime", bgpSession.localInfo().holdtime()); result.put("localBgpId", bgpSession.localInfo().bgpId().toString()); result.put("localIpv4Unicast", bgpSession.localInfo().ipv4Unicast()); result.put("localIpv4Multicast", bgpSession.localInfo().ipv4Multicast()); result.put("localIpv6Unicast", bgpSession.localInfo().ipv6Unicast()); result.put("localIpv6Multicast", bgpSession.localInfo().ipv6Multicast()); return result; } }