一种高级模型与低级模型的自动映射方法及系统与流程

文档序号:18030360发布日期:2019-06-28 22:35阅读:374来源:国知局
一种高级模型与低级模型的自动映射方法及系统与流程

本发明涉及通信技术领域,具体是涉及一种高级模型与低级模型的自动映射方法及系统。



背景技术:

命令行界面(commandlineinterface,cli)是通信设备使用最广泛的网络管理协议,其诞生时间最早。cli通过特定的语法规定用户与设备的交互方式。cli的模型呈树形结构,通过视图实现将相关的功能配置组合成配置块,以及配置块的层层递进。

简单网络管理协议(simplenetworkmanagementprotocol,snmp)发布于1988年,是互联网工程任务组(internetengineeringtaskforce,ietf)发布的标准协议。snmp因其发布时间早、标准化,被通信设备广泛支持。snmp使用信息管理库(moduleinformationbase,mib)作为其数据模型。

网络配置协议(networkconfigurationprotocol,netconf)发布于2006年,是ietf发布的标准协议。netconf相较于cli和snmp具有更丰富的功能。netconf使用yang模型(yangmodel)作为其数据模型。yang模型具有良好的可读性和可扩展性,相比于cli和mib模型,提供了更为丰富的功能。

cli、mib、yang等网络管理数据模型,统称为高级模型,虽然不同的高级模型诞生的时间不同、依赖的网络管理协议不同,但有相似的语法和结构。

高级模型中的术语:

元素(element):包含数据的节点。对应cli中的参数,mib中的标量节点,yang中的叶子;

列表(list):存在多实例的节点,包含一个或多个元素。对应cli中含关键字的视图,mib中的表格,yang中的列表;

关键字(key):唯一标识列表实例的一个或多个元素。对应cli中的索引,mib中的索引,yang中的关键字;

容器(container):不含数据的节点,可包含一个或多个简单或复杂节点。对应cli中不含关键字的视图,mib中的节点,yang中的容器;

在通信设备内部,使用统一的低级模型——一种通用模型来对通信设备进行管理。该通用模型的特征是:以类(class)为单位,是一种扁平的模型。低级模型是一种与网络管理协议无关(protocol-neutral)的信息模型。

如图1所示,其示出了通信设备与网络管理者之间所常用的网络管理协议及其高级模型,当前的通信设备需要同时支持不同的网络管理协议及其高级模型。通信设备不论使用哪一种高级模型,均需要先映射为低级模型再进行处理。不论使用哪一种高级模型下发的配置,均要能支持使用其他高级模型来进行获取,反之亦然。但不同的高级模型间,由于高级模型本身语法不同、支持的特性不同等原因,无法保证与低级模型能一一对应。不仅如此,除去这些客观原因之外,从开发者主观上,低级模型的设计通常以当时主流的高级模型作为参考,当新的高级模型出现后,因高级模型间的差异,导致已设计的低级模型无法完全支持新的高级模型。同时,低级模型与高级模型目前仍可能存在耦合。这种耦合导致同一套低级模型对应多套高级模型时,面临以下场景的挑战:

1、低级模型中的参数在高级模型中不存在;

2、低级模型中的参数在高级模型中变成了不含数据的节点;

3、低级模型中的一个参数,在高级模型中有多处对应;

4、低级模型为了兼容某一种高级模型,导致对另一种高级模型不兼容。

现行的映射多采用对每个模型手工编码来解决上述的种种差异场景,但也存在诸多问题。第一,手动编码对高级模型间差异的处理不具备通用性,抽象程度低,重复劳动程度高;第二,手动编码因人为参与程度高,导致出错概率高;第三,现在的通信设备支持的场景繁多,包括ptn、数通、otn、交换机、sdn/nfv等多种设备形态,所涉及的模型数量少则上百,多则上千,对每个模型的每个节点进行编码,开发成本巨大。



技术实现要素:

本发明的目的是为了克服上述背景技术的不足,提供一种高级模型与低级模型的自动映射方法及系统,高级模型与低级模型的多场景映射。

本发明提供一种高级模型与低级模型的自动映射方法,包括以下步骤:

在高级模型中添加扩展属性,用于支持高级模型节点名称到低级模型元素名称的映射;

加载高级模型与低级模型的映射关系文件,映射关系文件包括必需参数和附加参数,必需参数包括高级模型节点的属性及对应的低级模型元素的属性,附加参数包括预置条件和对应的映射更新动作,当满足预置条件时,执行对应的映射更新动作;

解析高级模型的扩展属性,建立高级模型节点名称与低级模型元素名称的对应关系,根据映射关系文件,将低级模型元素的属性及附加参数与高级模型节点的属性绑定,生成高级模型节点与低级模型元素的映射关系;

根据所述映射关系,执行高级模型与低级模型之间的映射。

在上述方案的基础上,加载高级模型与低级模型的映射关系文件的过程中,当1个高级模型节点对应n个低级模型元素时,映射关系文件的附加参数包括n个预置条件+n个对应的映射更新动作;

当n个高级模型节点对应1个低级模型元素时,每个高级模型节点的映射关系文件的附加参数均包括1个预置条件+1个对应的映射更新动作。

在上述方案的基础上,所述高级模型节点的属性包括节点名称、类型、路径,低级模型元素的属性包括类名称、元素名称、类型、描述、取值范围。

在上述方案的基础上,所述预置条件包括高级模型或低级模型的单个或多个参数的取值、组合、所处的位置;未指定预置条件时,默认为条件满足,直接执行对应的映射更新动作。

在上述方案的基础上,所述高级模型包括yang模型、mib模型与cli模型。

本发明还提供一种高级模型与低级模型的自动映射系统,包括:

扩展属性添加模块,其用于在高级模型中添加扩展属性,用于支持高级模型节点名称到低级模型元素名称的映射;

映射关系文件加载模块,其用于加载高级模型与低级模型的映射关系文件,映射关系文件包括必需参数和附加参数,必需参数包括高级模型节点的属性以及对应的低级模型元素的属性,附加参数包括预置条件和对应的映射更新动作,当满足预置条件时,执行对应的映射更新动作;

映射关系生成模块,其用于解析高级模型的扩展属性,建立高级模型节点名称与低级模型元素名称的对应关系,根据映射关系文件,将低级模型元素的属性及附加参数与高级模型节点的属性绑定,生成高级模型节点与低级模型元素的映射关系;

映射模块,其用于根据所述映射关系,执行高级模型与低级模型之间的映射。

在上述方案的基础上,所述映射关系文件加载模块加载高级模型与低级模型的映射关系文件的过程中,当1个高级模型节点对应n个低级模型元素时,映射关系文件的附加参数包括n个预置条件+n个对应的映射更新动作;

当n个高级模型节点对应1个低级模型元素时,每个高级模型节点的映射关系文件的附加参数均包括1个预置条件+1个对应的映射更新动作。

在上述方案的基础上,所述高级模型节点的属性包括节点名称、类型、路径,低级模型元素的属性包括类名称、元素名称、类型、描述、取值范围。

在上述方案的基础上,所述预置条件包括高级模型或低级模型的单个或多个参数的取值、组合、所处的位置;未指定预置条件时,默认为条件满足,直接执行对应的映射更新动作。

在上述方案的基础上,所述高级模型包括yang模型、mib模型与cli模型。

与现有技术相比,本发明的优点如下:

(1)本发明通过设置映射关系文件,可解决高级模型与低级模型的自动映射时模型之间的差异问题,使高级模型的设计与低级模型解耦,通过设置附加参数实现通信设备使用一套通用低级模型对应多套高级模型。且本发明的映射兼容现有的主流yang、mib和cli等多套高级模型。

(2)本发明通过设置映射关系文件,实现高级模型与低级模型的自动映射,无须编码,节约了大量的开发成本,避免因人为参与导致出错率高的风险。

附图说明

图1是背景技术的高级模型与低级模型映射的场景示意图;

图2是本发明实施例的高级模型与低级模型的自动映射方法的流程示意图;

图3是本发明实施例的cli高级模型与低级模型之间的对应关系示意图;

图4是本发明实施例的cli高级模型与低级模型的自动映射方法的流程示意图;

图5是本发明实施例的cli高级模型与低级模型数据映射的示意图;

图6是本发明实施例的yang高级模型与低级模型之间的多对一的对应关系示意图;

图7是本发明实施例的yang高级模型与低级模型的多对一的自动映射方法的流程示意图;

图8是本发明实施例的yang高级模型与低级模型数据多对一的映射的示意图;

图9是本发明实施例的yang高级模型与低级模型之间的一对多的对应关系示意图;

图10是本发明实施例的yang高级模型与低级模型的一对多的自动映射方法的流程示意图;

图11是本发明实施例的yang高级模型与低级模型数据一对多的映射的示意图。

具体实施方式

下面结合附图及具体实施例对本发明作进一步的详细描述。

参见图2所示,本发明实施例提供一种高级模型与低级模型的自动映射方法,包括以下步骤:

s1,在高级模型中添加扩展属性,用于支持高级模型节点名称到低级模型元素名称的映射;

s2,加载高级模型与低级模型的映射关系文件,映射关系文件包括必需参数和附加参数,必需参数包括高级模型节点的属性及对应的低级模型元素的属性,附加参数包括预置条件和对应的映射更新动作,当满足预置条件时,执行对应的映射更新动作;

s3,解析高级模型的扩展属性,建立高级模型节点名称与低级模型元素名称的对应关系,根据映射关系文件,将低级模型元素的属性及附加参数与高级模型节点的属性绑定,生成高级模型节点与低级模型元素的映射关系;

s4,根据所述映射关系,执行高级模型与低级模型之间的映射。

本申请的第一个实施场景,是cli高级模型与低级模型的自动映射。

如图3所示,其示出了约束路径(explicitpath)配置的cli高级模型与低级模型之间的对应关系。因为低级模型设计时完全参考cli高级模型,所以二者一一对应整齐。

采用本申请中的自动映射方法,如图4所示,具体流程如下:

步骤a1,在cli高级模型中添加扩展属性,使其支持cli高级模型到低级模型的映射能力。

步骤a2,程序启动时,加载低级模型文件,在内存中构建低级模型。

步骤a3,程序启动时,加载cli高级模型与低级模型的映射关系文件。映射文件中,包括cli高级模型的name、index、include/exclude、ip-address节点的名称、类型、路径以及其所对应的低级模型中的explicit-path类、nexthop类名称、元素名称、类型、描述、取值范围、附加参数等必要的参数。

步骤a4,程序启动时,加载cli高级模型文件,在内存中构建cli高级模型树,并解析cli高级模型的扩展属性,构建cli高级模型节点与低级模型元素名称的对应关系,并根据该对应关系,从步骤a3的映射文件中获取到cli高级模型节点所对应的低级模型元素的所有属性,在内存中将低级模型元素属性与cli高级模型节点属性相绑定,完成cli高级模型节点与低级模型中元素对应关系的注册。如图3中的箭头所示。

步骤a5,当设备收到cli高级模型向低级模型映射的请求时,例如针对cli高级模型的配置编辑,如图4,遍历配置编辑报文所使用的cli高级模型的每个节点,根据内存中注册的映射关系构建出低级模型,将其转换为对低级模型的配置编辑。

步骤a6,当设备收到低级模型向cli高级模型映射的请求时,例如针对cli高级模型的配置或者状态读取,设备从低级模型中获取数据,根据内存中注册的映射关系构建出cli高级模型。

作为优选的实施方式,步骤a1具体包括以下步骤:

步骤a101,将cli高级模型转换为xml形式表示。

<node=”explicitname”/>

步骤a102,在xml中添加扩展属性class和element,标注其对应的低级模型的类名和元素名。

<node=”explicitname”class=”explicit-path”element=”name”/>

作为优选的实施方式,步骤a4具体包括以下步骤:

步骤a401,加载cli高级模型时,遍历cli高级模型树每个节点,获取其扩展属性,得到cli高级模型节点名称与低级模型类名称、元素名称的对应关系;

步骤a402,通过低级模型类名称、元素名称在步骤3获取到的对应关系中,绑定其类型、描述、取值范围、附加参数的必要的参数;

步骤a403,cli高级模型树中的子节点,需将父节点的关键字加入其上下文。将explicit-hop类的name元素,加入到nexthop类的上下文中。

作为优选的实施方式,步骤a5具体包括以下步骤:

步骤a501,设备读取cli高级模型的数据报文,按照前序遍历的原则遍历其对应的每个节点,生成数据树,如图5左侧;

步骤a502,根据步骤a4中已注册的对应关系,取出对应的低级模型参数;

步骤a503,根据步骤a4中对应关系里的附加参数,选择满足预置条件的低级模型参数,将数据树中每个节点的数据转换为低级模型的数据,如图5右侧。由于cli高级模型与低级模型一一对应,故不需要附加参数;

步骤a504,将最终的低级模型数据explicit-path类和nexthop类按照低级模型类进行打包。

作为优选的实施方式,步骤a6具体包括以下步骤:

步骤a601,设备从低级模型中遍历获取操作所指定的数据,如图5右侧;

步骤a602,根据步骤a4中已注册的对应关系,取出对应的cli高级模型路径;

步骤a603,根据步骤a4中对应关系里的附加参数,选择满足预置条件的路径,从路径的根节点开始,由父到子逐节点构建cli高级模型树,如图5左侧;

步骤a604,当一个低级模型类的数据构建完成后,再构建下一个低级模型类,直到所有的类都构建完毕。

本申请的第二个实施场景,是yang高级模型与低级模型的多对一的自动映射。

由于cli高级模型早于yang高级模型面世,设备的低级模型是按照cli模型设计。在低级模型中,constraint参数用来存储cli模型中的(include|exclude)参数,取值为二者中的一个。但在yang中,include和exclude的数据类型是容器,即不含数据;且二者分开,不再是同一个参数。两种高级模型出现了差异,低级模型无法保证与两者都一一对应。

图6是约束路径的低级模型与yang高级模型的多对一的对应关系。可以看到,图中实线箭头的部分,出现了yang高级模型中两个节点对应低级模型一个节点的情况。除此之外,图中虚线箭头的部分表示,低级模型中的元素,在yang高级模型中变为了不含数据的容器。

本实施例主要体现本申请如何解决同一套低级模型映射不同的高级模型的解决方案,如图7所示,具体流程如下:

步骤b1,在高级模型中添加扩展属性,使其支持高级模型到低级模型的映射能力。

步骤b2,程序启动时,加载低级模型文件,在内存中构建低级模型。

步骤b3,程序启动时,加载高级模型与低级模型的映射关系文件。映射文件中,包括yang高级模型的name、index、ip-address节点的名称、类型、路径以及其所对应的低级模型中的explicit-path类、nexthop类名称、元素名称、类型、描述、取值范围、附加参数等必要的参数。

步骤b4,程序启动时,加载高级模型文件,在内存中构建高级模型树,并解析高级模型的扩展属性,构建高级模型节点与低级模型元素名称的对应关系,并根据该对应关系,从步骤b3的映射文件中获取到高级模型节点所对应的低级模型元素的所有属性,在内存中将低级模型元素属性与高级模型节点属性相绑定,完成高级模型节点与低级模型中元素对应关系的注册。如图6中的箭头所示。

步骤b5,当设备收到高级模型向低级模型映射的请求时,例如针对高级模型的配置编辑,遍历配置编辑报文所使用的高级模型的每个节点,根据内存中注册的映射关系构建出低级模型,将其转换为对低级模型的配置编辑。

步骤b6,当设备收到低级模型向高级模型映射的请求时,例如针对高级模型的配置或者状态读取,设备从低级模型中获取数据,根据内存中注册的映射关系构建出高级模型。

作为优选的实施方式,步骤b1具体包括以下步骤:

步骤b101,将高级模型转换为xml形式表示。为体现层次结构,对不重要的参数进行了裁剪。

步骤b102,在xml中添加扩展属性extension,标注其对应的低级模型的类名和元素名。

作为优选的实施方式,步骤b4具体包括以下步骤:

步骤b401,加载高级模型时,遍历高级模型树每个节点,获取其扩展属性,得到高级模型节点名称与低级模型类名称、元素名称的对应关系;

步骤b402,通过低级模型类名称、元素名称在步骤b3获取到的对应关系中,绑定其类型、描述、取值范围、附加参数的必要的参数;

步骤b403,高级模型树中的子节点,需将父节点的关键字加入其上下文。将explicit-path类的name元素,加入到nexthop类的上下文中。

作为优选的实施方式,步骤b5具体包括以下步骤:

步骤b501,设备读取高级模型的数据报文,按照前序遍历的原则遍历其对应的每个节点,生成数据树,如图8左侧;

步骤b502,根据步骤b4中已注册的对应关系,取出对应的低级模型参数;

步骤b503,根据步骤b4中对应关系里的附加参数,选择满足预置条件的低级模型参数,将数据树中每个节点的数据转换为低级模型的数据。由于低级模型中的constraint元素在yang高级模型中对应的是不含数据的容器类型,故yang不会下发constraint元素的值。通过附加参数,可以为yang高级模型中的include和exclude容器补充数据下给低级模型。对yang高级模型的exclude容器,默认执行对低级模型的constraint元素补上赋值exclude的动作,无需满足预置条件。附加参数表达方式如下:

<paddedparaclass=”nexthop”element=”constraint”value=”exclude”>

同理,对yang高级模型的include容器,默认执行对低级模型的constraint元素补上赋值include的动作,无需满足预置条件。附加参数表达方式如下:

<paddedparaclass=”nexthop”element=”constraint”value=”include”>

步骤b504,完成附加参数的处理,补上constraint值后,将最终的低级模型数据explicit-path类和nexthop类按照低级模型类进行打包。

作为优选的实施方式,步骤b6具体包括以下步骤:

步骤b601,设备从低级模型中遍历获取操作所指定的数据,如图8右侧;

步骤b602,根据步骤b4中已注册的对应关系,取出对应的高级模型路径;

步骤b603,根据步骤b4中对应关系里的附加参数,选择满足预置条件的路径,从路径的根节点开始,由父到子逐节点构建高级模型树。对于低级模型中的ip-address元素而言,其对应在yang高级模型中的路径,存在两种可能:位于include容器内的ip-address叶子,或者位于exclude容器内的ip-adress叶子。具体选择哪一条路径,可根据低级模型中的constraint元素的取值来判断。当满足预置条件“低级模型中的constraint元素值等于exclude”时,低级模型的ip-address元素位于yang高级模型的exclude容器内;当满足预置条件“低级模型中的constraint元素值等于include”时,低级模型的ip-address元素位于yang高级模型的include容器内。上述这段判断逻辑,落实到对应关系的附加参数中,使用如下方式表达。路径采用xpath语法编写。

<whencondition=”constraint=‘exclude’”

path=”/explicit-paths/explicit-path/nexthop/exclude”/>

<whencondition=”constraint=‘include’”

path=”/explicit-paths/explicit-path/nexthop/include”/>

步骤b604,当explicit-path低级模型类的数据构建完成后,再构建nexthop低级模型类,直到所有的类都构建完毕。

本申请的第三个实施场景,是yang高级模型与低级模型的一对多的自动映射。

本实施例以接口的模型为例。在yang高级模型中,interface列表包含所有类型接口的管理。在低级模型中,每种类型的接口有其单独的类,例如以太网接口、弹性以太网(flexibleethernet,flexe)接口等。因不同类型的接口所具备的属性存在差异,故低级模型的设计方式便于维护某种接口类型所特有的属性。yang高级模型的设计方式,则将所有的接口都抽象为一个interface列表,便于接口的统一管理。

图9是接口的低级模型与yang高级模型的一对多的对应关系。可以看到,图中实线箭头的部分,出现了yang高级模型中一个节点对应低级模型两个节点的情况。

本实施例主要体现本申请如何解决高级模型映射不同的低级模型的解决方案,如图10所示,具体流程如下:

步骤c1,在高级模型中添加扩展属性,使其支持高级模型到低级模型的映射能力。

步骤c2,程序启动时,加载低级模型文件,在内存中构建低级模型。

步骤c3,程序启动时,加载高级模型与低级模型的映射关系文件。映射文件中,包括yang高级模型的name节点的名称、类型、路径以及其所对应的低级模型中的ethernet-if类、flexe-if类名称、元素名称、类型、描述、取值范围、附加参数等必要的参数。

步骤c4,程序启动时,加载高级模型文件,在内存中构建高级模型树,并解析高级模型的扩展属性,构建高级模型节点与低级模型元素名称的对应关系,并根据该对应关系,从步骤c3的映射文件中获取到高级模型节点所对应的低级模型元素的所有属性,在内存中将低级模型元素属性与高级模型节点属性相绑定,完成高级模型节点与低级模型中元素对应关系的注册。如图9中的箭头所示。

步骤c5,当设备收到高级模型向低级模型映射的请求时,例如针对高级模型的配置编辑,遍历配置编辑报文所使用的高级模型的每个节点,根据内存中注册的映射关系构建出低级模型,将其转换为对低级模型的配置编辑。

步骤c6,当设备收到低级模型向高级模型映射的请求时,例如针对高级模型的配置或者状态读取,设备从低级模型中获取数据,根据内存中注册的映射关系构建出高级模型。

作为优选的实施方式,步骤c1具体包括以下步骤:

步骤c101,将高级模型转换为xml形式表示。为体现层次结构,对不重要的参数进行了裁剪。

步骤c102,在xml中添加扩展属性extension,标注其对应的低级模型的类名和元素名。

作为优选的实施方式,步骤c4具体包括以下步骤:

步骤c401,加载高级模型时,遍历高级模型树每个节点,获取其扩展属性,得到高级模型节点名称与低级模型类名称、元素名称的对应关系;

其扩展属性的含义为,当name字段的内容以ethernet开始时,映射到ethernet-if类,当name字段的内容以flexe开始时,映射到flexe-if类

步骤c402,通过低级模型类名称、元素名称在步骤c3获取到的对应关系中,绑定其类型、描述、取值范围、附加参数的必要的参数;

作为优选的实施方式,步骤c5具体包括以下步骤:

步骤c501,设备读取高级模型的数据报文,按照前序遍历的原则遍历其对应的每个节点,生成数据树,如图11左侧;

步骤c502,根据步骤c4中已注册的对应关系,取出对应的低级模型参数;

步骤c503,根据步骤c4中对应关系里的附加参数,选择满足预置条件的低级模型参数,即ethernet-if类,将数据树中每个节点的数据转换为低级模型的数据。

步骤c504,将最终的低级模型数据ethernet-if类按照低级模型类进行打包。

作为优选的实施方式,步骤c6具体包括以下步骤:

步骤c601,设备从低级模型中遍历获取操作所指定的数据,如图11右侧;

步骤c602,根据步骤c4中已注册的对应关系,取出对应的高级模型路径;

步骤c603,根据步骤c4中对应关系里的附加参数,选择满足预置条件的路径,从路径的根节点开始,由父到子逐节点构建高级模型树。对于低级模型中的name元素而言,其对应在yang高级模型中的路径是唯一的。

本发明实施例还提供一种高级模型与低级模型的自动映射系统,包括:

扩展属性添加模块,其用于在高级模型中添加扩展属性,用于支持高级模型节点名称到低级模型元素名称的映射;

映射关系文件加载模块,其用于加载高级模型与低级模型的映射关系文件,映射关系文件包括必需参数和附加参数,必需参数包括高级模型节点的属性以及对应的低级模型元素的属性,附加参数包括预置条件和对应的映射更新动作,当满足预置条件时,执行对应的映射更新动作;

映射关系生成模块,其用于解析高级模型的扩展属性,建立高级模型节点名称与低级模型元素名称的对应关系,根据映射关系文件,将低级模型元素的属性及附加参数与高级模型节点的属性绑定,生成高级模型节点与低级模型元素的映射关系;

映射模块,其用于根据所述映射关系,执行高级模型与低级模型之间的映射。

作为优选的实施方式,所述映射关系文件加载模块加载高级模型与低级模型的映射关系文件的过程中,当1个高级模型节点对应n个低级模型元素时,映射关系文件的附加参数包括n个预置条件+n个对应的映射更新动作;

当n个高级模型节点对应1个低级模型元素时,每个高级模型节点的映射关系文件的附加参数包括1个预置条件+1个对应的映射更新动作。

作为优选的实施方式,所述高级模型节点的属性包括节点名称、类型、路径,低级模型元素的属性包括类名称、元素名称、类型、描述、取值范围。

作为优选的实施方式,所述预置条件包括高级模型或低级模型的单个或多个参数的取值、组合、所处的位置;未指定预置条件时,默认为条件满足,直接执行对应的映射更新动作。

作为优选的实施方式,所述高级模型包括yang模型、mib模型与cli模型。

本领域的技术人员可以对本发明实施例进行各种修改和变型,倘若这些修改和变型在本发明权利要求及其等同技术的范围之内,则这些修改和变型也在本发明的保护范围之内。说明书中未详细描述的内容为本领域技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1