X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Ftopology-provider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fbgpcep%2Fbgp%2Ftopology%2Fprovider%2FLinkstateTopologyBuilder.java;h=ba9b989edf09b5467bba9f89191ad3342f385672;hb=5ddbbec3193f9dfcbb980379a5454b70fe4847ea;hp=edeeed2c785486052d3d80f53ba606a4a0603c49;hpb=7cddc83d7b2e086fd99f4fc31279c36c7956db9e;p=bgpcep.git diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java old mode 100755 new mode 100644 index edeeed2c78..ba9b989edf --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java @@ -7,7 +7,8 @@ */ package org.opendaylight.bgpcep.bgp.topology.provider; -import com.google.common.base.Function; +import static java.util.Objects.requireNonNull; + import com.google.common.base.Preconditions; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; @@ -25,12 +26,14 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.protocol.bgp.rib.RibReference; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.DomainName; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.DomainName; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv4InterfaceIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv6InterfaceIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.IsisAreaIdentifier; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeFlagBits; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier; @@ -100,6 +103,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TerminationPoint1; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TerminationPoint1Builder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.link.attributes.IgpLinkAttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributesBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.Prefix; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixBuilder; @@ -120,12 +124,12 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder { - private static final TopologyTypes LINKSTATE_TOPOLOGY_TYPE = new TopologyTypesBuilder() - .addAugmentation(TopologyTypes1.class, - new TopologyTypes1Builder() - .setBgpLinkstateTopology(new BgpLinkstateTopologyBuilder().build()).build()) - .build(); +public class LinkstateTopologyBuilder extends AbstractTopologyBuilder { + public static final TopologyTypes LINKSTATE_TOPOLOGY_TYPE = new TopologyTypesBuilder() + .addAugmentation(TopologyTypes1.class, + new TopologyTypes1Builder() + .setBgpLinkstateTopology(new BgpLinkstateTopologyBuilder().build()).build()) + .build(); private static final String UNHANDLED_OBJECT_CLASS = "Unhandled object class {}"; @@ -136,7 +140,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nid = getInstanceIdentifier().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class, - this.nb.getKey()); + final InstanceIdentifier nid = getNodeInstanceIdentifier(this.nb.getKey()); /* * Transaction's putOperationalData() does a merge. Force it onto a replace @@ -205,12 +207,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder() { - @Override - public TerminationPoint apply(final TpHolder input) { - return input.getTp(); - } - }))); + this.nb.setTerminationPoint(Lists.newArrayList(Collections2.transform(this.tps.values(), TpHolder::getTp))); // Re-generate prefixes this.inab.setPrefix(Lists.newArrayList(this.prefixes.values())); @@ -222,6 +219,21 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nid = getNodeInstanceIdentifier(this.nb.getKey()); + + if (!this.advertized) { + if (this.tps.isEmpty() && this.prefixes.isEmpty()) { + trans.delete(LogicalDatastoreType.OPERATIONAL, nid); + LOG.debug("Removing unadvertized unused node {}", this.nb.getNodeId()); + return true; + } + + LOG.debug("Node {} is still implied by {} TPs and {} prefixes", this.nb.getNodeId(), this.tps.size(), this.prefixes.size()); + } + return false; + } + private synchronized void removeTp(final TpId tp, final LinkId link, final boolean isRemote) { final TpHolder h = this.tps.get(tp); if (h != null) { @@ -235,12 +247,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder new TpHolder(tp)); h.addLink(link, isRemote); } @@ -260,13 +267,13 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nodes = new HashMap<>(); public LinkstateTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, final TopologyId topologyId) { - super(dataProvider, locRibReference, topologyId, LINKSTATE_TOPOLOGY_TYPE); + super(dataProvider, locRibReference, topologyId, LINKSTATE_TOPOLOGY_TYPE, LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + } + + public LinkstateTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, + final TopologyId topologyId, final long listenerResetLimitInMillsec, final int listenerResetEnforceCounter) { + super(dataProvider, locRibReference, topologyId, LINKSTATE_TOPOLOGY_TYPE, LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, + listenerResetLimitInMillsec, listenerResetEnforceCounter); } private static LinkId buildLinkId(final UriBuilder base, final LinkCase link) { @@ -288,7 +301,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder buildLinkIdentifier(final LinkId id) { return getInstanceIdentifier().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class, - new LinkKey(id)); + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class, + new LinkKey(id)); } private static Float bandwidthToFloat(final Bandwidth bandwidth) { @@ -382,19 +395,19 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder unreservedBandwidthList( - final List input) { + final List input) { final List ret = new ArrayList<>(input.size()); for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.UnreservedBandwidth i : input) { ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).setKey( - new UnreservedBandwidthKey(i.getPriority())).build()); + new UnreservedBandwidthKey(i.getPriority())).build()); } return ret; } private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes( - final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { + final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder(); if (la != null) { @@ -429,11 +442,11 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nid = getNodeInstanceIdentifier(new NodeKey(snh.getNodeId())); + trans.put(LogicalDatastoreType.OPERATIONAL, nid.child(TerminationPoint.class, srcTp.getKey()), srcTp); + } - final NodeHolder dnh = getNode(dstNode); - dnh.addTp(dstTp, lb.getLinkId(), true); LOG.debug("Created TP {} as link destination", dstTp); - putNode(trans, dnh); + NodeHolder dnh = this.nodes.get(dstNode); + if (dnh == null) { + dnh = getNode(dstNode); + dnh.addTp(dstTp, lb.getLinkId(), true); + putNode(trans, dnh); + } else { + dnh.addTp(dstTp, lb.getLinkId(), true); + final InstanceIdentifier nid = getInstanceIdentifier().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class, + new NodeKey(dnh.getNodeId())); + trans.put(LogicalDatastoreType.OPERATIONAL, nid.child(TerminationPoint.class, dstTp.getKey()), dstTp); + } final InstanceIdentifier lid = buildLinkIdentifier(lb.getLinkId()); final Link link = lb.build(); @@ -574,11 +608,13 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nid = getNodeInstanceIdentifier(new NodeKey(nh.getNodeId())); + trans.delete(LogicalDatastoreType.OPERATIONAL, nid.child(TerminationPoint.class, new TerminationPointKey(tp))); nh.removeTp(tp, link, isRemote); - putNode(trans, nh); + checkNodeForRemoval(trans, nh); } else { LOG.warn("Removed non-existent node {}", node); } @@ -603,7 +639,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder toIsoNetIds(final List areaIds, final String systemId) { - return Lists.transform(areaIds, new Function() { - @Override - public IsoNetId apply(final IsisAreaIdentifier input) { - return new IsoNetId(UriBuilder.toIsoNetId(input, systemId)); - } - }); + return Lists.transform(areaIds, input -> new IsoNetId(UriBuilder.toIsoNetId(input, systemId))); } private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes( - final NodeIdentifier node, final NodeAttributes na) { + final NodeIdentifier node, final NodeAttributes na) { final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder(); final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder(); if (na != null) { @@ -687,7 +718,7 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder nid = getNodeInstanceIdentifier(new NodeKey(nh.getNodeId())); + final InstanceIdentifier inaId = nid.builder().augmentation(Node1.class).child(IgpNodeAttributes.class).build(); + trans.put(LogicalDatastoreType.OPERATIONAL, inaId.child(Prefix.class, pk), pfx); + } } private void removePrefix(final WriteTransaction trans, final UriBuilder base, final PrefixCase p) { final NodeId node = buildNodeId(base, p.getAdvertisingNodeDescriptors()); final NodeHolder nh = this.nodes.get(node); if (nh != null) { - nh.removePrefix(p); LOG.debug("Removed prefix {}", p); - putNode(trans, nh); + final InstanceIdentifier nid = getNodeInstanceIdentifier(new NodeKey(nh.getNodeId())); + final InstanceIdentifier inaId = nid.builder().augmentation(Node1.class).child(IgpNodeAttributes.class).build(); + final IpPrefix ippfx = p.getPrefixDescriptors().getIpReachabilityInformation(); + if (ippfx == null) { + LOG.warn("IP reachability not present in prefix {}, skipping it", p); + return; + } + final PrefixKey pk = new PrefixKey(ippfx); + trans.delete(LogicalDatastoreType.OPERATIONAL, inaId.child(Prefix.class, pk)); + nh.removePrefix(p); + checkNodeForRemoval(trans, nh); } else { LOG.warn("Removing prefix from non-existing node {}", node); } } + private InstanceIdentifier getNodeInstanceIdentifier(final NodeKey nodeKey) { + return getInstanceIdentifier().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class, + nodeKey); + } + @Override protected void createObject(final ReadWriteTransaction trans, - final InstanceIdentifier id, final LinkstateRoute value) { + final InstanceIdentifier id, final LinkstateRoute value) { final UriBuilder base = new UriBuilder(value); final ObjectType t = value.getObjectType(); @@ -870,7 +921,12 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder id, final LinkstateRoute value) { + final InstanceIdentifier id, final LinkstateRoute value) { + if (value == null) { + LOG.error("Empty before-data received in delete data change notification for instance id {}", id); + return; + } + final UriBuilder base = new UriBuilder(value); final ObjectType t = value.getObjectType(); @@ -890,4 +946,9 @@ public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder getRouteWildcard(final InstanceIdentifier tablesId) { return tablesId.child((Class)LinkstateRoutes.class).child(LinkstateRoute.class); } + + @Override + protected void clearTopology() { + this.nodes.clear(); + } }