From c80c47c08a7c19535b8fe5fd1ec6b29c47046a6a Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Mon, 28 Mar 2022 18:10:42 +0200 Subject: [PATCH] Add Graph mapping to PCEP topology PCEP implementation is able to manage several pcep-topology. For each topology, a new PCEP Session Manager is started as well as a dedicated PCE server. However, each PCE server uses the same Graph Topology for Path Computation which could be useless. This patch adds a new key in the pcep-config yang model to configure the associated TED i.e. the name of the Connected Graph that provides it. This allows a possible mapping between different PCEP Topology and Graph Topology. Signed-off-by: Olivier Dugeon Change-Id: I90ee70a63c22f2a0ece2f7731ef90dac0c05225e --- docs/pcep/pcep-user-guide-pce-server.rst | 6 +++- pcep/api/src/main/yang/pcep-config.yang | 9 ++++++ .../initial/network-topology-pcep-config.xml | 3 +- ...ep-topology-sync-optimizations-config.yang | 2 +- .../bgpcep/pcep/server/PceServerProvider.java | 6 ++-- .../provider/DefaultPceServerProvider.java | 29 ++++++++++--------- .../yang/network-pcep-topology-config.yang | 2 +- pcep/topology/topology-provider/pom.xml | 4 +++ .../provider/PCEPStatefulPeerProposal.java | 2 +- .../provider/PCEPTopologyConfiguration.java | 16 ++++++++-- .../provider/PCEPTopologyProvider.java | 3 +- .../provider/ServerSessionManager.java | 9 ++++-- .../provider/AbstractPCEPSessionTest.java | 4 ++- 13 files changed, 67 insertions(+), 28 deletions(-) diff --git a/docs/pcep/pcep-user-guide-pce-server.rst b/docs/pcep/pcep-user-guide-pce-server.rst index 155080a487..ad3f3e7042 100644 --- a/docs/pcep/pcep-user-guide-pce-server.rst +++ b/docs/pcep/pcep-user-guide-pce-server.rst @@ -28,7 +28,11 @@ Graph Setup The PCE Server uses the Path Computation Algorithm plugin which needs a graph to be able to compute constrained paths. Thus, a valid graph must be provided -manually or automatically. +manually or automatically. For that purpose, a new key **ted-name** has been +introduced in the pcep configuration. By default, the pcep configuration is +fulfill with a ted named 'example-linkstate-topology' in the +'network-topology-pcep-config.xml' configuration file located under +'etc/opendaylight/bgpcep'. This 'ted-name' must corresponds to a valid graph. Manual activation ''''''''''''''''' diff --git a/pcep/api/src/main/yang/pcep-config.yang b/pcep/api/src/main/yang/pcep-config.yang index a8dba94503..f7beace5f4 100644 --- a/pcep/api/src/main/yang/pcep-config.yang +++ b/pcep/api/src/main/yang/pcep-config.yang @@ -20,6 +20,10 @@ module pcep-config { accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html"; + revision 2022-03-28 { + description "Add ted-name key"; + } + revision 2020-01-20 { description "Update to use -no-zone-adresses"; } @@ -60,6 +64,11 @@ module pcep-config { default 30; units seconds; } + + leaf ted-name { + type string; + default "example-linkstate-topology"; + } } } diff --git a/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml b/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml index bb9d023502..316e7b5f23 100644 --- a/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml +++ b/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml @@ -18,6 +18,7 @@ 4189 120 30 + example-linkstate-topology 43.43.43.43 @@ -27,4 +28,4 @@ - \ No newline at end of file + diff --git a/pcep/ietf-stateful/src/main/yang/odl-pcep-topology-sync-optimizations-config.yang b/pcep/ietf-stateful/src/main/yang/odl-pcep-topology-sync-optimizations-config.yang index ddb68fac17..f036f947ed 100644 --- a/pcep/ietf-stateful/src/main/yang/odl-pcep-topology-sync-optimizations-config.yang +++ b/pcep/ietf-stateful/src/main/yang/odl-pcep-topology-sync-optimizations-config.yang @@ -7,7 +7,7 @@ module odl-pcep-topology-sync-optimizations-config { import network-topology { prefix nt; revision-date 2013-10-21; } import network-topology-pcep { prefix pn; revision-date 2020-01-20; } import yang-ext { prefix ext; revision-date 2013-07-09; } - import pcep-config { prefix pc; revision-date 2020-01-20; } + import pcep-config { prefix pc; revision-date 2022-03-28; } import odl-pcep-sync-optimizations { prefix opso; revision-date 2020-07-20; } import network-pcep-topology-config { prefix nptc; revision-date 2018-11-09; } diff --git a/pcep/server/server-api/src/main/java/org/opendaylight/bgpcep/pcep/server/PceServerProvider.java b/pcep/server/server-api/src/main/java/org/opendaylight/bgpcep/pcep/server/PceServerProvider.java index 496b91b2f5..72bcad1f3b 100644 --- a/pcep/server/server-api/src/main/java/org/opendaylight/bgpcep/pcep/server/PceServerProvider.java +++ b/pcep/server/server-api/src/main/java/org/opendaylight/bgpcep/pcep/server/PceServerProvider.java @@ -8,6 +8,7 @@ package org.opendaylight.bgpcep.pcep.server; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev191125.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; @@ -24,9 +25,10 @@ public interface PceServerProvider { /** * Register PCEP Topology into PCE Server to manage LSP. * - * @param topology Configured PCEP Topology + * @param topology Configured PCEP Topology + * @param graphKey Configured Connected Graph Topology as GraphKey */ - void registerPcepTopology(KeyedInstanceIdentifier topology); + void registerPcepTopology(KeyedInstanceIdentifier topology, GraphKey graphKey); /** * Un Register current PCEP Topology into PCE Server. diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java index 555532005a..2220cbdf49 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java @@ -22,6 +22,7 @@ import org.opendaylight.graph.ConnectedGraph; import org.opendaylight.graph.ConnectedGraphProvider; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev191125.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.NetworkTopologyPcepService; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; @@ -47,6 +48,7 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl private Map pathListeners = new HashMap(); private Map pcepListeners = new HashMap(); private volatile ConnectedGraph tedGraph; + private volatile GraphKey graphKey; @Inject @Activate @@ -118,20 +120,18 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl * from BGP Link State. */ private void setTedGraph() { - tedGraph = graphProvider.getConnectedGraphs().stream() - .filter(graph -> graph.getGraph().getName().startsWith("ted://")) - .findFirst() - .orElse(null); + tedGraph = graphProvider.getConnectedGraph(graphKey); } @Override - public void registerPcepTopology(KeyedInstanceIdentifier topology) { - TopologyId key = requireNonNull(topology).getKey().getTopologyId(); + public void registerPcepTopology(KeyedInstanceIdentifier topology, GraphKey key) { + TopologyId topoKey = requireNonNull(topology).getKey().getTopologyId(); + this.graphKey = requireNonNull(key); - LOG.info("Start PCE Server components for Topology {}", key.getValue()); + LOG.info("Start PCE Server components for Topology {} with TED {}", topoKey.getValue(), graphKey.getName()); /* First close current Listener & Manager if there are active */ - closeListenerAndManager(key); + closeListenerAndManager(topoKey); /* Then create Path Manger */ final NetworkTopologyPcepService ntps = rpcRegistry.getRpcService(NetworkTopologyPcepService.class); @@ -142,16 +142,17 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl PcepTopologyListener pcepListener = new PcepTopologyListener(dataBroker, topology, pathManager); /* Finally, register all of them for later deletion */ - pathManagers.put(key, pathManager); - pathListeners.put(key, pathListener); - pcepListeners.put(key, pcepListener); + pathManagers.put(topoKey, pathManager); + pathListeners.put(topoKey, pathListener); + pcepListeners.put(topoKey, pcepListener); } @Override public void unRegisterPcepTopology(KeyedInstanceIdentifier topology) { - TopologyId key = requireNonNull(topology).getKey().getTopologyId(); + TopologyId topoKey = requireNonNull(topology).getKey().getTopologyId(); + this.graphKey = null; - LOG.info("Stop PCE Server for Topology {}", key.getValue()); - closeListenerAndManager(key); + LOG.info("Stop PCE Server for Topology {}", topoKey.getValue()); + closeListenerAndManager(topoKey); } } diff --git a/pcep/topology/topology-api/src/main/yang/network-pcep-topology-config.yang b/pcep/topology/topology-api/src/main/yang/network-pcep-topology-config.yang index 4eff06e3f1..316f8a4e5e 100644 --- a/pcep/topology/topology-api/src/main/yang/network-pcep-topology-config.yang +++ b/pcep/topology/topology-api/src/main/yang/network-pcep-topology-config.yang @@ -7,7 +7,7 @@ module network-pcep-topology-config { import network-topology { prefix nt; revision-date 2013-10-21; } import network-topology-pcep { prefix pn; revision-date 2020-01-20; } import yang-ext { prefix ext; revision-date 2013-07-09; } - import pcep-config { prefix pdc; revision-date 2020-01-20; } + import pcep-config { prefix pdc; revision-date 2022-03-28; } description "This module contains the PCEP config extensions to base topology model. diff --git a/pcep/topology/topology-provider/pom.xml b/pcep/topology/topology-provider/pom.xml index ec073a3fa1..af7b5deb37 100644 --- a/pcep/topology/topology-provider/pom.xml +++ b/pcep/topology/topology-provider/pom.xml @@ -45,6 +45,10 @@ ${project.groupId} pcep-server-api + + ${project.groupId} + graph-api + ${project.groupId} programming-api diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java index b669fe4a55..fe8b970aca 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java @@ -27,7 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersion; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.speaker.entity.id.tlv.SpeakerEntityIdBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.config.rev200120.pcep.node.config.SessionConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.config.rev220328.pcep.node.config.SessionConfig; 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.types.rev181109.open.object.open.TlvsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.config.rev181109.PcepNodeConfig; diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyConfiguration.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyConfiguration.java index f687b5456f..7f29e723d5 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyConfiguration.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyConfiguration.java @@ -20,6 +20,7 @@ import org.opendaylight.protocol.concepts.KeyMapping; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev191125.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.config.rev181109.PcepNodeConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.config.rev181109.PcepTopologyTypeConfig; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; @@ -31,12 +32,14 @@ final class PCEPTopologyConfiguration implements Immutable { private final @NonNull InetSocketAddress address; private final @NonNull KeyMapping keys; private final short rpcTimeout; + private final GraphKey graphKey; PCEPTopologyConfiguration(final @NonNull InetSocketAddress address, final short rpcTimeout, - final @NonNull KeyMapping keys) { + final @NonNull KeyMapping keys, final @NonNull GraphKey graphKey) { this.address = requireNonNull(address); this.keys = requireNonNull(keys); this.rpcTimeout = rpcTimeout; + this.graphKey = requireNonNull(graphKey); } static @Nullable PCEPTopologyConfiguration of(final @NonNull Topology topology) { @@ -52,7 +55,8 @@ final class PCEPTopologyConfiguration implements Immutable { return new PCEPTopologyConfiguration( getInetSocketAddress(sessionConfig.getListenAddress(), sessionConfig.getListenPort()), - sessionConfig.getRpcTimeout(), constructKeys(topology.getNode())); + sessionConfig.getRpcTimeout(), constructKeys(topology.getNode()), + constructGraphKey(sessionConfig.getTedName())); } short getRpcTimeout() { @@ -67,6 +71,10 @@ final class PCEPTopologyConfiguration implements Immutable { return keys; } + @NonNull GraphKey getGraphKey() { + return graphKey; + } + private static @NonNull KeyMapping constructKeys(final @Nullable Map nodes) { if (nodes == null) { return KeyMapping.of(); @@ -94,6 +102,10 @@ final class PCEPTopologyConfiguration implements Immutable { return KeyMapping.of(passwords); } + private static @NonNull GraphKey constructGraphKey(String name) { + return new GraphKey(name.startsWith("ted://") ? name : "ted://" + name); + } + private static InetAddress nodeAddress(final Node node) { return InetAddresses.forString(node.getNodeId().getValue()); } diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java index c28e52e2be..33e20ca1bc 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java @@ -172,7 +172,8 @@ final class PCEPTopologyProvider extends DefaultTopologyReference { currentConfig = newConfiguration; // First start the manager - manager = new ServerSessionManager(instanceIdentifier, dependencies, newConfiguration.getRpcTimeout()); + manager = new ServerSessionManager(instanceIdentifier, dependencies, newConfiguration.getRpcTimeout(), + newConfiguration.getGraphKey()); final var managerStart = manager.start(); managerStart.addListener(() -> enableChannel(future, Futures.getUnchecked(managerStart)), MoreExecutors.directExecutor()); diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java index c2e21ccd79..80d00992de 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java @@ -30,6 +30,7 @@ import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.protocol.pcep.PCEPSession; import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev191125.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.PcepSessionState; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.AddLspArgs; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.EnsureLspOperationalInput; @@ -72,17 +73,19 @@ class ServerSessionManager implements PCEPSessionListenerFactory, TopologySessio private volatile short rpcTimeout; + private final GraphKey graphKey; + ServerSessionManager(final KeyedInstanceIdentifier instanceIdentifier, - final PCEPTopologyProviderDependencies dependencies, final short rpcTimeout) { + final PCEPTopologyProviderDependencies dependencies, final short rpcTimeout, final GraphKey graphKey) { this.dependencies = requireNonNull(dependencies); topology = requireNonNull(instanceIdentifier); this.rpcTimeout = rpcTimeout; + this.graphKey = requireNonNull(graphKey); } // Initialize the operational view of the topology. final ListenableFuture start() { LOG.info("Creating PCEP Topology {}", topologyId()); - final var tx = dependencies.getDataBroker().newWriteOnlyTransaction(); tx.put(LogicalDatastoreType.OPERATIONAL, topology, new TopologyBuilder() .withKey(topology.getKey()) @@ -112,7 +115,7 @@ class ServerSessionManager implements PCEPSessionListenerFactory, TopologySessio // Register this new topology to PCE Server final PceServerProvider server = dependencies.getPceServerProvider(); if (server != null) { - server.registerPcepTopology(topology); + server.registerPcepTopology(topology, graphKey); } return future; } diff --git a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractPCEPSessionTest.java b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractPCEPSessionTest.java index e3246a2f55..ffe8184a8a 100644 --- a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractPCEPSessionTest.java +++ b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractPCEPSessionTest.java @@ -37,6 +37,7 @@ import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl; import org.opendaylight.protocol.util.InetSocketAddressUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev191125.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.Ero; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.EroBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.ero.Subobject; @@ -131,7 +132,8 @@ public abstract class AbstractPCEPSessionTest extends AbstractConcurrentDataBrok doReturn(statsRegistry).when(topologyDependencies).getStateRegistry(); doReturn(null).when(topologyDependencies).getPceServerProvider(); - manager = customizeSessionManager(new ServerSessionManager(TOPO_IID, topologyDependencies, RPC_TIMEOUT)); + manager = customizeSessionManager(new ServerSessionManager(TOPO_IID, topologyDependencies, RPC_TIMEOUT, + new GraphKey("graph-test"))); startSessionManager(); neg = new DefaultPCEPSessionNegotiator(promise, clientListener, manager.getSessionListener(), (short) 1, 5, localPrefs); -- 2.36.6