Skip to content

memo#

from pyats import aetest
from pyats.topology import loader

# テストケースを作成
class MyTestcase(aetest.Testcase):
    @aetest.setup
    def setup(self, testbed):
        # テストベッドの読み込み
        tb = loader.load(testbed)

        # デバイスへの接続
        self.parameters["devices"] = {}  # devicesキーを追加

        for device_name, device in tb.devices.items():
            device.connect(learn_hostname=True)
            self.parameters["devices"][device_name] = device

    @aetest.test
    def show_run_test(self):
        # デバイスの情報を表示
        for device_name, device in self.parameters["devices"].items():
            # show runコマンドを実行
            output = device.execute("show run")

            # 結果を表示
            print(f"--- Configuration on {device_name} ---")
            print(output)
            print("-----------------------------------")

# テストケースを実行
if __name__ == "__main__":
    # テストベッドファイルのパスを指定して実行
    aetest.main(testbed="testbed.yaml")
testbed.yaml
devices:
  Router1:
    alias: R1
    os: "iosxr"
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      cli:
        protocol: telnet
        ip: "192.168.11.56"
        arguments:
          init_config_commands: []
            # - line default exec-timeout 0 0
            # - line default absolute-timeout 0
            # - line default session-timeout 0

ログ追加#

from pyats import aetest
from pyats.topology import loader
import logging

# ロガーを設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")

# ファイルハンドラを追加
file_handler = logging.FileHandler("log.txt")
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

# テストケースを作成
class MyTestcase(aetest.Testcase):
    @aetest.setup
    def setup(self, testbed):
        # テストベッドの読み込み
        tb = loader.load(testbed)

        # デバイスへの接続
        self.parameters["devices"] = {}  # devicesキーを追加

        for device_name, device in tb.devices.items():
            device.connect(learn_hostname=True)
            self.parameters["devices"][device_name] = device

    @aetest.test
    def show_run_test(self):
        # デバイスの情報をログに記録
        for device_name, device in self.parameters["devices"].items():
            # show runコマンドを実行
            output = device.execute("show run")

            # ログに記録
            logger.info(f"--- Configuration on {device_name} ---")
            logger.info(output)
            logger.info("-----------------------------------")

# テストケースを実行
if __name__ == "__main__":
    # テストベッドファイルのパスを指定して実行
    aetest.main(testbed="testbed.yaml")

マルチプロセス#

from pyats import aetest
from pyats.topology import loader
import multiprocessing

# show runを実行する関数
def execute_show_run(device_name, device):
    output = device.execute("show run")

    # 結果を表示
    print(f"--- Configuration on {device_name} ---")
    print(output)
    print("-----------------------------------")

# テストケースを作成
class MyTestcase(aetest.Testcase):
    @aetest.setup
    def setup(self, testbed):
        # テストベッドの読み込み
        tb = loader.load(testbed)

        # デバイスへの接続
        self.parameters["devices"] = {}  # devicesキーを追加

        for device_name, device in tb.devices.items():
            device.connect(learn_hostname=True)
            self.parameters["devices"][device_name] = device

    @aetest.test
    def show_run_test(self):
        # プロセスリストを作成
        processes = []

        # デバイスごとにプロセスを生成して実行
        for device_name, device in self.parameters["devices"].items():
            process = multiprocessing.Process(target=execute_show_run, args=(device_name, device))
            processes.append(process)
            process.start()

        # 全てのプロセスの終了を待機
        for process in processes:
            process.join()

# テストケースを実行
if __name__ == "__main__":
    # テストベッドファイルのパスを指定して実行
    aetest.main(testbed="testbed.yaml")