Categories: SDN

APIC-EM REST APIのはじめ方 (2)

前回の記事で、APIC-EM の API へアクセスするためのトークンとなる Service Ticket を取得し、デバイスやホスト、トポロジーの情報を取得してみました。今回は、取得したホスト情報を使い、GUI で実装しているアプリである Path Trace を API で実行してみます。

前回のブログ記事で紹介した以下のコマンドを「apicem1.py」という名前で保存しておきます。シェル(Windowsの場合、コマンドプロンプト)で「python -i apicem1.py」と入力すれば、前回の続きからインタラクティブ モードを開始できます。

(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)
import requests
import json
controller_url = 'https://<APIC-EM>/api/v1/'
auth = {'username': 'USERNAME', 'password': 'PASSWORD'}
ticket = requests.post(controller_url + 'ticket', data=json.dumps(auth), headers={'content-type': 'application/json'})
service_ticket = ticket.json()['response']['serviceTicket']
get_host_json = requests.get(controller_url + 'host', headers={'X-Auth-Token': service_ticket}).json()
host_list = [i['hostIp'] for i in get_host_json['response']]

Path Trace で使用するAPIの確認方法

前回の記事で行ったような単独の API であればドキュメントからも容易に API を確認することができますが、今回の Path Trace のように複数の API を組み合わせるような場合、ドキュメントだけでは困難な場合があります。

まずは、GUI の Path Trace アプリを利用して、使用する API を確認する方法を紹介します。

以下のようにブラウザのディベロッパーツールを利用すると、GUI でアプリを実行したときに使用した API、リクエストに入れた値、レスポンスの値を簡単に確認できます。

Path Trace では以下の 3 つの API を使っていることが確認できます。

  • https://<APIC-EM>/api/v1/flow-analysis POST {“sourceIP”: “SOURCE”, “destIP”: “DEST”}
  • https://<APIC-EM>/api/v1/task/{taskId} GET
  • https://<APIC-EM>/api/v1/flow-analysis/{progress} GET

GUI のログインや前回の記事で紹介したアプリ、他のアプリの場合も同様の方法で API を確認できます。

Path Trace を API で実行

Path Trace で利用する API がわかったので、さきほどリストで取り出した Host IP の 1 つ目と 2 つ目で Path Trace を実行してみます。

まずは 1 つめの API へアクセスし、JSON へ変換していきます。
>>> post_flowpath_json = requests.post(controller_url + 'flow-analysis', data=json.dumps({'sourceIP': host_list[0], 'destIP': host_list[1]}), headers={'content-type': 'application/json', 'X-Auth-Token': service_ticket}).json()
>>> print post_flowpath_json
{u'version': u'1.0', u'response': {u'url': u'/api/v1/task/12345678-9abc-def0-1234-56789abcdef0', u'taskId': u'12345678-9abc-def0-1234-56789abcdef0'}}

タスクIDを取得できたので、2 つめの API を使って JSON へ変換します。
>>> get_task_json = requests.get(controller_url + 'task/' + post_flowpath_json['response']['taskId'], headers={'X-Auth-Token': service_ticket}).json()
>>> print get_task_json
{u'version': u'1.0', u'response': {u'rootId': u'0fedcba9-8765-4321-0fed-cba987654321', u'serviceType': u'Policy Analysis Service', u'id': u'0fedcba9-8765-4321-0fed-cba987654321', u'version': 1454321098765, u'startTime': 1454321098765, u'progress': u'CREATE', u'isError': False}}

この表示には「endTime」が表示されていません。これは、まだ計算中ということですから、endTime が出るまで実行してください。これを実際のプログラミングで行う場合は、while 文と time モジュールの sleep() 関数を組み合わせて同等の処理を行います。
>>> get_task_json = requests.get(controller_url + 'task/' + post_flowpath_json['response']['taskId'], headers={'X-Auth-Token': service_ticket}).json()
>>> print get_task_json
{u'version': u'1.0', u'response': {u'rootId': u'fedcba98-7654-3210-fedc-ba9876543210', u'serviceType': u'Policy Analysis Service', u'id': u'fedcba98-7654-3210-fedc-ba9876543210', u'version': 1454321098765, u'startTime': 1454321098765, u'progress': u'0fedcba9-8765-4321-0fed-cba987654321', u'endTime': 1454321099876, u'isError': False}}

最後に progress のIDを使って、3 つめのAPIへアクセスし、計算結果を表示します。
>>> print json.dumps(requests.get(controller_url + 'flow-analysis/' + get_task_json['response']['progress'], headers={'X-Auth-Token': service_ticket}).json(), indent=4)

{
   "version": "1.0",
   "response": {
       ...,
       "networkElementsInfo": [
           {
               "ip": "65.1.1.83", 
               "type": "wireless",
               ...,
               "linkInformationSource": "Switched"
           },
           {
               "name": "AP7081.059f.19ca",
               "ip": "55.1.1.3",
               "role": "ACCESS",
              "linkInformationSource": "Switched",
               "type": "Unified AP",
               ...,
               "tunnels": [
                   "CAPWAP Tunnel"
               ]
           }, 
           ...,
           {
               "ip": "212.1.10.20",
               "type": "wired",
               ...
           }
       ],
       "request": {
           "destIP": "212.1.10.20",
           "sourceIP": "65.1.1.83"
       },
       "properties": []
   }
}

 

GUIのPath Traceの結果と一致していることが確認できます。

今後、APIC-EM のアプリが追加されていく予定ですが、このシリーズを応用していただければ新しいアプリの機能も API で実装する方法がわかると思います。

山崎 敦志

2001年入社。ディベロッパーサポート所属。ネットワーキングおよびデータセンター担当。

シスコのテクノロジーを用いた日本市場向け製品の共同開発に携わった後、現在はシスコのプラットフォームと連携するアプリケーション、機器、ソリューションを開発している企業の技術支援を担当。