如何定义YANG模型List以支持不同键及空键适配CLI需求
适配CLI命令「member instance [template | ]」的YANG模型解决方案
针对你遇到的List空键、双非强制List键无效的问题,推荐以下两种可行的解决方案,无需依赖List结构即可适配三种CLI形式:
方案一:使用Choice互斥分支(最直观适配CLI逻辑)
利用YANG的choice结构实现两种实例选择方式的互斥,同时通过默认值处理member instance等效于member instance template default的场景。
YANG代码示例
container member { container instance { choice instance-selector { // 默认选中template分支,匹配无参数的member instance命令 default "template"; case template { leaf name { type string; // 默认值设为default,自动补全等效逻辑 default "default"; } } case instance-id { leaf id { type uint32; } } } } }
适配逻辑说明
- 输入
member instance:自动触发choice默认分支template,且name自动填充默认值default,完全等效于member instance template default - 输入
member instance template <name>:选中template分支,覆盖name的默认值为指定名称 - 输入
member instance <id>:选中instance-id分支,设置对应的id值
方案二:枚举类型+When约束+Must校验
通过枚举类型标记实例选择类型,结合when控制字段可见性,must保证互斥合法性,同样支持默认场景。
YANG代码示例
container member { container instance { leaf instance-type { type enumeration { enum template; enum instance-id; } // 默认使用template类型,匹配无参数命令 default "template"; } leaf template-name { type string; default "default"; // 仅当类型为template时可见 when "../instance-type = 'template'"; } leaf instance-id { type uint32; // 仅当类型为instance-id时可见 when "../instance-type = 'instance-id'"; } // 校验逻辑:保证同一时间仅存在一种有效配置 must "(instance-type = 'template' and template-name) or (instance-type = 'instance-id' and instance-id)" { error-message "请根据实例类型指定对应参数:template名称或instance ID"; } } }
适配逻辑说明
member instance:instance-type默认是template,template-name默认是default,自动匹配等效命令member instance template <name>:指定instance-type为template,并设置template-name为指定值member instance <id>:指定instance-type为instance-id,并设置instance-id为指定值
关于原方案的问题说明
YANG的List要求键必须唯一且非空,双非强制键无法保证List实例的唯一性(多个无键实例会冲突),因此这种场景下List并非合适的结构,上述两种基于容器+互斥分支/约束的方案更契合CLI的互斥参数逻辑。
内容的提问来源于stack exchange,提问作者Lian Fu
相关产品推荐
相关产品推荐

