Cisco ACI には「何かの状態変更をリアルタイムに検出する」ことが可能になる Subscription という仕組みがあります。 Node.js で Events を Subscription するサンプルをメモしておきます。 今回は Ubuntu19 でテストしました。
Node.js 環境の用意
最新の node & npm 環境を用意していきます。 まず、標準リポジトリから node と npm をインストールします。
apt -y install nodejs npm
この時点で node と npm のバージョンは以下でした。
# node --version v10.15.2 # npm --version 5.8.0
続いて n をグローバルにインストールし、node と npm を Stable バージョンに更新します。
npm install -g n
n stable
apt でインストールした古いバージョンの node と npm は不要ですので、アンインストールしておきます。
apt purge -y nodejs npm
モジュールを探せるよう、NODE_PATH
を追加しておきます。
echo 'export NODE_PATH=`npm root -g`' >> ~/.bashrc
パスの追加を反映する為、手っ取り早くログアウト&ログインし直しておきます。 これで node と npm のバージョンが更新されました。
# node --version v10.16.0 # npm --version 6.9.0
必要モジュールのインストール
サンプルコードが node-rest-client
と ws
に依存している為、これらのモジュールをインストールしておきます。
npm install -g node-rest-client ws
サンプルコード
サンプルコードは以下の通りです。
var Client = require('node-rest-client').Client; var WebSocket = require('ws'); var apic = '10.0.0.1' var username = 'admin' var password = 'password' var options = { connection: { rejectUnauthorized: false } }; var client = new Client(options); var resp = function (data, response) { var token = data.imdata[0].aaaLogin.attributes.token; var ws = new WebSocket('https://' + apic + '/socket'.concat(token), { rejectUnauthorized: false, strictSSL: false }); ws.on('open', function (data) { console.log('WEBSOCKET-DATA: Socket Open'); client.get('https://' + apic + '/api/node/class/eventRecord.json?subscription=yes', { headers: { 'Content-Type': 'application/json', 'Cookie': 'APIC-COOKIE=' + token } }, function (data, response) { console.log(data.imdata[0]); }); }); ws.on('message', function incoming(data) { console.log(data); }); var testData = client.get('https://' + apic + '/api/node/class/eventRecord.json?subscription=yes', { headers: { 'Content-Type': 'application/json', 'Cookie': 'APIC-COOKIE=' + token } }, function (data, response) { console.log(data.imdata[0]); }); }; var args = { data: { aaaUser: { attributes: { name: username, pwd: password } } }, headers: { "Content-Type": "application/json" } }; client.post('https://' + apic + '/api/aaaLogin.json', args, resp);
実行してみる
用意が出来たら実行してみます。
node event-subscriber.js