X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pcep%2Ftopology%2Ftopology-provider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fbgpcep%2Fpcep%2Ftopology%2Fprovider%2FAbstractTopologySessionListener.java;h=6190db4f5c347a6a180614146d15b4e8888fa8a6;hb=refs%2Fchanges%2F11%2F100711%2F3;hp=bf34c74f640f337e28149fd0bcbbffa1b2b725b5;hpb=2bd96e8b6c948273d08360c0c8c205db934b8d0a;p=bgpcep.git diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractTopologySessionListener.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractTopologySessionListener.java index bf34c74f64..6190db4f5c 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractTopologySessionListener.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractTopologySessionListener.java @@ -45,15 +45,17 @@ import org.opendaylight.protocol.pcep.PCEPSession; import org.opendaylight.protocol.pcep.PCEPTerminationReason; import org.opendaylight.protocol.pcep.TerminationReason; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Stateful1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.LspObject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Path1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.StatefulTlv1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.Stateful; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.MessageHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Object; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.ProtocolVersion; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.Tlvs; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.LspId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.Node1; @@ -67,6 +69,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLsp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLspBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLspKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.StatefulTlvBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.reported.lsp.Path; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.reported.lsp.PathKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; @@ -74,7 +77,6 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.opendaylight.yangtools.yang.common.Uint8; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,20 +88,9 @@ import org.slf4j.LoggerFactory; public abstract class AbstractTopologySessionListener implements TopologySessionListener, TopologySessionStats { private static final Logger LOG = LoggerFactory.getLogger(AbstractTopologySessionListener.class); - static final String MISSING_XML_TAG = "Mandatory XML tags are missing."; - static final MessageHeader MESSAGE_HEADER = new MessageHeader() { - private final ProtocolVersion version = new ProtocolVersion(Uint8.ONE); - - @Override - public Class implementedInterface() { - return MessageHeader.class; - } - - @Override - public ProtocolVersion getVersion() { - return version; - } - }; + private final AtomicBoolean statefulCapability = new AtomicBoolean(false); + private final AtomicBoolean lspUpdateCapability = new AtomicBoolean(false); + private final AtomicBoolean initiationCapability = new AtomicBoolean(false); @GuardedBy("this") final Map lsps = new HashMap<>(); @@ -168,7 +159,7 @@ public abstract class AbstractTopologySessionListener implements TopologySession .setIpAddress(IetfInetUtil.INSTANCE.ipAddressNoZoneFor(peerAddress)); // Let subclass fill the details - onSessionUp(pccBuilder, peerAddress, psession.getRemoteTlvs()); + updateStatefulCapabilities(pccBuilder, peerAddress, psession.getRemoteTlvs()); synced.set(isSynchronized()); @@ -193,8 +184,46 @@ public abstract class AbstractTopologySessionListener implements TopologySession } } - protected abstract void onSessionUp(PathComputationClientBuilder pccBuilder, InetAddress peerAddress, - @Nullable Tlvs remoteTlvs); + @Holding("this") + private void updateStatefulCapabilities(final PathComputationClientBuilder pccBuilder, + final InetAddress peerAddress, final @Nullable Tlvs remoteTlvs) { + if (remoteTlvs != null) { + final Tlvs1 statefulTlvs = remoteTlvs.augmentation(Tlvs1.class); + if (statefulTlvs != null) { + final Stateful stateful = statefulTlvs.getStateful(); + if (stateful != null) { + statefulCapability.set(true); + final var updateCap = stateful.getLspUpdateCapability(); + if (updateCap != null) { + lspUpdateCapability.set(updateCap); + } + final Stateful1 stateful1 = stateful.augmentation(Stateful1.class); + if (stateful1 != null) { + final var initiation = stateful1.getInitiation(); + if (initiation != null) { + initiationCapability.set(initiation); + } + } + + pccBuilder.setReportedLsp(Map.of()); + if (isSynchronized()) { + pccBuilder.setStateSync(PccSyncState.Synchronized); + } else if (isTriggeredInitialSynchro()) { + pccBuilder.setStateSync(PccSyncState.TriggeredInitialSync); + } else if (isIncrementalSynchro()) { + pccBuilder.setStateSync(PccSyncState.IncrementalSync); + } else { + pccBuilder.setStateSync(PccSyncState.InitialResync); + } + pccBuilder.setStatefulTlv(new StatefulTlvBuilder() + .addAugmentation(new StatefulTlv1Builder(statefulTlvs).build()) + .build()); + return; + } + } + } + LOG.debug("Peer {} does not advertise stateful TLV", peerAddress); + } synchronized void updatePccState(final PccSyncState pccSyncState) { if (nodeState == null) { @@ -609,7 +638,7 @@ public abstract class AbstractTopologySessionListener implements TopologySession } @Override - public int getDelegatedLspsCount() { + public final int getDelegatedLspsCount() { return Math.toIntExact(lspData.values().stream() .map(ReportedLsp::getPath).filter(pathList -> pathList != null && !pathList.isEmpty()) // pick the first path, as delegate status should be same in each path @@ -621,10 +650,26 @@ public abstract class AbstractTopologySessionListener implements TopologySession } @Override - public boolean isSessionSynchronized() { + public final boolean isSessionSynchronized() { return synced.get(); } + @Override + public final boolean isInitiationCapability() { + return initiationCapability.get(); + } + + @Override + public final boolean isStatefulCapability() { + return statefulCapability.get(); + } + + @Override + public final boolean isLspUpdateCapability() { + return lspUpdateCapability.get(); + } + + @Override public synchronized ListenableFuture> tearDownSession(final TearDownSessionInput input) { close();