Uploaded image for project: 'controller'
  1. controller
  2. CONTROLLER-1080

DataNormalizer fails to normalize the RestConf response data for augmentation of node that has only one child

    XMLWordPrintable

Details

    • Bug
    • Status: Resolved
    • Resolution: Done
    • Helium
    • None
    • mdsal
    • 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

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

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            kkoushik@vyatta.com Kiran Koushik
            mr.loipan@gmail.com Loi Pan
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: