<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 19:54:38 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>[CONTROLLER-1080] DataNormalizer fails to normalize the RestConf response data for augmentation of node that has only one child</title>
                <link>https://jira.opendaylight.org/browse/CONTROLLER-1080</link>
                <project id="10113" key="CONTROLLER">controller</project>
                    <description>&lt;p&gt;Having two yang files as follows:&lt;/p&gt;

&lt;p&gt;test-security.yang&lt;/p&gt;

&lt;p&gt;module test-security {&lt;br/&gt;
    namespace &quot;urn:test.com:mgmt:test-security&quot;;&lt;br/&gt;
    prefix security;&lt;/p&gt;

&lt;p&gt;    organization &quot;Test&quot;;&lt;br/&gt;
    contact&lt;br/&gt;
         &quot;Test&quot;&lt;br/&gt;
    revision 2014-12-28 &lt;/p&gt;
{
        description &quot;First version&quot;;
    }&lt;br/&gt;
&lt;br/&gt;
    container security {
        presence &quot;true&quot;;
    }&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
test-security-vpn-ipsec {&lt;br/&gt;
    namespace &quot;urn:test.com:mgmt:test-security-vpn-ipsec&quot;;&lt;br/&gt;
    prefix security-vpn-ipsec;&lt;br/&gt;
&lt;br/&gt;
    import test-security {
        prefix security;
    }&lt;br/&gt;
&lt;br/&gt;
    organization &quot;Test&quot;;&lt;br/&gt;
    contact&lt;br/&gt;
         &quot;Test&quot;&lt;br/&gt;
    revision 2014-12-28 {        description &quot;First version&quot;;    }

&lt;p&gt;    augment /security:security {&lt;br/&gt;
        container vpn {&lt;br/&gt;
            presence &quot;true&quot;;&lt;br/&gt;
            container ipsec {&lt;br/&gt;
                presence &quot;true&quot;;&lt;br/&gt;
                leaf auto-update {&lt;br/&gt;
                    type uint32 &lt;/p&gt;
{
                         range 30..65535 
                    }
&lt;p&gt;                }&lt;br/&gt;
            }&lt;br/&gt;
        }&lt;br/&gt;
     }&lt;br/&gt;
}&lt;/p&gt;


&lt;p&gt;Sending a GET request to RESTCONF URL:&lt;br/&gt;
&lt;a href=&quot;http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/[MOUNTED_RESOURCE]/yang-ext:mount/test-security:security/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/[MOUNTED_RESOURCE]/yang-ext:mount/test-security:security/&lt;/a&gt;     &lt;/p&gt;

&lt;p&gt;The data comes back but DataNormalizer fails to normalize the response with the following error:&lt;/p&gt;

&lt;p&gt;2014-12-28 15:00:42 PST [org.apache.catalina.core.ContainerBase.&lt;span class=&quot;error&quot;&gt;&amp;#91;Catalina&amp;#93;&lt;/span&gt;.&lt;span class=&quot;error&quot;&gt;&amp;#91;localhost&amp;#93;&lt;/span&gt;.&lt;span class=&quot;error&quot;&gt;&amp;#91;/restconf&amp;#93;&lt;/span&gt;.&lt;span class=&quot;error&quot;&gt;&amp;#91;JAXRSRestconf&amp;#93;&lt;/span&gt;] SEVERE org.apache.catalina.core.StandardWrapperValve invoke Servlet.service() for servlet &lt;span class=&quot;error&quot;&gt;&amp;#91;JAXRSRestconf&amp;#93;&lt;/span&gt; in context with path &lt;span class=&quot;error&quot;&gt;&amp;#91;/restconf&amp;#93;&lt;/span&gt; threw exception&lt;br/&gt;
java.lang.IllegalStateException: Unknown augmentation node detected, identified by: &lt;span class=&quot;error&quot;&gt;&amp;#91;(urn:test.com:mgmt:test-security-vpn-ipsec?revision=2014-12-28)vpn&amp;#93;&lt;/span&gt;, in: SchemaContextImpl&lt;/p&gt;
{modules=[ModuleImpl[name=ietf-yang-types, namespace=urn:ietf:params:xml:ns:yang:ietf-yang-types, revision=Mon Jul 15 00:00:00 PDT 2013, prefix=yang, yangVersion=1], ModuleImpl[name=ietf-yang-types, namespace=urn:ietf:params:xml:ns:yang:ietf-yang-types, revision=Fri Sep 24 00:00:00 PDT 2010, prefix=yang, yangVersion=1], ModuleImpl[name=ietf-inet-types, namespace=urn:ietf:params:xml:ns:yang:ietf-inet-types, revision=Mon Jul 15 00:00:00 PDT 2013, prefix=inet, yangVersion=1], ModuleImpl[name=ietf-netconf-monitoring, namespace=urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring, revision=Mon Oct 04 00:00:00 PDT 2010, prefix=ncm, yangVersion=1], ModuleImpl[name=test-security, namespace=urn:test.com:mgmt:test-security, revision=Sun Dec 28 00:00:00 PDT 2014, prefix=security, yangVersion=1], ModuleImpl[name=test-security-vpn-ipsec, namespace=urn:test.com:mgmt:test-security-vpn-ipsec, revision=Sun Dec 28 00:00:00 PDT 2014, prefix=security-vpn-ipsec, yangVersion=1], ModuleImpl[name=ietf-inet-types, namespace=urn:ietf:params:xml:ns:yang:ietf-inet-types, revision=Fri Sep 24 00:00:00 PDT 2010, prefix=inet, yangVersion=1]]}
&lt;p&gt;at com.google.common.base.Preconditions.checkState(Preconditions.java:176)&lt;br/&gt;
at org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils.findSchemaForAugment(SchemaUtils.java:69)&lt;br/&gt;
at org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker.startAugmentationNode(SchemaTracker.java:181)&lt;br/&gt;
at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter.startAugmentationNode(JSONNormalizedNodeStreamWriter.java:207)&lt;br/&gt;
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:232)&lt;br/&gt;
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:109)&lt;br/&gt;
at org.opendaylight.controller.sal.rest.impl.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:91)&lt;br/&gt;
at org.opendaylight.controller.sal.rest.impl.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:43)&lt;br/&gt;
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)&lt;br/&gt;
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479)&lt;br/&gt;
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)&lt;br/&gt;
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)&lt;br/&gt;
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)&lt;br/&gt;
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)&lt;br/&gt;
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)&lt;br/&gt;
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)&lt;br/&gt;
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)&lt;br/&gt;
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)&lt;br/&gt;
at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:247)&lt;br/&gt;
at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:210)&lt;br/&gt;
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)&lt;br/&gt;
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)&lt;br/&gt;
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)&lt;br/&gt;
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)&lt;br/&gt;
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)&lt;br/&gt;
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)&lt;br/&gt;
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)&lt;br/&gt;
at org.opendaylight.controller.filtervalve.cors.FilterValve$1.doFilter(FilterValve.java:53)&lt;br/&gt;
at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:439)&lt;br/&gt;
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:178)&lt;br/&gt;
at org.opendaylight.controller.filtervalve.cors.model.FilterProcessor$1.doFilter(FilterProcessor.java:61)&lt;br/&gt;
at org.opendaylight.controller.filtervalve.cors.model.FilterProcessor.process(FilterProcessor.java:66)&lt;br/&gt;
at org.opendaylight.controller.filtervalve.cors.FilterValve.invoke(FilterValve.java:56)&lt;br/&gt;
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)&lt;br/&gt;
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:312)&lt;br/&gt;
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)&lt;br/&gt;
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)&lt;br/&gt;
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)&lt;br/&gt;
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)&lt;br/&gt;
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)&lt;br/&gt;
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)&lt;br/&gt;
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)&lt;br/&gt;
at java.lang.Thread.run(Unknown Source)&lt;/p&gt;


&lt;p&gt;The REASON OF FAILURE is that in toNormalized function, there is a checking for the single child for the container security as follows:&lt;/p&gt;

&lt;p&gt;        if (legacyData.getValue().size() == 1) {&lt;br/&gt;
            final DataNormalizationOperation&amp;lt;?&amp;gt; potentialOp;&lt;/p&gt;

&lt;p&gt;            try {&lt;br/&gt;
                final QName childType = legacyData.getValue().get(0).getNodeType();&lt;br/&gt;
                potentialOp = currentOp.getChild(childType);&lt;/p&gt;

&lt;p&gt;                LOG.trace(&quot;DataNormalizer.toNormalized potentialOp: {}, childType: {}\n&quot;, potentialOp, childType);&lt;/p&gt;

&lt;p&gt;            } catch (DataNormalizationException e) &lt;/p&gt;
{
                throw new IllegalArgumentException(String.format(&quot;Failed to get child operation for %s&quot;, legacyData), e);
            }

&lt;p&gt;            if (potentialOp.getIdentifier() instanceof AugmentationIdentifier) {&lt;br/&gt;
                currentOp = potentialOp;&lt;br/&gt;
                normalizedPath = normalizedPath.node(potentialOp.getIdentifier());&lt;/p&gt;

&lt;p&gt;                LOG.trace(&quot;DataNormalizer.toNormalized GOT AugmentationIdentifier, currentOp: {}, normalizedPath: {}&quot;, currentOp, normalizedPath);&lt;br/&gt;
            }&lt;br/&gt;
        }&lt;/p&gt;


&lt;p&gt;We note that if we also have one more yang file that augments test-security as follows:&lt;/p&gt;

&lt;p&gt;test-security-l2tp {&lt;br/&gt;
    namespace &quot;urn:test.com:mgmt:test-security-l2tp&quot;;&lt;br/&gt;
    prefix security-l2tp;&lt;/p&gt;

&lt;p&gt;    import test-security &lt;/p&gt;
{
        prefix security;
    }

&lt;p&gt;    organization &quot;Test&quot;;&lt;br/&gt;
    contact&lt;br/&gt;
         &quot;Test&quot;&lt;br/&gt;
    revision 2014-12-28 &lt;/p&gt;
{
        description &quot;First version&quot;;
    }

&lt;p&gt;    augment /security:security {&lt;br/&gt;
        container l2tp {&lt;br/&gt;
            presence &quot;true&quot;;&lt;br/&gt;
            container remote-access {&lt;br/&gt;
                presence &quot;true&quot;;&lt;br/&gt;
                container users {&lt;br/&gt;
                    list username {&lt;br/&gt;
                        key &quot;name&quot;;&lt;br/&gt;
                        leaf name &lt;/p&gt;
{
                            type string;
                        }&lt;br/&gt;
                        leaf password {                            type string;                        }
&lt;p&gt;                    }&lt;br/&gt;
                }&lt;br/&gt;
            }&lt;br/&gt;
        }&lt;br/&gt;
     }&lt;br/&gt;
}&lt;/p&gt;

&lt;p&gt;then this block of checking is not executed, and therefore, it is normalized successfully.&lt;/p&gt;


&lt;p&gt;We also note that if we comment this block of checking then the normalization proceeds successfully for single child container augmentation.&lt;/p&gt;


&lt;p&gt;Suggestion to fix: remove single node checking.&lt;/p&gt;</description>
                <environment>&lt;p&gt;Operating System: All&lt;br/&gt;
Platform: All&lt;/p&gt;</environment>
        <key id="25634">CONTROLLER-1080</key>
            <summary>DataNormalizer fails to normalize the RestConf response data for augmentation of node that has only one child</summary>
                <type id="10104" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10303&amp;avatarType=issuetype">Bug</type>
                                                <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="kkoushik@vyatta.com">Kiran Koushik</assignee>
                                    <reporter username="mr.loipan@gmail.com">Loi Pan</reporter>
                        <labels>
                    </labels>
                <created>Mon, 29 Dec 2014 21:39:03 +0000</created>
                <updated>Thu, 19 Mar 2015 14:02:49 +0000</updated>
                            <resolved>Thu, 19 Mar 2015 14:02:49 +0000</resolved>
                                    <version>Helium</version>
                                                    <component>mdsal</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>4</watches>
                                                                                                                <comments>
                            <comment id="49996" author="tpantelis" created="Fri, 30 Jan 2015 20:40:06 +0000"  >&lt;p&gt;Gerrit: &lt;a href=&quot;https://git.opendaylight.org/gerrit/14525&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://git.opendaylight.org/gerrit/14525&lt;/a&gt;&lt;/p&gt;</comment>
                    </comments>
                    <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_10208" key="com.atlassian.jira.plugin.system.customfieldtypes:textfield">
                        <customfieldname>External issue ID</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2538</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10201" key="com.atlassian.jira.plugin.system.customfieldtypes:url">
                        <customfieldname>External issue URL</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[https://bugs.opendaylight.org/show_bug.cgi?id=2538]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10206" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Issue Type</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10300"><![CDATA[Bug]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10204" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>ODL SR Target Milestone</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10380"><![CDATA[Lithium-M5]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                    <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i02od3:</customfieldvalue>

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