- return ret;
- }
-
- private RestconfFuture<InvokeOperation> dataInvokePOST(final InstanceIdentifierContext reqPath,
- final OperationInputBody body) {
- final var postPath = new OperationsPostPath(reqPath.databind(), reqPath.inference());
- final var yangIIdContext = reqPath.getInstanceIdentifier();
- final ContainerNode input;
- try {
- input = body.toContainerNode(postPath);
- } catch (IOException e) {
- LOG.debug("Error reading input", e);
- return RestconfFuture.failed(new RestconfDocumentedException("Error parsing input: " + e.getMessage(),
- ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE, e));
- }
-
- final var mountPoint = reqPath.getMountPoint();
- final var schemaPath = postPath.operation().toSchemaInferenceStack().toSchemaNodeIdentifier();
- final var future = mountPoint != null ? dataInvokePOST(input, schemaPath, yangIIdContext, mountPoint)
- : dataInvokePOST(input, schemaPath, yangIIdContext, actionService);
-
- return future.transform(result -> result.getOutput()
- .flatMap(output -> output.isEmpty() ? Optional.empty()
- : Optional.of(new InvokeOperation(new NormalizedNodePayload(reqPath.inference(), output))))
- .orElse(InvokeOperation.EMPTY));
- }
-
- /**
- * Invoke Action via ActionServiceHandler.
- *
- * @param data input data
- * @param yangIId invocation context
- * @param schemaPath schema path of data
- * @param actionService action service to invoke action
- * @return {@link DOMActionResult}
- */
- private static RestconfFuture<DOMActionResult> dataInvokePOST(final ContainerNode data, final Absolute schemaPath,
- final YangInstanceIdentifier yangIId, final DOMActionService actionService) {
- final var ret = new SettableRestconfFuture<DOMActionResult>();
-
- Futures.addCallback(actionService.invokeAction(schemaPath,
- new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, yangIId.getParent()), data),
- new FutureCallback<DOMActionResult>() {
- @Override
- public void onSuccess(final DOMActionResult result) {
- final var errors = result.getErrors();
- LOG.debug("InvokeAction Error Message {}", errors);
- if (errors.isEmpty()) {
- ret.set(result);
- } else {
- ret.setFailure(new RestconfDocumentedException("InvokeAction Error Message ", null, errors));
- }
- }
-
- @Override
- public void onFailure(final Throwable cause) {
- if (cause instanceof DOMActionException) {
- ret.set(new SimpleDOMActionResult(List.of(RpcResultBuilder.newError(
- ErrorType.RPC, ErrorTag.OPERATION_FAILED, cause.getMessage()))));
- } else if (cause instanceof RestconfDocumentedException e) {
- ret.setFailure(e);
- } else if (cause instanceof CancellationException) {
- ret.setFailure(new RestconfDocumentedException("Action cancelled while executing",
- ErrorType.RPC, ErrorTag.PARTIAL_OPERATION, cause));
- } else {
- ret.setFailure(new RestconfDocumentedException("Invocation failed", cause));
- }
- }
- }, MoreExecutors.directExecutor());
-
- return ret;
- }
-
- /**
- * Invoking Action via mount point.
- *
- * @param mountPoint mount point
- * @param data input data
- * @param schemaPath schema path of data
- * @return {@link DOMActionResult}
- */
- private static RestconfFuture<DOMActionResult> dataInvokePOST(final ContainerNode data, final Absolute schemaPath,
- final YangInstanceIdentifier yangIId, final DOMMountPoint mountPoint) {
- final var actionService = mountPoint.getService(DOMActionService.class);
- return actionService.isPresent() ? dataInvokePOST(data, schemaPath, yangIId, actionService.orElseThrow())
- : RestconfFuture.failed(new RestconfDocumentedException("DOMActionService is missing."));