BUG-108: further progress on implementation 66/2666/1
authorRobert Varga <rovarga@cisco.com>
Tue, 12 Nov 2013 12:24:03 +0000 (13:24 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 12 Nov 2013 14:18:32 +0000 (15:18 +0100)
Change-Id: Iaeb5fbb23375c85ab2fc199c012e97eb13237b3c
Signed-off-by: Robert Varga <rovarga@cisco.com>
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParser.java
bgp/linkstate/src/main/yang/bgp-linkstate.yang
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java

index d6f59c8e8029369a082c86b86223980b2ec6a3ab..51b0291b8b613e2b55c6fd804f55497b5a4c6acb 100644 (file)
@@ -14,39 +14,57 @@ import org.opendaylight.protocol.bgp.rib.spi.AbstractAdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.Peer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.LinkstateDestination;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.linkstate.destination.CLinkstateDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.LinkstateRoute;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.LinkstateRouteBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.LinkstateRouteKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.ObjectType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.PrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.link.LinkDescriptorsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.link.LocalNodeDescriptorsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.link.RemoteNodeDescriptorsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.node.NodeDescriptorsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.route.AttributesBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 
-final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn<CLinkstateDestination, DataObject> {
+import com.google.common.base.Preconditions;
+
+final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn<CLinkstateDestination, LinkstateRoute> {
+       private static abstract class LinkstateRIBEntryData extends RIBEntryData<CLinkstateDestination, LinkstateRoute> {
+               protected LinkstateRIBEntryData(final PathAttributes attributes) {
+                       super(attributes);
+               }
+
+               protected abstract ObjectType createObject(CLinkstateDestination key);
+
+               @Override
+               protected final LinkstateRoute getDataObject(final CLinkstateDestination key) {
+                       final LinkstateRouteBuilder builder = new LinkstateRouteBuilder();
+
+                       builder.setIdentifier(key.getIdentifier());
+                       builder.setProtocolId(key.getProtocolId());
+                       builder.setDistinguisher(key.getDistinguisher());
+                       builder.setAttributes(new AttributesBuilder(getPathAttributes()).build());
+                       builder.setObjectType(Preconditions.checkNotNull(createObject(key)));
+
+                       return builder.build();
+               }
+       }
+
        LinkstateAdjRIBsIn(final Comparator<PathAttributes> comparator, final TablesKey key) {
                super(comparator, key);
        }
 
        @Override
-       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<?> basePath, final CLinkstateDestination key) {
-               final InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(basePath);
-
-               switch (key.getNlriType()) {
-               case Ipv4Prefix:
-                       // FIXME: finish this
-                       return builder.toInstance();
-               case Ipv6Prefix:
-                       // FIXME: finish this
-                       return builder.toInstance();
-               case Link:
-                       // FIXME: finish this
-                       return builder.toInstance();
-               case Node:
-                       // FIXME: finish this
-                       return builder.toInstance();
-               }
-
-               throw new IllegalStateException("Unhandled link-state NLRI type " + key.getNlriType());
+       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<Tables> basePath, final CLinkstateDestination key) {
+               return InstanceIdentifier.builder(basePath).node(LinkstateRoute.class, new LinkstateRouteKey(LinkstateNlriParser.serializeNlri(key))).toInstance();
        }
 
        @Override
@@ -57,41 +75,36 @@ final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn<CLinkstateDestination,
                        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.update.PathAttributes attributes) {
                final CLinkstateDestination key = (CLinkstateDestination) ((LinkstateDestination) nlri.getAdvertizedRoutes().getDestinationType()).getCLinkstateDestination();
 
-               RIBEntryData data = null;
+               RIBEntryData<CLinkstateDestination, LinkstateRoute> data = null;
                switch (key.getNlriType()) {
                case Ipv4Prefix:
-                       data = new RIBEntryData(attributes) {
-                               @Override
-                               protected DataObject getDataObject(final CLinkstateDestination key) {
-                                       // TODO Auto-generated method stub
-                                       return null;
-                               }
-                       };
-                       break;
                case Ipv6Prefix:
-                       data = new RIBEntryData(attributes) {
+                       data = new LinkstateRIBEntryData(attributes) {
                                @Override
-                               protected DataObject getDataObject(final CLinkstateDestination key) {
-                                       // TODO Auto-generated method stub
-                                       return null;
+                               protected Prefix createObject(final CLinkstateDestination key) {
+                                       return new PrefixBuilder(key.getPrefixDescriptors()).build();
                                }
                        };
                        break;
                case Link:
-                       data = new RIBEntryData(attributes) {
+                       data = new LinkstateRIBEntryData(attributes) {
                                @Override
-                               protected DataObject getDataObject(final CLinkstateDestination key) {
-                                       // TODO Auto-generated method stub
-                                       return null;
+                               protected ObjectType createObject(final CLinkstateDestination key) {
+                                       final LinkBuilder b = new LinkBuilder();
+
+                                       b.setLinkDescriptors(new LinkDescriptorsBuilder(key.getLinkDescriptors()).build());
+                                       b.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build());
+                                       b.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder(key.getRemoteNodeDescriptors()).build());
+
+                                       return b.build();
                                }
                        };
                        break;
                case Node:
-                       data = new RIBEntryData(attributes) {
+                       data = new LinkstateRIBEntryData(attributes) {
                                @Override
-                               protected DataObject getDataObject(final CLinkstateDestination key) {
-                                       // TODO Auto-generated method stub
-                                       return null;
+                               protected ObjectType createObject(final CLinkstateDestination key) {
+                                       return new NodeBuilder().setNodeDescriptors(new NodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()).build();
                                }
                        };
                        break;
index 91dcac7b5f5455d123a7601f529242891377cadc..c40ffb67e8105023acc4e05e9aa3e2ff40383a90 100644 (file)
@@ -363,4 +363,9 @@ public final class LinkstateNlriParser implements NlriParser {
                                new DestinationLinkstateBuilder().setCLinkstateDestination(dst).build()).build());
                NlriUtil.parseNextHop(nextHop, builder);
        }
+
+       public static byte[] serializeNlri(final CLinkstateDestination destination) {
+               // FIXME: BUG-108: finish this
+               throw new UnsupportedOperationException("BUG-108: not implemented");
+       }
 }
index b896280fc5a689a85c85c6dec057d9ee0a878e33..2a862f830138e454e7814367e9f89e06bc841fe1 100644 (file)
@@ -243,7 +243,7 @@ module bgp-linkstate {
                }
        }
 
-       grouping link-identifiers {
+       grouping link-lr-identifiers {
                reference "http://tools.ietf.org/html/rfc5307";
                leaf link-local-identifier {
                        type binary {
@@ -257,6 +257,38 @@ module bgp-linkstate {
                }
        }
 
+       grouping prefix-identifiers {
+               leaf multi-topology-id {
+                       type topology-identifier;
+               }
+               leaf ospf-route-type {
+                       when "../../protocol-id = 'ospf'";
+                       type ospf-route-type;
+               }
+               leaf ip-reachability-information {
+                       type inet:ip-prefix;
+               }
+       }
+
+       grouping link-identifier {
+               uses link-lr-identifiers;
+               leaf ipv4-interface-address {
+                       type ipv4-interface-identifier;
+               }
+               leaf ipv6-interface-address {
+                       type ipv6-interface-identifier;
+               }
+               leaf ipv4-neighbor-address {
+                       type ipv4-interface-identifier;
+               }
+               leaf ipv6-neighbor-address {
+                       type ipv6-interface-identifier;
+               }
+               leaf multi-topology-id {
+                       type topology-identifier;
+               }
+       }
+
        grouping linkstate-destination {
                list c-linkstate-destination {
                        leaf nlri-type {
@@ -280,35 +312,11 @@ module bgp-linkstate {
                        }
                        container link-descriptors {
                                when "../nlri-type = link";
-                               uses link-identifiers;
-                               leaf ipv4-interface-address {
-                                       type ipv4-interface-identifier;
-                               }
-                               leaf ipv6-interface-address {
-                                       type ipv6-interface-identifier;
-                               }
-                               leaf ipv4-neighbor-address {
-                                       type ipv4-interface-identifier;
-                               }
-                               leaf ipv6-neighbor-address {
-                                       type ipv6-interface-identifier;
-                               }
-                               leaf multi-topology-id {
-                                       type topology-identifier;
-                               }
+                               uses link-identifier;
                        }
                        container prefix-descriptors {
                                when "../nlri-type = 'ipv4-prefix' or ../nlri-type = 'ipv6-prefix'";
-                               leaf multi-topology-id {
-                                       type topology-identifier;
-                               }
-                               leaf ospf-route-type {
-                                       when "../protocol-id = 'ospf'";
-                                       type ospf-route-type;
-                               }
-                               leaf ip-reachability-information {
-                                       type inet:ip-prefix;
-                               }
+                               uses prefix-identifiers;
                        }
                }
        }
@@ -597,35 +605,11 @@ module bgp-linkstate {
                                                        uses node-identifier;
                                                }
                                                container link-descriptors {
-                                                       uses link-identifiers;
-                                                       leaf ipv4-interface-address {
-                                                               type ipv4-interface-identifier;
-                                                       }
-                                                       leaf ipv6-interface-address {
-                                                               type ipv6-interface-identifier;
-                                                       }
-                                                       leaf ipv4-neighbor-address {
-                                                               type ipv4-interface-identifier;
-                                                       }
-                                                       leaf ipv6-neighbor-address {
-                                                               type ipv6-interface-identifier;
-                                                       }
-                                                       leaf multi-topology-id {
-                                                               type topology-identifier;
-                                                       }
+                                                       uses link-identifier;
                                                }
                                        }
                                        case prefix {
-                                               leaf multi-topology-id {
-                                                       type topology-identifier;
-                                               }
-                                               leaf ospf-route-type {
-                                                       when "../../protocol-id = 'ospf'";
-                                                       type ospf-route-type;
-                                               }
-                                               leaf ip-reachability-information {
-                                                       type inet:ip-prefix;
-                                               }
+                                               uses prefix-identifiers;
                                        }
                                }
 
index b5e351c3d2f504fcd196d9dcf9ea385cf45f8e03..e764e3ba3688cf632eff7289178173250f139f04 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes.Ipv4Route;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv4.routes.Ipv4RouteBuilder;
@@ -30,7 +31,7 @@ final class Ipv4AdjRIBsIn extends AbstractAdjRIBsIn<Ipv4Prefix, Ipv4Route> {
        }
 
        @Override
-       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<?> basePath, final Ipv4Prefix key) {
+       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<Tables> basePath, final Ipv4Prefix key) {
                final InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(basePath);
 
                builder.node(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.Ipv4Routes.class);
@@ -45,7 +46,7 @@ final class Ipv4AdjRIBsIn extends AbstractAdjRIBsIn<Ipv4Prefix, Ipv4Route> {
                        final Peer peer,
                        final MpReachNlri nlri,
                        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.update.PathAttributes attributes) {
-               final RIBEntryData data = new RIBEntryData(attributes) {
+               final RIBEntryData<Ipv4Prefix, Ipv4Route> data = new RIBEntryData<Ipv4Prefix, Ipv4Route>(attributes) {
                        @Override
                        protected Ipv4Route getDataObject(final Ipv4Prefix key) {
                                return new Ipv4RouteBuilder().setKey(
index c04a58cf78fc65cc96031f1e59a62e69794200fd..4eba369cb45333996a107281782adde784f054b2 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130918.update.path.attributes.MpUnreachNlri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv6.routes.Ipv6Route;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.ipv6.routes.Ipv6RouteBuilder;
@@ -30,7 +31,7 @@ final class Ipv6AdjRIBsIn extends AbstractAdjRIBsIn<Ipv6Prefix, Ipv6Route> {
        }
 
        @Override
-       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<?> basePath, final Ipv6Prefix key) {
+       public InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<Tables> basePath, final Ipv6Prefix key) {
                final InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(basePath);
 
                builder.node(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.routes.Ipv6Routes.class);
@@ -45,7 +46,7 @@ final class Ipv6AdjRIBsIn extends AbstractAdjRIBsIn<Ipv6Prefix, Ipv6Route> {
                        final Peer peer,
                        final MpReachNlri nlri,
                        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.update.PathAttributes attributes) {
-               final RIBEntryData data = new RIBEntryData(attributes) {
+               final RIBEntryData<Ipv6Prefix, Ipv6Route> data = new RIBEntryData<Ipv6Prefix, Ipv6Route>(attributes) {
                        @Override
                        protected Ipv6Route getDataObject(final Ipv6Prefix key) {
                                return new Ipv6RouteBuilder().setKey(
index e7bdaeb9907b27c83ff521347e59fe8fad553ca0..6c8013e7d72eb8bcdbd14366541fd9a7d25cc9ad 100644 (file)
@@ -27,7 +27,7 @@ import com.google.common.base.Preconditions;
 
 @ThreadSafe
 public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements AdjRIBsIn {
-       protected abstract class RIBEntryData {
+       protected static abstract class RIBEntryData<ID, DATA extends DataObject> {
                private final PathAttributes attributes;
 
                protected RIBEntryData(final PathAttributes attributes) {
@@ -52,13 +52,13 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                 *       to retain the candidate states ordered -- thus selection would occur
                 *       automatically through insertion, without the need of a second walk.
                 */
-               private final Map<Peer, RIBEntryData> candidates = new HashMap<>();
+               private final Map<Peer, RIBEntryData<ID, DATA>> candidates = new HashMap<>();
                private final ID key;
 
                @GuardedBy("this")
                private InstanceIdentifier<?> name;
                @GuardedBy("this")
-               private RIBEntryData currentState;
+               private RIBEntryData<ID, DATA> currentState;
 
                RIBEntry(final ID key) {
                        this.key = Preconditions.checkNotNull(key);
@@ -71,9 +71,9 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                        return this.name;
                }
 
-               private RIBEntryData findCandidate(final RIBEntryData initial) {
-                       RIBEntryData newState = initial;
-                       for (final RIBEntryData s : this.candidates.values()) {
+               private RIBEntryData<ID, DATA> findCandidate(final RIBEntryData<ID, DATA> initial) {
+                       RIBEntryData<ID, DATA> newState = initial;
+                       for (final RIBEntryData<ID, DATA> s : this.candidates.values()) {
                                if (newState == null || AbstractAdjRIBsIn.this.comparator.compare(newState.attributes, s.attributes) > 0) {
                                        newState = s;
                                }
@@ -82,7 +82,7 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                        return newState;
                }
 
-               private void electCandidate(final DataModificationTransaction transaction, final RIBEntryData candidate) {
+               private void electCandidate(final DataModificationTransaction transaction, final RIBEntryData<ID, DATA> candidate) {
                        if (this.currentState == null || !this.currentState.equals(candidate)) {
                                transaction.putRuntimeData(getName(), candidate.getDataObject(this.key));
                                this.currentState = candidate;
@@ -92,7 +92,7 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                synchronized boolean removeState(final DataModificationTransaction transaction, final Peer peer) {
                        this.candidates.remove(peer);
 
-                       final RIBEntryData candidate = findCandidate(null);
+                       final RIBEntryData<ID, DATA> candidate = findCandidate(null);
                        if (candidate != null) {
                                electCandidate(transaction, candidate);
                                return true;
@@ -102,20 +102,20 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                        }
                }
 
-               synchronized void setState(final DataModificationTransaction transaction, final Peer peer, final RIBEntryData state) {
+               synchronized void setState(final DataModificationTransaction transaction, final Peer peer, final RIBEntryData<ID, DATA> state) {
                        this.candidates.put(peer, state);
                        electCandidate(transaction, findCandidate(state));
                }
        }
 
        private final Comparator<PathAttributes> comparator;
-       private final InstanceIdentifier<?> basePath;
+       private final InstanceIdentifier<Tables> basePath;
        @GuardedBy("this")
        private final Map<ID, RIBEntry> entries = new HashMap<>();
 
        protected AbstractAdjRIBsIn(final Comparator<PathAttributes> comparator, final TablesKey key) {
                this.comparator = Preconditions.checkNotNull(comparator);
-               this.basePath = InstanceIdentifier.builder().node(LocRib.class).node(Tables.class, key).toInstance();
+               this.basePath = InstanceIdentifier.builder().node(LocRib.class).child(Tables.class, key).toInstance();
        }
 
        @Override
@@ -130,9 +130,9 @@ public abstract class AbstractAdjRIBsIn<ID, DATA extends DataObject> implements
                }
        }
 
-       protected abstract InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<?> basePath, final ID id);
+       protected abstract InstanceIdentifier<?> identifierForKey(final InstanceIdentifier<Tables> basePath, final ID id);
 
-       protected synchronized void add(final DataModificationTransaction trans, final Peer peer, final ID id, final RIBEntryData data) {
+       protected synchronized void add(final DataModificationTransaction trans, final Peer peer, final ID id, final RIBEntryData<ID, DATA> data) {
                RIBEntry e = this.entries.get(id);
                if (e == null) {
                        e = new RIBEntry(id);