Split up BasePCEPSessionProposalFactory 25/104025/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 15 Jan 2023 12:42:33 +0000 (13:42 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 15 Jan 2023 14:12:20 +0000 (15:12 +0100)
We are concentrating what amounts to a utility method into a strict
hierarchy, conflating a few arguments. At the end of the day we want to
disconnect PCEPTimerProposal from the factory, just as we do not want
to mention capabilities.

This takes a step towards that goal, eventually leading to users to
provide PCEPSessionProposalFactory on their own.

JIRA: BGCEP-962
Change-Id: I1f31a800d961daa04cf2f46292cbc338d07106b5
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPTimerProposal.java [new file with mode: 0644]
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/BasePCEPSessionProposalFactory.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/spi/Util.java

diff --git a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPTimerProposal.java b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPTimerProposal.java
new file mode 100644 (file)
index 0000000..60ac5e5
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.protocol.pcep;
+
+import static java.util.Objects.requireNonNull;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.config.rev230112.PcepSessionTimers;
+import org.opendaylight.yangtools.yang.common.Uint8;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A curated {@link #keepAlive()} and {@link #deadTimer()} timer proposal.
+ */
+public record PCEPTimerProposal(@NonNull Uint8 keepAlive, @NonNull Uint8 deadTimer) {
+    private static final Logger LOG = LoggerFactory.getLogger(PCEPTimerProposal.class);
+    private static final int KA_TO_DEADTIMER_RATIO = 4;
+
+    public PCEPTimerProposal {
+        requireNonNull(keepAlive);
+
+        if (!Uint8.ZERO.equals(keepAlive)) {
+            requireNonNull(deadTimer);
+            if (!Uint8.ZERO.equals(deadTimer) && deadTimer.toJava() / keepAlive.toJava() != KA_TO_DEADTIMER_RATIO) {
+                LOG.warn("dead-timer-value ({}) should be {} times greater than keep-alive-timer-value ({}}",
+                    deadTimer, KA_TO_DEADTIMER_RATIO, keepAlive);
+            }
+        } else {
+            deadTimer = Uint8.ZERO;
+        }
+    }
+
+    public PCEPTimerProposal(final PcepSessionTimers timers) {
+        this(timers.requireKeepAliveTimerValue(), timers.requireDeadTimerValue());
+    }
+}
index 2541723d9bb96656654b048f384f46ec89a86720..b7d0767b9dfd994662abb8d98026c94dfff3c7d8 100644 (file)
@@ -15,60 +15,34 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.protocol.pcep.PCEPCapability;
 import org.opendaylight.protocol.pcep.PCEPPeerProposal;
 import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
+import org.opendaylight.protocol.pcep.PCEPTimerProposal;
+import org.opendaylight.protocol.pcep.impl.spi.Util;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.config.rev230112.PcepSessionTimers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.OpenBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
 import org.opendaylight.yangtools.yang.common.Uint8;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public final class BasePCEPSessionProposalFactory implements PCEPSessionProposalFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(BasePCEPSessionProposalFactory.class);
-    private static final int KA_TO_DEADTIMER_RATIO = 4;
-
     private final @NonNull List<PCEPCapability> capabilities;
-    private final @NonNull Uint8 keepAlive;
-    private final @NonNull Uint8 deadTimer;
+    private final @NonNull PCEPTimerProposal timers;
+
+    public BasePCEPSessionProposalFactory(final PCEPTimerProposal timers, final List<PCEPCapability> capabilities) {
+        this.timers = requireNonNull(timers);
+        this.capabilities = requireNonNull(capabilities);
+    }
 
     public BasePCEPSessionProposalFactory(final PcepSessionTimers timers, final List<PCEPCapability> capabilities) {
-        this(timers.getDeadTimerValue(), timers.getKeepAliveTimerValue(), capabilities);
+        this(new PCEPTimerProposal(timers), capabilities);
     }
 
     public BasePCEPSessionProposalFactory(final Uint8 deadTimer, final Uint8 keepAlive,
             final List<PCEPCapability> capabilities) {
-        this.keepAlive = requireNonNull(keepAlive);
-        this.capabilities = requireNonNull(capabilities);
-
-        if (!Uint8.ZERO.equals(keepAlive)) {
-            this.deadTimer = requireNonNull(deadTimer);
-            if (!Uint8.ZERO.equals(deadTimer) && deadTimer.toJava() / keepAlive.toJava() != KA_TO_DEADTIMER_RATIO) {
-                LOG.warn("dead-timer-value ({}) should be {} times greater than keep-alive-timer-value ({}}",
-                    deadTimer, KA_TO_DEADTIMER_RATIO, keepAlive);
-            }
-        } else {
-            this.deadTimer = Uint8.ZERO;
-        }
+        this(new PCEPTimerProposal(keepAlive, deadTimer), capabilities);
     }
 
     @Override
     public Open getSessionProposal(final InetSocketAddress address, final Uint8 sessionId,
             final PCEPPeerProposal peerProposal) {
-        final var builder = new TlvsBuilder();
-        for (final var capability : capabilities) {
-            capability.setCapabilityProposal(address, builder);
-        }
-
-        if (peerProposal != null) {
-            peerProposal.setPeerSpecificProposal(address, builder);
-        }
-
-        return new OpenBuilder()
-            .setSessionId(sessionId)
-            .setKeepalive(keepAlive)
-            .setDeadTimer(deadTimer)
-            .setTlvs(builder.build())
-            .build();
+        return Util.createOpenObject(address, sessionId, timers, capabilities, peerProposal);
     }
 
     @Override
index 44af319972fd1d211135341f2a1a66f436eab5a2..40d306ea69acd8c6ad5f85e05717d0bba18b9eff 100644 (file)
@@ -7,11 +7,19 @@
  */
 package org.opendaylight.protocol.pcep.impl.spi;
 
+import java.net.InetSocketAddress;
 import java.util.Collections;
+import java.util.List;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.protocol.pcep.PCEPCapability;
+import org.opendaylight.protocol.pcep.PCEPPeerProposal;
+import org.opendaylight.protocol.pcep.PCEPTimerProposal;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
 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.types.rev181109.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.OpenBuilder;
+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.pcep.types.rev181109.pcep.error.object.ErrorObject;
 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;
@@ -19,6 +27,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.rev181109.pcerr.message.pcerr.message.ErrorsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.SessionCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.session._case.SessionBuilder;
+import org.opendaylight.yangtools.yang.common.Uint8;
 
 /**
  * Utilities used in pcep-impl.
@@ -45,4 +54,24 @@ public final class Util {
                 .setErrorType(type).build())
             .build();
     }
+
+    public static Open createOpenObject(final InetSocketAddress address, final Uint8 sessionId,
+            final PCEPTimerProposal timers, final List<PCEPCapability> capabilities,
+            final @Nullable PCEPPeerProposal peerProposal) {
+        final var builder = new TlvsBuilder();
+        for (final var capability : capabilities) {
+            capability.setCapabilityProposal(address, builder);
+        }
+
+        if (peerProposal != null) {
+            peerProposal.setPeerSpecificProposal(address, builder);
+        }
+
+        return new OpenBuilder()
+            .setSessionId(sessionId)
+            .setKeepalive(timers.keepAlive())
+            .setDeadTimer(timers.deadTimer())
+            .setTlvs(builder.build())
+            .build();
+    }
 }