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 命令的手册页。
基本用法¶
使用
os_ken.lib.ovs.vsctl.VSCtlCommand构建命令。语法与 ovs-vsctl 命令几乎相同。
示例¶
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-port和add-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:filetcp:ip:portssl: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的包装实用程序。CONF是oslo_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将用作默认值。timeout和exception的用法与os_ken.lib.ovs.vsctl.VSCtl.run_command的timeout_sec和exception相同。- 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的列表。实例化时给定的
timeout和exception将用于调用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)¶