YANG学习
1 YANG语言概述
- YANG是一种数据建模语言。
- YANG模型定义了数据的层次化结构,可用于基于NETCONF的操作。建模对象包括配置、状态数据、远程过程调用(RPC)和通知。它可以对NETCONF客户端和服务器端之间发送的所有数据进行一个完整的描述。(YANG模型最终呈现是.yang为后缀的文件)
YANG语言的特点:
- 基于层次化的树状结构建模。
- 数据模型以模块(module)和子模块(submodule)呈现。
- 可以和基于XML的语法YIN模型无损转换。
- 定义内置的数据模型和允许可扩展类型。
YANG文件与XML之间的关系
YANG文件就类似模板,填上数据,就可以生成一致的XML,设备使用YANG文件,校验XML、解析出数据。
2 Yang的基本元素
module是YANG的基本单元,是写yang文件的基本框架,包括以下几种类型语句:
1、head语句(yang-version/namespace/prefix)
2、连接语句(import/include)、
3、元信息(organization/contract)、
4、revision语句、
5、定义语句(container/leaf/leaf-list/grouping等等)。
3 yang模型的语法结构
YANG模型是一种树形结构,是由无数的叶子、列表、叶列表、容器组成的描述整个设备的一棵树。下面介绍YANG模型的五种主要类型的数据节点,包括叶节点(leaf)、列表节点(list)、叶列表节点(leaf-list)、容器节点(container)和组(grouping)。
3.1 基本数据类型
在定义叶节点和叶列表节点时,须指定值类型。YANG原生支持的基础数据类型有binary、bits、boolean、decimal64、empty、enumeration、instance-identifier、int8/16/32/64、leafref、string、uint8/16/32/64、union。注意没有float,double这种类型。
3.2 Leaf Node
- Leaf节点用于定义一个简单指定类型的变量,使用关键字“leaf”申明。
- 在Leaf节点内有子声明和值,没有子节点。
leaf host-name {
type string;
description "hostname for system";
}
yang + 数据 = xml,比如数据 为: www.tengxu.com,对应的xml就如下
<host-name>www.tengxu.com</host-name>
3.3 leaf-list
- Leaf List用于定义一个数组类型变量,使用“leaf-list”关键字申明。
- 叶列表定义了特定类型的值序列。它是只有一个叶子的列表,只能创建和删除。作用相当于只有一个节点的表。
leaf-list board-config {
type string;
description "list of board config";
}
对应的xml
<board-config>tng2spl</board-config>
<board-config>tngcpl</board-config>
3.4 List Nodes
- 列表用于定义一个更高层次的数据节点。一个List节点使用”key“唯一标识,可以包含多个leaf节点。子节点可以是容器、叶节点、叶列表。
list board {
key "boardname";
leaf boardname {
type string;
}
leaf boardid {
type uint16;
}
leaf boardtype {
type string;
}
}
定义了一个名为baord的list,这个list包含了三个leaf,分别为 boardname, boardid, boardtype;其中boardname为key,即boardname是唯一值。其他值可以相同。
<board>
<boardname>tng2spl</boardname>
<boardid>0x1234</boardid>
<boardtype>mux_xxx</boardtype>
</board>
<board>
<boardname>tng2cpl</boardname>
<boardid>0x1235</boardid>
<boardtype>dmux_xxx</boardtype>
</board>
3.5 容器 container
容器节点用于在子树中组织相关的节点。容器只有子节点而没有具体值。容器可以包含任何数量的任何类型(包括叶节点,列表节点,叶列表节点和容器)的子节点。
container systeminfo {
container login {
leaf username {
type string;
}
leaf passwd {
type string;
}
list user {
key "name";
leaf name {
type string;
}
leaf loginpasswd {
type string;
}
}
}
}
<systeminfo>
<login>
<username>xiaoming</username>
<passwd>123456</passwd>
<user>
<name>xiaoming</name>
<loginpasswd>123456</loginpasswd>
</user>
<user>
<name>xiaohong</name>
<loginpasswd>23456</loginpasswd>
</user>
<user>
<name>xiaohei</name>
<loginpasswd>654123</loginpasswd>
</user>
</login>
</systeminfo>
3.6 grouping
Grouping用于定义可以重复使用的节点,一般和uses一起使用。
grouping stdport {
leaf port {
type uint16;
}
leaf board {
type uint16;
}
leaf neid {
type uint32;
}
}
container oxc {
leaf freq {
type uint32;
}
leaf width {
type uint32;
}
leaf-list srcdst {
uses stdport;
}
}
<oxc>
<freq>1965000000</freq>
<width>50000</width>
<srcdst>
<port>12</port>
<board>1</board>
</srcdst>
<srcdst>
<port>13</port>
<board>1</board>
</srcdst>
</oxc>
4 yang应用
4.1 统一模型
yang生成proto,proto自动生成代码,rpc通信等。
5 参考博客
YANG模型简介(一)-云社区-华为云 (huaweicloud.com)
(47条消息) YANG建模语言_yang模型_illusion2000的博客-优快云博客
yang模型中rpc_NETCONF、YANG、ncclient理论和实战(上)_shift0ogg的技术博客_51CTO博客