Задания#
Все задания и вспомогательные файлы можно скачать в репозитории.
Предупреждение
Начиная с раздела «4. Типы данных в Python» для проверки заданий есть автоматические тесты. Они помогают проверить все ли соответствует поставленной задаче, а также дают обратный отклик по тому, что не соответствует задаче. Как правило, после первого периода адаптации к тестам, становится проще делать задания с тестами. Проверка заданий выполняется с помощью утилиты pyneng. Подробнее о том как работать с утилитой pyneng.
Задание 11.1#
Создать функцию parse_cdp_neighbors, которая обрабатывает вывод команды show cdp neighbors.
У функции должен быть один параметр command_output, который ожидает как аргумент вывод команды одной строкой (не имя файла). Для этого надо считать все содержимое файла в строку, а затем передать строку как аргумент функции (как передать вывод команды показано в коде ниже).
Функция должна возвращать словарь, который описывает соединения между устройствами.
Например, если как аргумент был передан такой вывод:
R4>show cdp neighbors
Device ID Local Intrfce Holdtme Capability Platform Port ID
R5 Fa 0/1 122 R S I 2811 Fa 0/1
R6 Fa 0/2 143 R S I 2811 Fa 0/0
Функция должна вернуть такой словарь:
{("R4", "Fa0/1"): ("R5", "Fa0/1"),
("R4", "Fa0/2"): ("R6", "Fa0/0")}
В словаре интерфейсы должны быть записаны без пробела между типом и именем. То есть так Fa0/0, а не так Fa 0/0.
Проверить работу функции на содержимом файла sh_cdp_n_sw1.txt. При этом функция работать и на других файлах (тест проверяет работу функции на выводе из sh_cdp_n_sw1.txt и sh_cdp_n_r3.txt).
Ограничение: Все задания надо выполнять используя только пройденные темы.
def parse_cdp_neighbors(command_output):
"""
Тут мы передаем вывод команды одной строкой потому что именно в таком виде
будет получен вывод команды с оборудования. Принимая как аргумент вывод
команды, вместо имени файла, мы делаем функцию более универсальной: она может
работать и с файлами и с выводом с оборудования.
Плюс учимся работать с таким выводом.
"""
if __name__ == "__main__":
with open("sh_cdp_n_sw1.txt") as f:
print(parse_cdp_neighbors(f.read()))
Задание 11.2#
Создать функцию create_network_map, которая обрабатывает вывод команды show cdp neighbors из нескольких файлов и объединяет его в одну общую топологию.
У функции должен быть один параметр filenames, который ожидает как аргумент список с именами файлов, в которых находится вывод команды show cdp neighbors.
Функция должна возвращать словарь, который описывает соединения между устройствами. Структура словаря такая же, как в задании 11.1:
{("R4", "Fa0/1"): ("R5", "Fa0/1"),
("R4", "Fa0/2"): ("R6", "Fa0/0")}
Cгенерировать топологию, которая соответствует выводу из файлов:
sh_cdp_n_sw1.txt
sh_cdp_n_r1.txt
sh_cdp_n_r2.txt
sh_cdp_n_r3.txt
Не копировать код функций parse_cdp_neighbors и draw_topology. Если функция parse_cdp_neighbors не может обработать вывод одного из файлов с выводом команды, надо исправить код функции в задании 11.1.
Ограничение: Все задания надо выполнять используя только пройденные темы.
infiles = [
"sh_cdp_n_sw1.txt",
"sh_cdp_n_r1.txt",
"sh_cdp_n_r2.txt",
"sh_cdp_n_r3.txt",
]
Задание 11.2a#
Примечание
Для выполнения этого задания, должен быть установлен graphviz:
apt-get install graphviz
И модуль python для работы с graphviz:
pip install graphviz
С помощью функции create_network_map из задания 11.2 создать словарь topology с описанием топологии для файлов:
sh_cdp_n_sw1.txt
sh_cdp_n_r1.txt
sh_cdp_n_r2.txt
sh_cdp_n_r3.txt
С помощью функции draw_topology из файла draw_network_graph.py нарисовать схему для словаря topology, полученного с помощью create_network_map. Как работать с функцией draw_topology надо разобраться самостоятельно, почитав описание функции в файле draw_network_graph.py. Полученная схема будет записана в файл svg - его можно открыть браузером.
С текущим словарем topology на схеме нарисованы лишние соединения. Они возникают потому что в одном файле CDP (sh_cdp_n_r1.txt) описывается соединение
("R1", "Eth0/0"): ("SW1", "Eth0/1")
а в другом (sh_cdp_n_sw1.txt)
("SW1", "Eth0/1"): ("R1", "Eth0/0")
В этом задании надо создать новую функцию unique_network_map, которая из этих двух соединений будет оставлять только одно, для корректного рисования схемы. При этом все равно какое из соединений оставить.
У функции unique_network_map должен быть один параметр topology_dict, который ожидает как аргумент словарь. Это должен быть словарь полученный в результате выполнения функции create_network_map из задания 11.2.
Пример словаря:
{
("R1", "Eth0/0"): ("SW1", "Eth0/1"),
("R2", "Eth0/0"): ("SW1", "Eth0/2"),
("R2", "Eth0/1"): ("SW2", "Eth0/11"),
("R3", "Eth0/0"): ("SW1", "Eth0/3"),
("R3", "Eth0/1"): ("R4", "Eth0/0"),
("R3", "Eth0/2"): ("R5", "Eth0/0"),
("SW1", "Eth0/1"): ("R1", "Eth0/0"),
("SW1", "Eth0/2"): ("R2", "Eth0/0"),
("SW1", "Eth0/3"): ("R3", "Eth0/0"),
("SW1", "Eth0/5"): ("R6", "Eth0/1"),
}
Функция должна возвращать словарь, который описывает соединения между устройствами. В словаре надо избавиться от «дублирующих» соединений и оставлять только одно из них.
Структура итогового словаря такая же, как в задании 11.2:
{("R4", "Fa0/1"): ("R5", "Fa0/1"),
("R4", "Fa0/2"): ("R6", "Fa0/0")}
После создания функции, попробовать еще раз нарисовать топологию, теперь уже для словаря, который возвращает функция unique_network_map.
Результат должен выглядеть так же, как схема в файле task_11_2a_topology.svg

При этом:
Расположение устройств на схеме может быть другим
Соединения должны соответствовать схеме
Не копировать код функций create_network_map и draw_topology.
Ограничение: Все задания надо выполнять используя только пройденные темы.
infiles = [
"sh_cdp_n_sw1.txt",
"sh_cdp_n_r1.txt",
"sh_cdp_n_r2.txt",
"sh_cdp_n_r3.txt",
]