From af6b9fe02a26fdd789470f0e8ab4c9062202c3a9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=A0imon=20Uku=C5=A1?= Date: Wed, 21 Jun 2023 12:17:03 +0200 Subject: [PATCH] Change schema for GET XML example MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The XML example for GET request in OpenApi UI was different to the one being actually returned. This patch changes the schema used for that example, making it consistent with what is actually returned in the response. JIRA: NETCONF-1059 Change-Id: Ie2d128b6de43d705c93d509c287cabcbc719e591 Signed-off-by: Šimon Ukuš Signed-off-by: Ivan Hrasko --- .../impl/BaseYangOpenApiGenerator.java | 5 ++-- .../model/builder/OperationBuilder.java | 28 +++++++++++++++++-- .../impl/OpenApiGeneratorRFC8040Test.java | 12 ++++---- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java index 7c03e38b28..91b50af3d8 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java @@ -352,8 +352,9 @@ public abstract class BaseYangOpenApiGenerator { final String discriminator = definitionNames.getDiscriminator(node); final String nodeName = node.getQName().getLocalName(); - final String defName = parentName + "_" + nodeName + TOP + discriminator; - final Operation get = buildGet(node, moduleName, deviceName, pathParams, defName, isConfig); + final String defName = parentName + "_" + nodeName + discriminator; + final String defNameTop = parentName + "_" + nodeName + TOP + discriminator; + final Operation get = buildGet(node, moduleName, deviceName, pathParams, defName, defNameTop, isConfig); operationsBuilder.get(get); if (isConfig) { diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/builder/OperationBuilder.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/builder/OperationBuilder.java index 921a2084ad..d37be5b2f2 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/builder/OperationBuilder.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/builder/OperationBuilder.java @@ -92,7 +92,7 @@ public final class OperationBuilder { public static Operation buildGet(final DataSchemaNode node, final String moduleName, final Optional deviceName, final ArrayNode pathParams, final String defName, - final boolean isConfig) { + final String defNameTop, final boolean isConfig) { final String description = node.getDescription().orElse(""); final String summary = buildSummaryValue(HttpMethod.GET, moduleName, deviceName, node.getQName().getLocalName()); @@ -101,9 +101,12 @@ public final class OperationBuilder { addQueryParameters(parameters, isConfig); final ObjectNode responses = JsonNodeFactory.instance.objectNode(); final ObjectNode schema = JsonNodeFactory.instance.objectNode(); - schema.put(REF_KEY, COMPONENTS_PREFIX + defName); + final ObjectNode xmlSchema = JsonNodeFactory.instance.objectNode(); + schema.put(REF_KEY, COMPONENTS_PREFIX + defNameTop); + xmlSchema.put(REF_KEY, COMPONENTS_PREFIX + defName); + responses.set(String.valueOf(Response.Status.OK.getStatusCode()), - buildResponse(Response.Status.OK.getReasonPhrase(), Optional.of(schema))); + buildResponse(Response.Status.OK.getReasonPhrase(), schema, xmlSchema)); return new Operation.Builder() .tags(tags) @@ -303,6 +306,25 @@ public final class OperationBuilder { return mimeTypeValue; } + public static ObjectNode buildResponse(final String description, final ObjectNode schema, + final ObjectNode xmlSchema) { + final ObjectNode response = JsonNodeFactory.instance.objectNode(); + + final ObjectNode content = JsonNodeFactory.instance.objectNode(); + final ObjectNode body = JsonNodeFactory.instance.objectNode(); + final ObjectNode xmlBody = JsonNodeFactory.instance.objectNode(); + + body.set(SCHEMA_KEY, schema); + xmlBody.set(SCHEMA_KEY, xmlSchema); + content.set(MediaType.APPLICATION_JSON, body); + content.set(MediaType.APPLICATION_XML, xmlBody); + + response.set(CONTENT_KEY, content); + + response.put(DESCRIPTION_KEY, description); + return response; + } + public static ObjectNode buildResponse(final String description, final Optional schema) { final ObjectNode response = JsonNodeFactory.instance.objectNode(); diff --git a/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/OpenApiGeneratorRFC8040Test.java b/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/OpenApiGeneratorRFC8040Test.java index 4d4d966a33..adfef76b21 100644 --- a/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/OpenApiGeneratorRFC8040Test.java +++ b/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/OpenApiGeneratorRFC8040Test.java @@ -338,7 +338,7 @@ public final class OpenApiGeneratorRFC8040Test { verifyRequestRef(JsonNodeMyYangData.put(), "#/components/schemas/my-yang_config_data_TOP", "#/components/schemas/my-yang_config_data"); verifyRequestRef(JsonNodeMyYangData.get(), "#/components/schemas/my-yang_data_TOP", - "#/components/schemas/my-yang_data_TOP"); + "#/components/schemas/my-yang_data"); // Test `components/schemas` objects final var definitions = doc.components().schemas(); @@ -361,7 +361,7 @@ public final class OpenApiGeneratorRFC8040Test { verifyRequestRef(jsonNodeToaster.put(), "#/components/schemas/toaster2_config_toaster_TOP", "#/components/schemas/toaster2_config_toaster"); verifyRequestRef(jsonNodeToaster.get(), "#/components/schemas/toaster2_toaster_TOP", - "#/components/schemas/toaster2_toaster_TOP"); + "#/components/schemas/toaster2_toaster"); final var jsonNodeToasterSlot = doc.paths().get("/rests/data/toaster2:toaster/toasterSlot={slotId}"); verifyRequestRef(jsonNodeToasterSlot.post(), "#/components/schemas/toaster2_toaster_config_toasterSlot", @@ -369,7 +369,7 @@ public final class OpenApiGeneratorRFC8040Test { verifyRequestRef(jsonNodeToasterSlot.put(), "#/components/schemas/toaster2_toaster_config_toasterSlot_TOP", "#/components/schemas/toaster2_toaster_config_toasterSlot"); verifyRequestRef(jsonNodeToasterSlot.get(), "#/components/schemas/toaster2_toaster_toasterSlot_TOP", - "#/components/schemas/toaster2_toaster_toasterSlot_TOP"); + "#/components/schemas/toaster2_toaster_toasterSlot"); final var jsonNodeSlotInfo = doc.paths().get( "/rests/data/toaster2:toaster/toasterSlot={slotId}/toaster-augmented:slotInfo"); @@ -380,7 +380,7 @@ public final class OpenApiGeneratorRFC8040Test { "#/components/schemas/toaster2_toaster_toasterSlot_config_slotInfo_TOP", "#/components/schemas/toaster2_toaster_toasterSlot_config_slotInfo"); verifyRequestRef(jsonNodeSlotInfo.get(), "#/components/schemas/toaster2_toaster_toasterSlot_slotInfo_TOP", - "#/components/schemas/toaster2_toaster_toasterSlot_slotInfo_TOP"); + "#/components/schemas/toaster2_toaster_toasterSlot_slotInfo"); final var jsonNodeLst = doc.paths().get("/rests/data/toaster2:lst"); verifyRequestRef(jsonNodeLst.post(), "#/components/schemas/toaster2_config_lst", @@ -388,7 +388,7 @@ public final class OpenApiGeneratorRFC8040Test { verifyRequestRef(jsonNodeLst.put(), "#/components/schemas/toaster2_config_lst_TOP", "#/components/schemas/toaster2_config_lst"); verifyRequestRef(jsonNodeLst.get(), "#/components/schemas/toaster2_lst_TOP", - "#/components/schemas/toaster2_lst_TOP"); + "#/components/schemas/toaster2_lst"); final var jsonNodeLst1 = doc.paths().get("/rests/data/toaster2:lst/lst1={key1},{key2}"); verifyRequestRef(jsonNodeLst1.post(), "#/components/schemas/toaster2_lst_config_lst1", @@ -396,7 +396,7 @@ public final class OpenApiGeneratorRFC8040Test { verifyRequestRef(jsonNodeLst1.put(), "#/components/schemas/toaster2_lst_config_lst1_TOP", "#/components/schemas/toaster2_lst_config_lst1"); verifyRequestRef(jsonNodeLst1.get(), "#/components/schemas/toaster2_lst_lst1_TOP", - "#/components/schemas/toaster2_lst_lst1_TOP"); + "#/components/schemas/toaster2_lst_lst1"); final var jsonNodeMakeToast = doc.paths().get("/rests/operations/toaster2:make-toast"); assertNull(jsonNodeMakeToast.get()); -- 2.36.6