Tasks

All tasks and additional files can be downloaded from repository.

Warning

Starting from section “4. Data types in Python” there are automated tests for testing tasks. They help to check whether everything matches the task, and also give feedback on what does not correspond to the task. As a rule, after the first period of adaptation to tests, it becomes easier to do tasks with tests. Testing is done using the pyneng utility. Learn more about how to work with the pyneng utility.

Task 21.1

Create parse_command_output function. Function parameters:

  • template - name of the file containing the TextFSM template. For example templates/sh_ip_int_br.template
  • command_output - output the corresponding show command (string)

The function should return a list:

  • the first element is a list with column names
  • the rest of the items are lists, which contain the results of processing the output of the show command

Check the operation of the function on the output of the sh ip int br command from the equipment and on the templates/sh_ip_int_br.template template.

from netmiko import ConnectHandler


# this is how a function call should look
if __name__ == "__main__":
    r1_params = {
        "device_type": "cisco_ios",
        "host": "192.168.100.1",
        "username": "cisco",
        "password": "cisco",
        "secret": "cisco",
    }
    with ConnectHandler(**r1_params) as r1:
        r1.enable()
        output = r1.send_command("sh ip int br")
    result = parse_command_output("templates/sh_ip_int_br.template", output)
    print(result)

Task 21.1a

Create parse_output_to_dict function.

Function parameters:

  • template is the name of the file containing the TextFSM template. For example templates/sh_ip_int_br.template
  • command_output - output of the corresponding show command (string)

The function should return a list of dictionaries:

  • keys - names of variables in the TextFSM template
  • values - parts of the output that correspond to variables

Check the operation of the function on the output of the command output/sh_ip_int_br.txt and the template templates/sh_ip_int_br.template.

Task 21.2

Create a TextFSM template to parse the output of the sh ip dhcp snooping binding command and write it to templates/sh_ip_dhcp_snooping.template

The command output is located in the file output/sh_ip_dhcp_snooping.txt.

The template should process and return the values of such columns:

  • mac - 00:04:A3:3E:5B:69
  • ip - 10.1.10.6
  • vlan - 10
  • intf - FastEthernet0/10

Check the work of the template using the parse_command_output function from task 21.1.

Task 21.3

Create function parse_command_dynamic.

Function parameters:

  • command_output - command output (string)
  • attributes_dict - an attribute dict containing the following key-value pairs:
    • ‘Command’: command
    • ‘Vendor’: vendor
  • index_file is the name of the file where the correspondence between commands and templates is stored. The default is “index”
  • templ_path - directory where templates are stored. The default is “templates”

The function should return a list of dicts with the results of parsing the command output (as in task 21.1a):

  • keys - names of variables in the TextFSM template
  • values - parts of the output that correspond to variables

Check the function on the output of the sh ip int br command.

Task 21.4

Create function send_and_parse_show_command.

Function parameters:

  • device_dict - a dict with connectin parameters for one device
  • command - the command to be executed
  • templates_path - path to the directory with TextFSM templates
  • index - file index name, default value “index”

The function should connect to one device, send a show command using netmiko, and then parse the command output using TextFSM.

The function should return a list of dictionaries with the results of parsing the command output (as in task 21.1a):

  • keys - names of variables in the TextFSM template
  • values - parts of the output that correspond to variables

Check the operation of the function using the output of the sh ip int br command and devices from devices.yaml.

Task 21.5

Create function send_and_parse_command_parallel.

The send_and_parse_command_parallel function must run the send_and_parse_show_command function from task 21.4 in concurrent threads.

Send_and_parse_command_parallel function parameters:

  • devices - a list of dicts with connection parameters for devices
  • command - command
  • templates_path - path to the directory with TextFSM templates
  • limit - maximum number of concurrent threads (default 3)

The function should return a dictionary:

  • keys - the IP address of the device from which the output was received
  • values - a list of dicts (the output returned by the send_and_parse_show_command function)

Dictionary example:

{'192.168.100.1': [{'address': '192.168.100.1',
                    'intf': 'Ethernet0/0',
                    'protocol': 'up',
                    'status': 'up'},
                   {'address': '192.168.200.1',
                    'intf': 'Ethernet0/1',
                    'protocol': 'up',
                    'status': 'up'}],
 '192.168.100.2': [{'address': '192.168.100.2',
                    'intf': 'Ethernet0/0',
                    'protocol': 'up',
                    'status': 'up'},
                   {'address': '10.100.23.2',
                    'intf': 'Ethernet0/1',
                    'protocol': 'up',
                    'status': 'up'}]}

Check the operation of the function using the output of the sh ip int br command and devices from devices.yaml.