OVSDB 库

路径:os_ken.lib.ovs

类似于 OVSDB 管理器库,此库使您的应用程序能够使用 OVSDB 协议 (RFC7047),但与 OVSDB 管理器库 不同,此库将像 ovs-vsctl 命令一样从控制器端发起连接。请确保您的设备在调用此库的 API 之前正在监听 Unix 域套接字或 TCP/SSL 端口。

# Show current configuration
$ ovs-vsctl get-manager

# Set TCP listen address
$ ovs-vsctl set-manager "ptcp:6640"

有关更多详细信息,请参阅 ovs-vsctl 命令的手册页。

基本用法

  1. 实例化 os_ken.lib.ovs.vsctl.VSCtl

  2. 使用 os_ken.lib.ovs.vsctl.VSCtlCommand 构建命令。语法与 ovs-vsctl 命令几乎相同。

  3. 通过 os_ken.lib.ovs.vsctl.VSCtl.run_command 执行命令。

示例

from os_ken.lib.ovs import vsctl

OVSDB_ADDR = 'tcp:127.0.0.1:6640'
ovs_vsctl = vsctl.VSCtl(OVSDB_ADDR)

# Equivalent to
# $ ovs-vsctl show
command = vsctl.VSCtlCommand('show')
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=[],command='show',options=[],result='830d781f-c3c8-4b4f-837e-106e1b33d058\n    ovs_version: "2.8.90"\n')

# Equivalent to
# $ ovs-vsctl list Port s1-eth1
command = vsctl.VSCtlCommand('list', ('Port', 's1-eth1'))
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=('Port', 's1-eth1'),command='list',options=[],result=[<ovs.db.idl.Row object at 0x7f525fb682e8>])
print(command.result[0].name)
# >>> s1-eth1

API 参考

os_ken.lib.ovs.vsctl

ovs-vsctl 命令类似的库,用于使用 OVSDB 协议

class os_ken.lib.ovs.vsctl.VSCtl(remote)

一个用于描述 Open vSwitch 实例的类。

remote 指定 OVS 实例的地址。os_ken.lib.ovs.vsctl.valid_ovsdb_addr 是一个方便的函数,用于验证此地址。

run_command(commands, timeout_sec=None, exception=None)

执行给定的命令并发送 OVSDB 消息。

commands 必须是 os_ken.lib.ovs.vsctl.VSCtlCommand 的列表。

如果指定了 timeout_sec,则在给定的超时时间 [秒] 后引发异常。 此外,如果指定了 exception,则此函数将使用给定的异常类包装异常。

返回 None,但会填充每个命令实例的 result 属性。

class os_ken.lib.ovs.vsctl.VSCtlCommand(command, args=None, options=None)

一个用于描述类似于 ovs-vsctl 命令的参数的类。

command 指定 ovs-vsctl 的命令。

args 指定给定命令的参数列表或元组。

options 指定给定命令的选项列表或元组。 请注意,并非所有 ovs-vsctl 选项都受支持。 例如,--id 选项尚未支持。 此类支持以下选项。

选项

描述

--may-exist

当给定的端口已存在时,不执行任何操作。 支持的命令是 add-portadd-bond

--fake-iface

将端口创建为假接口。 支持的命令是 add-bond

--must-exist

如果给定的端口不存在,则引发异常。 支持的命令是 del-port

--with-iface

对具有相同名称的接口生效。 支持的命令是 del-port

--if-exists

如果未找到,则忽略异常。 支持的命令是 get

os_ken.lib.ovs.vsctl.valid_ovsdb_addr(addr)

如果给定的 addr 是有效的 OVSDB 服务器地址,则返回 True,否则返回 False。

有效的格式是

  • unix:file

  • tcp:ip:port

  • ssl:ip:port

如果 ip 是 IPv6 地址,则用方括号括起来 (例如,ssl:[::1]:6640)。

参数:

addr -- OVSDB 服务器地址的字符串值。

返回值:

如果有效,则返回 True,否则返回 False。

os_ken.lib.ovs.bridge

os_ken.lib.ovs.vsctl 的包装实用程序库

class os_ken.lib.ovs.bridge.OVSBridge(CONF, datapath_id, ovsdb_addr, timeout=None, exception=None, br_name=None)

提供 os_ken.lib.ovs.vsctl.VSCtl 的包装实用程序。

CONFoslo_config.cfg.ConfigOpts 的实例。 从您的 OSKen 应用程序实例化此类时,通常 self.CONF 就足够了。

datapath_id 指定目标 OVS 实例的数据路径 ID。

ovsdb_addr 指定 OVS 实例的地址。 在调用 init() 方法时自动验证。 请参阅 os_ken.lib.ovs.vsctl.valid_ovsdb_addr 以获取此地址的格式。

如果省略 timeout,则 CONF.ovsdb_timeout 将用作默认值。

timeoutexception 的用法与 os_ken.lib.ovs.vsctl.VSCtl.run_commandtimeout_secexception 相同。

add_bond(name, ifaces, bond_mode=None, lacp=None)

创建绑定端口。

参数:
  • name -- 要创建的端口名称

  • ifaces -- 包含至少 2 个接口的接口列表

  • bond_mode -- 绑定模式 (active-backup、balance-tcp 或 balance-slb)

  • lacp -- LACP 模式 (active、passive 或 off)

add_db_attribute(table, record, column, value, key=None)

将 ('key'=)'value' 添加到 'table' 中的 'record' 的 'column' 中。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl add TBL REC COL [KEY=]VALUE
add_gre_port(name, remote_ip, local_ip=None, key=None, ofport=None)

创建 GRE 隧道端口。

请参阅 add_tunnel_port() 的描述。

add_tunnel_port(name, tunnel_type, remote_ip, local_ip=None, key=None, ofport=None)

创建隧道端口。

参数:
  • name -- 要创建的端口名称

  • tunnel_type -- 隧道类型 (gre 或 vxlan)

  • remote_ip -- 隧道远程 IP 地址

  • local_ip -- 隧道本地 IP 地址

  • key -- GRE 的密钥或 VxLAN 的 VNI

  • ofport -- 请求的 OpenFlow 端口号

add_vxlan_port(name, remote_ip, local_ip=None, key=None, ofport=None)

创建 VxLAN 隧道端口。

请参阅 add_tunnel_port() 的描述。

clear_db_attribute(table, record, column)

清除 'table' 中 'record' 的 'column' 中的值。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl clear TBL REC COL
db_get_map(table, record, column)

获取 'table' 中 'record' 的 'column' 的字典类型值。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get TBL REC COL
db_get_val(table, record, column)

获取 'table' 中 'record' 的 'column' 的值。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get TBL REC COL
del_controller()

删除配置的 OpenFlow 控制器地址。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl del-controller <bridge>
del_port(port_name)

删除 OVS 实例上的端口。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl del-port <bridge> <port>
del_qos(port_name)

删除给定端口上的 Qos 规则。

delete_port(port_name)

删除 OVS 实例上的端口。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl --if-exists del-port <bridge> <port>
find_db_attributes(table, *conditions)

列出在 'table' 中满足 'conditions' 的记录。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl find TBL CONDITION...

注意

目前,仅支持 '=' 条件。 支持其他条件是 TODO。

get_controller()

获取配置的 OpenFlow 控制器地址。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get-controller <bridge>
get_datapath_id()

获取 OVS 实例的数据路径 ID。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get Bridge <bridge> datapath_id
get_db_attribute(table, record, column, key=None)

获取 'table' 中 'record' 的 'column' 的值。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get TBL REC COL[:KEY]
get_ofport(port_name)

获取 OpenFlow 端口号。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl get Interface <port> ofport
get_port_name_list()

获取 OVS 实例上所有端口的列表。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl list-ports <bridge>
get_vif_ports()

返回每个 VIF 端口的 VIF 对象

init()

验证给定的 ovsdb_addr 并连接到 OVS 实例。

如果连接到 OVS 实例失败,或者给定的 datapath_id 与连接的 OVS 实例的数据路径 ID 不匹配,则引发 os_ken.lib.ovs.bridge.OVSBridgeNotFound 异常。

list_db_attributes(table, record=None)

列出 'table' 中的 'record'(或所有记录)。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl list TBL [REC]
remove_db_attribute(table, record, column, value, key=None)

从 'table' 中的 'record' 中的 'column' 中删除 ('key'=)'value'。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl remove TBL REC COL [KEY=]VALUE
run_command(commands)

执行给定的命令并发送 OVSDB 消息。

commands 必须是 os_ken.lib.ovs.vsctl.VSCtlCommand 的列表。

实例化时给定的 timeoutexception 将用于调用 os_ken.lib.ovs.vsctl.VSCtl.run_command

set_controller(controllers)

设置 OpenFlow 控制器地址。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl set-controller <bridge> <target>...
set_db_attribute(table, record, column, value, key=None)

将 'value' 设置到 'table' 中的 'record' 中的 'column' 中。

此方法对应于以下 ovs-vsctl 命令

$ ovs-vsctl set TBL REC COL[:KEY]=VALUE
set_qos(port_name, type='linux-htb', max_rate=None, queues=None)

为给定的端口设置 Qos 规则并创建队列。

exception os_ken.lib.ovs.bridge.OVSBridgeNotFound(msg=None, **kwargs)