*/
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;
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;
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,
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,
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) {
}
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) {
+++ /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="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>
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
final RpcProviderService rpcProviderService) {
super(topologyId, clientDispatcher, eventExecutor, keepaliveExecutor,
processingExecutor, schemaRepositoryProvider, dataBroker,
- mountPointService, encryptionService, rpcProviderService, BASE_SCHEMAS);
+ mountPointService, encryptionService, rpcProviderService, BASE_SCHEMAS, null);
}
@Override