From dadacea0cfef402925efea5d7a70c48df7094249 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 8 Feb 2023 14:04:16 +0100 Subject: [PATCH 1/1] Convert mdsal-netconf-monitoring to OSGi DS These are just two simple components, convert them to Declarative Services. JIRA: NETCONF-954 Change-Id: I3bf22d265feb8a1db086df396fb5ebaa26bbecdd Signed-off-by: Robert Varga --- netconf/mdsal-netconf-monitoring/pom.xml | 40 ++++++++++--- .../MdsalMonitoringMapperFactory.java | 36 +++++------ .../monitoring/MonitoringToMdsalWriter.java | 59 +++++++++---------- .../blueprint/mdsal-netconf-monitoring.xml | 39 ------------ .../MonitoringToMdsalWriterTest.java | 30 +++++----- 5 files changed, 93 insertions(+), 111 deletions(-) delete mode 100644 netconf/mdsal-netconf-monitoring/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-monitoring.xml diff --git a/netconf/mdsal-netconf-monitoring/pom.xml b/netconf/mdsal-netconf-monitoring/pom.xml index 279c1e435d..d35fae9359 100644 --- a/netconf/mdsal-netconf-monitoring/pom.xml +++ b/netconf/mdsal-netconf-monitoring/pom.xml @@ -20,27 +20,49 @@ bundle - - ${project.groupId} + com.google.guava + guava + + + org.opendaylight.yangtools + concepts + + + org.opendaylight.yangtools + yang-common + + + org.opendaylight.mdsal + mdsal-binding-api + + + org.opendaylight.mdsal + mdsal-common-api + + + org.opendaylight.mdsal + yang-binding + + + org.opendaylight.netconf netconf-api - ${project.groupId} + org.opendaylight.netconf netconf-mapping-api - ${project.groupId} + org.opendaylight.netconf netconf-util - org.opendaylight.mdsal - mdsal-binding-api + org.opendaylight.netconf.model + rfc6022 - - com.google.guava - guava + org.osgi + org.osgi.service.component.annotations diff --git a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java index a4fef8b3f5..8235949956 100644 --- a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java +++ b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java @@ -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); - } - } diff --git a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriter.java b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriter.java index e6b0fd6b06..b62387eefe 100644 --- a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriter.java +++ b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriter.java @@ -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_INSTANCE_IDENTIFIER = @@ -41,45 +48,39 @@ public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMoni private static final InstanceIdentifier 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 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 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 txUser) { - Preconditions.checkState(dataBroker != null); final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); txUser.accept(tx); tx.commit().addCallback(new FutureCallback() { @@ -117,9 +117,8 @@ public final class MonitoringToMdsalWriter implements AutoCloseable, NetconfMoni private static void updateSessions(final WriteTransaction tx, final Collection sessions) { for (Session session : sessions) { - final InstanceIdentifier 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 index d42d9bfea5..0000000000 --- a/netconf/mdsal-netconf-monitoring/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-monitoring.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/netconf/mdsal-netconf-monitoring/src/test/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriterTest.java b/netconf/mdsal-netconf-monitoring/src/test/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriterTest.java index 037c0e8bd4..a48ebdc764 100644 --- a/netconf/mdsal-netconf-monitoring/src/test/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriterTest.java +++ b/netconf/mdsal-netconf-monitoring/src/test/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MonitoringToMdsalWriterTest.java @@ -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 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 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 sessions = new ArrayList<>(); - sessions.add(session1); - sessions.add(session2); final InstanceIdentifier 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 -- 2.36.6