0% found this document useful (0 votes)
32 views31 pages

LAB 1-Network Automation Testing pyATS - 62722

This document outlines a lab exercise focused on network automation testing using pyATS, where participants will learn to explore and update pyATS testbed and script files. The lab involves working with three routers (R1, R2, and R3) and includes tasks such as connecting to devices, running scripts, and analyzing results. Key objectives include understanding the structure of testbed files, executing scripts, and modifying configurations to include additional devices.

Uploaded by

Dúber Pérez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
32 views31 pages

LAB 1-Network Automation Testing pyATS - 62722

This document outlines a lab exercise focused on network automation testing using pyATS, where participants will learn to explore and update pyATS testbed and script files. The lab involves working with three routers (R1, R2, and R3) and includes tasks such as connecting to devices, running scripts, and analyzing results. Key objectives include understanding the structure of testbed files, executing scripts, and modifying configurations to include additional devices.

Uploaded by

Dúber Pérez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 31

Discovery 1: Network

Automation Testing with pyATS


Introduction
In this lab, you will explore pyATS technology and update a pyATS testbed file and pyATS script. After
completing this activity, you will be able to meet these objectives:

 Explore the structure of a pyATS testbed file

 Run pyATS script and review the results

 Explore pyATS script main classes and functions

 Update pyATS testbed file to inclure R3 router

 Update pyATS script file to include R3 router

Topology
Topology for this lab includes three routers, R1, R2, and R3. These routers are connected to a
management network by the GigabitEthernet1 interface. Also, they connect to each other through the
GigabitEthernet2 and GigabitEthernet3 interfaces.
Job Aid

Access Credentials Table

Device Credentials

Jump host Username: Student


Password: 1234QWer

R1 Username: cisco
Password: cisco

R2 Username: cisco
Password: cisco

R3 Username: cisco
Password: cisco

Device Information Table

Device Description IP Address

R1 Cisco IOS XE router GigabitEthernet1: 172.21.1.21/24


GigabitEthernet2: 10.0.12.1/24
GigabitEthernet3: 10.0.13.1/24

R2 Cisco IOS XE router GigabitEthernet1: 172.21.1.22/24


GigabitEthernet2: 10.0.12.2/24
Device Description IP Address

GigabitEthernet3: 10.0.23.2/24

R3 Cisco IOS XE router GigabitEthernet1: 172.21.1.23/24


GigabitEthernet2: 10.0.13.3/24
GigabitEthernet3: 10.0.23.3/24

Task 1: Explore a pyATS Testbed and Script File


In this task, you will explore the structure of a pyATS testbed and script file.

Activity Procedure
Complete the following steps:
Step 1 Connect to the Jumpbox PC.
Step 2 On the Jumpbox destop, start Visual Studio Code by double-clicking its icon.

Step 3 On the VS Code EXPLORER panel, click the pyATS testbed file
pyats_ios_default.yaml file to open and edit the file in the main panel.
Step 4 As you review the content of the YAML testbed file, notice the two main sections
testbed and topology. Also, notice the two devices in this topology, R1 and R2.

testbed:

name: pyATS_IOS_Example_Testbed

credentials:

default:

username: cisco

password: cisco

devices:

R1:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.21

port: 22

type: iosxe

os: iosxe

R2:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.22
port: 22

type: iosxe

os: iosxe

topology:

R1:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.21/24

link: n1

type: ethernet

R2:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.22/24

link: n1

type: ethernet

Step 5 On the VS Code TERMINAL panel, active the pyats virtual environment with the
source /pyats/bin/activate command. Then change the working directory to
pyats-ios with the cd pyats-ios/ command.

Step 6 Run the pyats_ios.py script with the command python pyats_ios.py.
Step 7 On the Detailed Results section, take note of the main sections. Each section
corresponds to pyATS classes that are defined in the pyATS script file. You will
review these classes in the following steps.

+------------------------------------------------------------------------------+

| Detailed Results |

+------------------------------------------------------------------------------+

SECTIONS/TESTCASES RESULT

--------------------------------------------------------------------------------

|-- common_setup PASSED

| |-- check_topology PASSED

| |-- establish_connections PASSED

| | |-- Step 1: Connecting to ios device: R1 PASSED

| | `-- Step 2: Connecting to ios device: R2 PASSED

| `-- marking_interface_count_testcases PASSED

|-- PingTestcase[ios_name=R1] PASSED

| |-- setup PASSED

| |-- ping[destination=172.21.1.21] PASSED

| `-- ping[destination=172.21.1.22] PASSED

|-- PingTestcase[ios_name=R2] PASSED

| |-- setup PASSED

| |-- ping[destination=172.21.1.21] PASSED

| `-- ping[destination=172.21.1.22] PASSED

|-- VerifyInterfaceCountTestcase[device=R1] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

|-- VerifyInterfaceCountTestcase[device=R2] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

`-- common_cleanup PASSED

`-- disconnect PASSED

|-- Step 1: Disconnecting from ios device: R1 PASSED

`-- Step 2: Disconnecting from ios device: R2 PASSED

+------------------------------------------------------------------------------+

| Summary |

+------------------------------------------------------------------------------+
Number of ABORTED 0

Number of BLOCKED 0

Number of ERRORED 0

Number of FAILED 0

Number of PASSED 6

Number of PASSX 0

Number of SKIPPED 0

Total Number 6

Success Rate 100.0%

--------------------------------------------------------------------------------

(pyats) student@student-vm:~/pyats-ios-sample$

Step 8 On the VS Code EXPLORER panel, open the pyATS script file by clicking
pyats_ios.py.

Step 9 As you review the content of the script, notice that each defined class
corresponds to each section of the results that you noted in the previous step.
Also, each function defined in these classes corresponds to subsections in the
previous result.
Step 10 Review the content of common_setup class.

# Common Setup Section

#
class common_setup(aetest.CommonSetup):

'''Common Setup Section

Defines subsections that performs configuration common to the entire


script.

'''

@aetest.subsection

def check_topology(self, testbed, ios_names):

'''

check that we have at least two devices and a link between the devices

If so, mark the next subsection for looping.

'''

# abort/fail the testscript if no testbed was provided

if not testbed or not testbed.devices:

self.failed('No testbed was provided to script launch',

goto = ['exit'])

for ios_name in ios_names:

if ios_name not in testbed:

# abort/fail the testscript if no matching device was provided

self.failed('testbed needs to contain device


{ios_name}'.format(ios_name=ios_name,),goto = ['exit'])

# add them to testscript parameters


ios_device = testbed.devices[ios_name]

# get corresponding links

links = ios_device.links

# save link and ios_device as parameter

self.parent.parameters[ios_name] = {'ios': ios_device, 'links':


links}

assert len(links) >= 1, 'require one link or more between devices'

@aetest.subsection

def establish_connections(self, steps, ios_names):

'''

establish connection to both devices

'''

for ios_name in ios_names:

with steps.start('Connecting to ios device: %s'%(ios_name)):

self.parent.parameters[ios_name]['ios'].connect()

# abort/fail the testscript if any device isn't connected

if not self.parent.parameters[ios_name]['ios'].connected:

self.failed('One of the devices could not be connected to',goto


= ['exit'])

@aetest.subsection

def marking_interface_count_testcases(self, testbed):

'''

mark the VerifyInterfaceCountTestcase for looping.

'''

# ignore CML terminal_server


devices = [d for d in testbed.devices.keys() if 'terminal_server' not
in d]

logger.info(banner('Looping VerifyInterfaceCountTestcase'

' for {}'.format(devices)))

# dynamic loop marking on testcase

aetest.loop.mark(VerifyInterfaceCountTestcase, device = devices)

Step 11 Based on your previous revision, provide a brief description of the following
member functions of common_setup class.

check_topology: _________________________________________________________
________________________________________________________________________
establish_connections:____________________________________________________
________________________________________________________________________
marking_interface_count_testcases:_________________________________________
________________________________________________________________________

Step 12 Scroll down the script file and analize the contents of the PingTestcase class.

# Ping Testcase: leverage dual-level looping

@aetest.loop(ios_name = ('R1', 'R2'))

class PingTestcase(aetest.Testcase):

'''Ping test'''

groups = ('basic', 'looping')


@aetest.setup

def setup(self, ios_name):

destination = []

for link in self.parent.parameters[ios_name]['links']:

# To get the link interfaces ip

for intf in link.interfaces:

parsed_dict = self.parent.parameters[intf.device.name]['ios'].\

parse('show ip interface brief')

intf_ip = parsed_dict['interface'][intf.name]['ip_address']

destination.append(intf_ip)

# apply loop to next section

aetest.loop.mark(self.ping, destination = destination)

@aetest.test

def ping(self, ios_name, destination):

'''

ping destination ip address from device

Sample of ping command result:

ping

Protocol [ip]:

Target IP address: 10.10.10.2

Repeat count [5]:


Datagram size [100]:

Timeout in seconds [2]:

Extended commands [n]: n

Sweep range of sizes [n]: n

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 10.10.10.2, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

'''

try:

# store command result for later usage

result = self.parameters[ios_name]['ios'].ping(destination)

# result = self.parameters[device].ping(destination)

except Exception as e:

# abort/fail the testscript if ping command returns any exception

# such as connection timeout or command failure

self.failed('Ping {} from device {} failed with error: {}'.format(

destination,

device,

str(e),

),

goto = ['exit'])

else:

# extract success rate from ping result with regular expression


match = re.search(r'Success rate is (?P<rate>\d+) percent', result)

success_rate = match.group('rate')

# log the success rate

logger.info(banner('Ping {} with success rate of {}%'.format(

destination,

success_rate,

Step 13 Based on your previous revision, provide a brief description of the following
member functions of the pingTestcase class.

setup: __________________________________________________________________
________________________________________________________________________
ping:____________________________________________________________________
________________________________________________________________________

Step 14 Scroll down on the pyATS script file and analyze the contents of the
VerifyInterfaceCountTestcase class.

# Verify Interface Count Testcase

class VerifyInterfaceCountTestcase(aetest.Testcase):

'''Verify interface count test'''

groups = ('basic', 'looping')

@aetest.test
def extract_interface_count(self, device):

'''

extract interface counts from `show version`

Sample of show version command result:

show version

Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version


15.6(2)T, RELEASE SOFTWARE (fc2)

Technical Support: http://www.cisco.com/techsupport

Copyright (c) 1986-2016 by Cisco Systems, Inc.

Compiled Tue 22-Mar-16 16:19 by prod_rel_team

ROM: Bootstrap program is IOSv

ios2 uptime is 1 hour, 17 minutes

System returned to ROM by reload

System image file is "flash0:/vios-adventerprisek9-m"

Last reload reason: Unknown reason

<....>

Cisco IOSv (revision 1.0) with with 484609K/37888K bytes of memory.

Processor board ID 9QTSICFAZS7Q2I61N8WNZ

2 Gigabit Ethernet interfaces

DRAM configuration is 72 bits wide with parity disabled.

256K bytes of non-volatile configuration memory.


2097152K bytes of ATA System CompactFlash 0 (Read/Write)

0K bytes of ATA CompactFlash 1 (Read/Write)

0K bytes of ATA CompactFlash 2 (Read/Write)

10080K bytes of ATA CompactFlash 3 (Read/Write)

Configuration register is 0x0

'''

try:

# store execution result for later usage

result = self.parameters[device]['ios'].execute('show version')

except Exception as e:

# abort/fail the testscript if show version command returns any

# exception such as connection timeout or command failure

self.failed('Device {} \'show version\' failed: {}'.format(device,

str(e)),

goto = ['exit'])

else:

# extract interfaces counts from `show version`

match = re.search(r'(?P<ethernet>\d+) Gigabit Ethernet interfaces\


r\n', result)

ethernet_intf_count = int(match.group('ethernet'))

# log the interface counts

logger.info(banner('\'show version\' returns {} ethernet


interfaces'
.format(

ethernet_intf_count

# add them to testcase parameters

self.parameters.update(ethernet_intf_count = ethernet_intf_count,

serial_intf_count = 0)

@aetest.test

def verify_interface_count(self,

device,

ethernet_intf_count = 0,

serial_intf_count = 0):

'''

verify interface counts with `show ip interface brief`

Sample of show ip interface brief command result:

show ip interface brief

Interface IP-Address OK? Method Status


Protocol

GigabitEthernet0/0 unassigned YES unset administratively


down down

GigabitEthernet0/1 10.10.10.2 YES manual up


up

'''
try:

# store execution result for later usage

result = self.parameters[device]['ios'].execute('show ip interface


brief')

except Exception as e:

# abort/fail the testscript if show ip interface brief command

# returns any exception such as connection timeout or command

# failure

self.failed('Device {} \'show ip interface brief\' failed: '

'{}'.format(device, str(e)),

goto = ['exit'])

else:

# extract ethernet interfaces

ethernet_interfaces = re.finditer(r'\r\nGigabitEthernet\d+\s+',
result)

# total number of ethernet interface

len_ethernet_interfaces = len(tuple(ethernet_interfaces))

# log the ethernet interface counts

logger.info(banner('\'show ip interface brief\' returns {}


ethernet'

' interfaces'.format(len_ethernet_interfaces)))

# compare the ethernet interface count between

# `show ip interface brief` and `show version`

assert len_ethernet_interfaces == ethernet_intf_count


Step 15 Based on your previous revision, provide a brief description of the following
member functions of VerifyInterfaceCountTestcase class.

extract_interface_count: ___________________________________________________
________________________________________________________________________
verify_interface_count:____________________________________________________
________________________________________________________________________

Step 16 Scroll down on the script file and analyze the content of the common_cleanup
class.

# Disconnect from ios routers

class common_cleanup(aetest.CommonCleanup):

'''disconnect from ios routers'''

@aetest.subsection

def disconnect(self, steps, ios_names):

'''disconnect from both devices'''

for ios_name in ios_names:

with steps.start('Disconnecting from ios device: %s'%(ios_name)):

self.parameters[ios_name]['ios'].disconnect()

if self.parameters[ios_name]['ios'].connected:

# abort/fail the testscript if device connection still exists

self.failed('One of the devices could not be disconnected


from',

goto = ['exit'])
Activity Verification
You have completed this task when you obtain the following results:
 Successfully review the pyATS testbed file.
 Successfully review the pyATS script file.
 Successfully run the pyATS script file.

Task 2: Update pyATS Testbed and Script File


In this task, you will update the pyATS testbed and script file.

Activity Procedure
Complete the following steps:
Step 1 On the VS Code EXPLORER panel, click the pyats_ios_default.yaml file.

Step 2 In the topology section, add a second link between R1 and R2. When you finish,
compare your testbed file with the following YAML file:
Interfece GigabitEthernet2 on R1 topology:
GigabitEthernet2:
ipv4: 10.0.12.1/24
link: n2
type: ethernet

Interface GigabitEthernet2 on R2 topology:


GigabitEthernet2:
ipv4: 10.0.12.2/24
link: n2
type: ethernet

Step 3 Verify that your testbed file is equal to the following YAML file. Then press
Ctrl + S to save your changes.

testbed:

name: pyATS_IOS_Example_Testbed

credentials:

default:

username: cisco

password: cisco

devices:

R1:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.21

port: 22

type: iosxe
os: iosxe

R2:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.22

port: 22

type: iosxe

os: iosxe

topology:

R1:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.21/24

link: n1

type: ethernet

GigabitEthernet2:

ipv4: 10.0.12.1/24

link: n2

type: ethernet

R2:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.22/24

link: n1
type: ethernet

GigabitEthernet2:

ipv4: 10.0.12.2/24

link: n2

type: ethernet

Step 1 On VS Code, run the pyats_ios.py script with the python pyats_ios.py
command.

Step 1 From the Detailed Results section, notice that pyATS automatically discovered
the new link between R1 and R2 and includes the IP addresses for the interfaces
in the ping test.

+------------------------------------------------------------------------------+

| Detailed Results |

+------------------------------------------------------------------------------+

SECTIONS/TESTCASES RESULT

--------------------------------------------------------------------------------

|-- common_setup PASSED

| |-- check_topology PASSED

| |-- establish_connections PASSED

| | |-- Step 1: Connecting to ios device: R1 PASSED

| | `-- Step 2: Connecting to ios device: R2 PASSED

| `-- marking_interface_count_testcases PASSED

|-- PingTestcase[ios_name=R1] PASSED

| |-- setup PASSED

| |-- ping[destination=172.21.1.21] PASSED

| |-- ping[destination=172.21.1.22] PASSED

| |-- ping[destination=10.0.12.1] PASSED

| `-- ping[destination=10.0.12.2] PASSED

|-- PingTestcase[ios_name=R2] PASSED

| |-- setup PASSED

| |-- ping[destination=172.21.1.21] PASSED

| |-- ping[destination=172.21.1.22] PASSED


| |-- ping[destination=10.0.12.1] PASSED

| `-- ping[destination=10.0.12.2] PASSED

|-- VerifyInterfaceCountTestcase[device=R1] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

|-- VerifyInterfaceCountTestcase[device=R2] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

`-- common_cleanup PASSED

`-- disconnect PASSED

|-- Step 1: Disconnecting from ios device PASSED

`-- Step 2: Disconnecting from ios device PASSED

+------------------------------------------------------------------------------+

| Summary |

+------------------------------------------------------------------------------+

Number of ABORTED 0

Number of BLOCKED 0

Number of ERRORED 0

Number of FAILED 0

Number of PASSED 6

Number of PASSX 0

Number of SKIPPED 0

Total Number 6

Success Rate 100.0%

--------------------------------------------------------------------------------

(pyats) student@student-vm:~/pyats-ios-sample$

Step 2 On the VS Code main panel, edit the testbed file to add a new router R3. Also
edit the topology section to include a link between R3 and the R1 and R2 routers.
R3 definition in testbed section:
R3:
connections:
defaults:
class: 'unicon.Unicon'
a:
protocol: ssh
ip: 172.21.1.23
port: 22
type: iosxe
os: iosxe

Interface GigabitEthernet3 on R1 topology section:


GigabitEthernet3:
ipv4: 10.0.13.1/24
link: n3
type: ethernet

Interface GigabitEthernet3 on R2 topology section:


GigabitEthernet3:
ipv4: 10.0.23.1/24
link: n4
type: ethernet

R3 definition in topology section:


R3:
interfaces:
GigabitEthernet1:
ipv4: 172.21.1.23/24
link: n1
type: ethernet
GigabitEthernet2:
ipv4: 10.0.13.2/24
link: n3
type: ethernet
GigabitEthernet3:
ipv4: 10.0.23.2/24
link: n4
type: ethernet

Step 3 Verify that your testbed file is equal to the following YAML file. Then press
Ctrl + S to save your changes.

testbed:

name: pyATS_IOS_Example_Testbed
credentials:

default:

username: cisco

password: cisco

devices:

R1:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.21

port: 22

type: iosxe

os: iosxe

R2:

connections:

defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.22

port: 22

type: iosxe

os: iosxe

R3:

connections:
defaults:

class: 'unicon.Unicon'

a:

protocol: ssh

ip: 172.21.1.23

port: 22

type: iosxe

os: iosxe

topology:

R1:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.21/24

link: n1

type: ethernet

GigabitEthernet2:

ipv4: 10.0.12.1/24

link: n2

type: ethernet

GigabitEthernet3:

ipv4: 10.0.13.1/24

link: n3

type: ethernet

R2:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.22/24
link: n1

type: ethernet

GigabitEthernet2:

ipv4: 10.0.12.2/24

link: n2

type: ethernet

GigabitEthernet3:

ipv4: 10.0.23.1/24

link: n4

type: ethernet

R3:

interfaces:

GigabitEthernet1:

ipv4: 172.21.1.23/24

link: n1

type: ethernet

GigabitEthernet2:

ipv4: 10.0.13.2/24

link: n3

type: ethernet

GigabitEthernet3:

ipv4: 10.0.23.2/24

link: n4

type: ethernet
Step 4 On the VS Code EXPLORER panel, click the pyats_ios.py file to open the mail
panel.

Step 5 Edit line number 135 to include the R3 router in the loop.

# Ping Testcase: leverage dual-level looping

@aetest.loop(ios_name = ('R1', 'R2', 'R3'))

class PingTestcase(aetest.Testcase):

'''Ping test'''

Step 6 Edit line number 338 to include the R3 router name in the ios_name variable.

from ats.topology import loader

parser = argparse.ArgumentParser(description = "standalone parser")

parser.add_argument('--ios', dest = 'ios_names', type = list, default =


['R1', 'R2', 'R3'])
parser.add_argument('--testbed', dest = 'testbed', type = loader.load,
default = 'pyats_ios_default.yaml')

# parse args

Step 1 After you update the script, press Ctrl + S to save your changes.

Step 2 On VS Code, run the pyats_ios.py script with the python pyats_ios.py
command.

Step 3 From the Detailed Results section, notice that pyATS automatically discovered
the new link between R1 and R2 and includes the IP addresses for the interfaces
in the ping test.
+------------------------------------------------------------------------------+

| Detailed Results |

+------------------------------------------------------------------------------+

SECTIONS/TESTCASES RESULT

--------------------------------------------------------------------------------

|-- common_setup PASSED

| |-- check_topology PASSED

| |-- establish_connections PASSED

| | |-- Step 1: Connecting to ios device: R1 PASSED

| | |-- Step 2: Connecting to ios device: R2 PASSED

| | `-- Step 3: Connecting to ios device: R3 PASSED

| `-- marking_interface_count_testcases PASSED

|-- PingTestcase[ios_name=R1] PASSED

| |-- setup PASSED

| |-- ping[destination=10.0.13.1] PASSED

| |-- ping[destination=10.0.13.2] PASSED

| |-- ping[destination=10.0.12.1] PASSED

| |-- ping[destination=10.0.12.2] PASSED

| |-- ping[destination=172.21.1.21] PASSED

| |-- ping[destination=172.21.1.22] PASSED

| `-- ping[destination=172.21.1.23] PASSED

|-- PingTestcase[ios_name=R2] PASSED

| |-- setup PASSED


| |-- ping[destination=10.0.12.1] PASSED

| |-- ping[destination=10.0.12.2] PASSED

| |-- ping[destination=172.21.1.21] PASSED

| |-- ping[destination=172.21.1.22] PASSED

| |-- ping[destination=172.21.1.23] PASSED

| |-- ping[destination=10.0.23.1] PASSED

| `-- ping[destination=10.0.23.2] PASSED

|-- PingTestcase[ios_name=R3] PASSED

| |-- setup PASSED

| |-- ping[destination=10.0.13.1] PASSED

| |-- ping[destination=10.0.13.2] PASSED

| |-- ping[destination=172.21.1.21] PASSED

| |-- ping[destination=172.21.1.22] PASSED

| |-- ping[destination=172.21.1.23] PASSED

| |-- ping[destination=10.0.23.1] PASSED

| `-- ping[destination=10.0.23.2] PASSED

|-- VerifyInterfaceCountTestcase[device=R1] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

|-- VerifyInterfaceCountTestcase[device=R2] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

|-- VerifyInterfaceCountTestcase[device=R3] PASSED

| |-- extract_interface_count PASSED

| `-- verify_interface_count PASSED

`-- common_cleanup PASSED

`-- disconnect PASSED

|-- Step 1: Disconnecting from ios device: R1 PASSED

|-- Step 2: Disconnecting from ios device: R2 PASSED

`-- Step 3: Disconnecting from ios device: R3 PASSED

+------------------------------------------------------------------------------+

| Summary |

+------------------------------------------------------------------------------+

Number of ABORTED 0

Number of BLOCKED 0

Number of ERRORED 0

Number of FAILED 0

Number of PASSED 8

Number of PASSX 0
Number of SKIPPED 0

Total Number 8

Success Rate 100.0%

--------------------------------------------------------------------------------

(pyats) student@student-vm:~/pyats-ios-sample$

Activity Verification
You have completed this task when you obtain the following results:
 Successfully update the pyATS testbed file.
 Successfully update the pyATS script file.
 Successfully run the pyATS script file.

You might also like