WebSocket サブスクリプション
Cisco NX-OS は、関係するサブスクライバにスイッチが通知をプッシュできるようにするインターフェイス機能を提供します。NX-API WebSocket インターフェイスを介して、プログラムとエンドユーザーはスイッチのさまざまな状態変化に関する通知を受信できるため、定期的なポーリングの必要がなくなります。
Cisco NX-API REST インターフェイスを使用して API クエリを実行する場合、特定のクエリの結果における将来の変更に対するサブスクリプションを作成するオプションがあります。ユーザーまたはシステムにより開始されたアクションによって、管理オブジェクト(MO)が作成、変更、または削除されると、イベントが生成されます。受信したイベントがサブスクライブ済みのクエリの結果を変更すると、スイッチはサブスクリプションを作成した API クライアントへのプッシュ通知を生成します。
WebSocket を開く
API サブスクリプション機能は、WebSocket プロトコル(RFC 6455)を使用して、API クライアントとの双方向接続を実装します。このようにして、API は非送信請求の通知メッセージをクライアント自体に送信できます。通知チャネルを確立するには、まずそれぞれの API との WebSocket 接続をオープンする必要があります。各スイッチ内で複数のクエリ サブスクリプションをサポートするために必要な WebSocket 接続は 1 つだけです。WebSocket 接続は(トークン検証によって)API セッション接続に依存しており、API セッションが終了すると閉じます。
WebSocket 接続を開く方法はいくつかあります。Pythonクライアントは次のように記述できます。
from websocket import create_connection
connection_string = "ws:// 10.1.2.3/socket{0}".format(token)
ws = create_connection(connection_string, sslopt={"check_hostname": False})
URI では、トークンは現在の API セッション トークン(クッキー)です。次に、トークン付きの URI の例を示します。
ws://10.1.2.3/socketGkZl5NLRZJl5+jqChouaZ9CYjgE58W/pMccR+LeXmdO0obG9NB
Iwo1VBo7+YC1oiJL9mS6I9qh62BkX+Xddhe0JYrTmSG4JcKZ4t3bcP2Mxy3VBmgoJjwZ76ZOuf9V9AD6X
l83lyoR4bLBzqbSSU1R2NIgUotCGWjZt5JX6CJF0=
サブスクリプションの作成
クエリにサブスクリプションを作成するには、オプション「?subscription=yes」でクエリを実行します。この例では、JSON 形式の sys/intf/phys-[eth1/1] のクエリへのサブスクリプションを作成します。
GET http://10.1.1.1/api/mo/sys/intf/phys-[eth1/1].json?subscription=yes
クエリ応答には、サブスクリプションの識別子である subscriptionId が含まれています。サブスクリプションを更新し、特定のサブスクリプションからの今後の通知を識別するために使用できます。
{"totalCount":"0","subscriptionId":"18374686685813276673","imdata":[]}
受信通知
サブスクリプションからのイベント通知では、サブスクリプション ID と MO の説明を含むデータ構造が提供されます。この JSON の例では、sys/intf/phys-[eth1/1] の説明が「test」に変更されています。
{"subscriptionId":["18374686685813276673"],"imdata":[{"l1PhysIf": {"attributes": {"childAction": "","descr": "test","dn": "sys/intf/phys-[eth1/1]","modTs": "2019-10-18T19:42:29.446+00:00","rn": "","status": "modified"}}}]}
特定のクエリに対して複数のアクティブなサブスクリプションが存在する可能性があるため、通知には上記の例と同様なサブスクリプション ID を複数の含めることができます。通知は、JSON または XML フォーマットでサポートされています。
サブスクリプションの更新
イベント通知を受信し続けるには、API セッション中に各サブスクリプションを定期的に更新する必要があります。サブスクリプションを更新するには、例のように、subscriptionId
に等しいパラメータ id
を使用して、HTTP GET メッセージを API メソッド subscriptionRefresh
に送信します。
GET http://10.1.1.1/api/subscriptonRefresh.json?id=18374686685813276673
サブスクリプションが期限切れになっていなければ、API はリフレッシュ メッセージに空の応答を返します。
(注) |
WebSocket サブスクリプションのタイムアウト期間は、デフォルトで 90 秒です。通知が失われないようにするには、サブスクリプションのリフレッシュ メッセージを少なくとも 90 秒ごとに送信する必要があります。 |
要約すると、WebSocket は、NX-OS REST API 内でイベント サブスクリプションのパブリッシャーとサブスクライバ間の通信を可能にする強力なツールとなり得ます。