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

#やりたいこと
最近、テスト自動化のため、pyATS/Genieをトライしています。
IPsecのテストをやりたく、「show crypto session」の確認自動化がやりたいと思い立ちました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185259/25ac7ed7-3332-fb0d-ed9f-6c7136a11f8f.png)


#問題発生
以下のWebサイトによると、残念ながら、「show crypto session」はGenieではパースできないようです。
困った。:thinking:
[Genieでパースできるコマンドリスト](https://pubhub.devnetcloud.com/media/genie-feature-browser/docs/#/parsers)

#解決方針
Genieでパースできないので、下記ブログを参考にさせていただきまして、TextFSMでパースすることとしました。
[pyATS/TextFSMのテンプレートを使ってパースする](https://ccieojisan.net/post-2119/)
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

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185259/f9841411-0939-31c9-81ac-bdb70f78b9d3.png)