目录OpenDayLight•OpenDaylight架构框架•OpenDaylightHydrogen技术架构•OpenDaylightHydrogen工程架构MD-SAL•从AD-SAL到MD-SAL•基于MD-SAL连接建立(OpenFlowv1.3)•Plugin开发流程•“AddFlow”示例YANG模型•YANG,NETCONF,RESTCONF•YANG模型语法详解•Datastore两种形式•Datatree架构框架:Architectural_Framework#Service_Abstraction_LayerOpenDaylightHydrogen技术架构:Hydrogen_Developer_GuideOpenDaylightHydrogen工程架构蓝色箭头为MD-SAL方式红色箭头为AD-SAL方式ControllerSALWebAPPOpenFlowPluginOpenFlowJavaNetworkEquipmentOpenFlow1.0OpenFlow1.3OpenFlow1.0OpenFlow1.3MD-SALDataCollectionNorthBoundAD-SALDeviceDiscoveryNetworkProgramingCapabilityAbstractRESTAPI/RestConfProtocolRESTAPIYANGmodeldefinedNBINBInotificationrpcnotificationrpcOpenFlow1.0OpenFlow1.0OpenFlow1.3•YANG模型是MD-SAL的灵魂,而MD-SAL为OpenDaylight所推广MD-SALMD-SAL对于服务抽象层的Model-driven方法体现出一种统一北向和南向API以及SDN控制器中多种服务和元素中所使用的数据结构。为了描述控制器元素所提供的数据结构,YANG模型作为一种服务和数据抽象的建模语言就起到了作用。YANG模型特性:•建模XML格式数据并由控制器元素提供功能(YIN&plugin)•定义语义元素和他们的关系(datatree)•模拟所有的元素作为一个系统(datatree)•YANG数据模型的XML特性提供了一种自表述数据的方式,控制器元素和采用控制器北向接口API的应用可以以一种原生格式与数据模型一起调用(YIN&plugin)•利用一种模式语言简化控制器元素和应用的开发。模块中提供功能的开发者可以定义一个模型,从而可以创建对于所提供功能的更简单的、数据类型的API。因此降低了通过服务抽象层提供的数据结构的错误交互。(YIN&javafiles):MD-SAL:Architecture从AD-SAL到MD-SAL:MD-SAL:FAQ基于MD-SAL连接建立(OpenFlowv1.3)当交换机与控制器通过协议校验,控制器会向交换机请求一系列信息(端口信息、链路信息等)不管是控制器下发的Request消息,还是网元回复的reply消息,在控制器中都是采用YANG模型来定义的对于那些通过YANG模型生成的java接口、类和方法:•控制器下发的信息:利用setter方法对照协议写进去即可•控制器收到的信息:利用getter方法对照协议将字节流解析存储,也即存到YANG模型的data-store(datatree)里MD-SAL应用可通过已有的方法获取data-store中的数据为本身所用,并且不同模块之前可相互调用。NECtrlTCP[Sync][DestPort6633]TCP[Sync,Ack]TCP[Ack]OF1.3Hello[Proto=0x04]OF1.3Hello[Proto=0x04]OF1.3FeatureRequestOF1.3FeatureReplyOF1.3SetConfigOF1.3MultipartRequest[PORT_DESC]body=nullOF1.3MultipartReply[PORT_DESC]array[ofp_port]“AddFlow”示例:MD-SAL:FAQPlugin开发流程:MD-SAL:FAQYANG模型YANG模型是什么?YANG模型是一种数据建模语言,其产生是为了对NETCONF协议所操作的数据进行建模。最初的网络管理协议SNMP也有对应的建模语言SMI。YANG模型通过树形结构的节点定义描述了数据模型的层级嵌套结构以及各属性的数据类型。YANG具有自己的语法格式,也可以无差别地转换为XML格式,称之为YIN。可以使用第三方工具pyang进行转换。pyang地址:://tools.ietf.org/html/rfc6020,NETCONF,RESTCONFNetworkConfigurationProtocol(NETCONF)是由IETF标准化的一个网络管理协议,它提供了添加,修改,以及删除网络设备配置的机制。RESTCONF是web应用通过http协议获取和操作使用YANG定义的网络资源信息协议。应用和网络设备之间通过REST-likeAPI进行交互。的作用YANG可以用于描述三类数据:•资源:对要操控的资源进行建模,即网元的configurationdata或者operationaldata;•通知(notification):对网元发出的事件通知消息进行建模;•远程过程调用(rpc):对可在网元上触发的远程程序调用(即rpc)进行建模Module&&import&&namespaceYANG模型的不同模块之间通过module进行划分。各个module描述各自部分的数据模型,而不同module之间可以互相引用。每个module有一个独立的namespace以避免命名冲突,为了使用方便还有一个prefix通过import导入外部模块,则可以在本地模块中使用该模块中定义的数据结构或数据类型。导入时会给外部模块一个prefix,引用该模块中的内容时引用名称前要加prefix.基本节点类型grouping:定义树形结构的“暂时”树干container:没有值,但包含一系列的子节点list:定义了一组具有相同数据结构的数据,在json格式的实例中是一个数组,在xml格式的实例中是一系列名称和结构相同的xml节点。List中的各个元素之间通过key来唯一标识;例如nodesleaf:用来定义属性值,如name,ID等。有值,但不包含任何子节点leaf-list:兼具leaf和list的特点,定义了一组相同类型的值。不包含子节点。在json格式实例中是一个数组且数组中每个元素都是一个值,在xml格式的实例中是一系列名称相同值不同的xml节点choice:定义的节点结构是不完全确定的。它包含多个case子节点,代表不同的分支,分别定义了该节点的一种可能的结构。最终节点的结构是且仅能是所有分支中的一种。YANGgeneratedsources:YANG_to_Java_Mappinggrouping&usesgrouping:在同一个模块中,可能在多处需要定义同一种数据结构,使用grouping来定义一个需要在多处使用的数据结构。grouping的定义并没有真正产生节点,只有通过uses引用某个grouping时才会在节点树中创建新的节点。usesgroupingA即为将groupingA内部定义的数据结构复制到uses处,也即另一棵树上。在一个模块中也可以引用其他模块中定义的grouping,只是引用的名称为“module_prefix:grouping_name”。augmentYANG模型允许一个module插入附加节点到datamodels中,包括当前的module(以及子mudule)或者一个外部module.对于供应商来说,增加vendor-specific参数到标注的datamodel中可协作使用。Augment定义了在datamodel层级中的位置,when定义了新的节点有效的条件operational/configurationdata一个节点如果标为configfalse则为operationaldata,表示该数据只能读取而不能进行修改删除等操作。默认为configurationdata,可以进行增删改查数据类型type,typedef,restrictions数据类型分为基本类型和派生类型Leaf节点有具有type定义,表示该属性的数据类型。基本的原生数据类型有uint8,uint16,string,bits,binary,boolean等等。在数据类型的基础上还可以配合restrictions来增加限制条件,比如string可以增加length这一限制条件,进一步缩小合法的数据范围。在基类数据类型基础上可以通过typedef定义派生数据类型,派生数据类型=基类数据类型+restrictions,这里基类数据类型可以是原生数据类型,也可以是其他的派生数据类型。与grouping类似,type也可以一处定义多处使用。:YANG_to_Java_Mappingrpc:RemoteProcedureCallrpc:用于定义netconf的一个rpc操作。它可能包含input和output子节点,分别是该rpc操作所需要的输入和输出数据结构。若没有则表明该操作不需要输入数据或者没有输出数据。notification除了rpc,yang还有一个类似的“notification”,notification用于定义netconf的通知消息的内容,也是用来定义一个服务。两者的区别在于rpc是一对一的,即单播,而notification是多播的,当Provider提交一个notification时,所有的订阅该服务的Consumer都会收到通知,如典型的PacketIn消息,所谓的订阅即实现该notification的接口。rpc生成的接口类名后缀都是Service。nontification生成的接口类名后缀是Listener。Datastore两种形式:config&operationalDatastore中的数据存储分两种形式:config和operational,config持有由应用所写的数据,而operational反映了设备的实际状态,从设备读取