BUG-5868: Register Evpn Nlri handlers 35/38935/2
authorClaudio D. Gasparini <cgaspari@cisco.com>
Wed, 11 May 2016 08:35:49 +0000 (10:35 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Mon, 16 May 2016 14:31:10 +0000 (16:31 +0200)
Register Evpn Nlri handlers

Change-Id: Ibe787d6935ba4845fbad8239d183c374928604af
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/concepts/src/main/java/org/opendaylight/bgp/concepts/NextHopUtil.java
bgp/concepts/src/test/java/org/opendaylight/bgp/concepts/NextHopUtilTest.java
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivator.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParser.java [deleted file]
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParserTest.java [deleted file]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NextHopParserSerializer.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java

index 04e56ec2e7e1d8c1eb736e9bd2dd1e44091e90da..39d1e7d82227941750808376b597aa25fff0dddb 100644 (file)
@@ -45,6 +45,8 @@ public final class NextHopUtil {
             if (nextHop.getLinkLocal() != null) {
                 byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getLinkLocal()));
             }
+        } else {
+            throw new IllegalArgumentException("Cannot serialize NEXT_HOP. Class not supported: " + cnextHop);
         }
     }
 
index 59ae824069b44a1a83d8c0fc7504291ac6093e35..f5d04fca9f51801c9df26b5391add99bd319671a 100644 (file)
@@ -27,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 public class NextHopUtilTest {
 
@@ -58,14 +57,6 @@ public class NextHopUtilTest {
         assertArrayEquals(ipv6lB, ByteArray.readAllBytes(buffer));
 
         buffer.clear();
-        NextHopUtil.serializeNextHop(new CNextHop() {
-
-            @Override
-            public Class<? extends DataContainer> getImplementedInterface() {
-                return null;
-            }
-        }, buffer);
-        assertEquals(0, buffer.readableBytes());
 
         hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setLinkLocal(ipv6l).build()).build();
         buffer.clear();
@@ -77,6 +68,11 @@ public class NextHopUtilTest {
         }
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testSerializeNextHopException() {
+        NextHopUtil.serializeNextHop(() -> null, null);
+    }
+
     @Test
     public void testParseNextHop() {
         CNextHop hop = null;
index 5fbdda8ece01dc936c494fdfebe326c6ff18b2f9..e153e1ef9ff9581525e66b9b90fd219288609c02 100644 (file)
@@ -16,16 +16,21 @@ import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.ESILabelExtC
 import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.ESImpRouteTargetExtCom;
 import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.Layer2AttributesExtCom;
 import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.MACMobExtCom;
+import org.opendaylight.protocol.bgp.evpn.impl.nlri.EvpnNlriParser;
 import org.opendaylight.protocol.bgp.evpn.impl.nlri.NlriActivator;
 import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.EvpnRoutes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.evpn.routes.evpn.route.attributes.extended.communities.extended.community.DefaultGatewayExtendedCommunityCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.evpn.routes.evpn.route.attributes.extended.communities.extended.community.Layer2AttributesExtendedCommunityCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.EsImportRouteExtendedCommunityCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.EsiLabelExtendedCommunityCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.MacMobilityExtendedCommunityCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
 
 public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
     private static final int L2VPN_AFI = 25;
@@ -38,12 +43,21 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
         regs.add(context.registerSubsequentAddressFamily(EvpnSubsequentAddressFamily.class, EVPN_SAFI));
         regs.add(context.registerAddressFamily(L2vpnAddressFamily.class, L2VPN_AFI));
 
+        registerNlriHandler(context, regs);
         NlriActivator.registerNlriParsers(regs);
         registerExtendedCommunities(context, regs);
         ESIActivator.registerEsiTypeParsers(regs);
         return regs;
     }
 
+    private void registerNlriHandler(final BGPExtensionProviderContext context, final List<AutoCloseable> regs) {
+        final NextHopParserSerializer nextHopParser = new NextHopParserSerializer() {};
+        final EvpnNlriParser nlriHandler = new EvpnNlriParser();
+        regs.add(context.registerNlriParser(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class,
+            nlriHandler, nextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
+        regs.add(context.registerNlriSerializer(EvpnRoutes.class, nlriHandler));
+    }
+
     private void registerExtendedCommunities(final BGPExtensionProviderContext context, final List<AutoCloseable> regs) {
         final DefaultGatewayExtCom defGEC = new DefaultGatewayExtCom();
         regs.add(context.registerExtendedCommunityParser(defGEC.getType(true), defGEC.getSubType(), defGEC));
index b5e4c59cfe5e71058ec9d5f18fa5b56ae1849d78..13c684085cd46100e330c38abf57a604183ce44e 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.protocol.bgp.linkstate;
 import java.util.ArrayList;
 import java.util.List;
 import org.opendaylight.protocol.bgp.linkstate.attribute.LinkstateAttributeParser;
-import org.opendaylight.protocol.bgp.linkstate.attribute.next.hop.LinkstateNextHopParser;
 import org.opendaylight.protocol.bgp.linkstate.nlri.LinkNlriParser;
 import org.opendaylight.protocol.bgp.linkstate.nlri.LinkstateNlriParser;
 import org.opendaylight.protocol.bgp.linkstate.nlri.NodeNlriParser;
@@ -23,6 +22,7 @@ import org.opendaylight.protocol.bgp.linkstate.nlri.TeLspIpv6NlriParser;
 import org.opendaylight.protocol.bgp.linkstate.nlri.TeLspNlriSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
 import org.opendaylight.protocol.rsvp.parser.spi.RSVPTeObjectRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Attributes1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
@@ -71,7 +71,7 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
         regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI));
         regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI));
 
-        LinkstateNextHopParser linkstateNextHopParser = new LinkstateNextHopParser();
+        final NextHopParserSerializer linkstateNextHopParser = new NextHopParserSerializer(){};
         regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class,
             new LinkstateNlriParser(false), linkstateNextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
 
diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParser.java
deleted file mode 100644 (file)
index d33d1fa..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  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.linkstate.attribute.next.hop;
-
-import io.netty.buffer.ByteBuf;
-import org.opendaylight.bgp.concepts.NextHopUtil;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
-import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-
-public class LinkstateNextHopParser implements NextHopParserSerializer {
-    @Override
-    public CNextHop parseNextHop(final ByteBuf buffer) throws BGPParsingException {
-        return NextHopUtil.parseNextHop(buffer);
-    }
-
-    @Override
-    public void serializeNextHop(final CNextHop cNextHop, final ByteBuf byteAggregator) {
-        NextHopUtil.serializeNextHop(cNextHop, byteAggregator);
-    }
-}
\ No newline at end of file
diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParserTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParserTest.java
deleted file mode 100644 (file)
index 8c4b7ce..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  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.linkstate.attribute.next.hop;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
-import org.opendaylight.protocol.util.ByteArray;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-
-public class LinkstateNextHopParserTest {
-
-    public static final byte[] ipv6B = {0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
-    public static final byte[] ipv6lB = {0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        1, (byte) 0xfe, (byte) 0x80, 0, 0, 0, 0, 0, 0, (byte) 0xc0, 1, 0x0b, (byte) 0xff, (byte) 0xfe, 0x7e, 0, 0};
-
-    public static final Ipv6Address ipv6 = new Ipv6Address("2001:db8::1");
-    public static final Ipv6Address ipv6l = new Ipv6Address("fe80::c001:bff:fe7e:0");
-
-    LinkstateNextHopParser linkstateNextHopParser;
-    CNextHop hop;
-    ByteBuf buffer;
-
-    @Before
-    public final void setUp() {
-        linkstateNextHopParser = new LinkstateNextHopParser();
-        buffer = Unpooled.buffer();
-    }
-
-    @Test
-    public void testSerializeIpv4NextHopCase() throws BGPParsingException {
-        final byte[] ipv4B = {42, 42, 42, 42};
-        hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
-            .setGlobal(new Ipv4Address("42.42.42.42")).build()).build();
-
-        linkstateNextHopParser.serializeNextHop(hop, buffer);
-        assertArrayEquals(ipv4B, ByteArray.readAllBytes(buffer));
-
-        final CNextHop parsedHop = linkstateNextHopParser.parseNextHop(Unpooled.wrappedBuffer(ipv4B));
-        assertTrue(parsedHop instanceof Ipv4NextHopCase);
-        assertEquals(hop, parsedHop);
-    }
-
-    @Test
-    public void testSerializeIpv6NextHopCase() throws BGPParsingException {
-        hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(ipv6).setLinkLocal(ipv6l).build()).build();
-        buffer.clear();
-        linkstateNextHopParser.serializeNextHop(hop, buffer);
-        assertArrayEquals(ipv6lB, ByteArray.readAllBytes(buffer));
-
-        final CNextHop parsedHop = linkstateNextHopParser.parseNextHop(Unpooled.wrappedBuffer(ipv6B));
-        assertTrue(parsedHop instanceof Ipv6NextHopCase);
-        final Ipv6NextHop nextHopIpv6 = ((Ipv6NextHopCase) parsedHop).getIpv6NextHop();
-        assertEquals(ipv6, nextHopIpv6.getGlobal());
-        assertNull(nextHopIpv6.getLinkLocal());
-    }
-
-    @Test
-    public void testSerializeNextHopEmpty() {
-        buffer.clear();
-        try {
-            linkstateNextHopParser.serializeNextHop(new CNextHop() {
-                @Override
-                public Class<? extends DataContainer> getImplementedInterface() {
-                    return null;
-                }
-            }, buffer);
-        } catch (final IllegalArgumentException e) {
-            assertEquals("cNextHop is not a Linkstate Ipv6 NextHop object.", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testSerializeNextHopGlobalAddressEmpty() {
-        hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setLinkLocal(ipv6l).build()).build();
-        buffer.clear();
-        try {
-            linkstateNextHopParser.serializeNextHop(hop, buffer);
-            fail("Exception should happen");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Ipv6 Next Hop is missing Global address.", e.getMessage());
-        }
-    }
-}
\ No newline at end of file
index 0cd648bbc2bf33e601ccc01e8f27a3efb6e227b7..dfd5b9c07d18556b447ce2f113b078aa62e092ed 100644 (file)
@@ -9,11 +9,34 @@
 package org.opendaylight.protocol.bgp.parser.spi;
 
 import io.netty.buffer.ByteBuf;
+import javax.annotation.Nonnull;
+import org.opendaylight.bgp.concepts.NextHopUtil;
 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
 
+/**
+ * Handles Next Hop, by default use {@link NextHopUtil}
+ * which is handles Ipv4 and Ipv6 Next hop.
+ */
 public interface NextHopParserSerializer {
-    CNextHop parseNextHop(ByteBuf buffer) throws BGPParsingException;
+    /**
+     * Parse Next hop from buffer,
+     *
+     * @param buffer Encoded Next Hop in ByteBuf.
+     * @return CNextHop
+     * @throws BGPParsingException
+     */
+    default CNextHop parseNextHop(@Nonnull ByteBuf buffer) throws BGPParsingException {
+        return NextHopUtil.parseNextHop(buffer);
+    }
 
-    void serializeNextHop(CNextHop cNextHop, final ByteBuf byteAggregator);
+    /**
+     * Serialize Next Hop
+     *
+     * @param cNextHop Next Hop container
+     * @param byteAggregator return Encoded Next Hop in ByteBuf
+     */
+    default void serializeNextHop(@Nonnull CNextHop cNextHop, @Nonnull final ByteBuf byteAggregator) {
+        NextHopUtil.serializeNextHop(cNextHop, byteAggregator);
+    }
 }
index 4b99349c2509daa1abf702e57bca1a60173b2850..49945239b4c88640839de8a5c8901ae861deedd2 100644 (file)
@@ -42,6 +42,7 @@ final class SimpleNlriRegistry implements NlriRegistry {
 
     private static final int RESERVED = 1;
     private static final int NEXT_HOP_LENGHT = 1;
+    private static final String PARSER_NOT_FOUND = "Nlri parser not found for table type {}";
     private static final Logger LOG = LoggerFactory.getLogger(SimpleNlriRegistry.class);
 
     private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
@@ -154,7 +155,11 @@ final class SimpleNlriRegistry implements NlriRegistry {
         final ByteBuf nlri = buffer.slice();
         final BgpTableType key = createKey(builder.getAfi(), builder.getSafi());
         final NlriParser parser = this.handlers.get(key);
-        parser.parseNlri(nlri, builder, constraint);
+        if (parser == null) {
+            LOG.warn(PARSER_NOT_FOUND, key);
+        } else {
+            parser.parseNlri(nlri, builder, constraint);
+        }
         return builder.build();
     }
 
@@ -228,7 +233,11 @@ final class SimpleNlriRegistry implements NlriRegistry {
 
         final ByteBuf nlri = buffer.slice();
         final NlriParser parser = this.handlers.get(key);
-        parser.parseNlri(nlri, builder, constraint);
+        if (parser == null) {
+            LOG.warn(PARSER_NOT_FOUND, key);
+        } else {
+            parser.parseNlri(nlri, builder, constraint);
+        }
         return builder.build();
     }
 }