• EOSへの直接アクセスを可能とするSDK – EOS SDK (前編)

 
 
Print Friendly, PDF & Email

本記事では、アリスタが提供するEOSアプリケーション開発の為のSDKである、EOS SDKをご紹介します。この前編にて概要を説明し、続く後編では実践例を扱います。

 

はじめに

以前の記事で eAPIを活用したプログラマビリティをご紹介しました。eAPIはJSONRPC over HTTPを用いてリモート(あるいはローカル)からEOSのCLIコマンドを発行し結果を得ることができる、というものでしたので、特に定期的なコマンド実行や外部システムからのAPIコールに向いているのが特長でした。

今回ご紹介するEOS SDKは、eAPIとは切り口の違ったプログラマビリティをご提供するものです。以下にてサンプルコードも交えながら解説していきます。なお、本記事のコーディングにはPythonを用います。

 

EOS SDKの概要

詳細は本リンク先の解説ページに譲りますが、一言で表すと、EOS SDKを用いることで、EOS上でネイティブに動作するアプリケーションを開発することができます。具体的にイメージしていただくために、まず、以下のEOSのアーキテクチャをご覧ください。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-12-15-13-11-28

EOSはLinux上のユーザー空間で、各ネットワーク・プロセス(エージェントと呼びます)が独立して動作し、エージェントの各種状態をインメモリのデータベースであるSysDBに格納するアーキテクチャを採っています。

EOS SDKはこのSysDBに直接アクセスするAPIを提供します。つまりEOS SDKを活用することで、下図のイメージのような任意のカスタムエージェント(緑色で表示されたエージェント)を開発することが可能となります。ちなみに開発言語はPythonとC++をサポート(*)しています。 (*) 2017年12月時点

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-12-15-13-12-34

なお、EOS SDKを使って開発したアプリケーションを稼働させるにあたってはZライセンスが必要となります。ライセンスの詳細については、こちらのページをご参照ください。

 

eAPIとの対比

前述の通り、EOS SDKを用いることでSysDBに直接アクセスするカスタムエージェントを開発することができますが、しばしば「eAPIでスクリプティングする方法と比較してどのような違いがあるのか?」というご質問を頂きます。

まず、EOS SDKは主に以下の特長があります。

  1. EOS上のその他のエージェントと並列に動作させることができる
  2. EOS上のあらゆるイベントに高速に反応することが可能になる
  3. ProcMgr (*) の配下でエージェントのデーモン管理が容易になる  (*) EOSの全エージェントを監視・管理するエージェント

zu

EOS SDKにおいて、最もeAPIとの違いを感じて頂けるのは、上述したポイントの2つ目と言えるでしょう。

これにより、SysDBにて状態変化があった場合に、カスタムエージェントは、他のEOSエージェントと同様の通知を受け取ることができますので、ポーリングベースではなくイベントドリブンで高速にリアクションするアプリケーションを開発可能です。

また、反対にカスタムエージェントがSysDBにデータを格納すると、他のEOSエージェントはそれらのデータを利活用できますので、任意のエージェント連携を実現可能となります。

例としてCLIエージェントと連携して、showコマンドを用いてカスタムエージェントの状態を表示する、などが挙げられます。

 

EOS SDKを使用する為の準備

(1) アリスタのソフトウェアダウンロードサイトよりSDK をダウンロード(*)します。SDKはrpm形式になっており、ファイル名は、EosSdk-<SDK-version>-<EOS-release>.i686.rpm です。以下に例を示します。 (*) EOSのイメージやリリースノート、その他各種エクステンションファイル同様、これらSDKの関連ファイルについてもチャネル(販売代理店様)経由で提供する仕組みとさせて頂いております。チャネルに関する情報については、こちらからアリスタネットワークスジャパン合同会社の営業窓口へお問い合わせください。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-12-15-16-01-55

(2) ダウンロードしたrpmをEOSデバイスにインストールします。

switch# copy <url-or-path-to-the-rpm> extension: 
switch# extension EosSdk.i686.rpmEosSdk-<SDK-version>-<EOS-release>.i686.rpm 

(3) インストールが完了すれば、以下のようにpythonでの呼び出しなどが可能になります。

switch# bash python 
Welcome to the Python shell. Press Ctrl-D to exit. 
>> import eossdk 
>> print eossdk.version
>>> 2.0.0 

 

EOS SDKを用いたアプリケーション

EOS SDKを用いてアプリケーションを開発するにあたっては、以下の3つのオブジェクトを理解した上で、コーディングを進める必要があります。

  • Value Types
    • データ構造体であり、EOS内部のデータを抽象化します。
  • Managers
    • モジュール・エンティティで、スイッチの各種状態へのアクセスと管理を提供します。例として、動作状態の確認、設定の変更、Value Typesの継続的な収集などを行います。
  • Handlers
    • Handlerから通知を受け取るクライアントは、コールバックによって状態の変化に反応することが可能です。

以下は、これらのオブジェクトを用いて記述した Hello World です。

なお、SDKで作成したエージェントのライフサイクルについてはこちらにて詳解しておりますので、ご参照ください。

arista@arista:~/EOS-SDK$ cat HelloWorld.py
#!/usr/bin/env python
# Copyright (c) 2014 Arista Networks, Inc.  All rights reserved.
# Arista Networks, Inc. Confidential and Proprietary.

import eossdk
import sys

# This is the python version of the HelloWorld.cpp program. See the
# explanation there, or a more detailed walkthrough at the GitHub wiki.

class HelloWorldAgent(eossdk.AgentHandler):
   def __init__(self, sdk):
      self.agentMgr = sdk.get_agent_mgr()
      self.tracer = eossdk.Tracer("HelloWorldPythonAgent")
      eossdk.AgentHandler.__init__(self, self.agentMgr)
      self.tracer.trace0("Python agent constructed")

   def on_initialized(self):
      self.tracer.trace0("Initialized")
      name = self.agentMgr.agent_option("name")
      if not name:
         # No name initially set
         self.agentMgr.status_set("greeting", "Welcome! What is your name?")
      else:
         # Handle the initial state
         self.on_agent_option("name", name)

   def on_agent_option(self, optionName, value):
      if optionName == "name":
         if not value:
            self.tracer.trace3("Name deleted")
            self.agentMgr.status_set("greeting", "Goodbye!")
         else:
            # Time for some social networking!
            self.tracer.trace3("Saying hi to %s" % value)
            self.agentMgr.status_set("greeting", "Hello %s!" % value)

   def on_agent_enabled(self, enabled):
      if not enabled:
         self.tracer.trace0("Shutting down")
         self.agentMgr.status_set("greeting", "Adios!")
         self.agentMgr.agent_shutdown_complete_is(True)

if __name__ == "__main__":
   sdk_ = eossdk.Sdk()
   # Assign the agent instance to a variable so it remains in scope and
   # is not deleted:
   _ = HelloWorldAgent(sdk_)
   sdk_.main_loop(sys.argv)

 

Hello World アプリケーションの配備と実行

(1) 前項のHelloWorld.pyをEOSデバイスへコピーします。

switch> enable
switch# copy <url-or-path-to-the-helloworld.py> flash: 

(2) コピーしたPythonスクリプトをデーモンとして設定します。

switch# configure
switch(config)# daemon HelloWorldAgent
switch(config-daemon-HelloWorldAgent)# exec /mnt/flash/HelloWorld.py
switch(config-daemon-HelloWorldAgent)# no shutdown

 (注) EOS4.16以降は関連箇所の一部のコードが改編された為、各アプリケーションが明示的にSysDBへのマウントプロファイルを作成するステップが必要となりました。

       詳細はこちらの “Intermezzo: Creating a Mount Profile” の項を参照の上、適宜設定をお願いします。

(3) デーモンとしての設定が完了すれば、show daemon コマンドにて、アプリケーションの稼働状況を確認できます。

switch(config-daemon-HelloWorldAgent)# show daemon
Agent: HelloWorldAgent (running)
No configuration options stored.

Status:
Data           Value
-------------- ---------------------------
greeting       Welcome! What is your name?

(4) 最後にこのアプリケーションを介して、SysDBにデータ (*) を書き込んでみます。(*)キーがnameで、バリューがArista-Japan

switch(config-daemon-HelloWorldAgent)# option name value Arista-Japan

switch(config-daemon-HelloWorldAgent)# show daemon
 Agent: HelloWorldAgent (running)
 Configuration: Option Value 
------------    --------------- 
name         Arista-Japan

Status: Data Value 
--------------    ---------------------- 
greeting    Hello Arista-Japan!

 

まとめ

本記事にてEOS SDKの概要を説明し、同SDKを用いて記述したHello Worldアプリケーションとその動作をご覧頂きました。

今回のサンプルは、SysDBへデータを格納してそれをコマンドで表示するのみでしたので、EOS SDKがその真価を発揮するイベントドリブンのリアクションについては触れませんでした。

後編では、日常の運用シーンで起こり得る、具体的なネットワークインフラのイベントに即応するアプリケーションを紹介します。

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: