[CONTROLLER-1080] DataNormalizer fails to normalize the RestConf response data for augmentation of node that has only one child Created: 29/Dec/14  Updated: 19/Mar/15  Resolved: 19/Mar/15

Status: Resolved
Project: controller
Component/s: mdsal
Affects Version/s: Helium
Fix Version/s: None

Type: Bug
Reporter: Loi Pan Assignee: Kiran Koushik
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


External issue ID: 2538

 Description   

Having two yang files as follows:

test-security.yang

module test-security {
namespace "urn:test.com:mgmt:test-security";
prefix security;

organization "Test";
contact
"Test"
revision 2014-12-28

{ description "First version"; }

container security { presence "true"; }
}

test-security-vpn-ipsec {
namespace "urn:test.com:mgmt:test-security-vpn-ipsec";
prefix security-vpn-ipsec;

import test-security { prefix security; }

organization "Test";
contact
"Test"
revision 2014-12-28 { description "First version"; }

augment /security:security {
container vpn {
presence "true";
container ipsec {
presence "true";
leaf auto-update {
type uint32

{ range 30..65535 }

}
}
}
}
}

Sending a GET request to RESTCONF URL:
http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/[MOUNTED_RESOURCE]/yang-ext:mount/test-security:security/

The data comes back but DataNormalizer fails to normalize the response with the following error:

2014-12-28 15:00:42 PST [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/restconf].[JAXRSRestconf]] SEVERE org.apache.catalina.core.StandardWrapperValve invoke Servlet.service() for servlet [JAXRSRestconf] in context with path [/restconf] threw exception
java.lang.IllegalStateException: Unknown augmentation node detected, identified by: [(urn:test.com:mgmt:test-security-vpn-ipsec?revision=2014-12-28)vpn], in: SchemaContextImpl

{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]]}

at com.google.common.base.Preconditions.checkState(Preconditions.java:176)
at org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils.findSchemaForAugment(SchemaUtils.java:69)
at org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker.startAugmentationNode(SchemaTracker.java:181)
at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter.startAugmentationNode(JSONNormalizedNodeStreamWriter.java:207)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:232)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:109)
at org.opendaylight.controller.sal.rest.impl.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:91)
at org.opendaylight.controller.sal.rest.impl.NormalizedNodeJsonBodyWriter.writeTo(NormalizedNodeJsonBodyWriter.java:43)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:247)
at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:210)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.opendaylight.controller.filtervalve.cors.FilterValve$1.doFilter(FilterValve.java:53)
at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:439)
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:178)
at org.opendaylight.controller.filtervalve.cors.model.FilterProcessor$1.doFilter(FilterProcessor.java:61)
at org.opendaylight.controller.filtervalve.cors.model.FilterProcessor.process(FilterProcessor.java:66)
at org.opendaylight.controller.filtervalve.cors.FilterValve.invoke(FilterValve.java:56)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:312)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

The REASON OF FAILURE is that in toNormalized function, there is a checking for the single child for the container security as follows:

if (legacyData.getValue().size() == 1) {
final DataNormalizationOperation<?> potentialOp;

try {
final QName childType = legacyData.getValue().get(0).getNodeType();
potentialOp = currentOp.getChild(childType);

LOG.trace("DataNormalizer.toNormalized potentialOp: {}, childType: {}\n", potentialOp, childType);

} catch (DataNormalizationException e)

{ throw new IllegalArgumentException(String.format("Failed to get child operation for %s", legacyData), e); }

if (potentialOp.getIdentifier() instanceof AugmentationIdentifier) {
currentOp = potentialOp;
normalizedPath = normalizedPath.node(potentialOp.getIdentifier());

LOG.trace("DataNormalizer.toNormalized GOT AugmentationIdentifier, currentOp: {}, normalizedPath: {}", currentOp, normalizedPath);
}
}

We note that if we also have one more yang file that augments test-security as follows:

test-security-l2tp {
namespace "urn:test.com:mgmt:test-security-l2tp";
prefix security-l2tp;

import test-security

{ prefix security; }

organization "Test";
contact
"Test"
revision 2014-12-28

{ description "First version"; }

augment /security:security {
container l2tp {
presence "true";
container remote-access {
presence "true";
container users {
list username {
key "name";
leaf name

{ type string; }
leaf password { type string; }

}
}
}
}
}
}

then this block of checking is not executed, and therefore, it is normalized successfully.

We also note that if we comment this block of checking then the normalization proceeds successfully for single child container augmentation.

Suggestion to fix: remove single node checking.



 Comments   
Comment by Tom Pantelis [ 30/Jan/15 ]

Gerrit: https://git.opendaylight.org/gerrit/14525

Generated at Wed Feb 07 19:54:38 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.