Deprecate WebSocket event stream delivery 61/109161/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 6 Dec 2023 09:20:55 +0000 (10:20 +0100)
committerRobert Varga <nite@hq.sk>
Sun, 10 Dec 2023 21:23:16 +0000 (21:23 +0000)
We support RFC8040-standard delivery of events via Server-Sent Events
and Websockets do not offer any advantage over that. Deprecate them for
removal.

JIRA: NETCONF-1208
Change-Id: Ib52085f0df50d723ea27e4815e77c988c21135ba
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/OSGiNorthbound.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/DefaultRestconfStreamServletFactory.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/RestconfStreamServletFactory.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/SSEStreamService.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactory.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketInitializer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketSender.java
restconf/restconf-nb/src/main/resources/restconf8040.cfg
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketSessionHandlerTest.java

index a4e4223ba12c881a8a47b567906949bea9f11de5..ffd60a18f711273f76358586642893e547912943 100644 (file)
@@ -48,6 +48,7 @@ public final class OSGiNorthbound {
         //        Integer.MAX_VALUE, which is not what we want
         @AttributeDefinition(min = "0")
         int max$_$thread$_$count() default DefaultPingExecutor.DEFAULT_CORE_POOL_SIZE;
+        @Deprecated(since = "7.0.0", forRemoval = true)
         @AttributeDefinition
         boolean use$_$sse() default true;
     }
@@ -58,6 +59,7 @@ public final class OSGiNorthbound {
     private final ComponentFactory<DefaultRestconfStreamServletFactory> servletFactoryFactory;
 
     private ComponentInstance<MdsalRestconfStreamRegistry> registry;
+    @Deprecated(since = "7.0.0", forRemoval = true)
     private boolean useSSE;
 
     private ComponentInstance<DefaultRestconfStreamServletFactory> servletFactory;
index ed0a799bddd2b43ecb75a532bc3b6224beaab45a..55f58759009f35b4663693212b46ee623afabdc8 100644 (file)
@@ -19,12 +19,20 @@ import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Auxiliary interface for instantiating JAX-RS streams.
+ *
+ * @deprecated This componet exists only to support SSE/Websocket delivery. It will be removed when support for
+ *             WebSockets is removed.
  */
 @Component(factory = DefaultRestconfStreamServletFactory.FACTORY_NAME, service = RestconfStreamServletFactory.class)
+@Deprecated(since = "7.0.0", forRemoval = true)
 public final class DefaultRestconfStreamServletFactory implements RestconfStreamServletFactory, AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(DefaultRestconfStreamServletFactory.class);
+
     public static final String FACTORY_NAME =
         "org.opendaylight.restconf.nb.rfc8040.streams.RestconfStreamServletFactory";
 
@@ -47,8 +55,13 @@ public final class DefaultRestconfStreamServletFactory implements RestconfStream
         this.servletSupport = requireNonNull(servletSupport);
         this.streamRegistry = requireNonNull(streamRegistry);
         this.streamsConfiguration = requireNonNull(streamsConfiguration);
-        this.useWebsockets = useWebsockets;
         pingExecutor = new DefaultPingExecutor(namePrefix, corePoolSize);
+        this.useWebsockets = useWebsockets;
+        if (useWebsockets) {
+            LOG.warn("""
+                RESTCONF event streams use WebSockets instead of Server-Sent Events. This option is will be removed in
+                the next major release.""");
+        }
     }
 
     @Activate
index 20f8f179b92b79cb8d8cad6198ec088f52baca5c..1aec86f1d5e33f1ec21250067aa16058f9edbaf1 100644 (file)
@@ -13,7 +13,11 @@ import org.opendaylight.restconf.server.spi.RestconfStream;
 
 /**
  * A helper for creating {@link HttpServlet}s which provide bridge between JAX-RS and {@link RestconfStream.Registry}.
+ *
+ * @deprecated This interface exists only to support SSE/Websocket delivery. It will be removed when support for
+ *             WebSockets is removed.
  */
+@Deprecated(since = "7.0.0", forRemoval = true)
 public interface RestconfStreamServletFactory {
 
     @NonNull HttpServlet newStreamServlet();
index a3fd811756dce9930558ee4316854194a24fde03..42da450663796542b0f2b60c880f287872abff0f 100644 (file)
@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
  * Access to notification streams via Server-Sent Events.
  */
 @Path("/")
+// FIXME: integrate this service into JaxRsRestconf once we remove support for WebSockets
 final class SSEStreamService {
     private static final Logger LOG = LoggerFactory.getLogger(SSEStreamService.class);
 
index 21a1bccad811502b9984b29dec82218c839da519..bd130f6325b6640a54754c64ef5d8caa5c6c27fd 100644 (file)
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
  *                              (exceeded message length leads to fragmentation of messages).
  * @param heartbeatInterval     Interval in milliseconds between sending of ping control frames.
  */
+@Deprecated(since = "7.0.0", forRemoval = true)
 record WebSocketFactory(
         RestconfStream.Registry streamRegistry,
         PingExecutor pingExecutor,
index 83f9b74752cd24ff4bba8e4f1b80d80d48bf4b4b..1f11a7e2c084cd0db00a040da409badd27ac7408 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.restconf.server.spi.RestconfStream;
 /**
  * Web-socket servlet listening on ws or wss schemas for created data-change-event or notification streams.
  */
+@Deprecated(since = "7.0.0", forRemoval = true)
 final class WebSocketInitializer extends WebSocketServlet {
     @java.io.Serial
     private static final long serialVersionUID = 1L;
index ce47ee7021f391f63244f7d5ca0b8187fe960936..ee92b759828f38bb3e223c0089657fe46f10c4cf 100644 (file)
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
  * to data-change-event or notification listener, and sending of data over established web-socket session.
  */
 @WebSocket
+@Deprecated(since = "7.0.0", forRemoval = true)
 final class WebSocketSender implements Sender {
     private static final Logger LOG = LoggerFactory.getLogger(WebSocketSender.class);
     private static final byte[] PING_PAYLOAD = "ping".getBytes(Charset.defaultCharset());
index 978c2b5ab2aa5eac808eb8538487755fdf82d5e3..58eac641c8848cc217f695e5900dff26ced3779e 100644 (file)
@@ -5,4 +5,5 @@
 #idle-timeout=30000
 #ping-executor-name-prefix=ping-executor
 #max-thread-count=1
+# Note: this option is deprecated and scheduled for removal
 #use-sse=true
index 70f8d3d5df00465bd4a06813ee6a71677c5bc9c6..4570d3da22e321551f6d21d5f283458ca8e73adf 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
 @ExtendWith(MockitoExtension.class)
+@Deprecated(since = "7.0.0", forRemoval = true)
 class WebSocketFactoryTest extends AbstractNotificationListenerTest {
     private static final QName TOASTER = QName.create("http://netconfcentral.org/ns/toaster", "2009-11-20", "toaster");
 
index cc385d9fe0a4e0c62b4393dab908946afddd998c..e7f36c3b25b43ccc4bd4b67e2c10157593670768 100644 (file)
@@ -35,6 +35,7 @@ import org.opendaylight.restconf.server.spi.RestconfStream.EncodingName;
 import org.opendaylight.yangtools.concepts.Registration;
 
 @ExtendWith(MockitoExtension.class)
+@Deprecated(since = "7.0.0", forRemoval = true)
 class WebSocketSessionHandlerTest {
     private final class WebSocketTestSessionState {
         private final WebSocketSender webSocketSessionHandler;