X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceRpc.java;h=178b0502edbb9678a21adca7738679e7ff355f32;hb=d8d8f731bbe6c58fcbd0e616734e2e230aaf4ab4;hp=8d5b7aed2f4482b7730d764598e2fd56f44c25a1;hpb=605e93859db80e6d0858a26046ee446f9fb967d6;p=controller.git diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java index 8d5b7aed2f..178b0502ed 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceRpc.java @@ -8,69 +8,98 @@ package org.opendaylight.controller.sal.connect.netconf.sal; import com.google.common.base.Function; +import com.google.common.collect.Collections2; +import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; - -import java.util.Collections; -import java.util.Set; - +import com.google.common.util.concurrent.ListenableFuture; +import java.util.Collection; +import javax.annotation.Nonnull; import javax.annotation.Nullable; - +import org.opendaylight.controller.md.sal.dom.api.DOMRpcAvailabilityListener; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcIdentifier; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationNotAvailableException; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.sal.connect.api.MessageTransformer; import org.opendaylight.controller.sal.connect.api.RemoteDeviceCommunicator; -import org.opendaylight.controller.sal.core.api.RpcImplementation; -import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.opendaylight.yangtools.yang.data.api.CompositeNode; - -import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; /** * Invokes RPC by sending netconf message via listener. Also transforms result from NetconfMessage to CompositeNode. */ -public final class NetconfDeviceRpc implements RpcImplementation { +public final class NetconfDeviceRpc implements DOMRpcService { + + private static final Function RPC_TO_RPC_IDENTIFIER = new Function() { + @Override + public DOMRpcIdentifier apply(final RpcDefinition input) { + // TODO add support for routed rpcs ... is it necessary in this case ? + return DOMRpcIdentifier.create(input.getPath()); + } + }; + private final RemoteDeviceCommunicator listener; private final MessageTransformer transformer; + private final Collection availableRpcs; - public NetconfDeviceRpc(final RemoteDeviceCommunicator listener, final MessageTransformer transformer) { + public NetconfDeviceRpc(final SchemaContext schemaContext, final RemoteDeviceCommunicator listener, final MessageTransformer transformer) { this.listener = listener; this.transformer = transformer; - } - @Override - public Set getSupportedRpcs() { - // TODO is this correct ? - return Collections.emptySet(); + availableRpcs = Collections2.transform(schemaContext.getOperations(), RPC_TO_RPC_IDENTIFIER); } + @Nonnull @Override - public ListenableFuture> invokeRpc(final QName rpc, final CompositeNode input) { - final NetconfMessage message = transformRequest(rpc, input); - final ListenableFuture> delegateFutureWithPureResult = listener.sendRequest( - message, rpc); + public CheckedFuture invokeRpc(@Nonnull final SchemaPath type, @Nullable final NormalizedNode input) { + final NetconfMessage message = transformer.toRpcRequest(type, input); + final ListenableFuture> delegateFutureWithPureResult = listener.sendRequest(message, type.getLastComponent()); + final ListenableFuture transformed = Futures.transform(delegateFutureWithPureResult, new Function, DOMRpcResult>() { + @Override + public DOMRpcResult apply(final RpcResult input) { + if (input.isSuccessful()) { + return transformer.toRpcResult(input.getResult(), type); + } else { + // TODO check whether the listener sets errors properly + return new DefaultDOMRpcResult(input.getErrors()); + } + } + }); - return Futures.transform(delegateFutureWithPureResult, new Function, RpcResult>() { + return Futures.makeChecked(transformed, new Function() { + @Nullable @Override - public RpcResult apply(@Nullable final RpcResult input) { - return transformResult(input, rpc); + public DOMRpcException apply(@Nullable final Exception e) { + // FIXME what other possible exceptions are there ? + return new DOMRpcImplementationNotAvailableException(e, "Unable to invoke rpc %s", type); } }); } - private NetconfMessage transformRequest(final QName rpc, final CompositeNode input) { - return transformer.toRpcRequest(rpc, input); - } + @Nonnull + @Override + public ListenerRegistration registerRpcListener(@Nonnull final T listener) { - private RpcResult transformResult(final RpcResult netconfMessageRpcResult, - final QName rpc) { - if (netconfMessageRpcResult.isSuccessful()) { - return transformer.toRpcResult(netconfMessageRpcResult.getResult(), rpc); - } else { - return RpcResultBuilder. failed() - .withRpcErrors(netconfMessageRpcResult.getErrors()).build(); - } - } + listener.onRpcAvailable(availableRpcs); + return new ListenerRegistration() { + @Override + public void close() { + // NOOP, no rpcs appear and disappear in this implementation + } + + @Override + public T getInstance() { + return listener; + } + }; + } }