BUG-608 : added prefix-sid tlv
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / bgp / topology / provider / UriBuilder.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  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.bgpcep.bgp.topology.provider;
9
10 import com.google.common.primitives.UnsignedBytes;
11 import org.apache.commons.codec.binary.Hex;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRoute;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.linkstate.route.object.type.LinkCase;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.linkstate.route.object.type.link._case.LinkDescriptors;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.CRouterIdentifier;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisNodeCase;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisPseudonodeCase;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfNodeCase;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfPseudonodeCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 final class UriBuilder {
28     private static final Logger LOG = LoggerFactory.getLogger(UriBuilder.class);
29     private final StringBuilder sb;
30
31     UriBuilder(final UriBuilder base, final String type) {
32         this.sb = new StringBuilder(base.sb);
33         this.sb.append("type=").append(type);
34     }
35
36     UriBuilder(final LinkstateRoute route) {
37         this.sb = new StringBuilder("bgpls://");
38
39         if (route.getDistinguisher() != null) {
40             this.sb.append(route.getDistinguisher().getValue().toString()).append(':');
41         }
42
43         this.sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append('/');
44     }
45
46     UriBuilder add(final String name, final Object value) {
47         if (value != null) {
48             this.sb.append('&').append(name).append('=').append(value.toString());
49         }
50         return this;
51     }
52
53     UriBuilder add(final LinkCase link) {
54         add("local-", link.getLocalNodeDescriptors());
55         add("remote-", link.getRemoteNodeDescriptors());
56
57         final LinkDescriptors ld = link.getLinkDescriptors();
58         if (ld.getIpv4InterfaceAddress() != null) {
59             add("ipv4-iface", ld.getIpv4InterfaceAddress().getValue());
60         }
61         if (ld.getIpv4NeighborAddress() != null) {
62             add("ipv4-neigh", ld.getIpv4NeighborAddress().getValue());
63         }
64         if (ld.getIpv6InterfaceAddress() != null) {
65             add("ipv6-iface", ld.getIpv6InterfaceAddress().getValue());
66         }
67         if (ld.getIpv6NeighborAddress() != null) {
68             add("ipv6-neigh", ld.getIpv6NeighborAddress().getValue());
69         }
70         if (ld.getMultiTopologyId() != null) {
71             add("mt", ld.getMultiTopologyId().getValue());
72         }
73         add("local-id", ld.getLinkLocalIdentifier());
74         add("remote-id", ld.getLinkRemoteIdentifier());
75         return this;
76     }
77
78     private static String isoId(final byte[] bytes) {
79         final StringBuilder sBuilder = new StringBuilder();
80         int i = 0;
81         while (i < bytes.length) {
82             sBuilder.append(Hex.encodeHexString(new byte[] { bytes[i++], bytes[i++] }));
83             if (i != bytes.length) {
84                 sBuilder.append('.');
85             }
86         }
87         return sBuilder.toString();
88     }
89
90     /**
91      * Creates a String representation of ISO system identifier
92      * in format XX.XX.XX where X is one byte.
93      *
94      * @param systemId IsoSystemIdentifier object
95      * @return String representation of ISO Identifier
96      */
97     public static String isoId(final IsoSystemIdentifier systemId) {
98         return isoId(systemId.getValue());
99     }
100
101     private String formatRouterIdentifier(final CRouterIdentifier routerIdentifier) {
102         if (routerIdentifier == null) {
103             return null;
104         }
105
106         if (routerIdentifier instanceof IsisNodeCase) {
107             return isoId(((IsisNodeCase) routerIdentifier).getIsisNode().getIsoSystemId());
108         } else if (routerIdentifier instanceof IsisPseudonodeCase) {
109             final IsisPseudonode r = ((IsisPseudonodeCase) routerIdentifier).getIsisPseudonode();
110             return isoId(r.getIsIsRouterIdentifier().getIsoSystemId().getValue()) + '.'
111                 + Hex.encodeHexString(new byte[] { UnsignedBytes.checkedCast(r.getPsn()) });
112         } else if (routerIdentifier instanceof OspfNodeCase) {
113             return ((OspfNodeCase) routerIdentifier).getOspfNode().getOspfRouterId().toString();
114         } else if (routerIdentifier instanceof OspfPseudonodeCase) {
115             final OspfPseudonode r = ((OspfPseudonodeCase) routerIdentifier).getOspfPseudonode();
116             return r.getOspfRouterId().toString() + ':' + r.getLanInterface().getValue();
117         } else {
118             LOG.warn("Unhandled router identifier type {}, fallback to toString()", routerIdentifier.getImplementedInterface());
119             return routerIdentifier.toString();
120         }
121     }
122
123     UriBuilder add(final String prefix, final NodeIdentifier node) {
124         if (node.getAsNumber() != null) {
125             add(prefix + "as", node.getAsNumber().getValue());
126         }
127         if (node.getDomainId() != null) {
128             add(prefix + "domain", node.getDomainId().getValue());
129         }
130         if (node.getAreaId() != null) {
131             add(prefix + "area", node.getAreaId().getValue());
132         }
133         add(prefix + "router", formatRouterIdentifier(node.getCRouterIdentifier()));
134         return this;
135     }
136
137     @Override
138     public String toString() {
139         final String ret = this.sb.toString();
140         LOG.trace("New URI {}", ret);
141         return ret;
142     }
143 }