Fix deviceName with specific module request 80/107380/2
authorŠimon Ukuš <simon.ukus@pantheon.tech>
Mon, 17 Jul 2023 12:58:31 +0000 (14:58 +0200)
committerŠimon Ukuš <simon.ukus@pantheon.tech>
Thu, 10 Aug 2023 10:41:11 +0000 (12:41 +0200)
When requesting swagger document for a specific module under a specific
mounted device, the deviceName was ignored and not included in the
summary of the paths.

This change makes the deviceName part of the summary of the paths.

JIRA: NETCONF-1090
Change-Id: I1c50ecc6c69c82fd110d1ba5b67d631df1b95337
Signed-off-by: Šimon Ukuš <simon.ukus@pantheon.tech>
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
(cherry picked from commit 2b3398d67743baaec39c3562993c914bbf8972a3)

restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/BaseYangSwaggerGenerator.java
restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/mountpoints/MountPointSwagger.java
restconf/sal-rest-docgen/src/test/java/org/opendaylight/netconf/sal/rest/doc/impl/AbstractApiDocTest.java
restconf/sal-rest-docgen/src/test/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocGeneratorRFC8040Test.java
restconf/sal-rest-docgen/src/test/java/org/opendaylight/netconf/sal/rest/doc/impl/MountPointSwaggerTest.java

index 492e8e34f043f2f3a4a97b7634952e1994ace135..9f8edb7630d1e14b445fb298db4f974534e53017 100644 (file)
@@ -44,6 +44,7 @@ import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import javax.ws.rs.core.UriInfo;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
 import org.opendaylight.netconf.sal.rest.doc.swagger.CommonApiObject;
@@ -125,7 +126,7 @@ public abstract class BaseYangSwaggerGenerator {
 
             LOG.debug("Working on [{},{}]...", module.getName(), revisionString);
             final SwaggerObject doc = getApiDeclaration(module.getName(), revisionString, uriInfo, schemaContext,
-                    context, oaversion);
+                context, "All Modules", oaversion);
             if (doc != null) {
                 count++;
                 if (count >= start && count < end || all) {
@@ -238,13 +239,14 @@ public abstract class BaseYangSwaggerGenerator {
                                              final OAversion oaversion) {
         final EffectiveModelContext schemaContext = schemaService.getGlobalContext();
         Preconditions.checkState(schemaContext != null);
-        final SwaggerObject doc = getApiDeclaration(module, revision, uriInfo, schemaContext, "", oaversion);
+        final SwaggerObject doc = getApiDeclaration(module, revision, uriInfo, schemaContext, "", "Controller",
+            oaversion);
         return getAppropriateDoc(doc, oaversion);
     }
 
     public SwaggerObject getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
                                            final EffectiveModelContext schemaContext, final String context,
-                                           final OAversion oaversion) {
+                                           final @NonNull String deviceName, final OAversion oaversion) {
         final Optional<Revision> rev;
 
         try {
@@ -257,15 +259,16 @@ public abstract class BaseYangSwaggerGenerator {
         Preconditions.checkArgument(module != null,
                 "Could not find module by name,revision: " + moduleName + "," + revision);
 
-        return getApiDeclaration(module, uriInfo, context, schemaContext, oaversion);
+        return getApiDeclaration(module, uriInfo, context, schemaContext, deviceName, oaversion);
     }
 
-    public SwaggerObject getApiDeclaration(final Module module, final UriInfo uriInfo, final String context,
-                                           final EffectiveModelContext schemaContext, final OAversion oaversion) {
+    private SwaggerObject getApiDeclaration(final Module module, final UriInfo uriInfo, final String context,
+                                           final EffectiveModelContext schemaContext, final String deviceName,
+                                           final OAversion oaversion) {
         final String schema = createSchemaFromUriInfo(uriInfo);
         final String host = createHostFromUriInfo(uriInfo);
 
-        return getSwaggerDocSpec(module, schema, host, BASE_PATH, context, schemaContext, oaversion);
+        return getSwaggerDocSpec(module, schema, host, BASE_PATH, context, deviceName, schemaContext, oaversion);
     }
 
     public String createHostFromUriInfo(final UriInfo uriInfo) {
@@ -283,11 +286,12 @@ public abstract class BaseYangSwaggerGenerator {
 
     public SwaggerObject getSwaggerDocSpec(final Module module, final String schema, final String host,
                                            final String basePath, final String context,
-                                           final EffectiveModelContext schemaContext, final OAversion oaversion) {
+                                           final @NonNull String deviceName, final EffectiveModelContext schemaContext,
+                                           final OAversion oaversion) {
         final SwaggerObject doc = createSwaggerObject(schema, host, basePath, module.getName());
         final DefinitionNames definitionNames = new DefinitionNames();
-        return getSwaggerDocSpec(module, context, Optional.empty(), schemaContext, oaversion, definitionNames, doc,
-            true);
+        return getSwaggerDocSpec(module, context, Optional.of(deviceName), schemaContext, oaversion, definitionNames,
+            doc, true);
     }
 
 
index 273de0f4d17d5200ab97769228549a7c7c94cd25..ff3678dbcfeade7372966712cc8384c46eecff85 100644 (file)
@@ -149,7 +149,7 @@ public class MountPointSwagger implements DOMMountPointListener, AutoCloseable {
             return generateDataStoreApiDoc(uriInfo, urlPrefix, deviceName);
         }
         final SwaggerObject swaggerObject = swaggerGenerator.getApiDeclaration(module, revision, uriInfo, context,
-                urlPrefix, oaversion);
+                urlPrefix, deviceName, oaversion);
         return BaseYangSwaggerGenerator.getAppropriateDoc(swaggerObject, oaversion);
     }
 
index b6c49ff25f942f3f2a812d06f13bc0beb5014b1f..55debd2189dc5900e3aac58da9f9a5524ae8c31f 100644 (file)
@@ -13,6 +13,7 @@ import static org.mockito.Mockito.when;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import java.util.ArrayList;
 import java.util.List;
+import javax.ws.rs.core.UriInfo;
 import org.junit.BeforeClass;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -21,12 +22,14 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 public abstract class AbstractApiDocTest {
     static EffectiveModelContext CONTEXT;
     static DOMSchemaService SCHEMA_SERVICE;
+    static UriInfo URI_INFO;
 
     @BeforeClass
-    public static void beforeClass() {
+    public static void beforeClass() throws Exception {
         CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/yang");
         SCHEMA_SERVICE = mock(DOMSchemaService.class);
         when(SCHEMA_SERVICE.getGlobalContext()).thenReturn(CONTEXT);
+        URI_INFO = DocGenTestHelper.createMockUriInfo("http://localhost/path");
     }
 
     protected static List<String> getPathParameters(final ObjectNode paths, final String path) {
index 1204f8edf02f4a8b0cf19c0c60076d5e3a6a20f6..6e14ebdbfaf28a821db632898ac63d91e35070ce 100644 (file)
@@ -22,8 +22,8 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 import org.junit.Test;
+import org.opendaylight.netconf.sal.rest.doc.swagger.OpenApiObject;
 import org.opendaylight.netconf.sal.rest.doc.swagger.SwaggerObject;
-import org.opendaylight.yangtools.yang.common.Revision;
 
 public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
     private static final String NAME = "toaster2";
@@ -55,8 +55,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
      */
     @Test
     public void testPaths() {
-        final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
-        final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
+        final SwaggerObject doc = (SwaggerObject) generator.getApiDeclaration(NAME, REVISION_DATE, URI_INFO,
             ApiDocServiceImpl.OAversion.V2_0);
 
         assertEquals(List.of("/rests/data",
@@ -85,8 +84,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
                 "/rests/data/toaster2:lst/cont1/lst11",
                 "/rests/data/toaster2:lst/lst1={key1},{key2}");
 
-        final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
-        final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
+        final SwaggerObject doc = (SwaggerObject) generator.getApiDeclaration(NAME, REVISION_DATE, URI_INFO,
             ApiDocServiceImpl.OAversion.V2_0);
 
         for (final String path : configPaths) {
@@ -103,8 +101,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
      */
     @Test
     public void testDefinitions() {
-        final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
-        final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
+        final SwaggerObject doc = (SwaggerObject) generator.getApiDeclaration(NAME, REVISION_DATE, URI_INFO,
             ApiDocServiceImpl.OAversion.V2_0);
 
         final ObjectNode definitions = doc.getDefinitions();
@@ -156,8 +153,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
      */
     @Test
     public void testRPC() {
-        final var module = CONTEXT.findModule(NAME_2, Revision.of(REVISION_DATE_2)).orElseThrow();
-        final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
+        final SwaggerObject doc = (SwaggerObject) generator.getApiDeclaration(NAME_2, REVISION_DATE_2, URI_INFO,
             ApiDocServiceImpl.OAversion.V2_0);
         assertNotNull(doc);
 
@@ -174,11 +170,10 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
 
     @Test
     public void testMandatory() {
-        final var module = CONTEXT.findModule(MANDATORY_TEST).orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
-                ApiDocServiceImpl.OAversion.V3_0);
+        final var doc = (OpenApiObject) generator.getApiDeclaration(MANDATORY_TEST, null, URI_INFO,
+            ApiDocServiceImpl.OAversion.V3_0);
         assertNotNull(doc);
-        final var definitions = doc.getDefinitions();
+        final var definitions = doc.getComponents().getSchemas();
         final var containersWithRequired = new ArrayList<String>();
 
         final var reqRootContainerElements = Set.of("mandatory-root-leaf", "mandatory-container",
@@ -221,9 +216,8 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
      */
     @Test
     public void testParametersNumbering() {
-        final var module = CONTEXT.findModule(PATH_PARAMS_TEST_MODULE).orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
-                ApiDocServiceImpl.OAversion.V3_0);
+        final var doc = (OpenApiObject) generator.getApiDeclaration(PATH_PARAMS_TEST_MODULE, null, URI_INFO,
+            ApiDocServiceImpl.OAversion.V3_0);
 
         var pathToList1 = "/rests/data/path-params-test:cont/list1={name}";
         assertTrue(doc.getPaths().has(pathToList1));
@@ -277,8 +271,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
      */
     @Test
     public void testActionPathsParams() {
-        final var module = CONTEXT.findModule("action-types").orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
+        final var doc = (OpenApiObject) generator.getApiDeclaration("action-types", null, URI_INFO,
             ApiDocServiceImpl.OAversion.V3_0);
 
         final var pathWithParameters = "/rests/operations/action-types:list={name}/list-action";
@@ -292,9 +285,8 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
 
     @Test
     public void testChoice() {
-        final var module = CONTEXT.findModule(CHOICE_TEST_MODULE).orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
-                ApiDocServiceImpl.OAversion.V2_0);
+        final var doc = (SwaggerObject) generator.getApiDeclaration(CHOICE_TEST_MODULE, null, URI_INFO,
+            ApiDocServiceImpl.OAversion.V2_0);
         assertNotNull(doc);
 
         final var definitions = doc.getDefinitions();
@@ -310,9 +302,8 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
 
     @Test
     public void testSimpleOpenApiObjects() {
-        final var module = CONTEXT.findModule(MY_YANG, Revision.of(MY_YANG_REVISION)).orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "",
-                CONTEXT,ApiDocServiceImpl.OAversion.V3_0);
+        final var doc = (OpenApiObject) generator.getApiDeclaration(MY_YANG, MY_YANG_REVISION, URI_INFO,
+            ApiDocServiceImpl.OAversion.V3_0);
         assertEquals(List.of("/rests/data", "/rests/data/my-yang:data"),
                 ImmutableList.copyOf(doc.getPaths().fieldNames()));
 
@@ -326,7 +317,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
                 "#/components/schemas/my-yang_data");
 
         // Test `components/schemas` objects
-        final var definitions = doc.getDefinitions();
+        final var definitions = doc.getComponents().getSchemas();
         assertEquals(7, definitions.size());
         assertTrue(definitions.has("my-yang_config_data"));
         assertTrue(definitions.has("my-yang_config_data_post"));
@@ -339,9 +330,8 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
 
     @Test
     public void testToaster2OpenApiObjects() {
-        final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
-        final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
-                ApiDocServiceImpl.OAversion.V3_0);
+        final var doc = (OpenApiObject) generator.getApiDeclaration(NAME, REVISION_DATE, URI_INFO,
+            ApiDocServiceImpl.OAversion.V3_0);
         final var jsonNodeToaster = doc.getPaths().get("/rests/data/toaster2:toaster");
         verifyRequestRef(jsonNodeToaster.path("post"), "#/components/schemas/toaster2_config_toaster_post",
                 "#/components/schemas/toaster2_config_toaster_post_xml");
@@ -403,7 +393,7 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
         assertNull(xmlSchema.get("$ref"));
         assertEquals(2, xmlSchema.size());
         // Test `components/schemas` objects
-        final var definitions = doc.getDefinitions();
+        final var definitions = doc.getComponents().getSchemas();
         assertEquals(60, definitions.size());
     }
 
index 1e3f87935bcadf6e627eb0d761734dab54d69727..78515c7f2d4a938be02016e748dd21359b76e7f1 100644 (file)
@@ -21,7 +21,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
-import javax.ws.rs.core.UriInfo;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
@@ -35,7 +34,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
 public final class MountPointSwaggerTest extends AbstractApiDocTest {
-    private static final String HTTP_URL = "http://localhost/path";
     private static final YangInstanceIdentifier INSTANCE_ID = YangInstanceIdentifier.builder()
             .node(QName.create("", "nodes"))
             .node(QName.create("", "node"))
@@ -72,11 +70,10 @@ public final class MountPointSwaggerTest extends AbstractApiDocTest {
     }
 
     @Test
-    public void testGetDataStoreApi() throws Exception {
-        final UriInfo mockInfo = DocGenTestHelper.createMockUriInfo(HTTP_URL);
+    public void testGetDataStoreApi() {
         swagger.onMountPointCreated(INSTANCE_ID); // add this ID into the list of mount points
 
-        final SwaggerObject mountPointApi = (SwaggerObject) swagger.getMountPointApi(mockInfo, 1L, "Datastores", "-",
+        final SwaggerObject mountPointApi = (SwaggerObject) swagger.getMountPointApi(URI_INFO, 1L, "Datastores", "-",
             OAversion.V2_0);
         assertNotNull("failed to find Datastore API", mountPointApi);
 
@@ -113,11 +110,10 @@ public final class MountPointSwaggerTest extends AbstractApiDocTest {
      * It means we should have name and name1, etc. when we have the same parameter in path multiple times.
      */
     @Test
-    public void testParametersNumberingForMountPointApi() throws Exception {
-        final UriInfo mockInfo = DocGenTestHelper.createMockUriInfo(HTTP_URL);
+    public void testParametersNumberingForMountPointApi() {
         swagger.onMountPointCreated(INSTANCE_ID);
 
-        final OpenApiObject mountPointApi = (OpenApiObject) swagger.getMountPointApi(mockInfo, 1L, Optional.empty(),
+        final OpenApiObject mountPointApi = (OpenApiObject) swagger.getMountPointApi(URI_INFO, 1L, Optional.empty(),
                 OAversion.V3_0);
         assertNotNull("Failed to find Datastore API", mountPointApi);
 
@@ -146,11 +142,10 @@ public final class MountPointSwaggerTest extends AbstractApiDocTest {
      * Test that request for actions is correct and has parameters.
      */
     @Test
-    public void testActionPathsParamsForMountPointApi() throws Exception {
-        final var mockInfo = DocGenTestHelper.createMockUriInfo(HTTP_URL);
+    public void testActionPathsParamsForMountPointApi() {
         swagger.onMountPointCreated(INSTANCE_ID);
 
-        final var mountPointApi = (OpenApiObject) swagger.getMountPointApi(mockInfo, 1L, Optional.empty(),
+        final var mountPointApi = (OpenApiObject) swagger.getMountPointApi(URI_INFO, 1L, Optional.empty(),
             OAversion.V3_0);
         assertNotNull("Failed to find Datastore API", mountPointApi);