用REST获得openvswitch ovsdb的信息

客户端可以通过ovsdb定义的协议访问openvswitch的数据库,协议在http://tools.ietf.org/html/draft-pfaff-ovsdb-proto-02,看来要成为ietf的标准了?怎么查询这些数据其实有一个样例,但是比较简单,我这里略作扩展,说明如何查询ovs的网桥、所连controller和流信息。

    1. 准备工作
    2. 因为ovs需要认证(公钥)才能访问其数据,我们为了简化直接在ovs所在节点上运行以下命令:

      然后可以直接通过tcp的方式访问ovsdb了

    3. echo发送存活信息
    4. 客户端可以使用tcp方式与服务器保持长连接,所以可能定时需要发送echo信息与服务器确认存活。可编写以下脚本:

       Python | 
       
       copy code |
      ?

      01
      02
      import socket
      03
      import json
      04
       
      05
      OVSDB_IP = '127.0.0.1'
      06
      OVSDB_PORT = 6632
      07
      BUFSIZE = 409600
      08
       
      09
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      10
      s.connect((OVSDB_IP, OVSDB_PORT))
      11
       
      12
      query =  {"method":"echo", "params":[], "id": 0}
      13
      s.send(json.dumps(query))
      14
      response = s.recv(BUFSIZE)
      15
      print response
      16

      执行结果为:
      {“id”:0,”result”:[],”error”:null}
      这是最简单的获取信息方式了,我们接下来要看看OVSDB中到底有些什么数据

    5. 获得所有数据库名
    6. 脚本中其他不变,最后三行换为以下内容,以后步骤也是类似:

       Python | 
       
       copy code |
      ?

      1
      2
      query =  {"method":"list_dbs", "params":[], "id": 0}
      3
      s.send(json.dumps(query))
      4
      response = s.recv(BUFSIZE)
      5
      print response
      6

      执行后结果为
      {“id”:0,”result”:[“Open_vSwitch”],”error”:null}
      可见现在OVSDB中只有一个数据库Open_vSwitch。接下来我们查询这个数据库有哪些表

    7. 获得数据库的所有表结构
    8. 同样,代码为

       Python | 
       
       copy code |
      ?

      1
      2
      query =  {"method":"get_schema", "params":["Open_vSwitch"], "id": 0}
      3
      s.send(json.dumps(query))
      4
      response = s.recv(BUFSIZE)
      5
      print response
      6

      因为表结构字段较多,所以我们将结果格式化,执行./ovs.py |python -m json.tool
      返回的结果将是所有数据库的内容

      后面还有很多内容,在这里就不显示了。数据库除了Bridge,还有Controller、Flow Table、Interface、Manager、Mirror、Netflow、Open vswitch、Port、QoS、Queue、SSL、sFlow。看来OVS默认的流Flow表应该是openflow,其他还支持netflow和sflow。

    9. 获得所有网桥
    10. 我们查看一下网桥信息

       Python | 
       
       copy code |
      ?

      1
      2
      query =  {"method":"transact", "params":["Open_vSwitch", {"op":"select", "table": "Bridge", "where":[]}], "id": 0}
      3
      s.send(json.dumps(query))
      4
      response = s.recv(BUFSIZE)
      5
      print response
      6

      执行./ovs.py |python -m json.tool
      返回的结果将是所有数据库的内容

      篇幅关系,这里展现了两个网桥br-ex和br-tun,其中port字段可以查询网桥上连接的端口,如果controller字段存在,说明该网桥受控制器控制。那我们再看一下其所连控制器的信息。

    11. 获得所有网桥
    12. 我们查看一下网桥信息

       Python | 
       
       copy code |
      ?

      1
      2
      query =  {"method":"transact", "params":["Open_vSwitch", {"op":"select", "table": "Controller", "where":[]}], "id": 0}
      3
      s.send(json.dumps(query))
      4
      response = s.recv(BUFSIZE)
      5
      print response
      6

      执行./ovs.py |python -m json.tool
      返回的结果

    13. 获得所有openflow信息
    14. 代码为

       Python | 
       
       copy code |
      ?

      1
      2
      query =  {"method":"transact", "params":["Open_vSwitch", {"op":"select", "table": "Flow_Table", "where":[]}], "id": 0}
      3
      s.send(json.dumps(query))
      4
      response = s.recv(BUFSIZE)
      5
      print response
      6

      执行./ovs.py |python -m json.tool
      返回的结果result为空,而且静态动态流都为空,开始很疑惑,后来了解ovsdb主要是存放静态信息,所以流信息是没有保留的。获取流应该从vswitchd中获取,具体怎么做看下一篇吧:-)
      ovsdb和vswitchd的关系如该图所示,还有一些ovs的命令。
      ovs关系图

最后说明一下,用REST访问ovsdb可以使用程序化的方法获得ovs的信息,为下一步工作打下基础

Leave a Comment

Your email address will not be published. Required fields are marked *