Details
-
Bug
-
Status: Resolved
-
Resolution: Done
-
Helium
-
None
-
None
-
Operating System: All
Platform: All
-
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
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
}
}
}
}
}
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
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
augment /security:security {
container l2tp {
presence "true";
container remote-access {
presence "true";
container users {
list username {
key "name";
leaf name
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.