[NETCONF-883] Fail to generate API Doc Created: 08/Jun/22 Updated: 26/Oct/22 Resolved: 26/Oct/22 |
|
| Status: | Resolved |
| Project: | netconf |
| Component/s: | restconf-openapi |
| Affects Version/s: | 3.0.0, 4.0.0, 3.0.4, 4.0.2 |
| Fix Version/s: | 3.0.7, 4.0.3 |
| Type: | Bug | Priority: | Medium |
| Reporter: | Sangwook Ha | Assignee: | Ruslan Kashapov |
| Resolution: | Done | Votes: | 0 |
| Labels: | pt, regression | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Issue Links: |
|
||||||||||||||||||||||||||||
| Description |
|
APIDocSerivce fails to generate OpenAPI documentation for 'bgp-linkstate': Caused by: java.lang.IllegalArgumentException: Schema tree child (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2020-01-20)ipv4-tunnel-sender-address not present in schema parent (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2020-01-20)address-family at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.notPresent(SchemaInferenceStack.java:1058) ~[?:?] at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.lambda$pushSchema$5(SchemaInferenceStack.java:835) ~[?:?] at java.util.Optional.orElseThrow(Optional.java:408) ~[?:?] at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.pushSchema(SchemaInferenceStack.java:835) ~[?:?] at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.pushSchema(SchemaInferenceStack.java:829) ~[?:?] at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.pushSchema(SchemaInferenceStack.java:823) ~[?:?] at org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.enterSchemaTree(SchemaInferenceStack.java:496) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChoiceNode(DefinitionGenerator.java:558) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChoiceNode(DefinitionGenerator.java:593) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChildren(DefinitionGenerator.java:514) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processDataNodeContainer(DefinitionGenerator.java:390) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChildren(DefinitionGenerator.java:501) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processDataNodeContainer(DefinitionGenerator.java:390) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChoiceNode(DefinitionGenerator.java:581) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChildren(DefinitionGenerator.java:514) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processDataNodeContainer(DefinitionGenerator.java:390) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processChildren(DefinitionGenerator.java:501) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processDataNodeContainer(DefinitionGenerator.java:390) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.processContainersAndLists(DefinitionGenerator.java:244) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.convertToJsonSchema(DefinitionGenerator.java:153) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.DefinitionGenerator.convertToJsonSchema(DefinitionGenerator.java:171) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator.getSwaggerDocSpec(BaseYangSwaggerGenerator.java:310) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator.fillDoc(BaseYangSwaggerGenerator.java:196) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator.getAllModulesDoc(BaseYangSwaggerGenerator.java:174) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator.getAllModulesDoc(BaseYangSwaggerGenerator.java:154) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.AllModulesDocGenerator.getAllModulesDoc(AllModulesDocGenerator.java:34) ~[?:?] at org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.getAllModulesDoc(ApiDocServiceImpl.java:67) ~[?:?] |
| Comments |
| Comment by Robert Varga [ 25/Oct/22 ] |
|
The code layout looks quite baroque. There is at least one inconsistency around processing of 'choice' and 'case' statements – in one code path we end up pushing cases and in another we do not. There is also a comment FIXME hinting at performing a refactor in one of the methods. I think a larger-scale refactor is needed – preferrably to the point of not using SchemaNodes at all, but rather working on EffectiveStatements. |
| Comment by Robert Varga [ 25/Oct/22 ] |
|
The reproducer is simple: feature:install odl-mdsal-apidocs odl-netconf-topology odl-netconf-mdsal odl-restconf odl-bgpcep-bgp and then curl -u admin http://localhost:8181/apidoc/openapi3/apis/single as demonstrated here: https://s3-logs.opendaylight.org/logs/releng/vex-yul-odl-jenkins-1/netconf-csit-1node-userfeatures-rfc8040-all-master/173/odl_1/odl1_karaf.log.gz |