LoginSignup
3
1

More than 3 years have passed since last update.

pyATS/Genieでshow crypto sessionの確認をしてみる

Posted at

やりたいこと

最近、テスト自動化のため、pyATS/Genieをトライしています。
IPsecのテストをやりたく、「show crypto session」の確認自動化がやりたいと思い立ちました。
image.png

問題発生

以下のWebサイトによると、残念ながら、「show crypto session」はGenieではパースできないようです。
困った。:thinking:
Genieでパースできるコマンドリスト

解決方針

Genieでパースできないので、下記ブログを参考にさせていただきまして、TextFSMでパースすることとしました。
pyATS/TextFSMのテンプレートを使ってパースする
CCIEおじさんのブログはいつも参考にさせて頂いております。ありがとうございます。:bow_tone1:

テンプレート作成

TextFSMでパースするために、ntc-templateにテンプレートがあるか、捜索しましたが、
残念ながら「show crypto session」のテンプレートはないようです:frowning2:
https://github.com/networktocode/ntc-templates

ということで自分で作ることとしました。
みようみまねで作ったのが以下です。イケてないかもしれません:rolling_eyes:

cisco_ios_show_crypto_session.textfsm
Value INTERFACE (\w+)
Value STATE (\w+)

Start
  ^.*Interface:\s+${INTERFACE}
  ^.*Session\s+status:\s+${STATE}

テストスクリプト作成

では、うえで作ったテンプレートを使ってテストをするスクリプトの作成です。
以下のdcloudにあったスクリプトをベースに改版させていただきました。
https://dcloud-cms.cisco.com/demo_news/cisco-automated-testing-for-your-network-pyats-v1

ipsec.py

#!/usr/bin/env python3

# To get a logger for the script
import logging

from pyats import aetest
from pyats.log.utils import banner

# Genie Imports
from genie.conf import Genie

# To handle erorrs in connections
from unicon.core import errors

import argparse
from pyats.topology import loader

import textfsm

# Get your logger for your script
global log
log = logging.getLogger(__name__)
log.level = logging.INFO

class MyCommonSetup(aetest.CommonSetup):
    """
    CommonSetup class to prepare for testcases
    Establishes connections to all devices in testbed
    """

    @aetest.subsection
    def establish_connections(self, testbed):
        """
        Establishes connections to all devices in testbed
        :param testbed:
        :return:
        """
        genie_testbed = Genie.init(testbed)
        self.parent.parameters['testbed'] = genie_testbed
        device_list = []
        for device in genie_testbed.devices.values():
            log.info(banner(
                f"接続中です '{device.name}'"))
            try:
                device.connect(log_stdout=False)
            except errors.ConnectionError:
                self.failed(f"Failed to establish "
                            f"connection to '{device.name}'")
            device_list.append(device)
        # Pass list of devices to testcases
        self.parent.parameters.update(dev=device_list)

class IPSECtest(aetest.Testcase):
    @aetest.setup
    def setup(self):
        """
        Get list of all devices in testbed and
        run inventory testcase for each device
        :return:
        """
        devices = self.parent.parameters['dev']
        aetest.loop.mark(self.inventory, device=devices)

    @aetest.test
    def inventory(self, device):
        template = open('/cisco_ios_show_crypto_session.textfsm', 'r')
        with open('/cisco_ios_show_crypto_session.textfsm', 'r') as f:
            template = textfsm.TextFSM(f)

        out1 = device.execute('show crypto session')
        parsed=template.ParseText(out1)
        if parsed[0][1] == 'UP':
            pass
        else:
            self.failed(f'IPSECがダウンしています')

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--testbed', dest='testbed',
                        type=loader.load)
    args, unknown = parser.parse_known_args()
    aetest.main(**vars(args))

結果

pyATSのjobで実行してみた結果。
やったね:grin:
image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1