X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Fconnect%2Fnetconf%2Futil%2FNetconfBaseOps.java;h=8994b7f4421a89c84060d848b8d65a6e74007ee5;hb=f402dcd49a468e018192c96151bef3a0cdf70d62;hp=3362f0607fd1ef1df21ea61c74f1d0e9cda868ba;hpb=a1be400609994146d8a2b23ec3b3b89e59619ea3;p=netconf.git diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfBaseOps.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfBaseOps.java index 3362f0607f..8994b7f442 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfBaseOps.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfBaseOps.java @@ -5,241 +5,328 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.sal.connect.netconf.util; +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.COMMIT_RPC_CONTENT; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.EDIT_CONTENT_NODEID; import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_CANDIDATE_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_DEFAULT_OPERATION_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_DISCARD_CHANGES_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_EDIT_CONFIG_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_ERROR_OPTION_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_CONFIG_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_LOCK_QNAME; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_COMMIT_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_DEFAULT_OPERATION_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_DISCARD_CHANGES_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_EDIT_CONFIG_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_EDIT_CONFIG_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_ERROR_OPTION_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_CONFIG_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_CONFIG_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_LOCK_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_LOCK_PATH; import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_RUNNING_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_SOURCE_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_TARGET_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_UNLOCK_QNAME; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_VALIDATE_QNAME; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_SOURCE_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_TARGET_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_UNLOCK_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_UNLOCK_PATH; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_VALIDATE_NODEID; +import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_VALIDATE_PATH; import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.ROLLBACK_ON_ERROR_OPTION; import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toFilterStructure; import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toId; -import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toPath; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import com.google.common.util.concurrent.MoreExecutors; +import java.util.Locale; +import java.util.Optional; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.netconf.api.ModifyAction; +import org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade.KeepaliveDOMRpcService; +import org.opendaylight.netconf.sal.connect.netconf.sal.SchemalessNetconfDeviceRpc; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.copy.config.input.target.ConfigTarget; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.get.config.input.source.ConfigSource; +import org.opendaylight.yangtools.rcf8528.data.util.EmptyMountPointContext; +import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; /** * Provides base operations for netconf e.g. get, get-config, edit-config, (un)lock, commit etc. * According to RFC-6241 */ public final class NetconfBaseOps { + private static final NodeIdentifier CONFIG_SOURCE_NODEID = NodeIdentifier.create(ConfigSource.QNAME); + private static final NodeIdentifier CONFIG_TARGET_NODEID = NodeIdentifier.create(ConfigTarget.QNAME); private final DOMRpcService rpc; - private final SchemaContext schemaContext; + private final MountPointContext mountContext; + private final RpcStructureTransformer transformer; + + @Deprecated + public NetconfBaseOps(final DOMRpcService rpc, final EffectiveModelContext schemaContext) { + this(rpc, new EmptyMountPointContext(schemaContext)); + } - public NetconfBaseOps(final DOMRpcService rpc, final SchemaContext schemaContext) { + public NetconfBaseOps(final DOMRpcService rpc, final MountPointContext mountContext) { this.rpc = rpc; - this.schemaContext = schemaContext; + this.mountContext = mountContext; + + if (rpc instanceof KeepaliveDOMRpcService + && ((KeepaliveDOMRpcService) rpc).getDeviceRpc() instanceof SchemalessNetconfDeviceRpc) { + this.transformer = new SchemalessRpcStructureTransformer(); + } else { + this.transformer = new NetconfRpcStructureTransformer(mountContext); + } } - public ListenableFuture lock(final FutureCallback callback, final QName datastore) { - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(datastore); + public ListenableFuture lock(final FutureCallback callback, + final QName datastore) { + requireNonNull(callback); + requireNonNull(datastore); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(datastore)); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_LOCK_PATH, + getLockContent(datastore)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture lockCandidate(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_CANDIDATE_QNAME)); - Futures.addCallback(future, callback); + public ListenableFuture lockCandidate(final FutureCallback callback) { + final ListenableFuture future = rpc.invokeRpc(NETCONF_LOCK_PATH, + getLockContent(NETCONF_CANDIDATE_QNAME)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - - public ListenableFuture lockRunning(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_RUNNING_QNAME)); - Futures.addCallback(future, callback); + public ListenableFuture lockRunning(final FutureCallback callback) { + final ListenableFuture future = rpc.invokeRpc(NETCONF_LOCK_PATH, + getLockContent(NETCONF_RUNNING_QNAME)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture unlock(final FutureCallback callback, final QName datastore) { - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(datastore); + public ListenableFuture unlock(final FutureCallback callback, + final QName datastore) { + requireNonNull(callback); + requireNonNull(datastore); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(datastore)); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_UNLOCK_PATH, + getUnLockContent(datastore)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture unlockRunning(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_RUNNING_QNAME)); - Futures.addCallback(future, callback); + public ListenableFuture unlockRunning(final FutureCallback callback) { + final ListenableFuture future = rpc.invokeRpc(NETCONF_UNLOCK_PATH, + getUnLockContent(NETCONF_RUNNING_QNAME)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture unlockCandidate(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_CANDIDATE_QNAME)); - Futures.addCallback(future, callback); + public ListenableFuture unlockCandidate(final FutureCallback callback) { + final ListenableFuture future = rpc.invokeRpc(NETCONF_UNLOCK_PATH, + getUnLockContent(NETCONF_CANDIDATE_QNAME)); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture discardChanges(final FutureCallback callback) { - Preconditions.checkNotNull(callback); + public ListenableFuture discardChanges(final FutureCallback callback) { + requireNonNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_DISCARD_CHANGES_QNAME), null); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_DISCARD_CHANGES_PATH, null); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture commit(final FutureCallback callback) { - Preconditions.checkNotNull(callback); + public ListenableFuture commit(final FutureCallback callback) { + requireNonNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_COMMIT_QNAME), NetconfMessageTransformUtil.COMMIT_RPC_CONTENT); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_COMMIT_PATH, COMMIT_RPC_CONTENT); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture validate(final FutureCallback callback, final QName datastore) { - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(datastore); + public ListenableFuture validate(final FutureCallback callback, + final QName datastore) { + requireNonNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_VALIDATE_QNAME), getValidateContent(datastore)); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_VALIDATE_PATH, + getValidateContent(requireNonNull(datastore))); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture validateCandidate(final FutureCallback callback) { + public ListenableFuture validateCandidate(final FutureCallback callback) { return validate(callback, NETCONF_CANDIDATE_QNAME); } - - public ListenableFuture validateRunning(final FutureCallback callback) { + public ListenableFuture validateRunning(final FutureCallback callback) { return validate(callback, NETCONF_RUNNING_QNAME); } - public ListenableFuture copyConfig(final FutureCallback callback, final QName source, final QName target) { - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(source); - Preconditions.checkNotNull(target); + public ListenableFuture copyConfig(final FutureCallback callback, + final QName source, final QName target) { + requireNonNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_QNAME), getCopyConfigContent(source, target)); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_COPY_CONFIG_PATH, + getCopyConfigContent(requireNonNull(source), requireNonNull(target))); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture copyRunningToCandidate(final FutureCallback callback) { + public ListenableFuture copyRunningToCandidate( + final FutureCallback callback) { return copyConfig(callback, NETCONF_RUNNING_QNAME, NETCONF_CANDIDATE_QNAME); } - public ListenableFuture getConfig(final FutureCallback callback, final QName datastore, final Optional filterPath) { - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(datastore); + public ListenableFuture getConfig(final FutureCallback callback, + final QName datastore, + final Optional filterPath) { + requireNonNull(callback); + requireNonNull(datastore); - final ListenableFuture future; + final ListenableFuture future; if (isFilterPresent(filterPath)) { - final DataContainerChild node = toFilterStructure(filterPath.get(), schemaContext); - future = rpc.invokeRpc(toPath(NETCONF_GET_CONFIG_QNAME), - NetconfMessageTransformUtil.wrap(NETCONF_GET_CONFIG_QNAME, getSourceNode(datastore), node)); + final DataContainerChild node = transformer.toFilterStructure(filterPath.get()); + future = rpc.invokeRpc(NETCONF_GET_CONFIG_PATH, + NetconfMessageTransformUtil.wrap(NETCONF_GET_CONFIG_NODEID, getSourceNode(datastore), node)); } else { - future = rpc.invokeRpc(toPath(NETCONF_GET_CONFIG_QNAME), - NetconfMessageTransformUtil.wrap(NETCONF_GET_CONFIG_QNAME, getSourceNode(datastore))); + future = rpc.invokeRpc(NETCONF_GET_CONFIG_PATH, + NetconfMessageTransformUtil.wrap(NETCONF_GET_CONFIG_NODEID, getSourceNode(datastore))); } - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public ListenableFuture getConfigRunning(final FutureCallback callback, final Optional filterPath) { - return getConfig(callback, NETCONF_RUNNING_QNAME, filterPath); + public ListenableFuture>> getConfigRunningData( + final FutureCallback callback, final Optional filterPath) { + return extractData(filterPath, getConfigRunning(callback, filterPath)); } - public ListenableFuture getConfigCandidate(final FutureCallback callback, final Optional filterPath) { - return getConfig(callback, NETCONF_CANDIDATE_QNAME, filterPath); + public ListenableFuture>> getData(final FutureCallback callback, + final Optional filterPath) { + return extractData(filterPath, get(callback, filterPath)); + } + + private ListenableFuture>> extractData( + final Optional path, final ListenableFuture configRunning) { + return Futures.transform(configRunning, result -> { + checkArgument(result.getErrors().isEmpty(), "Unable to read data: %s, errors: %s", path, + result.getErrors()); + final DataContainerChild dataNode = ((ContainerNode) result.getResult()) + .getChild(NetconfMessageTransformUtil.NETCONF_DATA_NODEID).get(); + return transformer.selectFromDataStructure(dataNode, path.get()); + }, MoreExecutors.directExecutor()); } - public ListenableFuture get(final FutureCallback callback, final Optional filterPath) { - Preconditions.checkNotNull(callback); + public ListenableFuture getConfigRunning(final FutureCallback callback, + final Optional filterPath) { + return getConfig(callback, NETCONF_RUNNING_QNAME, filterPath); + } - final ListenableFuture future; + public ListenableFuture getConfigCandidate(final FutureCallback callback, + final Optional filterPath) { + return getConfig(callback, NETCONF_CANDIDATE_QNAME, filterPath); + } - future = isFilterPresent(filterPath) ? - rpc.invokeRpc(toPath(NETCONF_GET_QNAME), NetconfMessageTransformUtil.wrap(NETCONF_GET_QNAME, toFilterStructure(filterPath.get(), schemaContext))) : - rpc.invokeRpc(toPath(NETCONF_GET_QNAME), NetconfMessageTransformUtil.GET_RPC_CONTENT); + public ListenableFuture get(final FutureCallback callback, + final Optional filterPath) { + requireNonNull(callback); - Futures.addCallback(future, callback); + final ListenableFuture future = rpc.invokeRpc(NETCONF_GET_PATH, + isFilterPresent(filterPath) + ? NetconfMessageTransformUtil.wrap(NETCONF_GET_NODEID, + toFilterStructure(filterPath.get(), mountContext.getSchemaContext())) + : NetconfMessageTransformUtil.GET_RPC_CONTENT); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - private boolean isFilterPresent(final Optional filterPath) { + private static boolean isFilterPresent(final Optional filterPath) { return filterPath.isPresent() && !filterPath.get().isEmpty(); } - public ListenableFuture editConfigCandidate(final FutureCallback callback, final DataContainerChild editStructure, final ModifyAction modifyAction, final boolean rollback) { + public ListenableFuture editConfigCandidate( + final FutureCallback callback, final DataContainerChild editStructure, + final ModifyAction modifyAction, final boolean rollback) { return editConfig(callback, NETCONF_CANDIDATE_QNAME, editStructure, Optional.of(modifyAction), rollback); } - public ListenableFuture editConfigCandidate(final FutureCallback callback, final DataContainerChild editStructure, final boolean rollback) { - return editConfig(callback, NETCONF_CANDIDATE_QNAME, editStructure, Optional.absent(), rollback); + public ListenableFuture editConfigCandidate( + final FutureCallback callback, final DataContainerChild editStructure, + final boolean rollback) { + return editConfig(callback, NETCONF_CANDIDATE_QNAME, editStructure, Optional.empty(), rollback); } - public ListenableFuture editConfigRunning(final FutureCallback callback, final DataContainerChild editStructure, final ModifyAction modifyAction, final boolean rollback) { + public ListenableFuture editConfigRunning( + final FutureCallback callback, final DataContainerChild editStructure, + final ModifyAction modifyAction, final boolean rollback) { return editConfig(callback, NETCONF_RUNNING_QNAME, editStructure, Optional.of(modifyAction), rollback); } - public ListenableFuture editConfigRunning(final FutureCallback callback, final DataContainerChild editStructure, final boolean rollback) { - return editConfig(callback, NETCONF_RUNNING_QNAME, editStructure, Optional.absent(), rollback); + public ListenableFuture editConfigRunning( + final FutureCallback callback, final DataContainerChild editStructure, + final boolean rollback) { + return editConfig(callback, NETCONF_RUNNING_QNAME, editStructure, Optional.empty(), rollback); } - public ListenableFuture editConfig(final FutureCallback callback, final QName datastore, final DataContainerChild editStructure, final Optional modifyAction, final boolean rollback) { - Preconditions.checkNotNull(editStructure); - Preconditions.checkNotNull(callback); - Preconditions.checkNotNull(datastore); + public ListenableFuture editConfig( + final FutureCallback callback, final QName datastore, + final DataContainerChild editStructure, final Optional modifyAction, + final boolean rollback) { + requireNonNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_EDIT_CONFIG_QNAME), getEditConfigContent(datastore, editStructure, modifyAction, rollback)); + final ListenableFuture future = rpc.invokeRpc(NETCONF_EDIT_CONFIG_PATH, + getEditConfigContent(requireNonNull(datastore), requireNonNull(editStructure), modifyAction, rollback)); - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); return future; } - public DataContainerChild createEditConfigStrcture(final Optional> lastChild, final Optional operation, final YangInstanceIdentifier dataPath) { - return NetconfMessageTransformUtil.createEditConfigStructure(schemaContext, dataPath, operation, lastChild); + public ChoiceNode createEditConfigStrcture(final Optional> lastChild, + final Optional operation, + final YangInstanceIdentifier dataPath) { + return Builders.choiceBuilder() + .withNodeIdentifier(EDIT_CONTENT_NODEID) + .withChild(transformer.createEditConfigStructure(lastChild, dataPath, operation)) + .build(); } - private ContainerNode getEditConfigContent(final QName datastore, final DataContainerChild editStructure, final Optional defaultOperation, final boolean rollback) { - final DataContainerNodeAttrBuilder editBuilder = Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_EDIT_CONFIG_QNAME)); + private static ContainerNode getEditConfigContent( + final QName datastore, final DataContainerChild editStructure, + final Optional defaultOperation, final boolean rollback) { + final DataContainerNodeBuilder editBuilder = + Builders.containerBuilder().withNodeIdentifier(NETCONF_EDIT_CONFIG_NODEID); // Target editBuilder.withChild(getTargetNode(datastore)); // Default operation - if(defaultOperation.isPresent()) { - final String opString = defaultOperation.get().name().toLowerCase(); - editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(toId(NETCONF_DEFAULT_OPERATION_QNAME)).withValue(opString).build()); + if (defaultOperation.isPresent()) { + final String opString = defaultOperation.get().name().toLowerCase(Locale.ROOT); + editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(NETCONF_DEFAULT_OPERATION_NODEID) + .withValue(opString).build()); } // Error option - if(rollback) { - editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(toId(NETCONF_ERROR_OPTION_QNAME)).withValue(ROLLBACK_ON_ERROR_OPTION).build()); + if (rollback) { + editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(NETCONF_ERROR_OPTION_NODEID) + .withValue(ROLLBACK_ON_ERROR_OPTION).build()); } // Edit content @@ -247,39 +334,40 @@ public final class NetconfBaseOps { return editBuilder.build(); } - public static DataContainerChild getSourceNode(final QName datastore) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_SOURCE_QNAME)) - .withChild( - Builders.choiceBuilder().withNodeIdentifier(toId(ConfigSource.QNAME)).withChild( - Builders.leafBuilder().withNodeIdentifier(toId(datastore)).build()).build() - ).build(); + public static ContainerNode getSourceNode(final QName datastore) { + return Builders.containerBuilder() + .withNodeIdentifier(NETCONF_SOURCE_NODEID) + .withChild(Builders.choiceBuilder() + .withNodeIdentifier(CONFIG_SOURCE_NODEID) + .withChild(ImmutableNodes.leafNode(datastore, Empty.getInstance())) + .build()) + .build(); } public static ContainerNode getLockContent(final QName datastore) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_LOCK_QNAME)) + return Builders.containerBuilder().withNodeIdentifier(NETCONF_LOCK_NODEID) .withChild(getTargetNode(datastore)).build(); } - public static DataContainerChild getTargetNode(final QName datastore) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_TARGET_QNAME)) - .withChild( - Builders.choiceBuilder().withNodeIdentifier(toId(ConfigTarget.QNAME)).withChild( - Builders.leafBuilder().withNodeIdentifier(toId(datastore)).build()).build() - ).build(); + public static ContainerNode getTargetNode(final QName datastore) { + return Builders.containerBuilder().withNodeIdentifier(NETCONF_TARGET_NODEID) + .withChild(Builders.choiceBuilder().withNodeIdentifier(CONFIG_TARGET_NODEID).withChild( + Builders.leafBuilder().withNodeIdentifier(toId(datastore)).withValue(Empty.getInstance()).build()) + .build()).build(); } - public static NormalizedNode getCopyConfigContent(final QName source, final QName target) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_COPY_CONFIG_QNAME)) + public static ContainerNode getCopyConfigContent(final QName source, final QName target) { + return Builders.containerBuilder().withNodeIdentifier(NETCONF_COPY_CONFIG_NODEID) .withChild(getTargetNode(target)).withChild(getSourceNode(source)).build(); } - public static NormalizedNode getValidateContent(final QName source) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_VALIDATE_QNAME)) + public static ContainerNode getValidateContent(final QName source) { + return Builders.containerBuilder().withNodeIdentifier(NETCONF_VALIDATE_NODEID) .withChild(getSourceNode(source)).build(); } - public static NormalizedNode getUnLockContent(final QName datastore) { - return Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_UNLOCK_QNAME)) + public static ContainerNode getUnLockContent(final QName datastore) { + return Builders.containerBuilder().withNodeIdentifier(NETCONF_UNLOCK_NODEID) .withChild(getTargetNode(datastore)).build(); }