[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:
Duplicate
duplicates NETCONF-859 Devices with certain BBF yang models ... Resolved
is duplicated by TRNSPRTPCE-680 Swagger UI not working Resolved
is duplicated by YANGTOOLS-1446 Some BBF Yang models have errors when... Resolved
is duplicated by YANGTOOLS-1456 apidoc for mounted device not working... Resolved
Relates
relates to NETCONF-819 Eliminate use of SchemaNode.getPath()... Resolved

 Description   

Found in CSIT: https://s3-logs.opendaylight.org/logs/releng/vex-yul-odl-jenkins-1/netconf-csit-1node-userfeatures-rfc8040-all-master/94/odl_1/odl1_karaf.log.gz

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

Generated at Wed Feb 07 20:16:09 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.