Bug 5380 - NPE in BGP-LS MPLS-TE LSP serializer 98/35298/1
authorMilos Fabian <milfabia@cisco.com>
Thu, 18 Feb 2016 12:29:02 +0000 (13:29 +0100)
committerRobert Varga <nite@hq.sk>
Tue, 23 Feb 2016 23:27:16 +0000 (23:27 +0000)
Fix NLRI transformation from BI to BA - cases are
not a part of the BI data representation.

Fix typo in LSP TE NLRI type enumeration encoding -
missing hypen.

Change-Id: I0ee2470bc287b438a3d96189ea524145784ff95c
Signed-off-by: Milos Fabian <milfabia@cisco.com>
(cherry picked from commit 430e082b6a89ea6957fdb3c1b6930f72f702dac1)

bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/nlri/LinkstateNlriParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/nlri/TeLspNlriParser.java
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java

index 276ea6beb232df65ddfb8f5c6bf3ac7e56ffbfaa..7af1e65d0523533df000a69edc486c6bd5935e18 100644 (file)
@@ -102,8 +102,6 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
     @VisibleForTesting
     public static final NodeIdentifier LINK_DESCRIPTORS_NID = new NodeIdentifier(LinkDescriptors.QNAME);
 
-    @VisibleForTesting
-    public static final NodeIdentifier TE_LSP_NID = new NodeIdentifier(TeLspCase.QNAME);
     @VisibleForTesting
     public static final NodeIdentifier DISTINGUISHER_NID = new NodeIdentifier(QName.create(CLinkstateDestination.QNAME, "route-distinguisher").intern());
     @VisibleForTesting
@@ -304,7 +302,7 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
             TlvUtil.writeTLV(LOCAL_NODE_DESCRIPTORS_TYPE, ldescs, nlriByteBuf);
             nlriType = NlriType.Node;
         } else if (ot instanceof TeLspCase) {
-            final TeLspCase teLSP = (TeLspCase) destination.getObjectType();
+            final TeLspCase teLSP = ((TeLspCase) destination.getObjectType());
             final AddressFamily afi = teLSP.getAddressFamily();
             nlriType = TeLspNlriParser.serializeIpvTSA(afi, ldescs);
             TeLspNlriParser.serializeTunnelID(teLSP.getTunnelId(), ldescs);
@@ -361,7 +359,7 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
             return ProtocolId.Direct.getIntValue();
         case "static":
             return ProtocolId.Static.getIntValue();
-        case "rsvpte":
+        case "rsvp-te":
             return ProtocolId.RsvpTe.getIntValue();
         case "bgp-epe":
             return ProtocolId.BgpEpe.getIntValue();
@@ -387,8 +385,8 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
             } else {
                 LOG.warn("Unknown Object Type.");
             }
-        } else if (objectType.getChild(TE_LSP_NID).isPresent()) {
-            builder.setObjectType(TeLspNlriParser.serializeTeLsp((ContainerNode) objectType.getChild(TE_LSP_NID).get()));
+        } else if (TeLspNlriParser.isTeLsp(objectType)) {
+            builder.setObjectType(TeLspNlriParser.serializeTeLsp(objectType));
         }
         return builder.build();
     }
index 7aa04651a217964ee56310a216cbdb64ab148933..0a19ea40bfcf8cba16b05c88b2b645cd54b12f60 100644 (file)
@@ -12,6 +12,7 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv4Address;
 import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv6Address;
 import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeShort;
 import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedShort;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
@@ -31,7 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 
 @VisibleForTesting
 public final class TeLspNlriParser {
@@ -55,10 +55,6 @@ public final class TeLspNlriParser {
     public static final YangInstanceIdentifier.NodeIdentifier IPV6_TUNNEL_ENDPOINT_ADDRESS = new YangInstanceIdentifier
         .NodeIdentifier(QName.create(CLinkstateDestination.QNAME, "ipv6-tunnel-endpoint-address").intern());
 
-    @VisibleForTesting
-    public static final YangInstanceIdentifier.NodeIdentifier IPV4_CASE = new YangInstanceIdentifier.NodeIdentifier(Ipv4Case.QNAME);
-    @VisibleForTesting
-    public static final YangInstanceIdentifier.NodeIdentifier IPV6_CASE = new YangInstanceIdentifier.NodeIdentifier(Ipv6Case.QNAME);
     @VisibleForTesting
     public static final YangInstanceIdentifier.NodeIdentifier ADDRESS_FAMILY = new YangInstanceIdentifier.NodeIdentifier(AddressFamily.QNAME);
 
@@ -105,35 +101,31 @@ public final class TeLspNlriParser {
         writeIpv4Address(ipv4, body);
     }
 
-    public static TeLspCase serializeTeLsp(final ContainerNode containerNode) {
-        final TeLspCaseBuilder teLspCase = new TeLspCaseBuilder();
-        teLspCase.setLspId(new LspId((Long) containerNode.getChild(LSP_ID).get().getValue()));
-        teLspCase.setTunnelId(new TunnelId((Integer) containerNode.getChild(TUNNEL_ID).get().getValue()));
-        if(containerNode.getChild(ADDRESS_FAMILY).isPresent()) {
-            final ChoiceNode addressFamily = (ChoiceNode) containerNode.getChild(ADDRESS_FAMILY).get();
-            if(addressFamily.getChild(IPV4_CASE).isPresent()) {
-                teLspCase.setAddressFamily(serializeAddressFamily((ContainerNode) addressFamily.getChild(IPV4_CASE)
-                    .get(), true));
-            }else{
-                teLspCase.setAddressFamily(serializeAddressFamily((ContainerNode) addressFamily.getChild(IPV6_CASE)
-                    .get(), false));
-            }
-        }
+    public static boolean isTeLsp(final ChoiceNode objectType) {
+        return objectType.getChild(ADDRESS_FAMILY).isPresent();
+    }
+
+    public static TeLspCase serializeTeLsp(final ChoiceNode objectType) {
+        final TeLspCaseBuilder teLsp = new TeLspCaseBuilder();
+        teLsp.setLspId(new LspId((Long) objectType.getChild(LSP_ID).get().getValue()));
+        teLsp.setTunnelId(new TunnelId((Integer) objectType.getChild(TUNNEL_ID).get().getValue()));
+        final ChoiceNode addressFamily = (ChoiceNode) objectType.getChild(ADDRESS_FAMILY).get();
+        teLsp.setAddressFamily(serializeAddressFamily(addressFamily, addressFamily.getChild(IPV4_TUNNEL_SENDER_ADDRESS).isPresent()));
 
-        return teLspCase.build();
+        return teLsp.build();
     }
 
-    private static AddressFamily serializeAddressFamily(final ContainerNode containerNode, final boolean ipv4Case) {
+    private static AddressFamily serializeAddressFamily(final ChoiceNode addressFamily, final boolean ipv4Case) {
         if(ipv4Case) {
             return new Ipv4CaseBuilder()
-                .setIpv4TunnelSenderAddress(new Ipv4Address((String) containerNode.getChild(IPV4_TUNNEL_SENDER_ADDRESS).get().getValue()))
-                .setIpv4TunnelEndpointAddress(new Ipv4Address((String) containerNode.getChild(IPV4_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
+                .setIpv4TunnelSenderAddress(new Ipv4Address((String) addressFamily.getChild(IPV4_TUNNEL_SENDER_ADDRESS).get().getValue()))
+                .setIpv4TunnelEndpointAddress(new Ipv4Address((String) addressFamily.getChild(IPV4_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
                 .build();
         }
 
         return new Ipv6CaseBuilder()
-            .setIpv6TunnelSenderAddress(new Ipv6Address((String) containerNode.getChild(IPV6_TUNNEL_SENDER_ADDRESS).get().getValue()))
-            .setIpv6TunnelEndpointAddress(new Ipv6Address((String) containerNode.getChild(IPV6_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
+            .setIpv6TunnelSenderAddress(new Ipv6Address((String) addressFamily.getChild(IPV6_TUNNEL_SENDER_ADDRESS).get().getValue()))
+            .setIpv6TunnelEndpointAddress(new Ipv6Address((String) addressFamily.getChild(IPV6_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
             .build();
     }
 }
index 391d0146aa08bd9f540b096ee6bc3df1e7e006c8..d42b0e8fc42713fda1bb6fa28677fd132a106f46 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.linkstate;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -500,7 +501,7 @@ public class LinkstateNlriParserTest {
         assertNull(this.dest.getDistinguisher());
         assertEquals(ProtocolId.RsvpTe, this.dest.getProtocolId());
         assertEquals(BigInteger.ONE, this.dest.getIdentifier().getValue());
-        final TeLspCase teCase = ((TeLspCase) this.dest.getObjectType());
+        final TeLspCase teCase = (TeLspCase) this.dest.getObjectType();
 
         assertEquals(new LspId(1L), teCase.getLspId());
         assertEquals(new TunnelId(1), teCase.getTunnelId());
@@ -513,7 +514,7 @@ public class LinkstateNlriParserTest {
 
         final ImmutableLeafNodeBuilder<String> protocolId = new ImmutableLeafNodeBuilder<>();
         protocolId.withNodeIdentifier(LinkstateNlriParser.PROTOCOL_ID_NID);
-        protocolId.withValue("rsvpte");
+        protocolId.withValue("rsvp-te");
         linkstateBI.addChild(protocolId.build());
 
         final ImmutableLeafNodeBuilder<BigInteger> identifier = new ImmutableLeafNodeBuilder<>();
@@ -524,11 +525,6 @@ public class LinkstateNlriParserTest {
         final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> objectType = Builders.choiceBuilder();
         objectType.withNodeIdentifier(LinkstateNlriParser.OBJECT_TYPE_NID);
 
-        // advertising node descriptors
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> teLspCase = Builders.containerBuilder();
-        teLspCase.withNodeIdentifier(LinkstateNlriParser.TE_LSP_NID);
-        objectType.addChild(teLspCase.build());
-
         final ImmutableLeafNodeBuilder<Long> lspId = new ImmutableLeafNodeBuilder<>();
         lspId.withNodeIdentifier(TeLspNlriParser.LSP_ID);
         lspId.withValue(1L);
@@ -540,9 +536,6 @@ public class LinkstateNlriParserTest {
         final DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> addressFamily = Builders.choiceBuilder();
         addressFamily.withNodeIdentifier(TeLspNlriParser.ADDRESS_FAMILY);
 
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> ipv4Case = Builders.containerBuilder();
-        ipv4Case.withNodeIdentifier(TeLspNlriParser.IPV4_CASE);
-
         final ImmutableLeafNodeBuilder<String> ipv4TunnelSenderAddress = new ImmutableLeafNodeBuilder<>();
         ipv4TunnelSenderAddress.withNodeIdentifier(TeLspNlriParser.IPV4_TUNNEL_SENDER_ADDRESS);
         ipv4TunnelSenderAddress.withValue("1.2.3.4");
@@ -551,16 +544,13 @@ public class LinkstateNlriParserTest {
         ipv4TunnelEndPointAddress.withNodeIdentifier(TeLspNlriParser.IPV4_TUNNEL_ENDPOINT_ADDRESS);
         ipv4TunnelEndPointAddress.withValue("4.3.2.1");
 
-        ipv4Case.addChild(ipv4TunnelSenderAddress.build());
-        ipv4Case.addChild(ipv4TunnelEndPointAddress.build());
-
-        addressFamily.addChild(ipv4Case.build());
+        addressFamily.addChild(ipv4TunnelSenderAddress.build());
+        addressFamily.addChild(ipv4TunnelEndPointAddress.build());
 
-        teLspCase.addChild(lspId.build());
-        teLspCase.addChild(tunnelId.build());
-        teLspCase.addChild(addressFamily.build());
+        objectType.addChild(lspId.build());
+        objectType.addChild(tunnelId.build());
+        objectType.addChild(addressFamily.build());
 
-        objectType.addChild(teLspCase.build());
         linkstateBI.addChild(objectType.build());
         assertEquals(this.dest, LinkstateNlriParser.extractLinkstateDestination(linkstateBI.build()));
     }