Convert mdsal-netconf-monitoring to OSGi DS 06/104306/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Feb 2023 13:04:16 +0000 (14:04 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 8 Feb 2023 17:50:38 +0000 (17:50 +0000)
These are just two simple components, convert them to Declarative
Services.

JIRA: NETCONF-954
Change-Id: I3bf22d265feb8a1db086df396fb5ebaa26bbecdd
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
netconf/mdsal-netconf-monitoring/pom.xml
netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java
netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriter.java
netconf/mdsal-netconf-monitoring/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-monitoring.xml [deleted file]
netconf/mdsal-netconf-monitoring/src/test/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriterTest.java

index 279c1e435d80ba537c5bfdeaf010deb7b7e7b446..d35fae935938c1da4f9cfe5e1e7ca9243e367019 100644 (file)
   <packaging>bundle</packaging>
 
   <dependencies>
-    <!-- compile dependencies -->
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>concepts</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-common-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>yang-binding</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
       <artifactId>netconf-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.opendaylight.netconf</groupId>
       <artifactId>netconf-mapping-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.opendaylight.netconf</groupId>
       <artifactId>netconf-util</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-api</artifactId>
+      <groupId>org.opendaylight.netconf.model</groupId>
+      <artifactId>rfc6022</artifactId>
     </dependency>
-
     <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
     </dependency>
 
     <dependency>
index a4fef8b3f552fd827c6f10fe50c7e1b0efc291c7..82359499568db4ce2a5fce6c8d3cbea16f2ee492 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.controller.config.yang.netconf.mdsal.monitoring;
 
+import static java.util.Objects.requireNonNull;
+
 import java.util.Set;
 import org.opendaylight.netconf.api.capability.Capability;
 import org.opendaylight.netconf.api.monitoring.CapabilityListener;
@@ -16,23 +18,33 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationService;
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
 import org.opendaylight.yangtools.concepts.Registration;
+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;
 
+@Component(service = { })
 public final class MdsalMonitoringMapperFactory implements NetconfOperationServiceFactory, AutoCloseable {
-    private final MonitoringToMdsalWriter monitoringToMdsalWriter;
     private final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener;
     private final NetconfMonitoringService netconfMonitoringService;
 
+    @Activate
     public MdsalMonitoringMapperFactory(
+            @Reference(target = "(type=mapper-aggregator-registry)")
             final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener,
-            final NetconfMonitoringService netconfMonitoringService,
-            final MonitoringToMdsalWriter monitoringToMdsalWriter) {
-
-        this.netconfOperationServiceFactoryListener = netconfOperationServiceFactoryListener;
-        this.netconfMonitoringService = netconfMonitoringService;
-        this.monitoringToMdsalWriter = monitoringToMdsalWriter;
+            @Reference(target = "(type=netconf-server-monitoring)")
+            final NetconfMonitoringService netconfMonitoringService) {
+        this.netconfOperationServiceFactoryListener = requireNonNull(netconfOperationServiceFactoryListener);
+        this.netconfMonitoringService = requireNonNull(netconfMonitoringService);
         this.netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this);
     }
 
+    @Deactivate
+    @Override
+    public void close() {
+        netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this);
+    }
+
     @Override
     public NetconfOperationService createService(final String netconfSessionIdForReporting) {
         return new NetconfOperationService() {
@@ -60,14 +72,4 @@ public final class MdsalMonitoringMapperFactory implements NetconfOperationServi
     public Registration registerCapabilityListener(final CapabilityListener listener) {
         return () -> { };
     }
-
-    /**
-     * Invoked using blueprint.
-     */
-    @Override
-    public void close() {
-        monitoringToMdsalWriter.close();
-        netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this);
-    }
-
 }
index e6b0fd6b06ed96eb1166fb41ed1d7c475cf7a166..b62387eefe9317b45489f2b666d4ed2238c46f80 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.config.yang.netconf.mdsal.monitoring;
 
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
@@ -17,21 +18,27 @@ import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService.CapabilitiesListener;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService.SessionsListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+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;
 
 /**
  * Writes netconf server state changes received from NetconfMonitoringService to netconf-state datastore subtree.
  */
-public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMonitoringService.CapabilitiesListener,
-        NetconfMonitoringService.SessionsListener {
-
+@Component(service = { })
+public final class MonitoringToMdsalWriter implements AutoCloseable, CapabilitiesListener, SessionsListener {
     private static final Logger LOG = LoggerFactory.getLogger(MonitoringToMdsalWriter.class);
 
     private static final InstanceIdentifier<Capabilities> CAPABILITIES_INSTANCE_IDENTIFIER =
@@ -41,45 +48,39 @@ public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMoni
     private static final InstanceIdentifier<Sessions> SESSIONS_INSTANCE_IDENTIFIER =
             InstanceIdentifier.create(NetconfState.class).child(Sessions.class);
 
-    private final NetconfMonitoringService serverMonitoringDependency;
     private final DataBroker dataBroker;
+    private final Registration capabilitiesReg;
+    private final Registration sessionsReg;
 
-    public MonitoringToMdsalWriter(final NetconfMonitoringService serverMonitoringDependency,
-                                   final DataBroker dataBroker) {
-        this.serverMonitoringDependency = serverMonitoringDependency;
-        this.dataBroker = dataBroker;
-    }
+    @Activate
+    public MonitoringToMdsalWriter(@Reference final DataBroker dataBroker,
+            @Reference(target = "(type=netconf-server-monitoring)")
+            final NetconfMonitoringService serverMonitoringDependency) {
+        this.dataBroker = requireNonNull(dataBroker);
 
-    /**
-     * Invoked using blueprint.
-     */
-    public void start() {
-        // FIXME: close registrations
-        serverMonitoringDependency.registerCapabilitiesListener(this);
-        serverMonitoringDependency.registerSessionsListener(this);
+        capabilitiesReg = serverMonitoringDependency.registerCapabilitiesListener(this);
+        sessionsReg = serverMonitoringDependency.registerSessionsListener(this);
     }
 
-    /**
-     * Invoked using blueprint.
-     */
+    @Deactivate
     @Override
     public void close() {
+        sessionsReg.close();
+        capabilitiesReg.close();
         runTransaction(tx -> tx.delete(LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifier.create(NetconfState.class)));
     }
 
     @Override
     public void onSessionStarted(final Session session) {
-        final InstanceIdentifier<Session> sessionPath =
-                SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key());
-        runTransaction(tx -> tx.put(LogicalDatastoreType.OPERATIONAL, sessionPath, session));
+        runTransaction(tx -> tx.put(LogicalDatastoreType.OPERATIONAL,
+            SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key()), session));
     }
 
     @Override
     public void onSessionEnded(final Session session) {
-        final InstanceIdentifier<Session> sessionPath =
-                SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key());
-        runTransaction(tx -> tx.delete(LogicalDatastoreType.OPERATIONAL, sessionPath));
+        runTransaction(tx -> tx.delete(LogicalDatastoreType.OPERATIONAL,
+            SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key())));
     }
 
     @Override
@@ -99,7 +100,6 @@ public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMoni
     }
 
     private void runTransaction(final Consumer<WriteTransaction> txUser) {
-        Preconditions.checkState(dataBroker != null);
         final WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
         txUser.accept(tx);
         tx.commit().addCallback(new FutureCallback<CommitInfo>() {
@@ -117,9 +117,8 @@ public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMoni
 
     private static void updateSessions(final WriteTransaction tx, final Collection<Session> sessions) {
         for (Session session : sessions) {
-            final InstanceIdentifier<Session> sessionPath =
-                    SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key());
-            tx.put(LogicalDatastoreType.OPERATIONAL, sessionPath, session);
+            tx.put(LogicalDatastoreType.OPERATIONAL, SESSIONS_INSTANCE_IDENTIFIER.child(Session.class, session.key()),
+                session);
         }
     }
 }
diff --git a/netconf/mdsal-netconf-monitoring/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-monitoring.xml b/netconf/mdsal-netconf-monitoring/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-monitoring.xml
deleted file mode 100644 (file)
index d42d9bf..0000000
+++ /dev/null
@@ -1,39 +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="dataBroker"
-               interface="org.opendaylight.mdsal.binding.api.DataBroker"
-               odl:type="default"/>
-    <reference id="netconfMonitoringService"
-               interface="org.opendaylight.netconf.api.monitoring.NetconfMonitoringService"
-               odl:type="netconf-server-monitoring"/>
-    <reference id="netconfOperationServiceFactoryListener"
-               interface="org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener"
-               odl:type="mapper-aggregator-registry"/>
-
-    <bean id="monitoringToMdsalWriter"
-          class="org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.MonitoringToMdsalWriter"
-          init-method="start"
-          destroy-method="close">
-        <argument ref="netconfMonitoringService"/>
-        <argument ref="dataBroker"/>
-    </bean>
-
-    <bean id="mdsalMonitoringMapperFactory"
-          class="org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.MdsalMonitoringMapperFactory"
-          destroy-method="close">
-        <argument ref="netconfOperationServiceFactoryListener"/>
-        <argument ref="netconfMonitoringService"/>
-        <argument ref="monitoringToMdsalWriter"/>
-    </bean>
-
-</blueprint>
index 037c0e8bd4ea85c80e58da3768f485111e2b6418..a48ebdc76409dd553abb685a183f88963f934578 100644 (file)
@@ -15,7 +15,6 @@ import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.verify;
 import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
 
-import java.util.ArrayList;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.SessionBuilder;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
@@ -50,13 +50,17 @@ public class MonitoringToMdsalWriterTest {
     private DataBroker dataBroker;
     @Mock
     private WriteTransaction writeTransaction;
+    @Mock
+    private Registration capabilityReg;
+    @Mock
+    private Registration sessionsReg;
 
     private MonitoringToMdsalWriter writer;
 
     @Before
     public void setUp() {
-        doReturn(null).when(monitoring).registerCapabilitiesListener(any());
-        doReturn(null).when(monitoring).registerSessionsListener(any());
+        doReturn(capabilityReg).when(monitoring).registerCapabilitiesListener(any());
+        doReturn(sessionsReg).when(monitoring).registerSessionsListener(any());
 
         doReturn(writeTransaction).when(dataBroker).newWriteOnlyTransaction();
 
@@ -64,14 +68,17 @@ public class MonitoringToMdsalWriterTest {
         doNothing().when(writeTransaction).delete(eq(LogicalDatastoreType.OPERATIONAL), any());
         doReturn(emptyFluentFuture()).when(writeTransaction).commit();
 
-        writer = new MonitoringToMdsalWriter(monitoring, dataBroker);
+        writer = new MonitoringToMdsalWriter(dataBroker, monitoring);
     }
 
     @Test
     public void testClose() throws Exception {
-        writer.start();
+        doNothing().when(capabilityReg).close();
+        doNothing().when(sessionsReg).close();
         writer.close();
-        InOrder inOrder = inOrder(writeTransaction);
+        InOrder inOrder = inOrder(capabilityReg, sessionsReg, writeTransaction);
+        inOrder.verify(sessionsReg).close();
+        inOrder.verify(capabilityReg).close();
         inOrder.verify(writeTransaction).delete(LogicalDatastoreType.OPERATIONAL, INSTANCE_IDENTIFIER);
         inOrder.verify(writeTransaction).commit();
     }
@@ -80,7 +87,6 @@ public class MonitoringToMdsalWriterTest {
     public void testOnCapabilityChanged() throws Exception {
         final InstanceIdentifier<Capabilities> capabilitiesId =
                 InstanceIdentifier.create(NetconfState.class).child(Capabilities.class);
-        writer.start();
         final Capabilities capabilities = new CapabilitiesBuilder().build();
         writer.onCapabilitiesChanged(capabilities);
         InOrder inOrder = inOrder(writeTransaction);
@@ -92,7 +98,6 @@ public class MonitoringToMdsalWriterTest {
     public void testOnSchemasChanged() throws Exception {
         final InstanceIdentifier<Schemas> schemasId =
                 InstanceIdentifier.create(NetconfState.class).child(Schemas.class);
-        writer.start();
         final Schemas schemas = new SchemasBuilder().build();
         writer.onSchemasChanged(schemas);
         InOrder inOrder = inOrder(writeTransaction);
@@ -109,7 +114,6 @@ public class MonitoringToMdsalWriterTest {
                 InstanceIdentifier.create(NetconfState.class)
                         .child(Sessions.class)
                         .child(Session.class, session.key());
-        writer.start();
         writer.onSessionStarted(session);
         InOrder inOrder = inOrder(writeTransaction);
         inOrder.verify(writeTransaction).put(LogicalDatastoreType.OPERATIONAL, id, session);
@@ -125,7 +129,6 @@ public class MonitoringToMdsalWriterTest {
                 InstanceIdentifier.create(NetconfState.class)
                         .child(Sessions.class)
                         .child(Session.class, session.key());
-        writer.start();
         writer.onSessionEnded(session);
         InOrder inOrder = inOrder(writeTransaction);
         inOrder.verify(writeTransaction).delete(LogicalDatastoreType.OPERATIONAL, id);
@@ -140,9 +143,6 @@ public class MonitoringToMdsalWriterTest {
         Session session2 = new SessionBuilder()
                 .setSessionId(Uint32.valueOf(2))
                 .build();
-        List<Session> sessions = new ArrayList<>();
-        sessions.add(session1);
-        sessions.add(session2);
         final InstanceIdentifier<Session> id1 =
                 InstanceIdentifier.create(NetconfState.class)
                         .child(Sessions.class)
@@ -151,8 +151,7 @@ public class MonitoringToMdsalWriterTest {
                 InstanceIdentifier.create(NetconfState.class)
                         .child(Sessions.class)
                         .child(Session.class, session2.key());
-        writer.start();
-        writer.onSessionsUpdated(sessions);
+        writer.onSessionsUpdated(List.of(session1, session2));
         InOrder inOrder = inOrder(writeTransaction);
         inOrder.verify(writeTransaction).put(LogicalDatastoreType.OPERATIONAL, id1, session1);
         inOrder.verify(writeTransaction).put(LogicalDatastoreType.OPERATIONAL, id2, session2);
@@ -161,7 +160,6 @@ public class MonitoringToMdsalWriterTest {
 
     @Test
     public void testOnSessionInitiated() throws Exception {
-        writer.start();
         verify(monitoring).registerCapabilitiesListener(writer);
     }
 }
\ No newline at end of file