Improve generation of node/link identifiers 81/4481/1
authorRobert Varga <rovarga@cisco.com>
Tue, 21 Jan 2014 07:50:03 +0000 (08:50 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 21 Jan 2014 07:50:03 +0000 (08:50 +0100)
Change-Id: I90580daa4f3a2e34cf51b754a07e7e6950bd5015
Signed-off-by: Robert Varga <rovarga@cisco.com>
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/UriBuilder.java

index 7cbeee400ba63e5d1b5cc06626f91cfc17e389da..6d7912bb368cd96851ccf464e5512b7e0cc43361 100644 (file)
@@ -7,13 +7,24 @@
  */
 package org.opendaylight.bgpcep.bgp.topology.provider;
 
+import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeIdentifier;
 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;
 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;
 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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.CRouterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisNodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisPseudonodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfNodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfPseudonodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.primitives.UnsignedBytes;
+import com.google.common.primitives.UnsignedInteger;
+
 final class UriBuilder {
        private static final Logger LOG = LoggerFactory.getLogger(UriBuilder.class);
        private final StringBuilder sb;
@@ -45,21 +56,74 @@ final class UriBuilder {
                add("remote-", link.getRemoteNodeDescriptors());
 
                final LinkDescriptors ld = link.getLinkDescriptors();
-               add("ipv4-iface", ld.getIpv4InterfaceAddress());
-               add("ipv4-neigh", ld.getIpv4NeighborAddress());
-               add("ipv6-iface", ld.getIpv6InterfaceAddress());
-               add("ipv6-neigh", ld.getIpv6NeighborAddress());
-               add("mt", ld.getMultiTopologyId());
-               add("local-id", ld.getLinkLocalIdentifier());
-               add("remote-id", ld.getLinkRemoteIdentifier());
+               if (ld.getIpv4InterfaceAddress() != null) {
+                       add("ipv4-iface", ld.getIpv4InterfaceAddress().getValue());
+               }
+               if (ld.getIpv4NeighborAddress() != null) {
+                       add("ipv4-neigh", ld.getIpv4NeighborAddress().getValue());
+               }
+               if (ld.getIpv6InterfaceAddress() != null) {
+                       add("ipv6-iface", ld.getIpv6InterfaceAddress().getValue());
+               }
+               if (ld.getIpv6NeighborAddress() != null) {
+                       add("ipv6-neigh", ld.getIpv6NeighborAddress().getValue());
+               }
+               if (ld.getMultiTopologyId() != null) {
+                       add("mt", ld.getMultiTopologyId().getValue());
+               }
+               if (ld.getLinkLocalIdentifier() != null) {
+                       add("local-id", UnsignedInteger.fromIntBits(ByteArray.bytesToInt(ld.getLinkLocalIdentifier())));
+               }
+               if (ld.getLinkRemoteIdentifier() != null) {
+                       add("remote-id", UnsignedInteger.fromIntBits(ByteArray.bytesToInt(ld.getLinkRemoteIdentifier())));
+               }
                return this;
        }
 
+       private final String isoId(final byte[] bytes) {
+               final StringBuilder sb = new StringBuilder();
+
+               for (int i = 0; i < bytes.length - 1; i++) {
+                       sb.append(UnsignedBytes.toInt(bytes[i]));
+                       sb.append('.');
+               }
+
+               sb.append(UnsignedBytes.toInt(bytes[bytes.length - 1]));
+               return sb.toString();
+       }
+
+       private final String formatRouterIdentifier(final CRouterIdentifier routerIdentifier) {
+               if (routerIdentifier == null) {
+                       return null;
+               }
+
+               if (routerIdentifier instanceof IsisNodeCase) {
+                       return isoId(((IsisNodeCase)routerIdentifier).getIsisNode().getIsoSystemId().getValue());
+               } else if (routerIdentifier instanceof IsisPseudonodeCase) {
+                       final IsisPseudonode r = ((IsisPseudonodeCase)routerIdentifier).getIsisPseudonode();
+                       return isoId(r.getIsIsRouterIdentifier().getIsoSystemId().getValue()) + '.' + r.getPsn();
+               } else if (routerIdentifier instanceof OspfNodeCase) {
+                       return ByteArray.bytesToHexString(((OspfNodeCase)routerIdentifier).getOspfNode().getOspfRouterId());
+               } else if (routerIdentifier instanceof OspfPseudonodeCase) {
+                       final OspfPseudonode r = ((OspfPseudonodeCase)routerIdentifier).getOspfPseudonode();
+                       return ByteArray.bytesToHexString(r.getOspfRouterId()) + ':' + ByteArray.bytesToHexString(r.getLanInterface().getValue());
+               } else {
+                       LOG.warn("Unhandled router identifier type {}, fallback to toString()", routerIdentifier.getImplementedInterface());
+                       return routerIdentifier.toString();
+               }
+       }
+
        UriBuilder add(final String prefix, final NodeIdentifier node) {
-               add(prefix + "as", node.getAsNumber());
-               add(prefix + "domain", node.getDomainId());
-               add(prefix + "area", node.getAreaId());
-               add(prefix + "router", node.getCRouterIdentifier());
+               if (node.getAsNumber() != null) {
+                       add(prefix + "as", node.getAsNumber().getValue());
+               }
+               if (node.getDomainId() != null) {
+                       add(prefix + "domain", ByteArray.bytesToHexString(node.getDomainId().getValue()));
+               }
+               if (node.getAreaId() != null) {
+                       add(prefix + "area", ByteArray.bytesToHexString(node.getAreaId().getValue()));
+               }
+               add(prefix + "router", formatRouterIdentifier(node.getCRouterIdentifier()));
                return this;
        }