OF-Configライブラリ¶
本章では、Ryuに付属しているOF-Configのクライアントライブラリについて紹介します。
OF-Configプロトコル¶
OF-ConfigはOpenFlowスイッチの管理のためのプロトコルです。NETCONF(RFC 6241)のスキーマとして定義されており、論理スイッチ、ポート、キューなどの状態取得や設定を行なうことができます。
OpenFlowと同じONFが策定したもので、以下のサイトから仕様が入手できます。
https://www.opennetworking.org/sdn-resources/onf-specifications/openflow-config
本ライブラリはOF-Config 1.1.1に準拠しています。
注釈
現在Open vSwitchはOF-Configをサポートしていませんが、同じ目的のためにOVSDBというサービスを提供しています。OF-Configは比較的新しい規格で、Open vSwitchがOVSDBを実装したときにはまだ存在していませんでした。
OVSDBプロトコルはRFC 7047として仕様が公開されていますが、事実上Open vSwitch専用のプロトコルとなっています。OF-Configはまだ登場から日が浅いですが、将来的に多くのOpenFlowスイッチで実装されることが期待されます。
ライブラリ構成¶
ryu.lib.of_config.capable_switch.OFCapableSwitchクラス¶
NETCONFセッションを扱うためのクラスです。
from ryu.lib.of_config.capable_switch import OFCapableSwitch
ryu.lib.of_config.classesモジュール¶
設定内容をpythonオブジェクトとして扱うためのクラス群を提供するモジュールです。
注釈
クラス名は基本的にOF-Config 1.1.1のyang specification上のgroupingキーワードで使われている名前と同じです。例. OFPortType
import ryu.lib.of_config.classes as ofc
使用例¶
スイッチへの接続¶
SSHトランスポートを使用してスイッチに接続します。unknown_host_cbには、不明なSSHホスト鍵の処理を行なうコールバック関数を指定しますが、ここでは無条件に接続を継続するようにしています。
sess = OFCapableSwitch(
host='localhost',
port=1830,
username='linc',
password='linc',
unknown_host_cb=lambda host, fingeprint: True)
GET¶
NETCONF GETを使用して状態を取得する例です。全てのポートの/resources/port/resource-idと/resources/port/current-rateを表示します。
csw = sess.get()
for p in csw.resources.port:
print p.resource_id, p.current_rate
GET-CONFIG¶
NETCONF GET-CONFIGを使用して設定を取得する例です。
注釈
runningというのはNETCONFのデータストアで、現在動作している設定です。実装によりますが、他にもstartup(デバイスの起動時に読み込まれる設定)やcandidate(候補設定)などのデータストアが利用できます。
全てのポートの/resources/port/resource-idと/resources/port/configuration/admin-stateを表示します。
csw = sess.get_config('running')
for p in csw.resources.port:
print p.resource_id, p.configuration.admin_state
EDIT-CONFIG¶
NETCONF EDIT-CONFIGを使用して設定を変更する例です。基本的に、GET-CONFIGで取得した設定を編集してEDIT-CONFIGで送り返す、という手順になります。
注釈
プロトコル上はEDIT-CONFIGで設定の部分的な編集を行なうこともできますが、このような使い方が無難です。
全てのポートの/resources/port/configuration/admin-stateをdownに設定します。
csw = sess.get_config('running')
for p in csw.resources.port:
p.configuration.admin_state = 'down'
sess.edit_config('running', csw)