From fadd85f400792fa8447649739fbc9372483ec272 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Wed, 11 May 2016 10:35:49 +0200 Subject: [PATCH] BUG-5868: Register Evpn Nlri handlers Register Evpn Nlri handlers Change-Id: Ibe787d6935ba4845fbad8239d183c374928604af Signed-off-by: Claudio D. Gasparini --- .../bgp/concepts/NextHopUtil.java | 2 + .../bgp/concepts/NextHopUtilTest.java | 14 +-- .../protocol/bgp/evpn/impl/BGPActivator.java | 14 +++ .../protocol/bgp/linkstate/BGPActivator.java | 4 +- .../next/hop/LinkstateNextHopParser.java | 27 ----- .../next/hop/LinkstateNextHopParserTest.java | 108 ------------------ .../parser/spi/NextHopParserSerializer.java | 27 ++++- .../parser/spi/pojo/SimpleNlriRegistry.java | 13 ++- 8 files changed, 59 insertions(+), 150 deletions(-) delete mode 100644 bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParser.java delete mode 100644 bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParserTest.java diff --git a/bgp/concepts/src/main/java/org/opendaylight/bgp/concepts/NextHopUtil.java b/bgp/concepts/src/main/java/org/opendaylight/bgp/concepts/NextHopUtil.java index 04e56ec2e7..39d1e7d822 100644 --- a/bgp/concepts/src/main/java/org/opendaylight/bgp/concepts/NextHopUtil.java +++ b/bgp/concepts/src/main/java/org/opendaylight/bgp/concepts/NextHopUtil.java @@ -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); } } diff --git a/bgp/concepts/src/test/java/org/opendaylight/bgp/concepts/NextHopUtilTest.java b/bgp/concepts/src/test/java/org/opendaylight/bgp/concepts/NextHopUtilTest.java index 59ae824069..f5d04fca9f 100644 --- a/bgp/concepts/src/test/java/org/opendaylight/bgp/concepts/NextHopUtilTest.java +++ b/bgp/concepts/src/test/java/org/opendaylight/bgp/concepts/NextHopUtilTest.java @@ -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 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; diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivator.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivator.java index 5fbdda8ece..e153e1ef9f 100644 --- a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivator.java +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/BGPActivator.java @@ -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 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 regs) { final DefaultGatewayExtCom defGEC = new DefaultGatewayExtCom(); regs.add(context.registerExtendedCommunityParser(defGEC.getType(true), defGEC.getSubType(), defGEC)); diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java index b5e4c59cfe..13c684085c 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java @@ -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 index d33d1fa7fb..0000000000 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParser.java +++ /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 index 8c4b7cecf5..0000000000 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/attribute/next/hop/LinkstateNextHopParserTest.java +++ /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 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 diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NextHopParserSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NextHopParserSerializer.java index 0cd648bbc2..dfd5b9c07d 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NextHopParserSerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NextHopParserSerializer.java @@ -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); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java index 4b99349c25..49945239b4 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java @@ -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 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(); } } -- 2.36.6