Fix choice cases usage 88/104988/10
authorYaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
Thu, 23 Mar 2023 10:11:58 +0000 (12:11 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 19 Apr 2023 15:12:53 +0000 (15:12 +0000)
Currently we are generating all cases from choice into payload used
as example in apidoc.
This is incorrect because we can use only one case at the time.
Implemented using first case (or default if specified) node in
apidoc example.

JIRA: NETCONF-983
Change-Id: Ifc32ee00e0de265b4f7e612adb5b8d3783b696a2
Signed-off-by: Yaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java
restconf/sal-rest-docgen/src/test/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocGeneratorRFC8040Test.java
restconf/sal-rest-docgen/src/test/resources/yang/choice-test.yang [new file with mode: 0644]

index c6ae4a2697008707967d9646791c4ab8d4880c3c..a63d3afb5d9cfd025e07bb3f01e1c31cba219171 100644 (file)
@@ -518,9 +518,12 @@ public class DefinitionGenerator {
                 property = processLeafListNode(leafList, stack, definitions, definitionNames, oaversion);
 
             } else if (node instanceof ChoiceSchemaNode choice) {
-                for (final CaseSchemaNode variant : choice.getCases()) {
-                    stack.enterSchemaTree(variant.getQName());
-                    for (final DataSchemaNode childNode : variant.getChildNodes()) {
+                if (!choice.getCases().isEmpty()) {
+                    CaseSchemaNode caseSchemaNode = choice.getDefaultCase()
+                            .orElse(choice.getCases().stream()
+                                    .findFirst().get());
+                    stack.enterSchemaTree(caseSchemaNode.getQName());
+                    for (final DataSchemaNode childNode : caseSchemaNode.getChildNodes()) {
                         processChildNode(childNode, parentName, definitions, definitionNames, isConfig, stack,
                                 properties, oaversion);
                     }
index 9617d247c56842ad13adc65ebdd31af20eb3f750..e749bea0143bda00eb8eb088a218c519a355c93a 100644 (file)
@@ -25,7 +25,8 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
     private static final String REVISION_DATE = "2009-11-20";
     private static final String NAME_2 = "toaster";
     private static final String REVISION_DATE_2 = "2009-11-20";
-
+    private static final String CHOICE_TEST_MODULE = "choice-test";
+    private static final String PROPERTIES = "properties";
     private final ApiDocGeneratorRFC8040 generator = new ApiDocGeneratorRFC8040(SCHEMA_SERVICE);
 
     /**
@@ -150,4 +151,22 @@ public final class ApiDocGeneratorRFC8040Test extends AbstractApiDocTest {
         assertTrue(properties.has("toasterDoneness"));
         assertTrue(properties.has("toasterToastType"));
     }
+
+    @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);
+        assertNotNull(doc);
+
+        final var definitions = doc.getDefinitions();
+        JsonNode firstContainer = definitions.get("choice-test_first-container");
+        assertEquals("default-value",
+                firstContainer.get(PROPERTIES).get("leaf-default").get("default").asText());
+        assertFalse(firstContainer.get(PROPERTIES).has("leaf-non-default"));
+
+        JsonNode secondContainer = definitions.get("choice-test_second-container");
+        assertTrue(secondContainer.get(PROPERTIES).has("leaf-first-case"));
+        assertFalse(secondContainer.get(PROPERTIES).has("leaf-second-case"));
+    }
 }
diff --git a/restconf/sal-rest-docgen/src/test/resources/yang/choice-test.yang b/restconf/sal-rest-docgen/src/test/resources/yang/choice-test.yang
new file mode 100644 (file)
index 0000000..52cf10b
--- /dev/null
@@ -0,0 +1,36 @@
+module choice-test {
+  namespace "urn:opendaylight:choice-test";
+  prefix "cht";
+
+  container first-container {
+    choice default-choice {
+      default second-case;
+      case first-case {
+        leaf leaf-non-default {
+          type string;
+        }
+      }
+      case second-case {
+        leaf leaf-default {
+          type string;
+          default "default-value";
+        }
+      }
+    }
+  }
+
+  container second-container {
+    choice first-choice {
+      case first-case {
+        leaf leaf-first-case {
+          type string;
+        }
+      }
+      case second-case {
+        leaf leaf-second-case {
+          type string;
+        }
+      }
+    }
+  }
+}
\ No newline at end of file