Update LSP: check LSP presence in payload 40/103240/3
authorIvan Hrasko <ivan.hrasko@pantheon.tech>
Wed, 16 Nov 2022 15:38:10 +0000 (16:38 +0100)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Fri, 18 Nov 2022 13:30:44 +0000 (14:30 +0100)
Check if LSP object is present in update-lsp RPC payload.

If not immediately return error of type 6 with value 8
and do no send PCUpd message to PCC.

JIRA: BGPCEP-1015
Change-Id: I7e10c2c534f6cc29326a4e01732def70d41f9997
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySessionListener.java
pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySessionListenerTest.java

index 117799501a6f84e7693f4012f0177a443e0779dd..0a1d223e6d07a60a360b30daf5d25013b63a3bd8 100644 (file)
@@ -815,11 +815,12 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener {
             final Srp srp = srpBuilder.build();
             final Lsp inputLsp = args != null ? args.getLsp() : null;
             final LspBuilder lspBuilder = new LspBuilder().setPlspId(reportedLsp.getPlspId());
-            if (inputLsp != null) {
-                lspBuilder.setDelegate(Boolean.TRUE.equals(inputLsp.getDelegate()))
-                        .setTlvs(inputLsp.getTlvs())
-                        .setAdministrative(Boolean.TRUE.equals(inputLsp.getAdministrative()));
+            if (inputLsp == null) {
+                return OperationResults.createUnsent(PCEPErrors.LSP_MISSING).future();
             }
+            lspBuilder.setDelegate(Boolean.TRUE.equals(inputLsp.getDelegate()))
+                    .setTlvs(inputLsp.getTlvs())
+                    .setAdministrative(Boolean.TRUE.equals(inputLsp.getAdministrative()));
             return redelegate(reportedLsp, srp, lspBuilder.build(), input);
         }
     }
index 800560e8b680a0ecea7abbe0f25abfb5f09efab9..a3183d3ed998841e229bc2c8fb56fc261588504f 100644 (file)
@@ -534,6 +534,45 @@ public class PCEPTopologySessionListenerTest extends AbstractPCEPSessionTest {
         assertEquals(PCEPErrors.UNKNOWN_PLSP_ID, PCEPErrors.forValue(errorObject.getType(), errorObject.getValue()));
     }
 
+    /**
+     * Test send update-lsp RPC without LSP object in payload.
+     */
+    @Test
+    public void testUpdateEmptyLsp() throws InterruptedException, ExecutionException {
+        // create LSP
+        listener.onSessionUp(session);
+        final var addLsp = topologyRpcs.addLsp(createAddLspInput());
+        assertEquals(1, receivedMsgs.size());
+        final var pcinitiate =  receivedMsgs.get(0);
+        assertThat(pcinitiate, instanceOf(Pcinitiate.class));
+        final var req = ((Pcinitiate) pcinitiate).getPcinitiateMessage().getRequests().get(0);
+        final var srpId = req.getSrp().getOperationId().getValue();
+        final var tlvs = createLspTlvs(req.getLsp().getPlspId().getValue(), true,
+                testAddress, testAddress, testAddress, Optional.empty());
+        final var pcRpt = MsgBuilderUtil.createPcRtpMessage(new LspBuilder(req.getLsp()).setTlvs(tlvs)
+                .setPlspId(new PlspId(Uint32.ONE))
+                .setSync(FALSE)
+                .setRemove(FALSE)
+                .setOperational(OperationalStatus.Active)
+                .build(), Optional.of(MsgBuilderUtil.createSrp(srpId)), MsgBuilderUtil.createPath(req.getEro()
+                .getSubobject()));
+        listener.onMessage(session, pcRpt);
+
+        // update LSP
+        final var builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep
+                .rev220730.update.lsp.args.ArgumentsBuilder()
+                .setEro(createEroWithIpPrefixes(List.of(eroIpPrefix, dstIpPrefix)));
+        final var input = new UpdateLspInputBuilder().setArguments(builder.build())
+                .setName(tunnelName).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(nodeId)
+                .build();
+        final var result = topologyRpcs.updateLsp(input).get().getResult();
+        assertEquals(FailureType.Unsent, result.getFailure());
+        assertEquals(1, result.getError().size());
+        final ErrorObject errorObject = result.getError().get(0).getErrorObject();
+        assertNotNull(errorObject);
+        assertEquals(PCEPErrors.LSP_MISSING, PCEPErrors.forValue(errorObject.getType(), errorObject.getValue()));
+    }
+
     @Test
     public void testRemoveUnknownLsp() throws InterruptedException, ExecutionException {
         listener.onSessionUp(session);