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.
- split to
-
YANGTOOLS-1280 Improve MutableDataTree formatting capabilities
- Confirmed