BUG-3013 : added method for creating Update message from DOM
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / IPv6RIBSupport.java
index 8e856565434bb41f665efcdb3fb735be3e034b3f..be9058dff63b8b2b0a4131f34a450c060f163950 100644 (file)
@@ -7,12 +7,31 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.DestinationIpv6Case;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.bgp.rib.rib.loc.rib.tables.routes.Ipv6RoutesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.DestinationIpv6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.DestinationIpv6Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.destination.ipv6.Ipv6Prefixes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.prefixes.destination.ipv6.Ipv6PrefixesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.routes.Ipv6Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv6.routes.ipv6.routes.Ipv6Route;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv6CaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv6.routes._case.Ipv6Routes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv6.routes._case.ipv6.routes.Ipv6Route;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 
@@ -20,17 +39,20 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
  * Class supporting IPv6 unicast RIBs.
  */
 final class IPv6RIBSupport extends AbstractIPRIBSupport {
+    private final static QName PREFIX_QNAME = QName.cachedReference(QName.create(Ipv6Route.QNAME, "prefix"));
     private static final IPv6RIBSupport SINGLETON = new IPv6RIBSupport();
     private final ChoiceNode emptyRoutes = Builders.choiceBuilder()
             .withNodeIdentifier(new NodeIdentifier(Routes.QNAME))
             .addChild(Builders.containerBuilder()
                 .withNodeIdentifier(new NodeIdentifier(Ipv6Routes.QNAME))
                 .withChild(ImmutableNodes.mapNodeBuilder(Ipv6Route.QNAME).build()).build()).build();
-    private final NodeIdentifier destination = new NodeIdentifier(DestinationIpv6Case.QNAME);
+    private final NodeIdentifier destination = new NodeIdentifier(DestinationIpv6.QNAME);
     private final NodeIdentifier route = new NodeIdentifier(Ipv6Route.QNAME);
+    private final NodeIdentifier nlriRoutesList = new NodeIdentifier(Ipv6Prefixes.QNAME);
+    private final NodeIdentifier routeKeyLeaf = new NodeIdentifier(PREFIX_QNAME);
 
     private IPv6RIBSupport() {
-        super(Ipv6Routes.QNAME);
+        super(Ipv6RoutesCase.class, Ipv6Routes.class, Ipv6Route.class);
     }
 
     static IPv6RIBSupport getInstance() {
@@ -39,16 +61,71 @@ final class IPv6RIBSupport extends AbstractIPRIBSupport {
 
     @Override
     public ChoiceNode emptyRoutes() {
-        return emptyRoutes;
+        return this.emptyRoutes;
     }
 
     @Override
     protected NodeIdentifier destinationContainerIdentifier() {
-        return destination;
+        return this.destination;
     }
 
     @Override
     protected NodeIdentifier routeIdentifier() {
-        return route;
+        return this.route;
+    }
+
+    @Override
+    protected NodeIdentifier routeKeyLeafIdentifier() {
+        return this.routeKeyLeaf;
+    }
+
+    @Override
+    protected NodeIdentifier nlriRoutesListIdentifier() {
+        return this.nlriRoutesList;
+    }
+
+    @Override
+    protected QName keyLeafQName() {
+        return PREFIX_QNAME;
+    }
+
+    @Override
+    protected QName routeQName() {
+        return Ipv6Route.QNAME;
+    }
+
+    private List<Ipv6Prefixes> buildPrefixes(final Collection<MapEntryNode> routes) {
+        final List<Ipv6Prefixes> ret = new ArrayList<>(routes.size());
+        for (MapEntryNode route : routes) {
+            final String prefix = (String) route.getChild(this.routeKeyLeaf).get().getValue();
+            ret.add(new Ipv6PrefixesBuilder().setPrefix(new Ipv6Prefix(prefix)).build());
+        }
+        return ret;
+    }
+
+    @Override
+    protected MpReachNlri buildReach(final Collection<MapEntryNode> routes, final CNextHop hop) {
+        final List<Ipv6Prefixes> prefs = buildPrefixes(routes);
+
+        final MpReachNlriBuilder mb = new MpReachNlriBuilder();
+        mb.setAfi(Ipv6AddressFamily.class);
+        mb.setSafi(UnicastSubsequentAddressFamily.class);
+        mb.setCNextHop(hop);
+        mb.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
+            new DestinationIpv6CaseBuilder().setDestinationIpv6(
+                new DestinationIpv6Builder().setIpv6Prefixes(prefs).build()).build()).build());
+        return mb.build();
+    }
+
+    @Override
+    protected MpUnreachNlri buildUnreach(final Collection<MapEntryNode> routes) {
+        final List<Ipv6Prefixes> prefs = buildPrefixes(routes);
+
+        final MpUnreachNlriBuilder mb = new MpUnreachNlriBuilder();
+        mb.setAfi(Ipv6AddressFamily.class);
+        mb.setSafi(UnicastSubsequentAddressFamily.class);
+
+        // TODO Auto-generated method stub
+        return mb.build();
     }
 }