[YANGTOOLS-1203] Improve NormalizedNode formatting capabilities Created: 01/Jan/21  Updated: 25/Apr/21  Resolved: 25/Apr/21

Status: Resolved
Project: yangtools
Component/s: data-impl
Affects Version/s: None
Fix Version/s: 7.0.0

Type: Improvement Priority: High
Reporter: Robert Varga Assignee: Ivan Hrasko
Resolution: Done Votes: 0
Labels: pt
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Issue split
split to YANGTOOLS-1280 Improve MutableDataTree formatting ca... Confirmed

 Description   

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.



 Comments   
Comment by Robert Varga [ 01/Jan/21 ]

The NormalizedNode portion should roughly follow this pattern:

ImmutableMapEntryNode{
    identifier=(urn:opendaylight: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?revision=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}]}

but improve on naming (mapEntry instead of ImmutableMapEntry) and namespace compression (i.e. inherit from parent, including predicate names).

Comment by Robert Varga [ 02/Jan/21 ]

While we're a it, the MutableDataTree portion should roughly follow this pattern:

 

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: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}]=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}}}}}}}}}}}}}]

but obviously needs to deal with namespace compression.

 

 

Generated at Wed Feb 07 20:55:28 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.