# -*- coding: utf-8 -*- ''' Base classes for napalm unit tests :codeauthor: :email:`Anthony Shaw ` ''' from __future__ import absolute_import from functools import wraps TEST_INTERFACES = { 'Management1': { 'is_up': False, 'is_enabled': False, 'description': u'', 'last_flapped': -1, 'speed': 1000, 'mac_address': u'dead:beef:dead', } } # Test data TEST_FACTS = { '__opts__': {}, 'OPTIONAL_ARGS': {}, 'uptime': 'Forever', 'UP': True, 'HOSTNAME': 'test-device.com', 'hostname': 'test-device.com', 'username': 'admin', 'os_version': '1.2.3', 'model': 'test_model', 'serial_number': '123456', 'vendor': 'cisco', 'interface_list': TEST_INTERFACES } TEST_ENVIRONMENT = { 'hot': 'yes' } TEST_COMMAND_RESPONSE = { 'show run': 'all the command output' } TEST_TRACEROUTE_RESPONSE = { 'success': { 1: { 'probes': { 1: { 'rtt': 1.123, 'ip_address': u'206.223.116.21', 'host_name': u'eqixsj-google-gige.google.com' } } } } } TEST_PING_RESPONSE = { 'success': { 'probes_sent': 5, 'packet_loss': 0, 'rtt_min': 72.158, 'rtt_max': 72.433, 'rtt_avg': 72.268, 'rtt_stddev': 0.094, 'results': [ { 'ip_address': '1.1.1.1', 'rtt': 72.248 } ] } } TEST_ARP_TABLE = [ { 'interface': 'MgmtEth0/RSP0/CPU0/0', 'mac': '5C:5E:AB:DA:3C:F0', 'ip': '172.17.17.1', 'age': 1454496274.84 } ] TEST_IPADDRS = { 'FastEthernet8': { 'ipv4': { '10.66.43.169': { 'prefix_length': 22 } } } } TEST_INTERFACES = { 'Management1': { 'is_up': False, 'is_enabled': False, 'description': u'', 'last_flapped': -1, 'speed': 1000, 'mac_address': u'dead:beef:dead', } } TEST_LLDP_NEIGHBORS = { u'Ethernet2': [ { 'hostname': u'junos-unittest', 'port': u'520', } ] } TEST_MAC_TABLE = [ { 'mac': '00:1C:58:29:4A:71', 'interface': 'Ethernet47', 'vlan': 100, 'static': False, 'active': True, 'moves': 1, 'last_move': 1454417742.58 } ] TEST_RUNNING_CONFIG = { 'one': 'two' } TEST_OPTICS = { 'et1': { 'physical_channels': { 'channel': [ { 'index': 0, 'state': { 'input_power': { 'instant': 0.0, 'avg': 0.0, 'min': 0.0, 'max': 0.0, }, 'output_power': { 'instant': 0.0, 'avg': 0.0, 'min': 0.0, 'max': 0.0, }, 'laser_bias_current': { 'instant': 0.0, 'avg': 0.0, 'min': 0.0, 'max': 0.0, }, } } ] } } } TEST_BGP_CONFIG = { 'test': 'value' } TEST_BGP_NEIGHBORS = { 'default': { 8121: [ { 'up': True, 'local_as': 13335, 'remote_as': 8121, 'local_address': u'172.101.76.1', 'local_address_configured': True, 'local_port': 179, 'remote_address': u'192.247.78.0', 'router_id': u'192.168.0.1', 'remote_port': 58380, 'multihop': False, 'import_policy': u'4-NTT-TRANSIT-IN', 'export_policy': u'4-NTT-TRANSIT-OUT', 'input_messages': 123, 'output_messages': 13, 'input_updates': 123, 'output_updates': 5, 'messages_queued_out': 23, 'connection_state': u'Established', 'previous_connection_state': u'EstabSync', 'last_event': u'RecvKeepAlive', 'suppress_4byte_as': False, 'local_as_prepend': False, 'holdtime': 90, 'configured_holdtime': 90, 'keepalive': 30, 'configured_keepalive': 30, 'active_prefix_count': 132808, 'received_prefix_count': 566739, 'accepted_prefix_count': 566479, 'suppressed_prefix_count': 0, 'advertise_prefix_count': 0, 'flap_count': 27 } ] } } TEST_TERM_CONFIG = { 'result': True, 'already_configured': False } TEST_NTP_PEERS = { '192.168.0.1': 1, '172.17.17.1': 2, '172.17.17.2': 3, '2400:cb00:6:1024::c71b:840a': 4 } TEST_NTP_SERVERS = { '192.168.0.1': 1, '172.17.17.1': 2, '172.17.17.2': 3, '2400:cb00:6:1024::c71b:840a': 4 } TEST_NTP_STATS = [ { 'remote': u'188.114.101.4', 'referenceid': u'188.114.100.1', 'synchronized': True, 'stratum': 4, 'type': u'-', 'when': u'107', 'hostpoll': 256, 'reachability': 377, 'delay': 164.228, 'offset': -13.866, 'jitter': 2.695 } ] TEST_PROBES_CONFIG = { 'probe1': { 'test1': { 'probe_type': 'icmp-ping', 'target': '192.168.0.1', 'source': '192.168.0.2', 'probe_count': 13, 'test_interval': 3 }, 'test2': { 'probe_type': 'http-ping', 'target': '172.17.17.1', 'source': '192.17.17.2', 'probe_count': 5, 'test_interval': 60 } } } TEST_PROBES_RESULTS = { 'probe1': { 'test1': { 'last_test_min_delay': 63.120, 'global_test_min_delay': 62.912, 'current_test_avg_delay': 63.190, 'global_test_max_delay': 177.349, 'current_test_max_delay': 63.302, 'global_test_avg_delay': 63.802, 'last_test_avg_delay': 63.438, 'last_test_max_delay': 65.356, 'probe_type': 'icmp-ping', 'rtt': 63.138, 'last_test_loss': 0, 'round_trip_jitter': -59.0, 'target': '192.168.0.1', 'source': '192.168.0.2', 'probe_count': 15, 'current_test_min_delay': 63.138 }, 'test2': { 'last_test_min_delay': 176.384, 'global_test_min_delay': 169.226, 'current_test_avg_delay': 177.098, 'global_test_max_delay': 292.628, 'current_test_max_delay': 180.055, 'global_test_avg_delay': 177.959, 'last_test_avg_delay': 177.178, 'last_test_max_delay': 184.671, 'probe_type': 'icmp-ping', 'rtt': 176.449, 'last_test_loss': 0, 'round_trip_jitter': -34.0, 'target': '172.17.17.1', 'source': '172.17.17.2', 'probe_count': 15, 'current_test_min_delay': 176.402 } } } TEST_ROUTE = { '172.16.0.0/25': [ { 'protocol': 'BGP', 'last_active': True, 'current_active': True, 'age': 1178693, 'routing_table': 'inet.0', 'next_hop': '192.168.0.11', 'outgoing_interface': 'xe-1/1/1.100', 'preference': 170, 'selected_next_hop': False, 'protocol_attributes': { 'remote_as': 65001, 'metric': 5, 'local_as': 13335, 'as_path': '', 'remote_address': '192.168.0.11', 'metric2': 0, 'local_preference': 0, 'communities': [ '0:2', 'no-export' ], 'preference2': -1 }, 'inactive_reason': '' }, { 'protocol': 'BGP', 'last_active': False, 'current_active': False, 'age': 2359429, 'routing_table': 'inet.0', 'next_hop': '192.168.0.17', 'outgoing_interface': 'xe-1/1/1.100', 'preference': 170, 'selected_next_hop': True, 'protocol_attributes': { 'remote_as': 65001, 'metric': 5, 'local_as': 13335, 'as_path': '', 'remote_address': '192.168.0.17', 'metric2': 0, 'local_preference': 0, 'communities': [ '0:3', 'no-export' ], 'preference2': -1 }, 'inactive_reason': 'Not Best in its group - Router ID' } ] } TEST_SNMP_INFO = { 'test_': 'value' } TEST_USERS = { 'mircea': { 'level': 15, 'password': '$1$0P70xKPa$4jt5/10cBTckk6I/w/', 'sshkeys': [ 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4pFn+shPwTb2yELO4L7NtQrKOJXNeCl1je\ l9STXVaGnRAnuc2PXl35vnWmcUq6YbUEcgUTRzzXfmelJKuVJTJIlMXii7h2xkbQp0YZIEs4P\ 8ipwnRBAxFfk/ZcDsdfsdfsdfsdN56ejk345jhk345jk345jk341p3A/9LIL7l6YewLBCwJj6\ D+fWSJ0/YW+7oH17Fk2HH+tw0L5PcWLHkwA4t60iXn16qDbIk/ze6jv2hDGdCdz7oYQeCE55C\ CHOHMJWYfN3jcL4s0qv8/u6Ka1FVkV7iMmro7ChThoV/5snI4Ljf2wKqgHH7TfNaCfpU0WvHA\ nTs8zhOrGScSrtb mircea@master-roshi' ] } } class MockNapalmDevice(object): '''Setup a mock device for our tests''' def get_facts(self): return TEST_FACTS def get_environment(self): return TEST_ENVIRONMENT def get_arp_table(self): return TEST_ARP_TABLE def get(self, key, default=None, *args, **kwargs): try: if key == 'DRIVER': return self return TEST_FACTS[key] except KeyError: return default def cli(self, commands, *args, **kwargs): assert commands[0] == 'show run' return TEST_COMMAND_RESPONSE def traceroute(self, destination, **kwargs): assert destination == 'destination.com' return TEST_TRACEROUTE_RESPONSE def ping(self, destination, **kwargs): assert destination == 'destination.com' return TEST_PING_RESPONSE def get_config(self, retrieve='all'): assert retrieve == 'running' return TEST_RUNNING_CONFIG def get_interfaces_ip(self, **kwargs): return TEST_IPADDRS def get_interfaces(self, **kwargs): return TEST_INTERFACES def get_lldp_neighbors_detail(self, **kwargs): return TEST_LLDP_NEIGHBORS def get_mac_address_table(self, **kwargs): return TEST_MAC_TABLE def get_optics(self, **kwargs): return TEST_OPTICS def load_merge_candidate(self, filename=None, config=None): assert config == 'new config' return TEST_RUNNING_CONFIG def load_replace_candidate(self, filename=None, config=None): assert config == 'new config' return TEST_RUNNING_CONFIG def commit_config(self, **kwargs): return TEST_RUNNING_CONFIG def discard_config(self, **kwargs): return TEST_RUNNING_CONFIG def compare_config(self, **kwargs): return TEST_RUNNING_CONFIG def rollback(self, **kwargs): return TEST_RUNNING_CONFIG def get_bgp_config(self, **kwargs): return TEST_BGP_CONFIG def get_bgp_neighbors_detail(self, neighbor_address=None, **kwargs): assert neighbor_address is None or "test_address" return TEST_BGP_NEIGHBORS def get_ntp_peers(self, **kwargs): return TEST_NTP_PEERS def get_ntp_servers(self, **kwargs): return TEST_NTP_SERVERS def get_ntp_stats(self, **kwargs): return TEST_NTP_STATS def get_probes_config(self, **kwargs): return TEST_PROBES_CONFIG def get_probes_results(self, **kwargs): return TEST_PROBES_RESULTS def get_route_to(self, destination, protocol=None, **kwargs): assert destination == '1.2.3.4' return TEST_ROUTE def get_snmp_information(self, **kwargs): return TEST_SNMP_INFO def get_users(self, **kwargs): return TEST_USERS def mock_proxy_napalm_wrap(func): ''' The proper decorator checks for proxy minions. We don't care so just pass back to the origination function ''' @wraps(func) def func_wrapper(*args, **kwargs): func.__globals__['napalm_device'] = MockNapalmDevice() return func(*args, **kwargs) return func_wrapper import salt.utils.napalm as napalm_utils # NOQA napalm_utils.proxy_napalm_wrap = mock_proxy_napalm_wrap # NOQA def true(name): return True def random_hash(source, method): return 12346789 def join(*files): return True def get_managed_file(*args, **kwargs): return 'True'