From 126f12f7a2f64d88060f6d55e3c738e5d891deed Mon Sep 17 00:00:00 2001 From: ajay_dp001 Date: Wed, 3 Jun 2020 09:57:28 +0530 Subject: [PATCH] Fix nested YANG 1.1 Action invocation Invocation of action fails if the action is defined as an augmentation. As it turns out the logic can be very much simplified by just cutting the last item from YangInstanceIdentifier, as that points to the parent (and hence context) of the action. JIRA: NETCONF-696 Change-Id: I7b03b2b1ebdd7bffbfab5291552c430700ff2850 Signed-off-by: ajay_dp001 Signed-off-by: Robert Varga --- .../impl/RestconfDataServiceImpl.java | 6 ++-- .../utils/RestconfInvokeOperationsUtil.java | 30 ++++--------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java index c6a9efbf09..e4c24dd844 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java @@ -253,7 +253,7 @@ public class RestconfDataServiceImpl implements RestconfDataService { public Response postData(final NormalizedNodeContext payload, final UriInfo uriInfo) { requireNonNull(payload); if (payload.getInstanceIdentifierContext().getSchemaNode() instanceof ActionDefinition) { - return invokeAction(payload, uriInfo); + return invokeAction(payload); } final QueryParams checkedParms = checkQueryParameters(uriInfo); @@ -356,11 +356,9 @@ public class RestconfDataServiceImpl implements RestconfDataService { * * @param payload * {@link NormalizedNodeContext} - the body of the operation - * @param uriInfo - * URI info * @return {@link NormalizedNodeContext} wrapped in {@link Response} */ - public Response invokeAction(final NormalizedNodeContext payload, final UriInfo uriInfo) { + public Response invokeAction(final NormalizedNodeContext payload) { final InstanceIdentifierContext context = payload.getInstanceIdentifierContext(); final DOMMountPoint mountPoint = context.getMountPoint(); final SchemaPath schemaPath = context.getSchemaNode().getPath(); diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/RestconfInvokeOperationsUtil.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/RestconfInvokeOperationsUtil.java index 8e1304ea5b..a5f684dd60 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/RestconfInvokeOperationsUtil.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/RestconfInvokeOperationsUtil.java @@ -8,8 +8,6 @@ package org.opendaylight.restconf.nb.rfc8040.rests.utils; import com.google.common.util.concurrent.ListenableFuture; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; import java.util.concurrent.CancellationException; import javax.ws.rs.core.Response.Status; @@ -26,7 +24,6 @@ import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; import org.opendaylight.restconf.nb.rfc8040.handlers.ActionServiceHandler; import org.opendaylight.restconf.nb.rfc8040.handlers.RpcServiceHandler; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -137,9 +134,7 @@ public final class RestconfInvokeOperationsUtil { if (!mountPointService.isPresent()) { throw new RestconfDocumentedException("DomAction service is missing."); } - - return prepareActionResult(mountPointService.get().invokeAction(schemaPath, - prepareDataTreeId(yangIId, schemaPath), data)); + return prepareActionResult(mountPointService.get().invokeAction(schemaPath, prepareDataTreeId(yangIId), data)); } /** @@ -154,9 +149,9 @@ public final class RestconfInvokeOperationsUtil { * @return {@link DOMActionResult} */ public static DOMActionResult invokeAction(final ContainerNode data, final SchemaPath schemaPath, - final ActionServiceHandler actionServiceHandler, final YangInstanceIdentifier yangIId) { - return prepareActionResult(actionServiceHandler.get().invokeAction(schemaPath, - prepareDataTreeId(yangIId, schemaPath), data)); + final ActionServiceHandler actionServiceHandler, final YangInstanceIdentifier yangIId) { + return prepareActionResult(actionServiceHandler.get().invokeAction(schemaPath, prepareDataTreeId(yangIId), + data)); } /** @@ -201,22 +196,9 @@ public final class RestconfInvokeOperationsUtil { * * @param yangIId * {@link YangInstanceIdentifier} - * @param schemaPath - * {@link SchemaPath} * @return {@link DOMDataTreeIdentifier} domDataTreeIdentifier */ - private static DOMDataTreeIdentifier prepareDataTreeId(final YangInstanceIdentifier yangIId, - final SchemaPath schemaPath) { - final List pathArg = new ArrayList<>(); - for (PathArgument path : yangIId.getPathArguments()) { - if (path.getNodeType().getLocalName().equals(schemaPath.getLastComponent().getLocalName())) { - break; - } - pathArg.add(path); - } - YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().append(pathArg).build(); - DOMDataTreeIdentifier domDataTreeIdentifier = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, - yangInstanceIdentifier); - return domDataTreeIdentifier; + private static DOMDataTreeIdentifier prepareDataTreeId(final YangInstanceIdentifier yangIId) { + return new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, yangIId.getParent()); } } -- 2.36.6