<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:15:47 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>OpenDaylight JIRA</title>
    <link>https://jira.opendaylight.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>8.20.10</version>
        <build-number>820010</build-number>
        <build-date>22-06-2022</build-date>
    </build-info>


<item>
            <title>[NETCONF-744] Read whole leaf-list using get/get-config RPC</title>
                <link>https://jira.opendaylight.org/browse/NETCONF-744</link>
                <project id="10142" key="NETCONF">netconf</project>
                    <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I tried to read whole leaf-list using plain SSH and chunking mechanism. Example (&quot;extraIpPorts&quot; is described by leaf-list):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
#528
&amp;lt;rpc xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; message-id=&lt;span class=&quot;code-quote&quot;&gt;&quot;m-291&quot;&lt;/span&gt;&amp;gt;
    &amp;lt;get&amp;gt;
        &amp;lt;filter xmlns:ns0=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; ns0:type=&lt;span class=&quot;code-quote&quot;&gt;&quot;subtree&quot;&lt;/span&gt;&amp;gt;
            &amp;lt;confdConfig xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;http:&lt;span class=&quot;code-comment&quot;&gt;//tail-f.com/ns/confd_dyncfg/1.0&quot;&lt;/span&gt;&amp;gt;
&lt;/span&gt;                &amp;lt;netconf&amp;gt;
                    &amp;lt;transport&amp;gt;
                        &amp;lt;ssh&amp;gt;
                            &amp;lt;extraIpPorts/&amp;gt;
                        &amp;lt;/ssh&amp;gt;
                    &amp;lt;/transport&amp;gt;
                &amp;lt;/netconf&amp;gt;
            &amp;lt;/confdConfig&amp;gt;
        &amp;lt;/filter&amp;gt;
    &amp;lt;/get&amp;gt;
&amp;lt;/rpc&amp;gt;
##
#304
&amp;lt;?xml version=&lt;span class=&quot;code-quote&quot;&gt;&quot;1.0&quot;&lt;/span&gt; encoding=&lt;span class=&quot;code-quote&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;?&amp;gt;
&amp;lt;rpc-reply xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; message-id=&lt;span class=&quot;code-quote&quot;&gt;&quot;m-291&quot;&lt;/span&gt;&amp;gt;&amp;lt;data&amp;gt;&amp;lt;confdConfig xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;http:&lt;span class=&quot;code-comment&quot;&gt;//tail-f.com/ns/confd_dyncfg/1.0&quot;&lt;/span&gt;&amp;gt;&amp;lt;netconf&amp;gt;&amp;lt;transport&amp;gt;&amp;lt;ssh&amp;gt;&amp;lt;extraIpPorts&amp;gt;:::2022&amp;lt;/extraIpPorts&amp;gt;&amp;lt;/ssh&amp;gt;&amp;lt;/transport&amp;gt;&amp;lt;/netconf&amp;gt;&amp;lt;/confdConfig&amp;gt;&amp;lt;/data&amp;gt;&amp;lt;/rpc-reply&amp;gt;
&lt;/span&gt;##
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Device accepted such request and successfully returned RPC response with one leaf-list entry. I also tried different request which would return whole leaf-lists with multiple entries. Everything seems to work as expected (I tested reading of leaf-list on the ConfD device).&lt;/p&gt;

&lt;p&gt;However, I cannot build the similar subtree filter using NETCONF that would point to the whole leaf-list.&lt;/p&gt;

&lt;p&gt;My attempts to build subtree filter that would point to &quot;netconf-state/capabilities/capability&quot; leaf-list (ietf-netconf-monitoring module):&lt;/p&gt;

&lt;p&gt;#1&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; YangInstanceIdentifier targetYiid = YangInstanceIdentifier.create(
 toId(NetconfState.QNAME),
 toId(Capabilities.QNAME),
 toId(QName.create(Capabilities.QNAME, &lt;span class=&quot;code-quote&quot;&gt;&quot;capability&quot;&lt;/span&gt;)));&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Built GET RPC (&apos;capability&apos; entity is skipped):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&amp;lt;rpc message-id=&lt;span class=&quot;code-quote&quot;&gt;&quot;m-0&quot;&lt;/span&gt; xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;get&amp;gt;
 &amp;lt;filter xmlns:ns0=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; ns0:type=&lt;span class=&quot;code-quote&quot;&gt;&quot;subtree&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;netconf-state xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;capabilities/&amp;gt;
 &amp;lt;/netconf-state&amp;gt;
 &amp;lt;/filter&amp;gt;
 &amp;lt;/get&amp;gt;
&amp;lt;/rpc&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;#2&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; YangInstanceIdentifier targetYiid = YangInstanceIdentifier.create(
 toId(NetconfState.QNAME),
 toId(Capabilities.QNAME),
 &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; NodeWithValue&amp;lt;&amp;gt;(QName.create(Capabilities.QNAME, &lt;span class=&quot;code-quote&quot;&gt;&quot;capability&quot;&lt;/span&gt;), &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Built GET RPC (&apos;capability&apos; entity is again skipped):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&amp;lt;rpc message-id=&lt;span class=&quot;code-quote&quot;&gt;&quot;m-0&quot;&lt;/span&gt; xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;get&amp;gt;
 &amp;lt;filter xmlns:ns0=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; ns0:type=&lt;span class=&quot;code-quote&quot;&gt;&quot;subtree&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;netconf-state xmlns=&lt;span class=&quot;code-quote&quot;&gt;&quot;urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;capabilities/&amp;gt;
 &amp;lt;/netconf-state&amp;gt;
 &amp;lt;/filter&amp;gt;
 &amp;lt;/get&amp;gt;
&amp;lt;/rpc&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;#3&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; YangInstanceIdentifier targetYiid = YangInstanceIdentifier.create(
                toId(NetconfState.QNAME),
                toId(Capabilities.QNAME),
                toId(QName.create(Capabilities.QNAME, &lt;span class=&quot;code-quote&quot;&gt;&quot;capability&quot;&lt;/span&gt;)),
                &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; NodeWithValue&amp;lt;&amp;gt;(QName.create(Capabilities.QNAME, &lt;span class=&quot;code-quote&quot;&gt;&quot;capability&quot;&lt;/span&gt;), &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Error:&#160;&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
[main] WARN org.opendaylight.netconf.util.NetconfUtil - Unable to set namespace context, falling back to setPrefix()
java.lang.UnsupportedOperationException
	at java.xml/com.sun.xml.internal.stream.writers.XMLDOMWriterImpl.setNamespaceContext(XMLDOMWriterImpl.java:158)
	at org.opendaylight.netconf.util.NetconfUtil$NamespaceSetter.forFactory(NetconfUtil.java:83)
	at org.opendaylight.netconf.util.NetconfUtil.&amp;lt;clinit&amp;gt;(NetconfUtil.java:118)
	at org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.&amp;lt;clinit&amp;gt;(NetconfMessageTransformUtil.java:121)
	at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformer.&amp;lt;clinit&amp;gt;(NetconfMessageTransformer.java:99)
	at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformerTest.getTransformer(NetconfMessageTransformerTest.java:490)
	at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformerTest.setUp(NetconfMessageTransformerTest.java:202)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:221)
	at org.opendaylight.yangtools.concepts.AbstractCodec.serialize(AbstractCodec.java:34)
	at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.serialize(XMLStreamWriterUtils.java:116)
	at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.encodeValue(XMLStreamWriterUtils.java:82)
	at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.encodeValue(XMLStreamWriterUtils.java:56)
	at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.encodeValue(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:53)
	at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.encodeValue(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:38)
	at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter.writeValue(XMLStreamNormalizedNodeStreamWriter.java:132)
	at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.scalarValue(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:161)
	at org.opendaylight.netconf.util.StreamingContext$LeafListEntry.streamToWriter(StreamingContext.java:393)
	at org.opendaylight.netconf.util.StreamingContext$AbstractComposite.streamToWriter(StreamingContext.java:167)
	at org.opendaylight.netconf.util.StreamingContext$AbstractComposite.streamToWriter(StreamingContext.java:167)
	at org.opendaylight.netconf.util.StreamingContext$AbstractComposite.streamToWriter(StreamingContext.java:167)
	at org.opendaylight.netconf.util.NetconfUtil.writeFilter(NetconfUtil.java:217)
	at org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toFilterStructure(NetconfMessageTransformUtil.java:233)
	at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformerTest.getLeafListFieldsTest(NetconfMessageTransformerTest.java:1071)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Testing was done from &quot;NetconfMessageTransformerTest&quot; unit tests.&lt;/p&gt;

&lt;p&gt;My questions:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;From the quick analysis, I think the source of the issue is in the SchemaAwareXMLStreamNormalizedNodeStreamWriter YANG-TOOLs class that just skips the empty leaf-list and doesn&apos;t serialize it. Is behaviour of SchemaAwareXMLStreamNormalizedNodeStreamWriter correct?&lt;/li&gt;
	&lt;li&gt;Why reading of whole leaf-list using NETCONF is not allowed, if it is it is supported by devices? Is there some RFC sheet that denies such scenario?&lt;/li&gt;
	&lt;li&gt;Where to fix this bug (if it is a bug)? Possible solution: creation of custom XML stream writer that also serializes empty leaf-lists and will be used only by NETCONF.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Regards,&lt;br/&gt;
 Jaroslav&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</description>
                <environment></environment>
        <key id="33601">NETCONF-744</key>
            <summary>Read whole leaf-list using get/get-config RPC</summary>
                <type id="10104" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10303&amp;avatarType=issuetype">Bug</type>
                                            <priority id="2" iconUrl="https://jira.opendaylight.org/images/icons/priorities/critical.svg">High</priority>
                        <status id="5" iconUrl="https://jira.opendaylight.org/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Done</resolution>
                                        <assignee username="jaro0149odl">Jaroslav T&#243;th</assignee>
                                    <reporter username="jaro0149odl">Jaroslav T&#243;th</reporter>
                        <labels>
                    </labels>
                <created>Thu, 26 Nov 2020 08:15:50 +0000</created>
                <updated>Wed, 12 May 2021 07:39:33 +0000</updated>
                            <resolved>Wed, 12 May 2021 07:39:33 +0000</resolved>
                                    <version>Aluminium</version>
                                    <fixVersion>Aluminium SR4</fixVersion>
                    <fixVersion>1.13.2</fixVersion>
                                    <component>netconf</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>1</watches>
                                                                                                                        <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_11400" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i03wfz:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                </customfields>
    </item>
</channel>
</rss>