用REST获得openvswitch ovsdb的信息

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

    1. 准备工作

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

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

    2. echo发送存活信息
    3. 客户端可以使用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中到底有些什么数据

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

         
         
       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。接下来我们查询这个数据库有哪些表

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

         
         
       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。

    8. 获得所有网桥

      我们查看一下网桥信息

          
          
       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字段存在,说明该网桥受控制器控制。那我们再看一下其所连控制器的信息。

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

         
         
       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
      返回的结果

    11. 获得所有openflow信息

      代码为

          
          
       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的信息,为下一步工作打下基础

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值