[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: File ODL.postman_collection.json    
Issue Links:
Relates
relates to NETCONF-820 Fail to process RESTCONF fields on th... Resolved

 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 NETCONF-658!

Comment by Mahesh Jethanandani [ 21/Apr/20 ]

Couple of observations regarding the issue.

  • The order of the elements (specifically query in the subfields) does not seem to matter. Even if it is placed last, an incomplete response is received.
  • It turns out that you do not need a device to reproduce the problem. The issue can be seen by setting up a configuration in MDSAL, and querying it.
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
12:59:35.860 [sshd-netconf-ssh-server-nio-group-thread-1] WARN o.a.s.s.session.ServerSessionImpl - exceptionCaught(ServerSessionImpl[null@/127.0.0.1:59288])[state=Opened] NoSuchProviderException: JCE cannot authenticate the provider BC

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 NETCONF-657 for the command line I used.

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 NETCONF-658 for core-model-1-4, I get the following error when I start testtool.

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
core-model-1-4@2019-11-27.yang:1387: error: "core-model-1-4:uuid" in the path for logical-termination-point at core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:1385) is not found
core-model-1-4@2019-11-27.yang:1515: error: "core-model-1-4:uuid" in the path for logical-termination-point at core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:1513) is not found
core-model-1-4@2019-11-27.yang:1515: error: "core-model-1-4:uuid" in the path for logical-termination-point at core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:1513) is not found
core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:1673): error: the key "local-id" does not reference an existing leaf
core-model-1-4@2019-11-27.yang:1757: error: "core-model-1-4:uuid" in the path for logical-termination-point at core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:1755) is not found
core-model-1-4@2019-11-27.yang:2753 (at core-model-1-4@2019-11-27.yang:2773): error: the key "uuid" does not reference an existing leaf

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 NETCONF-658, so was careful in looking at the URL, particularly... fields=uuid;actual-equipment(manufactured-thing;structure)

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 wanted, so ended up closing the JIRA issue. So double check that the query is correctly specified above.

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 NETCONF-657 (and modified for this bug) to validate. However, the second create of configuration is incorrect (as already noted by Allan) as it tries to create a ethernet-container-pac, which does not exist. The other two models bundled with this are notifications, and as such do not contain any config or nonconfig data elements.

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:

 
<equipment xmlns="urn:onf:yang:core-model-1-4">
    <uuid>RADIO-2A</uuid>
    <actual-equipment>
        <structure>
            <category>EQUIPMENT_CATEGORY_STAND_ALONE_UNIT</category>
        </structure>
        <manufactured-thing>
            <equipment-type>
                <version>001</version>
                <description>RADIO connected to RADIO-2A</description>
                <model-identifier>ODU MW interface</model-identifier>
                <part-type-identifier>GE8705-52</part-type-identifier>
                <type-name>RADIO</type-name>
            </equipment-type>
        </manufactured-thing>
    </actual-equipment>
</equipment>
 
When I expanded the configuration to include more siblings, and more importantly siblings with more child containers such as here:
 
<control-construct xmlns="urn:onf:yang:core-model-1-4">
    <equipment>
        <uuid>RADIO-2A</uuid>
        <actual-equipment>
            <structure>
                <category>EQUIPMENT_CATEGORY_STAND_ALONE_UNIT</category>
            </structure>
            <environmental-rating>
                <thermal-rating>
                    <minimum-temperature>0</minimum-temperature>
                    <maximum-temperature>100</maximum-temperature>
                    <thermal-rating-name>THERMAL_RATING</thermal-rating-name>
                </thermal-rating>
                <power-rating>
                    <power-rating-value>POWER_RATING_VALUE</power-rating-value>
                    <power-rating-name>POWER_RATING_NAME</power-rating-name>
                </power-rating>
            </environmental-rating>
            <manufactured-thing>
                <operator-augmented-equipment-instance>
                    <asset-instance-identifier/>
                </operator-augmented-equipment-instance>
                <equipment-type>
                    <version>001</version>
                    <description>RADIO connected to RADIO-2A</description>
                    <model-identifier>ODU MW interface</model-identifier>
                    <part-type-identifier>GE8705-52</part-type-identifier>
                    <type-name>RADIO</type-name>
                </equipment-type>
                <operator-augmented-equipment-type>
                    <asset-type-identifier/>
                </operator-augmented-equipment-type>
                <equipment-instance>
                    <serial-number>101821829000120</serial-number>
                    <manufacture-date>1970-01-01T00:00:00.0+00:00</manufacture-date>
                    <asset-instance-identifier/>
                </equipment-instance>
                <manufacturer-properties>
                    <manufacturer-name>SIAE Microelettronica SpA</manufacturer-name>
                    <manufacturer-identifier/>
                </manufacturer-properties>
            </manufactured-thing>
        </actual-equipment>
    </equipment>
</control-construct>
 
And send the following GET request:
 

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) 

 
I get the following output:
 
<equipment xmlns="urn:onf:yang:core-model-1-4">
    <uuid>RADIO-2A</uuid>
    <actual-equipment>
        <structure>
            <category>EQUIPMENT_CATEGORY_STAND_ALONE_UNIT</category>
        </structure>
        <environmental-rating>
            <thermal-rating>
                <minimum-temperature>0</minimum-temperature>
                <maximum-temperature>100</maximum-temperature>
                <thermal-rating-name>THERMAL_RATING</thermal-rating-name>
            </thermal-rating>
            <power-rating>
                <power-rating-value>POWER_RATING_VALUE</power-rating-value>
                <power-rating-name>POWER_RATING_NAME</power-rating-name>
            </power-rating>
        </environmental-rating>
        <manufactured-thing>
            <equipment-type>
                <version>001</version>
                <description>RADIO connected to RADIO-2A</description>
                <model-identifier>ODU MW interface</model-identifier>
                <part-type-identifier>GE8705-52</part-type-identifier>
                <type-name>RADIO</type-name>
            </equipment-type>
        </manufactured-thing>
    </actual-equipment>
</equipment>
 
 
However, what I realize is that even with the fix, the solution does not take into consideration that a child with the same node name can exist in a sibling container. For example, in the above configuration, if there was a second sibling container inside 'environment-rating' container called 'thermal-rating-2' with exactly the same names for children, then the query can fail in all kind of unexpected ways. That is because the way the input parameter 'fields' is parsed and stored as an array of HashIndex, causes it to lose the relationship between parent and child. Taking the example just cited, whether a child with the name 'power-rating-value' belongs to 'thermal-rating' or 'thermal-rating-2' is not apparent after 'fields' is parsed. That loss of information leads to query failing in all sorts of ways.
 
The ultimate fix, whether as part of this bug or another, I believe has to restore that relationship for the query to succeed. I am more than happy to be proven wrong

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:

  • expanding the configuration model to add more sibling containers, and more importantly add a list in the sibling container (name). The addition of 'name' is interesting because that name is duplicated across the model, and poses a challenge in which 'name' is being fetched.
  • Test for sub-queries within sibling containers
  • Test for queries of lists within sibling containers. Check whether the key to each element of the list is printed, even when it is not specifically requested.
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.
We have the semantics captured in restconf.rfc8040.FieldsParam, but that lacks two things:

  1. binding to namespaces, it effectively need to go through a AbstractQName.bindto() transition
  2. matching against NormalizedNodes, which boils down to knowing which relative YangInstanceIdentifiers to emit

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 ]

NETCONF-820 also deals with fields parameter, but performs a slightly different transformation (I think). I do believe the YangInstanceIdentifiers produced by that code are quite close enough to what we need to solve this problem.

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.

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