def test_get_interfaces_mode_cisco(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Ethernet1/22/1': { 'mode': 'switched' }, 'Ethernet1/23/2': { 'mode': 'switched' }, 'Ethernet1/25': { 'mode': 'routed' }, 'port-channel1.3000': { 'mode': 'routed' }, 'port-channel2': { 'mode': 'routed' }, 'Vlan604': { 'mode': 'routed' }, } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('cisco_show_int_brief.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.get_interfaces_mode, None) do_interface_checks(interfaces, interface_objects)
def test_find_lag_hierarchy_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Eth-Trunk1': { 'members': ['40GE1/0/17', '40GE1/0/19'] }, 'Eth-Trunk2': { 'members': ['40GE1/0/18', '40GE1/0/20'] }, '40GE1/0/17': { 'member': 'Eth-Trunk1' }, '40GE1/0/18': { 'member': 'Eth-Trunk2' }, '40GE1/0/19': { 'member': 'Eth-Trunk1' }, '40GE1/0/20': { 'member': 'Eth-Trunk2' }, } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('huawei_show_int_brief.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.find_lag_hierarchy, None) do_interface_checks(interfaces, interface_objects)
def test_check_interfaces_status_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '40GE1/0/28:1': { 'admin_status': 'down', 'oper_status': 'down' }, '40GE1/0/32:4': { 'admin_status': 'up', 'oper_status': 'down' }, 'Vlanif1517': { 'admin_status': 'up', 'oper_status': 'up' }, 'Vlanif762': { 'admin_status': 'up', 'oper_status': 'up', 'svi': True } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('huawei_show_int_brief.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.check_interfaces_status, None) do_interface_checks(interfaces, interface_objects)
def test_check_interfaces_status_cisco(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Ethernet1/22/2': { 'admin_status': 'down', 'oper_status': 'down' }, 'Ethernet1/25': { 'admin_status': 'up', 'oper_status': 'up' }, 'port-channel1.3000': { 'admin_status': 'up', 'oper_status': 'up', 'subinterface': True }, 'Vlan604': { 'admin_status': 'up', 'oper_status': 'down', 'svi': True } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('cisco_show_int_brief.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.check_interfaces_status, None) do_interface_checks(interfaces, interface_objects)
def test_check_vrf_bgp_neighbors(set_vendor_vars): vendor_vars = set_vendor_vars cisco_v6_task = create_fake_task( get_file_contents('cisco_show_bgp_ipv6_vrf_neighbors.txt'), vendor_vars['Cisco Nexus'], 'Galaxy', 'nxos', check_vrf_status.check_vrf_bgp_neighbors) check_vrf_status.check_vrf_bgp_neighbors(cisco_v6_task, af='v6') assert len(cisco_v6_task.host['bgp_neighbors']) == 2 assert cisco_v6_task.host['bgp_neighbors']['fe80::152:12'].state == \ 'established' assert cisco_v6_task.host['bgp_neighbors']['fe80::152:12']._type == \ 'external' assert cisco_v6_task.host['bgp_neighbors']['fe80::152:12'].as_number == \ '65001' assert cisco_v6_task.host['bgp_neighbors']['fe80::152:12'].router_id.\ compressed == '172.20.134.2' assert cisco_v6_task.host['bgp_neighbors']['fe80::152:12'].af['ipv4'] is \ None v6 = cisco_v6_task.host['bgp_neighbors']['fe80::152:12'].af['ipv6'] assert v6.learned_routes == 1975 assert v6.sent_routes == 7 huawei_v6_task = create_fake_task( get_file_contents('huawei_show_bgp_ipv6_vrf_neighbors.txt'), vendor_vars['Huawei CE'], 'Galaxy', 'huawei_vrpv8', check_vrf_status.check_vrf_bgp_neighbors) check_vrf_status.check_vrf_bgp_neighbors(huawei_v6_task, af='v6') assert len(huawei_v6_task.host['bgp_neighbors']) == 2 assert huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1'].state == \ 'established' assert huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1']._type == \ 'external' assert huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1'].as_number == \ '65012' assert huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1'].router_id.\ compressed == '172.24.16.1' assert huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1'].af['ipv4'] is \ None v6 = huawei_v6_task.host['bgp_neighbors']['fe80::dd:a1'].af['ipv6'] assert v6.learned_routes == 1980 assert v6.sent_routes == 1982
def test_find_vrf(set_vendor_vars): vendor_vars = set_vendor_vars cisco_output = get_file_contents('cisco_show_vrf.txt') task_fail = create_fake_task(cisco_output, vendor_vars['Cisco Nexus'], 'Galaxy', 'nxos', check_vrf_status.find_vrf) result_fail = check_vrf_status.find_vrf(task_fail) assert result_fail.failed is True task_true = create_fake_task(cisco_output, vendor_vars['Cisco Nexus'], 'Lasers', 'nxos', check_vrf_status.find_vrf) result_true = check_vrf_status.find_vrf(task_true) assert result_true.failed is False huawei_output = get_file_contents('huawei_show_vrf.txt') task_fail = create_fake_task(huawei_output, vendor_vars['Huawei CE'], 'Galaxy', 'huawei_vrpv8', check_vrf_status.find_vrf) result_fail = check_vrf_status.find_vrf(task_fail) assert result_fail.failed is True task_true = create_fake_task(huawei_output, vendor_vars['Huawei CE'], 'Lasers', 'huawei_vrpv8', check_vrf_status.find_vrf) result_true = check_vrf_status.find_vrf(task_true) assert result_true.failed is False
def test_get_vrf_interfaces(set_vendor_vars): vendor_vars = set_vendor_vars cisco_output_interfaces_true = get_file_contents( 'cisco_vrf_interfaces_present.txt') task_cisco_yes_int = create_fake_task(cisco_output_interfaces_true, vendor_vars['Cisco Nexus'], 'Star', 'nxos', check_vrf_status.get_vrf_interfaces) check_vrf_status.get_vrf_interfaces(task_cisco_yes_int) assert len(task_cisco_yes_int.host['interfaces']) == 3 cisco_output_interfaces_false = get_file_contents( 'cisco_vrf_interfaces_absent.txt') task_cisco_no_int = create_fake_task(cisco_output_interfaces_false, vendor_vars['Cisco Nexus'], 'Star', 'nxos', check_vrf_status.get_vrf_interfaces) result = check_vrf_status.get_vrf_interfaces(task_cisco_no_int) assert len(task_cisco_no_int.host['interfaces']) == 0 assert result.failed is True huawei_output_interfaces_true = get_file_contents( 'huawei_vrf_interfaces_present.txt') task_huawei_yes_int = create_fake_task(huawei_output_interfaces_true, vendor_vars['Huawei CE'], 'Star', 'huawei_vrpv8', check_vrf_status.get_vrf_interfaces) check_vrf_status.get_vrf_interfaces(task_huawei_yes_int) assert len(task_huawei_yes_int.host['interfaces']) == 2 huawei_output_interfaces_false = get_file_contents( 'huawei_vrf_interfaces_absent.txt') task_huawei_no_int = create_fake_task(huawei_output_interfaces_false, vendor_vars['Huawei CE'], 'Star', 'huawei_vrpv8', check_vrf_status.get_vrf_interfaces) result = check_vrf_status.get_vrf_interfaces(task_huawei_no_int) assert len(task_huawei_no_int.host['interfaces']) == 0 assert result.failed is True task_huawei_no_int.host.platform = 'eos' with pytest.raises(UnsupportedNOS): check_vrf_status.get_vrf_interfaces(task_huawei_no_int)
def create_test_interfaces(interface_names, output, vendor_vars, vrf_name, nos, operation, file_prefix, effect_outputs=None, attr_map=None): '''Combine create_fake_task with prepare_interfaces helper functions to produce task/host filled with interfaces, execute task and return list of interfaces back. Arguments: * interface_names - list of interface names * output - string with CLI output of some command, if we need single output * vendor_vars - dict with NOS CLI commands * vrf_name - name of VRF to test upon * nos - NOS name * operation - instance of nornir.core.task.Task which we will test * file_prefix - prefix to find file names to produce different host outputs, if we need more than one * effect_outputs (defaults to None) - list of outputs ready to be used as mock side effect * attr_map (defaults to None) - dict, which maps interface names to set of attributes and corresponding values. This values must be applied to interface objects before executing task. Returns: * list of utils.switch_objects.SwitchInterface associated with task host ''' if file_prefix: outputs = [] for interface in interface_names: name = interface_name_to_file_name(interface) file_name = file_prefix + name + '.txt' outputs.append(get_file_contents(file_name)) elif effect_outputs: outputs = effect_outputs else: outputs = None fake_task = create_fake_task(output, vendor_vars, vrf_name, nos, operation, outputs) test_interfaces = prepare_interfaces(fake_task, interface_names) if attr_map: for interface in test_interfaces: if interface.name in attr_map: for key, value in attr_map[interface.name].items(): setattr(interface, key, value) operation(fake_task) return test_interfaces
def test_get_interfaces_macs(set_vendor_vars): vendor_vars = set_vendor_vars cisco_no_mac_int_task = create_fake_task( get_file_contents('cisco_show_mac_table_int_eth1_15.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_mac_table.get_interfaces_macs) check_mac_table.get_interfaces_macs(cisco_no_mac_int_task, interface_list=['Ethernet1/15']) assert cisco_no_mac_int_task.host['interfaces'][0].macs_learned == 0 cisco_svi_task = create_fake_task( get_file_contents('cisco_show_mac_table_vlan412.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_mac_table.get_interfaces_macs) check_mac_table.get_interfaces_macs(cisco_svi_task, interface_list=['Vlan412']) assert cisco_svi_task.host['interfaces'][0].macs_learned == 3 huawei_no_mac_svi_task = create_fake_task( get_file_contents('huawei_show_mac_table_vlan515.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_mac_table.get_interfaces_macs) check_mac_table.get_interfaces_macs(huawei_no_mac_svi_task, interface_list=['Vlanif515']) assert huawei_no_mac_svi_task.host['interfaces'][0].macs_learned == 0 huawei_int_task = create_fake_task( get_file_contents('huawei_show_mac_table_int_10ge1_0_28.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_mac_table.get_interfaces_macs) check_mac_table.get_interfaces_macs(huawei_int_task, interface_list=['10GE1/0/28']) assert huawei_int_task.host['interfaces'][0].macs_learned == 4 routing_int_task = create_fake_task(None, vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_mac_table.get_interfaces_macs) routing_int_task.host['interfaces'] = [ SwitchInterface('100GE1/0/1', mode='routed') ] check_mac_table.get_interfaces_macs(routing_int_task) assert routing_int_task.host['interfaces'][0].macs_learned == 0
def test_get_interfaces_vrf_binding_cisco(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Vlan215': { 'vrf': 'Star' }, 'Ethernet1/31.200': { 'vrf': 'World' }, 'Ethernet1/32.144': { 'vrf': 'World' }, 'Vlan1222': { 'vrf': 'Galaxy' }, 'Vlan1': { 'vrf': 'default' }, 'Ethernet1/26': { 'vrf': 'default' }, 'mgmt0': { 'vrf': 'management' }, 'Ethernet1/5/3': { 'vrf': None } } mode_map = { 'Ethernet1/26': { 'mode': 'routed' }, 'Ethernet1/5/3': { 'mode': 'routed' }, 'mgmt0': { 'mode': 'routed' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('cisco_show_vrf_interfaces_all.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.get_interfaces_vrf_binding, None, attr_map=mode_map) do_interface_checks(interfaces, interface_objects)
def test_find_lag_hierarchy_huawei_no_lag(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '40GE1/0/18': { 'member': None }, '40GE1/0/5': { 'member': None }, } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('huawei_show_int_brief_no_lag.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.find_lag_hierarchy, None) do_interface_checks(interfaces, interface_objects)
def test_find_lag_hierarchy_cisco_no_lag(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Ethernet1/31': { 'member': None }, 'Ethernet1/32': { 'member': None } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('cisco_show_int_brief_no_lag.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.find_lag_hierarchy, None) do_interface_checks(interfaces, interface_objects)
def test_find_rx_power_single_lane_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '10GE1/0/1': { 'rx_power': -1.94, 'optical_lanes': 1, 'ddm': True, 'module_type': '10GBASE-SR', 'transceiver': 'OEM GPP-85192-SRC' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('huawei_show_int_10ge1_0_1_transceiver_verbose.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_transceiver_stats, None) do_interface_checks(interfaces, interface_objects)
def test_get_interfaces_vrf_binding_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'Vlanif334': { 'vrf': 'Star' }, 'Vlanif422': { 'vrf': 'Star' }, '100GE1/0/4.215': { 'vrf': 'Star' }, '100GE1/0/6': { 'vrf': 'Star' }, 'Vlanif516': { 'vrf': 'Galaxy' }, '10GE1/0/32': { 'vrf': 'Galaxy' }, '10GE1/0/5:4': { 'vrf': None } } mode_map = { '100GE1/0/6': { 'mode': 'routed' }, '10GE1/0/32': { 'mode': 'routed' }, '10GE1/0/5:4': { 'mode': 'routed' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('huawei_show_vrf_interfaces_all.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_interfaces_vrf_binding, None, attr_map=mode_map) do_interface_checks(interfaces, interface_objects)
def test_find_rx_power_dom_yes_but_no_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '100GE5/0/0': { 'rx_power': None, 'optical_lanes': None, 'ddm': True, 'module_type': '100GBASE-SR4', 'transceiver': 'NETWELL NW-QSFP28-SR4' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents( 'huawei_show_int_100ge5_0_0_transceiver_verbose.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_transceiver_stats, None) do_interface_checks(interfaces, interface_objects)
def test_find_rx_power_no_dom_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '100GE5/0/8': { 'rx_power': None, 'optical_lanes': None, 'ddm': False, 'module_type': '40GBASE-BIDI', 'transceiver': 'CISCO-AVAGO AFBR-79EBPZ-CS2' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents( 'huawei_show_int_100ge5_0_8_transceiver_verbose.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_transceiver_stats, None) do_interface_checks(interfaces, interface_objects)
def test_find_rx_power_multi_lane_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { '40GE1/0/15': { 'rx_power': [-2.90, -2.52, -2.34, -2.44], 'optical_lanes': 4, 'ddm': True, 'module_type': '40GBASE-SR4', 'transceiver': 'FINISAR CORP FTL410QE3C' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents( 'huawei_show_int_40ge1_0_15_transceiver_verbose.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_transceiver_stats, None) do_interface_checks(interfaces, interface_objects)
def get_ip_outputs(interfaces, vendor, pad=''): '''Get different file contents for commands that imply both IPv4 and IPv6 for list of interfaces. Little helper to open up different files. Arguments: * interfaces - list of interface names * vendor - lower case vendor name to use in file names * pad (defaults to '') - additional field to insert into file name Returns: * list of file contents outputs ''' outputs = [] for interface in interfaces: name = interface_name_to_file_name(interface) file_names = [ vendor + '_show_ipv' + x + pad + '_int_' + name + '.txt' for x in ('4', '6') ] outputs.extend([get_file_contents(x) for x in file_names]) return outputs
def test_find_lag_hierarchy_cisco(set_vendor_vars): vendor_vars = set_vendor_vars interfaces = { 'port-channel1': { 'members': ['Ethernet1/32'] }, 'port-channel2': { 'members': ['Ethernet1/31'] }, 'Ethernet1/31': { 'member': 'port-channel2' }, 'Ethernet1/32': { 'member': 'port-channel1' } } interface_objects = create_test_interfaces( interfaces.keys(), get_file_contents('cisco_show_int_brief.txt'), vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.find_lag_hierarchy, None) do_interface_checks(interfaces, interface_objects)
def test_check_arbitrary_interface(set_vendor_vars): vendor_vars = set_vendor_vars interface = ['40GE1/0/32:4'] fake_task = create_fake_task( get_file_contents('huawei_show_int_brief.txt'), vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.check_interfaces_status) check_interfaces.check_interfaces_status(fake_task, interface_list=interface) assert fake_task.host['interfaces'][0].admin_status == 'up' assert fake_task.host['interfaces'][0].oper_status == 'down' outputs = get_ip_outputs(interface, 'huawei') fake_task = create_fake_task(None, vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.get_interfaces_ip_addresses, effect=outputs) check_interfaces.get_interfaces_ip_addresses(fake_task, interface_list=interface) assert len(fake_task.host['interfaces'][0].ipv4_addresses) == 0 assert len(fake_task.host['interfaces'][0].ipv6_addresses) == 3
def test_sanitize_interface_list_cisco(set_vendor_vars): vendor_vars = set_vendor_vars interface_names = [ 'Ethernet1/3/1', 'Ethernet1/31.3000', 'port-channel2', 'Vlan741' ] outputs = [] for interface in interface_names: name = interface_name_to_file_name(interface) file_name = 'cisco_show_int_' + name + '.txt' outputs.append(get_file_contents(file_name)) # add incorrect interface interface_names.insert(2, 'etoh1/3/2') outputs.insert(2, '''"^\nInvalid interface format at '^' marker."''') task = create_fake_task(None, vendor_vars['Cisco Nexus'], None, 'nxos', check_interfaces.sanitize_interface_list, effect=outputs) check_interfaces.sanitize_interface_list(task, ', '.join(interface_names)) assert len(task.host['interfaces']) == 4 assert 'Ethernet1/3/2' not in [x.name for x in task.host['interfaces']] assert 'Vlan741' in [x.name for x in task.host['interfaces']]
def test_sanitize_interface_list_huawei(set_vendor_vars): vendor_vars = set_vendor_vars interface_names = [ '40GE1/0/2:1', '10GE1/0/2.3013', 'Eth-Trunk0', 'Vlanif761' ] outputs = [] for interface in interface_names: name = interface_name_to_file_name(interface) file_name = 'huawei_show_int_' + name + '.txt' outputs.append(get_file_contents(file_name)) # add incorrect interface interface_names.insert(2, '24GE1/77') outputs.insert(2, '''"^\nError: Wrong parameter found at '^' position."''') task = create_fake_task(None, vendor_vars['Huawei CE'], None, 'huawei_vrpv8', check_interfaces.sanitize_interface_list, effect=outputs) check_interfaces.sanitize_interface_list(task, ', '.join(interface_names)) assert len(task.host['interfaces']) == 4 assert '24GE1/77' not in [x.name for x in task.host['interfaces']] assert 'Eth-Trunk0' in [x.name for x in task.host['interfaces']]