猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

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"