Uploaded image for project: 'yangtools'
  1. yangtools
  2. YANGTOOLS-1203

Improve NormalizedNode formatting capabilities

XMLWordPrintable

    • Icon: Improvement Improvement
    • Resolution: Done
    • Icon: High High
    • 7.0.0
    • None
    • data-impl

      In case of data tree operation errors we end up dumping the NormalizedNode involved in the operation this way:

      [pool-3-thread-5] ERROR org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction - Tx: OPER-34, failed to write /(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib/rib/rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]/loc-rib/tables/tables[{(urn:ope
      ndaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-fam
      ily}]/(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-routes/ipv4-route/ipv4-route[{(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id=1, (urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key=1.1.1.1/32}]:ImmutableMapEntryNode{identifier=(urn:opend
      aylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-route[{(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id=1, (urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key=1.1.1.1/32}], value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet
      ?revision=2018-03-29)prefix, value=1.1.1.1/32}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)attributes, value=[ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)origin, value=[ImmutableLeafNode{identifier=(urn:
      opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)value, value=igp}]}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)multi-exit-disc, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)med, value=0}]}
      , ImmutableChoiceNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)c-next-hop, value=[ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-next-hop, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?r
      evision=2018-03-29)global, value=2.2.2.2}]}]}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)local-pref, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)pref, value=100}]}, ImmutableContainerNode{identifier=(
      urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)as-path, value=[]}]}, ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id, value=1}, ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key, value=1.1
      .1.1/32}]} in MutableDataTree [modification=ModifiedNode{identifier=(urn:ietf:params:xml:ns:netconf:base:1.0)data, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp
      -rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib[{(urn:
      opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}], operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:
      yang:bgp-rib?revision=2018-03-29)loc-rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)loc-rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?
      revision=2018-03-29)tables, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:para
      ms:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}]=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi
      =(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}], operation=NONE}}}}}}}}}}}}}]
      
      org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException: Child /(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib/rib/rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]/loc-rib/tables/tables[{(urn:opendaylight:params:xml:ns:yang:b
      gp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}]/(urn:opendaylight:params
      :xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-routes is not present in schema tree.
      
          at org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeModification.resolveModificationFor(InMemoryDataTreeModification.java:182)
      
          at org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeModification.write(InMemoryDataTreeModification.java:95)
      
          at org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.write(SnapshotBackedWriteTransaction.java:72)
      
          at org.opendaylight.mdsal.dom.broker.DOMForwardedWriteTransaction.put(DOMForwardedWriteTransaction.java:87)
      
          at org.opendaylight.mdsal.dom.spi.ForwardingDOMDataReadWriteTransaction.put(ForwardingDOMDataReadWriteTransaction.java:48)
      
          at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.updateLocRib(LocRibWriter.java:372)
      
          at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.walkThrough(LocRibWriter.java:344)
      
          at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.onDataTreeChanged(LocRibWriter.java:216)
      
          at org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMStoreTreeChangePublisher.lambda$new$0(InMemoryDOMStoreTreeChangePublisher.java:43)
      
          at org.opendaylight.yangtools.util.concurrent.AbstractQueuedNotificationManager.executeBatch(AbstractQueuedNotificationManager.java:88)
      
          at org.opendaylight.yangtools.util.concurrent.AbstractBatchingExecutor$DispatcherTask.invokeWorker(AbstractBatchingExecutor.java:305)
      
          at org.opendaylight.yangtools.util.concurrent.AbstractBatchingExecutor$DispatcherTask.run(AbstractBatchingExecutor.java:292)
      
          at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
      
          at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
      
          at java.base/java.lang.Thread.run(Thread.java:834)
      
      
      

      which does contain a lot of information, but it is in a very unfriendly format.

      Improve NormalizedNode with:

      interface NormalizedNode {
         Supplier<String> prettyTree();
      }
      

      which will return a memoizing supplier:

      final class NormalizedNodePrettyTree implements Supplier<String> {
         private @Nullable String str;
      
          // Lazy init, etc.
         
          @Override
          public String toString() {
              return get();
          }
      }

      The resulting string should be very similar to what NormalizedNodes.toStringTree() does, except it needs to print augmentations (as a list of single-namespace nodes) and omit namespaces only when unnecessary.

            ivanhrasko Ivan Hrasko
            rovarga Robert Varga
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: