REST API在SONiC中的实现
REST API 是什么?
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 是什么?
Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,效率高。
- URI说明:https://<SWITCH_IP>[:端口号]/rest/<version>/<resource>
- SWITCH_IP:为交换机的管理口IP;
- 端口号:RESTAPI绑定的https端口号,默认为4430;
- 版本:V3.0,属于RESTAPI的接口版本
- resource是由各功能模块定义,详细说明请联系support@asterfusion.com索取《用户指导-CX系列产品RESTAPI手册》
星融元 REST API 的基本框架
图 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目录下是不同版本的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层的函数。
星融元 REST API 基本功能介绍
星融元REST API 的特性
- 高性能:基于非阻塞式的Tornado实现,并使用了hiredis库读写Redis数据库,效率更高;Nginx可以基于URI将不同的http请求分发到不同的RESTAPI进程,在多核CPU设备中效率更高。
- 易扩展性:如果增加新模块只需要在modules目录下增加新的目录和代码即可。
- POST、PATCH、PUT、DELETE操作有详细的返回数据,返错时会根据返回的数据直接定位到原因,如下图:
- 详细的log机制,每次REST API调用都会详细的log,如下图
星融元 REST API 如何配置业务?举例IP Route和BGP-EVPN典型场景
场景1:IP Route
如上图所示,两个Server通过两个CX系列交换机进行三层通信,需要在两个交换机上创建routerinterface,并配置路由。
交换机A的配置:
- 创建三层口:
- 创建路由:
交换机B的配置:
- 创建三层口:
- 创建路由:
场景2:BGP-EVPN
如上图所示,这是一个典型的Leaf-Spine场景,VM-A1和VM-A2属于同一个子网,它们需要通过VXLAN隧道进行二层通信,VM-B1属于另一个子网,它需要和VM-A2通过VXLAN隧道进行三层通信。
该场景需要配置每个交换机的BGP及BGP邻居、EVPN参数、创建VLAN和三层口并进行EVPN MAP相关的配置,分配L2VNI和L3VNI。
交换机192.168.10.1的配置:
- 系统配置:
- BGP邻居及相关三层口:
- VLAN及三层口配置:
- EVPN MAP:
交换机192.168.10.2的配置:
- 系统配置:
- BGP邻居及相关三层口:
交换机192.168.10.3的配置:
- 系统配置:
- BGP邻居及相关三层口:
- VLAN及三层口配置:
- EVPN MAP