2 * Copyright (c) 2014 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.client.mdsal.spi;
10 import static com.google.common.base.Preconditions.checkArgument;
12 import com.google.common.collect.ClassToInstanceMap;
13 import com.google.common.collect.ImmutableClassToInstanceMap;
14 import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
15 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
16 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
17 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
18 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
19 import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
20 import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker;
21 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
22 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
23 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices.Rpcs;
24 import org.opendaylight.netconf.client.mdsal.impl.NetconfBaseOps;
25 import org.opendaylight.netconf.dom.api.tx.NetconfDOMDataBrokerFieldsExtension;
26 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadTransaction;
27 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadWriteTransaction;
28 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsTransactionChain;
29 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
31 public final class NetconfDeviceDataBroker implements PingPongMergingDOMDataBroker {
32 private final NetconfDOMDataBrokerFieldsExtension fieldsExtension = new NetconfDOMDataBrokerFieldsExtensionImpl();
33 private final RemoteDeviceId id;
34 private final NetconfBaseOps netconfOps;
35 private final boolean rollbackSupport;
36 private final boolean candidateSupported;
37 private final boolean runningWritable;
38 private final boolean lockDatastore;
40 public NetconfDeviceDataBroker(final RemoteDeviceId id, final MountPointContext mountContext, final Rpcs rpcs,
41 final NetconfSessionPreferences netconfSessionPreferences, final boolean lockDatastore) {
43 netconfOps = new NetconfBaseOps(rpcs, mountContext);
44 // get specific attributes from netconf preferences and get rid of it
45 // no need to keep the entire preferences object, its quite big with all the capability QNames
46 candidateSupported = netconfSessionPreferences.isCandidateSupported();
47 runningWritable = netconfSessionPreferences.isRunningWritable();
48 rollbackSupport = netconfSessionPreferences.isRollbackSupported();
49 checkArgument(candidateSupported || runningWritable,
50 "Device %s has advertised neither :writable-running nor :candidate capability. At least one of these "
51 + "should be advertised. Failed to establish a session.", id.name());
52 this.lockDatastore = lockDatastore;
56 public DOMDataTreeReadTransaction newReadOnlyTransaction() {
57 return new ReadOnlyTx(netconfOps, id);
61 public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
62 return new ReadWriteTx<>(newReadOnlyTransaction(), newWriteOnlyTransaction());
66 public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
67 final AbstractWriteTx ret;
68 if (candidateSupported) {
69 ret = runningWritable ? new WriteCandidateRunningTx(id, netconfOps, rollbackSupport, lockDatastore)
70 : new WriteCandidateTx(id, netconfOps, rollbackSupport, lockDatastore);
72 ret = new WriteRunningTx(id, netconfOps, rollbackSupport, lockDatastore);
79 public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) {
80 return new TxChain(this, listener);
84 public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
85 return ImmutableClassToInstanceMap.of(NetconfDOMDataBrokerFieldsExtension.class, fieldsExtension);
88 private final class NetconfDOMDataBrokerFieldsExtensionImpl implements NetconfDOMDataBrokerFieldsExtension {
90 public NetconfDOMFieldsReadTransaction newReadOnlyTransaction() {
91 return new FieldsAwareReadOnlyTx(netconfOps, id);
95 public NetconfDOMFieldsReadWriteTransaction newReadWriteTransaction() {
96 return new FieldsAwareReadWriteTx(newReadOnlyTransaction(), newWriteOnlyTransaction());
100 public NetconfDOMFieldsTransactionChain createTransactionChain(final DOMTransactionChainListener listener) {
101 return new FieldsAwareTxChain(NetconfDeviceDataBroker.this, listener, this);