Categories: SDN

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

Cisco Application Policy Infrastructure Controller Enterprise Module (APIC-EM)がリリースされました。DevNet の APIC-EM のサイトで EFT バージョンの情報や Sandbox によるリモート アクセス ラボが無料で提供されているのでご存知の方もいるかと思います。APIC-EM には GUI も用意されており、API でも GUI の機能が実行可能となっています。今回は GUI の機能と API を比較していきます。実行環境は、実機でもSandboxでも可能です。

Postman で REST API へ簡易アクセス

APIC-EM は認証にトークンを使用しているため、ブラウザのみでは REST API を試すことができません。ただし、例えば Google Chrome のプラグイン「Postman」を利用することで GUI で REST API を試すことができるようになります。

手順は『APIC-EM “Hello World” for Northbound REST API』の「Make a request with a GUI」をご覧ください。

REST API を使ってどんな情報が取得できるかは Postman だけでも確認できます。他の API についてもリファレンスを参考にしながら試してみてください。

Python で REST API へアクセス

CMX API の記事で Python を利用したときと同じ環境でインタラクティブ モードを使っていきます。

シェル(Windows の場合、コマンドプロンプト)で「python」と入力するとプロンプト「>>>」が表示され、インタラクティブ モードが起動します。まずは「変数 = 値」という形式で変数に APIC-EM の情報を代入しておきます。

(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)
>>> controller_url = ‘https://<APIC-EM>/api/v1/’
>>> auth = {'username': 'USERNAME', 'password': 'PASSWORD'}
>>> print controller_url, auth
https://<APIC-EM>/api/v1/ {'username': 'USERNAME', 'password': 'PASSWORD'}

APIC-EM の REST API は JSON 形式なので、Requests モジュールと JSON モジュールをインポートし、ヘッダーで content-type に application/json を指定しておきます。まずはトークンとなる Service Ticket を取得する API へアクセスします。
>>> import requests
>>> import json
>>> ticket = requests.post(controller_url + 'ticket', data=json.dumps(auth), headers={'content-type': 'application/json'})
>>> print ticket.text
{"response":{"serviceTicket":"ST-12-ABCDEFGHIJKLMNOPQRST-CAS"},"version":"1.0"}

JSON 形式でレスポンスが返ってきて、Service Ticket を取得できていることがわかります。この Service Ticket を文字列にして API へアクセスするときにヘッダーへ入れます。
>>> service_ticket = ticket.json()['response']['serviceTicket']
>>> print service_ticket
ST-12-ABCDEFGHIJKLMNOPQRST-CAS

では、最初の例として GUI の Navigation Pane にある Device Inventory の情報を取得する API にアクセスすることにします。
>>> get_device = requests.get(controller_url + 'network-device', headers={'X-Auth-Token': service_ticket})
>>> print get_device.text
{"response":[{…},…],"version":"1.0"}

JSON の構造を理解しやすいようにインデントを入れた形でエンコーディングしてみます。
>>> print json.dumps(get_device.json(), indent=4)
{
   "version": "1.0",
   "response": [
       {
       …
       },
       …
   ]
}

“response”の内容がGUIのDevice Inventoryの情報を網羅しているのが確認できます。

次に GUI のNavigation Paneにある Host Inventory の情報を取得する API へアクセスし、Python で値を扱うため、JSON の配列とオブジェクトをそれぞれ Python のリストと辞書へ変換します。
>>> get_host_json = requests.get(controller_url + 'host', headers={'X-Auth-Token': service_ticket}).json()
>>> print get_host_json
{u'version': u'1.0', u'response': [{…, u'hostIp': u'65.1.1.83', …}, {…, u'hostIp': u'212.1.10.20', …}, …]}

“response”の内容が GUI の Host Inventory の情報と同等であることが確認できます。

次回、Host IP をプログラム内で利用するために Host IP をリストで取り出しておきます。
>>> host_list = [i['hostIp'] for i in get_host_json['response']]
>>> print host_list
[u'65.1.1.83', u'212.1.10.20',…]

最後にGUIで実装しているアプリの1つ、Topology の情報を取得する API へアクセスしてみます。
>>> print json.dumps(requests.get(controller_url + 'topology/physical-topology', headers={'X-Auth-Token': service_ticket}).json(), indent=4)
{
   "version": "1.0",
   "response": {
       "nodes": [
           {
           …,
           "id": "01234567-89ab-cdef-0123-456789abcdef",
           …,
           },
           {
           …,
           "id": "fedcba98-7654-3210-fedc-ba9876543210",
           …,
           },
           …
       ],
       "links": [
           {
           …,
           "target": "01234567-89ab-cdef-0123-456789abcdef ",
           …,
           "source": " fedcba98-7654-3210-fedc-ba9876543210",
           …
           },
           …
       ]
   }
}

“nodes”の”id”を参照して”links”の”source”と”target”をつなぐとGUIのTopologyと同様なことが確認できます。
例えばネットワーク図を描写するようなモジュールを使い、これらの情報を利用すれば以下のような簡易的なネットワーク図も自動的に作成できます。

 

次回は複数のAPIを組み合わせて、GUIで実装しているアプリである Path Trace を API で実行してみます。

 

山崎 敦志

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

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