From 175ea541ccd60c2bb847f1f86db4530fbcfa6b77 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Thu, 5 May 2016 15:21:43 +0200 Subject: [PATCH] BUG-5844: Fix ComplexRouteEntry creation 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 --- .../impl/add/all/paths/ComplexRouteEntry.java | 8 ++--- .../impl/add/all/paths/SimpleRouteEntry.java | 11 ++----- .../impl/add/n/paths/ComplexRouteEntry.java | 8 ++--- .../impl/add/n/paths/SimpleRouteEntry.java | 9 ++--- .../impl/base/BaseAbstractRouteEntry.java | 2 +- .../mode/impl/base/BaseComplexRouteEntry.java | 15 +++++---- .../mode/impl/base/BaseSimpleRouteEntry.java | 9 ++--- .../protocol/bgp/mode/spi/RouteEntryUtil.java | 33 +++++++++++++++++++ 8 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/spi/RouteEntryUtil.java diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/ComplexRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/ComplexRouteEntry.java index 555d6b66df..e38bc8cff7 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/ComplexRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/ComplexRouteEntry.java @@ -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 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 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 diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/SimpleRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/SimpleRouteEntry.java index 9d8002c0b9..20d02c2c14 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/SimpleRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/all/paths/SimpleRouteEntry.java @@ -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 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); } } diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/ComplexRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/ComplexRouteEntry.java index 3027483038..9598a7de65 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/ComplexRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/ComplexRouteEntry.java @@ -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 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 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 diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/SimpleRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/SimpleRouteEntry.java index 4bdd87ea2b..b9107240db 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/SimpleRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/SimpleRouteEntry.java @@ -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 b = Builders.mapEntryBuilder(); - b.withNodeIdentifier((NodeIdentifierWithPredicates) routeId); - b.addChild(path.getAttributes()); - return b.build(); + return RouteEntryUtil.createSimpleRouteValue(routeId, path); } @Override diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseAbstractRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseAbstractRouteEntry.java index 35408a13b9..d86bfee898 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseAbstractRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseAbstractRouteEntry.java @@ -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; diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseComplexRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseComplexRouteEntry.java index 267ba24bd7..9dd20a71a9 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseComplexRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseComplexRouteEntry.java @@ -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 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 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); } } diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseSimpleRouteEntry.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseSimpleRouteEntry.java index 4b08d26a0b..2c1aa24191 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseSimpleRouteEntry.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/base/BaseSimpleRouteEntry.java @@ -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 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 index 0000000000..35ff3bec49 --- /dev/null +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/spi/RouteEntryUtil.java @@ -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 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 mapEntryBuilder = Builders.mapEntryBuilder(); + mapEntryBuilder.withNodeIdentifier((NodeIdentifierWithPredicates) routeId); + mapEntryBuilder.addChild(path.getAttributes()); + mapValues.getValue().forEach(mapEntryBuilder::addChild); + return mapEntryBuilder.build(); + } +} -- 2.36.6