[YANGTOOLS-1481] Fail to parse a list with unique statement when unsupported Created: 31/Jan/23 Updated: 14/Feb/23 Resolved: 14/Feb/23 |
|
| Status: | Resolved |
| Project: | yangtools |
| Component/s: | parser |
| Affects Version/s: | 8.0.9, 9.0.6, 10.0.3 |
| Fix Version/s: | 8.0.10, 9.0.7, 10.0.4 |
| Type: | Bug | Priority: | Medium |
| Reporter: | Sangwook Ha | Assignee: | Robert Varga |
| Resolution: | Done | Votes: | 0 |
| Labels: | None | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Description |
|
Parsing of a YANG module fails if the module includes a list conditional on a feature and the feature is not supported. Here is an example: module foo {
namespace "urn:foo";
prefix "foo";
feature foo-feature;
container foo {
if-feature foo-feature;
list bar {
key baz;
unique qux;
leaf baz {
type string;
}
leaf qux {
type string;
}
}
}
}
Parser tries to find the target node of the unique statement when the list itself is not supported: Caused by: org.opendaylight.yangtools.yang.parser.spi.source.SourceException: Following components of unique statement argument refer to non-existent nodes: [Descendant{qnames=[(urn:foo)qux]}] [at /volumes/OpenDaylight/yangtools/parser/yang-parser-rfc7950/target/test-classes/bugs/YT1481/foo-feature/foo.yang:12:7]
at org.opendaylight.yangtools.yang.parser.rfc7950@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta.UniqueStatementSupport$RequireLeafDescendants.prerequisiteFailed(UniqueStatementSupport.java:226)
at org.opendaylight.yangtools.yang.parser.spi@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder$InferenceAction.prerequisiteUnavailable(ModelActionBuilder.java:139)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$AbstractPathPrerequisite.namespaceItemAdded(ModifierImpl.java:335)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.onNamespaceItemAddedAction(StatementContextBase.java:601)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$AbstractPathPrerequisite.hookOnto(ModifierImpl.java:369)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$AbstractPathPrerequisite.hookOnto(ModifierImpl.java:363)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl.lambda$requiresCtxPath$1(ModifierImpl.java:187)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl.apply(ModifierImpl.java:265)
at org.opendaylight.yangtools.yang.parser.rfc7950@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta.UniqueStatementSupport$RequireEffectiveList.apply(UniqueStatementSupport.java:178)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl.tryApply(ModifierImpl.java:146)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished.phaseFinished(ModifierImpl.java:392)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.runPhaseListeners(StatementContextBase.java:578)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.onPhaseCompleted(StatementContextBase.java:523)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.doTryToCompletePhase(StatementContextBase.java:457)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.tryToCompletePhase(ReactorStmtCtx.java:449)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.completeChildren(StatementContextBase.java:466)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.doTryToCompletePhase(StatementContextBase.java:456)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.tryToCompletePhase(ReactorStmtCtx.java:449)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.completeChildren(StatementContextBase.java:466)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.doTryToCompletePhase(StatementContextBase.java:456)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.tryToCompletePhase(ReactorStmtCtx.java:449)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.tryToCompletePhase(SourceSpecificContext.java:299)
at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.completePhaseActions(BuildGlobalContext.java:364)
... 79 more
Another example in ietf-twamp@2021-11-17.yang container client {
if-feature "control-client";
description
"Configuration of the TWAMP Control-Client logical entity.";
leaf admin-state {
type boolean;
default "true";
description
"Indicates whether the device is allowed to operate as a
TWAMP Control-Client.";
}
list mode-preference-chain {
key "priority";
unique "mode";
leaf priority {
type uint16;
description
"Indicates the Control-Client mode preference priority,
expressed as a 16-bit unsigned integer. Values for the
priority start with zero, the highest priority, and
decreasing priority value is indicated by every increase
in value by one.";
}
leaf mode {
type twamp-modes;
description
"The supported TWAMP-Modes matching the corresponding
priority.";
}
|