2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.singleton.impl;
10 import akka.actor.ActorRef;
11 import akka.pattern.Patterns;
12 import akka.util.Timeout;
13 import com.google.common.base.Preconditions;
14 import com.google.common.util.concurrent.ListenableFuture;
15 import java.util.List;
16 import java.util.Optional;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
19 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
20 import org.opendaylight.netconf.api.EffectiveOperation;
21 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
22 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
23 import org.opendaylight.netconf.topology.singleton.impl.netconf.ProxyNetconfService;
24 import org.opendaylight.netconf.topology.singleton.messages.netconf.NetconfDataTreeServiceRequest;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import scala.concurrent.ExecutionContext;
28 import scala.concurrent.Future;
30 public class ProxyNetconfDataTreeService implements NetconfDataTreeService {
31 private final Timeout askTimeout;
32 private final RemoteDeviceId id;
33 private final ActorRef masterNode;
34 private final ExecutionContext executionContext;
36 private volatile ProxyNetconfService proxyNetconfService;
39 * Constructor for {@code ProxyNetconfDataTreeService}.
42 * @param masterNode {@link org.opendaylight.netconf.topology.singleton.impl.actors.NetconfNodeActor} ref
43 * @param executionContext ExecutionContext
44 * @param askTimeout ask timeout
46 public ProxyNetconfDataTreeService(final RemoteDeviceId id, final ActorRef masterNode,
47 final ExecutionContext executionContext, final Timeout askTimeout) {
49 this.masterNode = masterNode;
50 this.executionContext = executionContext;
51 this.askTimeout = askTimeout;
55 public synchronized ListenableFuture<DOMRpcResult> lock() {
56 final Future<Object> masterActor = Patterns.ask(masterNode, new NetconfDataTreeServiceRequest(), askTimeout);
57 proxyNetconfService = new ProxyNetconfService(id, masterActor, executionContext, askTimeout);
58 return proxyNetconfService.lock();
62 public ListenableFuture<DOMRpcResult> unlock() {
64 return proxyNetconfService.unlock();
68 public ListenableFuture<DOMRpcResult> discardChanges() {
70 return proxyNetconfService.discardChanges();
74 public ListenableFuture<Optional<NormalizedNode>> get(final YangInstanceIdentifier path) {
75 final Future<Object> masterActor = Patterns.ask(masterNode, new NetconfDataTreeServiceRequest(), askTimeout);
76 ProxyNetconfService netconfService = new ProxyNetconfService(id, masterActor, executionContext, askTimeout);
77 return netconfService.get(path);
81 public ListenableFuture<Optional<NormalizedNode>> get(final YangInstanceIdentifier path,
82 final List<YangInstanceIdentifier> fields) {
83 final Future<Object> masterActor = Patterns.ask(masterNode, new NetconfDataTreeServiceRequest(), askTimeout);
84 ProxyNetconfService netconfService = new ProxyNetconfService(id, masterActor, executionContext, askTimeout);
85 return netconfService.get(path, fields);
89 public ListenableFuture<Optional<NormalizedNode>> getConfig(final YangInstanceIdentifier path) {
90 final Future<Object> masterActor = Patterns.ask(masterNode, new NetconfDataTreeServiceRequest(), askTimeout);
91 ProxyNetconfService netconfService = new ProxyNetconfService(id, masterActor, executionContext, askTimeout);
92 return netconfService.getConfig(path);
96 public ListenableFuture<Optional<NormalizedNode>> getConfig(final YangInstanceIdentifier path,
97 final List<YangInstanceIdentifier> fields) {
98 final Future<Object> masterActor = Patterns.ask(masterNode, new NetconfDataTreeServiceRequest(), askTimeout);
99 ProxyNetconfService netconfService = new ProxyNetconfService(id, masterActor, executionContext, askTimeout);
100 return netconfService.getConfig(path, fields);
104 public ListenableFuture<? extends DOMRpcResult> merge(final LogicalDatastoreType store,
105 final YangInstanceIdentifier path, final NormalizedNode data,
106 final Optional<EffectiveOperation> defaultOperation) {
108 return proxyNetconfService.merge(store, path, data, defaultOperation);
112 public ListenableFuture<? extends DOMRpcResult> replace(final LogicalDatastoreType store,
113 final YangInstanceIdentifier path, final NormalizedNode data,
114 final Optional<EffectiveOperation> defaultOperation) {
116 return proxyNetconfService.replace(store, path, data, defaultOperation);
120 public ListenableFuture<? extends DOMRpcResult> create(final LogicalDatastoreType store,
121 final YangInstanceIdentifier path, final NormalizedNode data,
122 final Optional<EffectiveOperation> defaultOperation) {
124 return proxyNetconfService.create(store, path, data, defaultOperation);
128 public ListenableFuture<? extends DOMRpcResult> delete(final LogicalDatastoreType store,
129 final YangInstanceIdentifier path) {
131 return proxyNetconfService.delete(store, path);
135 public ListenableFuture<? extends DOMRpcResult> remove(final LogicalDatastoreType store,
136 final YangInstanceIdentifier path) {
138 return proxyNetconfService.remove(store, path);
142 public ListenableFuture<? extends DOMRpcResult> commit() {
144 return proxyNetconfService.commit();
148 public @NonNull Object getDeviceId() {
152 private void isLocked() {
153 Preconditions.checkState(proxyNetconfService != null,
154 "%s: Device's datastore must be locked first", id);