JunosPyezのテーブルとビュー

Nayan Gadre)(2020年9月12日)

これらはネットワーク自動化のためにJunospyezライブラリを使用します。 Junosは、カスタム構成データを設定および抽出するためのテーブルとビューを提供します。すべてのpyezコードとncclientは、Apache2.0ライセンスの下でオープンソースです

lib / jnpr / junos /のYamlファイルでテーブルとビューを定義しますリソース
user.yml 」などとそれに対応するローダーファイルを「 user.py

user.yml
user.py

user.py 」は、yamlファイルのテーブルとビューの定義をPythonのグローバル辞書要素に変換するために使用されます。ここで、 \_\_ file \_\_ は「 user.py “ファイル。次に、「 user.yml 」ファイル名に変換されます。 junospyezの loadyaml は、「 user.yml 」を辞書に追加して、 globals()辞書に追加します。

yamlのテーブルとビューの両方の定義Pythonでクラスに変換されます。 loadyaml はファクトリメソッドであり、 \_\_ all \_\_ pythonic宣言。 1行のスナップに見られるように、アイテム名とアイテムクラスの定義の辞書を提供します。

user.ymlファイルは2つのトップレベルキーに分割されます:“ UserTable “と “ UserView “なので、 loadyamlは、これらの名前の2つのクラスを返します。

user.ymlから変換された辞書

このディクショナリは FactoryLoader.load ( )クラスを生成するメソッド:

FactoryLoader()。load(yaml.load(open(path、“ r”)、Loader = yaml.FullLoader))

ファクトリーローダークラスの目的

辞書items()メソッドrキーと値のペアを含むタプルのリストを含むビューオブジェクトを返します。

ファクトリローダーが、提供されたテーブルとビュースキーマが構成用か操作用かを判断する方法は、スキーマに存在するキーを使用します。 。例:「 set 」および「 get “キーを使用すると、構成テーブルになり、
rpc “にすると、操作が行われます。テーブル、「コマンド」または「 title “、そのコマンドテーブル、“ item ”“

の紛らわしい組み合わせもありますid = “cb352886d2″>

view 」と「*」は、コマンドテーブルであるかどうかも示します。

user.yml 」は、「 set “を階層に設定します。したがって、 \_item\_cfgtables と UserTable キー。

これは、構成タイプのテーブルのテーブルクラスを生成するためのクラスビルダー関数です。

Tableクラスは、Viewクラスへの参照を保持しているため、テーブルセクションで定義されたビューがある場合は、 \_build\_view()メソッドを使用してそのビューのクラスを作成し、設定します。 「 view 」キーの値としてのクラス。

辞書 get()メソッド。キーが存在しない場合、デフォルト値を設定できます。 、ここでは「 view\_name 」キーがないため、 \_build\_view( view\_name )はクラスを作成し、そのクラスを値として view\_name キー。また、グループ、評価、フィールドを抽出し、それらをビューオブジェクトの内部フィールドに格納します。

最初に、コンテナ CFGTABLE \_CFGTBL
\_CFGTBL = FactoryCfgTable

Pythonでは「 type 」メソッドを使用して動的クラスまたはタイプを作成します。
type “は既存のオブジェクトに渡され、そのタイプを返します。ただし、「 type 」に3つの引数が渡された場合、「 クラス名 “、” ベースタプル 」、「 dict 」次に新しいクラスを返します。 「 vars 」メソッドもあります。このメソッドは \_\_ dict \_\_ 属性。オブジェクトの書き込み可能な属性を格納します。 Pythonは、メタクラスを使用して他のクラスを作成します。

新しいクラスが継承するクラスの名前を単一のタプルとして渡すことができます。例: new\_cls = type(table\_name、(CfgTable、)、{})

If“ set ”キーワードがテーブルセクションの下にあります:
例:set: system / login / user
したがって、config基本クラスも渡してUserTableクラスを作成する必要があります。
例: new\_cls = type(table\_name、(CfgTable、Config)、{})

クラスに自動的に入力されるフィールド

クラスが1回が作成されたら、factoryLoaderクラスのカタログに追加します: self.catalog [table\_name] = cls

次に、ビュークラスの構築に移ります。

view\_name = tbl\_dict [“ view”]
tbl\_dict [“ view”] = self.catalog.get(view\_name、self.\_build\_view(view\_name))

view\_name < 「 user.yml 」ファイルで定義されている/ div>は「」です。 userView 」。

最後に、「 load 」は、 FactoryLoader クラスによって作成されたクラスのカタログを返します。

パスの要約:

これで、ymlがクラスに変換されて操作に使用できる部分が1つ完了しました。次に、UserTableクラスのオブジェクトを作成することから始めます。

user\_table = UserTable(dev)

新しく作成された UserTable CfgTable およびConfig基本クラスでは、これらの基本クラスで定義されているコンストラクターとすべてのメソッドを継承します。新しい UserTable オブジェクトを作成するとすぐに、 \_\_ init \_\_ 。 ymlファイルには「 set 」と記載されているため、configのコンストラクターも呼び出します。基本クラス。

この後、 get ()メソッドで system / login / user 階層。
最初に namesonly = false オプションを確認します。

xpath式の階層は set:system / login / user 「user.yml」ステートメント。関数\_build\_xmlはそれをに変換します。以下のようなXML:

ユーザーが「 namekey 」と呼ばれる特定のユーザー名を指定した場合は、上記で生成されたxmlにそれを挿入します。例:get(user =” regress”)は、値がregressのname要素を挿入します:

regress

すべてがget\_cmdにパックされ、self.RPC.get\_config(get\_cmd)に送信されます
一般的なXML- RPCは次のようになります。

XMLの形式RPCメソッド呼び出しXML

ユーザー情報を取得するためのXMLは次のようになります:

このXML-RPCはHTTPPOSTリクエストに変換され、サーバーに送信されます。XMLRPCを実行し、結果をXMLまたはネイティブpythonとして返します

実際のrpc呼び出しはncclientのrpcメソッドを介して行われますデータが暗号化されるようにsshを介して。

RPCの処理 rpc\_cmd\_e はです。 sshを介したnetconfの実装を提供するncclientによって行われます。 ncclientパッケージのManager()オブジェクトのrpcメソッドが実際にどこで定義されているかを理解するのが難しくなります。 ncclientライブラリを調べたところ、「rpc」= ExecuteRpc であり、この辞書はベンダー固有です。 詳細はここをクリック

この名前辞書の操作全体は、ベンダーに基づいて接続要求ごとに作成され、返されます。

Junosデバイスのsshtoonetconfサーバーを介して送信された最終的なXMLRPC

簡単netconfセッションの開始と交換の概要:

クライアントはポート 830 overssh。サーバーは HELLO メッセージをすぐに送信する必要があり、クライアントも同じことを行う必要があります。 < hello >メッセージ全体で、クライアントとサーバーの機能を指定します。次に、サーバーは< rpc >リクエストの処理を待機し、< rpc-reply >。クライアントは、必要な数のXML属性を< rpc >要素に追加できます。サーバーは、これらすべての属性を< rpc-reply >要素で返します。

応答は、 ok >および rpc-error >タグはエラーがない/ないことを示します。次に、デバイス/ベンダーに依存する形式に変換され、名前空間タグなどが削除されます。

最終的に次のように応答が受信されます:

[( regress、[( user、 regress)、( uid、 928)、( class\_name、 superuser)、( password、 abc123 @# $#$ ^)])]