Create common parent for extensions families
[bgpcep.git] / bgp / extensions / mvpn / src / main / java / org / opendaylight / protocol / bgp / mvpn / impl / MvpnIpv6RIBSupport.java
diff --git a/bgp/extensions/mvpn/src/main/java/org/opendaylight/protocol/bgp/mvpn/impl/MvpnIpv6RIBSupport.java b/bgp/extensions/mvpn/src/main/java/org/opendaylight/protocol/bgp/mvpn/impl/MvpnIpv6RIBSupport.java
new file mode 100644 (file)
index 0000000..e7766a3
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.mvpn.impl;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.protocol.bgp.mvpn.impl.nlri.Ipv6NlriHandler;
+import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.destination.DestinationType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.MvpnDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.bgp.rib.rib.loc.rib.tables.routes.MvpnRoutesIpv6Case;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.bgp.rib.rib.loc.rib.tables.routes.MvpnRoutesIpv6CaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn.destination.MvpnDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn.routes.ipv6.MvpnRoutesIpv6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn.routes.ipv6.MvpnRoutesIpv6Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationMvpnIpv6AdvertizedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.mvpn.ipv6.advertized._case.DestinationMvpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.mvpn.ipv6.advertized._case.DestinationMvpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationMvpnIpv6WithdrawnCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+
+/**
+ * Ipv6 Mvpn RIBSupport.
+ *
+ * @author Claudio D. Gasparini
+ */
+final class MvpnIpv6RIBSupport extends AbstractMvpnRIBSupport<MvpnRoutesIpv6Case, MvpnRoutesIpv6> {
+    private static final MvpnRoutesIpv6 EMPTY_CONTAINER = new MvpnRoutesIpv6Builder()
+            .setMvpnRoute(Collections.emptyList()).build();
+    private static final MvpnRoutesIpv6Case EMPTY_CASE =
+            new MvpnRoutesIpv6CaseBuilder().setMvpnRoutesIpv6(EMPTY_CONTAINER).build();
+    private static MvpnIpv6RIBSupport SINGLETON;
+
+    private MvpnIpv6RIBSupport(final BindingNormalizedNodeSerializer mappingService) {
+        super(mappingService,
+                MvpnRoutesIpv6Case.class,
+                MvpnRoutesIpv6.class,
+                Ipv6AddressFamily.class,
+                DestinationMvpn.QNAME,
+                MvpnDestination.QNAME);
+    }
+
+    static synchronized MvpnIpv6RIBSupport getInstance(final BindingNormalizedNodeSerializer mappingService) {
+        if (SINGLETON == null) {
+            SINGLETON = new MvpnIpv6RIBSupport(mappingService);
+        }
+        return SINGLETON;
+    }
+
+    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn
+            .destination.MvpnDestination> extractRoutes(final Collection<MapEntryNode> routes) {
+        return routes.stream().map(this::extractDestination).collect(Collectors.toList());
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn
+            .destination.MvpnDestination extractDestination(final DataContainerNode<? extends PathArgument> mvpnDest) {
+        return new MvpnDestinationBuilder()
+                .setMvpnChoice(extractMvpnChoice(mvpnDest))
+                .setPathId(PathIdUtil.buildPathId(mvpnDest, routePathIdNid()))
+                .build();
+    }
+
+    @Override
+    protected DestinationType buildDestination(final Collection<MapEntryNode> routes) {
+        return new DestinationMvpnIpv6AdvertizedCaseBuilder().setDestinationMvpn(
+                new DestinationMvpnBuilder().setMvpnDestination(extractRoutes(routes)).build()).build();
+    }
+
+    @Override
+    protected DestinationType buildWithdrawnDestination(final Collection<MapEntryNode> routes) {
+        return new DestinationMvpnIpv6WithdrawnCaseBuilder().setDestinationMvpn(
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.update
+                        .attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.mvpn.ipv6
+                        .withdrawn._case.DestinationMvpnBuilder().setMvpnDestination(extractRoutes(routes))
+                        .build()).build();
+    }
+
+    @Override
+    public MvpnRoutesIpv6Case emptyRoutesCase() {
+        return EMPTY_CASE;
+    }
+
+    @Override
+    public MvpnRoutesIpv6 emptyRoutesContainer() {
+        return EMPTY_CONTAINER;
+    }
+
+    @Override
+    public NodeIdentifierWithPredicates createRouteKey(final UnkeyedListEntryNode mvpn) {
+        final ByteBuf buffer = Unpooled.buffer();
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.ipv6.rev180417.mvpn.destination
+                .MvpnDestination dest = extractDestination(mvpn);
+        Ipv6NlriHandler.serializeNlri(Collections.singletonList(dest), buffer);
+        final Optional<DataContainerChild<? extends PathArgument, ?>> maybePathIdLeaf =
+                mvpn.getChild(routePathIdNid());
+        return PathIdUtil.createNidKey(routeQName(), routeKeyQName(),
+                pathIdQName(), ByteArray.encodeBase64(buffer), maybePathIdLeaf);
+    }
+}