Rework BaseScheams
[netconf.git] / apps / netconf-topology-impl / src / main / java / org / opendaylight / netconf / topology / impl / NetconfTopologyImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netconf.topology.impl;
9
10 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11 import java.util.List;
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.BaseNetconfSchemaProvider;
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;
46
47 // Non-final for testing
48 @Singleton
49 @Component(service = { })
50 public class NetconfTopologyImpl extends AbstractNetconfTopology
51         implements DataTreeChangeListener<Node>, AutoCloseable {
52     private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyImpl.class);
53
54     private Registration dtclReg;
55     private NetconfTopologyRPCProvider rpcProvider;
56
57     @Inject
58     @Activate
59     public NetconfTopologyImpl(
60             @Reference final NetconfClientFactory clientFactory, @Reference final NetconfTimer timer,
61             @Reference final NetconfTopologySchemaAssembler schemaAssembler,
62             @Reference final SchemaResourceManager schemaRepositoryProvider, @Reference final DataBroker dataBroker,
63             @Reference final DOMMountPointService mountPointService,
64             @Reference final AAAEncryptionService encryptionService,
65             @Reference final NetconfClientConfigurationBuilderFactory builderFactory,
66             @Reference final RpcProviderService rpcProviderService,
67             @Reference final BaseNetconfSchemaProvider baseSchemaProvider,
68             @Reference final DeviceActionFactory deviceActionFactory) {
69         this(NetconfNodeUtils.DEFAULT_TOPOLOGY_NAME, clientFactory, timer, schemaAssembler, schemaRepositoryProvider,
70             dataBroker, mountPointService, encryptionService, builderFactory, rpcProviderService, baseSchemaProvider,
71             deviceActionFactory);
72     }
73
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 BaseNetconfSchemaProvider baseSchemaProvider) {
80         this(topologyId, clientclientFactory, timer, schemaAssembler, schemaRepositoryProvider, dataBroker,
81             mountPointService, encryptionService, builderFactory, rpcProviderService, baseSchemaProvider, null);
82     }
83
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 BaseNetconfSchemaProvider baseSchemaProvider, final DeviceActionFactory deviceActionFactory) {
92         super(topologyId, clientFactory, timer, schemaAssembler, schemaRepositoryProvider, dataBroker,
93             mountPointService, builderFactory, deviceActionFactory, baseSchemaProvider);
94
95         LOG.debug("Registering datastore listener");
96         dtclReg = dataBroker.registerLegacyTreeChangeListener(DataTreeIdentifier.of(
97             LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class)
98                 .child(Topology.class, new TopologyKey(new TopologyId(topologyId)))
99                 .child(Node.class)
100                 .build()), this);
101         rpcProvider = new NetconfTopologyRPCProvider(rpcProviderService, dataBroker, encryptionService, topologyId);
102     }
103
104     @PreDestroy
105     @Deactivate
106     @Override
107     public void close() {
108         if (rpcProvider != null) {
109             rpcProvider.close();
110             rpcProvider = null;
111         }
112
113         // close all existing connectors, delete whole topology in datastore?
114         deleteAllNodes();
115
116         if (dtclReg != null) {
117             dtclReg.close();
118             dtclReg = null;
119         }
120     }
121
122     @Override
123     public void onDataTreeChanged(final List<DataTreeModification<Node>> changes) {
124         for (var change : changes) {
125             final var rootNode = change.getRootNode();
126             final var modType = rootNode.modificationType();
127             switch (modType) {
128                 case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.dataAfter());
129                 case WRITE -> ensureNode("created", rootNode.dataAfter());
130                 case DELETE -> {
131                     final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().path()).getNodeId();
132                     LOG.debug("Config for node {} deleted", nodeId);
133                     deleteNode(nodeId);
134                 }
135                 default -> LOG.debug("Unsupported modification type: {}.", modType);
136             }
137         }
138     }
139
140     private void ensureNode(final String operation, final Node node) {
141         final var nodeId = node.getNodeId();
142         LOG.debug("Config for node {} {}", nodeId, operation);
143         ensureNode(node);
144     }
145 }