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=d12a97c8bd4979d7a2f87942f39d5e54d7d11d20;hb=476cc2164a06b77e7dd38859e0124d82cd2c8847;hp=3362f0607fd1ef1df21ea61c74f1d0e9cda868ba;hpb=16370f180a29150f08bb69b29f830b3784d934b5;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..d12a97c8bd 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 @@ -27,6 +27,7 @@ import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTr 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.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; @@ -34,11 +35,14 @@ 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 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.edit.config.input.EditContent; 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.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.schema.AnyXmlNode; 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; @@ -54,30 +58,39 @@ public final class NetconfBaseOps { private final DOMRpcService rpc; private final SchemaContext schemaContext; + private final RpcStructureTransformer transformer; public NetconfBaseOps(final DOMRpcService rpc, final SchemaContext schemaContext) { this.rpc = rpc; this.schemaContext = schemaContext; + if (rpc instanceof SchemalessNetconfDeviceRpc) { + this.transformer = new SchemalessRpcStructureTransformer(); + } else { + this.transformer = new NetconfRpcStructureTransformer(schemaContext); + } } public ListenableFuture lock(final FutureCallback callback, final QName datastore) { Preconditions.checkNotNull(callback); Preconditions.checkNotNull(datastore); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(datastore)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(datastore)); Futures.addCallback(future, callback); return future; } public ListenableFuture lockCandidate(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_CANDIDATE_QNAME)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_CANDIDATE_QNAME)); Futures.addCallback(future, callback); return future; } public ListenableFuture lockRunning(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_RUNNING_QNAME)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_LOCK_QNAME), getLockContent(NETCONF_RUNNING_QNAME)); Futures.addCallback(future, callback); return future; } @@ -86,19 +99,22 @@ public final class NetconfBaseOps { Preconditions.checkNotNull(callback); Preconditions.checkNotNull(datastore); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(datastore)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(datastore)); Futures.addCallback(future, callback); return future; } public ListenableFuture unlockRunning(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_RUNNING_QNAME)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_RUNNING_QNAME)); Futures.addCallback(future, callback); return future; } public ListenableFuture unlockCandidate(final FutureCallback callback) { - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_CANDIDATE_QNAME)); + final ListenableFuture future = + rpc.invokeRpc(toPath(NETCONF_UNLOCK_QNAME), getUnLockContent(NETCONF_CANDIDATE_QNAME)); Futures.addCallback(future, callback); return future; } @@ -114,7 +130,8 @@ public final class NetconfBaseOps { public ListenableFuture commit(final FutureCallback callback) { Preconditions.checkNotNull(callback); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_COMMIT_QNAME), NetconfMessageTransformUtil.COMMIT_RPC_CONTENT); + final ListenableFuture future = rpc.invokeRpc( + toPath(NetconfMessageTransformUtil.NETCONF_COMMIT_QNAME), NetconfMessageTransformUtil.COMMIT_RPC_CONTENT); Futures.addCallback(future, callback); return future; } @@ -123,7 +140,8 @@ public final class NetconfBaseOps { Preconditions.checkNotNull(callback); Preconditions.checkNotNull(datastore); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_VALIDATE_QNAME), getValidateContent(datastore)); + final ListenableFuture future = rpc.invokeRpc( + toPath(NetconfMessageTransformUtil.NETCONF_VALIDATE_QNAME), getValidateContent(datastore)); Futures.addCallback(future, callback); return future; } @@ -137,12 +155,14 @@ public final class NetconfBaseOps { return validate(callback, NETCONF_RUNNING_QNAME); } - public ListenableFuture copyConfig(final FutureCallback callback, final QName source, final QName target) { + public ListenableFuture copyConfig(final FutureCallback callback, + final QName source, final QName target) { Preconditions.checkNotNull(callback); Preconditions.checkNotNull(source); Preconditions.checkNotNull(target); - final ListenableFuture future = rpc.invokeRpc(toPath(NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_QNAME), getCopyConfigContent(source, target)); + final ListenableFuture future = rpc.invokeRpc( + toPath(NetconfMessageTransformUtil.NETCONF_COPY_CONFIG_QNAME), getCopyConfigContent(source, target)); Futures.addCallback(future, callback); return future; } @@ -151,13 +171,14 @@ public final class NetconfBaseOps { return copyConfig(callback, NETCONF_RUNNING_QNAME, NETCONF_CANDIDATE_QNAME); } - public ListenableFuture getConfig(final FutureCallback callback, final QName datastore, final Optional filterPath) { + public ListenableFuture getConfig(final FutureCallback callback, final QName datastore, + final Optional filterPath) { Preconditions.checkNotNull(callback); Preconditions.checkNotNull(datastore); final ListenableFuture future; if (isFilterPresent(filterPath)) { - final DataContainerChild node = toFilterStructure(filterPath.get(), schemaContext); + final DataContainerChild node = transformer.toFilterStructure(filterPath.get()); future = rpc.invokeRpc(toPath(NETCONF_GET_CONFIG_QNAME), NetconfMessageTransformUtil.wrap(NETCONF_GET_CONFIG_QNAME, getSourceNode(datastore), node)); } else { @@ -169,77 +190,125 @@ public final class NetconfBaseOps { return future; } - public ListenableFuture getConfigRunning(final FutureCallback callback, final Optional filterPath) { + public ListenableFuture>> getConfigRunningData( + final FutureCallback callback, final Optional filterPath) { + final ListenableFuture configRunning = getConfigRunning(callback, filterPath); + return extractData(filterPath, configRunning); + } + + public ListenableFuture>> getData(final FutureCallback callback, + final Optional filterPath) { + final ListenableFuture configRunning = get(callback, filterPath); + return extractData(filterPath, configRunning); + } + + private ListenableFuture>> extractData( + final Optional path, final ListenableFuture configRunning) { + return Futures.transform(configRunning, (Function>>) result -> { + Preconditions.checkArgument( + result.getErrors().isEmpty(), "Unable to read data: %s, errors: %s", path, result.getErrors()); + final DataContainerChild dataNode = + ((ContainerNode) result.getResult()).getChild( + NetconfMessageTransformUtil.toId(NetconfMessageTransformUtil.NETCONF_DATA_QNAME)).get(); + return transformer.selectFromDataStructure(dataNode, path.get()); + }); + } + + public ListenableFuture getConfigRunning(final FutureCallback callback, + final Optional filterPath) { return getConfig(callback, NETCONF_RUNNING_QNAME, filterPath); } - public ListenableFuture getConfigCandidate(final FutureCallback callback, final Optional filterPath) { + public ListenableFuture getConfigCandidate(final FutureCallback callback, + final Optional filterPath) { return getConfig(callback, NETCONF_CANDIDATE_QNAME, filterPath); } - public ListenableFuture get(final FutureCallback callback, final Optional filterPath) { + public ListenableFuture get(final FutureCallback callback, + final Optional filterPath) { Preconditions.checkNotNull(callback); final ListenableFuture future; - 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); + 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); Futures.addCallback(future, callback); 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) { + public ListenableFuture editConfigCandidate(final FutureCallback callback, + final DataContainerChild editStructure, + final boolean rollback) { return editConfig(callback, NETCONF_CANDIDATE_QNAME, editStructure, Optional.absent(), 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) { + public ListenableFuture editConfigRunning(final FutureCallback callback, + final DataContainerChild editStructure, + final boolean rollback) { return editConfig(callback, NETCONF_RUNNING_QNAME, editStructure, Optional.absent(), rollback); } - public ListenableFuture editConfig(final FutureCallback callback, final QName datastore, final DataContainerChild editStructure, final Optional modifyAction, final boolean 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); - final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_EDIT_CONFIG_QNAME), getEditConfigContent(datastore, editStructure, modifyAction, rollback)); + final ListenableFuture future = rpc.invokeRpc(toPath(NETCONF_EDIT_CONFIG_QNAME), + getEditConfigContent(datastore, editStructure, modifyAction, rollback)); Futures.addCallback(future, callback); return future; } - public DataContainerChild createEditConfigStrcture(final Optional> lastChild, final Optional operation, final YangInstanceIdentifier dataPath) { - return NetconfMessageTransformUtil.createEditConfigStructure(schemaContext, dataPath, operation, lastChild); + public DataContainerChild createEditConfigStrcture(final Optional> lastChild, + final Optional operation, + final YangInstanceIdentifier dataPath) { + final AnyXmlNode configContent = transformer.createEditConfigStructure(lastChild, dataPath, operation); + return Builders.choiceBuilder().withNodeIdentifier(toId(EditContent.QNAME)).withChild(configContent).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 DataContainerNodeAttrBuilder editBuilder = + Builders.containerBuilder().withNodeIdentifier(toId(NETCONF_EDIT_CONFIG_QNAME)); // Target editBuilder.withChild(getTargetNode(datastore)); // Default operation - if(defaultOperation.isPresent()) { + if (defaultOperation.isPresent()) { final String opString = defaultOperation.get().name().toLowerCase(); - editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(toId(NETCONF_DEFAULT_OPERATION_QNAME)).withValue(opString).build()); + editBuilder.withChild(Builders.leafBuilder().withNodeIdentifier(toId(NETCONF_DEFAULT_OPERATION_QNAME)) + .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(toId(NETCONF_ERROR_OPTION_QNAME)) + .withValue(ROLLBACK_ON_ERROR_OPTION).build()); } // Edit content