开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

站点精选

2020-10-31

关注星融元

站点精选

REST API在SONiC中的实现

2020-10-31

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 的基本框架

星融元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 的代码结构
图2 星融元 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基本功能介绍

星融元REST API 的特性

  • 高性能:基于非阻塞式的Tornado实现,并使用了hiredis库读写Redis数据库,效率更高;Nginx可以基于URI将不同的http请求分发到不同的RESTAPI进程,在多核CPU设备中效率更高。
  • 易扩展性:如果增加新模块只需要在modules目录下增加新的目录和代码即可。
  • POST、PATCH、PUT、DELETE操作有详细的返回数据,返错时会根据返回的数据直接定位到原因,如下图:POST、PATCH、PUT、DELETE操作详细的返回数据
  • 详细的log机制,每次REST API调用都会详细的log,如下图REST API调用都会详细的log

星融元 REST API 如何配置业务?举例IP Route和BGP-EVPN典型场景

场景1:IP Route

如上图所示,两个Server通过两个CX系列交换机进行三层通信,需要在两个交换机上创建routerinterface,并配置路由。

交换机A的配置:

  • 创建三层口:配置流程创建三层口
  • 创建路由:创建路由

交换机B的配置:

  • 创建三层口:
  • 创建路由:创建路由

场景2:BGP-EVPN

典型的Leaf-Spine场景

如上图所示,这是一个典型的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邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口
  • VLAN及三层口配置:VLAN及三层口配置VLAN及三层口配置VLAN及三层口配置
  • EVPN MAP:EVPN MAP

交换机192.168.10.2的配置:

  • 系统配置:系统配置
  • BGP邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口

交换机192.168.10.3的配置:

  • 系统配置:系统配置
  • BGP邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口
  • VLAN及三层口配置:VLAN及三层口配置VLAN及三层口配置VLAN及三层口配置
  • EVPN MAPEVPN MAP

相关文章

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2