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
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;
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");
+ }
}
}
}
- grouping link-identifiers {
+ grouping link-lr-identifiers {
reference "http://tools.ietf.org/html/rfc5307";
leaf link-local-identifier {
type binary {
}
}
+ 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 {
}
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;
}
}
}
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;
}
}
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;
}
@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);
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(
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;
}
@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);
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(
@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) {
* 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);
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;
}
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;
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;
}
}
- 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
}
}
- 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);