YANG语言中'identity'语句的含义及实际应用解析
identity 语句的实际用途与核心价值 identity绝对不是仅作为文档说明的标识,它是YANG中构建可扩展语义分类体系的核心机制,解决了普通枚举无法灵活扩展的痛点。下面是它的核心用法和实际意义:
1. 作为可扩展的"类型基类",配合identityref实现动态枚举
这是identity最常用的场景:定义一个抽象的基标识,其他模块可以基于它扩展子类,然后用identityref类型来引用这个基标识下的所有子类。
比如你提到的iana-if-type模块中,interface-type是一个基identity,其他模块(包括标准或第三方)可以定义继承自它的新标识(如ethernetCsmacd、gigabitEthernet)。当你在自己的配置模型中使用:
leaf if-type { type identityref { base iana-if-type:interface-type; } }
这个叶子节点就只能接受所有继承自interface-type的标识值——既包括标准定义的接口类型,也包括后续新增的扩展类型,完全不用修改原模型就能支持新类型,这是普通枚举做不到的。
2. 实现语义层级与继承
identity支持通过base语句继承其他标识,形成语义上的层级关系。比如iana-if-type中:
identity interface-type { description "Base identity for all interface types."; } identity ethernetCsmacd { base interface-type; description "Ethernet CSMA/CD interface type."; } identity gigabitEthernet { base ethernetCsmacd; description "Gigabit Ethernet interface type."; }
这种继承关系能明确表达"千兆以太网属于以太网,以太网属于接口类型"的语义,网络管理系统或编译器可以基于这个层级做逻辑判断(比如对所有以太网类型应用统一配置策略)。
3. 跨模块的语义共识
不同模块可以引用同一个identity,确保各方对同一概念的语义理解一致。比如多个模块都需要描述IP协议类型时,只要都引用同一个基identity,各自扩展的子类就能被所有模块识别,避免了不同模块各自定义枚举导致的语义冲突。
关于你的疑问
- 能否引用? 完全可以,核心就是通过
identityref类型来引用,这是identity的核心价值所在。 - 是否仅为文档? 不是,
identity是YANG模型的可执行部分,会被编译器解析,生成的代码会包含类型校验、扩展支持等逻辑,直接影响配置的合法性检查和系统行为。
你在YangModels仓库中没找到明确用法,可以去看依赖iana-if-type的模块,比如ietf-interfaces模块,里面就大量使用了identityref来引用iana-if-type中的标识,这就是最典型的实际场景。
内容的提问来源于stack exchange,提问作者Diddi Oskarsson

