Integrate TopologyStatsProviderImpl
[bgpcep.git] / pcep / topology / topology-provider / src / main / java / org / opendaylight / bgpcep / pcep / topology / provider / PCEPTopologySessionListener.java
index 2d0266aee325c7bd2fac50e5ee671d4d36ff5724..117799501a6f84e7693f4012f0177a443e0779dd 100644 (file)
@@ -17,22 +17,18 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.checkerframework.checker.lock.qual.Holding;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.bgpcep.pcep.server.PathComputation;
 import org.opendaylight.bgpcep.pcep.server.PceServerProvider;
-import org.opendaylight.protocol.pcep.PCEPSession;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
 import org.opendaylight.protocol.pcep.spi.PSTUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.PathComputationClient1Builder;
@@ -41,7 +37,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.PcinitiateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1Builder;
-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.initiated.rev200720.pcinitiate.message.PcinitiateMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.Requests;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.RequestsBuilder;
@@ -55,9 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PcupdBuilder;
 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.SymbolicPathName;
-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.lsp.object.LspBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.lsp.TlvsBuilder;
@@ -69,16 +62,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcupd.message.pcupd.message.updates.PathBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.Srp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.SrpBuilder;
-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.ietf.stateful.rev200720.symbolic.path.name.tlv.SymbolicPathNameBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.Pcerr;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.PcerrBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.Pcreq;
 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.PcerrMessage;
+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.RequestId;
 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.open.object.open.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcep.error.object.ErrorObjectBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.PcerrMessageBuilder;
@@ -88,91 +81,76 @@ 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.rev181109.pcerr.message.pcerr.message.error.type.request._case.request.RpsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.PcreqMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.rp.object.RpBuilder;
-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;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.OperationResult;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.PccSyncState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.RemoveLspArgs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.TriggerSyncArgs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.UpdateLspArgs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.ensure.lsp.operational.args.Arguments;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.PathComputationClient;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.PathComputationClientBuilder;
-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.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.rev220730.AddLspArgs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.EnsureLspOperationalInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.LspId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.Node1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.OperationResult;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.PccSyncState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.RemoveLspArgs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.TriggerSyncArgs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.UpdateLspArgs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.ensure.lsp.operational.args.Arguments;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.PathComputationClient;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.PathComputationClientBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.path.computation.client.ReportedLsp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.path.computation.client.ReportedLspBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.path.computation.client.reported.lsp.Path;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint8;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 // Non-final for testing
-class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdNumber, PlspId> {
+class PCEPTopologySessionListener extends AbstractTopologySessionListener {
     private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologySessionListener.class);
     private static final PlspId PLSPID_ZERO = new PlspId(Uint32.ZERO);
+    private static final SrpIdNumber SRPID_ZERO = new SrpIdNumber(Uint32.ZERO);
+    private static final String MISSING_XML_TAG = "Mandatory XML tags are missing.";
+    private static final MessageHeader MESSAGE_HEADER = new MessageHeader() {
+        private final ProtocolVersion version = new ProtocolVersion(Uint8.ONE);
+
+        @Override
+        public Class<MessageHeader> implementedInterface() {
+            return MessageHeader.class;
+        }
+
+        @Override
+        public ProtocolVersion getVersion() {
+            return version;
+        }
+    };
 
     private final AtomicLong requestId = new AtomicLong(1L);
 
     @GuardedBy("this")
     private final List<PlspId> staleLsps = new ArrayList<>();
 
-    private final AtomicBoolean statefulCapability = new AtomicBoolean(false);
-    private final AtomicBoolean lspUpdateCapability = new AtomicBoolean(false);
-    private final AtomicBoolean initiationCapability = new AtomicBoolean(false);
-
     private final PceServerProvider pceServerProvider;
 
     /**
      * Creates a new stateful topology session listener for given server session manager.
      */
-    PCEPTopologySessionListener(final ServerSessionManager serverSessionManager) {
-        super(serverSessionManager);
-        pceServerProvider = serverSessionManager.getPCEPTopologyProviderDependencies().getPceServerProvider();
+    PCEPTopologySessionListener(final SessionStateRegistry stateRegistry,
+            final ServerSessionManager serverSessionManager, final PceServerProvider pceServerProvider) {
+        super(stateRegistry, serverSessionManager);
+        // FIXME: requireNonNull(), except tests need to be updated
+        this.pceServerProvider = pceServerProvider;
     }
 
     private static LspDbVersion geLspDbVersionTlv(final Lsp lsp) {
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object
-                .lsp.Tlvs tlvs = lsp.getTlvs();
-        if (tlvs != null && tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
-                .controller.pcep.sync.optimizations.rev200720.Tlvs1.class) != null) {
-            return tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller
-                    .pcep.sync.optimizations.rev200720.Tlvs1.class).getLspDbVersion();
-        }
-        return null;
-    }
-
-    @Override
-    protected void onSessionUp(final PCEPSession session, final PathComputationClientBuilder pccBuilder) {
-        final InetAddress peerAddress = session.getRemoteAddress();
-
-        final Tlvs tlvs = session.getRemoteTlvs();
-        if (tlvs != null && tlvs.augmentation(Tlvs1.class) != null) {
-            final Stateful stateful = tlvs.augmentation(Tlvs1.class).getStateful();
-            if (stateful != null) {
-                setStatefulCapabilities(stateful);
-                pccBuilder.setReportedLsp(Collections.emptyMap());
-                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(tlvs.augmentation(Tlvs1.class)).build()).build());
-            } else {
-                LOG.debug("Peer {} does not advertise stateful TLV", peerAddress);
+        final var tlvs = lsp.getTlvs();
+        if (tlvs != null) {
+            final var tlvs1 = tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
+                .controller.pcep.sync.optimizations.rev200720.Tlvs1.class);
+            if (tlvs1 != null) {
+                return tlvs1.getLspDbVersion();
             }
-        } else {
-            LOG.debug("Peer {} does not advertise stateful TLV", peerAddress);
         }
+        return null;
     }
 
     @Override
@@ -217,23 +195,19 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
     }
 
     private SrpIdNumber createUpdateMessageSync(final PcupdMessageBuilder pcupdMessageBuilder) {
-        final UpdatesBuilder updBuilder = new UpdatesBuilder();
-        // LSP mandatory in Upd
-        final Lsp lsp = new LspBuilder().setPlspId(PLSPID_ZERO).setSync(Boolean.TRUE).build();
-        // SRP Mandatory in Upd
-        final SrpBuilder srpBuilder = new SrpBuilder();
-        // not sue whether use 0 instead of nextRequest() or do not insert srp == SRP-ID-number = 0
-        srpBuilder.setOperationId(nextRequest());
-        final Srp srp = srpBuilder.build();
-        //ERO Mandatory in Upd
-        final PathBuilder pb = new PathBuilder();
-        pb.setEro(new EroBuilder().build());
-
-        updBuilder.setPath(pb.build());
-        updBuilder.setLsp(lsp).setSrp(srp).setPath(pb.build());
-
-        pcupdMessageBuilder.setUpdates(Collections.singletonList(updBuilder.build()));
-        return srp.getOperationId();
+        // FIXME: not sure whether use 0 instead of nextRequest() or do not insert srp == SRP-ID-number = 0
+        final var operationId = nextRequest();
+
+        pcupdMessageBuilder.setUpdates(List.of(new UpdatesBuilder()
+            // LSP mandatory in PCUpd
+            .setLsp(new LspBuilder().setPlspId(PLSPID_ZERO).setSync(Boolean.TRUE).build())
+            // SRP Mandatory in PCUpd
+            .setSrp(new SrpBuilder().setOperationId(operationId).build())
+            // ERO Mandatory in PCUpd
+            .setPath(new PathBuilder().setEro(new EroBuilder().build()).build())
+            .build()));
+
+        return operationId;
     }
 
     @Holding("this")
@@ -242,16 +216,15 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
     }
 
     private boolean handleErrorMessage(final PcerrMessage message) {
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message
-                .PcerrMessage errMsg = message.getPcerrMessage();
+        final var errMsg = message.getPcerrMessage();
         if (errMsg.getErrorType() instanceof StatefulCase) {
             final StatefulCase stat = (StatefulCase) errMsg.getErrorType();
-            for (final Srps srps : stat.getStateful().getSrps()) {
+            for (final Srps srps : stat.getStateful().nonnullSrps()) {
                 final SrpIdNumber id = srps.getSrp().getOperationId();
-                if (id.getValue().toJava() != 0) {
+                if (!SRPID_ZERO.equals(id)) {
                     final PCEPRequest req = removeRequest(id);
                     if (req != null) {
-                        req.done(OperationResults.createFailed(errMsg.getErrors()));
+                        req.finish(OperationResults.createFailed(errMsg.getErrors()));
                     } else {
                         LOG.warn("Request ID {} not found in outstanding DB", id);
                     }
@@ -269,7 +242,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
             return false;
         }
         final SrpIdNumber id = srp.getOperationId();
-        if (id.getValue().toJava() == 0) {
+        if (SRPID_ZERO.equals(id)) {
             return false;
         }
         switch (lsp.getOperational()) {
@@ -304,14 +277,14 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
         final PlspId plspid = lsp.getPlspId();
         final Srp srp = report.getSrp();
 
-        if (!lsp.getSync() && (plspid == null || plspid.getValue().toJava() == 0)) {
+        if (!lsp.getSync() && (plspid == null || PLSPID_ZERO.equals(plspid))) {
             purgeStaleLsps(ctx);
             if (isTriggeredSyncInProcess()) {
                 if (srp == null) {
                     return false;
                 }
                 final SrpIdNumber id = srp.getOperationId();
-                if (id.getValue().toJava() == 0) {
+                if (SRPID_ZERO.equals(id)) {
                     return false;
                 }
                 final PCEPRequest req = removeRequest(id);
@@ -353,9 +326,9 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
     }
 
     private static Path buildPath(final Reports report, final Srp srp, final Lsp lsp) {
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client
                 .attributes.path.computation.client.reported.lsp.PathBuilder pb = new org.opendaylight.yang.gen.v1
-                .urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation
+                .urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.pcep.client.attributes.path.computation
                 .client.reported.lsp.PathBuilder();
         if (report.getPath() != null) {
             pb.fieldsFrom(report.getPath());
@@ -372,8 +345,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
             pst = null;
         }
         pb.addAugmentation(p1Builder.build());
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp
-                .object.lsp.Tlvs tlvs = report.getLsp().getTlvs();
+        final var tlvs = report.getLsp().getTlvs();
         if (tlvs != null) {
             if (tlvs.getLspIdentifiers() != null) {
                 pb.setLspId(tlvs.getLspIdentifiers().getLspId());
@@ -388,18 +360,23 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
     private boolean handlePcreqMessage(final PcreqMessage message) {
 
         LOG.info("Start PcRequest Message handler");
+        Message rep = null;
 
         /* Get a Path Computation to compute the Path from the Request */
+        // TODO: Adjust Junit Test to avoid this test
+        if (pceServerProvider == null) {
+            rep = createErrorMsg(PCEPErrors.RESOURCE_LIMIT_EXCEEDED, Uint32.ZERO);
+            sendMessage(rep, new SrpIdNumber(Uint32.ZERO), null);
+            return false;
+        }
         PathComputation pathComputation = pceServerProvider.getPathComputation();
-        Message rep = null;
         /* Reply with Error Message if no valid Path Computation is available */
         if (pathComputation == null) {
             rep = createErrorMsg(PCEPErrors.RESOURCE_LIMIT_EXCEEDED, Uint32.ZERO);
             sendMessage(rep, new SrpIdNumber(Uint32.ZERO), null);
             return false;
         }
-        for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq
-                .message.Requests req : message.getRequests()) {
+        for (var req : message.nonnullRequests()) {
             LOG.debug("Process request {}", req);
             rep = pathComputation.computePath(req);
             SrpIdNumber repId = null;
@@ -425,10 +402,10 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
         if (!(message instanceof PcrptMessage)) {
             return true;
         }
-        listenerState.updateLastReceivedRptMsg();
-        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt
-                .message.PcrptMessage rpt = ((PcrptMessage) message).getPcrptMessage();
-        for (final Reports report : rpt.getReports()) {
+        // FIXME: update just a field
+        listenerState().updateLastReceivedRptMsg();
+        final var rpt = ((PcrptMessage) message).getPcrptMessage();
+        for (final Reports report : rpt.nonnullReports()) {
             if (!manageNextReport(report, ctx)) {
                 return false;
             }
@@ -469,7 +446,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
                     }
                     final PcinitiateMessageBuilder ib = new PcinitiateMessageBuilder(MESSAGE_HEADER);
                     final Requests rb = buildRequest(rep, reportedLsp);
-                    ib.setRequests(Collections.singletonList(rb));
+                    ib.setRequests(List.of(rb));
                     return sendMessage(new PcinitiateBuilder().setPcinitiateMessage(ib.build()).build(),
                         rb.getSrp().getOperationId(), null);
                 }, MoreExecutors.directExecutor());
@@ -491,8 +468,6 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
         return rb.build();
     }
 
-    @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
-            justification = "https://github.com/spotbugs/spotbugs/issues/811")
     private ListenableFuture<OperationResult> redelegate(final Lsp reportedLsp, final Srp srp, final Lsp lsp,
             final UpdateLspArgs input) {
         // the D bit that was reported decides the type of PCE message sent
@@ -507,7 +482,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
             pb.fieldsFrom(input.getArguments());
             rb.setPath(pb.build());
             final PcupdMessageBuilder ub = new PcupdMessageBuilder(MESSAGE_HEADER);
-            ub.setUpdates(Collections.singletonList(rb.build()));
+            ub.setUpdates(List.of(rb.build()));
             msg = new PcupdBuilder().setPcupdMessage(ub.build()).build();
         } else {
             final Lsp1 lspCreateFlag = reportedLsp.augmentation(Lsp1.class);
@@ -531,7 +506,6 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
 
     @Override
     @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH", justification = "SB does not grok TYPE_USE")
-
     public synchronized ListenableFuture<OperationResult> updateLsp(final UpdateLspArgs input) {
         checkArgument(input != null && input.getName() != null && input.getNode() != null
                 && input.getArguments() != null, MISSING_XML_TAG);
@@ -662,34 +636,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
         staleLsps.clear();
     }
 
-    @Override
-    public boolean isInitiationCapability() {
-        return initiationCapability.get();
-    }
-
-    @Override
-    public boolean isStatefulCapability() {
-        return statefulCapability.get();
-    }
-
-    @Override
-    public boolean isLspUpdateCapability() {
-        return lspUpdateCapability.get();
-    }
-
-    private synchronized void setStatefulCapabilities(final Stateful stateful) {
-        statefulCapability.set(true);
-        if (stateful.getLspUpdateCapability() != null) {
-            lspUpdateCapability.set(stateful.getLspUpdateCapability());
-        }
-        final Stateful1 stateful1 = stateful.augmentation(Stateful1.class);
-        if (stateful1 != null && stateful1.getInitiation() != null) {
-            initiationCapability.set(stateful1.getInitiation());
-        }
-    }
-
     private class ResyncLspFunction implements AsyncFunction<Optional<ReportedLsp>, OperationResult> {
-
         private final TriggerSyncArgs input;
 
         ResyncLspFunction(final TriggerSyncArgs input) {
@@ -732,14 +679,15 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
         }
 
         private Message createPcepUpd(final Srp srp, final Lsp lsp) {
-            final UpdatesBuilder rb = new UpdatesBuilder();
-            rb.setSrp(srp);
-            rb.setLsp(lsp);
-            final PathBuilder pb = new PathBuilder();
-            rb.setPath(pb.build());
-            final PcupdMessageBuilder ub = new PcupdMessageBuilder(MESSAGE_HEADER);
-            ub.setUpdates(Collections.singletonList(rb.build()));
-            return new PcupdBuilder().setPcupdMessage(ub.build()).build();
+            return new PcupdBuilder()
+                .setPcupdMessage(new PcupdMessageBuilder(MESSAGE_HEADER)
+                    .setUpdates(List.of(new UpdatesBuilder()
+                        .setSrp(srp)
+                        .setLsp(lsp)
+                        .setPath(new PathBuilder().build())
+                        .build()))
+                    .build())
+                .build();
         }
     }
 
@@ -759,14 +707,13 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
                 LOG.debug("Node {} already contains lsp {} at {}", input.getNode(), input.getName(), lsp);
                 return OperationResults.createUnsent(PCEPErrors.USED_SYMBOLIC_PATH_NAME).future();
             }
-            if (!initiationCapability.get()) {
+            if (!isInitiationCapability()) {
                 return OperationResults.createUnsent(PCEPErrors.CAPABILITY_NOT_SUPPORTED).future();
             }
 
             // Build the request
             final RequestsBuilder rb = new RequestsBuilder();
-            final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120
-                    .add.lsp.args.Arguments args = input.getArguments();
+            final var args = input.getArguments();
             final Arguments2 args2 = args.augmentation(Arguments2.class);
             final Lsp inputLsp = args2 != null ? args2.getLsp() : null;
             if (inputLsp == null) {
@@ -775,19 +722,21 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
 
             rb.fieldsFrom(input.getArguments());
 
-            /* Call Path Computation if an ERO was not provided */
             boolean segmentRouting = !PSTUtil.isDefaultPST(args2.getPathSetupType());
-            if (rb.getEro() == null
-                    || rb.getEro().getSubobject() == null
-                    || rb.getEro().getSubobject().size() == 0) {
 
+            /* Call Path Computation if an ERO was not provided */
+            if (rb.getEro() == null || rb.getEro().nonnullSubobject().isEmpty()) {
                 /* Get a Path Computation to compute the Path from the Arguments */
+                // TODO: Adjust Junit Test to avoid this test
+                if (pceServerProvider == null) {
+                    return OperationResults.createUnsent(PCEPErrors.ERO_MISSING).future();
+                }
                 PathComputation pathComputation = pceServerProvider.getPathComputation();
                 if (pathComputation == null) {
                     return OperationResults.createUnsent(PCEPErrors.ERO_MISSING).future();
                 }
-                rb.setEro(pathComputation.computeEro(args.getEndpointsObj(), args.getBandwidth(), args.getClassType(),
-                        args.getMetrics(), segmentRouting));
+                rb.setEro(pathComputation.computeEro(args.getEndpointsObj(), args.getBandwidth(),
+                        args.getClassType(), args.getMetrics(), args.getXro(), args.getIro(), segmentRouting));
             }
 
             final TlvsBuilder tlvsBuilder;
@@ -821,7 +770,7 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
             // Send the message
             return sendMessage(new PcinitiateBuilder()
                 .setPcinitiateMessage(new PcinitiateMessageBuilder(MESSAGE_HEADER)
-                    .setRequests(Collections.singletonList(rb.build()))
+                    .setRequests(List.of(rb.build()))
                     .build())
                 .build(),
                 rb.getSrp().getOperationId(), input.getArguments().getMetadata());
@@ -877,25 +826,25 @@ class PCEPTopologySessionListener extends AbstractTopologySessionListener<SrpIdN
 
     private static Pcerr createErrorMsg(@NonNull final PCEPErrors pcepErrors, final Uint32 reqID) {
         return new PcerrBuilder()
-                .setPcerrMessage(new PcerrMessageBuilder()
-                    .setErrorType(new RequestCaseBuilder()
-                        .setRequest(new RequestBuilder()
-                            .setRps(Collections.singletonList(new RpsBuilder()
-                                .setRp(new RpBuilder()
-                                    .setProcessingRule(false)
-                                    .setIgnore(false)
-                                    .setRequestId(new RequestId(reqID))
-                                    .build())
-                                .build()))
-                            .build())
+            .setPcerrMessage(new PcerrMessageBuilder()
+                .setErrorType(new RequestCaseBuilder()
+                    .setRequest(new RequestBuilder()
+                        .setRps(List.of(new RpsBuilder()
+                            .setRp(new RpBuilder()
+                                .setProcessingRule(false)
+                                .setIgnore(false)
+                                .setRequestId(new RequestId(reqID))
+                                .build())
+                            .build()))
                         .build())
-                    .setErrors(Collections.singletonList(new ErrorsBuilder()
-                        .setErrorObject(new ErrorObjectBuilder()
-                            .setType(pcepErrors.getErrorType())
-                            .setValue(pcepErrors.getErrorValue())
-                            .build())
-                        .build()))
                     .build())
-                .build();
+                .setErrors(List.of(new ErrorsBuilder()
+                    .setErrorObject(new ErrorObjectBuilder()
+                        .setType(pcepErrors.getErrorType())
+                        .setValue(pcepErrors.getErrorValue())
+                        .build())
+                    .build()))
+                .build())
+            .build();
     }
 }