Change schema for GET XML example 81/106581/3
authorŠimon Ukuš <simon.ukus@pantheon.tech>
Wed, 21 Jun 2023 10:17:03 +0000 (12:17 +0200)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Fri, 23 Jun 2023 12:37:24 +0000 (12:37 +0000)
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š <simon.ukus@pantheon.tech>
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/builder/OperationBuilder.java
restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/OpenApiGeneratorRFC8040Test.java

index 7c03e38b28ff11d025191cc5763c62f02851ae29..91b50af3d8ca237d9ef272b4a13d2a9f639847d7 100644 (file)
@@ -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) {
index 921a2084ad46f32040c19f86ca03ee2b79ba7703..d37be5b2f2f31cf529b684ff0a76cf5c4c912db0 100644 (file)
@@ -92,7 +92,7 @@ public final class OperationBuilder {
 
     public static Operation buildGet(final DataSchemaNode node, final String moduleName,
             final Optional<String> 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<ObjectNode> schema) {
         final ObjectNode response = JsonNodeFactory.instance.objectNode();
 
index 4d4d966a33d53fe1fdb976573907dae02d011fd8..adfef76b219fc34cac9bba9f8e9696480fd1ea7c 100644 (file)
@@ -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());