らくがきちょう

なんとなく

Cisco ACI のイベントをリアルタイムで検知する Node.js サンプルスクリプト

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-clientws に依存している為、これらのモジュールをインストールしておきます。

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