[NETCONF-660] RFC 8040 query fails to return field if subfields specified for another element Created: 06/Mar/20 Updated: 22/Aug/22 Resolved: 29/Jul/22 |
|
| Status: | Resolved |
| Project: | netconf |
| Component/s: | restconf-nb |
| Affects Version/s: | None |
| Fix Version/s: | 3.0.6, 4.0.1 |
| Type: | Improvement | Priority: | Medium |
| Reporter: | Allan Clarke | Assignee: | Peter Puškár |
| Resolution: | Done | Votes: | 0 |
| Labels: | None | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Attachments: |
|
||||||||
| Issue Links: |
|
||||||||
| Description |
|
Title: odl-restconf-nb-rfc8040 fails to return field if subfields specified for another element
The RFC8040 implementation returns an incomplete result if, at the same level, you request subfields from a container. If we query for the manufactured-thing and structure, we get the following result: Operation: GET URL: http://\{{lmsdner}}:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=siae_alcplus2e_12969/yang-ext:mount/core-model-1-4:control-construct/equipment=RADIO-2A?content=config&fields=uuid;actual-equipment(manufactured-thing;structure) RESULT: { "core-model-1-4:equipment": [ { "uuid": "RADIO-2A", "actual-equipment": { "manufactured-thing": { "operator-augmented-equipment-instance": { "asset-instance-identifier": "" }, "equipment-type": { "version": "001", "description": "RADIO connected to RADIO-2A", "model-identifier": "ODU MW interface", "part-type-identifier": "GE8705-52", "type-name": "RADIO" }, "operator-augmented-equipment-type": { "asset-type-identifier": "" }, "equipment-instance": { "serial-number": "101821829000120", "manufacture-date": "1970-01-01T00:00:00.0+00:00", "asset-instance-identifier": "" }, "manufacturer-properties": { "manufacturer-name": "SIAE Microelettronica SpA", "manufacturer-identifier": "" } }, "structure": { "category": "core-model-1-4:EQUIPMENT_CATEGORY_STAND_ALONE_UNIT" } } } ] } However, if we try to filter the content of manufactured-thing to get just the equipment-type, the structure container is no longer returned: URL: http://\{{lmsdner}}:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=siae_alcplus2e_12969/yang-ext:mount/core-model-1-4:control-construct/equipment=RADIO-2A?content=config&fields=uuid;actual-equipment(manufactured-thing(equipment-type);structure) { "core-model-1-4:equipment": [ { "uuid": "RADIO-2A", "actual-equipment": { "manufactured-thing": { "equipment-type": { "version": "001", "description": "RADIO connected to RADIO-2A", "model-identifier": "ODU MW interface", "part-type-identifier": "GE8705-52", "type-name": "RADIO" } } } } ] } |
| Comments |
| Comment by Allan Clarke [ 06/Mar/20 ] |
|
NOTE there are very useful Yang models and Postman collection on |
| Comment by Mahesh Jethanandani [ 21/Apr/20 ] |
|
Couple of observations regarding the issue.
|
| Comment by Allan Clarke [ 21/Apr/20 ] |
|
I believe that when I looked it up, it turned out that the query was incorrect. I supplied the corrected one to the originator and he confirmed. That is from my faulty memory. So please confirm the query is correct. |
| Comment by Mahesh Jethanandani [ 23/Apr/20 ] |
|
Ok. As I indicated in the email, I am having an issue with getting testtool to work. Keep getting the error " JCE cannot authenticate the provider BC". A quick Google search talks about getting a certificate from Oracle to sign the JAR. This is on a Ubuntu machine running karaf built using stable/magnesium. If I download the testtool JAR file from nexus, I get the same error. 12:59:04.268 [main] INFO o.o.n.t.tool.NetconfDeviceSimulator - All simulated devices started successfully from port 17830 to 17830 |
| Comment by Allan Clarke [ 23/Apr/20 ] |
|
I have used testtool but without certificates, so have not hit those hurdles. You can see my notes on |
| Comment by Mahesh Jethanandani [ 24/Apr/20 ] |
|
I was able to get testool to work after I got a JCE certificate from Oracle and use it to sign the JAR file. So far so good. Back to this bug. If I use the schemas that you attached to Caused by: org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException: Failed to resolve required models, failed source: RevisionSourceIdentifier [name=core-model-1-4@2019-11-27], resolved sources: [], unsatisfied imports: {} If I use pyang to validate the model, I get these errors. Indeed, uuid does not exist for the list 'logical-termination-point'. Unless you meant to use the grouping 'global-class' and accidentally commented it out. Same with commenting it out in the list 'layer-protocol'. $ pyang core-model-1-4@2019-11-27.yang Anyway, after fixing those two errors in the YANG model, I was able to bring testtool up with these schemas. Next step, to see if I can reproduce the issue using the Postman files you have provided. Will keep an eye out for the query you said was incorrect. |
| Comment by Allan Clarke [ 24/Apr/20 ] |
|
I had to go read about 8040 querying as part of I think this was a set of 3 defects filed together using the same data/query. I noticed that it was not correct for what Peter |
| Comment by Mahesh Jethanandani [ 29/Apr/20 ] |
|
Turns out that the issue was with how we decide which child nodes need to be written in the output stream. As the logic currently stands, the children of sibling nodes are fetched, but ignored when writing the output stream. Have a fix that I believe addresses the issue. Have used the one Postman scripts uploaded as part of Other than the one Postman script, are their any other tests I can run to validate the fix? |
| Comment by Allan Clarke [ 29/Apr/20 ] |
|
Everything I had I attached to that other report. I have no other source. |
| Comment by Mahesh Jethanandani [ 01/May/20 ] |
|
As reported before, the fix that has been tried on the configuration that Allan reported yields the following result: The query is as before:
http://127.0.0.1:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=testtool/yang-ext:mount/core-model-1-4:control-construct/equipment=RADIO-2A?content=config&fields=uuid;actual-equipment(manufactured-thing(equipment-type);structure)
The result of that now is the following:
http://127.0.0.1:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=testtool/yang-ext:mount/core-model-1-4:control-construct/equipment=RADIO-2A?content=config&fields=uuid;actual-equipment(manufactured-thing(equipment-type);structure;environmental-rating)
|
| Comment by Luis Gomez [ 04/May/20 ] |
|
It looks to me you might have found another bug. If so, I would recommend to open a new ticket with the details including how to reproduce, and track it separately. |
| Comment by Mahesh Jethanandani [ 06/May/20 ] |
|
Attaching an updated set of Postman test cases that are being used as a benchmark to validate the changes. It expands on allanclarke test cases by:
|
| Comment by Mahesh Jethanandani [ 06/May/20 ] |
|
ecelgp , I considered what you are suggesting early on in development cycle - applying a narrow fix to the problem, but quickly realized that the expanded test cases were failing with that fix. The code changes that will be committed soon sets up the parent child relationship from the fields query, so a duplicate child name does not confuse the writeChildren() if children need to be printed in the output stream or not. The code is not perfect as there is no grandparent/grandchild relationship, but that is a battle for another day |
| Comment by Jamo Luhrsen [ 18/May/20 ] |
|
tcere, rovarga, wsx25289, if anyone has some time could you take a look at this patch for review? |
| Comment by Lukas Baca [ 02/Jul/20 ] |
|
after apply this patch we find out problem with one GET call(without this patch all works well): 127.0.0.1:8181/rests/data/network-topology:network-topology/topology=topology-netconf?content=nonconfig&fields=node(node-id) <h2>HTTP ERROR 500</h2> <p>Problem accessing /rests/data/network-topology:network-topology/topology=topology-netconf. Reason: <pre> Request failed.</pre> in karaf.log: 2020-07-02T12:44:05,353 | WARN | qtp237340925-73 | HttpChannel | 163 - org.eclipse.jetty.util - 9.4.18.v20190429 | /rests/data/network-topology:network-topology/topology=topology-netconf javax.servlet.ServletException: javax.servlet.ServletException: java.lang.UnsupportedOperationException: Augmentation node has no QName at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:88) ~[?:?] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.Server.handle(Server.java:505) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370) [160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267) [160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804) [163:org.eclipse.jetty.util:9.4.18.v20190429] at java.lang.Thread.run(Thread.java:834) [?:?] Caused by: javax.servlet.ServletException: java.lang.UnsupportedOperationException: Augmentation node has no QName at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489) ~[?:?] at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) ~[?:?] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:311) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:265) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[?:?] at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:51) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:214) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:59) ~[?:?] at com.luminanetworks.lsc.core.filters.CompactInfoFilter.doFilterInternal(CompactInfoFilter.java:32) ~[?:?] at com.luminanetworks.lsc.core.filters.AbstractRequestResponseLoggingFilter.doFilter(AbstractRequestResponseLoggingFilter.java:66) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:57) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:91) ~[?:?] at org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter.doFilter(CustomFilterAdapter.java:76) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) ~[?:?] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) ~[?:?] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) ~[?:?] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) ~[?:?] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:293) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) ~[?:?] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) ~[?:?] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) ~[?:?] ... 15 more Caused by: java.lang.UnsupportedOperationException: Augmentation node has no QName at org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier$AugmentationIdentifier.getNodeType(YangInstanceIdentifier.java:930) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeAllChildren(ParameterAwareNormalizedNodeWriter.java:261) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeChildren(ParameterAwareNormalizedNodeWriter.java:284) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter$OrderedParameterAwareNormalizedNodeWriter.writeMapEntryNode(ParameterAwareNormalizedNodeWriter.java:450) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.wasProcessedAsCompositeNode(ParameterAwareNormalizedNodeWriter.java:354) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.write(ParameterAwareNormalizedNodeWriter.java:126) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeChildren(ParameterAwareNormalizedNodeWriter.java:297) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.wasProcessedAsCompositeNode(ParameterAwareNormalizedNodeWriter.java:380) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.write(ParameterAwareNormalizedNodeWriter.java:126) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeChildren(ParameterAwareNormalizedNodeWriter.java:297) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter$OrderedParameterAwareNormalizedNodeWriter.writeMapEntryNode(ParameterAwareNormalizedNodeWriter.java:450) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.wasProcessedAsCompositeNode(ParameterAwareNormalizedNodeWriter.java:354) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.write(ParameterAwareNormalizedNodeWriter.java:126) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeChildren(ParameterAwareNormalizedNodeWriter.java:297) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.wasProcessedAsCompositeNode(ParameterAwareNormalizedNodeWriter.java:380) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.write(ParameterAwareNormalizedNodeWriter.java:126) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter$OrderedParameterAwareNormalizedNodeWriter.write(ParameterAwareNormalizedNodeWriter.java:396) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.NormalizedNodeJsonBodyWriter.writeNormalizedNode(NormalizedNodeJsonBodyWriter.java:148) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:93) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:50) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329) ~[?:?] at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[?:?] at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[?:?] at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) ~[?:?] at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) ~[?:?] at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) ~[?:?] at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) ~[?:?] at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) ~[?:?] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:311) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:265) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[?:?] at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:51) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:214) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:59) ~[?:?] at com.luminanetworks.lsc.core.filters.CompactInfoFilter.doFilterInternal(CompactInfoFilter.java:32) ~[?:?] at com.luminanetworks.lsc.core.filters.AbstractRequestResponseLoggingFilter.doFilter(AbstractRequestResponseLoggingFilter.java:66) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:57) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:91) ~[?:?] at org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter.doFilter(CustomFilterAdapter.java:76) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) ~[?:?] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) ~[?:?] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) ~[?:?] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) ~[?:?] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:293) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) ~[?:?] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) ~[?:?] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) ~[?:?] ... 15 more Suppressed: java.io.IOException: Incomplete document at com.google.gson.stream.JsonWriter.close(JsonWriter.java:559) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:91) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:50) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86) ~[?:?] at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) ~[?:?] at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434) ~[?:?] at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329) ~[?:?] at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[?:?] at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[?:?] at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[?:?] at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) ~[?:?] at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) ~[?:?] at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) ~[?:?] at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) ~[?:?] at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) ~[?:?] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) ~[?:?] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:311) ~[?:?] at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:265) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) ~[?:?] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[?:?] at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[?:?] at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) ~[?:?] at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) ~[?:?] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:51) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:214) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:59) ~[?:?] at com.luminanetworks.lsc.core.filters.CompactInfoFilter.doFilterInternal(CompactInfoFilter.java:32) ~[?:?] at com.luminanetworks.lsc.core.filters.AbstractRequestResponseLoggingFilter.doFilter(AbstractRequestResponseLoggingFilter.java:66) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:57) ~[?:?] at org.opendaylight.aaa.filterchain.filters.AAAFilterChain.doFilter(AAAFilterChain.java:91) ~[?:?] at org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter.doFilter(CustomFilterAdapter.java:76) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) ~[?:?] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) ~[?:?] at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) ~[?:?] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:293) ~[?:?] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) ~[?:?] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) ~[?:?] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.Server.handle(Server.java:505) ~[160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370) [160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267) [160:org.eclipse.jetty.server:9.4.18.v20190429] at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [152:org.eclipse.jetty.io:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698) [163:org.eclipse.jetty.util:9.4.18.v20190429] at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804) [163:org.eclipse.jetty.util:9.4.18.v20190429] at java.lang.Thread.run(Thread.java:834) [?:?] |
| Comment by Lukas Baca [ 03/Jul/20 ] |
|
point from jluhrsen in gerrit helps
thanks |
| Comment by Robert Varga [ 27/Oct/21 ] |
|
Okay, a year has passed. Having refactored half the RESTCONF and I am circling back to this from a different angle. The problem here is the entire idea of List<Set<QName>> is wrong here. The source of what we are matching here is the "fields" parameter and we are supposed to only emit those specified in our output stream.
Both exercises should be quite trivial, so that we can have a NormalizedFieldsParam, which has the exactly the same layout, but uses wildcard YangInstanceIdentifiers instead of NodeSelectors. In is up to ParameterAwareNormalizedNodeStreamWriter (or whatever it's called) to correctly apply YangInstanceIdentifier wildcards, which is pretty easy to do. |
| Comment by Robert Varga [ 27/Oct/21 ] |
|
|
| Comment by Robert Varga [ 04/Nov/21 ] |
|
Hmm, this part is suspect: Caused by: java.lang.UnsupportedOperationException: Augmentation node has no QName at org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier$AugmentationIdentifier.getNodeType(YangInstanceIdentifier.java:930) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeAllChildren(ParameterAwareNormalizedNodeWriter.java:261) ~[?:?] at org.opendaylight.restconf.nb.rfc8040.jersey.providers.ParameterAwareNormalizedNodeWriter.writeChildren(ParameterAwareNormalizedNodeWriter.java:284) ~[?:?] i.e. ParameterAwareNormalizedNodeWriter does not know there are augmentations. This is really saying it assumes plain RFC7950 (not yang-data-api) schema tree or data tree mapping. Neither are appropriate when dealing with NormalizedNode, PathArgument, or really anything yang-data-api. This is reinforcing the other commends about ditching the Set<QName> idea. |