|
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.
|