From 391ba73ea1d3938294b1246616a2c47b6e3b89be Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 6 Apr 2024 03:42:27 +0200 Subject: [PATCH] Propagate query parameters to YANG dataPATCH() We should be honoring odl-pretty-print query parameter, this takes the first step towards that. JIRA: NETCONF-773 Change-Id: Id5a1d3445ef632f00d8d33539f76c8e5d420561c Signed-off-by: Robert Varga --- .../restconf/nb/jaxrs/JaxRsRestconf.java | 22 ++++++++++++------- .../rests/transactions/RestconfStrategy.java | 3 ++- .../restconf/server/api/RestconfServer.java | 7 ++++-- .../server/mdsal/MdsalRestconfServer.java | 10 +++++---- .../nb/jaxrs/RestconfDataPatchTest.java | 11 +++++++--- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java index 670ffcf00b..ac8bf7459a 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java @@ -308,6 +308,7 @@ public final class JaxRsRestconf implements ParamConverterProvider { * RFC8072, section 2. * * @param body YANG Patch body + * @param uriInfo URI info * @param ar {@link AsyncResponse} which needs to be completed with a {@link PatchStatusContext} */ @PATCH @@ -317,9 +318,10 @@ public final class JaxRsRestconf implements ParamConverterProvider { MediaTypes.APPLICATION_YANG_DATA_JSON, MediaTypes.APPLICATION_YANG_DATA_XML }) - public void dataYangJsonPATCH(final InputStream body, @Suspended final AsyncResponse ar) { + public void dataYangJsonPATCH(final InputStream body, @Context final UriInfo uriInfo, + @Suspended final AsyncResponse ar) { try (var jsonBody = new JsonPatchBody(body)) { - completeDataYangPATCH(server.dataPATCH(jsonBody), ar); + completeDataYangPATCH(server.dataPATCH(QueryParams.normalize(uriInfo), jsonBody), ar); } } @@ -329,6 +331,7 @@ public final class JaxRsRestconf implements ParamConverterProvider { * * @param identifier path to target * @param body YANG Patch body + * @param uriInfo URI info * @param ar {@link AsyncResponse} which needs to be completed with a {@link PatchStatusContext} */ @PATCH @@ -339,9 +342,9 @@ public final class JaxRsRestconf implements ParamConverterProvider { MediaTypes.APPLICATION_YANG_DATA_XML }) public void dataYangJsonPATCH(@Encoded @PathParam("identifier") final ApiPath identifier, final InputStream body, - @Suspended final AsyncResponse ar) { + @Context final UriInfo uriInfo, @Suspended final AsyncResponse ar) { try (var jsonBody = new JsonPatchBody(body)) { - completeDataYangPATCH(server.dataPATCH(identifier, jsonBody), ar); + completeDataYangPATCH(server.dataPATCH(identifier, QueryParams.normalize(uriInfo), jsonBody), ar); } } @@ -350,6 +353,7 @@ public final class JaxRsRestconf implements ParamConverterProvider { * RFC8072, section 2. * * @param body YANG Patch body + * @param uriInfo URI info * @param ar {@link AsyncResponse} which needs to be completed with a {@link PatchStatusContext} */ @PATCH @@ -359,9 +363,10 @@ public final class JaxRsRestconf implements ParamConverterProvider { MediaTypes.APPLICATION_YANG_DATA_JSON, MediaTypes.APPLICATION_YANG_DATA_XML }) - public void dataYangXmlPATCH(final InputStream body, @Suspended final AsyncResponse ar) { + public void dataYangXmlPATCH(final InputStream body, @Context final UriInfo uriInfo, + @Suspended final AsyncResponse ar) { try (var xmlBody = new XmlPatchBody(body)) { - completeDataYangPATCH(server.dataPATCH(xmlBody), ar); + completeDataYangPATCH(server.dataPATCH(QueryParams.normalize(uriInfo), xmlBody), ar); } } @@ -370,6 +375,7 @@ public final class JaxRsRestconf implements ParamConverterProvider { * RFC8072, section 2. * * @param identifier path to target + * @param uriInfo URI info * @param body YANG Patch body * @param ar {@link AsyncResponse} which needs to be completed with a {@link PatchStatusContext} */ @@ -381,9 +387,9 @@ public final class JaxRsRestconf implements ParamConverterProvider { MediaTypes.APPLICATION_YANG_DATA_XML }) public void dataYangXmlPATCH(@Encoded @PathParam("identifier") final ApiPath identifier, final InputStream body, - @Suspended final AsyncResponse ar) { + @Context final UriInfo uriInfo, @Suspended final AsyncResponse ar) { try (var xmlBody = new XmlPatchBody(body)) { - completeDataYangPATCH(server.dataPATCH(identifier, xmlBody), ar); + completeDataYangPATCH(server.dataPATCH(identifier, QueryParams.normalize(uriInfo), xmlBody), ar); } } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java index 1f1bf784d6..a0c28d31ba 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java @@ -590,7 +590,8 @@ public abstract class RestconfStrategy { return merge(path.instance(), data); } - public final @NonNull RestconfFuture dataPATCH(final ApiPath apiPath, final PatchBody body) { + public final @NonNull RestconfFuture dataPATCH(final ApiPath apiPath, + final Map queryParameters, final PatchBody body) { final Data path; try { path = pathNormalizer.normalizeDataPath(apiPath); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java index dc4cd82092..67bcdc6720 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java @@ -72,20 +72,23 @@ public interface RestconfServer { * Ordered list of edits that are applied to the datastore by the server, as defined in * RFC8072, section 2. * + * @param queryParameters query parameters * @param body YANG Patch body * @return A {@link RestconfFuture} of the {@link DataYangPatchResult} content */ - RestconfFuture dataPATCH(PatchBody body); + RestconfFuture dataPATCH(Map queryParameters, PatchBody body); /** * Ordered list of edits that are applied to the datastore by the server, as defined in * RFC8072, section 2. * * @param identifier path to target + * @param queryParameters query parameters * @param body YANG Patch body * @return A {@link RestconfFuture} of the {@link DataYangPatchResult} content */ - RestconfFuture dataPATCH(ApiPath identifier, PatchBody body); + RestconfFuture dataPATCH(ApiPath identifier, Map queryParameters, + PatchBody body); RestconfFuture dataPOST(ChildBody body, Map queryParameters); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java index be62873baf..b990b148ed 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java @@ -193,19 +193,21 @@ public final class MdsalRestconfServer implements RestconfServer, AutoCloseable } @Override - public RestconfFuture dataPATCH(final PatchBody body) { - return localStrategy().dataPATCH(ApiPath.empty(), body); + public RestconfFuture dataPATCH(final Map queryParameters, + final PatchBody body) { + return localStrategy().dataPATCH(ApiPath.empty(), queryParameters, body); } @Override - public RestconfFuture dataPATCH(final ApiPath identifier, final PatchBody body) { + public RestconfFuture dataPATCH(final ApiPath identifier, + final Map queryParameters, final PatchBody body) { final StrategyAndTail strategyAndTail; try { strategyAndTail = localStrategy().resolveStrategy(identifier); } catch (RestconfDocumentedException e) { return RestconfFuture.failed(e); } - return strategyAndTail.strategy().dataPATCH(strategyAndTail.tail(), body); + return strategyAndTail.strategy().dataPATCH(strategyAndTail.tail(), queryParameters, body); } @Override diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPatchTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPatchTest.java index 2f9070b8a2..b09575c21a 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPatchTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPatchTest.java @@ -12,6 +12,8 @@ import static org.mockito.Mockito.doReturn; import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFalseFluentFuture; import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateTrueFluentFuture; +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.UriInfo; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,10 +28,13 @@ import org.opendaylight.restconf.server.spi.YangPatchStatusBody; class RestconfDataPatchTest extends AbstractRestconfTest { @Mock private DOMDataTreeReadWriteTransaction tx; + @Mock + private UriInfo uriInfo; @BeforeEach void beforeEach() { doReturn(tx).when(dataBroker).newReadWriteTransaction(); + doReturn(new MultivaluedHashMap<>()).when(uriInfo).getQueryParameters(); } @Test @@ -76,7 +81,7 @@ class RestconfDataPatchTest extends AbstractRestconfTest { } ] } - }"""), ar)); + }"""), uriInfo, ar)); assertFormat(""" {"ietf-yang-patch:yang-patch-status":{"patch-id":"test patch id","ok":[null]}}""", body::formatToJSON); @@ -119,7 +124,7 @@ class RestconfDataPatchTest extends AbstractRestconfTest { } ] } - }"""), ar)); + }"""), uriInfo, ar)); assertFormat(""" {"ietf-yang-patch:yang-patch-status":{"patch-id":"test patch id","edit-status":{"edit":[\ @@ -170,7 +175,7 @@ class RestconfDataPatchTest extends AbstractRestconfTest { delete /example-jukebox:jukebox/player/gap - """), ar)); + """), uriInfo, ar)); assertFormat(""" \ -- 2.36.6