pyATS/Genie: インストールとアップグレードのお話

(この記事はネットワーク自動化 Advent Calendar 2019 13日目として書いています)

Calendar page for Qiita Advent Calendar 2019 regarding ネットワーク自動化.

pyATS/Genie のインストール方法を以前ブログに書いたが、新しいインストール方法のオプションや注意点があるので、それを今回紹介します。

従来のインストール方法

pyATSのみ

(pyats)$ pip install pyats

pyATS + Genie

(pyats)$ pip install pyats genie
OR
(pyats)$ pip install genie

Genie は pyATS に依存しているため、genie をインストールする場合には pyATS もインストールされるため、pyats は指定しなくても良い。

pyATS + Genie + Robot

(pyats)$ pip install pyats genie genie.libs.robot
OR
(pyats)$ pip install genie genie.libs.robot

イマドキなインストール方法

pip install 時に [] で指定することによりインストールするパッケージ群を指定できるようになりました。

pip install pyats

コアフレームワークだけのインストール。pyATS と Unicon のみ。

(pyats)$ pip install pyats
(snip)
(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
pyats                19.11
pyats.aereport       19.11
pyats.aetest         19.11
pyats.async          19.11
pyats.connections    19.11
pyats.datastructures 19.11
pyats.easypy         19.11.1
pyats.kleenex        19.11
pyats.log            19.11
pyats.reporter       19.11
pyats.results        19.11
pyats.tcl            19.11
pyats.topology       19.11
pyats.utils          19.11
unicon               19.11
unicon.plugins       19.11.1

pip install pyats[library]

pyATS + Unicon + Genie (でも genie.libs.robot は含まれない)

(pyats)$ pip install pyats[library]
(snip)
(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie                        19.11
genie.abstract               19.11
genie.conf                   19.11
genie.harness                19.11
genie.libs.conf              19.11
genie.libs.filetransferutils 19.11
genie.libs.ops               19.11
genie.libs.parser            19.11
genie.libs.sdk               19.11
genie.libs.telemetry         19.11
genie.metaparser             19.11
genie.ops                    19.11
genie.parsergen              19.11
genie.predcore               19.11
genie.telemetry              19.11
genie.trafficgen             19.11
genie.utils                  19.11
pyats                        19.11
pyats.aereport               19.11
pyats.aetest                 19.11
pyats.async                  19.11
pyats.connections            19.11
pyats.datastructures         19.11
pyats.easypy                 19.11.1
pyats.kleenex                19.11
pyats.log                    19.11
pyats.reporter               19.11
pyats.results                19.11
pyats.tcl                    19.11
pyats.topology               19.11
pyats.utils                  19.11
unicon                       19.11
unicon.plugins               19.11.1

NOTE: [] はシェルの環境によってはエスケープするかパッケージ名をクォーツで囲む必要がある場合があります

(pyats)$ pip install pyats\[library\]
OR
(pyats)$ pip install 'pyats[library]'

pip install pyats[robot]

pyATS + Robot FrameworkGenie はインストールされないので注意。

(pyats)$ pip install pyats[robot]
(snip)
(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie.libs.robot     19.11
pyats                19.11
pyats.aereport       19.11
pyats.aetest         19.11
pyats.async          19.11
pyats.connections    19.11
pyats.datastructures 19.11
pyats.easypy         19.11.1
pyats.kleenex        19.11
pyats.log            19.11
pyats.reporter       19.11
pyats.results        19.11
pyats.robot          19.11
pyats.tcl            19.11
pyats.topology       19.11
pyats.utils          19.11
unicon               19.11
unicon.plugins       19.11.1

pip install pyats[full]

pyATS + Genie + Robot FrameworkGenie も使うならこれ。
ただし、REST(rest.connector) や Netconf(yang.connector) を使うコネクタは含まれない。

(pyats)$ pip install pyats[full]
(snip)
(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie                        19.11
genie.abstract               19.11
genie.conf                   19.11
genie.harness                19.11
genie.libs.conf              19.11
genie.libs.filetransferutils 19.11
genie.libs.ops               19.11
genie.libs.parser            19.11
genie.libs.robot             19.11
genie.libs.sdk               19.11
genie.libs.telemetry         19.11
genie.metaparser             19.11
genie.ops                    19.11
genie.parsergen              19.11
genie.predcore               19.11
genie.telemetry              19.11
genie.trafficgen             19.11
genie.utils                  19.11
pyats                        19.11
pyats.aereport               19.11
pyats.aetest                 19.11
pyats.async                  19.11
pyats.connections            19.11
pyats.datastructures         19.11
pyats.easypy                 19.11.1
pyats.kleenex                19.11
pyats.log                    19.11
pyats.reporter               19.11
pyats.results                19.11
pyats.robot                  19.11
pyats.tcl                    19.11
pyats.topology               19.11
pyats.utils                  19.11
unicon                       19.11
unicon.plugins               19.11.1

本当の全部入りはコレだ!(個人的オススメ)

REST も使いたいし、Netconf も pyATS/Genie でやりたい!という方がパッケージ漏れがないようにするには、下記が全部入りです。

(pyats)$ pip install pyats[full] rest.connector yang.connector
(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie                        19.11
genie.abstract               19.11
genie.conf                   19.11
genie.harness                19.11
genie.libs.conf              19.11
genie.libs.filetransferutils 19.11
genie.libs.ops               19.11
genie.libs.parser            19.11
genie.libs.robot             19.11
genie.libs.sdk               19.11
genie.libs.telemetry         19.11
genie.metaparser             19.11
genie.ops                    19.11
genie.parsergen              19.11
genie.predcore               19.11
genie.telemetry              19.11
genie.trafficgen             19.11
genie.utils                  19.11
pyats                        19.11
pyats.aereport               19.11
pyats.aetest                 19.11
pyats.async                  19.11
pyats.connections            19.11
pyats.datastructures         19.11
pyats.easypy                 19.11.1
pyats.kleenex                19.11
pyats.log                    19.11
pyats.reporter               19.11
pyats.results                19.11
pyats.robot                  19.11
pyats.tcl                    19.11
pyats.topology               19.11
pyats.utils                  19.11
rest.connector               19.8.1
unicon                       19.11
unicon.plugins               19.11.1
yang.connector               19.7

pyATS/Genie は毎月リリース

現在 pyATS/Genie パッケージはマンスリーリリースになっており、バージョンからいつリリースされたかが分かるようなっています。

(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie                        19.11
genie.abstract               19.11
genie.conf                   19.11
(snip)

19.11 は 19 -> 2019 年、11 -> 11月となっており、月末リリースとなるため、
本日12 月7日(執筆時)ですが、11月末にリリースされた 19.11 が最新となります。

そのため、毎月全てのパッケージのバージョンが上がります。19.9 -> 19.10 -> 19.11 -> 19.12。但し例外もあり、rest.connector や yang.connector などは変更があった場合のみのバージョンアップとなっています。そのため、genie.xxx, pyats.xxx, unicon.xxx が原則バージョン番号が毎月上がると覚えておくといいかと思います。

pyats version : 最新バージョンの確認

pyats version コマンドで現在のバージョンと最新バージョンを確認できます。
最新バージョンを確認するには –outdated オプションを付け、genie/unicon/rest.connector/yang.connectorもチェックするように–includeも追加。(defaultだとpyats.xxxしかチェックされない)

(pyats)$ pyats version --outdated --include genie unicon rest yang
You are currently running pyATS version: 19.10
Python: 3.7.3 [64bit]

Checking for outdated packages...

  Package                      Version Latest
  ---------------------------- ------- -------
  genie                        19.10   19.11
  genie.abstract               19.10   19.11
  genie.conf                   19.10   19.11
  genie.harness                19.10   19.11
  genie.libs.conf              19.10   19.11
  genie.libs.filetransferutils 19.10   19.11
  genie.libs.ops               19.10.1 19.11
  genie.libs.parser            19.10   19.11
  genie.libs.robot             19.10   19.11
  genie.libs.sdk               19.10   19.11
  genie.libs.telemetry         19.10   19.11
  genie.metaparser             19.10   19.11
  genie.ops                    19.10.1 19.11
  genie.parsergen              19.10   19.11
  genie.predcore               19.10   19.11
  genie.telemetry              19.10   19.11
  genie.trafficgen             19.10   19.11
  genie.utils                  19.10   19.11
  pyats                        19.10   19.11
  pyats.aereport               19.10   19.11
  pyats.aetest                 19.10.2 19.11
  pyats.async                  19.10   19.11
  pyats.connections            19.10   19.11
  pyats.datastructures         19.10   19.11
  pyats.easypy                 19.10.1 19.11.1
  pyats.kleenex                19.10   19.11
  pyats.log                    19.10.1 19.11
  pyats.reporter               19.10.1 19.11
  pyats.results                19.10   19.11
  pyats.robot                  19.10   19.11
  pyats.tcl                    19.10   19.11
  pyats.topology               19.10   19.11
  pyats.utils                  19.10   19.11
  rest.connector               19.8.1
  unicon                       19.10   19.11
  yang.connector               19.7

Note - you can upgrade outdated packages with:
    pip install --upgrade genie genie.abstract genie.conf
    pip install --upgrade genie.harness genie.libs.conf genie.libs.filetransferutils
    pip install --upgrade genie.libs.ops genie.libs.parser genie.libs.robot
    pip install --upgrade genie.libs.sdk genie.libs.telemetry genie.metaparser
    pip install --upgrade genie.ops genie.parsergen genie.predcore
    pip install --upgrade genie.telemetry genie.trafficgen genie.utils
    pip install --upgrade pyats pyats.aereport pyats.aetest
    pip install --upgrade pyats.async pyats.connections pyats.datastructures
    pip install --upgrade pyats.easypy pyats.kleenex pyats.log
    pip install --upgrade pyats.reporter pyats.results pyats.robot
    pip install --upgrade pyats.tcl pyats.topology pyats.utils
    pip install --upgrade unicon

上記は現在使っているバージョンが 19.10 場合の例。最新バージョンとして latest の項目に 19.11 と表示され、最後には Note としてどうやって最新バージョンへアップグレードするかの方法が記載されています。

しかし、上記の提案は特定のモジュールのみが古いことを想定しているため、個別のパッケージをそれぞれ指定してアップグレードする形になっています。が、この方法が手間はかかりますが、確実な方法ではあります。

重要: Unicon v19.10 -> v19.11 要再インストール

Unicon は v19.11 でプラグインがオープンソースになり、unicon/unicon.plugins という2つのパッケージに分割されました。その分割が pip の不具合と思われる状況にヒットしてしまい、正常にインストールされません。

(pyats)$ pyats version --outdated --include genie unicon rest yang
Traceback (most recent call last):
  File "/Users/ccieojisan/.pyenv/versions/pyats6/bin/pyats", line 8, in <module>
    sys.exit(main())
  File "src/pyats/cli/__main__.py", line 29, in pyats.cli.__main__.main
  File "src/pyats/cli/core.py", line 38, in pyats.cli.core.CLI.__init__
  File "src/pyats/cli/core.py", line 79, in pyats.cli.core.CLI.load_commands
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2411, in load
    return self.resolve()
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "src/genie/cli/commands/diff.py", line 18, in init genie.cli.commands.diff
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/genie/conf/__init__.py", line 19, in <module>
    from .main import Genie
  File "src/genie/conf/main.py", line 4, in init genie.conf.main
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/genie/conf/base/__init__.py", line 4, in <module>
    from .device import Device
  File "src/genie/conf/base/device.py", line 11, in init genie.conf.base.device
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/genie/libs/parser/__init__.py", line 16, in <module>
    from .base import tcl_invoke_ats_cmd,\
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/genie/libs/parser/base.py", line 17, in <module>
    from genie.metaparser import MetaParser
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/genie/metaparser/__init__.py", line 7, in <module>
    from ._metaparser import *
  File "src/genie/metaparser/_metaparser.py", line 11, in init genie.metaparser._metaparser
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/unicon/__init__.py", line 10, in <module>
    from unicon.core.pluginmanager import PluginManager
  File "src/unicon/core/pluginmanager.py", line 18, in init unicon.core.pluginmanager
ImportError: cannot import name supported_chassis

そのため、下記 uninstall & install が必要となります。

(pyats)$ pip uninstall unicon unicon.plugins -y
(pyats)$ pip install unicon

Unicon を再インストールしたら、全て最新になり最後に “All your packages are up to date!” と表示されていたら全て最新になっている状態です。

(pyats)$ pyats version --outdated --include genie unicon rest yang
You are currently running pyATS version: 19.11
Python: 3.7.3 [64bit]

Checking for outdated packages...

  Package                      Version Latest
  ---------------------------- ------- ------
  genie                        19.11
  genie.abstract               19.11
  genie.conf                   19.11
  genie.harness                19.11
  genie.libs.conf              19.11
  genie.libs.filetransferutils 19.11
  genie.libs.ops               19.11
  genie.libs.parser            19.11
  genie.libs.robot             19.11
  genie.libs.sdk               19.11
  genie.libs.telemetry         19.11
  genie.metaparser             19.11
  genie.ops                    19.11
  genie.parsergen              19.11
  genie.predcore               19.11
  genie.telemetry              19.11
  genie.trafficgen             19.11
  genie.utils                  19.11
  pyats                        19.11
  pyats.aereport               19.11
  pyats.aetest                 19.11
  pyats.async                  19.11
  pyats.connections            19.11
  pyats.datastructures         19.11
  pyats.easypy                 19.11.1
  pyats.kleenex                19.11
  pyats.log                    19.11
  pyats.reporter               19.11
  pyats.results                19.11
  pyats.robot                  19.11
  pyats.tcl                    19.11
  pyats.topology               19.11
  pyats.utils                  19.11
  rest.connector               19.8.1
  unicon                       19.11
  unicon.plugins               19.11.1
  yang.connector               19.7

All your packages are up to date!

推奨は全て同じバージョン&最新

pyATS/Genie は毎月リリースで新機能も追加されています。そのため、最新と過去のバージョンが混在すると正常に動作しない場合があります。そのため、推奨は全て同じバージョン&最新です。同じバージョンとは同じ月バージョンです。19.11.xx など。

余計なトラシューを避けるため混在バージョンでは動かない

例えば、現在 19.10 を使用しておりパーサーの不具合に遭遇して genie.libs.parser をアップグレードするとします。

(pyats)$ pip install genie.libs.parser --upgrade
(snip)
Successfully installed genie.libs.parser-19.11

すると genie.libs.parser のみ 19.11 になってしまいます。

(pyats)$ pip list | egrep 'ats|genie|unicon|rest|yang'
genie                        19.10
genie.abstract               19.10
genie.conf                   19.10
genie.harness                19.10
genie.libs.conf              19.10
genie.libs.filetransferutils 19.10
genie.libs.ops               19.10.1
genie.libs.parser            19.11
genie.libs.robot             19.10
genie.libs.sdk               19.10
genie.libs.telemetry         19.10
genie.metaparser             19.10
genie.ops                    19.10.1
genie.parsergen              19.10
genie.predcore               19.10
genie.telemetry              19.10
genie.trafficgen             19.10
genie.utils                  19.10
pyats                        19.10
pyats.aereport               19.10
pyats.aetest                 19.10.2
pyats.async                  19.10
pyats.connections            19.10
pyats.datastructures         19.10
pyats.easypy                 19.10.1
pyats.kleenex                19.10
pyats.log                    19.10.1
pyats.reporter               19.10.1
pyats.results                19.10
pyats.robot                  19.10
pyats.tcl                    19.10
pyats.topology               19.10
pyats.utils                  19.10
rest.connector               19.8.1
unicon                       19.10
yang.connector               19.7

この状態ではバージョンチェックが失敗する結果になり正常に動きません。

(pyats)$ genie shell --testbed-file tb.yaml
Traceback (most recent call last):
  File "/Users/ccieojisan/.pyenv/versions/pyats6/bin/genie", line 8, in <module>
    sys.exit(main())
  File "src/genie/cli/__main__.py", line 31, in genie.cli.__main__.main
  File "src/pyats/cli/core.py", line 38, in pyats.cli.core.CLI.__init__
  File "src/pyats/cli/core.py", line 99, in genexpr
  File "src/pyats/cli/core.py", line 99, in genexpr
  File "src/pyats/cli/base.py", line 313, in pyats.cli.base.CommandWithSubcommands.__init__
  File "src/pyats/cli/base.py", line 317, in pyats.cli.base.CommandWithSubcommands.load_subcmds
  File "src/pyats/cli/base.py", line 121, in pyats.cli.base._BaseCommand.load_subcmds
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2410, in load
    self.require(*args, **kwargs)
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2433, in require
    items = working_set.resolve(reqs, env, installer, extras=self.extras)
  File "/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages/pkg_resources/__init__.py", line 791, in resolve
    raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.VersionConflict: (genie.libs.parser 19.11 (/Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages), Requirement.parse('genie.libs.parser<19.11.0,>=19.10.0'))

そのため、特定のパッケージのバージョンアップでメジャーリリース番号(月番号)が混在する状態になった場合には、下記コマンドで全体をアップグレードするようにしてください。

(pyats)$ pip install 'pyats[full]' --upgrade

おまけ: ベータパッケージ

GitHub Issues で不具合報告され臨時で修正した不具合などは月末のリリース前にベータパッケージとしてリリースされていたりします。

pipy のパッケージの画面に行きます。この場合は genie.libs.parser。左側の “Release history” をクリックします。

すると末尾に b<番号> が付いたパッケージがリリースされているのが見えます。これがベータパッケージです。

これは通常の pip install –upgrade ではインストールされず、–pre を追加で付ける必要があります。

(pyats)$ pip install genie.libs.parser --upgrade --pre
Collecting genie.libs.parser
  Downloading https://files.pythonhosted.org/packages/27/5c/13271bda161500da3780156703de79bff99d4a56de42dce83c1e56fe5651/genie.libs.parser-19.11.1b2-py3-none-any.whl (2.4MB)
     |████████████████████████████████| 2.4MB 438kB/s
Requirement already satisfied, skipping upgrade: xmltodict in /Users/ccieojisan/.pyenv/versions/3.7.3/envs/pyats6/lib/python3.7/site-packages (from genie.libs.parser) (0.12.0)
Installing collected packages: genie.libs.parser
  Found existing installation: genie.libs.parser 19.11
    Uninstalling genie.libs.parser-19.11:
      Successfully uninstalled genie.libs.parser-19.11
Successfully installed genie.libs.parser-19.11.1b2

もし不具合っぽい動作に遭遇した場合にはベータパッケージがあるか確認、試すというのもいいかもしれません。

genie.libs.xxx は外部からの貢献や報告が多いパッケージとなり、比較的ベータパッケージを見ることが多いため、下記でベータに上げるコマンドとしてメモしてもいいかもしれません。

(pyats)$ pip install genie.libs.parser genie.libs.conf genie.libs.ops genie.libs.sdk --upgrade --pre

まとめ

  • pip install pyats[xxx] でパッケージの組み合わせが指定できるようになった
  • pip install pyats[full] rest.connector yang.connector が全部入り!
  • pyATS/Genie は毎月末リリース
  • pyats version で現在のバージョンと最新バージョンが確認できる(バージョンアップの手順も教えてくれる)
  • 推奨は最新バージョンそして同じ月リリースの使用(異なる月のバージョン混在はエラーになります)
  • v19.10 -> v19.11 の Unicon は正常にアップグレードできない。要再インストール
  • ベータパッケージがリリースされていたりするので、不具合時にはベータパッケージを試してみるというのもあり

pyATS/Genie では python パッケージがたくさんある(分割されている)ので、チェックが少し大変ですが、上のような pyats version などのツールや推奨バージョンの使用などを理解していれば、特に問題になることはないかと思います。

スポンサーリンク