2015年12月15日火曜日

Contrailのmulticast treeを表示するプログラム

ContrailはBUMトラフィックを処理するときに、特定のノードが大量のコピーをして付加が増えないようにツリーを作ります。
このとき、1つのvrouterは最大4台のvRouterへトラフィックをコピーします。
実際のツリーを確認するには、コマンドラインかIntrospectで確認できるのですが、複数のvRouterにアクセスしなければ確認できないので面倒です。
例えばコマンドラインの場合、以下の手順で確認できます。
1)VNIからNextHop IDを確認
root@contrail-05:~# vxlan --get 2008
VXLAN Table

 VNID    NextHop
----------------
   2008    183

2) NextHopからVRF IDを確認
root@contrail-05:~# nh --get 183
Id:183        Type:Vrf_Translate  Fmly: AF_INET  Flags:Valid, Vxlan, Unicast Flood,   Rid:0  Ref_cnt:2 Vrf:2005
              Vrf:2005

3) VRF IDからMACリストを確認
root@contrail-05:~# rt --dump 2005 --family bridge
Kernel L2 Bridge table 0/2005

Flags: L=Label Valid, Df=DHCP flood

Index     DestMac                          Flags       Label/VNID      Nexthop
170652     0:44:44:0:0:12                                       -          1
249441     a0:36:9f:74:88:d8                  Df                -          3
315393     0:0:5e:0:1:0                       Df                -          3
404400     0:22:22:0:0:12                                       -          1
540752     ff:ff:ff:ff:ff:ff                 LDf             2008        203
656836     2:d2:2f:ef:ae:93                  LDf               27        792
797245     2:b:eb:af:7:f5                    LDf               24        397

4) ff:ff:ff:ff:ff:ff のNextHopを確認し、Sub NHを確認していく。
root@contrail-05:~# nh --get 203
Id:203        Type:Composite  Fmly:AF_BRIDGE  Flags:Valid, Multicast, L2,   Rid:0  Ref_cnt:4 Vrf:2005
              Sub NH(label): 209(0) 204(0) 200(0)

今回作ったプログラムはVNIとvRouterのアドレスを入れれば自動的にBUMを複製するリストを出します。 
プログラムはこちら
必要なライブラリは argparse, sys, xmldict, urllib2です。

使い方はpython bumtreedisp.py -t <vRouterアドレス> -v <VNI>です。
以下のように出力します。
root@console:~# python bumtreedisp.py -t 172.27.113.207 -v 2008
### Host 172.27.113.207 VNI 2008 BUM Tree ###
---- TAP interfaces ----
TAP:tapd22fefae-93  MAC:02:d2:2f:ef:ae:93
---- Tunnel interfaces ----
SIP:192.168.21.1    DIP:10.84.50.5      Encap:MPLSoUDP
SIP:192.168.21.1    DIP:192.168.22.1    Encap:MPLSoUDP※まだ作り途中のため、エラーハンドリングなどが入っていません。
※今後もアップデート予定です。
※2015/12/16出力を調整
※2016/2/8 importしているライブラリをContrailが使用しているxmltodictに変更。合わせてコードを少しきれいにした。 ※2016/3/30 一応αをとった

2015年10月7日水曜日

OpenContrailのSimple Gatewayの作り方 (改訂版)

以前このポストでSimple Gatewayの作り方を書きましたが、2.20で再度試したところバグが直っていて作成方法が少し変わったので再度ポストします。

下図のようにFloatingIPやインターネットに出て行くIPアドレスとして203.0.113.0/24を割り当てます。
この仮想ネットワークはSimpleゲートウェイを作成する前に作成しておきます。
vhost0とRouterの間は適宜接続できるように設定してださい。Compute NodeのDefault GatewayはRouterのアドレスになります。
テスト環境などでグローバルIPアドレスをFloatingIPに割り当てられない場合は、RouterでNATできるように事前に設定してください。
この例では作成されるテナント(プロジェクト)はadminで仮想ネットワーク名はpublicと設定します。


このネットワークに対してSimple gatewayを作成します。


Simple GatewayはコンピュートノードのvRouterをゲートウェイとして利用し、コンピュートノードをゲートウェイとするため、コンピュートノードコマンドを実行します。
まず、以下のディレクトリをexport
export PYTHONPATH=/usr/lib/python2.7/dist-packages/contrail_vrouter_api/gen_py/instance_service/
export PYTHONPATH=/usr/lib/python2.7/dist-packages/nova_contrail_vif/gen_py/instance_service/

次に、provision_vgw_interface.pyでゲートウェイを作成する
python /opt/contrail/utils/provision_vgw_interface.py --oper create --interface vgw1 --subnets 203.0.113.0/24 --route 0.0.0.0/0 --vrf default-domain:admin:public:public

--vrfの引数がdefault-domain:admin:public:publicと仮想ネットワーク名が重なっていますが、これは設定するルーティングインスタンス名です。


この設定をすると、コンピュートノードはvhost経由で外部ネットワークと通信を行います。
インターネットのゲートウェイルータやゲートウェイサーバには仮想ネットワークに通信できるようにルーティングの追加を忘れないようにしてください。

ここまで設定すると、vRouterに VGW1と --routeで設定したルーティング情報が追加されます。
後は仮想マシンにpublicからIPアドレスを割り当てるか、publicからFloating IPを作成し、仮想マシンに割り当てれば外部ネットワークに接続できます。

2015年7月3日金曜日

REST/API ヘルパーを作ってみた

Pythonの勉強がてらREST/APIのヘルパーを作成してみました。
もともとContrailのREST/APIを叩くのに作りましたが、考えてみればOpenStack系のREST/APIでも使えると思ったので公開します。
コードはこちらです。
※まだ入力値のバリデーションとかありません。今後追加していく予定です。

動作:
ユーザー/パスワードをKeystoneに認証し、トークンを受け取った後別のサーバに接続します。

使い方:
Contrail-json.py -k <Keyston IP> -c <Contrail-API> を実行すると、Contrail-APIに接続し、ルートの情報をゲットします。
ゲットしたJSONはデフォルトで見やすくインデントして表示します。

オプション:
-k : Keystone のIPアドレスを入力
-c : Contrail-APIのアドレスを入力
-u : ユーザー名を入力
-p : パスワードを入力
-t : テナント名を入力
-o :get, delete, post, put のいずれかを入力。デフォルトget
-b : JSONメッセージなど、post / putするデータを入力。 ' ' でくくると良い
-d :URIのディレクトリ部を入力。 /v2/network など
-T :ゲットしたJSONメッセージの整形の可否を入力。True/False。デフォルトTrue
-P :認証後に接続するサーバのポート番号を入力。デフォルト8082

例)Keystone と Contrailのアドレスを入れて、仮想ネットワーク一覧を取得
./Contrail_json.py -k 172.27.113.85 -c 172.27.113.85 -u admin -p contrail123 -d virtual-networks
出力結果
{
    "virtual-networks": [
        {
            "fq_name": [
                "default-domain", 
                "default-project", 
                "ip-fabric"
            ], 
            "href": "http://172.27.113.85:8082/virtual-network/263cea75-de70-483b-a05a-76975c8a5387", 
            "uuid": "263cea75-de70-483b-a05a-76975c8a5387"
        }, 
        {
            "fq_name": [
                "default-domain", 
                "demo", 
                "testVN1"
            ], 
            "href": "http://172.27.113.85:8082/virtual-network/289ee5a1-f529-45fd-aa43-180520769227", 
            "uuid": "289ee5a1-f529-45fd-aa43-180520769227"
        }
    ]
}

例)仮想ネットワークを作成
./Contrail_json.py -k 172.27.113.85 -c 172.27.113.85 -u admin -p contrail123 -d virtual-networks -o post -b '{"virtual-network": {"
display_name": "testVN1","flood_unknown_unicast": true,"fq_name": ["default-domain","demo","testVN"],"is_shared": false,"network_ipam_refs": [{"attr": {"ipam_subnets": 
[{"addr_from_start": true,"allocation_pools": [],"default_gateway": "20.0.0.1","dhcp_option_list": {"dhcp_option": []},"dns_server_address": "20.0.0.2","enable_dhcp": t
rue,"host_routes": {"route": []},"subnet": {"ip_prefix": "20.0.0.0","ip_prefix_len": 24}}]},"to": ["default-domain","default-project","default-network-ipam"]}],"parent_
type": "project","parent_uuid": "8e19297b-5c3c-4b48-85f2-76229e27b1a1","route_target_list": {"route_target": ["target:64512:39999"]},"router_external": false,"routing_i
nstances": [{"to": ["default-domain","demo","testVN1","testVN1"]}],"uuid": "32100000-0000-0000-0000-000000000001","virtual_network_properties": {"allow_transit": false,
"forwarding_mode": "l2_l3"}}}'
出力結果
{
    "virtual-network": {
        "fq_name": [
            "default-domain", 
            "demo", 
            "testVN"
        ], 
        "href": "http://172.27.113.85:8082/virtual-network/32100000-0000-0000-0000-000000000001", 
        "name": "testVN", 
        "parent_href": "http://172.27.113.85:8082/project/8e19297b-5c3c-4b48-85f2-76229e27b1a1", 
        "parent_uuid": "8e19297b-5c3c-4b48-85f2-76229e27b1a1", 
        "uuid": "32100000-0000-0000-0000-000000000001"
    }
}

例)仮想ネットワークを削除
./Contrail_json.py -k 172.27.113.85 -c 172.27.113.85 -u admin -p contrail123 -d virtual-networks -o delete
出力結果
delete "virtual-network/32100000-0000-0000-0000-000000000001" succesfully

2015年5月7日木曜日

ContrailのUUIDからfq-nameをゲットする方法と、fq-nameからUUIDをゲットする方法

UUIDからFQNAMEをゲットするには "id-to-fqname"にUUIDを{"uuid": "実際のUUID"}のようにポストします。 例えばUUIDが"10012000-1400-0000-0000-000000000009"の場合、以下のようになります。
curl -H "X-AUTH-TOKEN:$TOKEN" http://172.27.113.85:8082/id-to-fqname -H "Content-Type: application/json; charset=UTF-8" -d '{"uuid": "10012000-1400-0000-0000-000000000009"}'  -X POST

FQNAMが返ってきます。
{"type": "virtual_network", "fq_name": ["default-domain", "demo", "90VN_4_9"]}

逆にFQNAMEからUUIDをゲットしたい場合は""fqname-to-id"にFQNAMEを{"type": "アトリビュート", "fq_name": ["default-domain", "テナント名", "名前"]}のようにポストします。 FQNAMEはアトリビュートによって違います。 さっきの逆をして見ます。以下をポストすると
curl -H "X-AUTH-TOKEN:$TOKEN" http://172.27.113.85:8082/fqname-to-id -H "Content-Type: application/json; charset=UTF-8" -d '{"type": "virtual_network", "fq_name": ["default-domain", "demo", "90VN_4_9"]}'  -X POST 

UUIDが返ってきます。
{"uuid": "10012000-1400-0000-0000-000000000009"}

2015年3月10日火曜日

Contrail のインストールはrootが必要

ubuntu1404以降、デフォルトではsshでrootログインできなくなっている。
なので、fab setup_allなどをやるまえに、rootのパスワードを作成し、rootでログインできるように/etc/ssh/sshd を書き換える必要がある。
[DEFAULT]
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes 
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
書き換えたらservice ssh restart で変更する
[DEFAULT]
service ssh restart 
ssh stop/waiting
ssh start/running, process 19377
Rootでログインできるかテスト
[DEFAULT]
ssh root@127.0.0.1
root@127.0.0.1's password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-40-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

正常にログインできればOK