Atom Login Admin

Above the clouds

OF-CONFIGを使ってみる #2

written on Sunday,March 02,2014

今回も、OF-CONFIGというOpenFlowスイッチの管理の為のプロトコルについて、理解を深めるべくOF-CONFIG 1.1.1 仕様書を読んでみたり、実際に動作させてみる。

前回はOF-CONFIGの概要について触れてみたが、
今回は、Data Modelについて確認してみる。

OF-CONFIGのData Modelとは

OF-CONFIGのData Modelは、Configuration PointでやりとりするXMLを定義したものである。

Data ModelとはOF-CONFIG1.1.1で定義されているOpenFlow Capable Switchやその部材の設定を行うXMLにエンコードされたデータである。Data Modelはクラスやクラスの属性で構成されている。モデルの設計の目標の一つとして効率かつクリアーにスイッチの設定をXMLで行うことが挙げられる。XMLは可読性があるのが強力な機能である。XMLスキーマでは、主に作成することとプロトコルエンティティでパースをすることになるが、エンコードとパースの容易さは可読性よりも好まれる。これは、簡潔さのXMLベースの設定と単純さのXMLスキーマとのトレードオフのケースであるが、通常、簡潔さと単純さのXMLベースの設定が好まれてきたことを意味する。

YANG Moduleとは

YANGとはRFC 6020で定義されているデータモデリング言語であり、NETCONFのクライアントとサーバー間のAPIを詳細に記述したもので、簡潔なシンタックスと最適化が容易になっている。

YANG ModuleはOF-CONFG1.1.1で定義されているXMLの規範的な制約に準拠している。与えられたXMLスキーマの詳細に記載されているほとんどの構成は、YANG Module内のYANG Languageで既に組み込まれている属性や文法によって自動的に適用される。既にNETCONFツールを使用している実装者は、YANGモジュールを使用することによって実装時間を短縮できる。それにもかかわらず、すべての規範的制約が守られていることを確認する必要がある。-YANG構文で表現できないものを含む。

Core Data Model

以下のUMLダイアグラムはデータモデルのトップレベルのクラスを記載している。

OF-CONFIG UML

コアのモデルはOpenFlow Configuration Pointsにより設定されるOpenFlow Capable Switchとなっている。
スイッチは異なるタイプのリソースセットを含んでいる。OF-CONFIG1.1.1ではOpenFlow Ports、OpenFlow Queues、External Certificate、Owned Certificate、Flow Tableのタイプをモデルに含んでいる。
さらなるリソースタイプは将来のOF-CONFIGに追加されるであろう。OpenFlowリソースはOpenFlow Logical Switchで使う為に有効にできる。OpenFlow Logical SwitchのインスタンスはOpenFlow Capable Switchに含まれている。OpenFlow ControllerのセットはそれぞれのOpenFlow Logical Switchに割り当てられる。
データモデルはいくつかの識別子を持っている。ほとんどはXML element の(id)でエンコードされる。現在、それらIDは、特定のコンテキストで必要な独自性を持つ文字列として定義されている。それらの文字列は、一意性の要件以外は更なるガイドラインはない。しかし、将来変わる可能性がある。特に、URN(ユニバーサルリソース名)の使用が想定されている。
このURNの命名スキームの開発は、ONFの為のURN名前空間を登録する必要がある。URNベースの識別子のための推奨事項については、- CONFIGの将来のバージョンで導入されることが期待される。URNは文字列として表現されているので、そのような勧告は、-CONFIG1.1.1内の識別子と両立させることができる。

ここからは実際にRyuのcapable_switchモジュールを使ってOF-CONFIGで各種設定を実践してみる。

Ryuのcapable_switchモジュールは各種設定を行うOpenFlow Configuration Pointとなる。
以下の例ではSSH接続を使用してスイッチに接続していて、unknown_host_cbには、不明なSSHホスト鍵の処理を行なうコールバック関数を指定せず、無条件に接続を継続するようにしている。

sess = OFCapableSwitch(
    host='localhost',
    port=1830,
    username='linc',
    password='linc',
    unknown_host_cb=lambda host, fingeprint: True)

●OpenFlow Capable Switch

OpenFlow Capable SwitchはOpenFlow設定のroot elementとなる以下の関係をもつ
・特定のOpenFlow Capable Switchの設定や管理を行うOpenFlow Configuration Point
・OpenFlow Capable Switch内で、インスタンス化されているOpenFlow Logical Switch
・OpenFlow Logical Switchで使われるOpenFlow Capable Switch内に含むリソース

以下の属性をもつ
id: OFConfigID
config-version: string
以下の関係をもつ
OpenFlow Configuration Point
OpenFlow Resource
OpenFlow Logical Switch

例:OpenFlow Capable Switchの検索を行う。OpenFlow Capable Switchの状態を取得している。
OpenFlow Capable SwitchをRootとしてResourceやLogical-Switchがぶら下がっている様子が分かる。

capable_switch = sees.capable_switch.get()

●Configuration Point

Configuration PointはOF-CONFIGプロトコルでSwitchの管理を行うエンティティである。
属性は、OpenFlow Capable SwitchのConfiguration Pointの識別子と、Configuration PointとOpenFlow Capable Switchとの通信のプロトコルを指定できる。OpenFlow Capable Switchは複数のConfiguration Pointを格納し管理し、また管理される。プロトコルには、BEEPとその他NETCONFのトランスポートプロトコルを指定できる。
Switchによる接続イニシエーションはオプショナルなので、SSHはデフォルトの接続プロトコルである。
Ryuではサポートしていないクラスだが、デフォルトのSSHで接続している。

以下の属性をもつ
id: OFConfigID
uri:: inet:uri
protocol: {ssh, soap, tls, beep}

●OpenFlow Logical Switch

OpenFlow Logical SwitchはOpenFlow Logical Switchが利用可能か、OpenFlow Capable Switch上で利用可能にすることができるインスタンスを表す。OpenFlow Logical SwitchはDatapathとして振る舞う論理コンテキストで、OpenFlow仕様で記述されている。OpenFlow Logical SwitchはOpenFlowプロトコルを介して一つまたは複数のOpenFlow Controllerと接続されている。OpenFlowプロトコルを介して提供される機能を実現する為のOpenFlow Capable Switchのリソースを使用する。
以下の属性を持つ
・id:OFconfigID
・datapath-id:OFConfigID
・enabled:boolean
・check-controller-certificate: boolean
・lost-connection-behavior: { failSecureMode, failStandaloneMode}
以下の関係を持つ
・OpenFlow Controllers
・Capabilities
・OpenFlow Resources

例:Logical SwitchのDatapath IDを変える。

capable_switch = sess.get_config('running')
for switch in capable_switch.logical_switches.switch:
   switch.datapath_id='22:22:22:22:22:22:22:22'
sess.edit_config('running', capable_switch)

※LINC-Switchで動作確認したのだが、Logical Switchの追加などはstartupでしかできなかった。
想定内ではあるが。Logical SwitchのIDなどもrunningでは変えられない。

●Logical Switch Capability

以下の属性を持つ
max-buffered-packets: xs:integer
max-tables: xs:integer
max-ports: xs:integer
flow-statistics: xs:boolean
table-statistics: xs:boolean
port-statistics: xs:boolean
group-statistics: xs:boolean
queue-statistics: xs:boolean
reassemble-ip-fragments: xs:boolean
block-looping-ports: xs:boolean
以下の関係を持つ
Reserved Port Type
Group Type
Group Capabilit
Action Type
Instruction Type

Ryuではサポートしていないクラス。

●OpenFlow Controller

OpenFlow Controller classはOpenFlow Logical SwitchのOpenFlow Controllerとしての役割のエンティティを表す。属性は、ControllerのロールとコントローラのOpenFlowコネクションのパラメータを示している。
以下の属性を持つ
id: OFconfigID
role: {master,slave, equal}
ip-address: inet:ip-prefix
port: inet:port-number
local-ip-address: inet:ip-address
local-port: inet:port-number
protocol: {tcp, tls}
以下の関係を持つ
OpenFlow Controller OpenFlow State
OpenFlow Supported Versions

例:Controllerの追加

capable_switch = sess.get_config('running')
for switch in capable_switch.logical_switches.switch:
   switch.controllers = ofc.OFLogicalSwitchControllersType(
       controller=[ofc.OFControllerType(
          id='Controller0',
          role='master',
          ip_address='192.168.2.1',
          port=6633,
          local_ip_address='192.168.2.129',
          local_port=32768,
          protocol='tcp',
          state=ofc.OFControllerStateType(
             connection_state='up'
          ))])
sess.edit_config('running', capable_switch)

※Contorllerのip_addressにサブネットマスクが指定できるはずだが、Malformed Messageになった。

●OpenFlow Resource

OpenFlow ResourceはOpenFlow Port、OpenFlow Queue、Owned Certificate、External Certificateのスーパークラスとなっている。スーパークラスには識別子が含まれていて、サブクラスは継承し、サブクラスはそれぞれに付加されたIDを持つ事となる。

●OpenFlow Port(OpenFlow Resourceのサブクラス)

OpenFlow PortはOpenFlow Resourceのインスタンスで、物理ポートや論理ポートを表す。論理ポートはOpenFlow Protocol仕様で記述されているエンドポイントを表す。OpenFlow Portはポート設定、状態のオブジェクトを持ち、物理ポートはPort機能のオブジェクトを持つ。ポートの設定とポート状態の複数のインスタンスが存在することはできないが、複数のポートの機能がある可能性がある。ポートがトンネルエンドポイントを表す場合に、ポートは、ポート機能のオブジェクトが、ポートトンネルオブジェクトが含まれていない。

以下の属性をもつ
number: xs:unsignedInt
name: xs:string
current-rate: xs:unsignedLong
max-rate: xs:unsignedLong

以下の関係をもつ
OpenFlow Port Feature
OpenFlow Port Configuration
OpenFlow Port State
OpenFlow Tunnel
※RyuではPort Configuration、Port Stateをサポートしている。

例:Portの名前変更し、admin_stateをdownに設定する。

capable_switch = sess.get_config('running')
i = 0
for p in capable_switch.resources.port:
   p.name = 'PortRenamed%d' % (i)
   p.configuration.admin_state = 'down'
   i = i + 1
sess.edit_config('running', capable_switch)

●OpenFlow Queue(OpenFlow Resourceのサブクラス)

OpenFlow QueueはOpenFlow Resourceのインスタンスで、Queueのプロパティを含んでいる。OpenFlow Queueは論理コンテキストで、OpenFlow Protocol仕様で記述されている。

以下の属性をもつ
id: OFConfigID
port: OFConfigID
以下の関係をもつ
OpenFlow Queue Property

例:QueueのMin-RateおよびMax-Rateを変更

capable_switch = sess.get_config('running')
for q in capable_switch.resources.queue:
   q.properties=ofc.OFQueuePropertiesType(
      max_rate=500,
      min_rate=100)
sess.edit_config('running', capable_switch)

●External Certificate

External CertificateのインスタンスはControllerとOpenFlow Logical SwitchとのTLS接続確立に使用する公開鍵証明書を含んでいる。

以下の属性をもつ
certificate: X509CertificateType
※Ryuではサポートしていない

●Owned Certificate

Owned CertificateノインスタンスはControllerとOpenFlow Logical SwitchとのTLS接続確立に使用する秘密鍵と証明書を含んでいる。

以下の属性をもつ
certificate: X509CertificateType
以下の関係をもつ
KeyValueType
※Ryuではサポートしていない

トランザクション制御機能について

NETCONFではトランザクション制御機能が必須となっているが、LINC-Switchではサポートしていないようだ。
ちなみにRyuでは以下のようにトランザクションのcommit、rollbackをおこなう。

sess.commit()
sess.discard_changes()

今回は、OF-CONFIGについて理解を深める意味で、仕様書を読んだり実践してみたが、まだサポートしていないスイッチが多いが、将来的には普及するはずであり、既存のスイッチ(非OpenFlow)との一元管理も実現できたらとても有望だなー。と思った。「この仕様の開発の指針は、単純なプロトコルとスキーマを維持し、既存のプロトコルとスキーマモデルの可能なを活用することである。また、SDN採用を推進するための意味のある方法でのOpenFlowの仕様を補完するという、簡単に導入が可能にすることができることである」という目標には共感した。

Comments

Add Comment

Login
This entry was tagged #OpenFlow #OF-CONFIG #Ryu