2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.topology.impl;
10 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11 import java.util.Collection;
12 import javax.annotation.PreDestroy;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
16 import org.opendaylight.mdsal.binding.api.DataBroker;
17 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
18 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
19 import org.opendaylight.mdsal.binding.api.DataTreeModification;
20 import org.opendaylight.mdsal.binding.api.RpcProviderService;
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
22 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
23 import org.opendaylight.netconf.client.NetconfClientFactory;
24 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas;
25 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
26 import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager;
27 import org.opendaylight.netconf.common.NetconfTimer;
28 import org.opendaylight.netconf.topology.spi.AbstractNetconfTopology;
29 import org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory;
30 import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
31 import org.opendaylight.netconf.topology.spi.NetconfTopologyRPCProvider;
32 import org.opendaylight.netconf.topology.spi.NetconfTopologySchemaAssembler;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
38 import org.opendaylight.yangtools.concepts.Registration;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.osgi.service.component.annotations.Activate;
41 import org.osgi.service.component.annotations.Component;
42 import org.osgi.service.component.annotations.Deactivate;
43 import org.osgi.service.component.annotations.Reference;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 // Non-final for testing
49 @Component(service = { })
50 public class NetconfTopologyImpl extends AbstractNetconfTopology
51 implements DataTreeChangeListener<Node>, AutoCloseable {
52 private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyImpl.class);
54 private Registration dtclReg;
55 private NetconfTopologyRPCProvider rpcProvider;
59 public NetconfTopologyImpl(
60 @Reference(target = "(type=netconf-client-factory)") final NetconfClientFactory clientFactory,
61 @Reference final NetconfTimer timer,
62 @Reference final NetconfTopologySchemaAssembler schemaAssembler,
63 @Reference final SchemaResourceManager schemaRepositoryProvider, @Reference final DataBroker dataBroker,
64 @Reference final DOMMountPointService mountPointService,
65 @Reference final AAAEncryptionService encryptionService,
66 @Reference final NetconfClientConfigurationBuilderFactory builderFactory,
67 @Reference final RpcProviderService rpcProviderService, @Reference final BaseNetconfSchemas baseSchemas,
68 @Reference final DeviceActionFactory deviceActionFactory) {
69 this(NetconfNodeUtils.DEFAULT_TOPOLOGY_NAME, clientFactory, timer, schemaAssembler, schemaRepositoryProvider,
70 dataBroker, mountPointService, encryptionService, builderFactory, rpcProviderService, baseSchemas,
74 public NetconfTopologyImpl(final String topologyId, final NetconfClientFactory clientclientFactory,
75 final NetconfTimer timer, final NetconfTopologySchemaAssembler schemaAssembler,
76 final SchemaResourceManager schemaRepositoryProvider, final DataBroker dataBroker,
77 final DOMMountPointService mountPointService, final AAAEncryptionService encryptionService,
78 final NetconfClientConfigurationBuilderFactory builderFactory, final RpcProviderService rpcProviderService,
79 final BaseNetconfSchemas baseSchemas) {
80 this(topologyId, clientclientFactory, timer, schemaAssembler, schemaRepositoryProvider, dataBroker,
81 mountPointService, encryptionService, builderFactory, rpcProviderService, baseSchemas, null);
84 @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
85 justification = "DTCL registration of 'this'")
86 public NetconfTopologyImpl(final String topologyId, final NetconfClientFactory clientFactory,
87 final NetconfTimer timer, final NetconfTopologySchemaAssembler schemaAssembler,
88 final SchemaResourceManager schemaRepositoryProvider, final DataBroker dataBroker,
89 final DOMMountPointService mountPointService, final AAAEncryptionService encryptionService,
90 final NetconfClientConfigurationBuilderFactory builderFactory, final RpcProviderService rpcProviderService,
91 final BaseNetconfSchemas baseSchemas, final DeviceActionFactory deviceActionFactory) {
92 super(topologyId, clientFactory, timer, schemaAssembler, schemaRepositoryProvider, dataBroker,
93 mountPointService, builderFactory, deviceActionFactory, baseSchemas);
95 LOG.debug("Registering datastore listener");
96 dtclReg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
97 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class)
98 .child(Topology.class, new TopologyKey(new TopologyId(topologyId)))
101 rpcProvider = new NetconfTopologyRPCProvider(rpcProviderService, dataBroker, encryptionService, topologyId);
107 public void close() {
108 if (rpcProvider != null) {
113 // close all existing connectors, delete whole topology in datastore?
116 if (dtclReg != null) {
123 public void onDataTreeChanged(final Collection<DataTreeModification<Node>> changes) {
124 for (var change : changes) {
125 final var rootNode = change.getRootNode();
126 final var modType = rootNode.getModificationType();
128 case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.getDataAfter());
129 case WRITE -> ensureNode("created", rootNode.getDataAfter());
131 final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().getRootIdentifier()).getNodeId();
132 LOG.debug("Config for node {} deleted", nodeId);
135 default -> LOG.debug("Unsupported modification type: {}.", modType);
140 private void ensureNode(final String operation, final Node node) {
141 final var nodeId = node.getNodeId();
142 LOG.debug("Config for node {} {}", nodeId, operation);