From 25991a81a0a6ecf8355af37bff5b7237889b2573 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 27 Nov 2013 16:51:47 +0100 Subject: [PATCH] Define PCEP LSP operational state instruction Change-Id: I80b6885e2c0332de2d592af93dfb625803031268 Signed-off-by: Robert Varga --- .../network-topology-pcep-programming.yang | 10 +++++++ .../src/main/yang/network-topology-pcep.yang | 24 +++++++++++++++++ .../provider/ServerSessionManager.java | 27 +++++++++++++++++++ .../provider/TopologyProgramming.java | 27 +++++++++++++++++++ .../pcep/topology/provider/TopologyRPCs.java | 13 +++++++++ 5 files changed, 101 insertions(+) diff --git a/pcep/topology-api/src/main/yang/network-topology-pcep-programming.yang b/pcep/topology-api/src/main/yang/network-topology-pcep-programming.yang index ed740d4896..246924465c 100644 --- a/pcep/topology-api/src/main/yang/network-topology-pcep-programming.yang +++ b/pcep/topology-api/src/main/yang/network-topology-pcep-programming.yang @@ -61,5 +61,15 @@ module network-topology-pcep-programming { uses ntp:topology-instruction-output; } } + + rpc submit-ensure-lsp-operational { + input { + uses ntp:topology-instruction-input; + uses pcep:ensure-lsp-operational-args; + } + output { + uses ntp:topology-instruction-output; + } + } } diff --git a/pcep/topology-api/src/main/yang/network-topology-pcep.yang b/pcep/topology-api/src/main/yang/network-topology-pcep.yang index b96b40fc2e..74a2ce1ad0 100644 --- a/pcep/topology-api/src/main/yang/network-topology-pcep.yang +++ b/pcep/topology-api/src/main/yang/network-topology-pcep.yang @@ -179,5 +179,29 @@ module network-topology-pcep { uses operation-result; } } + + grouping ensure-lsp-operational-args { + uses lsp-id; + + container arguments { + leaf operational { + type pcep:operational-status; + mandatory true; + } + } + } + + rpc ensure-lsp-operational { + description + "Ensure that the target LSP is provisioned and has specified + operational status."; + + input { + uses ensure-lsp-operational-args; + } + output { + uses operation-result; + } + } } diff --git a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java index f81df0683f..8a74cde694 100644 --- a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java +++ b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/ServerSessionManager.java @@ -53,6 +53,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.symbolic.path.name.tlv.SymbolicPathName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.symbolic.path.name.tlv.SymbolicPathNameBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspArgs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.FailureType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1Builder; @@ -498,4 +499,30 @@ final class ServerSessionManager implements SessionListenerFactory realEnsureLspOperational(final EnsureLspOperationalInput input) { + // Get the listener corresponding to the node + final SessionListener l = this.nodes.get(input.getNode()); + if (l == null) { + LOG.debug("Session for node {} not found", input.getNode()); + return Futures.immediateFuture(OPERATION_UNSENT); + } + + // Make sure the LSP exists + final InstanceIdentifier lsp = InstanceIdentifier.builder(l.topologyAugment). + child(PathComputationClient.class). + child(ReportedLsps.class, new ReportedLspsKey(input.getName())).toInstance(); + LOG.debug("Checking if LSP {} has operational state {}", lsp, input.getArguments().getOperational()); + final ReportedLsps rep = (ReportedLsps) this.dataProvider.readOperationalData(lsp); + if (rep == null) { + LOG.debug("Node {} does not contain LSP {}", input.getNode(), input.getName()); + return Futures.immediateFuture(OPERATION_UNSENT); + } + + if (rep.getLsp().getOperational().equals(input.getArguments().getOperational())) { + return Futures.immediateFuture(OPERATION_SUCCESS); + } else { + return Futures.immediateFuture(OPERATION_UNSENT); + } + } } diff --git a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyProgramming.java b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyProgramming.java index 7c7887cf2b..aecfb48d2a 100644 --- a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyProgramming.java +++ b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyProgramming.java @@ -17,12 +17,16 @@ 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.programming.rev131106.SubmitAddLspInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.OperationResult; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -108,4 +112,27 @@ final class TopologyProgramming implements NetworkTopologyPcepProgrammingService return Futures.immediateFuture(res); } + @Override + public ListenableFuture> submitEnsureLspOperational(final SubmitEnsureLspOperationalInput input) { + Preconditions.checkArgument(input.getNode() != null); + Preconditions.checkArgument(input.getName() != null); + Preconditions.checkArgument(input.getArguments() != null); + Preconditions.checkArgument(input.getArguments().getOperational() != null); + + final InstructionExecutor e = new AbstractTopologyProgrammingExecutor() { + @Override + protected ListenableFuture executeImpl() { + return manager.realEnsureLspOperational(new EnsureLspOperationalInputBuilder(input).build()); + } + }; + + final Failure f = this.scheduler.submitInstruction(input, e); + final SubmitEnsureLspOperationalOutputBuilder b = new SubmitEnsureLspOperationalOutputBuilder(); + if (f != null) { + b.setResult(new FailureBuilder().setFailure(f).build()); + } + + final RpcResult res = SuccessfulRpcResult.create(b.build()); + return Futures.immediateFuture(res); + } } diff --git a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyRPCs.java b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyRPCs.java index 070bfe171e..5c0762fa1f 100644 --- a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyRPCs.java +++ b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyRPCs.java @@ -13,6 +13,9 @@ import org.opendaylight.bgpcep.programming.spi.SuccessfulRpcResult; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.NetworkTopologyPcepService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.OperationResult; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspInput; @@ -63,4 +66,14 @@ final class TopologyRPCs implements NetworkTopologyPcepService { } }); } + + @Override + public Future> ensureLspOperational(final EnsureLspOperationalInput input) { + return Futures.transform(manager.realEnsureLspOperational(input), new Function>() { + @Override + public RpcResult apply(final OperationResult input) { + return SuccessfulRpcResult.create(new EnsureLspOperationalOutputBuilder(input).build()); + } + }); + } } -- 2.36.6