Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 述职汇报 > RFC6020-YANG---NETCONF数据建模语言

RFC6020-YANG---NETCONF数据建模语言

收藏

本作品内容为RFC6020-YANG---NETCONF数据建模语言,格式为 doc ,大小 1184256 KB ,页数为 156页

RFC6020-YANG---NETCONF数据建模语言


('RFC6020YANG-NETCONF数据建模语言RFC6020YANG-NETCONF数据建模语言第1页/共156页RFC6020YANG-NETCONF数据建模语言修订记录修订日期修改人修改内容2020-03-15程怀玺-Jade完成翻译初稿概述:YANG(YetAnotherNextGeneration)是一种数据建模语言,用于对NETCONF协议操纵的配置和状态数据、NETCONF远程过程调用以及NETCONF的通知进行建模。第2页/共156页RFC6020YANG-NETCONF数据建模语言目录目录......................................................................31引言.....................................................................112关键字..................................................................123术语...................................................................123.1Mandatory节点...................................................134YANG概览...............................................................144.1功能概述.........................................................144.2语言概述.........................................................154.2.1模块和子模块...............................................154.2.2数据建模基础...............................................164.2.3状态数据...................................................194.2.4内置类型...................................................204.2.5派生类型(typedef)..........................................214.2.6可重用节点组(分组).........................................214.2.7选择......................................................234.2.8扩展数据模型(augment)......................................244.2.9RFC定义...................................................244.2.10通知定义...................................................255语言概念................................................................265.1模块和子模块......................................................265.1.1模块和子模块...............................................275.1.2模块层次(ModuleHierarchies)...............................285.2文件布局.........................................................285.3XML名称空间(Namesapce)...........................................295.3.1YANGXML名称空间..........................................295.4解析组、类型和身份标识..............................................29第3页/共156页RFC6020YANG-NETCONF数据建模语言5.5嵌套类型定义和分组.................................................295.6一致性...........................................................305.6.1基本行为...................................................305.6.2可选特性...................................................305.6.3偏差......................................................315.6.4在中通告一致性信息...................................315.7数据存储修改......................................................336YANG语法...............................................................336.1词汇标记(LexicalTokenization)..................................336.1.1注释(Comments)...........................................346.1.2Tokens...................................................346.1.3使用引号(Quoting)........................................346.2ID(Identifiers)................................................356.2.1标识符和其名字空间..........................................356.3语句.............................................................366.3.1语言扩展...................................................366.4XPath评估.......................................................366.4.1XPath上下文...............................................376.5架构(Schema)节点标识符...........................................377YANG语句...............................................................387.1module语句......................................................387.1.1模块的子语句...............................................397.1.2yang-version语句..........................................407.1.3namespace语句.............................................407.1.4prefix语句................................................407.1.5import语句................................................407.1.6include语句...............................................417.1.7organization语句..........................................427.1.8contact语句...............................................427.1.9revision语句..............................................427.1.10使用范例...................................................42第4页/共156页RFC6020YANG-NETCONF数据建模语言7.2submodule语句...................................................437.2.1子模块的子语句..............................................447.2.2子模块的子语句..............................................457.2.3使用范例...................................................457.3typedef语句.....................................................467.3.1typedef语句的子语句........................................467.3.2typedef的type语句........................................467.3.3typedef的units语句.......................................477.3.4typedef的default语句.....................................477.3.5使用范例...................................................477.4type语句........................................................477.4.1type的子语句..............................................477.5container语句...................................................487.5.1在场container(PresenceContainer).........................487.5.2container子语句...........................................487.5.3must语句..................................................497.5.4must的子语句..............................................507.5.5presence语句..............................................517.5.6容器子节点语句..............................................517.5.7XML映射规则...............................................517.5.8NETCONF操作.................................527.5.9使用范例...................................................527.6leaf语句........................................................537.6.1叶子的默认值...............................................537.6.2叶子的子语句...............................................547.6.3叶子的type语句............................................547.6.4叶子的default语句.........................................547.6.5叶子的mandatory语句.......................................557.6.6XML映射规则...............................................557.6.7NETCONF操作.................................557.6.8使用范例...................................................56第5页/共156页RFC6020YANG-NETCONF数据建模语言7.7leaf-list语句...................................................567.7.1顺序......................................................577.7.2leaf-list的子语句.........................................577.7.3min-elements语句..........................................587.7.4max-elements语句..........................................587.7.5ordered-by语句............................................587.7.6XML映射规则...............................................597.7.7NETCONF操作.................................597.7.8使用范例...................................................607.8list语句........................................................617.8.1list的子语句..............................................617.8.2list的key语句............................................627.8.3list的unique语句.........................................627.8.4list的孩子节点语句.........................................647.8.5XML映射规则...............................................647.8.6NETCONF操作.................................647.8.7使用范例...................................................657.9choice语句......................................................687.9.1choice子语句..............................................687.9.2choice的case语句.........................................697.9.3choice的default语句......................................707.9.4choice的mandatory语句....................................717.9.5XML映射规则...............................................727.9.6NETCONF操作.................................727.9.7使用范例...................................................727.10anyxml语句......................................................737.10.1anyxml子语句..............................................737.10.2XML映射规则...............................................747.10.3NETCONF操作.................................747.10.4使用范例...................................................747.11grouping语句....................................................75第6页/共156页RFC6020YANG-NETCONF数据建模语言7.11.1group的子语句.............................................757.11.2使用范例...................................................767.12uses语句........................................................767.12.1uses的子语句..............................................767.12.2refine语句................................................777.12.3XML映射规则...............................................777.12.4使用范例...................................................777.13rpc语句.........................................................787.13.1rpc的子语句...............................................797.13.2input语句.................................................797.13.3output语句................................................807.13.4XML映射规则...............................................817.13.5使用范例...................................................817.14notification语句................................................827.14.1notification的子语句......................................827.14.2XML映射规则...............................................827.14.3使用范例...................................................837.15augment语句.....................................................837.15.1augment的子语句...........................................847.15.2XML映射规则...............................................857.15.3使用范例...................................................857.16identity语句....................................................867.16.1identity的子语句..........................................877.16.2base语句..................................................877.16.3使用范例...................................................877.17extension语句...................................................887.17.1extension的子语句.........................................887.17.2argument的子语句..........................................887.17.3使用范例...................................................897.18一致性相关语句....................................................907.18.1feature语句...............................................90第7页/共156页RFC6020YANG-NETCONF数据建模语言7.18.2if-feature语句............................................917.18.3deviation语句.............................................917.19公共语句.........................................................947.19.1config语句................................................947.19.2status语句................................................947.19.3description语句...........................................957.19.4reference语句.............................................957.19.5when语句..................................................958约束...................................................................968.1数据约束.........................................................968.2约束层次.........................................................968.3约束执行模型......................................................978.3.1载荷解析...................................................978.3.2NETCONF操作.................................988.3.3验证......................................................989内置类型................................................................999.1表示规范.........................................................999.2整数内置类型......................................................999.2.1词汇形式..................................................1009.2.2规范形式..................................................1009.2.3限制.....................................................1009.2.4rang语句.................................................1009.2.5使用范例..................................................1019.3decimal64内置类型...............................................1019.3.1词法表示..................................................1029.3.2规范表示..................................................1029.3.3限制.....................................................1029.3.4fraction-digits语句......................................1029.3.5使用范例..................................................1039.4string内置类型..................................................1039.4.1词法形式..................................................103第8页/共156页RFC6020YANG-NETCONF数据建模语言9.4.2规范形式..................................................1039.4.3限制.....................................................1039.4.4length语句...............................................1039.4.5使用范例..................................................1049.4.6pattern子语句............................................1049.4.7使用范例..................................................1059.5boolean内置类型.................................................1059.5.1词法表示..................................................1059.5.2规范表示..................................................1059.5.3限制.....................................................1069.6enumeration内置类型.............................................1069.6.1词法表示..................................................1069.6.2规范表示..................................................1069.6.3限制.....................................................1069.6.4enum语句.................................................1069.6.5使用范例..................................................1079.7bits内置类型....................................................1079.7.1限制.....................................................1079.7.2词法表示..................................................1079.7.3规范表示..................................................1089.7.4bit语句..................................................1089.7.5使用范例..................................................1089.8binary内置类型..................................................1099.8.1限制.....................................................1099.8.2词法表示..................................................1099.8.3规范表示..................................................1099.9leafref内置类型.................................................1099.9.1限制.....................................................1109.9.2path语句.................................................1109.9.3词法表示..................................................1109.9.4规范表示..................................................111第9页/共156页RFC6020YANG-NETCONF数据建模语言9.9.5使用范例..................................................1119.10identityfre内置类型.............................................1149.10.1限制.....................................................1149.10.2identityref的base语句...................................1149.10.3语法表示..................................................1149.10.4规范表示..................................................1149.10.5使用范例..................................................1149.11empty内置类型...................................................1159.11.1限制.....................................................1159.11.2词法形式..................................................1159.11.3规范形式..................................................1169.11.4适用范例..................................................1169.12union内置类型...................................................1169.12.1限制.....................................................1169.12.2词法表示..................................................1179.12.3规范表示..................................................1179.13instance-identifier内置类型.....................................1179.13.1限制.....................................................1179.13.2require-instance语句.....................................1189.13.3句法表示..................................................1189.13.4规范表示..................................................1189.13.5使用范例..................................................11810更新模型............................................................11911YIN...............................................................12011.1.1YIN正式定义..............................................12012YANGABNF语法......................................................12413YANG相关错误的错误响应...............................................14213.1违反唯一性语句的数据的错误消息......................................14213.2违反max-elements语句的数据的错误消息..............................14213.3违反min-elements语句的数据的错误消息..............................14313.4违反must语句的数据的错误消息......................................143第10页/共156页RFC6020YANG-NETCONF数据建模语言13.5违反require-instance语句的数据的错误消息..........................14313.6无匹配leafref类型数据的错误消息...................................14313.7违反mandatoryChoice语句的数据的错误消息..........................14413.8"insert"操作的错误消息...........................................14414IANA注意事项.......................................................14414.1媒体类型application/yang.......................................14514.2媒体类型application/yin+xml....................................14615安全注意事项........................................................14616贡献者.............................................................14717致谢...............................................................14718参考文档............................................................14718.1NormativeReferences...........................................14718.2InformativeReferences.........................................148第11页/共156页RFC6020YANG-NETCONF数据建模语言1引言YANG(YetAnotherNextGeneration)是一种数据建模语言,用于对NETCONF协议操纵的配置和状态数据、NETCONF远程过程调用(RPC)以及NETCONF的通知进行建模。YANG通常也用于对NETCONF协议的操作层和内容层进行建模(参考RFC4741NETCONF配置协议的1.1章节)。本文档描述了YANG语言的语法和语义,YANG模型中定义的数据模型如何用XML来呈现,NETCONF操作如何操纵数据。2关键字本文档涉及的关键字"MUST","MUSTNOT","REQUIRED","SHALL","SHALLNOT","SHOULD","SHOULDNOT","RECOMMENDED","MAY",和"OPTIONAL"请参考RFC2119[RFC2119]。3术语anyxml:一个可以包含未知XML数据块的数据节点。augment:增强,在已有架构(schema:也可翻译为模式)节点的基础上,增加新的架构节点。basetype:基本类型,用于派生其他类型,基本类型可以是内置类型或其他派生类型。built-intypes:内置类型:YANG语言定义的数据类型,比如uint32或string。choice:选择:一个架构节点,在多个被标识的多个可选项中只有一个是有效的。类似于c语音的switchcase语句。configurationdata:配置数据:由RFC4741定义,用于将系统从初始的默认状态转换为当前状态的配置数据的集合。conformance:一致性:设备遵循一个数据模型准确性的度量。第12页/共156页RFC6020YANG-NETCONF数据建模语言container:容器,在数据树中最多存在一个实例的内部数据节点,容器没有值(有值没有孩子节点的是叶子节点,容器是数据树中包含叶子的节点),但是包含一组子节点。datadefinitionstatement:数据定义语句:定义一个新的数据节点的语句。可以是container容器,leaf叶子,leaf-list叶子列表,list列表,choice选择,case分支,augment增强,uses和anyxml中的一个。datamodel:数据模型,数据模型定义了呈现和访问数据的方式。datanode:数据节点,架构树上的可以在数据树中实例化的节点,节点可以是容器container、叶子leaf、叶子列表leaf-list、列表list和anyxml中的一种。datatree:数据树,配置和状态数据在设备上的实例树。derivedtype:派生类型,一个从内置类型或其他派生类型派生出的类型。devicedeviation:设备偏差,设备未能如实的实现某个模块。extension:扩展,扩展将非YANG语义添加到语句(statement)中,扩展语句定义了表达这些语义的新的语句。feature:特性,将模型的一部分做成可选的一种机制,定义可以通过一个特性名字作为标签,并且只有在标签有效的设备上支持该特性。等于NETCONF中的能力。grouping:分组,架构节点重用的集合,组也许用于模块内部、用于包含它的模块、用于引入它的模块。分组语句不是一个数据定义声明,并且没有在架构树中定义任何节点。分组纯粹是为了方便重用。indentifier:标识符,用于标识不同YANG条目的名字。instanceidentifier:实例标识,标识数据树中特定节点的机制。interiornode:内部节点,层次结构内部非叶子节点的节点leaf:叶子,在数据树中最多存在一个实例的数据节点。叶子有值,但不能包含子节点。leaf-list:叶子列表,类似于叶子节点,但定义了一组可唯一识别的节点集,而不是单个节点。每个节点都有值,但没有子节点。leaf-list可以理解是单个类型元素组成的数组。list:列表,一个在数据树中可能存在多个实例的内部数据节点。列表没有值,指示一组子节点。list可以理解为结构体数组。module:模块,YANG定义的模块是一个用作NETCONF基础操作的节点层次树。通过其自身的定义和从其他地方引入的定义,一个模块是自包含且“可编译”的。RPC:远程过程调用,用于NETCONF协议。RPCoperation:NETCONF内部使用的一个特定的RPC调用,也称为协议操作。schemanode:架构树中的节点,可以是container、leaf、leaf-list、list、choice、case、rpc、input、notification、anyxl中的一个。第13页/共156页RFC6020YANG-NETCONF数据建模语言schemanodeindentifier:架构节点标识符,一种标识架构树中一个特定节点的机制。schematree:架构树,模型内部制定的层次树的定义。statedata:状态数据,RFC4741定义的系统内部除配置数据外的只读状态数据和话统指标。submodule:子模块,向模块提供派生类型、分组、数据节点、RPC、通知等等类型定义的模块,一个YANG模块可以由多个子模块组成。top-leveldatanode:一个在它和模块或子模块语句之间,没有其他数据节点的节点。uese:“uses”语句用于实例化分组语句中定义的架构节点集。实例化的节点可以被改进和扩充,以使它们适应任何特定的需要。3.1Mandatory节点以下之一是强制(Mandatory)节点:o包含取值为"true"的"mandatory"的leaf、choice或者anyxml节点,即leaf、choice或者anyxml节点中,包含取值为"true"的"mandatory"语句;o包含取值大于0的"min-elements"语句的list或leaf-list节点,即list或leaf-list节点,包含取值大于0的"min-elements"语句o一个不包含"presence"语句的容器节点,其中至少包含一个mandatory节点作为子节点;4YANG概览4.1功能概述YANG是用于NETCONF协议的数据建模语言,一个YANG模块定义了一个可以用于NETCONF基本操作的数据层次结构,包括配置、状态数据、RPCs和通知,这可以完整描述NETCONF客户端和Server间交互的所有数据。YANG将数据的层次结构模型化为一个树,树中每个节点都有一个名字,和一个取值或者一个子节点集合。YANG对每个节点以及节点间的交互提供了清晰的、简洁的描述。YANG将数据模型组织成为模块和子模块。模块可以从其他外部模块导入数据,从子模块中包含数据。允许一个模块向其他模块定义的层次树增加数据节点,从而增强该模块定义的层次结构,同时这种增强第14页/共156页RFC6020YANG-NETCONF数据建模语言操作可以是条件性的,即只有满足特定条件时新的节点才会出现。YANG模型可以描述附加于数据上约束,基于其他节点是否存在或其取值,去限制层次结构中特定节点的出现或者取值。这些约束由Client或Server强制执行,并且有效的内容必须遵从这些约束。YANG定义了一组内置数据类型,并且定义了基于内置类型增加其他类型的派生机制。派生类型可以使用诸如指定范围(range)或模式(pattern)的方式,去限制Client或Server强制要求的,基于的基础类型的取值范围。它们还可以定义派生类型的约定用法,比如包含一个主机名字的基于字符串的类型。YANG允许将节点分组,以便于复用,这些分组的实例可以完善(refine)或扩大(augment)节点,使其可以根据特定需求裁剪节点。派生类型和分组可以定义在单独的模块或子模块中,可以在本地或其他模块以及子模块中引入或包含它。YANG数据层次结构包括定义列表,并且列表的条目可以通过key作为键以区分每个条目。这些列表在用户定义时排序或者被系统自动排序。对于用户排序的列表,定义了用于操纵列表条目顺序的操作。YANG模块可以被转换为一个等效的XML语法,称为YANGIndependentNotation(YIN),使得应用程序可以使用XML解析器或者XSLT(ExtensibleStylesheetLanguageTransformations)脚本,直接操作数据模型。从YANG到YIN的转换是无损的,所以YIN的内容可以往返回YANG。YANG在高层数据建模和底层有线编码间取得了平衡。YANG模块的读者可以看到数据模型的高层视图,同时理解在NETCONF操作中如何编码数据。YANG是一个可以扩展的语言,允许标准机构、供应商和个人定义扩展语句。语句语法允许这些扩展以自然的方式与标准YANG语句共存,而YANG模块中的扩展非常突出,足以使读者注意到它们。YANG抵制去解决所有问题的倾向,而是限定问题空间,以表达NETCONF的数据模型,而不是任意的XML文档或任意的数据模型。YANG描述的数据模型更多的是使得通过NETCONF操作更加轻松。就是说,YANG就是为了建模NETCONF的配置数据和操作。为了可能的扩展,YANG维护了与SNMP(SimpleNetworkManagementProtocol)定义的SMIV2(StructureofManagementInformationversion2[RFC2578],[RFC2579])的兼容性。基于SMIv2的MIB模块可以自动地转换为YANG模块,以进行只读访问。然而,YANG不关心从YANG到SMIv2的反向转换。和NETCONF一样,YANG致力于和设备本机管理基础架构的平滑集成,以允许实现利用其现有的访问机制去保护或者暴露数据模型的元素。第15页/共156页RFC6020YANG-NETCONF数据建模语言4.2语言概述本章介绍YANG语言中一些重要的数据结构,这将有助于描述后续章节中的语言规范。这种渐进的方式处理了YANG的概念和语言内部相互关联的本质。YANG语句和语法从第7章开始详细描述。4.2.1模块和子模块模块由三种类型的语句组成:模块头语句、修订语句、定义语句。模块头语句描述模块以及模块自身的特定信息;修订语句给出模块的修订记录;定义语句用来定义数据模型,它是模块的主体内容。NETCONFServer也许会实现多个模块,以支持相同数据的不同视图或者设备数据不连续的多个视图。当然,Server也许只实现一个定义了所有可用数据的模块。基于模块所有者的需求,模块可以划分为多个子模块,但是,其外部视图始终是一个模块,不论是否存在子模块或子模块的尺寸大小。"include"语句用于模块或子子模块引用其他子模块的内容,"import"语句用于引用其他模块中定义的。4.2.2数据建模基础YANG为数据模型定义了四种类型的节点。如下章节中的每个章节中的示例展示了YANG的语法以及其对应的XML表现形式。4.2.2.1叶子节点LeafNodes叶子节点包含简单的数据,比如整数或字符串。它只包括一个特定类型的值,并且没有孩子节点。YANG示例:leafhost-name{typestring;description"Hostnameforthissystem";}NETCONFXML示例:my.example.com第7.6章节介绍"leaf"语句。第16页/共156页RFC6020YANG-NETCONF数据建模语言4.2.2.2叶子列表节点Leaf-ListNodes叶子列表节点是一个叶子节点的列表(可以理解为单个类型的元素组成的数组),列表中每个叶子节点有且仅有一个特定类型的值。YANG示例:leaf-listdomain-search{typestring;description"Listofdomainnamestosearch";}NETCONFXML示例:high.example.comlow.example.comeverywhere.example.com第7.6章节介绍"leaf-list"语句。4.2.2.3容器节点ContainerNodes容器节点用于组织子树中的相关节点,容器节点没有值,只有孩子节点。容器节点可以包含任意类型的任意数目的孩子节点,孩子节点的类型可以是叶子节点、列表节点、容器、以及叶子列表。YANG示例:containersystem{containerlogin{leafmessage{typestring;description"Messagegivenatstartofloginsession";}}}NETCONFXML示例:Goodmorning容器节点的描述在7.5章节。第17页/共156页RFC6020YANG-NETCONF数据建模语言4.2.2.4列表节点ListNodes列表由一系列列表条目组成,每个条目就像一个结构或记录的实例,并且通过它的键叶叶子的值唯一识别。列表可以指定多个键叶叶子,并且可以包含任意类型的任意数目的孩子节点(节点的类型可以是叶子节点、列表节点、容器节点等等)。YANG示例:listuser{key"name";leafname{typestring;}leaffull-name{typestring;}leafclass{typestring;}}NETCONFXML示例:glocksGoldieLocksintrudersnoweySnowWhitefree-loaderrzellRapunZelltower列表的定义在7.8章节。4.2.2.5模块示例这些语句组合定义了一个模块:第18页/共156页RFC6020YANG-NETCONF数据建模语言//Contentsof"acme-system.yang"moduleacme-system{namespace"http://acme.example.com/system";prefix"acme";organization"ACMEInc.";contact"joe@acme.example.com";description"ThemoduleforentitiesimplementingtheACMEsystem.";revision2007-06-09{description"Initialrevision.";}containersystem{leafhost-name{typestring;description"Hostnameforthissystem";}leaf-listdomain-search{typestring;description"Listofdomainnamestosearch";}containerlogin{leafmessage{typestring;description"Messagegivenatstartofloginsession";}listuser{key"name";leafname{typestring;}leaffull-name{typestring;}leafclass{typestring;}}}}}第19页/共156页RFC6020YANG-NETCONF数据建模语言4.2.3状态数据YANG可以基于"config"语句为状态数据和配置数据建模,当一个节点被打上"configfalse"标签,那么它的子层次被标志为状态数据,可以通过使用NETCONF的操作上报,而不是操作。同时,其父亲容器、列表以及键叶叶子会一起上报,以给出状态数据的上下文信息。在下边这个例子中,每个接口定义了两个叶子节点,一个是配置速度,另一个是观察速度。其中观察速度不是配置,所以它会被NETCONF的操作返回,而不是操作。观察速度不是配置数据,因此它不能被操纵。listinterface{key"name";leafname{typestring;}leafspeed{typeenumeration{enum10m;enum100m;enumauto;}}leafobserved-speed{typeuint32;configfalse;}}NETCONFXML示例:feilunauto10mzhouauto100m第20页/共156页RFC6020YANG-NETCONF数据建模语言4.2.4内置类型YANG语言和其他许多编程语言一样,定义了一组内置类型,但是由于管理域的需求不同,存在一些差异。如下表格汇总了将在第9章介绍的内置类型。名字描述binary任何二进制数据bits位或标志的集合booleantrue或者falsedecimal6464-bit有符号10进制整数empty一个没有任何值的叶子节点enumeration枚举字符串identifyref对抽象标识的引用instance-identifier对数据树节点的引用int88-bit有符号整数int1616-bit有符号整数int3232-bit有符号整数int6464-bit有符号整数leafrefleaf实例的引用string人类可读的字符串uint88-bit无符号整数uint1616-bit无符号整数uint3232-bit无符号整数uint6464-bit无符号整数union成员类型选择类型语句在7.4章节详细介绍。4.2.5派生类型(typedef)YANG可以使用typedef语句从基础类型派生其他类型,基础类型可以是内置类型或其他派生类型,以允许派生类型的层次结构。第21页/共156页RFC6020YANG-NETCONF数据建模语言派生类型可以用作"type"语句的参数。YANG示例:typedefpercent{typeuint8{range"0..100";}description"Percentage";}leafcompleted{typepercent;}NETCONFXML示例:20在7.3章节介绍"typedef"语句。4.2.6可重用节点组(分组)一组节点可以通过使用"grouping"语句组合成可重用的集合,分组定义了一个通过"uses"实例化的节点集合:groupingtarget{leafaddress{typeinet:ip-address;description"TargetIPaddress";}leafport{typeinet:port-number;description"Targetportnumber";}}containerpeer{containerdestination{usestarget;}}NETCONFXML示例:第22页/共156页RFC6020YANG-NETCONF数据建模语言

192.0.2.1
830分组可以在使用时进行改进,使得特定的语句被重写。在下边这个例子中,描述(description)被重写了:containerconnection{containersource{usestarget{refine"address"{description"SourceIPaddress";}refine"port"{description"Sourceportnumber";}}}containerdestination{usestarget{refine"address"{description"DestinationIPaddress";}refine"port"{description"Destinationportnumber";}}}}分组语句在第7.11章节描述。4.2.7选择YANG允许数据模型使用"choice"和"case"(类似C语音switchcase)将不兼容节点类型分为不同的选择。"choice"语句包含了一组"case"语句,"case"语句定义了不能同时出现的架构节点的集合。每个"case"语句可以包含多个节点,但是"choice"下的每个"case"也可以只包含一个节点。当一个case下的元素被创建时,其他所有case下的元素都被隐式的删除。设备处理该约束的强制执行,第23页/共156页RFC6020YANG-NETCONF数据建模语言以防止与现有配置的不兼容性。choice和case节点都仅出现在架构树中,不会出现在数据树或NETCONF消息中。除了概念性的架构外,不需要额外的层次结构。YANG示例:containerfood{choicesnack{casesports-arena{leafpretzel{typeempty;}leafbeer{typeempty;}}caselate-night{leafchocolate{typeenumeration{enumdark;enummilk;enumfirst-available;}}}}}NETCONFXML示例:"choice"语句在7.9章节中描述。4.2.8扩展数据模型(augment)YANG允许模块将其他节点插入到数据模型中,包括当前模块(或它的子模块)或者外部模块。例如,这对供应商很有价值,使得供应商可以以可互操作的方式将其特定的参数添加到标准数据模型中。YANG语言的"augment"语句定义了数据模型层次结构中插入其他节点的位置,并且"when"语句指第24页/共156页RFC6020YANG-NETCONF数据建模语言定了在什么条件下,新的节点是有效的。YANG示例:augment/system/login/user{when"class!=’wheel’";leafuid{typeuint16{range"1000..30000";}}}在上边的例子中,当user的"class"不是"wheel"时,插入"uid"节点。如果一个模块扩充(augments)了其它模块,则数据的XML呈现将反应扩展定义所在模块的前缀。比如,如果上面的扩充内容在一个以"other"为前缀的模块中,则相应的XML将如下所示:NETCONFXML示例:alicewAliceN.Wonderlanddrop-out1024"augment"语句的描述在7.15章节。4.2.9RFC定义YANG允许定义NETCONFRPCs。使用YANG的数据定义语句,可以对操作名字、输入参数、输出参数进行建模。YANG示例:rpcactivate-software-image{input{leafimage-name{typestring;}}output{leafstatus{typestring;}}第25页/共156页RFC6020YANG-NETCONF数据建模语言}NETCONFXML示例:acmefw-2.3Theimageacmefw-2.3isbeinginstalled."rpc"语句的介绍在7.13章节。4.2.10通知定义YANG允许定义适合于NETCONF的通知,YANG的数据定义语句可以用于为通知的内容进行建模。YANG示例:notificationlink-failure{description"Alinkfailurehasbeendetected";leafif-name{typeleafref{path"/interface/name";}}leafif-admin-status{typeadmin-status;}leafif-oper-status{typeoper-status;}}NETCONFXML示例:2007-09-01T10:00:00Z第26页/共156页RFC6020YANG-NETCONF数据建模语言so-1/2/3.0updown"notification"在7.14章节描述。5语言概念5.1模块和子模块模块是YANG定义的基本单元,一个模块定义了一个单独的数据模型,一个模块可以定义一个完整的、内聚的模型(不依赖于第三方模块),或者使用其他节点扩充(augment)现有的数据模型。子模块(Submodule)是为模块提供定义的部分模块(partialmodule),一个模块也许包含任意数量的子模块,但是每个子模块仅能属于一个模块。所有模块和子模块的名字必须是唯一的,因此建议企业模块的开发者为他们的模块选择的名字要尽量降低与其他厂商的模块或者标准模块的名字冲突的概率。比如,使用企业名称或组织名称作为模块名字的前缀。模块使用"include"语句包含它的子模块,并且使用"import"语句引用外部的模块。同样地,子模块使用"import"引用其他模块,并且使用"include"引用模块内部的其他子模块。一个模块或子模块不得包含其他模块的子模块,并且子模块不得import它自身的模块。"include"语句是包含,"import"语句是导入,可以包含属于同一模块内部的子模块,而外部模块要用导入语句。import和include语句用于将定义对其他模块或子模块变得可用:o模块或子模块引用外部模块的定义时,外部模块必须被导入(imported)o一个模块要引用自身子模块内的定义,它必须包含(include)这个子模块o一个子模块要引用二级子模块内部的定义,该子模块必须包含(include)该二级子模块禁止出现任何import或include的循环链。例如,如果子模块a包含了子模块b,则b不能包含a。当外部模块的一个定义被引用时,必须为其使用一个本地定义的前缀,并紧跟":",然后是外部标识符。引用本地模块的定义也可以使用前缀表示法。因为内置的数据属性不属于任何模块,并且没有前缀,第27页/共156页RFC6020YANG-NETCONF数据建模语言引用内置数据类型(比如int32)不能使用前缀表示法。5.1.1模块和子模块发布的模块会随着时间独立演进。为了允许这种演进,模块需要使用特定的修订版本被导入。当编写模块时,它使用了其他模块当时可用的修订版本。随着被导入模块新修订版本的发布,importing模块(导入其他模块的模块)不受影响,它的内容保持不变。当模块的作者准备迁移到被导入模块的最新发布的修订版本时,该模块可以通过更新的import语句重新发布。通过指定新的修订重发布模块,作者显式地指示重发布的模块接受了被导入模块的任何变化。对于子模块,问题是相似的。一个包含其他子模块的模块或子模块,需要指定被包含模块的修订版本号。如果一个子模块发生了变更,任何包含它的模块或子模块都需要进行更新。比如,模块"b"导入了模块"a":modulea{revision2008-01-01{...}groupinga{leafeh{....}}}moduleb{importa{prefixp;revision-date2008-01-01;}containerbee{usesp:a;}}当模块"a"的作者发布了新的修订版本时,修订变化对于模块"b"的作者也许是不可接受的。如果此次修订可以接受,则模块"b"的作者可以通过更新"import"语句中的修订版本,从而重新发布模块"b"。5.1.2模块层次(ModuleHierarchies)YANG允许多层次的数据模型,其中数据也许会包含多对于一个顶层节点。有多个顶层节点的模型有时是方便的,所以被YANG所支持。第28页/共156页RFC6020YANG-NETCONF数据建模语言NETCONF能够在元素中携带任何XML内容作为有效载荷,YANG模块的顶级节点可以以任意顺序编码为这些元素的孩子元素,这封装保证了相应的NETCONF消息总是良构的XML文档。举例来说:modulemy-config{namespace"http://example.com/schema/config";prefix"co";containersystem{...}containerrouting{...}}在NETCONF中编码为:5.2文件布局YANG模块和子模块通常情况下保存在文件中,一般是一个模块或子模块一个文件。文件的名字应该是如下格式:module-or-submodule-name[’@’revision-date](’.yang’/’.yin’)YANG编译器通过此约定找到被导入(imported)或被包含(included)的子模块。YANG语言定义模块时,工具可能出于性能和管理上的原因,单独编译子模块。错误和告警在单独编译子模块可能无法检测出来,从而推迟到子模块被链接进内聚的模块时为止。第29页/共156页RFC6020YANG-NETCONF数据建模语言5.3XML名称空间(Namesapce)YANG指定的所有的定义都被绑定到一个特定的XML名称空间(参考[XML-NAMES]),它是一个全球唯一的URI(参考[RFC3986])。NETCONF客户端或Server对数据进行XML编码时使用该名称空间。RFCstream[参考RFC4844]中发布的模块的命名空间必须由IANA分配,请参见第14节。私有模块的名称空间由模块所属的组织自己分配,而不需要到INAN这种集中的管理机构登记。名称空间URI必须避免标准或其他公司的名称空间冲突,比如通过在名称空间中使用企业或组织的名字。“名称空间”在7.1.3章节中描述。5.3.1YANGXML名称空间YANG为NETCONF操作和内容定义了一个XML名字空间。名字空间的名字是:"urn:ietf:params:xml:ns:yang:1"。5.4解析组、类型和标识名称分组、类型和标识名称在其定义的上下文中解析,而不是它们使用的上下文。分组(groupings)、类型定义(typedefs)、和标识名称(identities)的使用者不需要导入或包含子模块去满足原始定义所做的所有引用。这一点类似于传统编程语言中的静态作用域。举例来说,如果一个模块定义了一个分组,其中一个类型是引用而来,当这个分组被用在二级模块中时,这个引用来的类型在原始模块的上下文中解析,而不是在二级模块中。不必担心冲突,即使两个模块都定义了这个类型,因为没有歧义。5.5嵌套类型定义和分组类型定义(typedefs)和分组(groupings)可以嵌套在许多YANG语句之下,使得这些类型定义和分组的范围限定在他们出现的层次结构下。这使得类型定义和分组可以定义在靠近使用他们的地方,而不是将他们放置于层次的顶层。在临近使用的地方定义,增加了可读性,此称为范围界定(scoping)。范围界定也允许类型定义,而不必担心不同子模块间不同类型名称的冲突问题。可以在不添加旨在防第30页/共156页RFC6020YANG-NETCONF数据建模语言止大型模块内名称冲突的前导字符串的情况下指定类型名称。最后,范围界定使得模块作者将类型定义和分组保持为模块或子模块自有,以防止重用。因为只有顶层(top-level)的类型和分组(即作为模块的子语句或者子模块语句)可以被外部模块或子模块使用,开发者可以更好的控制,他们的模块的哪些部分可以对外部世界呈现,支持隐藏内部信息的需要,并在什么东西可以共享给外部世界和什么东西要保持私有之间维护一个界限。范围界定不能shadow上层的定义(类似C语言用同名的局部变量在不同层级的作用域重定义,NETCONF不允许这样使用)。一个类型或分组不能被定义,如果架构层次内的上个层次已经定义了一个相同的标识符。对一个不带前缀的类型或分组的引用,或者使用了当前模块的前缀,采用就近解析的原则:在其引用位置所在的每个祖先的每个子语句中查找匹配的类型定义(typedef)或分组语句(grouping)。5.6一致性一致性是对一个设备满足模型准确程度的度量。一般来说,设备有责任忠实的实现模型,使得应用程序同等地对待实现模型的每一个设备。对模型实现的偏差会降低模型的实用性,同时会增加使用该模型的应用程序的脆弱性。YANG模型作者要从三个方面考虑一致性:o模型的基本行为o模型的可选特性o相对模型的偏差我们将逐一讨论每个方面。5.6.1基本行为模型在NETCONF客户端和Server间建立了一个合同,使得双方确信对方了解模型化数据背后的语法和语义。YANG的强度(strength)建立在这份合同的强度上(strength)。5.6.2可选特性在许多模型中,建模者允许模型的某些部分是条件性的,设备自身控制模型中这些条件性的部分是否支持或者有效。第31页/共156页RFC6020YANG-NETCONF数据建模语言比如,一个syslog数据模型也许选择包括本地保存日志的能力,但是建模者需要意识到只有设备有本地存储时才是可能的。如果没有本地存储,则应用程序不应该让设备去保存日志。YANG使用一个称为"feature"的结构支持支持这种条件选择机制。特性给建模者提供了以一种被设备自身控制的方式将模型的部分制作为条件性的一种机制。模型可以表达不总是出现在所有设备中的构件(constructs)。这些特性(features)被包含在模型的定义中,以实现一致性视图,使得应用程序学习到设备支持哪些特性,并据此定制他们对设备的行为。模块可以声明任意数量的特性,通过简单的字符串作为特性的标识,并且基于这些特性使得模型的某些部分成为可选的。如果设备支持一个特性,则模型中对应的部分对该设备就是有效的。如果设备不支持该特定,模型的那些部分就是无效的,并且应用程序应该做出相应的行为。特性使用"feature"语句定义,模块中对特性的条件性的定义通过"if-feature"语句指出,并将特性的名字作为其参数。特性的细节进一步参考章节7.18.1。5.6.3偏差在一个理想的世界里,所有的设备被要求按照模型的定义精确的实现模型,并且相对模型的偏差是不被允许的。但是,在现实世界里,设备经常无法按照模型所写的那样实现它。为了使基于YANG的自动化环境能够处理这些设备偏差,必须为设备提供一种机制,以将此类偏差的具体情况通知应用程序。比如,一个BGP模块也许允许任意数量的BGP对端,但是一个特定设备exuberant只支持16个BGP对端。任何配置第17个对端的应用都将收到一个错误。虽然错误足以使应用程序了解到它不能增加另一个对端实体,如果应用程序能够事先知道这个限制,并且能够防止用户继续尝试不可能成功的路径,那就更好了。设备偏差通过"deviation"语句声明,该语句将标识架构树中节点的字符串作为其参数。语句的内容详细说明了设备实现与模型中定义的合同的偏差的方式。进一步信息可以参考章节7.18.3。5.6.4在中通告一致性信息名称空间必须在消息中作为一个能力(capability)通告给对端,表明NETCONFServer支持YANG模型。通告的能力URI的格式必须如下:capability-string=namespace-uri[parameter-list]第32页/共156页RFC6020YANG-NETCONF数据建模语言parameter-list="?"parameter("&"parameter)parameter=revision-parameter/module-parameter/feature-parameter/deviation-parameterrevision-parameter="revision="revision-datemodule-parameter="module="module-namefeature-parameter="features="feature(","feature)deviation-parameter="deviations="deviation(","deviation)其中"revision-date"是NETCONFServer实现的模型的修订版本(参见7.1.9章节),"module-name"是模块的名字,其取值和"module"语句一样(参见7.1章节);"namespace-uri"是模块的名称空间,取值和"namespace"语句一样(参考7.1.3章节);"feature"是设备实现的可选特定的名字(参见7.18.1章节);"deviation"是模块定义的设备偏差的名字(参考7.18.3)。在parameterlist里,每个命名参数最多出现一次。译者注:下边的例子中给出的parameter分隔符号为";",而不是"&",应该是"&"。5.6.4.1模块Server通过消息指示其支持的模块的名字。模型名称空间在能力字符串中被编码为基本URI,并且模块的名字被编码为基本URI的"module"的参数。Server必须通告其实现的所有模型的所有修订版本。比如,下边的消息通告了一个模块"syslog"。http://example.com/syslog?module=syslog&revision=2008-04-015.6.4.2特性Server通过消息指示其支持的特性(feature)的名字。在消息里,特性被编码在URI的"features"参数里。该参数的取值是一个以’,’分隔的特定模块锁支持的特性名字的列表。比如,下边的消息通告了一个模块,通知Client,Server支持模块"syslog"的"local-storage"特性。第33页/共156页RFC6020YANG-NETCONF数据建模语言http://example.com/syslog?module=syslog&features=local-storage5.6.4.3偏差设备偏差通过"deviations"参数通告。"deviations"参数的取值是一个’,’分隔的模块列表,列表中每个模块包含着能力模块的偏差。比如,下边的消息通告了两个模块,通知Client根据"my-devs"模块中列出的偏差,它偏离于"syslog"模块。http://example.com/syslog?module=syslog&deviations=my-devshttp://example.com/my-deviations?module=my-devs5.7数据存储修改数据模型也许允许Servr改变配置数据存储,而且并不是显式地通过NETCONF协议消息这种方式。比如,一个数据模型也许定义叶子节点,当Client不提供这些节点的值时,则以系统生成值进行赋值。为这种情况指定一个正式的机制,哪种情况允许这种改变,超出了本规范的范围。6YANG语法YANG语法和SMIng[RFC3780]以及诸如C/C++等编程语言类似。为了可读性特意选择了类似C语言的语法,因为YANG重视模型读者的时间和精力,而不是模块作者和YANG工具链开发人员的时间和精力。本章节介绍了YANG的语法规范。YANG模块使用UTF-8[RFC3629]编码。第34页/共156页RFC6020YANG-NETCONF数据建模语言6.1词汇标记(LexicalTokenization)YANG模块被解析成一系列的token。本节详细介绍从一个输入流中识别出token的规则。YANG的token化(词语切分)规则是简单而高效的。这种简单性的驱动力来自于保持解析器更容易实现,而高效的驱动力来自于模型作者需要将他们的模型表达为具备可读性的形式的事实。6.1.1注释(Comments)注释类似C++风格,单行注释用"//"发起,到行尾结束。块注释(跨行)包含在"/"和"/"之间。6.1.2TokensYANG中的token是一个关键字、一个字符串、一个分号";"或者一个大括号("{"or"}")。字符串可以被或不变双引号括起来,关键字或者是本文档定义的YANG的关键字,或者是一个前缀ID,紧跟":",后跟语言扩展关键字,关键字是大小写敏感的,参考6.2章节关于ID的正式定义。6.1.3使用引号(Quoting)如果一个字符串包含空格或者tab字符、分号(";")、大括号("{"or"}"),或者注释序列("//","/",or"/"),则它必须被双引号或引号括起来。如果双引号字符串包含一个换行符,后跟用于根据YANG的文件布局进行缩进的空格或制表符(tab),这些前导空白字符(空格和tab)在解析时将从字符串中删除,直到并包含双引号字符的列,或者知道第一个非空白字符,以先发生的为准。在此过程中,tab字符按照8个空格字符处理。如果双引号字符串在换行前包含空格或tab字符,则这些尾部空白字符也将从字符串中删除。单引号字符串(包含在’’)保留引号内的每个字符。一个单引号字符不能出现在单引号字符串里,即使其前面有反斜杠("/")。在双引号字符串里,一个反斜杠("/")字符引入一个特殊字符,含义依赖于反斜杠后跟的字符:\\n:换行\\t:tab字符\\":双引号字符\\\\:反斜杠字符第35页/共156页RFC6020YANG-NETCONF数据建模语言如果双引号字符串后跟一个加号字符("+"),并后跟另一个双引号字符串,则两个字符串拼接为一个字符串,允许多次拼接构建一个字符串。双引号字符串中空白字符的删除以及反斜转义字符的替换,在拼接前完成。6.1.3.1引号示例如下的字符串是等价的:hello"hello"’hello’"hel"+"lo"如下的例子显示了一些特殊的字符串:"\\""–包含双引号的字符串’"’-包含双引号的字符串"\\n"–包含换行符的字符串’\\n’–包含一个反斜杠后跟字符n的字符串如下的例子展示了一些非法的字符串:’’’’–单引号字符串不能包含单引号"""-双引号字符串中的双引号必须用反斜杠转义如下的字符串是等价的:"firstlinesecondline""firstline\\n"+"secondline"6.2ID(Identifiers)标识符(Identifiers)通常用名字来标识不同种类YANG项(items)。每个ID以大写或小写ASCII字母或者下划线字符开头,后跟0个或多个ACSII字母、数字、下划线字符、连字符或点字符。实现必须支持长度不超过64的标识符。标识符是大小写敏感的,标识符的语法规则在第12章中定义,标识符可以指定为带或不带双引号的字符串。第36页/共156页RFC6020YANG-NETCONF数据建模语言6.2.1标识符和其名字空间每个标识符在名称空间内是有效的,该名称空间取决于所定义的YANG项的类型。定义在名称空间里的所有标识符必须是唯一的。o所有模块和子模块的名字共享相同的全局模块标识符名称空间o定义在模块和其子模块中的所有扩展名字共享相同的扩展标识符名称空间o定义在模块和其子模块中的所有特性(feature)的名字共享相同的特性标识符名称空间o定义在模块和其子模块中的所有标识(identity)的名字共享相同的标识符名称空间o定义在父亲节点下或模块或其子模块顶层的所有派生类型的名字,共享相同的类型标识符名称空间。此名称空间的作用域是父节点或模块的所有子节点,这意味着任何后代节点在使用typedef时,不得定义相同名字的类型。o定义在父亲节点或模块或其子模块顶层的所有分组名字共享相同的分组标识符名称空间。此名称空间的作用域是父节点或模块的所有子节点,这意味后代节点不能定义重名的分组名字。o定义在父亲节点或模块或其子模块顶层的所有的叶子、叶子列表、列表、容器、选择、rpcs、通知以及anyxml被定义(字节或通过uese语句)在相同的标识符名称空间。此名称空间的作用域是父亲节点或模块,除非父亲节点是case节点,在这种情况下,名称空间的作用域是最近的祖先节点,而不是case或choice节点。ochoice语句中的所有case共享相同的标识符名称空间。该名称空间的作用域是父亲choice节点。前向引用在YANG中是允许的。6.3语句YANG模块包含一系列语句,每个语句以关键字开始,跟随0个或多个参数,再跟分号(";")或者以大括号("{}")包围的子语句块:statement=keyword[argument](";"/"{"statement"}")其中argument是字符串,参考6.1.2章节。第37页/共156页RFC6020YANG-NETCONF数据建模语言6.3.1语言扩展模块可以通过使用"extension"关键字(参见7.17章节)引入YANG扩展。扩展可以被其他模块通过"import"语句导入(参见7.1.5章节)。当使用一个导入的扩展时,扩展的关键字必须使用被引入的扩展模块前缀进行限定。如果一个扩展在其定义的模块使用,则扩展关键字必须被模块自身的前缀限定。因为子模块不能包含父模块,模块中任何要暴露给其他模块的扩展,必须定义在子模块中,然后子模块包含这个子模块以找到该扩展的定义。如果YANG编译器不能支持一个特定的扩展,其以作为一个未知语句(第12章)出现在YANG模块中,则真个未知语句将被编译器忽略。6.4XPath评估YANG依赖于XMLPath语言1.0[XPATH]作为指定多个内部节点间引用和依赖的标记方法。NETCONF客户端和Server不是必须要实现Xpath解释器,但是必须保证编码在数据模型中的需求能够被执行。执行的方式由具体的实现确定。XPath表达式必须是句法正确,并且所有前缀必须出现在Xpath上下文中(参考6.4.1)。实现可以选择手动实现他们,而不是直接使用Xpath表达式。XPath表达式中使用的数据模型和XPath1.0[XPATH]是一样的,并且根节点的孩子节点的扩展和XSLT1.0[XSLT](章节3.1)是一样的。特别地,它意味着根节点可以有任意数量的元素作为其子节点。6.4.1XPath上下文所有的YANGXPath表达式共享相同的XPath上下文定义:o名称空间声明的集合是所有导入语句(import)前缀和模块中XPath表达式指定的名称空间对的集合,以及为"namespace"语句的URI的"prefix"语句的前缀。o不带名称空间前缀的名字和当前节点的标识符属于相同的名称空间。在组内部,名称空间受组使用位置的影响(参考7.12章节)。o函数库是[XPATH]定义的核心函数库,并且一个"current()"函数返回带有初始节点上下文的集合。o变量绑定集为空。第38页/共156页RFC6020YANG-NETCONF数据建模语言处理不带前缀的名字的机制参考XPath2.0[XPATH2.0],并且帮助YANG简化XPath表达式。由于YANG节点标识符始终是具有非空名称空间URI的限定名称,因此不会产生任何歧义。上下文节点随YANGXPath表达式而变化,并且也由带XPath表达式的YANG语句所定义的位置而定。6.5架构(Schema)节点标识符架构节点标识符是一个字符串,它标识了架构树中的一个节点。它有两种形式:"absolute"和"descendant",分别由第12章中的"absolute-schema-nodeid"和"descendant-schema-nodeid"定义。一个架构节点标识符由一个标识符的路径组成,路径上的每个节点通过斜杠分隔("/")。在一个absolute架构节点标识符中,在前导斜杠后的第一个标识符是本地模块或所有导入模块的任何一个顶层(top-level)架构节点。引用外部模块定义的标识符必须通过合适的前缀限定,并且对本模块或其子模块定义的标识符的应用,也可以使用前缀。举例来说,为了表示顶层节点"a"的孩子节点"b",可以使用字符串"/a/b"。7YANG语句以下章节将详细介绍YANG语言的语句。需要注意的是,即使YANG定义的语句没有包含子语句,但是厂商可以通过定义扩展作为其子语句。比如,YANG没有为"description"语句定义子语句,但是下边的语句是合法的:description"sometext"{acme:documentation-flag5;}7.1module语句"module"语句定义了模块的名字,将属于同一模块的所有语句组织在一起。"module"语句的参数是模块的名字,后跟模块详细信息的子语句块。模块名字的定义遵循6.2章节定义的标识符的规则。在RFCstreams[RFC4844]中发布的模块名字必须由IANA分配(参考第14章)。私有模块的名字由模块所属的组织分配,而不需到注册中心登记。选择模块名字时推荐选择与标准或其他第39页/共156页RFC6020YANG-NETCONF数据建模语言厂商模块冲突可能性小的名字。比如使用组织或公司的名字作为模块名字的前缀。一个典型的模块的布局如下:module{//headerinformation//linkagestatements//metainformation//revisionhistory//moduledefinitions}7.1.1模块的子语句子语句章节基数anyxml7.100..naugment7.150..nchoice7.90..ncontact7.1.80..1container7.50..ndescription7.19.30..1deviation7.18.30..nextension7.170..nfeature7.18.10..ngrouping7.110..nidentity7.160..nimport7.1.50..ninclude7.1.60..n第40页/共156页RFC6020YANG-NETCONF数据建模语言leaf7.60..nleaf-list7.70..nlist7.80..nnamespace7.1.31notification7.140..norganization7.1.70..1prefix7.141reference7.19.40..1revision7.1.90..nrpc7.130..ntypedef7.30..nuses7.120..nyang-version7.1.20..17.1.2yang-version语句可选的"yang-version"语句指定了正在开发中的模块使用的YANG语义的版本号。语句的参数是一个字符串。如果出现,它必须的取值必须是"1",这是当前YANG的默认版本号。如何处理"yang-version"语句指定了非"1"(本规范定义的版本号)的值,超出了本规范的范围。定义了一个更高版本号的任何文档需要定义该版本的后向兼容性。7.1.3namespace语句"namespace"语句定义了本模块定义的所有标识符被限定的(所属的)XML名称空间,除了定义在分组内部的数据节点这个例外情况外(参考7.12获取更多信息)。"namespace"语句的参数是名称空间的URI。参考5.3章节。7.1.4prefix语句"prefix"语句用来定义模块和它的名称空间的关联的前缀。"prefix"语句的参数是用来访问模块第41页/共156页RFC6020YANG-NETCONF数据建模语言的前缀字符串,前缀字符串可以用来引用模块中包含的定义,比如"if:ifName"。前缀和标识符遵循相同的规则(参考章节6.2)。当在"module"语句内部使用时,"prefix"语句定义了该模块被其他模块导入时使用的前缀(即模块Aimport模块B时,在import语句中的"prefix"语句的参数应该是模块B在namespace语句中的"prefix"语句的值)。为了增强NETCONFXML的可读性,使用前缀生成XML或XPath的Client或Servder,应该使用模块定义的前缀,除非存在冲突。当在"import"语句内部使用时,"prefix"语句定义了当访问被导入模块内部的定义时使用的前缀。当使用被导入模块内部的一个标识符的引用时,被导入模块的前缀字符串被一个冒号(":")和标识符一起组成使用,比如"if:ifIndex"。为了增强YANG模块的可读性,应该使用被导入模块定义的前缀,除非存在冲突。如果存在冲突,即两个定义了相同前缀的不同模块都被导入,则至少必须以不同的前缀导入他们中的一个模块。所有的前缀,包括模块自身的前缀必须在模块或子模块中唯一。7.1.5import语句"import"语句使得其他模块或子模块的定义对一个模块变得可用。参数是要导入模块的名字,并且随后的子语句块描述了导入的详细信息。当一个模块被导入时,导入它的模块(importingmodule)可以:o使用被导入模块或子模块在顶层定义的任何分组和类型定义。o使用被导入模块或其子模块定义的扩展extension、特性feature和标识符identity。o在"must"、"path"和"when"语句中使用被导入模块的任何节点,或将被导入模块的节点作为"augment"and"deviation"语句的目标节点。强制性的"prefix"子语句为被导入的模块分配了一个前缀,其作用范围为正在导入其他模块(importingmodule)的模块或子模块。可以指定多个"import"语句从不同模块导入。当指定可选的"revision-date"子语句时,本模块定义中引用的任何typedef、grouping、extension、feature和identity,都将取自被指定模块指定的修订版本。如果指定的被导入模块的修订版本不存在,则是一个错误。如果没有指定"revision-date",则使用哪个修订版本是未定义的。不得导入同一模块的不同修订版本。import的子语句:子语句章节基数prefix7.1.41第42页/共156页RFC6020YANG-NETCONF数据建模语言revision-date7.1.5.10..17.1.5.1import的revision-date语句import的"revision-date"语句用来指定被导入模块的精确版本。"revision-date"语句的取值必须与被导入模块中的最新的"revision"语句保持一致。7.1.6include语句"include"语句使得一个子模块的内容对其父亲模块或兄弟模块(其他子模块)变得可用。语句的参数是被包含子模块的标识符。模块只能包含属于同一模块的子模块,通过"belongs-to"语句定义这种关系。子模块只能包含属于同一子模块的其他子模块(兄弟模块)。当一个模块包含一个子模块时,子模块的内容被合并到模块的节点层次结构中。当一个子模块包含另一个子模块时,目标模块的定义对当前子模块变得可用。当可选的"revision-date"子语句出现时,则子模块指定的修订版本被包含进模块中。如果指定模块不存在的修订版本是一个错误。如果没有"revision-date"子语句存在,则包含子模块的哪个修订是未定义的。不得包含同一模块的不同修订版本。"include"语句的子语句:子语句章节基数revision-date7.1.5.10..17.1.7organization语句"organization"语句定义了该模块的责任方,语句的参数是一个字符串,该字符串描述了主持模块开发的组织信息。7.1.8contact语句"contact"语句模块的联系人信息,语句的参数是一个字符串,该字符串指定了应该向谁咨询有关此模块技术问题的人员信息,比如他们的名字、邮编地址、电话号码和电子邮件地址。第43页/共156页RFC6020YANG-NETCONF数据建模语言7.1.9revision语句"revision"语句指定了该模块包括初始版本在内的编辑修订历史。一系列的revision语句详述了本模块定义的变化。语句的参数是一个格式为"YYYY-MM-DD"的日期字符串,后跟包含详细修订内容的子语句块。一个模块至少要有一个初始"revision"语句。对于每次发布的编辑修改,都应该在修订序列的前排增加一条记录,所以所有的修订是按日期倒序排列的。7.1.9.1revision的子语句子语句章节基数description7.19.30..1reference7.19.40..17.1.10使用范例moduleacme-system{namespace"http://acme.example.com/system";prefix"acme";importietf-yang-types{prefix"yang";}includeacme-types;organization"ACMEInc.";contact"JoeL.UserACME,Inc.42AnywhereDriveNowhere,CA95134USAPhone:+18005550100EMail:joe@acme.example.com";description"ThemoduleforentitiesimplementingtheACMEprotocol.";revision"2007-06-09"{description"Initialrevision.";第44页/共156页RFC6020YANG-NETCONF数据建模语言}//definitionsfollow...}7.2submodule语句YANG的主要单元是模块,一个模块可以由多个子模块组成。子模块允许设计者将一个复杂的模型分解成多个部分(pieces),所有的子模块共同使用一个名称空间,该名称空间由包含子模块的模块定义。"submodule"定义了子模块的名字,并且将属于子模块的所有语句组合到一起。"submodule"的参数就是子模块的名字,后跟一个详述子模块信息的子语句块。子模块命名规则遵从6.2章节中关于标识符的命名规则。RFC流[RFC4844]中发布的子模块的名称必须由IANA分配,请参阅第14节。私有子模块的名字由模块的所属组织分配,不需集中注册。推荐子模块取名时降低和其他组织或标准定义的子模块冲突的可能性,比如使用企业或组织的名字作为子模块名字的前缀。一个典型的子模块的内容布局如下:submodule{//moduleidentification//linkagestatements//metainformation//revisionhistory//moduledefinitions}7.2.1子模块的子语句子语句章节基数anyxml7.100..n第45页/共156页RFC6020YANG-NETCONF数据建模语言augment7.150..nbelongs-to7.2.21choice7.90..ncontact7.1.80..1container7.50..ndescription7.19.30..1deviation7.18.30..nextension7.170..nfeature7.18.10..ngrouping7.110..nidentity7.160..nimport7.1.50..ninclude7.1.60..nleaf7.60..nleaf-list7.70..nlist7.80..nnotification7.140..norganization7.1.70..1prefix7.141reference7.19.40..1revision7.1.90..nrpc7.130..ntypedef7.30..nuses7.120..nyang-version7.1.20..17.2.2子模块的子语句"belongs-to"语句指定子模块所属的模块,语句的参数是子模块所属的模块的名字。子模块只能被其所属的模块包含,或者被属于同一模块的其他子模块包含。必选的"prefix"子语句为子模块所属的模块指定了一个前缀,本地模块和任何被包含的子模块的所第46页/共156页RFC6020YANG-NETCONF数据建模语言有定义都可以通过该前缀访问。"belongs-to"语句的子语句:子语句章节基数prefix7.1417.2.3使用范例submoduleacme-types{belongs-to"acme-system"{prefix"acme";}importietf-yang-types{prefix"yang";}organization"ACMEInc.";contact"JoeL.UserACME,Inc.42AnywhereDriveNowhere,CA95134USAPhone:+18005550100EMail:joe@acme.example.com";description"ThissubmoduledefinescommonACMEtypes.";revision"2007-06-09"{description"Initialrevision.";}//definitionsfollows...}7.3typedef语句"typedef"语句定义了一个新类型,该新类型可以被本模块使用,同时按照5.5章节定义的规则,该新类型可以被包含他的模块或者子模块使用,也可以被被导入它的模块使用。新的类型被称为派生类型("derivedtype"),新的类型基于的类型称为基础类型("basetype")。所有的派生类型最终都会回溯到YANG的内置类型。"typedef"的参数是一个标识符,该标识符是新定义的派生类型的名字,并且必须紧跟一个详述新第47页/共156页RFC6020YANG-NETCONF数据建模语言类型信息的子语句块。派生类型的名字不得是YANG内置类型的任何一个。如果typedef在YANG模块或子模块的顶层定义,则类型的名字必须在整个模块内唯一。7.3.1typedef语句的子语句子语句章节基数default7.3.40..1description7.19.30..1reference7.19.40..1status7.19.20..1type7.3.21units7.3.30..17.3.2typedef的type语句"type"语句必须出现,指示该派生类型基于的基础类型。进一步信息参考7.4章节。7.3.3typedef的units语句"units"语句,是可选的,它以一个字符串作为参数,该字符串包含该类型关联的度量单位的文本定义。7.3.4typedef的default语句"default"语句以一个字符串作为参数,该字符串包含了新类型的默认值。"default"语句的取值必须属于基础类型的合法取值范围。如果基础类型有默认值,并且新的派生类型不需要指定一个新的默认值,则基础类型的默认值同样作为新的派生类型的默认值。如果基础类型的默认值,不满足派生类型或叶子定义指定的相应约束,则派生类型或叶子定义必须指定一个新的默认值,以兼容这些约束。第48页/共156页RFC6020YANG-NETCONF数据建模语言7.3.5使用范例typedeflisten-ipv4-address{typeinet:ipv4-address;default"0.0.0.0";}7.4type语句"type"语句以YANG内置类型(参考章节9)或者派生类型(参考章节7.3)的名字字符串作为参数,后跟一个可选的用来对类型施加进一步限制的子语句块。能够施加的限制取决于正要被限制的类型,所有内置类型的限制语句在第9章的对应章节中描述。7.4.1type的子语句子语句章节基数bit9.7.40..nenum9.6.40..nlength9.4.40..1path9.9.20..1pattern9.4.60..nrange9.2.40..1require-instance9.13.20..1type7.40..n7.5container语句"container"语句用来定义架构树中的一个内部数据节点,它指定一个参数,该参数是一个标识符,后跟一个包含容器(container)详细信息的子语句块。一个容器节点不能包含值,但是它包含数据树中子节点列表。孩子节点通过容器的子语句定义。第49页/共156页RFC6020YANG-NETCONF数据建模语言7.5.1在场container(PresenceContainer)YANG支持两种风格的容器,一类只是为了组织数据节点层次结构而存在;另一类在配置数据中出现时有明确的含义。对于第一种类型,容器自身没有意义,存在只是为了容纳子节点,这是默认风格。举例来说,同步光网络(SONETC)接口拼凑(scrambling)选项的集合可以被放置于"scrambling"容器里,以加强配置层次结构的组织,并且保持这些节点在一起。"scrambling"节点自身没有意义,所以移除这些孩子节点直到为空时,使得用户执行这个任务得以解除(即不需显式删除"scrambling"?)。对于第二种类型,容器的存在本身就是配置数据,表示了配置数据的一部分。这类容器既是配置节(knob),又是组织相关配置的一种方式。这种容器是显式创建和删除的。YANG将这类风格称为在场容器"presencecontainer",并且使用"presence"语句指示,其以一个字符串作为参数,该字符串指示节点存在的含义(或者说为何存在)。举例来说,一个"ssh"容器可以表示使能通过ssh登录设备的功能,但是还可以包含任何ssh相关的配置参数(knobs),比如连接速率或者重试限制。"presence"语句(参见7.5.5章节)用于为数据树中容器的存在提供语义。7.5.2container子语句子语句章节基数anyxml7.100..nchoice7.90..nconfig7.19.10..1container7.50..ndescription7.19.30..1grouping7.110..nif-feature7.18.20..nleaf7.60..nleaf-list7.70..nlist7.80..nmust7.5.30..n第50页/共156页RFC6020YANG-NETCONF数据建模语言presence7.5.50..1reference7.19.40..1status7.19.20..1typedef7.30..nuses7.120..nwhen7.19.50..17.5.3must语句"must"语句是可选的,以一个包含XPath表达式的字符串作为参数,它被用来正式的声明对有效数据的约束。约束按照第8章定义的规则被强制执行。当一个数据存储被验证有效后,对于数据树上每个节点和所有的叶子节点的默认值(参考7.6.1),所有的"must"约束都从概念上评估一次。如果一个数据节点在数据树上不存在,并且没有默认值,则它的"must"语句不需要评估。为了验证数据有效性,所有的这些约束都必须为真。除了6.4.1章节中的定义外,XPath表达式在以下上下文中从概念上进行评估:o上下文节点是数据树中指定"must"语句的节点。o可访问树由数据树中的所有节点和所有使用默认值的所有叶子组成。可访问树取决于于上下文节点:o如果上下文节点表示配置,则树是上下文节点所在的NETCONF配置存储中的数据。XPath根节点包含了所有模块中所有顶层的配置数据节点作为孩子节点。o如果上下文节点表示状态数据,则树是设备上的所有状态数据,和配置存储。XPath根节点包含所有模块的所有顶层节点作为孩子节点。o如果上下文节点表示通知内容,则树是通知XML实例文档。XPath根节点包含定在定义的标识通知的元素作为唯一的孩子节点。o如果上下文节点表示RPC输入参数,则树是RPCXML实例文档,XPath根节点将表示正被定义的RPC操作的元素作为唯一的孩子节点。o如果上下文节点表示RPC输出参数,则树是RPC应答实例文档,XPath根节点将表示RPC输出参数的元素作为孩子节点。XPath表达式的结果使用标准的XPath规则转换为一个布尔值。第51页/共156页RFC6020YANG-NETCONF数据建模语言需要注意的是,因为树中的所有的叶子值从概念上都以它们的规范格式存储(参见7.6和7.7章节),任何XPath比较都以其规范格式完成。另外,XPath表达式是从概念上评估的,这意味着一个实现不必在设备上使用XPath评估器。在实现时,如何完成评估由具体的实现确定。7.5.4must的子语句子语句章节基数description7.19.30..1error-app-tag7.5.4.20..1error-message7.5.4.10..1reference7.19.40..17.5.4.1error-message语句"error-message"语句是可选的,以一个字符串作为参数。如果约束评估为假,则字符串作为元素的值。7.5.4.2error-app-tag语句"error-app-tag"语句是可选的,以一个字符串作为参数,如果约束评估为假,则字符串作为元素的子元素的值。7.5.4.3must和error-message的使用范例containerinterface{leafifType{typeenumeration{enumethernet;enumatm;}}leafifMTU{第52页/共156页RFC6020YANG-NETCONF数据建模语言typeuint32;}must"ifType!=’ethernet’or"+"(ifType=’ethernet’andifMTU=1500)"{error-message"AnethernetMTUmustbe1500";}must"ifType!=’atm’or"+"(ifType=’atm’andifMTU<=17966andifMTU>=64)"{error-message"AnatmMTUmustbe64..17966";}}7.5.5presence语句"presence"语句给数据树中容器的存在分配含义。它以包含节点存在意义的文本描述字符串作为参数。如果容器存在"presence"语句,则数据树中容器的存在承载了特定的含义,否则,容器用于为数据给出一个结构,它自身不承载任何意义。参考7.5.1章节获取更多信息。7.5.6容器子节点语句在容器中,"container","leaf","list","leaf-list","uses","choice",and"anyxml"这些语句可以定义容器的子节点。7.5.7XML映射规则一个容器节点被编码为一个XML元素,元素的本地名字是容器的标识符,并且它的名称空间是模块的XML名称空间(参考章节7.1.3)。容器的孩子节点被编码为容器元素的子元素,如果容器定义的时RPC输入或输出参数,这些子元素被编码的顺序和在"container"语句中的顺序保持一致,否则,子模块可以以任意顺序编码。NETCONFServer响应请求时,如果容器节点没有"presence"语句并且没有孩子节点存在,可以选择不发送容器节点。因此,客户端收到一个请求的应答时,必须能够处理这种没有"presence"语句的容器节点不会出现在XML里的情况。第53页/共156页RFC6020YANG-NETCONF数据建模语言7.5.8NETCONF操作可以通过,使用节点XML元素中的"operation"属性(参考RFC47417.2章节),对容器进行创建、删除、替换、修改操作。如果容器没有"presence"语句,并且最后一个孩子节点被删除,则NETCONFServer可以删除这个容器。当NETCONFServer处理请求时,对于容器节点的处理要素:1.如果操作时"merge"或"replace",如果节点不存在,则创建它;2.如果操作是"create",节点不存在时创建它;如果节点存在,返回"data-exists"错误3.如果操作是"delete",则节点存在时被删除,如果不存在,返回"data-missing"错误7.5.9使用范例给定如下容器定义:containersystem{description"Containsvarioussystemparameters";containerservices{description"Configureexternallyavailableservices";container"ssh"{presence"EnablesSSH";description"SSHservicespecificconfiguration";//moreleafs,containersandstuffhere...}}}对应的XML实例的例子:因为存在元素且在架构模型上为presence容器节点,则ssh被使能。通过删除容器,此时ssh功能被禁用:第54页/共156页RFC6020YANG-NETCONF数据建模语言7.6leaf语句"leaf"语句用于定义架构树(schematree)中的叶子节点,它以一个标识符作为参数,后跟一个描述叶子具体信息的子语句块。叶子节点有值,但是在数据树中没有孩子节点。从概念上说,数据树中的值始终采用规范形式(参考9.1章节)。每个叶子节点在数据树中存在0或1个实例。"leaf"语句用于定义特定内置类型或派生类型的标量变量(特定单个类型的变量为leaf,特定单个类型的数组称为leaf-list,而多个相同或不同类型组成的结构为container,多个相同或不同类型组成结构的数组称为list)。7.6.1叶子的默认值叶子的默认值是叶子不出现在数据树中时,server侧为该叶子使用的值。默认值的使用取决于叶子在架构树中最近的祖先节点不是一个no-presence容器:o如果在架构树中,不存在这样的祖先节点(非no-presence容器)存在,则必须使用默认值;o否则,如果祖先节点是一个case节点,则必须使用默认值:如果在数据树中case节点存在任何节点;或者该该case节点是choice的默认case,并且在数据树中其他case中没有节点。在上述情况下,可以认为在使用默认值。当使用默认值时,服务器在操作上的行为必须和叶子节点在数据中以默认值存在数据树中一样。如果一个叶子有"default"语句,则叶子的默认值是"default"语句的值。否则,如果叶子节点的类型第55页/共156页RFC6020YANG-NETCONF数据建模语言有默认值,并且该叶子不是必选的,则叶子的默认值是该类型的默认值。在其他所有情况下,叶子没有默认值。7.6.2叶子的子语句子语句章节基数config7.19.10..1default7.6.40..1description7.19.30..1if-feature7.18.20..nmandatory7.6.50..1must7.5.30..nreference7.19.40..1status7.19.20..1type7.6.31units7.3.30..1when7.19.50..17.6.3叶子的type语句"type"语句,它是必选的,以一个现有的内置类型或派生类型的名字作为参数。optional语句用于指定叶子取值在此类型上的限制,具体参考7.4章节。7.6.4叶子的default语句"default"语句,是可选的,以一个包含叶子默认值的字符串作为参数。"default"的取值,必须按照叶子节点的"type"语句指定的类型取合法的值。在节点的"mandatory"为真时,不得出现"default"语句。第56页/共156页RFC6020YANG-NETCONF数据建模语言7.6.5叶子的mandatory语句"mandatory"语句,是可选的,一个取值为"true"或"false"的字符串作为参数,并且在有效数据上增加了一个约束条件。如果未指定"mandatory",则默认值是"false"。如果"mandatory"取值为"true",则约束行为取决于架构树上最近的祖先节点的类型不是一个non-presence容器类型(参考7.5.1):o如果在架构树上没有存在这样的祖先节点,则叶子必须存在o否则,如果祖先节点是一个case节点,并且在数据树中的case节点存在任何节点,则叶子必须存在o否则,如果架构树上存在祖先节点,则叶子节点必须存在这个约束按照第8章中定义的规则强制执行。7.6.6XML映射规则一个叶子节点被编码为XML的一个元素(element),元素的本地名字是叶子的标识符,并且它的名称空间是模块的XML名称空间(参考章节7.1.3)。叶子节点的取值按照类型编码进XML,并且在元素中字符数据发送。响应请求的NETCONFServer,可以选择不发送取值为默认值的叶子元素。因此,Client收到请求的应答时,必须准备处理这种取值为默认值的叶子不会出现在XML中的情况。在这种情况下,Server使用的是众所周知的默认值。参考章节7.6.8中的例子。7.6.7NETCONF操作NETCONFServer处理请求时,处理叶子节点的过程要素是:1.如果操作是"merge"或"replace",如果节点不存在则创建它,并且取值设置为XMLRPC数据中找到的值;2.如果操作是"create",如果节点不存在,则创建它。如果节点已存在,返回"data-exists"错误;3.如果操作是"delete",如果节点存在则删除之,如果不存在,返回"data-missing"错误。第57页/共156页RFC6020YANG-NETCONF数据建模语言7.6.8使用范例给定下边的"leaf"语句,置于7.5.9章节中定义的"ssh"容器中。leafport{typeinet:port-number;default22;description"TheporttowhichtheSSHserverlistens"}相应的XML实例的例子:2022使用修改一个叶子的值:20227.7leaf-list语句"leaf"语句用来定义一个特定类型的标量变量,而"leaf-list"语句用来定义一个特定类型的数组。"leaf-list"语句以一个标识符作为参数,后跟描述leaf-list详细信息的子语句块。leaf-list中的所有取值都必须是唯一的。从概念上说,数据树中的取值总是其规范格式(参考9.1章节)。第58页/共156页RFC6020YANG-NETCONF数据建模语言即使leaf-list引用的类型有默认值,它在leaf-list中也不起作用。7.7.1顺序YANG对于list和leaf-list中的条目支持两种排序规则。在大多数列表中,列表项的顺序不影响列表承载的配置的实施,并且设备可以随意的按照任何合理的顺序排序列表的条目。列表的"description"字符串可以给设备实现者提供排序建议。YANG称这种list排序风格为“系统排序”("systemordered"),并用“ordered-bysystem”表示(配置对顺序不敏感)。比如,一个有效用户的list一般以字母序排序,因为用户在配置数据中出现的顺序不会影响对其用户账户的判定。在另一个风格的列表,列表项的排序与列表承载的配置(配置对顺序敏感)有关系,并且由此决定条目的顺序,而设备必须保持该排序。YANG将这种列表风格称为“用户排序”("userordered"),并通过语句"ordered-byuser"表示。比如,应用于入站流量的防火墙过滤表条目的顺序会影响到流入如何被过滤。用户需要确定丢弃所有TCP流量的过滤条目应该在允许受信接口所有流量的条目之前或之后。此时,顺序的选择是至关重要的。YANG在操作中提供了丰富的措施,以允许在用户定义列表的列表条目的顺序可以被很好的控制。列表条目可以被插入或重排,可以指定在列表的首部或尾部,可以指定在某个特定条目之前或之后。"ordered-by"语句在7.7.5章节描述。7.7.2leaf-list的子语句子语句章节基数config7.19.10..1description7.19.30..1if-feature7.18.20..nmax-elements7.7.40..1min-elements7.7.30..1must7.5.30..nreference7.19.40..1status7.19.20..1第59页/共156页RFC6020YANG-NETCONF数据建模语言type7.6.31units7.3.30..1when7.19.50..17.7.3min-elements语句"min-elements"语句,是可选的,以一个非负整数作为参数,该整数限制有效列表条目的个数。一个有效的leaf-list或list必须至少有min-elements个条目。如果不存在"min-elements"语句,则默认值是0。约束的行为取决于leaf-list或list在架构树中最近的祖先节点的类型,不是一个nonpresence容器类型(参考章节7.5.1):o如果该祖先节点是一个case节点,如果case节点存在任何其他节点,则约束被强制执行。o否则,如果祖先节点存在,约束被强制执行根据第8节中的规则进一步实施约束。7.7.4max-elements语句"max-elements"语句,是可选的,以一个正数或者"unbounded"作为参数,该整数限制有效列表条目的个数。一个有效的leaf-list或list必须最多有max-elements个条目。如果没有"max-elements"语句,则默认是"unbounded"。"max-elements"的约束行为按照第8章定义的规则实施。7.7.5ordered-by语句"ordered-by"语句定义列表中条目的顺序是否由user或system决定。语句的参数是"system"或"user",如果没有指定,默认排序是"system"。如果list表示的是状态数据、RCP输出参数或者通知内容,则该语句被忽略。参考7.1.1章节获取更多细节。第60页/共156页RFC6020YANG-NETCONF数据建模语言7.7.5.1系统排序列表中的元素按照未定义的顺序排序。因此,实现可以自由选择按照最合适的顺序排序条目。实现必须对同样的数据使用同样的排序,不管数据是如何被创建的。使用确定的排序将使得使用简单的工具比如"diff"进行比较变得可能。这是默认的排序方法。7.7.5.2用户排序列表中的条目按照用户定义的顺序进行排序。这个顺序通过请求中的特殊的XML属性控制。参考7.7.7章节获取详细信息。7.7.6XML映射规则leaf-list节点被编码为一系列同级的XML元素。每个元素的本地名字是leaf-list的标识符,并且它的名称空间是模块的XML名称空间(参考7.1.3章节)。每个leaf-list条目的值按照类型编码为XML,并且在元素中作为字符发送。如果leaf-list的排序方式是“用户排序”,则XML元素表示leaf-list条目时,必须按照其出现的顺序排序。否则,排序由实现决定。表示leaf-list条目的XML元素可以和其他同级元素交错,除非leaf-list定义的是RPC输入或输出参数。参考章节7.7.8中的例子。7.7.7NETCONF操作通过,使用leaf-list条目的XML元素的"operation"属性,可以新建和删除,但是不能修改leaf-list条目。在一个"ordered-byuser"的leaf-list里,YANG名称空间里的"insert"和"value"属性可以用于控制条目插入leaf-list的位置。这可以用于在"create"操作期间插入一个新的leaf-list条目,或者在"merge"或"replace"操作期间插入一个新的leaf-list条目或移动一个现有的条目。"insert"属性可以取值"first"、"last"、"before"和"after"。如果取值第61页/共156页RFC6020YANG-NETCONF数据建模语言是"before"或"after",则"value"属性用于指定leaf-list中一个现有的条目。如果在"create"操作中没有"insert"属性,则默认值是"last"。如果一个“用户排序”的leaf-list的一些条目在同一个请求中被修改,则按照请求中XML元素的顺序,一次修改所有条目。在一个或带"replace"的的操作里,携带了整个leaf-list条目,则leaf-list条目的顺序和请求中的XML元素的顺序一致。当NETCONFServer处理请求时,处理leaf-list节点的要素如下:1.如果操作是"merge"或"replace",创建不存在的leaf-list条目;2.如果操作是"create",创建不存在的leaf-list条目;如果已经存在,返回"data-exists"错误;3.如果操作是"delete",删除存在的指定条目,如果不存在,返回"data-missing"错误。7.7.8使用范例leaf-listallow-user{typestring;description"Alistofusernamepatternstoallow";}对应的XML实例:alicebob使用默认"merge"操作,在列表中创建一个新元素:eric第62页/共156页RFC6020YANG-NETCONF数据建模语言给定如下用户排序的leaf-list:leaf-listcipher{typestring;ordered-byuser;description"Alistofciphers";}如下用于在"3des-cbc"之后插入一个新的加密套件"blowfish-cbc":blowfish-cbc7.8list语句"list"语句用于定义架构树的一个内部数据节点。一个list节点在数据树上可以出现多个实例,每个实例是一个列表条目。"list"语句指定一个参数,该参数为标识符,后跟定义列表详细信息的子语句块。列表通常被列表键(如果定义)的值唯一标识。第63页/共156页RFC6020YANG-NETCONF数据建模语言7.8.1list的子语句子语句章节基数anyxml7.100..nchoice7.90..nconfig7.19.10..1container7.50..ndescription7.19.30..1grouping7.110..nif-feature7.18.20..nkey7.8.20..1leaf7.60..nleaf-list7.70..nlist7.80..nmax-elements7.7.40..1min-elements7.7.30..1must7.5.30..nordered-by7.7.30..1reference7.19.40..1status7.19.20..1typedef7.8.30..nunique7.3.30..nuses7.120..nwhen7.19.50..17.8.2list的key语句"key"语句,当list表示配置时,其是必选的,否则是可选的。"key"语句以一个字符串作为参数,该字符串是一个以空格分隔的该列表的叶子标识符组成列表。一个叶子标识符在key中不得出现两次及以上,叶子可以直接在list的子语句块中定义,或者在列表使用的分组里定义。key语句中中指定的所有叶子节点的组合值用于唯一标识一个list,当创建一个列表项时,所有键第64页/共156页RFC6020YANG-NETCONF数据建模语言叶必须给值,因此,键叶的任何默认值或他们类型的默认值都会被忽略。这也暗示着,键叶中任何mandatory语句同样会被忽略。作为key的任何一个叶子节点,可以是任何内置类型或派生类型,除了内置类型"empty"之外。列表中的所有键叶的“配置”必须与列表本身具有相同的值。键字符串语法被第12章的"key-arg"规则正式定义。7.8.3list的unique语句"unique"语句用于对list中的条目施加约束。它以一个字符串作为参数,该字符串包含了一个空格分隔的架构中节点标识符的列表,且必须以后代(descendant)形式给出(参考第12章中的"descendant-schema-nodeid"规则),每个架构节点标识符必须引用一个叶子。如果一个引用的叶子表示的是配置数据,则所有引用的叶子都必须是配置数据。"unique"约束指定:参数字符串中指定的所有叶子实例的组合值,包括使用默认值的叶子,必须在所有引用叶子节点里的所有列表的实例范围内是唯一的。这个约束按照第8章中的规则被强制执行。unique字符串语法被第12章的"unique-arg"规则正式定义。7.8.3.1使用范例如下列表:listserver{key"name";unique"ipport";leafname{typestring;}leafip{typeinet:ip-address;}leafport{typeinet:port-number;}}如下的配置是非法的:smtp192.0.2.1第65页/共156页RFC6020YANG-NETCONF数据建模语言25http192.0.2.125如下的配置是合法的,因为“http”和“ftp”列表所有引用叶没有使用同一个值,因此在实施“unique”约束时未考虑在内:smtp192.0.2.125http192.0.2.1ftp192.0.2.17.8.4list的孩子节点语句在一个list里,"container"、"leaf","list"、"leaf-list"、"uses"、"choice"、"anyxml"语句可以用来定义list的孩子节点。7.8.5XML映射规则list被编码为一系列的XML元素,每个条目对应一个XML元素。每个元素的本地名字是list的标识符,并且它的名称空间是模块的XML名称空间(参考7.1.3)。列表的键节点被编码为列表标识元素的子元素,顺序与"key"语句中定义的顺序一致。列表的其他孩子节点在键节点之后编码为列表的子元素。如果list定义的时RPC输入或输出参数,则子元素编码的顺序与"list"列表中顺序保持一致,否则,子元素可以按任意顺序编码。注:上边描述的是list的每个结构体内部成员的元素的排序方式,下边是list的每个结构体成员的排序方式。第66页/共156页RFC6020YANG-NETCONF数据建模语言当列表的排序方式是"ordered-byuser"时,呈现列表条目的XML元素必须按照用户指定的顺序,否则顺序由实现确定。呈现列表条目的XML元素可以和其他兄弟元素交错,除非list定义的是RPC输入或输出参数。7.8.6NETCONF操作通过,使用列表的XML元素的"operation"属性,可以可以创建、删除、替换和修改列表中的成员。在每种情况下,所有key键的取值用于唯一标识一个列表成员,如果未索引到一个列表成员,返回"missing-element"错误。对于一个"ordered-byuser"列表,在YANGXML名称空间(参考5.3.1)的"insert"and"key"属性可以用来控制列表成员插入的位置。这些可以用在"create"操作期间插入一个新的列表成员,或者在"merge"or"replace"操作期间,插入一个新列表成员或移动一个现有的列表成员。"insert"属性可以取值"first","last","before",and"after",如果取值为"before"or"after",则必须同时使用"key"属性,以指定列表中一个现有的元素。"key"属性的取值是列表条目所有实例标识符(参考9.13章节)的键谓词(predicates)。就是说"key"属性的值用于唯一匹配列表中的多个成员中的一个。如果"create"操作没有指定"insert"属性值,则默认值是"last"。就是在最后插入。如果"ordered-byuser"列表的多个成员通过一个请求修改,则这些成员按照其在请求中XML元素出现的顺序,一次完成修改。一个或携带"replace"属性的的操作覆盖整个列表,列表成员的顺序与其在请求中XML元素的顺序保持一致。注:这个edit-configreplace操作与RFC6241有差别。当NETCONFServer处理一个请求时,对于列表中的每个节点的处理要素:1.如果操作是"merge"or"replace",如果列表条目不存在,则创建它。如果列表条目以存在,并且存在"insert"and"key"属性,则按照"insert"and"key"属性的取值移动该元素;如果列表元素存在,并且不存在"insert"and"key"属性,则不移动该条目;2.如果操作是"create",则创建不存在的列表条目;如果已经存在,返回"data-exists"错误;3.如果操作是"delete",则删除存在的列表条目,如果不存在,返回"data-missing"错误。第67页/共156页RFC6020YANG-NETCONF数据建模语言7.8.7使用范例给定如下的列表定义:listuser{key"name";configtrue;description"Thisisalistofusersinthesystem.";leafname{typestring;}leaftype{typestring;}leaffull-name{typestring;}}对应的XML实例:fredadminFredFlintstone创建一个新的用户"barney":barneyadminBarneyRubble第68页/共156页RFC6020YANG-NETCONF数据建模语言改变用户"fred"的type为"superuser":fredsuperuser给定如下用户排序的列表:listuser{description"Thisisalistofusersinthesystem.";ordered-byuser;configtrue;key"name";leafname{typestring;}leaftype{typestring;}leaffull-name{typestring;}}如下将会在user"fred"后插入一个新的用户"barney":第69页/共156页RFC6020YANG-NETCONF数据建模语言barneyadminBarneyRubble如下将用户"barney"移动到用户"fred"的前边:barney7.9choice语句"choice"语句定义了一个可选项集合,在任何时刻只能存在其中一个。参数是一个标识符,后跟一个描述choice详细信息的子语句块。标识符用来标识架构树中的选择节点,选择节点自身不会出现在数据树中。选择由多个分支组成,分支由"case"语句定义。每个分支包含多个孩子节点。最多只能存在一个选择分支第70页/共156页RFC6020YANG-NETCONF数据建模语言的节点。参考8.3.2获取额外信息。7.9.1choice子语句子语句章节基数anyxml7.100..ncase7.9.20..nconfig7.19.10..1container7.50..ndefault7.9.30..1description7.19.30..1if-feature7.18.20..nleaf7.60..nleaf-list7.70..nlist7.80..nmandatory7.9.40..1reference7.19.40..1status7.19.20..1when7.19.50..17.9.2choice的case语句"case"语句用于定义choice的分支,它以标识符作为参数,后跟包含case详细信息的子语句块。标识符用于标识架构树中的case节点,case节点自身并不出现在数据树中。在"case"语句中,"anyxml","choice","container","leaf","list","leaf-list",and"uses"语句可以作为case节点的孩子节点。所有这些孩子节点的标识符必须在choice语句的所有case中唯一,比如,下边是非法的:choiceinterface-type{casea{leafethernet{...}}第71页/共156页RFC6020YANG-NETCONF数据建模语言caseb{containerethernet{...}}}作为简写,如果case分支只包含单个"anyxml"、"container"、"leaf"、"list"或"leaf-list"语句,则"case"语句可以省略。在这种情况下,case节点的标识符和分支语句的标识符是一样的。举例如下:choiceinterface-type{containerethernet{...}containeratm{...}}等价于:choiceinterface-type{caseethernet{containerethernet{...}}caseatm{containeratm{...}}}case的标识符必须在整个choice范围内唯一。7.9.2.1case的子语句子语句章节基数anyxml7.100..nchoice7.90..ncontainer7.50..ndescription7.19.30..1if-feature7.18.20..nkey7.8.20..1leaf7.60..nleaf-list7.70..nlist7.80..nreference7.19.40..1status7.19.20..1uese7.120..n第72页/共156页RFC6020YANG-NETCONF数据建模语言when7.19.50..17.9.3choice的default语句"default"语句表明,如果没有case分支命中,则选择default指定的case作为默认分支。参数是"case"语句的标识符。如果没有"default",则没有默认分支。"default"语句不得出现在"mandatory"取值为true的choice语句中。default分支只有在节点的默认值在所有cases范围内时才是重要的。如果在所有的分支中没有匹配的节点,则使用默认分支节点的默认值。在defaultcase下,不得出现任何mandatory(参考章节3.1)节点。在一个分支下的孩子节点的默认值只有在该分支下存在该节点,或者该分支为默认分支,才会被使用。如果在该分支下没有这些节点,并且该分支不是默认分支,则该分支的孩子节点的默认值将被忽略。在这个例子中,choice的默认分支是"interval",并且当不存在"daily"、"time-of-day"、或"manual"时,则使用默认分支(值)。如果"daily"存在,则"time-of-day"的默认值将被使用。containertransfer{choicehow{defaultinterval;caseinterval{leafinterval{typeuint16;default30;unitsminutes;}}casedaily{leafdaily{typeempty;}leaftime-of-day{typestring;units24-hour-clock;default1am;}}casemanual{第73页/共156页RFC6020YANG-NETCONF数据建模语言leafmanual{typeempty;}}}}7.9.4choice的mandatory语句"mandatory"语句,它是可选的,以个字符串"true"或"false"作为参数,并对有效数据增加一个约束。如果"mandatory"取值为"true",指示必须存在一个来自该choice所有分支之一的一个节点。如果未指定,默认为"false"。约束的行为取决于choice在架构树上最近的祖先节点的类型,不是一个non-presence容器(参考章节7.5.1):o如果祖先节点是一个case节点,如果该case分支存在任何其他节点,则约束被强制实施;o否则,如果祖先节点存在,则被强制实施。约束根据第8章中的内容被进一步实施。7.9.5XML映射规则choice和case节点在XML中均不可见。如果孩子节点是RPC输入和输出参数定义的一部分,被命中的"case"语句的孩子节点的编码顺序必须和其在"case"语句中定义的顺序一样。否则,它们编码为XML子元素的顺序是不确定的。7.9.6NETCONF操作因为在任何时间只有choice的一个case分支生效,命中的case的一个节点的创建,暗示着删除了所有其他case的所有节点。如果操作从一个case创建一个节点,NETCONFServer将删除该choice下所有其他case的所有现存的节点。第74页/共156页RFC6020YANG-NETCONF数据建模语言7.9.7使用范例给定如下choice:containerprotocol{choicename{casea{leafudp{typeempty;}}caseb{leaftcp{typeempty;}}}}一个对应的XML实例:将协议从tcp改为udp:第75页/共156页RFC6020YANG-NETCONF数据建模语言7.10anyxml语句"anyxml"语句定义了架构树上的一个内部节点。它以一个标识符作为参数,后跟包含anyxml详细信息的子语句块。"anyxml"语句用于表示未知的XML块,对XML块没有任何约束。这是有用的,比如,在RPC应答中。一个例子是,带参数的操作的应答。anxml节点不能被扩充(参考7.5章节)。因为anyxml的使用限制了对内容的操作能力,因此"anyxml"不推荐用于表示配置数据。一个anyxml节点在数据中存在0个或一个实例。7.10.1anyxml子语句子语句章节基数config7.19.10..1description7.19.30..1if-feature7.18.20..nmandatory7.6.50..1must7.5.30..nreference7.19.40..1status7.19.20..1when7.19.50..17.10.2XML映射规则一个anyxml节点被编码为一个XML元素,元素的本地名字是anyxml的标识符,并且它的名称空间是模块的XML名称空间(参考7.1.3章节)。anyxml节点的值被编码为这个元素的内容。需要注意的是,编码中每个前缀都是每个实例编码的本地前缀,这意味着相同的XML可以由不同的实现进行不同的编码。第76页/共156页RFC6020YANG-NETCONF数据建模语言7.10.3NETCONF操作每个anyxml节点按照一个不透明数据块处理,此数据块只能被整体修改。一个anyxml节点的子元素出现了"operation"属性,也将会被NETCONFServer忽略。当NETCONFServer处理请求,对于anyxml节点的处理要素包括:1.如果操作是"merge"或"replace",则创建不存在的节点,并且其值被设置为XMLRPC数据中anyxml节点的XML内容。2.如果操作是"create",则创建不存在的节点,并且其值被设置为XMLRPC数据中anyxml节点的XML内容。如果节点已经存在,返回"data-exists"错误。3.如果操作是"delete",则删除存在的节点,如果不存在,返回"data-missing"错误。7.10.4使用范例给定如下"anyxml"语句:anyxmldata;如下是同一anyxml取值(data)的两种有效编码:117.11grouping语句"grouping"语句用来定义可重用的节点块,按照5.5章节定义的规则,可以让本模块、让包含它的其他模块、以及让import它的模块重用该节点块。它以一个标识符字符串作为参数,后跟描述分组详细信息的子语句块。"grouping"语句不是一个数据定义语句,因此,没有定义架构树中的任何节点。第77页/共156页RFC6020YANG-NETCONF数据建模语言一个分组类似于一个传统编程语言中的结构体(structure)或者记录(record)。一旦定义了分组,则可以使用"uses"(参考7.12章节)语句引用它。分组不得引用自身,包括通过直接或者通过一个其他分组链。如果分组定义在YANG模块或子模块的顶层,分组标识符在整个模块里必须是唯一的(即属于同一个模块的多个子模块的顶层不能定义同名的分组)。分组不仅仅是一种文本替换机制,还定义了一组节点。分组内部出现的标识符相对于定义分组所在的范围进行解析,而不是使用它的地方。前缀映射、类型名字、分组名字和扩展等用法都是在分组语句出现的层级结构中评估。对于扩展,这意味着扩展应用的对象是分组节点,而不是引用分组的节点(通过uses引用)节点。7.11.1group的子语句子语句章节基数anyxml7.100..nchoice7.90..ncontainer7.50..ndescription7.19.30..1grouping7.110..nleaf7.60..nleaf-list7.70..nlist7.80..nreference7.19.40..1status7.19.20..1typedef7.30..nuese7.120..n7.11.2使用范例importietf-inet-types{prefix"inet";}第78页/共156页RFC6020YANG-NETCONF数据建模语言groupingendpoint{description"Areusableendpointgroup.";leafip{typeinet:ip-address;}leafport{typeinet:port-number;}}7.12uses语句"uses"语句用于引用"grouping"的定义。它以分组的名字作为参数。"uses"引用一个分组的效果是由分组定义的节点被拷贝到当前架构树中,并且按照"refine"和"augment"语句进行更新。分组定义的标识符不会绑定到名称空间,直到分组的内容通过不出现在"grouping"语句中的"uses"语句添加到架构树中时,此时这些标识符绑定到当前模块的名称空间。7.12.1uses的子语句子语句章节基数augment7.150..1description7.19.30..1if-feature7.18.20..nrefine7.12.20..1reference7.19.40..1status7.19.20..1when7.19.50..17.12.2refine语句分组中的每个节点的属性可以通过"refine"改进,语句的参数是一个分组内某个节点的名字,该节点为目标改进节点。如果分组的某个节点没有作为"refine"的目标改进节点,则不改进它,并且使用其第79页/共156页RFC6020YANG-NETCONF数据建模语言在分组内的原有定义。参数字符串是子架构节点标识符(参考6.5章节)。如下的改进可以实施:o为叶子或choice节点增加一个默认值,或者修改已有的默认值;o给任意的节点增加一个特定的"description"字符串;o给任意的节点增加一个特定的"reference"字符串;o给任意的节点增加一个不同的"config"语句;o给leaf、anyxml或者choice节点增加一个不同的"mandatory"语句;o给容器节点增加"presence"语句;o给leaf、leaf-list、list、container或anyxml节点增加一个可选的"must"表达式;o给leaf-list或者list节点增加一个不同的"min-elements"or"max-elements"语句。7.12.3XML映射规则分组中的每个节点就像它是内联定义一样编码,即使分组是从另一个不同名称空间的其他模块导入的。7.12.4使用范例在某个模块的HTTPSserver的定义使用7.11.2章节中定义的"endpoint"分组,我们可以这样做:importacme-system{prefix"acme";}containerhttp-server{leafname{typestring;}usesacme:endpoint;}对应的XML实例的例子:extern-web192.0.2.180第80页/共156页RFC6020YANG-NETCONF数据建模语言如果端口80应该是HTTPServer的默认值,可以如下增加默认值:containerhttp-server{leafname{typestring;}usesacme:endpoint{refineport{default80;}}}如果我们要定义个server的列表,并且每个server由ip和port做为键,我们可以这样做:listserver{key"ipport";leafname{typestring;}usesacme:endpoint;}下边的例子是错误的:containerhttp-server{usesacme:endpoint;leafip{//illegal-sameidentifier"ip"usedtwicetypestring;}}7.13rpc语句"rpc"语句用于定义NETCONFRPC操作。它用一个标识符作为参数,后跟描述rpc具体信息的子语句块。参数为RPC的名字,并且直接用于元素之下的元素的名字,该名字由RFC4741中的替换组"rpcOperation"指定。"rpc"语句在架构树中定义了一个rpc节点。在rpc节点下,定义了一个带"input"名字的架构节点,和一个带"output"名字的架构节点。"input"和"output"被定义在模块的名称空间下。7.13.1rpc的子语句子语句章节基数第81页/共156页RFC6020YANG-NETCONF数据建模语言description7.19.30..1grouping7.110..nif-feature7.18.20..ninput7.13.20..1output7.13.30..1reference7.19.40..1status7.19.20..1typedef7.30..n7.13.2input语句"input"语句,是可选的,用来定义RPC操作的输入参数。它没有参数。"input"定义的节点在RPC方法的输入节点之下。如果input的叶子节点包含取值为"true"的"mandatory"语句,则这个节点必须出现在NETCONFRPC调用中,如果没有,Server必须返回"missing-element"错误。如果在input树中一个叶子节点有默认值,则NETCONFServer必须按照7.6.1章节描述的对应情况使用默认值。在这些情况中,虽然叶子没有指定值,但是Server表现的应该像NETCONFRPC调用实际包含了默认值的取值一样处理。如果在输入树中任何一个节点存在"config"语句,则忽略"config"语句。任何一个节点包含了"when"语句,且评估为false时,则此节点不得出现在输入树中。7.13.2.1input的子语句子语句章节基数anyxml7.100..1choice7.90..ncontainer7.50..ngrouping7.110..nleaf7.60..nleaf-list7.70..nlist7.80..n第82页/共156页RFC6020YANG-NETCONF数据建模语言typedef7.30..nuses7.120..n7.13.3output语句"output"语句,它是可选的,用来定义RPC操作的输出参数。它不指定参数,"output"的子语句定义的节点在RPC操作的输出节点中。如果输出树中一个节点包含一个取值为"true"的"mandatory"语句,则该叶子节点必须出现在NETCONFRPC应答中。如果输出树中一个叶子节点有默认值,则NETCONFClient必须按照7.6.1章节对应的情况取默认值,在这些情况中,Client操作行为必须像NETCONFRPC应答中实际带了默认值的取值一样处理。如果输出树中任何一个节点包含"config"语句,则忽略"config"语句。如果任何节点包含"when"语句,当评估为false时,则此节点不能出现在输出树中。7.13.3.1output的子语句子语句章节基数anyxml7.100..1choice7.90..ncontainer7.50..ngrouping7.110..nleaf7.60..nleaf-list7.70..nlist7.80..ntypedef7.30..nuses7.120..n7.13.4XML映射规则一个rpc节点被编码为[RFC4741]定义的元素的孩子XML节点。这个节点的名字是rpc节点的标识符,并且它的名称空间是模块的XML名字空间(参考7.1.3)。第83页/共156页RFC6020YANG-NETCONF数据建模语言输入参数被编码为rpc节点对应的XML元素的孩子XML元素,顺序与其在"input"语句中定义的一致。RFC4741规定,如果RPC操作调用成功,并且没有输出参数返回,则应答只包含单个元素。如果返回了输出参数,它们被编码为RFC4741定义的元素的孩子元素,顺序与"output"定义的顺序一致。7.13.5使用范例如下的例子定义了一个RPC操作:modulerock{namespace"http://example.net/rock";prefix"rock";rpcrock-the-house{input{leafzip-code{typestring;}}}}一个对应的完整的rpc请求和应答的XML实例的例子:27606-01007.14notification语句"notification"语句用于定义NETCONF通知(notification),它以一个标识符作为参数,第84页/共156页RFC6020YANG-NETCONF数据建模语言后跟包含通知消息具体信息的子语句块。"notification"语句在架构树中定义了一个通知节点。如果通知树中的一个叶子有一个取值为"true"的"mandatory"语句,则该叶子节点必须出现在NETCONF通知中。如果通知树中的叶子有默认值,则NETCONFClient必须参照7.6.1章节中对应的情况处理。在这些情况中,Client的行为从操作上必须和NETCONF通知携带取值和默认值相同的取值的处理一样(就是说有默认值的话,就像带了值并且和默认值的处理一样)。如果通知树中任何节点包含了"config"语句,"config"语句被忽略。7.14.1notification的子语句子语句章节基数anyxml7.100..1choice7.90..ncontainer7.50..ndescription7.19.30..1grouping7.110..nif-feature7.18.20..nleaf7.60..nleaf-list7.70..nlist7.80..nreference7.19.40..1status7.19.20..1typedef7.30..nuses7.120..n7.14.2XML映射规则通知节点被编码为RFC5277中定义的NETCONF事件通知元素中的孩子XML节点。元素的本地名称是通知的标识符,并且它的名称空间和模块的XML名称空间一样(参考7.1.3章节)。第85页/共156页RFC6020YANG-NETCONF数据建模语言7.14.3使用范例下边是定义通知的一个例子:moduleevent{namespace"http://example.com/event";prefix"ev";notificationevent{leafevent-class{typestring;}anyxmlreporting-entity;leafseverity{typestring;}}}完整通知的对应的XML实例:2008-07-08T00:01:00ZfaultEthernet0major7.15augment语句"augment"语句允许模块或子模块增加来自其他外部模块、或者来自当前模块及子模块,定义的架构树,并且可以增加通过使用"uses"语句引用分组的节点。语句的参数一个架构树中节点的标识符字符串,该节点称为augment的目标节点。目标节点必须是容器(container)、列表(lsit)、选择(choice)、分支(case)、输入(input)、输出(output)或通知(notification)节点中的一个。它用“augment”语句后面的子语句中定义的节点进行扩充(就是用augent参数引用的目标节点的子节点)。第86页/共156页RFC6020YANG-NETCONF数据建模语言参数字符串时架构节点标识符(参考6.5章节),如果"augment"语句在模块或子模块的顶层,则必须使用架构节点的绝对形式(参考第12章"absolute-schema-nodeid"规则)。如果"augment"语句是"uses"语句的子语句,则必须使用后代(descendant)形式(参考第12章定义的"descendant-schema-nodeid"规则)。如果目标节点是container、list、case、input、output或者notification节点,则"container","leaf"、"list"、"leaf-list"、"uses"和"choice"语句可以在"augment"语句中使用。如果目标节点是choice节点,则"case"语句或者case简写语句(参考章节7.9.2)可以在"augment"语句中使用。如果目标节点在另一个模块,则被augmentation增加的节点不得是mandatory节点(参考章节3.1)。"augment"语句不得将同一模块中具有相同名称的节点添加到目标节点。7.15.1augment的子语句子语句章节基数anyxml7.100..1case7.9.20..nchoice7.90..ncontainer7.50..ndescription7.19.30..1if-feature7.18.20..nleaf7.60..nleaf-list7.70..nlist7.80..nreference7.19.40..1status7.19.20..1uses7.120..nwhen7.19.50..1第87页/共156页RFC6020YANG-NETCONF数据建模语言7.15.2XML映射规则"augment"语句中定义的所有数据节点,被定义为在"augment"所在模块的名称空间内的XML元素。当一个节点被增强时(augmented),新增的孩子节点被编码为被增强节点的孩子元素,顺序随意。7.15.3使用范例在名称空间:http://example.com/schema/interfaces,定义了:containerinterfaces{listifEntry{key"ifIndex";leafifIndex{typeuint32;}leafifDescr{typestring;}leafifType{typeiana:IfType;}leafifMtu{typeint32;}}}然后,在名称空间:http://example.com/schema/ds0,有如下定义:importinterface-module{prefix"if";}augment"/if:interfaces/if:ifEntry"{when"if:ifType=’ds0’";leafds0ChannelNumber{typeChannelNumber;}}一个对应的XML实例:第88页/共156页RFC6020YANG-NETCONF数据建模语言1FlintstoneIncEthernetA562ethernetCsmacd15002FlintstoneIncDS0ds01说明:interface元素属于名称空间:http://example.com/schema/interfaces,interfaces元素下的所有节点都属于该默认名称空间,其中ds0ChannelNumber由另一个模块通过agumentinterfaces定义,该模块的名称空间是http://example.com/schema/ds0,所以该模块限定独立的名称空间。下边另一个例子,假定我们有定义在7.9.7中的choice,如下的结构可以用于扩展协议定义:augment/ex:system/ex:protocol/ex:name{casec{leafsmtp{typeempty;}}}对应的XML实例:第89页/共156页RFC6020YANG-NETCONF数据建模语言7.16identity语句"identity"语句用于定义一个新的全局唯一的,抽象的并且无类型的标识。它的唯一目的是表示它的名称、语义和存在。标识可以从头开始定义或者从基本身份派生。该语句的参数是标识名称的字符串,后跟详细描述给标识信息的子语句块。内置类型"identityref"(参考9.10)可以用来引用数据模型内部的身份。7.16.1identity的子语句子语句章节基数base7.16.20..1description7.19.30..1reference7.19.40..1status7.19.20..17.16.2base语句"base"语句,是可选的,以一个现有的标识的名字的字符串作为参数,基于此身标识派生新的身份。如果没有"base"语句,则从头定义标识。如果基本名字有前缀,它引用了一个定义在用那个前缀导入的模块里的标识,或者如果前缀与本地模块的前缀匹配,则是本地模块定义的标识。因为子模块不能包含父模块,模块中任何要暴露给子模块的标识必须定义在子模块中,然后子模块通过包含(include)子模块找到标识的定义。标识不能引用自身,包括不能直接引用或间接地通过其他标识链引用。7.16.3使用范例modulecrypto-base{namespace"http://example.com/crypto-base";prefix"crypto";identitycrypto-alg{第90页/共156页RFC6020YANG-NETCONF数据建模语言description"Baseidentityfromwhichallcryptoalgorithmsarederived.";}}moduledes{namespace"http://example.com/des";prefix"des";import"crypto-base"{prefix"crypto";}identitydes{base"crypto:crypto-alg";description"DEScryptoalgorithm";}identitydes3{base"crypto:crypto-alg";description"TripleDEScryptoalgorithm";}}7.17extension语句"extension"在YANG语言中定义新的语句,定义的新语句可以被其他模块导入(imported)和使用。语句的参数是代表该extension定义的新关键字的标识符,必须后跟描述扩展(extenson)具体信息的子语句块。extension的主要目的是定义新的关键词,所以它可以被其他模块导入和使用。新的扩展可以像正常的YANG语句一样使用,指定语句的名字,后跟该扩展定义的任何参数,再跟可选的子语句块。语句的名字是通过组合其所在定义的模块的前缀和":"以及扩展的关键词组合而成(没有交错的空格)。扩展的自语句由扩展定义,使用的机制超过本规范的范围。语法上,子语句必须是YANG语句,或者是其他通过"extension"定义的语句。扩展中的YANG语句必须遵从第12章定义的语法上的规则。7.17.1extension的子语句子语句章节基数第91页/共156页RFC6020YANG-NETCONF数据建模语言argument7.17.20..1description7.19.30..1reference7.19.40..1status7.19.20..17.17.2argument的子语句"argument"语句,它是可选的,以一个字符串作为参数,该字符串是关键字(就是extension定义的关键字)参数名。如果没有argument语句,则关键字在使用时没有参数。参数的名字在YIN映射中使用,根据属性的"yinelement"语句,它被用作XML属性或元素名字。7.17.2.1argument的子语句子语句章节基数yin-element7.17.2.20..17.17.2.2yin-element语句"yin-element"语句,它是可选的,以字符串"true"或"false"作为参数。该参数指示该参数被映射为YIN中的XML元素还是XML属性(参考第11章节)。如果没有"yin-element"语句存在,它的默认值是"false"。7.17.3使用范例定义一个扩展:modulemy-extensions{...extensionc-define{description"Takesasargumentanamestring.Makesthecodegeneratorusethegivennameinthe#define.";argument"name";}第92页/共156页RFC6020YANG-NETCONF数据建模语言}使用扩展:modulemy-interfaces{...importmy-extensions{prefix"myext";}...containerinterfaces{...myext:c-define"MY_INTERFACES";}}7.18一致性相关语句本章描述在5.6章节中描述的一致性相关语句。7.18.1feature语句"feature"(特性)语句用于定义一种将架构的一部分标记为可选的机制。特性的名字被定义为后续可以使用"if-feature"语句(参考章节7.18.2)引用。被标记为特性的架构节点被设备忽略,除非设备支持指定的特性。这使得YANG模型的某些部分基于设备是否支持从而是条件性的。这个模型可以表达在模型内部的设备的能力,给定一个丰富的模型以适用不同的设备能力和角色。"feature"语句的参数是一个新特性的名字,该名字遵从6.2章节定义的标识符规则。这个名字被"if-feature"语句将架构节点和特性绑定到一起。在下边这个例子中,一个称为"local-storage"的特性表示了设备可以在本地存储上按顺序存储syslog消息的能力。这个特性用于使得叶子节点"local-storage-limit"是条件性的,取决于某种类型的本地存储的出现。如果设备不上报它支持这个特性,则"local-storage-limit"节点不被支持。modulesyslog{...featurelocal-storage{description"Thisfeaturemeansthedevicesupportslocalstorage(memory,flashordisk)thatcanbeusedto第93页/共156页RFC6020YANG-NETCONF数据建模语言storesyslogmessages.";}containersyslog{leaflocal-storage-limit{if-featurelocal-storage;typeuint64;units"kilobyte";configfalse;description"Theamountoflocalstoragethatcanbeusedtoholdsyslogmessages.";}}}"if-feature"语句在YANG语法内可以在许多地方使用,如果设备不支持对应的特性,则带着"if-feature"标签的订阅将会被忽略。一个特性不得引用自身,不论是直接还是间接地通过其他特性链。设备要实现一个依赖其他特性的特性(比如特性包含一个或多个"if-feature"语句),则设备必须实现所有依赖的特性。7.18.1.1feature的子语句子语句章节基数description7.19.30..1if-feature7.18.20..nstatus7.19.20..1reference7.19.40..17.18.2if-feature语句"if-feature"语句使得它的父亲语句变为条件性的,语句的参数是由"feature"语句定义的特性的名字。父亲语句由支持此特性的Server实现,如果特性名字前出现了前缀,则它是指在引用该前缀导入的模块定义的特性(引入的模块声明了该前缀),如果该前缀与本地模块的前缀匹配,则是指本地模块。否则,第94页/共156页RFC6020YANG-NETCONF数据建模语言如果没有指定前缀,则引用的特性是本地模块或被包含子模块内部匹配的特性。因为子模块不能包含父亲模块,任何模块定义的需要暴露给其他子模块的特性,必须定义在子模块内部,从而子模块可以包含这个子模块去找到这个特性的定义。7.18.3deviation语句"deviation"(偏差)语句定义设备不能完全实现的模块的层次结构。参数是一个字符串,标识架构树中相对模块的哪个节点发生了偏差。该节点称为偏差目标节点。"deviation"语句给出了偏差的具体细节。参数字符串是一个绝对架构节点标识符(参考6.5章节)。偏差(Deviations)定义了一个或一类设备偏离标准的方式。这意味着偏差从来不是已发布标准的一部分,因为他们是学习如何实现与标准不同的机制(即先有标准才有偏差)。强烈建议不要使用偏差,并且只能作为最后的手段。告诉应用程序可以如何不遵从标准,并不能代替正确的实现标准,偏离模块的设备不能和模块完全兼容。然而,在某些情况下,一个特殊的设备也许没有对应的硬件或软件能力去支持标准模型的某部分。在这种情况下,设备可做的选择要么是将尝试对不支持部分的配置作为一个错误反馈给没有疑问的应用,或者忽略这个请求,这两种选择都不合适。相反,YANG允许设备通过使用"deviation"语句,记录基本模块中不受支持或者支持但是有不同的语法的部分。7.18.3.1deviation的子语句子语句章节基数description7.19.30..1deviate7.18.3.21..nreference7.19.40..17.18.3.2deviate语句"deviate"语句定义了设备对于目标节点与其原始定义偏差的实现,参数是如下字符串之一:"not-supported"、"add"、"replace"或"delete"。第95页/共156页RFC6020YANG-NETCONF数据建模语言参数"not-supported"表明设备未实现目标节点。参数"add"给目标节点增加成员(properties),增加的成员通过"deviate"语句的子语句标识。如果一个成员只能出现一次,则这个成员不得目标节点中已存在。参数"replace"替换目标节点的成员,被替换的成员通过"deviate"语句的子语句标识,被替换的成员必须存在与目标节点中。参数"delete"从目标节点删除成员。被删除的成员通过"delete"语句的子语句标识,子语句的关键字必须匹配目标节点中的关键字,并且参数的字符串必须与目标节点中对应的关键字的参数字符串一致。注:这里的成员指的是目标节点的子语句,"deviate""deviate"语句的子语句见下表:子语句章节基数config7.19.10..1default7.6.40..1mandatory7.6.50..1max-elements7.7.40..1min-elements7.7.30..1reference7.19.40..1must7.5.30..ntype7.40..1unique7.8.30..nunits7.3.30..17.18.3.3使用范例在下边的例子中,设备正通知客户端应用,它不支持RFC867风格的"daytime"服务:deviation/base:system/base:daytime{deviatenot-supported;}在下边的例子中,给一个没有默认值定义的叶子节点设置一个设备特定的默认值:deviation/base:system/base:user/base:type{deviateadd{default"admin";//newusersare’admin’bydefault}第96页/共156页RFC6020YANG-NETCONF数据建模语言}在下边的例子中,设备指定名字服务的数量限制为3:deviation/base:system/base:name-server{deviatereplace{max-elements3;}}原始的定义是:containersystem{must"daytimeortime";...}一个设备也许会像下边一样移除这个限制:deviation"/base:system"{deviatedelete{must"daytimeortime";}}7.19公共语句本章节定义其他几个语句共有的子语句。7.19.1config语句"config"语句以一个取值"true"或"false"的字符串作为参数。如果"config"为"true",表示当前定义为配置。表示为配置的数据节点将是对请求应答的一部分,并且可以在请求中发送。如果"config"为"false",则表示定义的是状态数据。表示为状态的数据节点可以是应答的一部分,但是不能作为应答的一部分,并且不能在请求中发送。如果未指定"config",则默认值和父亲架构节点的"config"取值一致。如果父亲节点是"case"节点,则取值和"case"的父亲"choice"节点的一致。如果顶层节点没有指定"config"语句,则默认值为"true"。如果节点的"config"配置为"false",则其下的任何节点都不能将其"config"设置为"true"。第97页/共156页RFC6020YANG-NETCONF数据建模语言7.19.2status语句"status"语句以取值为current"、"deprecated"或"obsolete"的字符串为参数。o"current"表示定义是当前的并且有效o"deprecated"表示一个过时的定义(过时中),但是允许新的/继续的实现,以保持与较早或现有的实现的互操作性。o"obsolete"表示定义过时,并且不应该被实现,并且/或者从现有实现中移除。如果没有指定状态,默认值为"current"。如果定义是"current",它不得引用同模块中的"deprecated"或"obsolete"定义。如果定义是"deprecated",则不得引用同模块中"obsolete"定义。比如,下边的例子是非法的:typedefmy-type{statusdeprecated;typeint32;}leafmy-leaf{statuscurrent;typemy-type;//illegal,sincemy-typeisdeprecated}7.19.3description语句"description"语句以一个描述定义的人类可读的字符串作为参数。文本由模块的开发人员选择一种或多种语言提供。为了互操作性,推荐选择一种将在使用该模块的网络管理者社区中被广泛理解的语言。7.19.4reference语句"reference"语句一个字符串作为参数,该字符串用来指定对外部文档的文本性的交叉引用。被引用的外部文档定义了相关管理信息,或者提供了该定义的相关信息。比如,对"uri"数据类型的定义看起来是这样的:typedefuri{typestring;reference第98页/共156页RFC6020YANG-NETCONF数据建模语言"RFC3986:UniformResourceIdentifier(URI):GenericSyntax";...}7.19.5when语句"when"语句使得其父亲数据定义语句变为条件性的(或者说父亲节点定义出现条件)。由父亲数据定义的节点只有在"when"语句指定的条件被满足时才是有效的。语句的参数是一个XPath表达式(参考章节6.4),它用于正式确定条件。如果XPath表达式对于特定实例从概念上评估为"true",则被父亲数据定义语句定义的节点是有效的,否则无效。参考8.3.2获取更多信息。除了6.4.1章节的定义之外,XPath表达式还在如下上下文中进行评估,:o如果"when"语句是"augment"语句的孩子,则上下文节点是数据树中augment语句的目标节点,前提是目标节点是数据节点;否则,上下文节点是与也是数据节点的目标节点最接近的祖先节点。o如果"when"语句是"uses"、"choice"或"case"语句的孩子,则上下文节点是这些节点的最近的是数据节点的祖先节点。o如果"when"语句是其他数据定义语句的孩子,则上下文节点是数据树中该数据定义的节点。o可访问树由数据树中所有节点,以及所有使用默认值的叶子组成(参考7.6.1章节)。可访问树取决于上下文节点:o如果上下文节点表示配置,则树是存在上下文节点的NETCONF数据存储中的数据。XPath根节点包含所有模块中的所有顶级配置数据节点作为孩子;o如果上下文节点表示状态数据,则树是设备上的所有状态数据,以及数据存储。XPath根节点包含所有模块中的所有顶级数据节点作为孩子;o如果上下文节点表示通知内容,则树是通知XML实例文档。XPath根节点包含表示正在定义的通知元素作为唯一的孩子。o如果上下文节点表示RPC输入参数,则树是RPCXML实例文档。XPath根节点包含描述正在定义的RPC操作的元素作为唯一的孩子。o如果上下文节点表示RPC输出参数,则树是RPC应答XML实例文档。XPath根节点包含描述RPC输出参数的元素作为孩子。XPath表达式的结果根据标准的XML规则被转换为布尔值。需要注意的是,XPath表达式是从概念上进行评估。这意味着,实现不是必须要在设备上实现一个Xpath评估器,“when”语句可以用专门编写的代码很好地实现。第99页/共156页RFC6020YANG-NETCONF数据建模语言8约束8.1数据约束许多YANG语句在有效数据上定义约束(constraints)。这些约束通过不同的方式实施,取决于语句定义的数据类型。o如果约束定义在配置数据上,则在有效配置数据树上必须为真;o如果约束定义在状态数据上,在应答一个没有过滤器的操作时,必须为真;o如果约束定义在通知内容上,在任何通知实例上必须为真;o如果约束定义在RPC输入参数上,在RPC操作的调用上必须为真;o如果约束定义在RPC输出参数上,在RPC应答里必须为真。8.2约束层次父亲节点上的约束影响孩子节点的约束,是节点层次结构下的自然结果。如果父亲节点在当前设备上有不被满足的"when"或"if-feature"属性(property),则"must"、"mandatory"、"min-elements"和"max-elements"约束不被实施。在下边的例子里,"longitude"叶子上"mandatory"约束不会被实施,因为设备上不支持"has-gps"特性(feature):containerlocation{if-featurehas-gps;leaflongitude{mandatorytrue;...}}8.3约束执行模型对于配置数据,存在三个约束必须实施的窗口:o在解析RPC载荷期间第100页/共156页RFC6020YANG-NETCONF数据建模语言o在处理NETCONF操作期间o在验证期间每个场景在下述每个章节分别考虑。8.3.1载荷解析当RPC载荷到达时,它必须是良够的XML,并遵循设备实现的所有模型定义的层次和内容规则。o如果叶子数据的取值不匹配leaf的类型约束,包括那些定义在类型上的"range"、"length"和"pattern"属性,则Server必须返回携带"invalid-value"错误标签的rpc-error,同时在errorapp-taganderror-message携带约束信息(如果存在);o如果一个列表成员的所有键都不存在,Servr必须返回携带"missing-element"错误标签的rpc-error;o如果一个choice的多个分支存在数据,则Server必须返回携带"bad-element"的rpc-error;o如果带标签"if-feature"节点的数据存在,并且feature不必设备所支持,则Server必须返回携带"unknown-element"错误标签的rpc-error;o如果带标签"when"节点的数据存在,并且"when"条件评估为"false",则Server必须以携带"unknown-element"错误标签的rpc-error作为应答;o对于插入处理,如果属性"before"和"after"对于相应的键叶类型无效,则Servre必须以携带"bad-attribute"错误标签的rpc-error作为应答;o不是一个"ordered-by"取值为"user"的列表的元素中出现"before"和"after"属性(就是只有用户排序的列表才能指定位置操作),则Server必须返回携带"unknown-attribute"错误标签的rpc-error作为应答;8.3.2NETCONF操作在解析传入的数据之后,NETCONFServer执行操作,将数据应用于配置数据存储。在此处理过程中,必须检测如下错误:o删除对不存在数据的请求o创建对存在数据的请求o插入带"before"或"after"参数且指定位置的元素不存在的请求第101页/共156页RFC6020YANG-NETCONF数据建模语言在处理期间:o如果NETCONF操作创建"choice"下的数据节点,则任何存在的其他"case"分支下的节点将被Server删除;o如果NETCONF操作修改那些节点的"when"表达式变为false,则该带"when"表达式的节点被Server删除;8.3.3验证当数据存储处理完成后,最终内容必须服从所有的认证约束。验证处理按照配置数据存储类型在不同的时间执行。如果数据存储是,这些约束必须在操作的最后实施。如果数据存储是,则约束执行被推迟到操作中。o所有"must"约束必须为"true";o"path"语句定义的任何参照性约束必须满足o列表上的任何"unique"约束必须满足olist和leaf-list的"min-elements"和"max-elements"约束必须被满足9内置类型和其他许多编程语言一样,YANG有一组内置类型集合,但是由于来自管理信息模型上的特殊需求,和其他编程语言有一些差异。通过从那些内置类型或者其他派生类型,可以定义其他类型。派生类型可以使用子类型来显式取值的范围。不同的内置类型和他们的派生类型允许不同的子类型,即长度或正则表达式限制(参考9.4.4和9.4.6)和数字类型(9.2.4章节)的取值范围限制。当在YANG模型中指定默认值或数字值的范围时,则在NETCONF消息中,使用特定类型取值的词汇形式。第102页/共156页RFC6020YANG-NETCONF数据建模语言9.1表示规范对于大多数类型,类型值只有一个规范的表示。某些类型允许同一个取值有多种表示形式,比如,正整数值"17"可以表示为"+17"或"17"。实现必须支持本文档中指定的所有的词汇表示形式。当NETCONFServer发送数据时,它必须是规范的形式。某些类型有一个词法形式取决于其它们出现的XML上下文,这些类型没有规范的形式。9.2整数内置类型整数内置类型有int8、int16、int32、int64、uint8、uint16、uint32和uint64。它们表示不同大小的有符号和无符号整数:int8表示在[-128,127]间的证书;int16表示在[-32768,32767]间的整数;int32表示在[-2147483648,2147483647]间的整数;int64表示在[-9223372036854775808,9223372036854775807]整数;uint8表示在[0,255]间的整数;uint16表示在[0,65535]间的整数;uint32表示在[-0,4294967295]间的整数;uint64表示在[-0,18446744073709551615]整数;9.2.1词汇形式一个整数从词法上表示为一个可选的正负号("+"或"-"),后跟一个十进制数字序列。如果没有指定正负号,默认为正("+")。为了方便起见,YANG模块指定整数类型的默认值时,词法上有一种被备选方案可以使用,即用十六进制或八进制表示一个值。十六进制表示法由可选的正负号、字符串0x后跟一系列的十六进制数字表示,此时字母可以是大写或小写。八进制标记法由可选的正负号、字符0,后跟一系列的八进制数字组成。注意,如果YANG模块的默认值有一个前导0,它被解释为一个八进制数。在XML实例文档汇中,一个整数总是被解释为10进制数字,并且前导0也是允许的。举例:第103页/共156页RFC6020YANG-NETCONF数据建模语言//合法的值+4711//合法的正数4711//合法的正数-123//合法的负数0xf00f//合法的正16进制数-0xf//合法的负16进制数052//合法的八进制数//非法的数-1//正负号和数字间不能有空格9.2.2规范形式正整数的规范形式不包含"+",且禁止前导0。值零表示为"0"。9.2.3限制所有的整数类型可以通过"range"语句指定范围(参考9.2.4)。9.2.4rang语句"range"语句,是"type"语句可选的子语句,以一个范围表达式作为参数,用于限制整数和十进制内置类型,或从这些类型的派生类型。范围由一个显式的值或者一个下限边界,两个连续的"..",和一个上限范围。可以给定多个值或范围,通过""分隔。如果给定多个值或范围,它们必须不相交并且按升序排列。如果将限制范围应用于已经受范围限制的类型,则新限制必须等于或更加严格,比如抬高下边界、降低上边界、移除特定的值或范围、或者使用不连接间隔将范围分为更多的子范围。范围表达式中的每个显式值和范围边界值必须匹配正在限制的类型,或者是特定取值"min"或"max","min"和"max"分别标志被限制类型的可接受的最小值和最大值。范围表达式语法在第12章的"range-arg"规则定义。9.2.4.1range的子语句子语句章节基数第104页/共156页RFC6020YANG-NETCONF数据建模语言description7.19.30..1error-app-tag7.5.4.20..1error-message7.5.4.10..1reference7.19.40..19.2.5使用范例typedefmy-base-int32-type{typeint32{range"1..410..20";}}typedefmy-type1{typemy-base-int32-type{//legalrangerestrictionrange"11..max";//11..20}}typedefmy-type2{typemy-base-int32-type{//illegalrangerestrictionrange"11..100";}}9.3decimal64内置类型decimal64类型表示实数的子集,可以用十进制数字表示。decimal64的取值范围是一个数字的集合,集合可以通过一个64-bit的整数乘以一个以10为底以一个负数n为幂的值得到,比如表达式"ix10^-n",其中i是一个integer64证书,并且n是一个[1,18]的整数。9.3.1词法表示decimal64的值从词法上表示为一个正负号("+"or"-")、后跟一系列的十进制数字,后跟可选的句点(’.’)作为十进制指示符和一系列的进制数字。如果没有正负号,则假定为"+"。第105页/共156页RFC6020YANG-NETCONF数据建模语言9.3.2规范表示规范表示方法是一个正的decimal64值不必包含"+"号,小数点是必须的。前导的或尾随0被进制,但是有一个例外规则必须遵守,值0被表示是"0.0"。9.3.3限制decimal64类型可以通过"range"语句(章节9.2.4)限制取值范围。9.3.4fraction-digits语句"fraction-digits"语句,它是"type"语句的自语句,如果类型是"decimal64"必须出现。它以一个1到18间的整数作为参数。通过限制通过"ix10^-n"(其中n是小数位参数)表达的取值空间,它控制decimal64类型值之间的最小差异的大小。如下表格列出了每个小数位取值对应的最小和最大值:9.3.5使用范例typedefmy-decimal{第106页/共156页RFC6020YANG-NETCONF数据建模语言typedecimal64{fraction-digits2;range"1..3.141020..max";}}9.4string内置类型字符串内置类型在YANG中表示人类可读的字符串,合法的字符有tab、回车、换行和合法的Unicode和ISO/IEC10646[ISO.10646]字符:;;任意Unicode字符,除代理块FFFE、FFFF之外(如下是巴克斯范式)string=charchar=%x9/%xA/%xD/%x20-D7FF/%xE000-FFFD/%x10000-10FFFF9.4.1词法形式在XML实例文档中,字符串值用词法表示为字符数据。9.4.2规范形式规范形式和词法表示形式一样。不对字符串取值执行unicode标准化。9.4.3限制字符串可以通过"length"(章节9.4.4)和"pattern"(章节8.4.6)语句进行限制。9.4.4length语句"length"语句,是"type"语句的可选子语句,以一个长度表达式字符串作为参数。它用于限制内置类型"string",或基于"string"的派生类型。"length"语句限制了字符串中Unicde字符的数量。长度范围由一个显式值或者一个下边界、两个连续的".."和一个上边界组成。可以给定多个取值或边界范围,并通过""份额。长度限制值不得是负数。如果给定了多个值或范围,他们必须是不相交且按照第107页/共156页RFC6020YANG-NETCONF数据建模语言升序排列。如果长度限制应用于已有长度限制的类型,则新的限制必须等于或更加严格,即,抬高下边界、减低上边界、移除显式的长度值或范围、或者将范围分割为多个不连续的子范围。长度值是非负整数,或者一个特殊值"min"或"max","min"和"max"分别表示正在限制类型的最小和最大可接受的长度。实现不要求支持长度大于18446744073709551615的值。长度表达式语法在第12章的"length-arg"规则中定义。9.4.4.1string的子语句子语句章节基数description7.19.30..1error-app-tag7.5.4.20..1error-message7.5.4.10..1reference7.19.40..19.4.5使用范例typedefmy-base-str-type{typestring{length"1..255";}}typemy-base-str-type{//legallengthrefinementlength"1142..max";//1142..255}typemy-base-str-type{//illegallengthrefinementlength"1..999";}9.4.6pattern子语句"pattern"(模式)语句,是"type"语句的可选子语句,以一个[XSD-TYPES]中定义的正则表达式字符串作为参数。它用于限制内置类型"string",或基于"string"的派生类型,使得取值匹配这个模式。第108页/共156页RFC6020YANG-NETCONF数据建模语言如果类型包含多个"pattern"语句,则表达式是逻辑与关系,即所有的表达式必须同时满足。如果一个模式应用于一个已有模式限制的类型,取值处理匹配新模式外,必须匹配基础类型的所有模式。9.4.6.1pattern的子语句子语句章节基数description7.19.30..1error-app-tag7.5.4.20..1error-message7.5.4.10..1reference7.19.40..19.4.7使用范例如下类型:typestring{length"0..4";pattern"[0-9a-fA-F]";}如下字符串匹配:AB//合法9A00//合法如下字符串不匹配:00ABAB//非法,长度超过4xx00//非负,非法字符x9.5boolean内置类型boolean内置类型表示布尔值。9.5.1词法表示布尔值的词法表示方式是取值为"true"或"false"的字符串,字符串必须是小写字符。第109页/共156页RFC6020YANG-NETCONF数据建模语言9.5.2规范表示规范表示形式与词法表示形式一致。9.5.3限制boolean类型能施加约束。9.6enumeration内置类型9.6.1词法表示枚举值的词法表示形式是一个指定名字的字符串。9.6.2规范表示规范表示形式与词法表示形式一致。9.6.3限制enumeration类型能施加约束。9.6.4enum语句"enum"语句,是"type"语句的子语句,如果类型是"enumeration",必须出现该子语句。用于重复出现指定每个枚举值指定的字符串。它以一个指定名字的字符串作为参数。这个字符串不得卫东,并且不得博涵任何前导或尾随的空格字符。应该避免使用Unicode控制编码。enumeration中所有的指定名字必须是唯一的。第110页/共156页RFC6020YANG-NETCONF数据建模语言9.6.4.1enum的子语句子语句章节基数description7.19.30..1reference7.19.40..1status7.19.20..1value9.6.4.20..19.6.4.2value语句"value"语句,它是可选的,用来给enum的指定名字关联一个整数值。该整数值的范围必须是[-2147483648,2147483647],并且在enumeration类型内唯一。该值并未被YANG和XML编码,而是被用来方便实现者。如果未指定值,则会自动分配一个。如果"enum"语句是第一个被定义的,则指定的值是0,否则,指定的值比当前最大的值加1。如果当前最大值等于2147483647,则必须为具有当前最高值的子语句的“枚举”子语句指定一个枚举值。9.6.5使用范例leafmyenum{typeenumeration{enumzero;enumone;enumseven{value7;}}}取值为"seven"的叶子"myenum"的词法表示形式是:seven9.7bits内置类型bit内置类型表示一个bit位集合,即位值是由从0开始的小整数位置号标识的一组标志。每个位号第111页/共156页RFC6020YANG-NETCONF数据建模语言都有一个分配的名称。9.7.1限制bits类型不可被约束。9.7.2词法表示bits类型的词法表示形式是每个被设置的单个bit位值组成的列表。空字符串表示没有bit位被设置。9.7.3规范表示在规范格式中,bit位值由单个空格分隔,并且按照它们的位置出现(参考9.7.4.2)。9.7.4bit语句"bit"语句,它是"type"语句的子语句,当类型是"bits"时,必须出现。它用来指定bit类型的每个命名比特位的值。它以字符串作为参数,该字符串由每个bit位的指定名字(assignedname)组成,后跟一个描述该bit详细信息的子语句块组成。指定名字遵循标识符语法(参考6.2章节)所有指定名字在一个bits类型中必须是唯一的。9.7.4.1pattern的子语句子语句章节基数description7.19.30..1reference7.19.40..1status7.19.20..1position9.7.4.20..1第112页/共156页RFC6020YANG-NETCONF数据建模语言9.7.4.2position语句"position"语句,是可选的,以一个非负整数值作为参数,其指定了该bit在假定位域中的位置。位置值必须在[0,4294967295]范围内,并且在bits类型范围内唯一。YANG和NETCONF消息并不使用该值,其存在只是为了方便实现者。如果一个未指定bit位置,则会为其分配一个。如果"bit"子语句是第一个被定义的,为其分配位置值0;否则,位置值为当前最高bit位置值加1。如果当前最高bit位置的值等于4294967295,则必须为“位”子语句指定一个位置值,该子语句必须位于当前最高位的位置之后。9.7.5使用范例给定如下叶子:leafmybits{typebits{bitdisable-nagle{position0;}bitauto-sense-speed{position1;}bit10-Mb-only{position2;}}default"auto-sense-speed";}这个包含bit取值为disable-nagle和10-Mb-only的叶子的词法形式:disable-nagle10-Mb-only9.8binary内置类型binary内置类型表示任意的二进制数据,即8位码序列。第113页/共156页RFC6020YANG-NETCONF数据建模语言9.8.1限制一个二进制可以通过"length"语句限制,二进制值的长度是其包含的8位码字节的个数。9.8.2词法表示Binary取值按照base64编码机制编码(参考RFC4648,章节4)。9.8.3规范表示Binary取值的规范形式遵循[RFC4648]定义的规则。9.9leafref内置类型leafref类型用于引用数据树中一个特定的叶子实例。"path"子语句选择了叶子实例的集合,并且leafref取值空间是这些叶子实例取值的集合。如果包含leafref的叶子节点表示的时配置数据,则它引用的叶子也必须表示配置,这样的叶子在有效数据上增加了一个约束。为了是数据有效,所有的leafref节点必须引用现有的叶子实例或者使用默认值的叶子(参考章节7.6.1)。这个约束按照第8章定义的规则实施。不得存在任何循环引用的leafrefs链。如果通过leafref引用的叶子是基于一个或多个特性的条件性存在的,则带leafrerf类型的叶子也必须是基于相同特性集合的条件性存在的。9.9.1限制leafref不得被限制。9.9.2path语句"path"语句,是"type"语句的子语句,如果type是"leafref"则必须存在。它以一个字符串作第114页/共156页RFC6020YANG-NETCONF数据建模语言为参数,该字符串必须引用一个leaf或leaf-list节点。path参数的语法是XPath缩写语法的子集。谓词(Predicates)仅用于约束列表条目的键节点的值。每个谓词仅用于约束列表条目的关键节点的值,每个谓词仅由对一个键的相等性测试组成,如果一个list由多个键,则可以存在多个相邻谓词。该语法由第12章的"path-arg"规则定义。仅当多于一个键引用才能唯一标识一个叶子实例时才使用谓词,这在一个list包含多个键时,或者需要引用列表中非键意外的叶子才会发生。在这些例子中,通常需要指定多个leafrefs,并且使用谓词将它们绑定在一次。"path"表达式评估的结果是由0个、1个或多个节点组成的节点集。如果包含leafref类型的叶子表示的时配置数据,这个节点集必须是非空的。除了6.4.1章节定义之外,"path"的XPath表达式在如下上下文做概念性评估的:o上下文节点是数据树中为其定义"path"语句的节点。可访问树取决于上下文节点:o如果上下文节点表示的是配置数据,则树是在NETCONF数据存储中存在上下文节点的数据。XPath的根节点包含所有模块中的所有顶层配置数据节点作为孩子。o否则,树是设备上的所有状态数据,和数据存储。XPath根节点包含所有模块中的所有顶级数据节点作为孩子。9.9.3词法表示leafref值的编码方式和它引用的而叶子编码方式一样。9.9.4规范表示leafref的规范形式和其引用的叶子的规范形式一致。9.9.5使用范例给定下边的list:listinterface{key"name";leafname{typestring;第115页/共156页RFC6020YANG-NETCONF数据建模语言}leafadmin-status{typeadmin-status;}listaddress{key"ip";leafip{typeyang:ip-address;}}}下边的leafref引用一个已存在的接口:leafmgmt-interface{typeleafref{path"../interface/name";}}相应的XML代码段的示例:eth0loeth0如下的leafref引用一个已存在接口的地址:containerdefault-address{leafifname{typeleafref{path"../../interface/name";}}leafaddress{typeleafref{path"../../interface[name=current()/../ifname]"+"/address/ip";}}}一个相应的XML代码段:eth0up第116页/共156页RFC6020YANG-NETCONF数据建模语言
192.0.2.1
192.0.2.2
loup
127.0.0.1
eth0
192.0.2.2
下面的列表将Leafref用于其键之一,这类似于关系数据库中的外键。listpacket-filter{key"if-namefilter-id";leafif-name{typeleafref{path"/interface/name";}}leaffilter-id{typeuint32;}...}相应的XML片段:eth0up
192.0.2.1
192.0.2.2
第117页/共156页RFC6020YANG-NETCONF数据建模语言eth01...eth02...如下的通知定义了两个leafrefs引用现有的admin-status:notificationlink-failure{leafif-name{typeleafref{path"/interface/name";}}leafadmin-status{typeleafref{path"/interface[name=current()/../if-name]"+"/admin-status";}}}对应的XML通知的例子:2008-04-01T00:01:00Zeth0up9.10identityfre内置类型identityref类型用来引用已存在的标识(参考7.16章节)。第118页/共156页RFC6020YANG-NETCONF数据建模语言9.10.1限制identityref不能被限制。9.10.2identityref的base语句"base"语句,是"type"语句的一个子语句,如果类型是"identityref",则是必选的。参数是一个被"identity"语句定义的标识的名字。如果标识名称上有前缀,则表示它引用的是使用那个前缀导入的模块中的标识。否则,在当前模块或被包含模块必须包含一定名字匹配的标识的定义。identityref的有效取值是任意从其base语句指定的标识派生的标识。对于一个特定的Server,有效值进一步被限制为Server支持的模块定义的标识符的集合。9.10.3语法表示根据[XML-NAMES]的定义,identityref被编码为被引用标识的限定名字。如果不包含前缀,则identityref的名称空间是包含identityref值的元素生效的默认名称空间。当使用"default"语句给identityref一个默认值时,则默认值中的标识的名字也许有一个前缀。如果标识名字有前缀,它引用的是被使用那个前缀引入的模块定义的标识。否则,在当前模块或被包含模块必须存在一个名字匹配的标识定义。9.10.4规范表示因为词法形式取决于该值所在的XML上下文,这个类型没有哦一个规范格式。9.10.5使用范例使用7.16.3章节中定义的标识和如下的模块:modulemy-crypto{namespace"http://example.com/my-crypto";prefixmc;import"crypto-base"{第119页/共156页RFC6020YANG-NETCONF数据建模语言prefix"crypto";}identityaes{base"crypto:crypto-alg";}leafcrypto{typeidentityref{base"crypto:crypto-alg";}}}如果取值是"des"模块中定义的"des3"标识,则叶子"crypto"编码如下:des:des3编码中使用的任何前缀对于每个实例编码都是本地的。这意味着相同的identityref会被不同的实现编码为不同的编码。比如,如下的例子编码上面相同的叶子:x:des3如果"crypto"叶子替换为"my-crypto"定义的"aes",编码如下:mc:aes或者,使用默认名称空间:aes9.11empty内置类型empty内置类型表示一个没有值的叶子,它通过其存在或不存在传递信息。所有empty类型不能拥有默认值。9.11.1限制empty类型不受限制。9.11.2词法形式不适用。第120页/共156页RFC6020YANG-NETCONF数据建模语言9.11.3规范形式不适用。9.11.4适用范例如下的叶子:leafenable-qos{typeempty;}将被编码为:如果存在。9.12union内置类型union内置类型表示一个与其成员之一对应的值。当类型是"union","type"语句(7.4章节)必须存在,它用于重复指定union中每个成员的类型。它一个成员类型的名字的字符串作为参数。成员类型可以是任意的内置类型或派生类型,除了不能是"empty"和"leafref"之外。验证表示union类型的字符串时,将按照"type"语句指定的顺序,针对每个成员类型进行验证,直到找到匹配项为止。成员类型的任何默认值或者"units"属性(property)不会被union类型继承。示例:typeunion{typeint32;typeenumeration{enum"unbounded";}}9.12.1限制union不能被限制。然而,基于第9章定义的规则,每个成员类型可以被限制。第121页/共156页RFC6020YANG-NETCONF数据建模语言9.12.2词法表示union的词法表示成员类型中任意一个类型对应的值。9.12.3规范表示union的规范格式成员类型取值的规范格式相同。9.13instance-identifier内置类型instance-identifier内置类型被用于唯一标识数据树中一个特定的实例节点。instance-identifier的语法是XPath缩写语法的子集,在第12章中"instance-identifier"的规则正式定义。它用于唯一标识数据中的一个节点。谓词(Predicates)仅用于为列表条目的键节点指定值、为leaf-list条目指定值、或者为没有键的列表指定位置索引。为了标识带多个键的列表条目,每个谓词由针对每个键的相等性测试组成,并且针对每个键有一个对应的谓词。如果包含instance-identifier类型的叶子表示的是配置数据,并且"require-instance"属性(章节9.13.2)为"true",则它引用的节点也必须表示的是配置数据。这些叶子在有效数据上增加了一个约束。所有这样的叶子节点必须引用现有的节点或者使用待验证数据的默认值的叶子节点。这个约束参照第8章定义的规则实施。除了6.4.1章节中的定义外,"instance-identifier"的XPath表达式在如下上下文中进行概念性评估:o上下文节点是可访问树的根节点可访问树取决于包含instance-identifier类型的叶子:o如果叶子表示的是配置数据,则树是leaf所在的NETCONF数据存储内的数据。XPath的根节点包含所有模块的顶级配置数据节点作为孩子;o否则,树是设备上所有状态数据,和数据存储。XPath的根节点包括所有模块中的所有顶级数据节点作为孩子。第122页/共156页RFC6020YANG-NETCONF数据建模语言9.13.1限制所有实例标识可以被"require-instance"语句(章节9.13.2)限制。9.13.2require-instance语句"require-instance"语句,是"type"语句的子语句,如果类型是"instance-identifier",则是可选的。它以一个取值为"true"或"false"的字符串作为参数,它表示正在引用的实例对于有效数据必须存在。这个约束按照第8章定义的规则执行。如果"require-instance"为"false",它表示正在引用的实例也许会出现在有效数据中。9.13.3句法表示instance-identifier取值从句法上表示为字符串。实例标识符值中的所有节点名称必须使用显式命名空间前缀进行限定,并且这些前缀必须在实例标识符的XML元素的XML命名空间范围内声明。编码中使用的任何前缀对于每种编码实例而言都是本地的,这意味着不同的实现对于相同的instance-identifier进行不同的编码。9.13.4规范表示因为词法格式取决于取值所在的XML的上下文,所以本类型没有规范格式。9.13.5使用范例如下是实例标识符的例子:/instance-identifierforacontainer/ex:system/ex:services/ex:ssh/instance-identifierforaleaf/ex:system/ex:services/ex:ssh/ex:port/instance-identifierforalistentry第123页/共156页RFC6020YANG-NETCONF数据建模语言/ex:system/ex:user[ex:name=’fred’]/instance-identifierforaleafinalistentry/ex:system/ex:user[ex:name=’fred’]/ex:type/instance-identifierforalistentrywithtwokeys/ex:system/ex:server[ex:ip=’192.0.2.1’][ex:port=’80’]/instance-identifierforaleaf-listentry/ex:system/ex:services/ex:ssh/ex:cipher[.=’blowfish-cbc’]/instance-identifierforalistentrywithoutkeys/ex:stats/ex:port[3]10更新模型随着模块经验的积累,可能需要修订该模块。然而,如果在使用原始规范的Client和使用新规范的Server间,有触发互操作性问题的可能,则不允许变更。对于已发布的变更,在现有的"revision"语句的头部必须加入一个新的"revision"语句(参考7.1。9章节)。如果还没有"revision"语句,则必为新的修订增加一条。此外,任何必要的修改都必须应用于任何元数据,包括"organization"和"contact"语句(章节7.1.7和7.1.8)。需要注意的是,模块中的定义对于引入它的模块是可用的,并且通过在"import"语句中指定模块名字进行引用。因此,模块名字不得修改。此外,"namespace"语句不得修改,因为所有的XML元素都要被名称空间前缀限定。废弃的定义不得从模块中移除,因为他们的标识符也许仍然被其他模块引用。一个定义可以通过如下方式进行修订:o如果旧的枚举值保持不变,"enumeration"类型可以增加新的枚举值(分支);o如果旧的bit位置保持不变,"bits"类型可以增加新的位值;o"range"、"length"、"pattern"语句可以扩展器允许的取值空间;o如果叶子没有默认值(不论是直接或通过其类型间接),可以给叶子语句增加"default"语句;o可以增加"units"语句;o可以更新或增加"reference"语句;o可以删除"must"语句或放松其约束;o可以删除"mandatory"语句或将其值由"true"改为"false";o可以删除"min-elements"语句,或更改为限制更小的元素;第124页/共156页RFC6020YANG-NETCONF数据建模语言o可以删除"max-elements"语句,或更改为允许更多的元素;o可以增加"description"语句,或者在不改变语义定义的情况下阐明"description"语句;o可以增typedefs、groupings、rpcs、notifications、extensions、features和identities;o如果对现有节点或在模块/子模块的顶层没有增加mandatory节点(章节3.1),或者它们条件性地依赖于一个新的特性(比如有一个引用新特性的"if-feature"语句),则可以增加新的数据定义;o可以增加新的"case"语句;o一个不是mandatory的表示状态数据的节点,可以修改为标识配置数据;o可以移除不是mandatory的节点的"if-feature"语句;o可以增加"status"语句,或从"current"修改为"deprecated"或"obsolete",或者从"deprecated"修改为"obsolete";o在不改变类型的语法和语义的情况下,"type"语句可以被另一个"type"替换。比如,内联类型定义可以被typedef替换,但是int8类型不能被int16类型替换,因为语法发生了变化;o任何一组数据定义节点可以被另外一组语法和语义都相等的节点集合替换,比如,一组叶子可以被具有相同叶子的grouping替换;o模块可以划分为子模块的集合,或者删除一个子模块,前提是该模块中的定义不会以此处允许的任何其他方式更改;o如果本地所有使用前缀都已经修改,则可以修改"prefix"语句;否则,如果任何先前定义的语法发生了变化(即作出的任何一个不是上述特别指出允许的非编辑性的修改),则必须通过定义新的标识符的新定义来实现。在包含任何数据定义语句作为子语句的语句中,这些数据定义子语句不得被重新排序。11YINYANG模块可以转换为另一种基于XML的语法格式,称为YIN,转换后的模块称为YIN模块。本章节介绍两种格式之间的语法映射规则。YANG和YIN格式使用不同的标记方法包含了等效的信息,YIN标记使得开发人员以XML呈现YANG数据模型,进一步对于数据过滤和验证可以使用现有的丰富的基于XML的工具,自动化代码和文档的生成,以及其他任务。像XSLT或XML验证器等工具都可以使用。在YANG和YIN直接的映射,不会修改模型的信息内容,其中注释和空格不会被保留。第125页/共156页RFC6020YANG-NETCONF数据建模语言11.1.1YIN正式定义在YANG关键字和YIN元素之间存在一对一的对应。YIN元素的本地名字和对应的YANG关键字是相同的。这意味着,特别的,YIN文档的document元素(root)总是。对应YANG关键字的YIN元素属于与如下URI关联的名称空间:"urn:ietf:params:xml:ns:yang:yin:1"YIN元素相应的扩展关键字属于YANG模块中在通过"extension"语句声明的extension关键字所在位置的名称空间。所有YIN元素的名字必须被以上指定的名称空间使用[XML-NAMES]中的标准机制合理的限定。即"xmlns"和"xmlns:xxx"属性。在YIN中,YANG语句的参数或者通过一个XML属性或者通过关键字元素的一个子元素表示。下表定义了YANG关键字结合的映射。对于扩展,参数映射在"extension"语句(参考章节7.17)中指定。如下的规则适用于参数:o如果参数表示的是一个属性,则这个属性没有名称空间;o如果参数表示的是一个元素,则它被和它父亲关键字元素相同的名称空间限定;o如果参数被表示为一个元素,则它必须是关键字元素的第一个孩子;YANG语句的子语句被表示未额外的关键字元素的孩子,并且它们的相对顺序必须与其在YANG子语句中定义的顺序一致。YANG中的注释可以被映射为XML注释。YANG语句的参数映射表:关键字参数名YIN元素anyxmlnamefalseargumentnamefalseaugmenttarget-nodefalsebasenamefalsebelongs-tomodulefalsebitnamefalsecasenamefalsechoicenamefalseconfigvaluefalsecontacttexttruecontainernamefalsedefaultvaluefalsedescriptiontexttruedeviatevaluefalse第126页/共156页RFC6020YANG-NETCONF数据建模语言deviationtarget-nodefalseenumnamefalseerror-app-tagvaluefalseerror-messagevaluetrueextensionnamefalsefeaturenamefalsefraction-digitsvaluefalsegroupingnamefalseidentitynamefalseif-featurenamefalseimportmodulefalseincludemodulefalseinputn/akeyvaluefalseleafnamefalseleaf-listnamefalselengthvaluefalselistnamefalsemandatoryvaluefalsemax-elementsvaluefalsemin-elementsvaluefalsemodulenamefalsemustconditionfalsenamespaceurifalsenotificationnamefalseordered-byvaluefalseorganizationtexttrueoutputn/apathvaluefalsepatternvaluefalsepositionvaluefalseprefixvaluefalsepresencevaluefalserangevaluefalsereferencetexttruerefinetarget-nodefalserequire-instancevaluefalserevisiondatefalserevision-datedatefalserpcnamefalsestatusvaluefalsesubmodulenamefalsetypenamefalse第127页/共156页RFC6020YANG-NETCONF数据建模语言typedefnamefalseuniquetagfalseunitsnamefalseusesnamefalsevaluevaluefalsewhenconditionfalseyang-versionvaluefalseyin-elementvaluefalse11.1.1.1使用范例如下的YANG模块:moduleacme-foo{namespace"http://acme.example.com/foo";prefix"acfoo";importmy-extensions{prefix"myext";}listinterface{key"name";leafname{typestring;}leafmtu{typeuint32;description"TheMTUoftheinterface.";myext:c-define"MY_MTU";}}}当定义了7.17.3章节中的扩展"c-define"时,上边的YANG模块被翻译为如下的YIN:第128页/共156页RFC6020YANG-NETCONF数据建模语言TheMTUoftheinterface.12YANGABNF语法在YANG中,几乎所有的语句是无序的。RFC5234的ABNF语法定义了规范顺序。为了提高模块的可读性,建议按照此顺序输入子句。在ABNF语法内,无序语句用注释标记。该语法假定扫描程序将YANG注释替换为单个空格字符。file"yang.abnf"module-stmt=optsepmodule-keywordsepidentifier-arg-stroptsep"{"stmtsepmodule-header-stmtslinkage-stmtsmeta-stmtsrevision-stmtsbody-stmts"}"optsepsubmodule-stmt=optsepsubmodule-keywordsepidentifier-arg-stroptsep"{"stmtsepsubmodule-header-stmtslinkage-stmtsmeta-stmtsrevision-stmtsbody-stmts"}"optsepmodule-header-stmts=;;thesestmtscanappearinanyorder[yang-version-stmtstmtsep]第129页/共156页RFC6020YANG-NETCONF数据建模语言namespace-stmtstmtsepprefix-stmtstmtsepsubmodule-header-stmts=;;thesestmtscanappearinanyorder[yang-version-stmtstmtsep]belongs-to-stmtstmtsepmeta-stmts=;;thesestmtscanappearinanyorder[organization-stmtstmtsep][contact-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]linkage-stmts=;;thesestmtscanappearinanyorder(import-stmtstmtsep)(include-stmtstmtsep)revision-stmts=(revision-stmtstmtsep)body-stmts=((extension-stmt/feature-stmt/identity-stmt/typedef-stmt/grouping-stmt/data-def-stmt/augment-stmt/rpc-stmt/notification-stmt/deviation-stmt)stmtsep)data-def-stmt=container-stmt/leaf-stmt/leaf-list-stmt/list-stmt/choice-stmt/anyxml-stmt/uses-stmtyang-version-stmt=yang-version-keywordsepyang-version-arg-stroptsepstmtendyang-version-arg-str=yang-version-arg="1"import-stmt=import-keywordsepidentifier-arg-stroptsep"{"stmtsepprefix-stmtstmtsep[revision-date-stmtstmtsep]"}"include-stmt=include-keywordsepidentifier-arg-stroptsep第130页/共156页RFC6020YANG-NETCONF数据建模语言(";"/"{"stmtsep[revision-date-stmtstmtsep]"}")namespace-stmt=namespace-keywordsepuri-stroptsepstmtenduri-str=prefix-stmt=prefix-keywordsepprefix-arg-stroptsepstmtendbelongs-to-stmt=belongs-to-keywordsepidentifier-arg-stroptsep"{"stmtsepprefix-stmtstmtsep"}"organization-stmt=organization-keywordsepstringoptsepstmtendcontact-stmt=contact-keywordsepstringoptsepstmtenddescription-stmt=description-keywordsepstringoptsepstmtendreference-stmt=reference-keywordsepstringoptsepstmtendunits-stmt=units-keywordsepstringoptsepstmtendrevision-stmt=revision-keywordseprevision-dateoptsep(";"/"{"stmtsep[description-stmtstmtsep][reference-stmtstmtsep]"}")revision-date=date-arg-strrevision-date-stmt=revision-date-keywordseprevision-datestmtendextension-stmt=extension-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[argument-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")argument-stmt=argument-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep[yin-element-stmtstmtsep]"}")yin-element-stmt=yin-element-keywordsepyin-element-arg-str第131页/共156页RFC6020YANG-NETCONF数据建模语言stmtendyin-element-arg-str=yin-element-arg=true-keyword/false-keywordidentity-stmt=identity-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[base-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")base-stmt=base-keywordsepidentifier-ref-arg-stroptsepstmtendfeature-stmt=feature-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder(if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")if-feature-stmt=if-feature-keywordsepidentifier-ref-arg-stroptsepstmtendtypedef-stmt=typedef-keywordsepidentifier-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyordertype-stmtstmtsep[units-stmtstmtsep][default-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}"type-stmt=type-keywordsepidentifier-ref-arg-stroptsep(";"/"{"stmtseptype-body-stmts"}")type-body-stmts=numerical-restrictions/decimal64-specification/string-restrictions/第132页/共156页RFC6020YANG-NETCONF数据建模语言enum-specification/leafref-specification/identityref-specification/instance-identifier-specification/bits-specification/union-specificationnumerical-restrictions=range-stmtstmtseprange-stmt=range-keywordseprange-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[error-message-stmtstmtsep][error-app-tag-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")decimal64-specification=fraction-digits-stmtfraction-digits-stmt=fraction-digits-keywordsepfraction-digits-arg-strstmtendfraction-digits-arg-str=fraction-digits-arg=("1"["0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"/"8"])/"2"/"3"/"4"/"5"/"6"/"7"/"8"/"9"string-restrictions=;;thesestmtscanappearinanyorder[length-stmtstmtsep](pattern-stmtstmtsep)length-stmt=length-keywordseplength-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[error-message-stmtstmtsep][error-app-tag-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")pattern-stmt=pattern-keywordsepstringoptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[error-message-stmtstmtsep][error-app-tag-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]第133页/共156页RFC6020YANG-NETCONF数据建模语言"}")default-stmt=default-keywordsepstringstmtendenum-specification=1(enum-stmtstmtsep)enum-stmt=enum-keywordsepstringoptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[value-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")leafref-specification=;;thesestmtscanappearinanyorderpath-stmtstmtsep[require-instance-stmtstmtsep]path-stmt=path-keywordseppath-arg-strstmtendrequire-instance-stmt=require-instance-keywordseprequire-instance-arg-strstmtendrequire-instance-arg-str=require-instance-arg=true-keyword/false-keywordinstance-identifier-specification=[require-instance-stmtstmtsep]identityref-specification=base-stmtstmtsepunion-specification=1(type-stmtstmtsep)bits-specification=1(bit-stmtstmtsep)bit-stmt=bit-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[position-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}""}")position-stmt=position-keywordsepposition-value-arg-strstmtendposition-value-arg-str=position-value-arg=non-negative-integer-valuestatus-stmt=status-keywordsepstatus-arg-strstmtend第134页/共156页RFC6020YANG-NETCONF数据建模语言status-arg-str=status-arg=current-keyword/obsolete-keyword/deprecated-keywordconfig-stmt=config-keywordsepconfig-arg-strstmtendconfig-arg-str=config-arg=true-keyword/false-keywordmandatory-stmt=mandatory-keywordsepmandatory-arg-strstmtendmandatory-arg-str=mandatory-arg=true-keyword/false-keywordpresence-stmt=presence-keywordsepstringstmtendordered-by-stmt=ordered-by-keywordsepordered-by-arg-strstmtendordered-by-arg-str=ordered-by-arg=user-keyword/system-keywordmust-stmt=must-keywordsepstringoptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[error-message-stmtstmtsep][error-app-tag-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")error-message-stmt=error-message-keywordsepstringstmtenderror-app-tag-stmt=error-app-tag-keywordsepstringstmtendmin-elements-stmt=min-elements-keywordsepmin-value-arg-strstmtendmin-value-arg-str=min-value-arg=non-negative-integer-valuemax-elements-stmt=max-elements-keywordsepmax-value-arg-strstmtendmax-value-arg-str=max-value-arg=unbounded-keyword/positive-integer-value第135页/共156页RFC6020YANG-NETCONF数据建模语言value-stmt=value-keywordsepinteger-valuestmtendgrouping-stmt=grouping-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((typedef-stmt/grouping-stmt)stmtsep)(data-def-stmtstmtsep)"}")container-stmt=container-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)(must-stmtstmtsep)[presence-stmtstmtsep][config-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((typedef-stmt/grouping-stmt)stmtsep)(data-def-stmtstmtsep)"}")leaf-stmt=leaf-keywordsepidentifier-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)type-stmtstmtsep[units-stmtstmtsep](must-stmtstmtsep)[default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}"leaf-list-stmt=leaf-list-keywordsepidentifier-arg-stroptsep第136页/共156页RFC6020YANG-NETCONF数据建模语言"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)type-stmtstmtsep[units-stmtstmtsep](must-stmtstmtsep)[config-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep][ordered-by-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}"list-stmt=list-keywordsepidentifier-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)(must-stmtstmtsep)[key-stmtstmtsep](unique-stmtstmtsep)[config-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep][ordered-by-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((typedef-stmt/grouping-stmt)stmtsep)1(data-def-stmtstmtsep)"}"key-stmt=key-keywordsepkey-arg-strstmtendkey-arg-str=key-arg=node-identifier(sepnode-identifier)unique-stmt=unique-keywordsepunique-arg-strstmtendunique-arg-str=unique-arg=descendant-schema-nodeid(sepdescendant-schema-nodeid)choice-stmt=choice-keywordsepidentifier-arg-stroptsep(";"/第137页/共156页RFC6020YANG-NETCONF数据建模语言"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)[default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((short-case-stmt/case-stmt)stmtsep)"}")short-case-stmt=container-stmt/leaf-stmt/leaf-list-stmt/list-stmt/anyxml-stmtcase-stmt=case-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep](data-def-stmtstmtsep)"}")anyxml-stmt=anyxml-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)(must-stmtstmtsep)[config-stmtstmtsep][mandatory-stmtstmtsep][status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]"}")uses-stmt=uses-keywordsepidentifier-ref-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder第138页/共156页RFC6020YANG-NETCONF数据建模语言[when-stmtstmtsep](if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep](refine-stmtstmtsep)(uses-augment-stmtstmtsep)"}")refine-stmt=refine-keywordseprefine-arg-stroptsep(";"/"{"stmtsep(refine-container-stmts/refine-leaf-stmts/refine-leaf-list-stmts/refine-list-stmts/refine-choice-stmts/refine-case-stmts/refine-anyxml-stmts)"}")refine-arg-str=refine-arg=descendant-schema-nodeidrefine-container-stmts=;;thesestmtscanappearinanyorder(must-stmtstmtsep)[presence-stmtstmtsep][config-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]refine-leaf-stmts=;;thesestmtscanappearinanyorder(must-stmtstmtsep)[default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]refine-leaf-list-stmts=;;thesestmtscanappearinanyorder(must-stmtstmtsep)[config-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]第139页/共156页RFC6020YANG-NETCONF数据建模语言refine-list-stmts=;;thesestmtscanappearinanyorder(must-stmtstmtsep)[config-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]refine-choice-stmts=;;thesestmtscanappearinanyorder[default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]refine-case-stmts=;;thesestmtscanappearinanyorder[description-stmtstmtsep][reference-stmtstmtsep]refine-anyxml-stmts=;;thesestmtscanappearinanyorder(must-stmtstmtsep)[config-stmtstmtsep][mandatory-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]uses-augment-stmt=augment-keywordsepuses-augment-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]1((data-def-stmtstmtsep)/(case-stmtstmtsep))"}"uses-augment-arg-str=uses-augment-arg=descendant-schema-nodeidaugment-stmt=augment-keywordsepaugment-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyorder[when-stmtstmtsep](if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]1((data-def-stmtstmtsep)/第140页/共156页RFC6020YANG-NETCONF数据建模语言(case-stmtstmtsep))"}"augment-arg-str=augment-arg=absolute-schema-nodeidunknown-statement=prefix":"identifier[sepstring]optsep(";"/"{"unknown-statement2"}")unknown-statement2=[prefix":"]identifier[sepstring]optsep(";"/"{"unknown-statement2"}")when-stmt=when-keywordsepstringoptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder[description-stmtstmtsep][reference-stmtstmtsep]"}")rpc-stmt=rpc-keywordsepidentifier-arg-stroptsep(";"/"{"stmtsep;;thesestmtscanappearinanyorder(if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((typedef-stmt/grouping-stmt)stmtsep)[input-stmtstmtsep][output-stmtstmtsep]"}")input-stmt=input-keywordoptsep"{"stmtsep;;thesestmtscanappearinanyorder((typedef-stmt/grouping-stmt)stmtsep)1(data-def-stmtstmtsep)"}"output-stmt=output-keywordoptsep"{"stmtsep;;thesestmtscanappearinanyorder((typedef-stmt/grouping-stmt)stmtsep)1(data-def-stmtstmtsep)"}"notification-stmt=notification-keywordsepidentifier-arg-stroptsep第141页/共156页RFC6020YANG-NETCONF数据建模语言(";"/"{"stmtsep;;thesestmtscanappearinanyorder(if-feature-stmtstmtsep)[status-stmtstmtsep][description-stmtstmtsep][reference-stmtstmtsep]((typedef-stmt/grouping-stmt)stmtsep)(data-def-stmtstmtsep)"}")deviation-stmt=deviation-keywordsepdeviation-arg-stroptsep"{"stmtsep;;thesestmtscanappearinanyorder[description-stmtstmtsep][reference-stmtstmtsep](deviate-not-supported-stmt/1(deviate-add-stmt/deviate-replace-stmt/deviate-delete-stmt))"}"deviation-arg-str=deviation-arg=absolute-schema-nodeiddeviate-not-supported-stmt=deviate-keywordsepnot-supported-keywordoptsep(";"/"{"stmtsep"}")deviate-add-stmt=deviate-keywordsepadd-keywordoptsep(";"/"{"stmtsep[units-stmtstmtsep](must-stmtstmtsep)(unique-stmtstmtsep)[default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep]"}")deviate-delete-stmt=deviate-keywordsepdelete-keywordoptsep第142页/共156页RFC6020YANG-NETCONF数据建模语言(";"/"{"stmtsep[units-stmtstmtsep](must-stmtstmtsep)(unique-stmtstmtsep)[default-stmtstmtsep]"}")deviate-replace-stmt=deviate-keywordsepreplace-keywordoptsep(";"/"{"stmtsep[type-stmtstmtsep][units-stmtstmtsep][default-stmtstmtsep][config-stmtstmtsep][mandatory-stmtstmtsep][min-elements-stmtstmtsep][max-elements-stmtstmtsep]"}");;Rangesrange-arg-str=range-arg=range-part(optsep""optseprange-part)range-part=range-boundary[optsep".."optseprange-boundary]range-boundary=min-keyword/max-keyword/integer-value/decimal-value;;Lengthslength-arg-str=length-arg=length-part(optsep""optseplength-part)length-part=length-boundary[optsep".."optseplength-boundary]length-boundary=min-keyword/max-keyword/non-negative-integer-value;;Datedate-arg-str=date-arg=4DIGIT"-"2DIGIT"-"2DIGIT;;SchemaNodeIdentifiersschema-nodeid=absolute-schema-nodeid/descendant-schema-nodeidabsolute-schema-nodeid=1("/"node-identifier)descendant-schema-nodeid=第143页/共156页RFC6020YANG-NETCONF数据建模语言node-identifierabsolute-schema-nodeidnode-identifier=[prefix":"]identifier;;InstanceIdentifiersinstance-identifier=1("/"(node-identifierpredicate))predicate="["WSP(predicate-expr/pos)WSP"]"predicate-expr=(node-identifier/".")WSP"="WSP((DQUOTEstringDQUOTE)/(SQUOTEstringSQUOTE))pos=non-negative-integer-value;;leafrefpathpath-arg-str=path-arg=absolute-path/relative-pathabsolute-path=1("/"(node-identifierpath-predicate))relative-path=1("..""/")descendant-pathdescendant-path=node-identifier[path-predicateabsolute-path]path-predicate="["WSPpath-equality-exprWSP"]"path-equality-expr=node-identifierWSP"="WSPpath-key-exprpath-key-expr=current-function-invocationWSP"/"WSPrel-path-keyexprrel-path-keyexpr=1(".."WSP"/"WSP)(node-identifierWSP"/"WSP)node-identifier;;;Keywords,usingabnfgen’ssyntaxforcase-sensitivestrings;;statementkeywordsanyxml-keyword=’anyxml’argument-keyword=’argument’augment-keyword=’augment’base-keyword=’base’belongs-to-keyword=’belongs-to’bit-keyword=’bit’case-keyword=’case’choice-keyword=’choice’config-keyword=’config’contact-keyword=’contact’container-keyword=’container’default-keyword=’default’description-keyword=’description’enum-keyword=’enum’error-app-tag-keyword=’error-app-tag’error-message-keyword=’error-message’extension-keyword=’extension’第144页/共156页RFC6020YANG-NETCONF数据建模语言deviation-keyword=’deviation’deviate-keyword=’deviate’feature-keyword=’feature’fraction-digits-keyword=’fraction-digits’grouping-keyword=’grouping’identity-keyword=’identity’if-feature-keyword=’if-feature’import-keyword=’import’include-keyword=’include’input-keyword=’input’key-keyword=’key’leaf-keyword=’leaf’leaf-list-keyword=’leaf-list’length-keyword=’length’list-keyword=’list’mandatory-keyword=’mandatory’max-elements-keyword=’max-elements’min-elements-keyword=’min-elements’module-keyword=’module’must-keyword=’must’namespace-keyword=’namespace’notification-keyword=’notification’ordered-by-keyword=’ordered-by’organization-keyword=’organization’output-keyword=’output’path-keyword=’path’pattern-keyword=’pattern’position-keyword=’position’prefix-keyword=’prefix’presence-keyword=’presence’range-keyword=’range’reference-keyword=’reference’refine-keyword=’refine’require-instance-keyword=’require-instance’revision-keyword=’revision’revision-date-keyword=’revision-date’rpc-keyword=’rpc’status-keyword=’status’submodule-keyword=’submodule’type-keyword=’type’typedef-keyword=’typedef’unique-keyword=’unique’units-keyword=’units’uses-keyword=’uses’value-keyword=’value’第145页/共156页RFC6020YANG-NETCONF数据建模语言when-keyword=’when’yang-version-keyword=’yang-version’yin-element-keyword=’yin-element’;;otherkeywordsadd-keyword=’add’current-keyword=’current’delete-keyword=’delete’deprecated-keyword=’deprecated’false-keyword=’false’max-keyword=’max’min-keyword=’min’not-supported-keyword=’not-supported’obsolete-keyword=’obsolete’replace-keyword=’replace’system-keyword=’system’true-keyword=’true’unbounded-keyword=’unbounded’user-keyword=’user’current-function-invocation=current-keywordWSP"("WSP")";;BasicRulesprefix-arg-str=prefix-arg=prefixprefix=identifieridentifier-arg-str=identifier-arg=identifier;;AnidentifierMUSTNOTstartwith((’X’’x’)(’M’’m’)(’L’’l’))identifier=(ALPHA/"_")(ALPHA/DIGIT/"_"/"-"/".")identifier-ref-arg-str=identifier-ref-arg=[prefix":"]identifierstring=integer-value=("-"non-negative-integer-value)/non-negative-integer-valuenon-negative-integer-value="0"/positive-integer-valuepositive-integer-value=(non-zero-digitDIGIT)zero-integer-value=1DIGITstmtend=";"/"{"unknown-statement"}"sep=1(WSP/line-break);unconditionalseparatoroptsep=(WSP/line-break)stmtsep=(WSP/line-break/unknown-statement)第146页/共156页RFC6020YANG-NETCONF数据建模语言line-break=CRLF/LFnon-zero-digit=%x31-39decimal-value=integer-value("."zero-integer-value)SQUOTE=%x27;’(SingleQuote);;;;RFC5234corerules.;;ALPHA=%x41-5A/%x61-7A;A-Z/a-zCR=%x0D;carriagereturnCRLF=CRLF;InternetstandardnewlineDIGIT=%x30-39;0-9DQUOTE=%x22;"(DoubleQuote)HEXDIG=DIGIT/%x61/%x62/%x63/%x64/%x65/%x66;onlylower-casea..fHTAB=%x09;horizontaltabLF=%x0A;linefeedSP=%x20;spaceVCHAR=%x21-7E;visible(printing)charactersWSP=SP/HTAB;whitespace13YANG相关错误的错误响应为数据模型处理相关的错误情况定义了一系列的NETCONF错误应答。如果一个相关的YANG语句包含"error-app-tag"子语句,则它将覆盖掉如下定义的默认值。第147页/共156页RFC6020YANG-NETCONF数据建模语言13.1违反唯一性语句的数据的错误消息如果NETCONF操作将导致其唯一性约束失效的配置数据,则返回如下的错误:error-tag:operation-failederror-app-tag:data-not-uniqueerror-info::包含一个实例标识符,其指向违反唯一性约束的叶子。这个元素对于每个非唯一性叶子,只存在一次。元素在YANG的名称空间:("urn:ietf:params:xml:ns:yang:1")。13.2违反max-elements语句的数据的错误消息如果NETCONF操作导致配置数据中出现一个list或leaf-list将拥有多个条目,则会返回如下的错误:error-tag:operation-failederror-app-tag:too-many-elements这个错误只返回一次,其中error-path标识列表节点,即使即存在不止一个额外的孩子节点。13.3违反min-elements语句的数据的错误消息如果NETCONF操作将导致配置数据中出现某个list或leaf-list将拥有较少的条目,则返回如下错误:error-tag:operation-failederror-app-tag:too-few-elements这个错误只返回一次,其中error-path标识列表节点,即使该列表节点丢失了超过一个孩子节点。13.4违反must语句的数据的错误消息如果NETCONF操作将导致配置数据出现"must"语句施加的限制被违反,则返回下边的错误,除非该"must"语句存在一个特定的"error-app-tag"子语句:error-tag:operation-failederror-app-tag:must-violation第148页/共156页RFC6020YANG-NETCONF数据建模语言13.5违反require-instance语句的数据的错误消息如果NETCONF操作将导致配置数据中某个"instance-identifier"标记为的"true"叶子引用了一个不存在的实例,则返回如下的错误:error-tag:data-missingerror-app-tag:instance-requirederror-path:Pathtotheinstance-identifierleaf.13.6无匹配leafref类型数据的错误消息如果NETCONF操作将导致配置数据中一个通过"leafref"引用了一个不存在的实例,则返回如下的错误:error-tag:data-missingerror-app-tag:instance-requirederror-path:Pathtotheleafrefleaf.13.7违反mandatoryChoice语句的数据的错误消息如果NETCONF操作导致配置数据中出现在一个mandatorychoice中不存在节点,则返回如下的错误:error-tag:data-missingerror-app-tag:missing-choiceerror-path:Pathtotheelementwiththemissingchoice.error-info::Containsthenameofthemissingmandatorychoice.TheelementisintheYANGnamespace("urn:ietf:params:xml:ns:yang:1").13.8"insert"操作的错误消息如果"insert"和"key"或"value"属性在对一个list或leaf-list节点使用时,并且"key"或"value"引用了一个存在的实例,则返回如下的错误:error-tag:bad-attributeerror-app-tag:missing-instance第149页/共156页RFC6020YANG-NETCONF数据建模语言14IANA注意事项本文档定义了YANG模块和子模块名称的注册表。注册表的名称是"YANGModuleNames"。注册表记录如下条目:o模块或子模块的名称o对于模块,分配的XML名称空间o对于模块,模块的前缀o对于子模块,其归属的模块的名字o(子)模块所引用的文档(比如,RFC编号)不存在初始分配。为了进行分配,根据RFC5226的要求进行发布。所有已注册的YANG模块名称都必须符合6.2节中规定的标识符规则,并且必须具有模块名称前缀。模块名称前缀“ietf-”保留用于IETF文档[RFC4844],而模块名称前缀“irtf-”保留用于IRTF文档。在其他RFC流中发布的模块必须具有相似的合适前缀。IANA注册表中的所有模块和子模块名称必须是唯一的。IANA注册表中的所有的名称空间必须是唯一的。本文档在IETF注册中心[RFC3688]为YANG和YIN的名称空间注册了两个URI。按照RFC3688定义的格式,如下两个URI已被注册:URI:urn:ietf:params:xml:ns:yang:yin:1URI:urn:ietf:params:xml:ns:yang:1RegistrantContact:TheIESG.XML:N/A,therequestedURIsareXMLnamespaces.本文档注册了在下边章节中定义的两个新的媒体类型。14.1媒体类型application/yangMIMEmediatypename:applicationMIMEsubtypename:yangMandatoryparameters:noneOptionalparameters:none第150页/共156页RFC6020YANG-NETCONF数据建模语言Encodingconsiderations:8-bitSecurityconsiderations:SeeSection15inRFC6020Interoperabilityconsiderations:NonePublishedspecification:RFC6020Applicationsthatusethismediatype:YANGmodulevalidators,webserversusedfordownloadingYANGmodules,emailclients,etc.Additionalinformation:MagicNumber:NoneFileExtension:.yangMacintoshfiletypecode:’TEXT’Personalandemailaddressforfurtherinformation:MartinBjorklundmbj@tail-f.comIntendedusage:COMMONAuthor:ThisspecificationisaworkitemoftheIETFNETMODworkinggroup,withmailinglistaddress.Changecontroller:TheIESGiesg@ietf.org14.2媒体类型application/yin+xmlMIMEmediatypename:applicationMIMEsubtypename:yin+xmlMandatoryparameters:noneOptionalparameters:"charset":Thisparameterhasidenticalsemanticstothecharsetparameterofthe"application/xml"mediatypeasspecifiedin[RFC3023].Encodingconsiderations:Identicaltothoseof"application/xml"asdescribedin[RFC3023],Section3.2.Securityconsiderations:SeeSection15inRFC6020Interoperabilityconsiderations:NonePublishedspecification:RFC6020Applicationsthatusethismediatype:YANGmodulevalidators,webserversusedfordownloadingYANGmodules,第151页/共156页RFC6020YANG-NETCONF数据建模语言emailclients,etc.Additionalinformation:MagicNumber:Asspecifiedfor"application/xml"in[RFC3023],Section3.2.FileExtension:.yinMacintoshfiletypecode:’TEXT’Personalandemailaddressforfurtherinformation:MartinBjorklundmbj@tail-f.comIntendedusage:COMMONAuthor:ThisspecificationisaworkitemoftheIETFNETMODworkinggroup,withmailinglistaddress.Changecontroller:TheIESGiesg@ietf.org15安全注意事项本文档定义了一种用于读、写管理信息描述的语言,语言本身在Internet上没有安全影响。相同的考虑与NETCONF基本协议相关(请参阅[RFC4741],第9节)。YANG模型化的数据中可能包含敏感的信息,YANG定义的RPCs或通知也许会传输敏感信息。安全问题与使用YANG语言建模的数据有关。这些问题应该在描述数据模型的文档和有关用于操纵数据的接口的文档(例如NETCONF文档)中处理。用YANG建模的数据取决于:o用于发送敏感信息的传输基础设施的安全;o存储或发布此类敏感信息的应用程序的安全性;o适当的身份验证和访问控制机制,以限制敏感数据的使用YANG解析器必须对格式错误的文档具有鲁棒性。从未知或不受信任的来源读取格式错误的文档可能会导致攻击者获得运行YANG解析器的用户的特权。在极端情况下,整个机器可能会受到损害。16贡献者如下人员对YANG初始文档作出了重要贡献:第152页/共156页RFC6020YANG-NETCONF数据建模语言-AndyBierman(Brocade)-BalazsLengyel(Ericsson)-DavidPartain(Ericsson)-JuergenSchoenwaelder(JacobsUniversityBremen)-PhilShafer(JuniperNetworks)17致谢编辑希望感谢以下人员,他们对本文档的各个版本都提供了有帮助的建议:MehmetErsue,WashamFan,JoelHalpern,LeifJohansson,LadislavLhotka,GerhardMuenz,TomPetch,RandyPresuhn,DavidReid,andBertWijnen.18参考文档18.1NormativeReferences[ISO.10646]InternationalOrganizationforStandardization,"InformationTechnology-UniversalMultiple-OctetCodedCharacterSet(UCS)",ISOStandard10646:2003,2003.[RFC2119]Bradner,S.,"KeywordsforuseinRFCstoIndicateRequirementLevels",BCP14,RFC2119,March1997.[RFC3023]Murata,M.,St.Laurent,S.,andD.Kohn,"XMLMediaTypes",RFC3023,January2001.[RFC3629]Yergeau,F.,"UTF-8,atransformationformatofISO10646",STD63,RFC3629,November2003.[RFC3688]Mealling,M.,"TheIETFXMLRegistry",BCP81,RFC3688,January2004.[RFC3986]Berners-Lee,T.,Fielding,R.,andL.Masinter,"UniformResourceIdentifier(URI):GenericSyntax",STD66,RFC3986,January2005.[RFC4648]Josefsson,S.,"TheBase16,Base32,andBase64DataEncodings",RFC4648,October2006.[RFC4741]Enns,R.,"NETCONFConfigurationProtocol",RFC4741,第153页/共156页RFC6020YANG-NETCONF数据建模语言December2006.[RFC5226]Narten,T.andH.Alvestrand,"GuidelinesforWritinganIANAConsiderationsSectioninRFCs",BCP26,RFC5226,May2008.[RFC5234]Crocker,D.andP.Overell,"AugmentedBNFforSyntaxSpecifications:ABNF",STD68,RFC5234,January2008.[RFC5277]Chisholm,S.andH.Trevino,"NETCONFEventNotifications",RFC5277,July2008.[XML-NAMES]Hollander,D.,Tobin,R.,Thompson,H.,Bray,T.,andA.Layman,"NamespacesinXML1.0(ThirdEdition)",WorldWideWebConsortiumRecommendationREC-xml-names-20091208,December2009,.[XPATH]Clark,J.andS.DeRose,"XMLPathLanguage(XPath)Version1.0",WorldWideWebConsortiumRecommendationREC-xpath-19991116,November1999,.[XSD-TYPES]Malhotra,A.andP.Biron,"XMLSchemaPart2:DatatypesSecondEdition",WorldWideWebConsortiumRecommendationREC-xmlschema-2-20041028,October2004,.18.2InformativeReferences[RFC2578]McCloghrie,K.,Ed.,Perkins,D.,Ed.,andJ.Schoenwaelder,Ed.,"StructureofManagementInformationVersion2(SMIv2)",STD58,RFC2578,April1999.[RFC2579]McCloghrie,K.,Ed.,Perkins,D.,Ed.,andJ.Schoenwaelder,Ed.,"TextualConventionsforSMIv2",STD58,RFC2579,April1999.[RFC3780]Strauss,F.andJ.Schoenwaelder,"SMIng–NextGenerationStructureofManagementInformation",RFC3780,May2004.[RFC4844]Daigle,L.andInternetArchitectureBoard,"TheRFCSeriesandRFCEditor",RFC4844,July2007.[XPATH2.0]Berglund,A.,Boag,S.,Chamberlin,D.,Fernandez,M.,第154页/共156页RFC6020YANG-NETCONF数据建模语言Kay,M.,Robie,J.,andJ.Simeon,"XMLPathLanguage(XPath)2.0",WorldWideWebConsortiumRecommendationREC-xpath20-20070123,January2007,.[XSLT]Clark,J.,"XSLTransformations(XSLT)Version1.0",WorldWideWebConsortiumRecommendationREC-xslt-19991116,November1999,.第155页/共156页RFC6020YANG-NETCONF数据建模语言Author’sAddressMartinBjorklund(editor)Tail-fSystemsEMail:mbj@tail-f.com第156页/共156页',)


  • 编号:1700807000
  • 分类:述职汇报
  • 软件: wps,office word
  • 大小:156页
  • 格式:docx
  • 风格:商务
  • PPT页数:1184256 KB
  • 标签:

广告位推荐

相关述职汇报更多>