Cisco APIC レイヤ 4 から レイヤ 7 のデバイス パッケージ開発ガイド
デバイス スクリプトの開発
デバイス スクリプトの開発

デバイス スクリプトの開発

デバイスのスクリプトについて

デバイスのスクリプトは、APIC サービス API へのコールをデバイス固有のコールに変換し、Application Policy Infrastructure ControllerAPIC)とネットワーク サービス間のアダプタとして動作します。

図 1. デバイスのスクリプトのモデル



デバイスのスクリプトは、各デバイス タイプのコールの処理環境である、スクリプトラッパーのコンテキスト内で動作します。 スクリプトラッパーは、CPU、ファイルおよびソケット リソースの消費を制限するネームスペース内で動作します。

デバイス パッケージをアップロードするとスクリプトラッパーが作成され、デバイスのスクリプト ファイルからモジュールをインポートします。 このモジュールは、API で説明されている機能を表示します。

デバイスのスクリプトはステートレスで、冪等(2 度以上実行しても同じ結果を生む)でなければいけません。 /tmp ディレクトリの一時的ステートの生成を除いて、スクリプト内でのファイル I/O 操作は許可されません。 持続的ステートを保存するための /tmp ディレクトリ内に作成されたファイルは使用しないでください。 APIC はクラスタで実行できます。 デバイスのスクリプトは、どの APIC インスタンスカラデモ起動できます。 /tmp ディレクトリに保存されているデータは、2 種類の API コールで使用できるとはかぎりません。 スクリプトは、どのようなファイルにもそれ自体のステートを保存することができません。

APIC では、スクリプトを Python 2.7 用に実行する必要があります。 Python 2.7 で使用できる標準ライブラリの他に、スクリプト環境は Python 要求ライブラリ v1.2.3 を提供します。 デバイス パッケージが他のライブラリを要求する場合は、デバイス パッケージの開発者はそうしたライブラリをデバイスのスクリプトの zip ファイルにバンドルすることができます。


(注)  


スクリプトはスレッド セーフにします。つまり、どのインスタンスでも、異なるデバイスを設定するために複数のスレッドがスクリプトで同じ機能を呼び出すことができます。 スクリプトはスレッドを呼び出すコンテキストで実行され、その実行の一部として新しいスレッドを生成できません。


Cisco Application Centric Infrastructure のリポジトリには、GitHub のサンプル デバイス スクリプト コードがあります。

https:/​/​github.com/​datacenter/​ACI

GitHub では、シスコがサポートしているのはシスコが配信するソリューションのみです。シスコはサードパーティのソリューションをサポートしていません。

デバイスのスクリプト作成の注意事項

Application Policy Infrastructure ControllerAPIC)とネットワーク サービス間でアダプタを確立するには、すべてのスクリプト API を実装する必要があります。 API はデバイス固有階層に対応する Python ディクショナリを受け取ります。 特定のデバイスで必要とされる内部形式に Python ディクショナリを変換する必要があります。 同様に、デバイスが値を返した場合、API は APIC が必要とする形式に戻り値を変換する必要があります。 例については、「デバイス仕様の開発」の項の仕様と、このセクションの最後にあるサンプル スクリプトを参照してください。

デバイスのスクリプト API

デバイスのスクリプト API は 4 つのカテゴリーに分類されます。

  • デバイス
  • クラスタ
  • サービス
  • エンドポイントおよびネットワーク イベント

APIC では、テナント内の 1 つまたは複数のデバイスのクラスタをユーザが登録する必要があります。 すべてのサービス機能はクラスタに適用されます。 クラスタには 1 つまたは複数のネットワーク サービス デバイスを含めることができます。 単一のデバイスでクラスタを定義することで、デバイスを冗長性のないスタンドアロン モードで実行することができます。 クラスタ内にアクティブ/スタンドバイ ピアとして設定した 2 つのデバイスを登録することで、デバイスをアクティブ/スタンバイの HA モードで実行することができます。 同様に、クラスタ内にアクティブ ピアとして設定した複数のデバイスを登録することで、デバイスをアクティブ/アクティブ モードで実行することができます。 クラスタ内に登録されているデバイスは、アクティブ/アクティブまたはアクティブ/スタンバイの組み合わせがあると想定されます。 クラスタ内のデバイスの HA 設定は APIC 経由でプッシュすることも、あるいは APIC でデバイスを登録する前にデバイス上で直接アウトオブバンドにすることも可能です。

デバイスでの設定は、3 つのカテゴリに分割されます。サービス機能に固有の設定、デバイスに固有の設定、またはクラスタに固有の設定です。 サービス設定はサービス API 経由でプッシュされます。デバイス設定はデバイス API 経由でプッシュされます。そしてクラスタ設定はクラスタ API 経由でプッシュされます。

デバイス API

以下の API は、APIC でクラスタ内に登録されている各デバイス用に呼び出されます。

def deviceValidate( device, version )
def deviceModify( device, interfaces, configuration)
def deviceAudit( device, interfaces, configuration )
def deviceHealth( device, interfaces, configuration )
def deviceCounters( device, interfaces, configuration )

これらの API に配信される設定ディクショナリには、APIC でのデバイス固有の設定が含まれます。


(注)  


APIC は、デバイス API 呼び出し中にはクラスタ レベルまたはサービス機能の設定情報を渡しません。


デバイスの API はどのデバイス固有の設定でも機能しているとみなされ、クラスタのレベル設定を参照したり、クラスタのレベル設定に影響したり、またサービス機能に影響することはありません。

通常、デバイス固有のリンク バンドル(LACP など)のような設定は、deviceModify()、deviceAudit() の呼び出しで実行することができます。

ディクショナリに渡された設定は、デバイス モデルの vnsDevCfg 下で定義されたフォルダおよびパラメータのインスタンスです。

クラスタ API

以下の API は、APIC で登録されている各デバイスのクラスタ用に呼び出されます。

def clusterModify( device, interfaces, configuration )
def clusterAudit( device, interfaces, configuration )

設定ディクショナリには、APIC でのクラスタ設定が含まれます。


(注)  


APIC は、クラスタ API 呼び出し中にはデバイス設定またはサービス設定の情報を渡しません。


クラスタの API はどのクラスタ レベルの設定でも機能しているとみなされ、デバイス固有または機能固有の設定を参照したり、それに影響することはありません。

通常、NTP サーバ、syslog サーバなどの HA クラスタ レベルで実行される設定は、クラスタ API を介して設定されます。

ディクショナリに渡された設定は、デバイス モデルの vnsClusterCfg 下で定義されたフォルダおよびパラメータのインスタンスです。

サービス API

以下の API は、デバイスで実行されたサービス機能用に呼び出されます。

def serviceModify( device, configuration )
def serviceAudit( device, configuration )
def serviceHealth( device, configuration )
def serviceCounters( device, configuration )

設定ディクショナリには、vnsMDevCfgvnsGrpCfg、または vnsMFunc 下で定義されるパラメータおよびフォルダのインスタンスが含まれます。


(注)  


デバイス モデル内の vnsMDevCfg 下で定義されるフォルダまたはパラメータのインスタンスは、サービス グラフの機能のインスタンスがこれらのパラメータを参照する場合のみ、サービス API の呼び出しで渡されます。 vnsMDevCfg 下で定義されるすべてのパラメータおよびフォルダのインスタンスがサービス機能に渡されるわけではありません。 APIC は、サービス API の呼び出しで参照される特定の機能のインスタンスで使用されるパラメータとフォルダのみ配信します。


エンドポイントとネットワーク イベント API

以下の API は、グラフに関連付けられたエンドポイントのグループ(EPG)用にエンドポイントまたはネットワークが変更された場合に呼び出されます。

def attachEndpoint( device, configuration, endpoints )
def detachEndpoint( device, configuration, endpoints )
def attachNetwork( device, configuration, networks)
def detachNetwork( device, configuration, networks )

これらの API は、デバイス仕様がエンドポイントまたはネットワーク接続通知をサポートし、機能コネクタの通知が可能な場合のみ呼び出されます。 AttachEndpoint および DetachEndpoint イベントは、EPG 内のエンドポイントが接続または切断されると呼び出されます。 ネットワーク API は、ブリッジ ドメインまたは EPG でサブネット設定が変更されると呼び出されます。 これらの API が提供する情報はサービス機能設定を自動化し、エンドポイントまたはネットワーク設定が変更されると、サービス機能設定も修正されます。 例としては、ロード バランサにアタッチされるプールに対して動的にサーバを追加または削除すること、またはファイアウォールに対して定義されたアクセス リスト内のサブネットを動的にアップデートすることなどがあります。 デバイス仕様ファイルは、APIC が要求するリターン形式で成功を返す空の機能を定義することができます。 機能性を処理するエンドポイントまたはネットワーク イベントのサポートは必須ではありません。

デバイス パッケージがこれらの機能をサポートしない場合、このドキュメントで説明するように、リターン ディクショナリ形式で成功のステータスを常に返すようなスタブ機能を定義します。

スクリプト フレームワーク

デバイスのスクリプトでインポートする必要がある 2 つのモジュールは次のとおりです。

  • インポート Insieme.Logger
  • インポート Insieme.Config

ロギング

Insieme.Logger はロギング ユーティリティを定義します。 デバイスのスクリプトはこのユーティリティを使ってデバッグ情報をログできます。 ロギング ユーティリティは debug.log というファイルに設定 API ログを記録します。 このファイルは Application Policy Infrastructure ControllerAPIC)から収集されたテクニカル サポート データに含まれます。 デバイスのスクリプトの開発者は、スクリプトの問題のデバッグに役立つよう、できる限り多くの情報を記録する必要があります。

serviceHealth() や serviceCounters() などの定期的 API のログは、periodic.log にリダイレクトされます。 debug.log および periodic.log ファイルには、ファブリック管理者として /data/devicescript/<vendor-model-version>/logs の下の APIC でアクセスできます。

ロギング機能は、Python ロギング機能に類似しています。 ログは、次のカテゴリに分割できます。

  • CRIT = 0
  • ERROR = 1
  • WARN = 2
  • INFO = 3
  • DEBUG = 4
  • DEBUG2 = 5
  • DEBUG3 = 6
  • DEBUG4 = 7

スクリプトによって、次のように API を呼び出すことができます。

Logger.log( level,  Log String)

次に、API を呼び出す例を示します。

Logger.log( Logger.DEBUG, 'Connection to device failed')

定数

Insieme.Config は、ディクショナリの解析に使用できる定数を定義します。

Type = Insieme.Fwk.Enum(
    DEV=0,
    GRP=1,
    CONN=2,
    FUNC=3,
    FOLDER=4,
    PARAM=5,
    RELATION=6,
    ENCAP=7,
    ENCAPASS=8,
    ENCAPREL=9,
    VIF=10,
    CIF=11,
    LIF=12,
)

State = Insieme.Fwk.Enum(
    UNCHANGED=0,
    NEW=1,
    CHANGED=2,
    DELETED=3,
)

Result = Insieme.Fwk.Enum(
    SUCCESS=0,
    TRANSIENT=1,
    PERMANENT=2,
    AUDIT=3,
)

設定ディクショナリの形式

クラスタ API、デバイス API およびサービス API で渡される設定ディクショナリは、デバイス仕様ファイルで定義されているとおりの構造に従います。 設定は各レベルがフォルダを指定するディクショナリの階層として渡されます。 ディクショナリの形式は次のとおりです。

(type,  key, name) : { ‘state’: …
                       ‘transaction’: …
                       ‘connector’: …
                       ‘value’: …
                       ‘target’: …
                       ‘device’: …
                      }

フィールドは次のとおりです。

フィールド 説明
type

ディクショナリによって表されるオブジェクトのタイプを特定します。 このフィールドは、次のいずれかの値を取ることができます。

DEV=0,
GRP=1,
CONN=2,
FUNC=3,
FOLDER=4,
PARAM=5,
RELATION=6,
ENCAP=7,
ENCAPASS=8,
ENCAPREL=9,
VIF=10,
CIF=11,
LIF=12
key オブジェクトのデバイス仕様ファイルで定義されているキーまたは名前属性を指定します。
name ユーザが入力するパラメータまたはフォルダのインスタンス名を指定します。
state

オブジェクトの状態を特定します。 このフィールドは、次のいずれかの値を取ることができます。

UNCHANGED=0,
NEW=1,
CHANGED=2,
DELETED=3,
connector 仕様ファイルで定義された関係に従って解決される接続インスタンスの名前を指定します。 このフィールドは、対応する vnsMFolder オブジェクトまたは vnsMRel オブジェクトにデバイス仕様ファイルで定義される vnsRsConnector 関係がある場合にのみ、フォルダまたは関係ディクショナリに読み込まれます。
value オブジェクトの値を定義します。 フォルダの場合は、このフィールドは別のディクショナリを含むことができます。 関係オブジェクトには要素が含まれず、代わりにターゲット要素があります。 パラメータ オブジェクトの値は 512 文字を超えてはいけません。
target 関係オブジェクトが解決されるターゲット フォルダを定義します。 この要素は、関係オブジェクトに対してのみ書き込まれます。
transaction 特定の API コールアウトにつながるApplication Policy Infrastructure ControllerAPIC)トランザクション ID が含まれます。

トランザクション ID は APIC とデバイス スクリプト間の要求/応答を相関させるために使用されます。 これは主に、デバッグの便宜性のために使用されます。 スクリプトはこの値を無視できます。

device

通常はクラスタ API またはサービス API で渡される設定がクラスタに適用され、クラスタ内のすべてのデバイスで有効になります。 ただし、クラスタ内のデバイスのインターフェイス IP を設定する場合など、その設定をクラスタ内の特定のデバイスに適用することが必要になる可能性があります。 各デバイスには一意の IP を割り当てることができます。 その結果、インターフェイス IP 設定をクラスタ内の 1 台の特定のデバイスに適用する必要があります。 これは、APIC のデバイス コンテキストのラベルを使用して行われます。 APIC でパラメータを設定すると、ユーザは(任意で)この設定が適用されるクラスタ内でデバイスを指定するデバイス コンテキストのラベルを関連付けることができます。

パラメータがクラスタ内の特定のデバイス コンテキストに結合されると、APIC は値としてデバイス名でディクショナリの「デバイス」キーをインスタンス化します。 スクリプトはコールアウトで渡されたデバイス ディクショナリでデバイス名を検索できます。 スクリプトはデバイス フィールドで指定された特定のデバイスにパラメータ設定を適用することができます。

設定ディクショナリの詳細については、サンプル スクリプトを参照してください。 コネクタ、カプセル化およびインターフェイス情報のディクショナリ例については、ファブリック接続 を参照してください。

API 戻り値

API は次の形式のディクショナリを返します。

  { ‘state’: 
    ‘health’: []
    ‘fault’: []
  }

状態は次の値の 1 つを戻します。

    SUCCESS=0
    TRANSIENT=1
    PERMANENT=2
    AUDIT=3

健全性の詳細については、ヘルス モニタリングを参照してください。 エラーの詳細については、エラー コードを参照してください。

デバイスとの接続を確立するために少なくとも 30 秒のタイムアウトをセットするようにデバイスのスクリプトを設定する必要があります。 デバイスのスクリプトが時間間隔内にネットワーク接続を確立できないと、リターン ディクショナリに TRANSIENT(1)状態を返します。 APIC はこのトランシエント状態がクリアされるまでトランザクションを再試行します。

トランシエント エラーは、ユーザがすぐに注意を向けて問題を解決する必要のないエラーを示します。 スクリプトが設定をプッシュするのを妨げる一時的イベントである可能性があります。 APIC はエラーがクリアされるまで 設定を積極的に再プッシュします。 トランシエント エラーが複数(5 回)の再試行後にクリアされなければ、APIC は失敗を持続的としてマークします。

リターン ディクショナリに AUDIT 状態を返すことで、デバイスのスクリプトが監査コールを要求できます。 APIC は AUDIT 状態を返したのがクラスタ API だったのか、デバイス API だったのか、またはサービス API だったのかによって、clusterAudit()、deviceAudit()、または serviceAudit() をトリガーします。 スクリプトは、現在の API コール内で解決できない APIC とデバイスの間の設定不一致を検出するイベントの監査を要求できます。

渡されたパラメータ値または設定に問題があり、問題解決にユーザの介入を必要とする場合、デバイスのスクリプトは PERMANENT エラーを返します。

繰り返し起こるトランシエント エラーは持続的エラーと解釈されることがあります。 APIC はエラーが解決するまで定期的に設定をプッシュし続けます。 再試行はより長い間隔で実行されます。 エラーによっては、クリアするためにユーザの介入が要求される場合もあります(無効なパラメータ値など)。

デバイスのスクリプト API を呼び出すスクリプトラッパー プロセスは、API が120 秒以内に返すことを予期します。 スクリプトが 120 秒以上かかる場合、スクリプトラッパー プロセスは終了し、再起動します。 未処理のトランザクションは再起動後に再生されます。

サービス設定

Application Policy Infrastructure ControllerAPIC)は、各テナント コンテキストにメタデバイス(MDev)のインスタンスを作成します。 MDev インスタンスは仮想デバイス、または vDev と呼ばれます。 テナントのすべてのサービス設定インスタンスは、vDev の下に基づいています。 APIC は、各 vDev を指定するための一意的 ID を作成します。 APIC はまた、各グラフ インスタンスに一意的 ID を作成し、vGrp として表されます。 グループ設定と機能設定は、特定のグラフ インスタンスを指定するこの vGrp インスタンスの下に基づいています。

serviceAudit()、serviceModify()、serviceHealth()、serviceCounter() で渡される設定ディクショナリには、常に vDev オブジェクトと vGrp オブジェクトが含まれています。 マルチ コンテキストのデバイス スクリプトは vDev オブジェクトを使ってテナント コンテキストを一意に識別する必要があります。これにより特定のルーティング ドメインまたはコンテキストにマッピングできます。

デバイスでのパラメータ インスタンス名

vnsMDevCfg 下で定義されるフォルダとパラメータはすべて、vDev の下でインスタンス化されます。 マルチ コンテキストのデバイスで、各 vDev ID に対して設定フォルダを作成する必要があります。または、デバイスまたはデバイス スクリプトで、設定ディクショナリに渡される vDev ID を連結し、複数のコンテキスト全体で一意の名前を作成する必要があります。

次に、機能用にグローバル フォルダとパラメータがあるディクショナリの例を示します。

{
  (0,'',4304): {
     'state': 1,
     'transaction': 10000,
     'value': {
          (4,'Server','webserver1'): {
             'state': 1,
              'transaction': 10000,
              'value': {
              (5,'ipaddress','ipaddress'): {
                 'state': 1,
                 'transaction': 10000,
                 'value': '192.168.100.2'
               },
               (5,'servername','servername'): {
                 'state': 1,
                 'transaction': 10000,
                 'value': 'webserver1'
               }
          }
      }
}

デバイスのスクリプトは、サーバ名のインスタンスが異なるコンテキストで一意に識別されることを確認する必要があります。 名前は同じデバイスで設定された異なるコンテキストで重複することがあるので、デバイスのスクリプトはサーバ名の値に vDev ID を追加し、パラメータとフォルダ名を異なるコンテキストで一意にすることができます。 次に、一意のサーバ名の値の例を示します。

4304_webserver1
webserver1_4304
webserver1.4304

一意のサーバ名の値を作成するもう 1 つの方法は、4304 というフォルダを作り、その 4303 フォルダの下に webserver1 インスタンスを作成することです。

単一コンテキストのデバイスは設定ディクショナリに渡された vDev 引数を無視できます。 同様に、単一コンテキストまたは複数コンテキストのデバイスは、あるグラフのインスタンスが同じデバイスで実行される他のグラフのインスタンスから一意であるように設定されたパラメータとフォルダの名前を保持するために、グループ ID を追加する必要があります。次の例でそれを示します。

(0,'',4304): {
 'state': 1,
 'transaction': 10000,
 'value': {
    (1,'',4368): {
       'state': 1,
       'transaction': 10000,
       'value': {
          (3,'SLB','SLB'): {
             'state': 1,
              'transaction': 10000,
              'value': {
                  (5,'servicename','servicename'): {
                     'state': 1,
                     'transaction': 10000,
                     'value': 'webservice'
                  },
              }
          }
      }
    }
  }
}

デバイスのスクリプトは、このグラフのインスタンスのために作られたサービス名のインスタンスが、同じデバイスで実行される他のグラフのインスタンスと重複しないことを確認する必要があります。 理由は、デバイス仕様におけるグループ設定または機能設定の下で定義されるパラメータおよびフォルダは、グラフ内のグラフ インスタンスまたは機能インスタンスにおいて一意であるためです。 このようなパラメータまたはフォルダの名前は、グラフの異なるインスタンスにおいて、またはグラフ内の機能のインスタンスにおいて、それぞれ一意でない場合があります。 デバイスのスクリプトはグループ ID またはデバイスのディクショナリに渡されるグループ ID と機能名を追加して、グラフまたはグラフ内の機能においてフォルダとパラメータの名前を一意にすることができます。次の例でそれを示します。

4368.SLB.webservice 

デバイスがフォルダの作成をサポートしている場合、スクリプトは設定ディクショナリに渡された vgrp ID で指定されるグラフのフォルダを作成し、グループ特定のパラメータを vgrp フォルダの下でインスタンス化することができます。 同様に、機能設定をグループ フォルダ内の機能固有フォルダの下に作成し、複数のグラフのインスタンスにおける各パラメータ/フォルダの一意性を保持することも可能です。

API 呼び出し

クラスタの設定

Application Policy Infrastructure ControllerAPIC)にクラスタ内の最初のコンクリート デバイスを登録すると、次のような API 呼び出しのシーケンスがトリガーされます。

  1. deviceValidate:この API は、APIC に登録されたデバイスのバージョンがデバイス パッケージにサポートされるかどうかを検証します。
  2. deviceAudit:この APIC コールは、APIC からプッシュされていないデバイスのグローバル設定をすべてクリアします。 デバイスのスクリプトは、APIC でサポートされていなくても、デバイスが作動するのに必要な管理 IP アドレス、ログイン クレデンシャル、および他の設定をクリアしません。     deviceAudit コールは設定をクリアする上で選択的である必要があります。 APIC からプッシュできる設定のみクリアされます。

    deviceAudit() は、サービス機能のパラメータ/設定、またはクラスタ レベル設定は変更しません。 サービス機能は deviceAudit() コールでは影響を受けません。 deviceAudit() コールの目的は、デバイスのレベル設定を APIC と同期させることです。 スクリプトはデータ パスの中断が最小限になるようデバイスを同期します。 スクリプトはデバイスにある APIC でプッシュされなかった設定を識別し、そのような設定は削除されます。


    (注)  


    これはデバイス パッケージによって管理できる設定の場合だけ行われます。


    スクリプトは欠落した設定、またはデバイスと同期していない設定をプッシュします。

  3. clusterAudit:最初のデバイスがロジカル デバイス(デバイス クラスタ)に追加されると、APIC はこの API を呼び出します。 この API は、APIC によってプッシュされないクラスタからの設定をすべてクリアします。 deviceAudit() コールと同様に、この API は、APIC でサポートできる設定のみクリアします。

    clusterAudit() は、サービス機能のパラメータ/設定またはデバイス固有のパラメータは変更しません。 サービス機能は clusterAudit() コールでは影響を受けません。 clusterAudit() コールの目的は、クラスタのレベル設定を APIC と同期させることです。 スクリプトはデータ パスの中断が最小限になるようデバイスを同期します。 スクリプトはデバイスにある APIC でプッシュされなかった設定を識別し、そのような設定は削除されます。


    (注)  


    これはデバイス パッケージによって管理できる設定の場合だけ行われます。


    スクリプトは欠落した設定、またはデバイスと同期していない設定をプッシュします。

  4. clusterModify:この API は、ロジカル デバイス(デバイス クラスタ)に登録され、追加されたデバイスで呼び出されます。 そのコールによりクラスタ設定が行われます。
  5. serviceAudit:この API は、ユーザが APIC で適用した機能設定で呼び出されます。 スクリプトは、設定で渡されたサービス機能をプッシュします。 デバイスに APIC で設定されていないサービス機能があり、それを API で管理できる場合、スクリプトはその設定を削除します。 serviceAudit() コールの目的は、デバイスにおけるサービス固有の機能が APIC と同期しているのを確認することです。

(注)  


APIC 内で保持されているデバイスのクラスタ状態は、clusterAudit() が成功を返すと動作するように変更されます。 すべてのサービス レベルの API は、クラスタが作動した後にのみ呼び出されます。

いったんクラスタ内の 1 つのデバイスが動作すると、そのクラスタは作動中とマークされます。

クラスタ内に追加デバイスを登録すると、次のコールがトリガーされます。

  • deviceValidate()

  • deviceAudit()

  • clusterAudit()


    (注)  


    clusterAudit() がクラスタ内で作動するデバイスを中断することはありません。 クラスタに展開されるサービス機能以外に、デバイスの追加(deviceAudit() または clusterAudit() など)が他に影響を与えることはなく、クラスタで作動状態にあるサービス機能も影響されません。



デバイスの登録後、APIC は定期的に次の API を呼び出します。

  • deviceHealth
  • deviceCounter

クラスタ内のデバイスを削除すると、clusterAudit() が呼び出されます。 クラスタから最後のデバイスが削除され、作動を停止するようクラスタ状態が変更されると、APIC はサービス固有の設定を削除するよう serviceModify() を呼び出します。

サービス グラフの設定

抽象グラフを、エンドポイントのグループ(EPG)にバインドされるコントラクトに関連付けることで、グラフがインスタンス化されると、APIC は次の API を呼び出します。

  • serviceModify:この API は、デバイスのサービス機能をインスタンス化します。

サービスが終了すると、APIC は定期的に次の API を呼び出します。

  • serviceHealth
  • serviceCounter

監査コール

デバイスで未解決のトランザクションがあるときに APIC クラスタが変化すると、APIC は serviceAudit() をトリガーします。 クラスタの変化によって異なる APIC がデバイスとの通信を再開すると、以前の設定トランザクションが完了せず、デバイスと APIC クラスタが同期しなくなることがあります。 新しいマスターによって発行された serviceAudit() コールを呼び出せば、デバイスの状態は APIC との同期が保持されます。

APIC は1 回の serviceAudit() コールで、任意のデバイスに関連付けられたサービス設定全体を渡します。 スクリプトは、デバイスに設定されたサービスの中断を最小限に抑えた状態で、serviceAudit() を処理するよう要求されます。 serviceAudit() コールで、デバイス固有のグローバル設定やクラスタ設定がクリアされることはありません。

serviceAudit() と同様に、APIC は、未解決のデバイス設定またはクラスタ設定トランザクションが進行中かどうかによって、deviceAudit() および clusterAudit() をトリガーします。

デバイスと APIC の設定が変化し、スクリプトが API コール内の違いを解決できないことが検出されると、デバイス スクリプトは監査コールをトリガーすることができます。

clusterAudit() コールは、clusterModify() コールのリターン状態として「3」(AUDIT)を返すことでトリガーできます。 APIC は、clusterAudit() の vnsClusterCfg 下のフォルダおよびパラメータで定義されたすべてのクラスタ設定を渡します。 サービス機能の設定は clusterAudit() で渡されません。 スクリプトはディクショナリで渡された設定を適用し、APIC によって定義されていない設定を削除する必要があります。 スクリプトは、APIC で管理可能なデバイスで見つかり、vnsClusterCfg の下のデバイス仕様ファイルで定義される不要な設定のみ削除します。

deviceAudit() コールは、deviceModify()、deviceHealth() または deviceCounter() コールのリターン状態として、「3」(AUDIT)を返すことでトリガーできます。 APIC は、deviceAudit() コールの vnsDevCfgg 下のフォルダおよびパラメータで定義されたデバイス設定全体を渡します。 サービス機能の設定は deviceAudit() で渡されません。 スクリプトはディクショナリで渡された設定を適用し、APIC によって定義されていないデバイス設定を削除する必要があります。 スクリプトは、APIC で定義され、APIC を介して管理できる設定だけを削除します。

serviceAudit() は、serviceModify()、serviceHealth() または serviceCounter() コールのリターン状態として、「3」を返すことでトリガーできます。 APIC は、デバイス クラスタで実行されるすべての vDev (テナント)とグラフのインスタンスにおいてすべてのサービス機能の設定を渡します。 デバイスは、APIC によって設定されず、APIC を介して管理できる設定を削除します。

パラメータの配信

次に、サービス API 用に渡される設定ディクショナリの例を示します。

Configuration = {
   (0, mDev-key, mDev-Instance-Name) : {
       'state': state
       'value': {
            (1, '', functionGroup-Instance) : {
               'state': state
               'value': {
                   (3, mDevFunction-Key, mDev-Function-Instance-Name): {
                       'state': state,
                       'value': {
                            (2, mDevFunction-Connector-Key, InstanceName): {
                               'state': state
                               'value': {
                                  'CDev-Instance-Name': 'EncapAssociation-Instance',
                                   ...
                               }
                            }
                            (4, mFolder-Key, mFolder-Instance): {
                                  'state': state
                                  'value': {
                                       (5, mParam-Key, mParam-Instance): {
                                            'state': state 
                                             'device': cluster-node-instance
                                              'value': {
                                             }
                                       }
                                  }
                            }
                       }
                   }
               }
            }
           (4, mFolder-Key, mFolder-Instance): {
                 'state': state
                 'value': {
                      (5, mParam-Key, mParam-Instance): {
                           'state': state
                            'value': {
                            }
                      }
                 }
           },
           (7, '', <encap-instance>): {'state': 1, 'tag': TagValue, 'type': TagType },
           (8, '', <encap-association-Instance>): {
                'state': 1, 
                'encap': <encapInstance>, 
                'vif': <LogicalInterfaceInstanceID>
           },
           (10, '', <LogicalInterfaceInstance>): {
                'state': 0,
                'cifs': {'
                   'state': 0,
                   'value': <Interface Value>
                 }
           }
       }
  },
}         ‘

Device = {
   'devs': {
      cluster-node-Instance: {
            'host': cluster-node-ipaddress
            'port': cluster-node-port-number,
            'creds': {
               'username': username, 
               'password': password
            }
       }
    }, 
    'name': cluster-name, 
    'host': cluster-ipaddress
    'port': cluster-port-number,     
    'creds': {
        'username': username,       
        'password': password
    }
}

(注)  


すべてのパラメータは文字列です。

デバイスの識別

デバイス パラメータは、デバイスへのアクセスに必要なデバイス設定とクレデンシャルを含むシンプルなディクショナリです。 次の例に示すように、デバイス スクリプトのほとんどの機能は、変更の対象となるデバイスを識別するデバイス パラメータを使用しています。

{
  'creds': {
    'password': 'admin',
    'username': 'admin'
  },
  'host': '10.30.13.153',                             
  'port': 443
}

APIC は暗号化されたパーティションにクレデンシャルを保存します。

スクリプトは一時ファイルにクレデンシャルを保存しません。 また、デバッグ ログにクレデンシャルを出力しません。

スクリプト エラーの処理

APIC は、約束理論(Promise Theory)に基づく統合モデルを提供し、それによって個々のエージェントが自発的な連携システムに参加します。 APIC は目標とする状態をスクリプトにプッシュし、設定の要素に発生したエラーを提起するための API を提供します。

エラーはパラメータ値が変更されたり、デバイス エラーが起こった場合に発生することがあります。 APIC のエラー時には、新たな APICserviceModify コールを再発行するか、または機能グループを監査するかを決定します。 API はエラー リストを返し、エラーの原因とエラーを解決する可能性のある対処についての詳細情報を提供することができます。

APIC はトランザクション履歴を保持しません。 設定ディクショナリ内のオブジェクトの状態は、管理オブジェクト情報ツリーの状態に基づいて決定されます。 オブジェクトの状態は、新しいオブジェクトが管理オブジェクト ツリーに挿入されると「NEW(1)」とマークされます。 その後の APIC からの API コールアウトは、オブジェクト値が、明示的なユーザ設定、またはオブジェクト値を変更するような暗黙の APIC イベントによって変更されるまで、そのオブジェクト状態を「UNCHANGED(0)」に設定します。

オブジェクト値が変わると、次の modify() API コールでのオブジェクトの状態が「CHANGED(2)」に設定されます。 オブジェクトが削除されると、APIC はオブジェクト状態を「DELETED(3)」に設定して、削除を示します。

API が、設定処理中にスクリプトがエラーを検出したことを示す状態「PERMANENT(2)」を戻す場合、APIC はスクリプトから「SUCCESS(0)」を受信するまで設定を再試行します。 再試行の間にユーザがどのオブジェクト値も変えていない場合は、APIC は再試行中にオブジェクト状態を「UNCHANGED(0)」に設定します。 オブジェクト状態が「NEW(1)」、「CHANGED(2)」、または「DELETED(3)」になるのは、新しいオブジェクトが作成されたか、既存のオブジェクトが変更されたか、または再試行中に削除された場合のみです。

次に、APIC のトランザクション履歴の欠如が原因で起こり得るケースを例として示します。 デバイス パッケージの開発者は、そうした問題を認識し、デバイスのスクリプトで対応する必要があります。

デバイス パッケージに A、B、C の 3 つのパラメータがあると仮定します。A は B に依存し、B は C に依存します。

  • A、B、C が APIC で作成されると、APIC は、3 つのすべてのパラメータ A =a(1) -> B=b (1) -> C=c (1) に対して、状態 create (1) のスクリプトをデバイスに呼び出します。

    スクリプトは B にエラーを提起し、C を設定しますが、A は設定せず、状態 PERMANENT を返します。 このコールアウト デバイスの終りには「c」だけがあります。

    オブジェクト B の設定は無効だったため、APIC は B にエラーを提起します。

  • B の値が b' に変更されると、これにより設定の問題が解決されます。 この設定の変更の結果、APIC はデバイスのスクリプトに修正を求めます。 それに続く API コールアウトの間のパラメータ状態は次のとおりです。

    A=a(0) -> B=b'(2) -> C=c(0)

    APIC はトランザクション履歴を保持しません。 APIC は、前回のトランザクション中に A=a がデバイスに適用されなかったことを認識していません。 APIC は設定を再試行し、再試行の間に変更したパラメータが B だけなので、B のパラメータ状態を更新します。

    スクリプトはパラメータ B を b' に更新しようとします。 スクリプトはデバイスにパラメータ B が存在せず、作成前に変更されることを識別できる必要があります。 理想的には、デバイスへの修正要求はエラーを返します。

    デバイスが作成前の修正をエラーとして識別できる場合、デバイスからのそうしたエラーに対し、スクリプトは以下の 2 つのオプションのうちの 1 つを使って対処します。
    • オプション 1

      デバイスにおいてパラメータ B を値 b' で作成し、デバイスから失われた可能性のある従属オブジェクトを解決します。 スクリプトはディクショナリで渡される設定に従い、修正されたオブジェクトに依存するオブジェクトがデバイスで作成されたかどうかをチェックする必要があります。 オブジェクトが作成されていないと、スクリプトはオブジェクトを作成します。 この例では、スクリプトはオブジェクト A=a がデバイスに見つからないため、B=b’ に依存する A=a を作成します。

    • オプション 2

      リターン応答で「AUDIT (3)」状態を返します。 APIC は設定全体を再生します。


      (注)  


      APIC が設定全体を渡すので、監査コールの要求はコストのかかる操作となる可能性があります。


      デバイスのスクリプトは欠如している設定を識別し、あらゆる欠如設定を適用する必要があります。 このオプションは、ディクショナリ内の修正オブジェクトに設定での従属オブジェクトが存在する場合にのみ使用してください。

    作成前にパラメータが修正されたときにデバイスがエラーを返せない場合、デバイスのスクリプトは、修正操作を実行する前に修正されるオブジェクトを読み取る必要があります。 修正前にデバイスから設定を読み取るというこのアプローチはコストがかかり、パフォーマンスに影響する可能性があります。 ソリューションを最適に維持するために、修正するオブジェクトに依存関係のある他のオブジェクトが存在する場合のみ、デバイスからの設定読み取りを実行してください。

サンプル スクリプト

次に、Python でのデバイス スクリプトの例を示します。

import pprint
import sys
import Insieme.Logger as Logger

#
# Infra API
#def deviceValidate( device,version ):
    return {
        'state': 0,'version': '1.0'
        }

def deviceModify( device,interfaces,configuration):
    return {
        'state': 0,'faults': [],'health': []
        }

def deviceAudit( device,interfaces,configuration ):
    return {
        'state': 0,'faults': [],'health': []
        }

def deviceHealth( device,interfaces,configuration ):
    return {
        'state': 0,'faults': [],'health': ([], 100)
        }

def deviceCounters( device,interfaces,configuration ):
    return {
        'state': 0,'counters': [
            ( [(11,'','eth0')],{
                'rxpackets':100,
                'rxerrors':101,
                'rxdrops':102,
                'txpackets':200,
                'txerrors':201,
                'txdrops':202
            }
          )
        ]
    }

def clusterModify( device,interfaces,configuration ):
    return {
        'state': 0,'faults': [],'health': []
        }

def clusterAudit( device,interfaces,configuration ):
    return {
        'state': 0,'faults': [],'health': []
        }

#
# FunctionGroup API
#

def serviceModify( device,configuration ):
    return {
        'state': 0,'faults': [],'health': []
       }

def serviceAudit( device,configuration ):
    return {
        'state': 0,'faults': [],'health': []
        }

def serviceHealth( device,configuration ):
    return {
        'state': 0,'faults': [],'health': []
        }

def serviceCounters( device,configuration ):
    externalIntferface, = [(0, 'Firewall', 4384), (1, '', 4432), (3, 'Firewall-Func', 'FW-1'),
        (2, 'external', 'external1') ]
    internalInterface = [(0, 'Firewall', 4384) (1, '', 4432) (3, 'Firewall-Func', 'FW-1'),
        (2, 'internal','internal1') ]
    Firewall-1-External-Counters = (externalInterface,
        { 'rxpackets': 100,
            'rxerrors': 0,
            'rxdrops': 0
            'txpackets': 100
            'txerrors': 4
            'txdrops': 2} )
    Firewall-1-Internal-Counters = (internalInterface,
        { 'rxpackets': 100,
            'rxerrors': 0,
            'rxdrops': 0
            'txpackets': 100
            'txerrors': 4
            'txdrops': 2} )
    Counters = [ Firewall-1-External-Counters, Firewall-1-Internal-Counters ]
        return {
            'state': 0,
            'counters': Counters
        }

#
# EndPoint/Network API
#

def attachEndpoint( device,
                    configuration,
                    endpoints ):
    return {
        'state': 0,
        'faults': [],
        'health': [],
        }

def detachEndpoint( device,
                    configuration,
                    endpoints ):
    return {
        'state': 0,
        'faults': [],
        'health': [],
        }

def attachNetwork( device,
                   configuration,
                   networks ):
    return {
        'state': 0,
        'faults': [],
        'health': [],
        }

def detachNetwork( device,
                   configuration,
                   networks ):
    return {
        'state': 0,
        'faults': [],
        'health': [],
        }
次に示すのは呼び出し例です。
Function: deviceValidate  
                                                                                    
Arguments:

(
  {
    'creds':
      {
        'password': 'admin','username': 'admin'
      },
      'host': '10.30.13.153','port': 443
  }
  u'1.0'
)

Function: deviceAudit

Arguments:

(
  {
    'host': '10.30.13.153','port': 443,'creds':
      {
        'username': 'admin','password': 'admin'
      }
  },
  {
    (11,'','1_1'): {
      'state': 0,'label': 'int'
    },(11,'','1_2'): {
      'state': 0,'label': 'ext'
    },(11,'','1_3'): {
      'state': 0,'label': 'mgmt'
    }
  },
  {
    (4,'HighAvailabilityCfg','HA'): {
      'state': 2,'value': {
        (5,'peerIP','peerip'): {
          'state': 2,'value': '10.30.13.154'
        }
      }
    }
  }
)

Function: clusterAudit

Arguments:

(
  {
    'name': 'Cluster1',
    'virtual': False,
    'devs': {
      'SampleDevice1': {
        'host': '10.30.13.153',
        'port': 443,
        'creds': {
          'username': 'admin',
          'password': 'admin'
        }
      }
    },
    'host': '10.30.13.153',
    'port': 443,
    'creds': {
      'username': 'admin',
      'password': 'admin'
    }
  },
  {
    (12, '', 'internal'): {
      'state': 0,
      'label': 'int'
    },
    (12, '', 'external'): {
      'state': 0,
      'label': 'ext'
    }
  },
  {
    (4,'SyslogConfig','syslogconfig'): {
      'state': 2,
      'value': {
        (5,'ipaddress','syslogip'): {
          'state': 2,
          'value': '10.168.62.100'
        }
      }
    },
    (4,'NTPConfig','ntpconfig'): {
      'state': 2,
      'value': {
        (5,'ipaddress','syslogip'): {
          'state': 2,
          'value': '10.168.62.1'
        }
      }
    }
  }
)

Function: clusterModify

Arguments:

(
  {
    'name': 'Cluster1',
    'virtual': False,
    'devs': {
      'SampleDevice1': {
        'host': '10.30.13.153',
        'port': 443,
        'creds': {
          'username': 'admin',
          'password': 'admin'
        }
      }
    },
    'host': '10.30.13.153',
    'port': 443,
    'creds': {
      'username': 'admin',
      'password': 'admin'
    }
  },
  {
    (12, '', 'internal'): {
      'state': 0,
      'label': 'int'
    },
    (12, '', 'external'): {
      'state': 0,
      'label': 'ext'
    }
  },
  {
    (4,'SyslogConfig','syslogconfig'): {
      'state': 2,
      'value': {
        (5,'ipaddress','syslogip'): {
          'state': 2,
          'value': '10.168.62.100'
        }
      }
    },
    (4,'NTPConfig','ntpconfig'): {
      'state': 2,
      'value': {
        (5,'ipaddress','syslogip'): {
          'state': 2,
          'value': '10.168.62.1'
        }
      }
    }
  }
)

Function: serviceModify

Arguments:

{
  'creds': {
    'password': 'admin',
    'username': 'admin'
  },
  'devs': {
    'SampleDevice1': {
      'creds': {
        'password': 'admin',
        'username': 'admin'
      },
      'host': '10.30.13.153',
      'port': 443
    }
  },
  'host': '10.30.13.153',
  'name': 'Cluster1',
  'port': 443,
  'virtual': False
}
{
  (0,'',4304): {
    'state': 1,
    'transaction': 10000,
    'value': {
      (1,'',4368): {
        'state': 1,
        'transaction': 10000,
        'value': {
          (3,'SLB','SLB'): {
            'state': 1,
            'transaction': 10000,
            'value': {
              (2,'external','external'): {
                'state': 1,
                'transaction': 10000,
                'value': {
                  (9,'','Cluster1_external_40962'): {
                    'state': 2,
                    'target': 'Cluster1_external_40962',
                    'transaction': 10000
                  }
                }
              },
              (2,'internal','internal'): {
                'state': 1,
                'transaction': 10000,
                'value': {
                  (9,'','Cluster1_internal_57862'): {
                    'state': 2,
                    'target': 'Cluster1_internal_57862',
                    'transaction': 10000
                  }
                }
              },
              (4,'VServer','webVServer'): {
                'state': 1,
                'transaction': 10000,
                'value': {
                  (4,'VServerGlobalConfig','VServerGlobalConfig'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': {
                      (6,'ServerConfig','serverConfig'): {
                        'state': 1,
                        'target': 'webserver1',
                        'transaction': 10000
                      },
                      (6,'ServiceConfig','serviceConfig'): {
                        'state': 1,
                        'target': 'webservice',
                        'transaction': 10000
                      },
                      (6,'VipConfig','vipConfig'): {
                        'state': 1,
                        'target': 'webnetwork/webvip',
                        'transaction': 10000
                      }
                    }
                  },
                  (5,'port','port'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': '80'
                  },
                  (5,'servicename','servicename'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': 'webservice'
                  },
                  (5,'servicetype','servicetype'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': 'tcp'
                  },
                  (5,'vservername','vservername'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': 'webvserver'
                  }
                }
              }
            }
          }
        }
      },
      (4,'Network','webnetwork'): {
        'state': 1,
        'transaction': 10000,
        'value': {
          (4,'vip','webvip'): {
            'state': 1,
            'transaction': 10000,
            'value': {
              (5,'netmask','webnetmask'): {
                'state': 1,
                'transaction': 10000,
                'value': '255.255.255.255'
              },
              (5,'vipaddress','webvipaddress'): {
                'state': 1,
                'transaction': 10000,
                'value': '10.0.0.100'
              }
            }
          }
        }
      },
      (4,'Server','webserver1'): {
        'state': 1,
        'transaction': 10000,
        'value': {
          (5,'ipaddress','ipaddress'): {
            'state': 1,
            'transaction': 10000,
            'value': '192.168.100.2'
          },
          (5,'servername','servername'): {
            'state': 1,
            'transaction': 10000,
            'value': 'webserver1'
          }
        }
      },
      (4,'Service','webservice'): {
        'state': 1,
        'transaction': 10000,
        'value': {
          (5,'servicename','servicename'): {
            'state': 1,
            'transaction': 10000,
            'value': 'webservice'
          },
          (5,'serviceport','serviceport'): {
            'state': 1,
            'transaction': 10000,
            'value': '9080'},
          (5,'servicetype','servicetype'): {
            'state': 1,
            'transaction': 10000,
            'value': 'tcp'
          }
        }
      },
      (7,'','40962'): {
        'state': 1,
        'tag': 235,
        'transaction': 10000,
        'type': 1
      },
      (7,'','57862'): {
        'state': 1,
        'tag': 201,
        'transaction': 10000,
        'type': 1
      },
      (8,'','Cluster1_external_40962'): {
        'encap': '40962',
        'state': 1,
        'transaction': 10000,
        'vif': 'Cluster1_external'
      },
      (8,'','Cluster1_internal_57862'): {
        'encap': '57862',
        'state': 1,
        'transaction': 10000,
        'vif': 'Cluster1_internal'
      },
      (10,'','Cluster1_external'): {
        'cifs': {
          'SampleDevice1': '1_2'
        },
        'state': 1,
        'transaction': 10000
      },
      (10,'','Cluster1_internal'): {
        'cifs': {
          'SampleDevice1': '1_1'
        },
        'state': 1,'transaction': 10000
      }
    }
  }
}

Function: attachEndpoint

Arguments:

{
   'creds': {
     'password': 'admin',
     'username': 'admin'
   },
   'devs': {
      'SampleDevice1': {
         'creds': {
             'password': 'admin',
             'username': 'admin'
          },
         'host': '10.30.13.153',
         'port': 443
      }
   },
   'host': '10.30.13.153',
   'name': 'Cluster1',
   'port': 443,
   'virtual': False
}
{
(0,'',4304): {
  'state': 1,
  'transaction': 10000,
  'value': {
    (1,'',4368): {
      'state': 1,
      'transaction': 10000,
      'value': {
      (3,'SLB','SLB'): {
        'state': 1,
        'transaction': 10000,
        'value': {
           (2,'external','external'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                (9,'','Cluster1_external_40962'): {
                  'state': 2,
                  'target': 'Cluster1_external_40962',
                  'transaction': 10000
                }
             }
           },
           (2,'internal','internal'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                (9,'','Cluster1_internal_57862'): {
                  'state': 2,
                  'target': 'Cluster1_internal_57862',
                  'transaction': 10000
                }
             }
           },
           (4,'VServer','webVServer'): {
               'state': 1,
               'transaction': 10000,
               'value': {
                   (4,'VServerGlobalConfig','VServerGlobalConfig'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': {
                          (6,'ServerConfig','serverConfig'): {
                             'state': 1,
                             'target': 'webserver1',
                             'transaction': 10000
                          },
                          (6,'ServiceConfig','serviceConfig'): {
                             'state': 1,
                             'target': 'webservice',
                             'transaction': 10000
                          },
                          (6,'VipConfig','vipConfig'): {
                             'state': 1,
                             'target': 'webnetwork/webvip',
                             'transaction': 10000
                          }
                      }
                   },
                   (5,'port','port'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': '80'
                   },
                   (5,'servicename','servicename'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'webservice'
                   },
                   (5,'servicetype','servicetype'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'tcp'
                   },
                   (5,'vservername','vservername'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'webvserver'
                   }
                }
             }
           }
         }
       }
    },
    (4,'Network','webnetwork'): {
       'state': 1,
       'transaction': 10000,
       'value': {
          (4,'vip','webvip'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                 (5,'netmask','webnetmask'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': '255.255.255.255'
                 },
                 (5,'vipaddress','webvipaddress'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': '10.0.0.100'
                 }
             }
          }
       }
    },
    (4,'Server','webserver1'): {
        'state': 1,
        'transaction': 10000,
        'value': {
            (5,'ipaddress','ipaddress'): {
               'state': 1,
               'transaction': 10000,
               'value': '192.168.100.2'
            },
            (5,'servername','servername'): {
               'state': 1,
               'transaction': 10000,
               'value': 'webserver1'
            }
        }
    },
    (4,'Service','webservice'): {
        'state': 1,
        'transaction': 10000,
        'value': {
           (5,'servicename','servicename'): {
              'state': 1,
              'transaction': 10000,
              'value': 'webservice'
           },
           (5,'serviceport','serviceport'): {
              'state': 1,
              'transaction': 10000,
              'value': '9080'},
           (5,'servicetype','servicetype'): {
              'state': 1,
              'transaction': 10000,
              'value': 'tcp'
           }
        }
    },
    (7,'','40962'): {
       'state': 1,
       'tag': 235,
       'transaction': 10000,
       'type': 1
    },
    (7,'','57862'): {
        'state': 1,
        'tag': 201,
        'transaction': 10000,
        'type': 1
    },
    (8,'','Cluster1_external_40962'): {
         'encap': '40962',
         'state': 1,
         'transaction': 10000,
         'vif': 'Cluster1_external'
    },
    (8,'','Cluster1_internal_57862'): {
         'encap': '57862',
         'state': 1,
         'transaction': 10000,
         'vif': 'Cluster1_internal'
    },
    (10,'','Cluster1_external'): {
        'cifs': {
            'SampleDevice1': '1_2'
         },
        'state': 1,
        'transaction': 10000
    },
    (10,'','Cluster1_internal'): {
        'cifs': {
            'SampleDevice1': '1_1'
         },
        'state': 1,
        'transaction': 10000
    }
  }
}
}
{ 
   'addr': '10.0.0.3', 
   'conn': 'external'
}

API 呼び出しのエンドポイント ディクショナリには、次の属性が含まれます。

  • 'addr':EPG に接続するエンドポイントの IP アドレス。
  • 'conn':他の機能ノードを通じて EPG が直接または間接的に接続されたコネクタ。
Function: attachEndpoint
Arguments:
{
   'creds': {
     'password': 'admin',
     'username': 'admin'
   },
   'devs': {
      'SampleDevice1': {
         'creds': {
             'password': 'admin',
             'username': 'admin'
          },
         'host': '10.30.13.153',
         'port': 443
      }
   },
   'host': '10.30.13.153',
   'name': 'Cluster1',
   'port': 443,
   'virtual': False
}
{
(0,'',4304): {
  'state': 1,
  'transaction': 10000,
  'value': {
    (1,'',4368): {
      'state': 1,
      'transaction': 10000,
      'value': {
      (3,'SLB','SLB'): {
        'state': 1,
        'transaction': 10000,
        'value': {
           (2,'external','external'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                (9,'','Cluster1_external_40962'): {
                  'state': 2,
                  'target': 'Cluster1_external_40962',
                  'transaction': 10000
                }
             }
           },
           (2,'internal','internal'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                (9,'','Cluster1_internal_57862'): {
                  'state': 2,
                  'target': 'Cluster1_internal_57862',
                  'transaction': 10000
                }
             }
           },
           (4,'VServer','webVServer'): {
               'state': 1,
               'transaction': 10000,
               'value': {
                   (4,'VServerGlobalConfig','VServerGlobalConfig'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': {
                          (6,'ServerConfig','serverConfig'): {
                             'state': 1,
                             'target': 'webserver1',
                             'transaction': 10000
                          },
                          (6,'ServiceConfig','serviceConfig'): {
                             'state': 1,
                             'target': 'webservice',
                             'transaction': 10000
                          },
                          (6,'VipConfig','vipConfig'): {
                             'state': 1,
                             'target': 'webnetwork/webvip',
                             'transaction': 10000
                          }
                      }
                   },
                   (5,'port','port'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': '80'
                   },
                   (5,'servicename','servicename'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'webservice'
                   },
                   (5,'servicetype','servicetype'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'tcp'
                   },
                   (5,'vservername','vservername'): {
                      'state': 1,
                      'transaction': 10000,
                      'value': 'webvserver'
                   }
                }
             }
           }
         }
       }
    },
    (4,'Network','webnetwork'): {
       'state': 1,
       'transaction': 10000,
       'value': {
          (4,'vip','webvip'): {
             'state': 1,
             'transaction': 10000,
             'value': {
                 (5,'netmask','webnetmask'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': '255.255.255.255'
                 },
                 (5,'vipaddress','webvipaddress'): {
                    'state': 1,
                    'transaction': 10000,
                    'value': '10.0.0.100'
                 }
             }
          }
       }
    },
    (4,'Server','webserver1'): {
        'state': 1,
        'transaction': 10000,
        'value': {
            (5,'ipaddress','ipaddress'): {
               'state': 1,
               'transaction': 10000,
               'value': '192.168.100.2'
            },
            (5,'servername','servername'): {
               'state': 1,
               'transaction': 10000,
               'value': 'webserver1'
            }
        }
    },
    (4,'Service','webservice'): {
        'state': 1,
        'transaction': 10000,
        'value': {
           (5,'servicename','servicename'): {
              'state': 1,
              'transaction': 10000,
              'value': 'webservice'
           },
           (5,'serviceport','serviceport'): {
              'state': 1,
              'transaction': 10000,
              'value': '9080'},
           (5,'servicetype','servicetype'): {
              'state': 1,
              'transaction': 10000,
              'value': 'tcp'
           }
        }
    },
    (7,'','40962'): {
       'state': 1,
       'tag': 235,
       'transaction': 10000,
       'type': 1
    },
    (7,'','57862'): {
        'state': 1,
        'tag': 201,
        'transaction': 10000,
        'type': 1
    },
    (8,'','Cluster1_external_40962'): {
         'encap': '40962',
         'state': 1,
         'transaction': 10000,
         'vif': 'Cluster1_external'
    },
    (8,'','Cluster1_internal_57862'): {
         'encap': '57862',
         'state': 1,
         'transaction': 10000,
         'vif': 'Cluster1_internal'
    },
    (10,'','Cluster1_external'): {
        'cifs': {
            'SampleDevice1': '1_2'
         },
        'state': 1,
        'transaction': 10000
    },
    (10,'','Cluster1_internal'): {
        'cifs': {
            'SampleDevice1': '1_1'
         },
        'state': 1,
        'transaction': 10000
    }
  }
}
}
{ 
   'addr': '10.0.0.0/24', 
   'conn': 'external'
}

API 呼び出しのエンドポイント ディクショナリには、次の属性が含まれます。

  • 'addr':EPG に接続するエンドポイントの IP アドレス。
  • 'conn':他の機能ノードを通じて EPG が直接または間接的に接続されたコネクタ。