2016年3月17日木曜日

contrail_sandeshlibs.pyの使いかた

vRouter-agentのintrospectで、virutal-networkを見る場合、 http://<compute-node>:8085/Snh_VnListReq?name= でXMLを確認できます。
ただ、生のintrospectデータはXMLのため、ブラウザでは見えないタグなどがついていてpythonでは扱いにくいです。
contrail_sandeshlibs.py はintrospectのXMLデータをpythonのdict/list形式に変換するプログラムです。
contrail_sandeshlibs.pyはxmlの'@type'のTypeが'sandesh', 'struct', 'i64', 'i32', 'i16', 'u64', 'u32', 'u16', 'double', 'string', 'bool'の場合、Pythonの辞書キーをセットします。
もし、タイプがlistの場合、共通の辞書キーの中にリストを格納します。
contrail_sandeshlibs.py はsandeshのテーブル名から多数のdef定義してあります。
例えば、def get_vn_list(self, name='') はVnListRespから命名されています。
それぞれのdefはコメントを参照してください。

注意: 幾つかのdefは大量のデータを返します。特にifmap系のデータは大量です。事故を防ぐため、幾つかのifmapのdefはフラグを立てないと全てのデータを取ることはできません。全てを取得したい場合、ifmap_dump=Trueを引数にセットしてください。

** vrouter introspect のドキュメントはこちら
** bumtreedisp.pytor_tsn_compare.pyはこのライブラリを使っています。

使い方

1) librariesのインストール
sys
copy
xmltodict
urllib2
** contrail_sandeshlibs.py は以下のライブラリを使っています。xmltodictは標準ライブラリではないですが、Contrailが使っているライブラリです

2) contrail_sandeshlibs のインポート
3) ホスト名とポートのセット. デフォルト値 hostname=127.0.0.1 port=8085
   ポート番号はデーモン毎に異なります。こちらを参照してください。 RolesDaemaonPorts.
4) オブジェクトの作成
5) インスタンスの実行。引数をつけることが可能です。

### Sample code
from contrail_sandeshlibs import *

hostname='172.27.113.207'
port='8085'

a = GetContrailSandesh(hostname=hostname,port=port)
py_dict = a.get_vn_list(name='default-domain:test-project1:VRRPvn1')
return py_dict
### Example:Result
{u'VnListResp': {u'vn_list': {u'vxlan_id': u'7833', u'bridging': u'true', u'name': u'default-domain:test-project1:VRRPvn1', u'admin_state': u'true', u'mirror_acl_uuid': '', u'acl_uuid': '', u'config_vxlan_id': u'0', u'enable_rpf': u'true', u'ipv4_forwarding': u'true', u'flood_unknown_unicast': u'false', u'vrf_name': u'default-domain:test-project1:VRRPvn1:VRRPvn1', u'layer2_forwarding': u'true', u'ipam_host_routes': {u'ipam_name': u'default-domain:default-project:default-network-ipam', u'host_routes': ''}, u'mirror_cfg_acl_uuid': '', u'ipam_data': {u'dns_server': u'10.0.0.2', u'dhcp_enable': u'true', u'ipam_name': u'default-domain:default-project:default-network-ipam', u'ip_prefix': u'10.0.0.0', u'prefix_len': u'24', u'gateway': u'10.0.0.1'}, u'vn_id': u'7833', u'uuid': u'bf34d68a-1eb7-4722-ac78-d7d6104de250'}}}
### Example:Raw XML これは元データです。これが上のようなdictに変換されます
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/universal_parse.xsl"?>
<__VnListResp_list type="slist">
  <VnListResp type="sandesh">
    <vn_list type="list" identifier="1">
      <list type="struct" size="1">
        <VnSandeshData>
          <name type="string" identifier="1">default-domain:test-project1:VRRPvn1</name>
          <uuid type="string" identifier="2">bf34d68a-1eb7-4722-ac78-d7d6104de250</uuid>
          <acl_uuid type="string" identifier="3" link="AclReq"/>
          <mirror_acl_uuid type="string" identifier="4" link="AclReq"/>
          <mirror_cfg_acl_uuid type="string" identifier="5" link="AclReq"/>
          <vrf_name type="string" identifier="6" link="VrfListReq">default-domain:test-project1:VRRPvn1:VRRPvn1</vrf_name>
          <ipam_data type="list" identifier="7">
            <list type="struct" size="1">
              <VnIpamData>
                <ip_prefix type="string" identifier="1">10.0.0.0</ip_prefix>
                <prefix_len type="i32" identifier="2">24</prefix_len>
                <gateway type="string" identifier="3">10.0.0.1</gateway>
                <ipam_name type="string" identifier="4">default-domain:default-project:default-network-ipam</ipam_name>
                <dhcp_enable type="string" identifier="5">true</dhcp_enable>
                <dns_server type="string" identifier="6">10.0.0.2</dns_server>
              </VnIpamData>
            </list>
          </ipam_data>
          <ipam_host_routes type="list" identifier="8">
            <list type="struct" size="1">
              <VnIpamHostRoutes>
                <ipam_name type="string" identifier="1">default-domain:default-project:default-network-ipam</ipam_name>
                <host_routes type="list" identifier="2">
                  <list type="string" size="0"/>
                </host_routes>
              </VnIpamHostRoutes>
            </list>
          </ipam_host_routes>
          <layer2_forwarding type="bool" identifier="9">true</layer2_forwarding>
          <ipv4_forwarding type="bool" identifier="10">true</ipv4_forwarding>
          <admin_state type="bool" identifier="11">true</admin_state>
          <vxlan_id type="i32" identifier="12">7833</vxlan_id>
          <config_vxlan_id type="i32" identifier="13">0</config_vxlan_id>
          <vn_id type="i32" identifier="14">7833</vn_id>
          <enable_rpf type="bool" identifier="15">true</enable_rpf>
          <bridging type="bool" identifier="16">true</bridging>
          <flood_unknown_unicast type="bool" identifier="17">false</flood_unknown_unicast>
        </VnSandeshData>
      </list>
    </vn_list>
    <more type="bool" identifier="0">true</more>
  </VnListResp>
  <Pagination type="sandesh">
    <req type="struct" identifier="1">
      <PageReqData>
        <prev_page type="string" identifier="1" link="PageReq"/>
        <next_page type="string" identifier="2" link="PageReq"/>
        <first_page type="string" identifier="3" link="PageReq">begin:0,end:99,table:db.vn.0,name:default-domain:test-project1:VRRPvn1</first_page>
        <all type="string" identifier="4" link="PageReq">begin:-1,end:-1,table:db.vn.0,name:default-domain:test-project1:VRRPvn1</all>
        <table_size type="u32" identifier="5">2</table_size>
        <entries type="string" identifier="6">0-0/1</entries>
      </PageReqData>
    </req>
    <more type="bool" identifier="0">false</more>
  </Pagination>
</__VnListResp_list>