2 * Copyright (c) 2013 Cisco Systems, Inc. and others. 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.bgpcep.bgp.topology.provider;
10 import com.google.common.primitives.UnsignedBytes;
12 import org.apache.commons.codec.binary.Hex;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeIdentifier;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.LinkstateRoute;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.LinkCase;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.link._case.LinkDescriptors;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.CRouterIdentifier;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisNodeCase;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisPseudonodeCase;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfNodeCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfPseudonodeCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 final class UriBuilder {
28 private static final Logger LOG = LoggerFactory.getLogger(UriBuilder.class);
29 private final StringBuilder sb;
31 UriBuilder(final UriBuilder base, final String type) {
32 this.sb = new StringBuilder(base.sb);
33 this.sb.append("type=").append(type);
36 UriBuilder(final LinkstateRoute route) {
37 this.sb = new StringBuilder("bgpls://");
39 if (route.getDistinguisher() != null) {
40 this.sb.append(route.getDistinguisher().getValue().toString()).append(':');
43 this.sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append('/');
46 UriBuilder add(final String name, final Object value) {
48 this.sb.append('&').append(name).append('=').append(value.toString());
53 UriBuilder add(final LinkCase link) {
54 add("local-", link.getLocalNodeDescriptors());
55 add("remote-", link.getRemoteNodeDescriptors());
57 final LinkDescriptors ld = link.getLinkDescriptors();
58 if (ld.getIpv4InterfaceAddress() != null) {
59 add("ipv4-iface", ld.getIpv4InterfaceAddress().getValue());
61 if (ld.getIpv4NeighborAddress() != null) {
62 add("ipv4-neigh", ld.getIpv4NeighborAddress().getValue());
64 if (ld.getIpv6InterfaceAddress() != null) {
65 add("ipv6-iface", ld.getIpv6InterfaceAddress().getValue());
67 if (ld.getIpv6NeighborAddress() != null) {
68 add("ipv6-neigh", ld.getIpv6NeighborAddress().getValue());
70 if (ld.getMultiTopologyId() != null) {
71 add("mt", ld.getMultiTopologyId().getValue());
73 add("local-id", ld.getLinkLocalIdentifier());
74 add("remote-id", ld.getLinkRemoteIdentifier());
78 private String isoId(final byte[] bytes) {
79 final StringBuilder sBuilder = new StringBuilder();
80 sBuilder.append(Hex.encodeHexString(new byte[] { bytes[0], bytes[1] }));
82 sBuilder.append(Hex.encodeHexString(new byte[] { bytes[2], bytes[3] }));
84 sBuilder.append(Hex.encodeHexString(new byte[] { bytes[4], bytes[5] }));
85 return sBuilder.toString();
88 private String formatRouterIdentifier(final CRouterIdentifier routerIdentifier) {
89 if (routerIdentifier == null) {
93 if (routerIdentifier instanceof IsisNodeCase) {
94 return isoId(((IsisNodeCase) routerIdentifier).getIsisNode().getIsoSystemId().getValue());
95 } else if (routerIdentifier instanceof IsisPseudonodeCase) {
96 final IsisPseudonode r = ((IsisPseudonodeCase) routerIdentifier).getIsisPseudonode();
97 return isoId(r.getIsIsRouterIdentifier().getIsoSystemId().getValue()) + '.'
98 + Hex.encodeHexString(new byte[] { UnsignedBytes.checkedCast(r.getPsn()) });
99 } else if (routerIdentifier instanceof OspfNodeCase) {
100 return ((OspfNodeCase) routerIdentifier).getOspfNode().getOspfRouterId().toString();
101 } else if (routerIdentifier instanceof OspfPseudonodeCase) {
102 final OspfPseudonode r = ((OspfPseudonodeCase) routerIdentifier).getOspfPseudonode();
103 return r.getOspfRouterId().toString() + ':' + r.getLanInterface().getValue();
105 LOG.warn("Unhandled router identifier type {}, fallback to toString()", routerIdentifier.getImplementedInterface());
106 return routerIdentifier.toString();
110 UriBuilder add(final String prefix, final NodeIdentifier node) {
111 if (node.getAsNumber() != null) {
112 add(prefix + "as", node.getAsNumber().getValue());
114 if (node.getDomainId() != null) {
115 add(prefix + "domain", node.getDomainId().getValue());
117 if (node.getAreaId() != null) {
118 add(prefix + "area", node.getAreaId().getValue());
120 add(prefix + "router", formatRouterIdentifier(node.getCRouterIdentifier()));
125 public String toString() {
126 final String ret = this.sb.toString();
127 LOG.trace("New URI {}", ret);