Do not use RpcService in TPCE renderer module 68/108068/4
authorGilles Thouenon <gilles.thouenon@orange.com>
Fri, 29 Sep 2023 17:18:56 +0000 (19:18 +0200)
committerguillaume.lambert <guillaume.lambert@orange.com>
Wed, 11 Oct 2023 11:30:42 +0000 (13:30 +0200)
- Migrate usage of RpcService to the new style yang.binding.Rpc-based
implementation for renderer  module
- Remove renderer provider which no longer serves any purpose
- Adapt lighty implementation

JIRA: TRNSPRTPCE-752
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Change-Id: Ib8921504d5af98656cd3feb32377be7408166c82

lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java [deleted file]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/TransportPCEServicePathRPCImpl.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java [deleted file]
renderer/src/test/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImplTest.java

index 8a3db47e36062f2e32904733874cf1bd86ef720e..cb137f6ebd1dc36ce7ef18a18b3018625a44b77c 100644 (file)
@@ -46,7 +46,6 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
 import org.opendaylight.transportpce.pce.impl.PceProvider;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
-import org.opendaylight.transportpce.renderer.RendererProvider;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 // Adding OTN interface
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
@@ -93,8 +92,6 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
     private final PceProvider pceProvider;
     // network model beans
     private final NetworkModelProvider networkModelProvider;
-    // renderer beans
-    private final RendererProvider rendererProvider;
     // service-handler beans
     private final ServicehandlerProvider servicehandlerProvider;
     // T-api
@@ -163,8 +160,7 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
                 mappingUtils, portMapping);
         OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(
                 crossConnect, openRoadmInterfaces, deviceTransactionManager, mappingUtils, portMapping);
-        rendererProvider = initRenderer(
-                lightyServices, olmPowerServiceRpc, deviceRendererService, otnDeviceRendererService, portMapping);
+        initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService, otnDeviceRendererService, portMapping);
 
         LOG.info("Creating service-handler beans ...");
         RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(
@@ -238,8 +234,6 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
             LOG.info("Shutting down service-handler provider ...");
         }
         servicehandlerProvider.close();
-        LOG.info("Shutting down renderer provider ...");
-        rendererProvider.close();
         LOG.info("Shutting down network-model provider ...");
         networkModelProvider.close();
         LOG.info("Shutting down PCE provider ...");
@@ -267,19 +261,27 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
             tapiNetworkModelListenerImpl, tapiNetworkModelService);
     }
 
-    private RendererProvider initRenderer(
+    private void initRenderer(
             LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc,
             DeviceRendererService deviceRendererService, OtnDeviceRendererService otnDeviceRendererService,
             PortMapping portMapping) {
-        return new RendererProvider(
-            lightyServices.getRpcProviderService(), deviceRendererService,
-            otnDeviceRendererService,
-            new DeviceRendererRPCImpl(deviceRendererService, otnDeviceRendererService),
+        rpcRegistrations.add(
+            new DeviceRendererRPCImpl(
+                    lightyServices.getRpcProviderService(),
+                    deviceRendererService,
+                    otnDeviceRendererService)
+                .getRegisteredRpc());
+        rpcRegistrations.add(
             new TransportPCEServicePathRPCImpl(
-                new RendererServiceOperationsImpl(
-                    deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc,
-                    lightyServices.getBindingDataBroker(), lightyServices.getBindingNotificationPublishService(),
-                    portMapping)));
+                    new RendererServiceOperationsImpl(
+                            deviceRendererService,
+                            otnDeviceRendererService,
+                            olmPowerServiceRpc,
+                            lightyServices.getBindingDataBroker(),
+                            lightyServices.getBindingNotificationPublishService(),
+                            portMapping),
+                    lightyServices.getRpcProviderService())
+                .getRegisteredRpc());
     }
 
     private OpenRoadmInterfaceFactory initOpenRoadmFactory(
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java
deleted file mode 100644 (file)
index 41aed38..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright © 2017 AT&T 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.transportpce.renderer;
-
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
-import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.TransportpceDeviceRendererService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-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;
-
-@Component
-public class RendererProvider {
-
-    private static final Logger LOG = LoggerFactory.getLogger(RendererProvider.class);
-    private final RpcProviderService rpcProviderService;
-    private ObjectRegistration<TransportpceDeviceRendererService> deviceRendererRegistration;
-    private ObjectRegistration<TransportpceRendererService> tpceServiceRegistry;
-
-    @Activate
-    public RendererProvider(@Reference RpcProviderService rpcProviderService,
-            @Reference DeviceRendererService deviceRenderer,
-            @Reference OtnDeviceRendererService otnDeviceRendererService,
-            @Reference TransportpceDeviceRendererService deviceRendererRPCImpl,
-            @Reference TransportpceRendererService transportPCEServicePathRPCImpl) {
-        this.rpcProviderService = rpcProviderService;
-        LOG.info("RendererProvider Session Initiated");
-        this.deviceRendererRegistration = this.rpcProviderService
-                .registerRpcImplementation(TransportpceDeviceRendererService.class, deviceRendererRPCImpl);
-        this.tpceServiceRegistry = this.rpcProviderService
-                .registerRpcImplementation(TransportpceRendererService.class, transportPCEServicePathRPCImpl);
-    }
-
-    /**
-     * Method called when the blueprint container is destroyed.
-     */
-    @Deactivate
-    public void close() {
-        LOG.info("RendererProvider Closed");
-        if (this.deviceRendererRegistration != null) {
-            this.deviceRendererRegistration.close();
-        }
-        if (this.tpceServiceRegistry != null) {
-            this.tpceServiceRegistry.close();
-        }
-    }
-}
\ No newline at end of file
index 39141700b7875bd321eebeb6bae7e427bb083c4e..1eecc3a6a3c4d64b0e0ed89c020580435d8fbf4b 100644 (file)
@@ -8,26 +8,35 @@
 
 package org.opendaylight.transportpce.renderer.rpcs;
 
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.service.ServiceTypes;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOms;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePath;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollback;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePath;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.TransportpceDeviceRendererService;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.Rpc;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 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;
@@ -38,15 +47,29 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService
     private static final Logger LOG = LoggerFactory.getLogger(DeviceRendererRPCImpl.class);
     private DeviceRendererService deviceRenderer;
     private OtnDeviceRendererService otnDeviceRendererService;
+    private Registration reg;
 
     @Activate
-    public DeviceRendererRPCImpl(@Reference DeviceRendererService deviceRenderer,
+    public DeviceRendererRPCImpl(@Reference RpcProviderService rpcProviderService,
+            @Reference DeviceRendererService deviceRenderer,
             @Reference OtnDeviceRendererService otnDeviceRendererService) {
         this.deviceRenderer = deviceRenderer;
         this.otnDeviceRendererService = otnDeviceRendererService;
+        this.reg = rpcProviderService.registerRpcImplementations(ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+            .put(ServicePath.class, this::servicePath)
+            .put(OtnServicePath.class, this::otnServicePath)
+            .put(RendererRollback.class, this::rendererRollback)
+            .put(CreateOtsOms.class, this::createOtsOms)
+            .build());
         LOG.debug("DeviceRendererRPCImpl instantiated");
     }
 
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("DeviceRendererRPCImpl Closed");
+    }
+
     /**
      * This method is the implementation of the 'service-path' RESTCONF service,
      * which is one of the external APIs into the renderer application. The
@@ -72,7 +95,7 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService
      * @return Result of the request
      */
     @Override
-    public ListenableFuture<RpcResult<ServicePathOutput>> servicePath(ServicePathInput input) {
+    public final ListenableFuture<RpcResult<ServicePathOutput>> servicePath(ServicePathInput input) {
         if (input.getOperation() != null) {
             if (input.getOperation().getIntValue() == 1) {
                 LOG.info("Create operation request received");
@@ -92,7 +115,7 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService
     }
 
     @Override
-    public ListenableFuture<RpcResult<OtnServicePathOutput>> otnServicePath(OtnServicePathInput input) {
+    public final ListenableFuture<RpcResult<OtnServicePathOutput>> otnServicePath(OtnServicePathInput input) {
         if (input.getOperation() != null && input.getServiceFormat() != null && input.getServiceRate() != null) {
             String serviceType = ServiceTypes.getOtnServiceType(input.getServiceFormat(), input.getServiceRate());
             if (input.getOperation().getIntValue() == 1) {
@@ -118,12 +141,12 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService
      * @return Success flag and nodes which failed to rollback
      */
     @Override
-    public ListenableFuture<RpcResult<RendererRollbackOutput>> rendererRollback(RendererRollbackInput input) {
+    public final ListenableFuture<RpcResult<RendererRollbackOutput>> rendererRollback(RendererRollbackInput input) {
         return RpcResultBuilder.success(this.deviceRenderer.rendererRollback(input)).buildFuture();
     }
 
     @Override
-    public ListenableFuture<RpcResult<CreateOtsOmsOutput>> createOtsOms(CreateOtsOmsInput input) {
+    public final ListenableFuture<RpcResult<CreateOtsOmsOutput>> createOtsOms(CreateOtsOmsInput input) {
         LOG.info("Request received to create oms and ots interfaces on {}: {}", input.getNodeId(), input
             .getLogicalConnectionPoint());
         try {
@@ -134,4 +157,8 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService
         }
         return null;
     }
+
+    public Registration getRegisteredRpc() {
+        return reg;
+    }
 }
index 73629ec779e0cf5d6058fdd3c80af5adc4881792..0ec15420269b0d8ea45ddd6e264b51de255dee87 100644 (file)
@@ -7,18 +7,25 @@
  */
 package org.opendaylight.transportpce.renderer.rpcs;
 
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.renderer.ModelMappingUtils;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDelete;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.Rpc;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 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;
@@ -29,15 +36,27 @@ public class TransportPCEServicePathRPCImpl implements TransportpceRendererServi
     private static final Logger LOG = LoggerFactory.getLogger(TransportPCEServicePathRPCImpl.class);
 
     private final RendererServiceOperations rendererServiceOperations;
+    private Registration reg;
 
     @Activate
-    public TransportPCEServicePathRPCImpl(@Reference RendererServiceOperations rendererServiceOperations) {
+    public TransportPCEServicePathRPCImpl(@Reference RendererServiceOperations rendererServiceOperations,
+            @Reference RpcProviderService rpcProviderService) {
         this.rendererServiceOperations = rendererServiceOperations;
+        this.reg = rpcProviderService.registerRpcImplementations(ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+            .put(ServiceImplementationRequest.class, this::serviceImplementationRequest)
+            .put(ServiceDelete.class, this::serviceDelete)
+            .build());
         LOG.debug("TransportPCEServicePathRPCImpl instantiated");
     }
 
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("TransportPCEServicePathRPCImpl Closed");
+    }
+
     @Override
-    public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
+    public final ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
         String serviceName = input.getServiceName();
         LOG.info("Calling RPC service delete request {}", serviceName);
         ServiceDeleteOutput output = null;
@@ -50,7 +69,7 @@ public class TransportPCEServicePathRPCImpl implements TransportpceRendererServi
     }
 
     @Override
-    public ListenableFuture<RpcResult<ServiceImplementationRequestOutput>> serviceImplementationRequest(
+    public final ListenableFuture<RpcResult<ServiceImplementationRequestOutput>> serviceImplementationRequest(
             ServiceImplementationRequestInput input) {
         String serviceName = input.getServiceName();
         LOG.info("Calling RPC service impl request {}", serviceName);
@@ -62,4 +81,8 @@ public class TransportPCEServicePathRPCImpl implements TransportpceRendererServi
         }
         return ModelMappingUtils.createServiceImplementationRpcResponse(output);
     }
+
+    public Registration getRegisteredRpc() {
+        return reg;
+    }
 }
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java
deleted file mode 100644 (file)
index 611326a..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright © 2019 Orange, Inc. 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.transportpce.renderer;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
-import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
-import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
-import org.opendaylight.transportpce.renderer.rpcs.TransportPCEServicePathRPCImpl;
-import org.opendaylight.transportpce.test.AbstractTest;
-
-@ExtendWith(MockitoExtension.class)
-public class RendererProviderTest extends AbstractTest {
-
-    @Mock
-    RpcProviderService rpcProviderService;
-    @Mock
-    DeviceRendererService deviceRenderer;
-    @Mock
-    OtnDeviceRendererService otnDeviceRendererService;
-    @Mock
-    DeviceRendererRPCImpl deviceRendererRPCImpl;
-    @Mock
-    TransportPCEServicePathRPCImpl transportPCEServicePathRPCImpl;
-
-    @Test
-    void testInitMethodRegistersRendererToRpcService() {
-        new RendererProvider(rpcProviderService, deviceRenderer, otnDeviceRendererService, deviceRendererRPCImpl,
-            transportPCEServicePathRPCImpl);
-
-        verify(rpcProviderService, times(1))
-            .registerRpcImplementation(any(), any(TransportPCEServicePathRPCImpl.class));
-        verify(rpcProviderService, times(1))
-            .registerRpcImplementation(any(), any(DeviceRendererRPCImpl.class));
-    }
-}
index b53676900e16f536162e7f4d09db7a5bf76d183b..0d37a11555eb41e22afd6ea97ee673d5d401edc7 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.transportpce.renderer.rpcs;
 
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -16,6 +17,7 @@ import static org.mockito.Mockito.when;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
@@ -28,6 +30,7 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.re
 
 
 public class DeviceRendererRPCImplTest extends AbstractTest {
+    private final RpcProviderService rpcProviderService = mock(RpcProviderService.class);
     private final DeviceRendererService deviceRenderer = mock(DeviceRendererService.class);
     private final OtnDeviceRendererService otnDeviceRenderer = mock(OtnDeviceRendererService.class);
     private final ServicePathInput servicePathInput = spy(ServicePathInput.class);
@@ -37,7 +40,12 @@ public class DeviceRendererRPCImplTest extends AbstractTest {
 
     @BeforeEach
     void setup() {
-        deviceRendererRPC = new DeviceRendererRPCImpl(deviceRenderer, otnDeviceRenderer);
+        deviceRendererRPC = new DeviceRendererRPCImpl(rpcProviderService, deviceRenderer, otnDeviceRenderer);
+    }
+
+    @Test
+    void testRpcRegistration() {
+        verify(rpcProviderService, times(1)).registerRpcImplementations(any());
     }
 
     @Test