Eliminate blueprint from netconf-topology-impl 42/104342/4
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 9 Feb 2023 11:56:02 +0000 (12:56 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 9 Feb 2023 13:59:24 +0000 (14:59 +0100)
The blueprint now is purely service injection, convert
NetconfTopologyImpl into a component instead.

JIRA: NETCONF-960
Change-Id: Id769b2d53cc75b0c5528aa6a0dd23d2b2a83cc85
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
apps/netconf-topology-impl/pom.xml
apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java
apps/netconf-topology-impl/src/main/resources/OSGI-INF/blueprint/netconf-topology.xml [deleted file]
apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java

index ba9248d7891af39bc43a0555dec9c1e76854f5b3..7a9654579f5a487b49f41b207df4c3d54fbaf7b2 100644 (file)
 
     <dependencies>
         <dependency>
-            <groupId>${project.groupId}</groupId>
+            <groupId>org.opendaylight.netconf</groupId>
             <artifactId>netconf-topology</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.guicedee.services</groupId>
+            <artifactId>javax.inject</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.annotation</groupId>
+            <artifactId>jakarta.annotation-api</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+        </dependency>
     </dependencies>
 </project>
index 6430d017fa03ef31697df9b9d078b799b604c3f9..4f187003799dd3313d195e98303109d2b947dac3 100644 (file)
@@ -7,11 +7,13 @@
  */
 package org.opendaylight.netconf.topology.impl;
 
-import static java.util.Objects.requireNonNull;
-
 import com.google.common.annotations.VisibleForTesting;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import io.netty.util.concurrent.EventExecutor;
 import java.util.Collection;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
 import org.opendaylight.controller.config.threadpool.ThreadPool;
@@ -29,6 +31,7 @@ import org.opendaylight.netconf.sal.connect.api.SchemaResourceManager;
 import org.opendaylight.netconf.sal.connect.netconf.schema.mapping.BaseNetconfSchemas;
 import org.opendaylight.netconf.topology.spi.AbstractNetconfTopology;
 import org.opendaylight.netconf.topology.spi.NetconfConnectorDTO;
+import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
 import org.opendaylight.netconf.topology.spi.NetconfTopologyRPCProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeTopologyService;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -38,22 +41,44 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+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;
 
+// Non-final for testing
+@Singleton
+@Component(service = { })
 public class NetconfTopologyImpl extends AbstractNetconfTopology
         implements DataTreeChangeListener<Node>, AutoCloseable {
-
     private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyImpl.class);
 
-    private final RpcProviderService rpcProviderService;
-    private ListenerRegistration<NetconfTopologyImpl> datastoreListenerRegistration = null;
-    private ObjectRegistration<?> rpcReg = null;
+    private Registration dtclReg;
+    private Registration rpcReg;
+
+    @Inject
+    @Activate
+    public NetconfTopologyImpl(
+            @Reference(target = "(type=netconf-client-dispatcher)") final NetconfClientDispatcher clientDispatcher,
+            @Reference(target = "(type=global-event-executor)") final EventExecutor eventExecutor,
+            @Reference(target = "(type=global-netconf-ssh-scheduled-executor)")
+            final ScheduledThreadPool keepaliveExecutor,
+            @Reference(target = "(type=global-netconf-processing-executor)") final ThreadPool processingExecutor,
+            @Reference final SchemaResourceManager schemaRepositoryProvider, @Reference final DataBroker dataBroker,
+            @Reference final DOMMountPointService mountPointService,
+            @Reference final AAAEncryptionService encryptionService,
+            @Reference final RpcProviderService rpcProviderService, @Reference final BaseNetconfSchemas baseSchemas,
+            @Reference final DeviceActionFactory deviceActionFactory) {
+        this(NetconfNodeUtils.DEFAULT_TOPOLOGY_NAME, clientDispatcher, eventExecutor, keepaliveExecutor,
+            processingExecutor, schemaRepositoryProvider, dataBroker, mountPointService, encryptionService,
+            rpcProviderService, baseSchemas, deviceActionFactory);
+    }
 
     public NetconfTopologyImpl(final String topologyId, final NetconfClientDispatcher clientDispatcher,
             final EventExecutor eventExecutor, final ScheduledThreadPool keepaliveExecutor,
@@ -66,6 +91,8 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology
                 baseSchemas, null);
     }
 
+    @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
+        justification = "DTCL registration of 'this'")
     public NetconfTopologyImpl(final String topologyId, final NetconfClientDispatcher clientDispatcher,
             final EventExecutor eventExecutor, final ScheduledThreadPool keepaliveExecutor,
             final ThreadPool processingExecutor, final SchemaResourceManager schemaRepositoryProvider,
@@ -75,9 +102,16 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology
         super(topologyId, clientDispatcher, eventExecutor, keepaliveExecutor, processingExecutor,
                 schemaRepositoryProvider, dataBroker, mountPointService, encryptionService, deviceActionFactory,
                 baseSchemas);
-        this.rpcProviderService = requireNonNull(rpcProviderService);
+
+        LOG.debug("Registering datastore listener");
+        dtclReg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
+            LogicalDatastoreType.CONFIGURATION, createTopologyListPath(topologyId).child(Node.class)), this);
+        rpcReg = rpcProviderService.registerRpcImplementation(NetconfNodeTopologyService.class,
+            new NetconfTopologyRPCProvider(dataBroker, encryptionService, topologyId));
     }
 
+    @PreDestroy
+    @Deactivate
     @Override
     public void close() {
         if (rpcReg != null) {
@@ -91,23 +125,12 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology
         }
         activeConnectors.clear();
 
-        if (datastoreListenerRegistration != null) {
-            datastoreListenerRegistration.close();
-            datastoreListenerRegistration = null;
+        if (dtclReg != null) {
+            dtclReg.close();
+            dtclReg = null;
         }
     }
 
-    /**
-     * Invoked by blueprint.
-     */
-    public void init() {
-        LOG.debug("Registering datastore listener");
-        datastoreListenerRegistration = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
-            LogicalDatastoreType.CONFIGURATION, createTopologyListPath(topologyId).child(Node.class)), this);
-        rpcReg = rpcProviderService.registerRpcImplementation(NetconfNodeTopologyService.class,
-            new NetconfTopologyRPCProvider(dataBroker, encryptionService, topologyId));
-    }
-
     @Override
     public void onDataTreeChanged(final Collection<DataTreeModification<Node>> collection) {
         for (final DataTreeModification<Node> change : collection) {
diff --git a/apps/netconf-topology-impl/src/main/resources/OSGI-INF/blueprint/netconf-topology.xml b/apps/netconf-topology-impl/src/main/resources/OSGI-INF/blueprint/netconf-topology.xml
deleted file mode 100644 (file)
index dcc0834..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2016 Inocybe Technologies 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
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true">
-
-    <reference id="clientDispatcherDependency"
-               interface="org.opendaylight.netconf.client.NetconfClientDispatcher"
-               odl:type="netconf-client-dispatcher"/>
-    <reference id="keepAliveExecutor"
-               interface="org.opendaylight.controller.config.threadpool.ScheduledThreadPool"
-               odl:type="global-netconf-ssh-scheduled-executor"/>
-    <reference id="processingExecutor"
-               interface="org.opendaylight.controller.config.threadpool.ThreadPool"
-               odl:type="global-netconf-processing-executor"/>
-    <reference id="eventExecutor"
-               interface="io.netty.util.concurrent.EventExecutor"
-               odl:type="global-event-executor"/>
-    <reference id="dataBroker"
-               interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-    <reference id="rpcProviderService"
-               interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-    <reference id="mountPointService"
-               interface="org.opendaylight.mdsal.dom.api.DOMMountPointService"/>
-    <reference id="encryptionService"
-               interface="org.opendaylight.aaa.encrypt.AAAEncryptionService" />
-    <reference id="deviceActionFactory"
-               interface="org.opendaylight.netconf.sal.connect.api.DeviceActionFactory"/>
-    <reference id="schemaManager"
-               interface="org.opendaylight.netconf.sal.connect.api.SchemaResourceManager"/>
-    <reference id="baseSchemas"
-               interface="org.opendaylight.netconf.sal.connect.netconf.schema.mapping.BaseNetconfSchemas"/>
-
-    <bean id="netconfTopology" class="org.opendaylight.netconf.topology.impl.NetconfTopologyImpl"
-          init-method="init"
-          destroy-method="close">
-        <argument value="topology-netconf"/>
-        <argument ref="clientDispatcherDependency"/>
-        <argument ref="eventExecutor"/>
-        <argument ref="keepAliveExecutor"/>
-        <argument ref="processingExecutor"/>
-        <argument ref="schemaManager"/>
-        <argument ref="dataBroker"/>
-        <argument ref="mountPointService"/>
-        <argument ref="encryptionService" />
-        <argument ref="rpcProviderService" />
-        <argument ref="baseSchemas"/>
-        <argument ref="deviceActionFactory"/>
-    </bean>
-</blueprint>
index a7f1d1c20e7a0e3617bc771f39980fe0949b6f24..3e1a066e3f1aed9e6f65370665a1fa66e67f2b65 100644 (file)
@@ -114,18 +114,12 @@ public class NetconfTopologyImplTest {
         topology = new TestingNetconfTopologyImpl(TOPOLOGY_ID, mockedClientDispatcher, mockedEventExecutor,
             mockedKeepaliveExecutor, mockedProcessingExecutor, mockedResourceManager, dataBroker, mountPointService,
             encryptionService, rpcProviderService);
-
-        spyTopology = spy(topology);
-    }
-
-    @Test
-    public void testInit() {
-        topology.init();
-
         //verify initialization of topology
         verify(wtx).merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetworkTopology.class)
                 .child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID))).build(),
                 new TopologyBuilder().setTopologyId(new TopologyId(TOPOLOGY_ID)).build());
+
+        spyTopology = spy(topology);
     }
 
     @Test
@@ -237,7 +231,7 @@ public class NetconfTopologyImplTest {
                                           final RpcProviderService rpcProviderService) {
             super(topologyId, clientDispatcher, eventExecutor, keepaliveExecutor,
                   processingExecutor, schemaRepositoryProvider, dataBroker,
-                  mountPointService, encryptionService, rpcProviderService, BASE_SCHEMAS);
+                  mountPointService, encryptionService, rpcProviderService, BASE_SCHEMAS, null);
         }
 
         @Override