BUG-5844: Fix ComplexRouteEntry creation 29/38429/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Thu, 5 May 2016 13:21:43 +0000 (15:21 +0200)
committerMilos Fabian <milfabia@cisco.com>
Thu, 5 May 2016 17:51:10 +0000 (17:51 +0000)
Failed to completely propagate updates into Loc-RIB
because of wrong identifier when Add Path supported
Fix by update identifier on complex route.
RouteEntryUtil created to simplify and avoid repeated
code when creating values for routes entry.

Change-Id: I813b542c5b5bf07dbdb3da1ba9603ec6f76630c9
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/ComplexRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/SimpleRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/ComplexRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/SimpleRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseAbstractRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseComplexRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseSimpleRouteEntry.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/spi/RouteEntryUtil.java [new file with mode: 0644]

index 555d6b66dfc2d66f34c28ba66d4dd00d0d515618..e38bc8cff75c2290565b9249da76606188cace86 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.protocol.bgp.mode.api.BestPath;
 import org.opendaylight.protocol.bgp.mode.impl.OffsetMap;
 import org.opendaylight.protocol.bgp.mode.impl.add.AddPathBestPath;
 import org.opendaylight.protocol.bgp.mode.impl.add.RouteKey;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -26,16 +27,15 @@ final class ComplexRouteEntry extends AbstractAllPathsRouteEntry {
         final RouteKey key = new RouteKey(routerId, remotePathId);
         final OffsetMap<RouteKey> map = getOffsets();
         final int offset = map.offsetOf(key);
-        final boolean ret = removeRoute(key, offset);
         this.values = map.removeValue(this.values, offset);
-        return ret;
+        return removeRoute(key, offset);
     }
 
     @Override
     public MapEntryNode createValue(final YangInstanceIdentifier.PathArgument routeId, final BestPath path) {
         final OffsetMap<RouteKey> map = getOffsets();
-        final int offset = map.offsetOf(((AddPathBestPath) path).getRouteKey());
-        return map.getValue(this.values, offset);
+        final MapEntryNode mapValues = map.getValue(this.values, map.offsetOf(((AddPathBestPath) path).getRouteKey()));
+        return RouteEntryUtil.createComplexRouteValue(routeId, path, mapValues);
     }
 
     @Override
index 9d8002c0b9278eb8e331eb81140f9de694d5e845..20d02c2c14a64f3ba326e4a8125e3b39c7842afb 100644 (file)
@@ -11,12 +11,11 @@ package org.opendaylight.protocol.bgp.mode.impl.add.all.paths;
 import com.google.common.primitives.UnsignedInteger;
 import org.opendaylight.protocol.bgp.mode.api.BestPath;
 import org.opendaylight.protocol.bgp.mode.impl.add.RouteKey;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
 
 final class SimpleRouteEntry extends AbstractAllPathsRouteEntry {
     @Override
@@ -27,15 +26,11 @@ final class SimpleRouteEntry extends AbstractAllPathsRouteEntry {
 
     @Override
     public MapEntryNode createValue(final YangInstanceIdentifier.PathArgument routeId, final BestPath path) {
-        final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> b = Builders.mapEntryBuilder();
-        b.withNodeIdentifier((YangInstanceIdentifier.NodeIdentifierWithPredicates) routeId);
-        b.addChild(path.getAttributes());
-        return b.build();
+        return RouteEntryUtil.createSimpleRouteValue(routeId, path);
     }
 
     @Override
-    public int addRoute(final UnsignedInteger routerId, final Long remotePathId, final NodeIdentifier attII,
-        final NormalizedNode<?, ?> data) {
+    public int addRoute(final UnsignedInteger routerId, final Long remotePathId, final NodeIdentifier attII, final NormalizedNode<?, ?> data) {
         return addRoute(new RouteKey(routerId, remotePathId), attII, data);
     }
 }
index 3027483038f60620b82d69cde5899de3cb172320..9598a7de6522cd8b383442d904139f3c087ad55e 100644 (file)
@@ -12,6 +12,7 @@ import org.opendaylight.protocol.bgp.mode.api.BestPath;
 import org.opendaylight.protocol.bgp.mode.impl.OffsetMap;
 import org.opendaylight.protocol.bgp.mode.impl.add.AddPathBestPath;
 import org.opendaylight.protocol.bgp.mode.impl.add.RouteKey;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -30,16 +31,15 @@ final class ComplexRouteEntry extends AbstractNPathsRouteEntry {
         final RouteKey key = new RouteKey(routerId, remotePathId);
         final OffsetMap<RouteKey> map = getOffsets();
         final int offset = map.offsetOf(key);
-        final boolean ret = removeRoute(key, offset);
         this.values = map.removeValue(this.values, offset);
-        return ret;
+        return removeRoute(key, offset);
     }
 
     @Override
     public MapEntryNode createValue(final PathArgument routeId, final BestPath path) {
         final OffsetMap<RouteKey> map = getOffsets();
-        final int offset = map.offsetOf(((AddPathBestPath) path).getRouteKey());
-        return map.getValue(this.values, offset);
+        final MapEntryNode mapValues = map.getValue(this.values, map.offsetOf(((AddPathBestPath) path).getRouteKey()));
+        return RouteEntryUtil.createComplexRouteValue(routeId, path, mapValues);
     }
 
     @Override
index 4bdd87ea2b808cf9d65d37572059af932c431011..b9107240db4b8a60eb101d033d6f7152b848f586 100644 (file)
@@ -10,13 +10,11 @@ package org.opendaylight.protocol.bgp.mode.impl.add.n.paths;
 import com.google.common.primitives.UnsignedInteger;
 import org.opendaylight.protocol.bgp.mode.api.BestPath;
 import org.opendaylight.protocol.bgp.mode.impl.add.RouteKey;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-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.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
 
 final class SimpleRouteEntry extends AbstractNPathsRouteEntry {
     public SimpleRouteEntry(final Long nBestPaths) {
@@ -31,10 +29,7 @@ final class SimpleRouteEntry extends AbstractNPathsRouteEntry {
 
     @Override
     public MapEntryNode createValue(final PathArgument routeId, final BestPath path) {
-        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> b = Builders.mapEntryBuilder();
-        b.withNodeIdentifier((NodeIdentifierWithPredicates) routeId);
-        b.addChild(path.getAttributes());
-        return b.build();
+        return RouteEntryUtil.createSimpleRouteValue(routeId, path);
     }
 
     @Override
index 35408a13b92823a29ca0a587723f6e3842f40c71..d86bfee898e3900ccb70a751b709a2d491686e91 100644 (file)
@@ -90,7 +90,7 @@ abstract class BaseAbstractRouteEntry extends AbstractRouteEntry {
         final boolean modified = !newBestPath.equals(this.bestPath);
         if (modified) {
             this.removedBestPath = this.bestPath;
-            LOG.trace("Previous best {}, current best {}, result {}", this.bestPath, newBestPath, modified);
+            LOG.trace("Previous best {}, current best {}", this.bestPath, newBestPath);
             this.bestPath = newBestPath;
         }
         return modified;
index 267ba24bd7d48f20a64e6ad7b0b544557385dc28..9dd20a71a912b79234d5906a5dea4d1cd0306438 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.mode.impl.base;
 import com.google.common.primitives.UnsignedInteger;
 import org.opendaylight.protocol.bgp.mode.api.BestPath;
 import org.opendaylight.protocol.bgp.mode.impl.OffsetMap;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -34,17 +35,17 @@ final class BaseComplexRouteEntry extends BaseAbstractRouteEntry {
     }
 
     @Override
-    public MapEntryNode createValue(final PathArgument routeId, final BestPath path) {
+    public boolean removeRoute(final UnsignedInteger routerId, final Long remotePathId) {
         final OffsetMap<UnsignedInteger> map = getOffsets();
-        return map.getValue(this.values, map.offsetOf(path.getRouterId()));
+        final int offset = map.offsetOf(routerId);
+        this.values = map.removeValue(this.values, offset);
+        return removeRoute(routerId, offset);
     }
 
     @Override
-    public boolean removeRoute(final UnsignedInteger routerId, final Long remotePathId) {
+    public MapEntryNode createValue(final PathArgument routeId, final BestPath path) {
         final OffsetMap<UnsignedInteger> map = getOffsets();
-        final int offset = map.offsetOf(routerId);
-        final boolean ret = removeRoute(routerId, offset);
-        this.values = map.removeValue(this.values, offset);
-        return ret;
+        final MapEntryNode mapValues = map.getValue(this.values, map.offsetOf(path.getRouterId()));
+        return RouteEntryUtil.createComplexRouteValue(routeId, path, mapValues);
     }
 }
index 4b08d26a0b719fa431cd47f3664587bc5b6420b7..2c1aa24191a7b90b3fad5bc31162e013d0473be8 100644 (file)
@@ -9,11 +9,9 @@ package org.opendaylight.protocol.bgp.mode.impl.base;
 
 import com.google.common.primitives.UnsignedInteger;
 import org.opendaylight.protocol.bgp.mode.api.BestPath;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.protocol.bgp.mode.spi.RouteEntryUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 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.builder.api.DataContainerNodeAttrBuilder;
 
 final class BaseSimpleRouteEntry extends BaseAbstractRouteEntry {
     @Override
@@ -23,9 +21,6 @@ final class BaseSimpleRouteEntry extends BaseAbstractRouteEntry {
 
     @Override
     public MapEntryNode createValue(final PathArgument routeId, final BestPath path) {
-        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> b = Builders.mapEntryBuilder();
-        b.withNodeIdentifier((NodeIdentifierWithPredicates) routeId);
-        b.addChild(path.getAttributes());
-        return b.build();
+        return RouteEntryUtil.createSimpleRouteValue(routeId, path);
     }
 }
diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/spi/RouteEntryUtil.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/spi/RouteEntryUtil.java
new file mode 100644 (file)
index 0000000..35ff3be
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2016 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.mode.spi;
+
+import org.opendaylight.protocol.bgp.mode.api.BestPath;
+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.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+
+final public class RouteEntryUtil {
+    public static MapEntryNode createSimpleRouteValue(final PathArgument routeId, final BestPath path) {
+        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> b = Builders.mapEntryBuilder();
+        b.withNodeIdentifier((NodeIdentifierWithPredicates) routeId);
+        b.addChild(path.getAttributes());
+        return b.build();
+    }
+
+    public static MapEntryNode createComplexRouteValue(final PathArgument routeId, final BestPath path, final MapEntryNode mapValues) {
+        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder = Builders.mapEntryBuilder();
+        mapEntryBuilder.withNodeIdentifier((NodeIdentifierWithPredicates) routeId);
+        mapEntryBuilder.addChild(path.getAttributes());
+        mapValues.getValue().forEach(mapEntryBuilder::addChild);
+        return mapEntryBuilder.build();
+    }
+}