def test_auth_password(self, mock_auth_password): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(None) obj._auth('user', 'password', [], False, True) self.assertEqual(mock_auth_password.call_args_list[0][0], ('user', 'password'))
def test_auth_exception(self, mock_auth_password): mock_auth_password.side_effect = Exception device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth, 'user', 'password', [], False, True)
def test_auth_exception(self, mock_auth_password): mock_auth_password.side_effect = Exception device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth, 'user', 'password', [], False, True)
def test_load_host_key_IOError(self, mock_load, mock_os): mock_os.return_value = "file_name" mock_load.side_effect = IOError device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.load_known_hosts() mock_load.assert_called_with("file_name")
def test_auth_keyfiles_exception(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.side_effect = paramiko.ssh_exception.PasswordRequiredException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, ["key_file_name"], False, True)
def test_auth_keyfiles_exception(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.side_effect = paramiko.ssh_exception.PasswordRequiredException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, ["key_file_name"], False, True)
def test_auth_agent_exception(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.return_value = [key] mock_auth_public_key.side_effect = paramiko.ssh_exception.AuthenticationException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], True, False)
def test_auth_password(self, mock_auth_password): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._auth('user', 'password', [], False, True) self.assertEqual( mock_auth_password.call_args_list[0][0], ('user', 'password'))
def test_run_recieve(self, mock_error, mock_select, mock_recv, mock_close): mock_select.return_value = True, None, None mock_recv.return_value = 0 device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._channel = paramiko.Channel("c100") obj.run() self.assertTrue( isinstance(mock_error.call_args_list[0][0][0], SessionCloseError))
def test_auth_agent_exception(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.return_value = [key] mock_auth_public_key.side_effect = paramiko.ssh_exception.AuthenticationException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], True, False)
def test_close(self, mock_close): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._transport.active = True obj._connected = True obj.close() mock_close.assert_called_once_with() self.assertFalse(obj._connected)
def test_auth_keyfiles(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.return_value = key device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._auth('user', 'password', ["key_file_name"], False, True) self.assertEqual( (mock_auth_public_key.call_args_list[0][0][1]).__repr__(), key.__repr__())
def test_auth_agent(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey(msg="hello") mock_get_key.return_value = [key] device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._auth('user', 'password', [], True, True) self.assertEqual( (mock_auth_public_key.call_args_list[0][0][1]).__repr__(), key.__repr__())
def test_ssh_known_hosts(self, mock_auth, mock_pc, mock_transport, mock_hk, mock_os, mock_hex): mock_os.return_value = "file_name" hk_inst = MagicMock(check=MagicMock(return_value=True)) mock_hk.return_value = hk_inst device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.connect(host='h', sock=MagicMock()) hk_inst.load.assert_called_once_with('file_name') mock_os.assert_called_once_with('~/.ssh/known_hosts')
def test_auth_default_keyfiles_exception(self, mock_get_key, mock_auth_public_key, mock_is_file): key = paramiko.PKey() mock_is_file.return_value = True mock_get_key.side_effect = paramiko.ssh_exception.PasswordRequiredException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(None) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], False, True)
def test_auth_default_keyfiles_exception(self, mock_get_key, mock_auth_public_key, mock_is_file): key = paramiko.PKey() mock_is_file.return_value = True mock_get_key.side_effect = paramiko.ssh_exception.PasswordRequiredException device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(None) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], False, True)
def test_auth_agent(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey(msg="hello") mock_get_key.return_value = [key] device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._auth('user', 'password', [], True, True) self.assertEqual( (mock_auth_public_key.call_args_list[0][0][1]).__repr__(), key.__repr__())
def test_auth_keyfiles(self, mock_get_key, mock_auth_public_key): key = paramiko.PKey() mock_get_key.return_value = key device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._auth('user', 'password', ["key_file_name"], False, True) self.assertEqual( (mock_auth_public_key.call_args_list[0][0][1]).__repr__(), key.__repr__())
def test_run_send(self, mock_error, mock_send, mock_ready, mock_close): mock_ready.return_value = True mock_send.return_value = -1 device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._channel = paramiko.Channel("c100") obj._q.put("rpc") obj.run() self.assertEqual(mock_send.call_args_list[0][0][0], "rpc") self.assertTrue( isinstance(mock_error.call_args_list[0][0][0], SessionCloseError))
def test_run_receive_py2(self, mock_error, mock_selector, mock_recv, mock_close): mock_selector.select.return_value = True mock_recv.return_value = 0 device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._channel = paramiko.Channel("c100") obj.run() self.assertTrue( isinstance( mock_error.call_args_list[0][0][0], SessionCloseError))
def test_run_send(self, mock_error, mock_send, mock_ready, mock_close): mock_ready.return_value = True mock_send.return_value = -1 device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._channel = paramiko.Channel("c100") obj._q.put("rpc") obj.run() self.assertEqual(mock_send.call_args_list[0][0][0], "rpc") self.assertTrue( isinstance( mock_error.call_args_list[0][0][0], SessionCloseError))
def __init__(self, device_handler): SSHSession.__init__(self, device_handler) self._host_keys = None self._transport = None self._connected = False self._channel = None self._channel_id = None self._channel_name = None self._buffer = StringIO() # for incoming data # parsing-related, see _parse() self._parsing_state = 0 self._parsing_pos = 0 self._device_handler = device_handler
def test_ssh_known_hosts_2(self, mock_auth, mock_pc, mock_sshc, mock_transport, mock_hk, mock_os, mock_open, mock_hex): mock_os.return_value = "file_name" hk_inst = MagicMock(check=MagicMock(return_value=True)) mock_hk.return_value = hk_inst config = {'userknownhostsfile': 'known_hosts_file'} mock_sshc.return_value = MagicMock(lookup=lambda _h: config) device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.connect(host='h', sock=MagicMock(), ssh_config=True) hk_inst.load.assert_called_once_with('file_name') mock_os.mock_calls == [call('~/.ssh/config'), call('known_hosts_file')]
def __init__(self, device_handler): SSHSession.__init__(self, device_handler) self._host_keys = None self._transport = None self._connected = False self._channel = None self._channel_id = None self._channel_name = None self._buffer = StringIO() # for incoming data # parsing-related, see _parse() self._parsing_state = 0 self._parsing_pos = 0 self._device_handler = device_handler
def test_filter_xml_sax_on_junos_rfc_compliant(self, mock_uuid4, mock_select, mock_session, mock_recv, mock_close, mock_send, mock_send_ready, mock_connected): mock_send.return_value = True mock_send_ready.return_value = -1 mock_uuid4.return_value = type( 'dummy', (), {'urn': "urn:uuid:e0a7abe3-fffa-11e5-b78e-b8e85604f858"}) device_handler = manager.make_device_handler({ 'name': 'junos', 'use_filter': True }) rpc = '<get-software-information/>' mock_recv.side_effect = self._read_file('get-software-information.xml') session = SSHSession(device_handler) session._connected = True session._channel = paramiko.Channel("c100") session.parser = session._device_handler.get_xml_parser(session) obj = ExecuteRpc(session, device_handler, raise_mode=RaiseMode.ALL) obj._filter_xml = '<multi-routing-engine-results><multi-routing-engine-item><re-name/></multi-routing-engine-item></multi-routing-engine-results>' session.run() resp = obj.request(rpc)._NCElement__doc[0] from lxml import etree print(resp) self.assertEqual(len(resp.xpath('multi-routing-engine-item/re-name')), 2) # as filter_xml is not having software-information, response wont contain it self.assertEqual( len(resp.xpath('multi-routing-engine-item/software-information')), 0)
def test_use_filter_xml_without_sax_input(self, mock_uuid4, mock_select, mock_session, mock_recv, mock_close, mock_send, mock_send_ready, mock_connected): mock_send.return_value = True mock_send_ready.return_value = -1 mock_uuid4.return_value = type( 'dummy', (), {'urn': "urn:uuid:e0a7abe3-fffa-11e5-b78e-b8e85604f858"}) device_handler = manager.make_device_handler({ 'name': 'junos', 'use_filter': True }) rpc = '<get-software-information/>' mock_recv.side_effect = self._read_file('get-software-information.xml') session = SSHSession(device_handler) session._connected = True session._channel = paramiko.Channel("c100") session.parser = session._device_handler.get_xml_parser(session) obj = ExecuteRpc(session, device_handler, raise_mode=RaiseMode.ALL) obj._filter_xml = None session.run() resp = obj.request(rpc)._NCElement__doc[0] self.assertEqual(len(resp.xpath('multi-routing-engine-item/re-name')), 2) self.assertEqual( len(resp.xpath('multi-routing-engine-item/software-information')), 2)
def test_parse_incomplete_delimiter(self, mock_dispatch): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) if sys.version >= "3.0": b = bytes(rpc_reply_part_1, "utf-8") obj._buffer.write(b) obj._parse() self.assertFalse(mock_dispatch.called) b = bytes(rpc_reply_part_2, "utf-8") obj._buffer.write(b) obj._parse() self.assertTrue(mock_dispatch.called) else: obj._buffer.write(rpc_reply_part_1) obj._parse() self.assertFalse(mock_dispatch.called) obj._buffer.write(rpc_reply_part_2) obj._parse() self.assertTrue(mock_dispatch.called)
def _test_parsemethod(self, mock_dispatch, parsemethod, reply, ok_chunk): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) if sys.version >= "3.0": obj._buffer.write(bytes(reply, "utf-8")) remainder = bytes(ok_chunk, "utf-8") else: obj._buffer.write(reply) remainder = ok_chunk parsemethod(obj) call = mock_dispatch.call_args_list[0][0][0] self.assertEqual(call, reply_data) self.assertEqual(obj._buffer.getvalue(), remainder)
def test_parse_incomplete_delimiter(self, mock_dispatch): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) if sys.version >= "3.0": b = bytes(rpc_reply_part_1, "utf-8") obj._buffer.write(b) obj._parse() self.assertFalse(mock_dispatch.called) b = bytes(rpc_reply_part_2, "utf-8") obj._buffer.write(b) obj._parse() self.assertTrue(mock_dispatch.called) else: obj._buffer.write(rpc_reply_part_1) obj._parse() self.assertFalse(mock_dispatch.called) obj._buffer.write(rpc_reply_part_2) obj._parse() self.assertTrue(mock_dispatch.called)
def test_close(self, mock_close): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) obj._transport.active = True obj._connected = True obj.close() mock_close.assert_called_once_with() self.assertFalse(obj._connected)
def test_parse11(self, mock_dispatch): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) if sys.version >= "3.0": obj._buffer.write(bytes(rpc_reply11, "utf-8")) remainder = bytes(reply_ok_partial_chunk, "utf-8") else: obj._buffer.write(rpc_reply11) remainder = reply_ok_partial_chunk obj.parser._parse11() expected_messages = [reply_data, reply_ok] for i in range(0, len(expected_messages)): call = mock_dispatch.call_args_list[i][0][0] self.assertEqual(call, expected_messages[i]) self.assertEqual(obj._buffer.getvalue(), remainder)
def _test_run_send_py3(self, base, chunker, mock_error, mock_selector, mock_send, mock_ready, mock_close): mock_selector.return_value = False mock_ready.return_value = True mock_send.return_value = -1 device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._channel = paramiko.Channel("c100") msg = "naïve garçon" obj._q.put(msg) obj._base = base obj.run() self.assertEqual(mock_send.call_args_list[0][0][0], chunker(msg)) self.assertTrue( isinstance(mock_error.call_args_list[0][0][0], SessionCloseError))
def _test_parsemethod(self, mock_dispatch, parsemethod, reply, ok_chunk, expected_messages): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) if sys.version >= "3.0": obj._buffer.write(bytes(reply, "utf-8")) remainder = bytes(ok_chunk, "utf-8") else: obj._buffer.write(reply) remainder = ok_chunk # parse the main reply parsemethod(obj) # parse the ok parsemethod(obj) for i in range(0, len(expected_messages)): call = mock_dispatch.call_args_list[i][0][0] self.assertEqual(call, expected_messages[i]) self.assertEqual(obj._buffer.getvalue(), remainder)
def test_auth_no_methods_exception(self): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], False, False)
def test_load_host_key(self, mock_load): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.load_known_hosts("file_name") mock_load.assert_called_once_with("file_name")
def test_auth_no_methods_exception(self): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj._transport = paramiko.Transport(MagicMock()) self.assertRaises(AuthenticationError, obj._auth,'user', None, [], False, False)
def test_filter_xml_delimiter_multiple_rpc_in_parallel( self, mock_uuid4, mock_select, mock_session, mock_recv, mock_close, mock_send, mock_send_ready, mock_connected): mock_send.return_value = True mock_send_ready.return_value = -1 mock_uuid4.side_effect = [ type('xyz', (), {'urn': "urn:uuid:ddef40cb-5745-481d-974d-7188f9f2bb33"}), type('pqr', (), {'urn': "urn:uuid:549ef9d1-024a-4fd0-88bf-047d25f0870d"}) ] device_handler = manager.make_device_handler({ 'name': 'junos', 'use_filter': True }) rpc = '<get-software-information/>' mock_recv.side_effect = [ b""" <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/19.2I0/junos" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:ddef40cb-5745-481d-974d-7188f9f2bb33"> <ospf-neighbor-information xmlns="http://xml.juniper.net/junos/19.2I0/junos-routing"> <ospf-neighbor> <neighbor-address>13.1.1.2</neighbor-address> <interface-name>ge-0/0/0.1</interface-name> <ospf-neighbor-state>Exchange</ospf-neighbor-state> <neighbor-id>2.2.2.2</neighbor-id> <neighbor-priority>128</neighbor-priority> <activity-timer>36</activity-timer> <ospf-area>0.0.0.0</ospf-area> <options>0x52</options> <dr-address>13.1.1.1</dr-address> <bdr-address>13.1.1.2</bdr-address> <neighbor-up-time junos:seconds="17812"> 04:56:52 </neighbor-up-time> <neighbor-adjacency-time junos:seconds="17812"> 04:56:52 </neighbor-adjacency-time> <master-slave>slave</master-slave> <sequence-number>0x204b6fd</sequence-number> <dbd-retransmit-time>3</dbd-retransmit-time> <lsreq-retransmit-time>0</lsreq-retransmit-time> <lsa-list> Link state retransmission list: Type LSA ID Adv rtr Seq Router 1.1.1.1 1.1.1.1 0x80000019 OpaqArea 1.0.0.1 1.1.1.1 0x80000011 Router 3.3.3.3 3.3.3.3 0x80000004 Network 23.1.1.2 3.3.3.3 0x80000001 OpaqArea 1.0.0.1 2.2.2.2 0x80000002 OpaqArea 1.0.0.1 3.3.3.3 0x80000002 OpaqArea 1.0.0.3 1.1.1.1 0x80000002 OpaqArea 1.0.0.3 3.3.3.3 0x80000001 OpaqArea 1.0.0.4 2.2.2.2 0x80000001 </lsa-list> <ospf-neighbor-topology> <ospf-topology-name>default</ospf-topology-name> <ospf-topology-id>0</ospf-topology-id> <ospf-neighbor-topology-state>Forward Only</ospf-neighbor-topology-state> </ospf-neighbor-topology> </ospf-neighbor> </ospf-neighbor-information> </rpc-reply>]]>]]><rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/19.2I0/junos" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:549ef9d1-024a-4fd0-88bf-047d25f0870d"> <pfe-statistics> <pfe-traffic-statistics> <pfe-input-packets>22450</pfe-input-packets> <input-pps>0</input-pps> <pfe-output-packets>31992</pfe-output-packets> <output-pps>0</output-pps> <pfe-fabric-input>0</pfe-fabric-input> <pfe-fabric-input-pps>0</pfe-fabric-input-pps> <pfe-fabric-output>0</pfe-fabric-output> <pfe-fabric-output-pps>0</pfe-fabric-output-pps> </pfe-traffic-statistics></pfe-statistics></rpc-reply>]]>]]>""" ] session = SSHSession(device_handler) session._connected = True session._channel = paramiko.Channel("c100") session.parser = session._device_handler.get_xml_parser(session) obj = ExecuteRpc(session, device_handler, raise_mode=RaiseMode.ALL) obj = ExecuteRpc(session, device_handler, raise_mode=RaiseMode.ALL) obj._filter_xml = '<multi-routing-engine-results><multi-routing-engine-item><re-name/></multi-routing-engine-item></multi-routing-engine-results>' session.run() resp = obj.request(rpc)._NCElement__doc[0] self.assertEqual(len(resp.xpath('pfe-traffic-statistics')), 1)
def test_load_host_key(self, mock_load): device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.load_known_hosts("file_name") mock_load.assert_called_once_with("file_name")
def test_load_host_key_2(self, mock_load, mock_os): mock_os.return_value = "file_name" device_handler = JunosDeviceHandler({'name': 'junos'}) obj = SSHSession(device_handler) obj.load_known_hosts() mock_load.assert_called_once_with("file_name")