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