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

Restconf Broker Facade is not robust to handle unsuccessful parent merges for Netconf Devices.

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • None
    • Lithium
    • restconf
    • None
    • Operating System: All
      Platform: All

    • 4948

      When we issue a PUT/POST request to a mounted Netconf device org.opendaylight.controller.sal.restconf.impl.BrokerFacade makes calls to the method ensureParentsByMerge. While this is fine for MD-SAL data store, it is up to the Netconf implementation of the real devices how the handle it. We have seen a couple of cases where the code is trying to create empty List/Container nodes and the device has thrown exceptions. We are not sure why we even have to make this method call to mounted devices. We can make this module robust enough such that this can handle MD-SAL data stores as well as NETCONF devices.

      ==========Exception========

      URL for PUT:

      http://10.18.162.121:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/vyatta/yang-ext:mount/vyatta-interfaces-v1:interfaces/vyatta-interfaces-loopback-v1:loopback/lo5/

      2016-01-11 13:17:30,171 | WARN | oupCloseable-5-2 | NetconfDeviceCommunicator | 223 - org.opendaylight.controller.sal-netconf-connector - 1.2.3.Lithium-SR3 | RemoteDevice

      {vyatta}: Error reply from remote device, request: <rpc message-id="m-1" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
      <edit-config>
      <target>
      <candidate/>
      </target>
      <error-option>rollback-on-error</error-option>
      <config>
      <interfaces xmlns="urn:vyatta.com:mgmt:vyatta-interfaces:1"/>
      </config>
      </edit-config>
      </rpc>
      , response: <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="m-1">
      <rpc-error>
      <error-type>application</error-type>
      <error-tag>operation-failed</error-tag>
      <error-severity>error</error-severity>
      <error-path>/interfaces</error-path>
      <error-message>Configuration path: [interfaces] is not valid

      Node requires a child
      </error-message>
      </rpc-error>
      </rpc-reply>

      NetconfDocumentedException{message=Configuration path: [interfaces] is not valid Node requires a child , errorType=application, errorTag=operation_failed, errorSeverity=error, errorInfo=null}
      at org.opendaylight.controller.netconf.api.NetconfDocumentedException.fromXMLDocument(NetconfDocumentedException.java:243)
      at org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.checkSuccessReply(NetconfMessageTransformUtil.java:200)[223:org.opendaylight.controller.sal-netconf-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCommunicator.processMessage(NetconfDeviceCommunicator.java:258)[223:org.opendaylight.controller.sal-netconf-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCommunicator.onMessage(NetconfDeviceCommunicator.java:213)[223:org.opendaylight.controller.sal-netconf-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCommunicator.onMessage(NetconfDeviceCommunicator.java:46)[223:org.opendaylight.controller.sal-netconf-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.netconf.nettyutil.AbstractNetconfSession.handleMessage(AbstractNetconfSession.java:61)[66:org.opendaylight.controller.netconf-netty-util:0.3.3.Lithium-SR3]
      at org.opendaylight.controller.netconf.nettyutil.AbstractNetconfSession.handleMessage(AbstractNetconfSession.java:32)[66:org.opendaylight.controller.netconf-netty-util:0.3.3.Lithium-SR3]
      at org.opendaylight.protocol.framework.AbstractProtocolSession.channelRead0(AbstractProtocolSession.java:53)[52:org.opendaylight.controller.protocol-framework:0.6.3.Lithium-SR3]
      at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)[49:io.netty.transport:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)[49:io.netty.transport:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:324)[49:io.netty.transport:4.0.26.Final]
      at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:242)[71:io.netty.codec:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)[49:io.netty.transport:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:324)[49:io.netty.transport:4.0.26.Final]
      at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:242)[71:io.netty.codec:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)[49:io.netty.transport:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:32)[49:io.netty.transport:4.0.26.Final]
      at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:329)[49:io.netty.transport:4.0.26.Final]
      at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)[50:io.netty.common:4.0.26.Final]
      at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)[49:io.netty.transport:4.0.26.Final]
      at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)[50:io.netty.common:4.0.26.Final]
      at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)[50:io.netty.common:4.0.26.Final]
      at java.lang.Thread.run(Thread.java:745)[:1.7.0_79]
      2016-01-11 13:17:30,175 | WARN | oupCloseable-5-2 | NetconfRpcFutureCallback | 223 - org.opendaylight.controller.sal-netconf-connector - 1.2.3.Lithium-SR3 | RemoteDevice{vyatta}

      : Edit candidate invoked unsuccessfully: [RpcError [message=Configuration path: [interfaces] is not valid

      Node requires a child
      , severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=, cause=null]]
      2016-01-11 13:17:30,176 | WARN | qtp1434265086-40 | WriteCandidateTx | 223 - org.opendaylight.controller.sal-netconf-connector - 1.2.3.Lithium-SR3 | RemoteDevice

      {vyatta}: Error merge data to (candidate)/(urn:vyatta.com:mgmt:vyatta-interfaces:1?revision=2015-08-05)interfaces, data: ImmutableContainerNode{nodeIdentifier=(urn:vyatta.com:mgmt:vyatta-interfaces:1?revision=2015-08-05)interfaces, value=[ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier{childNames=[(urn:vyatta.com:mgmt:vyatta-interfaces-loopback:1?revision=2015-08-14)loopback]}, value=[ImmutableMapNode{nodeIdentifier=(urn:vyatta.com:mgmt:vyatta-interfaces-loopback:1?revision=2015-08-14)loopback, value=[]}]}], attributes={}}, canceling
      NetconfDocumentedException{message=RemoteDevice{vyatta}

      : Edit candidate failed: [RpcError [message=Configuration path: [interfaces] is not valid

      Node requires a child
      , severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=, cause=null]], errorType=application, errorTag=operation_failed, errorSeverity=warning, errorInfo={}}
      at org.opendaylight.controller.sal.connect.netconf.sal.tx.AbstractWriteTx.invokeBlocking(AbstractWriteTx.java:61)
      at org.opendaylight.controller.sal.connect.netconf.sal.tx.WriteCandidateTx.editConfig(WriteCandidateTx.java:186)
      at org.opendaylight.controller.sal.connect.netconf.sal.tx.AbstractWriteTx.merge(AbstractWriteTx.java:125)
      at org.opendaylight.controller.sal.connect.netconf.sal.tx.ReadWriteTx.merge(ReadWriteTx.java:51)
      at org.opendaylight.controller.sal.restconf.impl.BrokerFacade.ensureParentsByMerge(BrokerFacade.java:300)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.restconf.impl.BrokerFacade.putDataViaTransaction(BrokerFacade.java:255)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.restconf.impl.BrokerFacade.commitConfigurationDataPut(BrokerFacade.java:121)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.restconf.impl.RestconfImpl.updateConfigurationData(RestconfImpl.java:718)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.restconf.impl.StatisticsRestconfServiceWrapper.updateConfigurationData(StatisticsRestconfServiceWrapper.java:133)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at org.opendaylight.controller.sal.rest.impl.RestconfCompositeWrapper.updateConfigurationData(RestconfCompositeWrapper.java:74)[227:org.opendaylight.controller.sal-rest-connector:1.2.3.Lithium-SR3]
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.7.0_79]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_79]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_79]
      at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_79]
      at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.uri.rules.ResourceObjectRule.accept(ResourceObjectRule.java:100)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)[194:com.sun.jersey.jersey-server:1.17.0]
      at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)[192:com.sun.jersey.servlet:1.17.0]
      at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)[192:com.sun.jersey.servlet:1.17.0]
      at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)[192:com.sun.jersey.servlet:1.17.0]
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[116:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0.0]
      at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:247)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:210)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:82)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:256)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:69)[131:org.ops4j.pax.web.pax-web-jetty:3.1.4]
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:240)[131:org.ops4j.pax.web.pax-web-jetty:3.1.4]
      at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:75)[131:org.ops4j.pax.web.pax-web-jetty:3.1.4]
      at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.Server.handle(Server.java:370)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[122:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
      at java.lang.Thread.run(Thread.java:745)[:1.7.0_79]
      ===================

            tpantelis Tom Pantelis
            bvaradar@brocade.com Balaji Varadaraju
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: