<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>
*/
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;
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() {
public Registration registerCapabilityListener(final CapabilityListener listener) {
return () -> { };
}
-
- /**
- * Invoked using blueprint.
- */
- @Override
- public void close() {
- monitoringToMdsalWriter.close();
- netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this);
- }
-
}
*/
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;
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 =
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
}
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>() {
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);
}
}
}
+++ /dev/null
-<?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>
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;
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;
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();
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();
}
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);
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);
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);
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);
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)
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);
@Test
public void testOnSessionInitiated() throws Exception {
- writer.start();
verify(monitoring).registerCapabilitiesListener(writer);
}
}
\ No newline at end of file