やりたいこと
最近、テスト自動化のため、pyATS/Genieをトライしています。
IPsecのテストをやりたく、「show crypto session」の確認自動化がやりたいと思い立ちました。
問題発生
以下のWebサイトによると、残念ながら、「show crypto session」はGenieではパースできないようです。
困った。
Genieでパースできるコマンドリスト
解決方針
Genieでパースできないので、下記ブログを参考にさせていただきまして、TextFSMでパースすることとしました。
pyATS/TextFSMのテンプレートを使ってパースする
CCIEおじさんのブログはいつも参考にさせて頂いております。ありがとうございます。
テンプレート作成
TextFSMでパースするために、ntc-templateにテンプレートがあるか、捜索しましたが、
残念ながら「show crypto session」のテンプレートはないようです
https://github.com/networktocode/ntc-templates
ということで自分で作ることとしました。
みようみまねで作ったのが以下です。イケてないかもしれません
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
#!/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))