REST API是一种面向资源的接口设计,所有的接口设计都是针对资源来设计的。简单理解就是用URI定位资源,用HTTP(GET、POST、DELETE、PUT、PATCH)描述操作。
目前,SONiC有一个原生RESTAPI框架,基于Golang实现,但功能仅有VLAN、VLAN interface、VXLAN tunnel、路由,功能上侧重业务。而星融元(Asterfusion)的REST API早于社区的原生REST API开发,并选择了具有轻量化,性能高的优点的Tornado框架,且一直在沿用。星融元(Asterfusion)REST API可以与SONiC原生REST API同时使用,未来,也将会贡献给社区。
下面我们来详细介绍一下星融元( Asterfusion )REST API软件:
星融元( Asterfusion )REST API基于Tornado框架开发,通过Nginx实现https方式访问。并在docker容器中运行,开销低,安全性高。同时为了解决RESTAPI在docker容器中不方便做一些系统级的操作如config reload、reboot等问题,我们在HOST上增加了sys-proxy模块,用于REST API直接调用HOST上的命令。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,效率高。
图 1 星融元(Asterfusion) RESTAPI 的软件框图
星融(Asterfusion)REST API运行在一个独立的docker容器中,因为设备web管理组件也运行在其中,所以命名为web-server。
在该容器中,主要包括Ngnix和REST API两大组件。其中Ngnix用于https的代理。
红色虚线中的部分基于Tornado框架实现。其中,service模块为REST API的主入口,它会监听对应端口,注册所有功能模块,并完成整个RESTAPI服务的初始化。
图中Modules就是这些功能模块,包括system、interface、router interface、VLAN等。每个模块包括schema、handler、adapter三部分。
最底层是wrapper层,封装了对数据库的操作。
RESTAPI服务还支持定时任务,比如用于采集接口的各种计数,并计算秒级速率。另外,还提供了一个与HOST进行交互的通道,当RESTAPI服务需要调用系统级的命令时,如reboot,config reload等,会与运行在HOST上的sys-proxy进行通信,用于系统命令的调用。
REST API目录下是不同版本的REST API代码目录,Asterfusion REST API已经迭代到了V3版本。
V3目录下,有REST API服务主入口serivce.py和目录common、modules、task、wrapper。
common目录下是一些公共类、函数的实现。modules目录下是所有功能模块的实现,目前已实现的模块有:system、interface、VLAN、MAC、routerinterface、VRF、route、VXLAN、 BGP、EVPN、LAG、MC-LAG、LLDP、ECMP。在每一个module的目录里,都存在__init__.py、handler.py、adapter.py、schema.py这几个文件。
每个模块URI的格式统一在__init__.py里定义,如BGP是:
urls=[[r’/protocols/bgp-neighbors/([0-9a-fA-F.:]*)/?’, handler.BGPNeighborHandler]]
在handler.py中,定义了POST、DELETE、PATCH、GET、PUT方法的顶层实现。每个方法的具体逻辑由adapter.py中的函数实现。schema.py定义了每个模块对数据类型和范围的检查,如果检查不通过,会直接返回错误码。
task目录实现了轮询任务,目前有一个轮询任务是接口实时流量速率的计算。
wrapper是数据库原子级操作的一个封装层,adapter会调用wrapper层的函数。
如上图所示,两个Server通过两个CX系列交换机进行三层通信,需要在两个交换机上创建routerinterface,并配置路由。
如上图所示,这是一个典型的Leaf-Spine场景,VM-A1和VM-A2属于同一个子网,它们需要通过VXLAN隧道进行二层通信,VM-B1属于另一个子网,它需要和VM-A2通过VXLAN隧道进行三层通信。
该场景需要配置每个交换机的BGP及BGP邻居、EVPN参数、创建VLAN和三层口并进行EVPN MAP相关的配置,分配L2VNI和L3VNI。