YANG 1.0和YANG 1.1之间有什么区别?

YANG 1.0(RFC6020)标准发布于2010年10月,YANG 1.1(RFC7950)标准发布于2016年8月,它们的主要区别如下。

向后不兼容变更:

  • 修改带双引号的字符串中转义字符的解析规则。升级到YANG 1.1时,必须修改字符串以匹配新规则。参见第6.1.3节。
  • 不带引号的字符串不能包含任何单引号或双引号字符。升级到YANG 1.1时,必须修改字符串以匹配新规则。参见第6.1.3节。
  • list的key上禁止使用“when”和“if-feature”。升级到YANG 1.1时,必须删除以匹配新规则。
  • 定义了YANG模块的非法字符,升级到YANG 1.1时,必须删除非法字符以匹配新规则。参见第6章节。
  • 禁止内置数据类型string中含有UNICODE的保留字符。

其它额外变更

  • YANG版本号从“1”变更为“1.1”。
  • YANG 1.1的模型中必须有“yang-version”语句。
  • 将“if-feature”语法扩展为feature名称的布尔表达式。
  • 允许在“bit”、“enum”和“identity”中使用“if-feature”。
  • 允许在“refine”中使用“if-feature”。
  • 允许“choice”作为速记的“case”语句(参见第7.9.2节)。
  • 新增了“pattern”语句的子语句“modifier”(参见第9.4.6节)。
  • 允许在“input”、“output”和“notification”中使用“must”。
  • 允许在leafref中有“require-instance”。
  • 允许在“import”和“include”中使用“description”和“reference”。
  • 允许import一个模块的多个版本。
  • 允许“augment”有条件地添加强制节点(参见第7.17节)。
  • 在第10节中新增了一组新的XPath函数。
  • 在第6.4.1节中澄清了XPath上下文的树。
  • 定义了在XPath表达式中identityref的字符串值(参见第9.10节)。
  • 澄清在typedef中的leafrefs中没有前缀的名字的意思(参见第6.4.1和9.9.2节)。
  • 允许identity从多个identity派生(参见第7.18和9.10节)。
  • 允许枚举和位域类型可以是子类型(参见第9.6和9.7节)。
  • 允许leaf-list有默认值(参见第7.7.2节)。
  • 在非配置leaf-list中允许取值不唯一(参见第7.7节)。
  • 在语法中使用大小写敏感字符串(参见[RFC7405])。
  • 修改了YANG模块通告机制(参见第5.6.4节)。
  • 修改了子模块中定义的作用域规则。 现在,子模块可以引用属于同一模块的所有子模块中的所有定义,而无需使用“include”语句。
  • 新增了“action”语句,用于定义数据节点的操作。
  • 允许将Notification绑定到数据节点。
  • 新增了“anydata”语句(参见第7.10节),当数据可以在YANG中建模,推荐使用它来代替“anyxml”。
  • 允许联合体中存在“empty”和“leafref”类型。
  • 允许key中存在“empty”类型。
  • 删除了标识符无法以字符“xml”开头的限制。

对NETCONF协议映射的变更

  • NETCONF Server在hello报文中,通过通告ietf-yang-library(RFC7895)来声明支持了YANG 1.1,无需再将所有YANG模块在hello报文中列出来。