OVSDBの使い方
OVSDBの詳細に関してはRFC7047を参照してください。
スキーマの確認
vswitch.ovsschemaにスキーマの記載があります。以下に一部抜粋しました。
# vi /usr/share/openvswitch/vswitch.ovsschema "sFlow": { "columns": { "targets": { "type": {"key": "string", "min": 1, "max": "unlimited"}}, "sampling": { "type": {"key": "integer", "min": 0, "max": 1}}, "polling": { "type": {"key": "integer", "min": 0, "max": 1}}, "header": { "type": {"key": "integer", "min": 0, "max": 1}}, "agent": { "type": {"key": "string", "min": 0, "max": 1}}, "external_ids": { "type": {"key": "string", "value": "string", "min": 0, "max": "unlimited"}}}},
OVSDBの起動
Listenするポート番号は指定できます。ここでは6632番にしました。
# ovs-vsctl set-manager ptcp:6632
コマンドでの情報の取得
ローカル上でlistコマンドによりOVSDBの中身を取得できます。
# ovs-vsctl list Port br100 _uuid : 25896cab-344c-4698-8fd8-f0e1a11828d5 bond_downdelay : 0 bond_fake_iface : false bond_mode : [] bond_updelay : 0 external_ids : {} fake_bridge : false interfaces : [f9be7217-2f57-47be-a77a-cc54d934d0a2] lacp : [] mac : [] name : "br100" other_config : {} qos : [] statistics : {} status : {} tag : [] trunks : [] vlan_mode : []
外部端末からの情報の取得
ブリッジが使用しているポート番号を取得するPythonのプログラム例です。
#-*- coding: utf-8 -*- import socket import json OVSDB_IP = "127.0.0.1" OVSDB_PORT = 6632 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((OVSDB_IP, OVSDB_PORT)) BridgeName = "qvo8709e715-ca" monitor_query = \ {"method":"transact", \ "params":["Open_vSwitch", {"op":"select", "table":"Interface", "where":[["name", "==", BridgeName]], "columns":["ofport"]}], "id":0} print "----------------------------------" print "json rpc request" print "----------------------------------" print json.dumps(monitor_query, sort_keys=False, indent=1) s.send(json.dumps(monitor_query)) print "----------------------------------" print "json rpc reply" print "----------------------------------" response = s.recv(8192) result = json.loads(response) print json.dumps(result, sort_keys=False, indent=1)
以下が実行結果の抜粋例です。
---------------------------------- json rpc reply ---------------------------------- { "error": null, "id": 0, "result": [ { "rows": [ { "ofport": 6 } ] } ] }
外部端末から情報の更新
ポートのtagの値を外部から100に変更してみます。
#-*- coding: utf-8 -*- import socket import json OVSDB_IP = "127.0.0.1" OVSDB_PORT = 6632 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((OVSDB_IP, OVSDB_PORT)) monitor_query = { "method":"transact", "params":[ "Open_vSwitch", { "op": "update", "table": "Port", "where": [["name", "==", "qvo2e029f2d-d2"]], "row": {"tag": 100} } ], "id": 0 } print "----------------------------------" print "json rpc request" print "----------------------------------" print json.dumps(monitor_query, sort_keys=False, indent=1) s.send(json.dumps(monitor_query)) print "----------------------------------" print "json rpc reply" print "----------------------------------" response = s.recv(8192) result = json.loads(response) print json.dumps(result, sort_keys=False, indent=1)
確かに変更されました!
# ovs-vsctl show d47cdc83-d466-4bb1-87e2-fe92f83c9b59 Manager "ptcp:6632" Bridge br-int Port "qvo2e029f2d-d2" tag: 100 Interface "qvo2e029f2d-d2" ovs_version: "1.12.90"