[YANGTOOLS-1026] Choice/Case children conflict does not seem to be detected Created: 09/Sep/19  Updated: 19/Oct/19  Resolved: 08/Oct/19

Status: Resolved
Project: yangtools
Component/s: parser
Affects Version/s: 3.0.4
Fix Version/s: None

Type: Bug Priority: Medium
Reporter: Ajay Lele Assignee: Unassigned
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
duplicates YANGTOOLS-857 YANG parser should honor RFC7950 sect... Resolved
Relates
relates to YANGTOOLS-883 YANG parser fails to detect duplicate... Resolved
relates to BGPCEP-880 Fix usage of duplicate child element ... Resolved

 Description   

In bgpcep project, trying to write data to application-rib results in data incorrectly getting rejected. Steps are as below:

  1. Bring up controller and feature:install odl-bgpcep-bgp
  2. PUT below payload to http://controller-ip:restconf-port/restconf/config/bgp-rib:application-rib/127.0.0.1
{
    "application-rib": [
        {
            "id": "127.0.0.1",
            "tables": [
            {
                "afi": "bgp-linkstate:linkstate-address-family",
                "safi": "bgp-linkstate:linkstate-subsequent-address-family",
                "bgp-linkstate:linkstate-routes": {
                    "linkstate-route": [
                        {
                            "path-id": 0,
                            "route-key": "[0, 3, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 26, 2, 0, 0, 4, 0, 0, 0, 100, 2, 1, 0, 4, 0, 0, 0, 0, 2, 3, 0, 6, 0, 1, 0, 0, 0, 5, 1, 9, 0, 5, 32, -64, -88, -2, 5]",
                            "advertising-node-descriptors": {
                                "as-number": 100,
                                "domain-id": 0,
                                "isis-node": {
                                    "iso-system-id": "AAEAAAAF"
                                }
                            },
                            "prefix-descriptors": {
                                "ip-reachability-information": "192.168.254.5/32"
                            },
                            "attributes": {
                                "ipv4-next-hop": {
                                    "global": "192.168.122.136"
                                },
                                "prefix-attributes": {
                                    "prefix-metric": 10,
                                    "sr-prefix": {
                                        "local-label": 1001,
                                        "no-php": false,
                                        "readvertisement": false,
                                        "node-sid": true,
                                        "explicit-null": false,
                                        "algorithm": "shortest-path-first"
                                    }
                                },
                                "origin": {
                                    "value": "igp"
                                },
                                "as-path": {},
                                "local-pref": {
                                    "pref": 100
                                }
                            },
                            "identifier": 0,
                            "protocol-id": "isis-level2"
                        }
                    ]
                },
                "attributes": {
                    "uptodate": true
                }
            }
        ]
        }
    ]
} 

3. This results in below error

 

{    "errors": {        "error": [            {                "error-type": "application",                "error-tag": "operation-failed",                "error-message": "canCommit encountered an unexpected failure",                "error-info": "Node (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2018-03-29)flags is not a valid child of (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2018-03-29)sr-prefix according to the schema."            }        ]    }} 
2019-09-08T16:37:52,148 | WARN  | opendaylight-cluster-data-akka.actor.default-dispatcher-3 | LocalThreePhaseCommitCohort      | 171 - org.opendaylight.controller.sal-distributed-datastore - 1.11.0.SNAPSHOT | Failed to prepare transaction member-1-datastore-config-fe-0-txn-15-0 on backend
org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException: Node (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2018-03-29)flags is not a valid child of (urn:opendaylight:params:xml:ns:yang:bgp-linkstate?revision=2018-03-29)sr-prefix according to the schema.
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:122) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.verifyValueChildren(AbstractNodeContainerModificationStrategy.java:120) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.fullVerifyStructure(SchemaAwareApplyOperation.java:145) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.ModifiedNode.seal(ModifiedNode.java:288) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractReadyIterator.process(AbstractReadyIterator.java:47) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeModification.ready(InMemoryDataTreeModification.java:298) ~[237:org.opendaylight.yangtools.yang-data-impl:3.0.4]
        at org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.ready(SnapshotBackedWriteTransaction.java:151) ~[196:org.opendaylight.mdsal.dom-spi:4.0.4]
        at org.opendaylight.controller.cluster.datastore.LocalTransactionFactoryImpl.onTransactionReady(LocalTransactionFactoryImpl.java:86) ~[171:org.opendaylight.controller.sal-distributed-datastore:1.11.0.SNAPSHOT]
        at org.opendaylight.controller.cluster.datastore.LocalTransactionContext.ready(LocalTransactionContext.java:82) ~[171:org.opendaylight.controller.sal-distributed-datastore:1.11.0.SNAPSHOT] 

 

Models in question are below and data seem valid as per those:

https://github.com/opendaylight/bgpcep/blob/master/bgp/extensions/linkstate/src/main/yang/bgp-linkstate.yang#L730

https://github.com/opendaylight/bgpcep/blob/master/bgp/extensions/linkstate/src/main/yang/bgp-segment-routing.yang#L153

 



 Comments   
Comment by Ajay Lele [ 13/Sep/19 ]

From [0], the grouping prefix-flags is duplicated in isis and ospf case and it is clearly in violation of Yang spec [1]. I will push a patch to fix the model on bgpcep side, but keeping this ticket open to see if this violation can be detected and error reported while generating java classes from the yang file

The identifiers of all these child nodes MUST be unique within all cases in a choice 

[0] https://github.com/opendaylight/bgpcep/blob/master/bgp/extensions/linkstate/src/main/yang/bgp-segment-routing.yang#L153

[1] https://tools.ietf.org/html/rfc7950#section-7.9.2

Comment by Robert Varga [ 16/Sep/19 ]

ajayslele thanks for tracking this down. We should be catching these, but we did not do that due to Config Subsystem having a wrong structure. I thought this was already fixed once CSS went away. I will dig around to see what happened.

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