def test_unregister(self, mock_unlink): """Unregister an host, check that result is changed""" mock_unlink.return_value = True set_module_args({ 'activationkey': 'key', 'username': '******', 'password': '******', 'state': 'absent', }) responses = [ ('auth.login', ['X' * 43]), ('system.deleteSystems', [1]), ('auth.logout', [1]), ] with patch.object(basic.AnsibleModule, 'run_command') as run_command: run_command.return_value = 0, '', '' # successful execution, no output mock_is_registered = PropertyMock(return_value=True) mock_systemid = PropertyMock(return_value=12345) with patch.multiple(rhn_register.Rhn, systemid=mock_systemid, is_registered=mock_is_registered): with mock_request(responses): with self.assertRaises(AnsibleExitJson) as result: self.module.main() self.assertTrue(result.exception.args[0]['changed']) self.assertFalse( responses) # all responses should have been consumed self.assertEqual(mock_systemid.call_count, 1) self.assertEqual(mock_is_registered.call_count, 1) self.assertFalse(run_command.called) self.assertEqual(mock_unlink.call_count, 1)
def test_fetch_file_retries(self, monkeypatch): monkeypatch.setattr(C, 'HOST_KEY_CHECKING', False) monkeypatch.setattr(C, 'ANSIBLE_SSH_RETRIES', 3) monkeypatch.setattr('time.sleep', lambda x: None) monkeypatch.setattr('ansible.plugins.connection.ssh.os.path.exists', lambda x: True) self.mock_popen_res.stdout.read.side_effect = [b"", b"my_stdout\n", b"second_line"] self.mock_popen_res.stderr.read.side_effect = [b"", b"my_stderr"] type(self.mock_popen_res).returncode = PropertyMock(side_effect=[255] * 4 + [0] * 4) self.mock_selector.select.side_effect = [ [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [] ] self.mock_selector.get_map.side_effect = lambda: True self.conn._build_command = MagicMock() self.conn._build_command.return_value = 'sftp' return_code, b_stdout, b_stderr = self.conn.fetch_file('/path/to/in/file', '/path/to/dest/file') assert return_code == 0 assert b_stdout == b"my_stdout\nsecond_line" assert b_stderr == b"my_stderr" assert self.mock_popen.call_count == 2
def test_retry_then_success(self, monkeypatch): monkeypatch.setattr(C, 'HOST_KEY_CHECKING', False) monkeypatch.setattr(C, 'ANSIBLE_SSH_RETRIES', 3) monkeypatch.setattr('time.sleep', lambda x: None) self.mock_popen_res.stdout.read.side_effect = [b"", b"my_stdout\n", b"second_line"] self.mock_popen_res.stderr.read.side_effect = [b"", b"my_stderr"] type(self.mock_popen_res).returncode = PropertyMock(side_effect=[255] * 3 + [0] * 4) self.mock_selector.select.side_effect = [ [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [] ] self.mock_selector.get_map.side_effect = lambda: True self.conn._build_command = MagicMock() self.conn._build_command.return_value = 'ssh' self.conn.get_option = MagicMock() self.conn.get_option.return_value = True return_code, b_stdout, b_stderr = self.conn.exec_command('ssh', 'some data') assert return_code == 0 assert b_stdout == b'my_stdout\nsecond_line' assert b_stderr == b'my_stderr'
def test_multiple_failures(self, monkeypatch): monkeypatch.setattr(C, 'HOST_KEY_CHECKING', False) monkeypatch.setattr(C, 'ANSIBLE_SSH_RETRIES', 9) monkeypatch.setattr('time.sleep', lambda x: None) self.mock_popen_res.stdout.read.side_effect = [b""] * 11 self.mock_popen_res.stderr.read.side_effect = [b""] * 11 type(self.mock_popen_res).returncode = PropertyMock(side_effect=[255] * 30) self.mock_selector.select.side_effect = [ [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [], ] * 10 self.mock_selector.get_map.side_effect = lambda: True self.conn._build_command = MagicMock() self.conn._build_command.return_value = 'ssh' pytest.raises(AnsibleConnectionFailure, self.conn.exec_command, 'ssh', 'some data') assert self.mock_popen.call_count == 10
def test_fetch_file_retries(self, os_mock, time_mock): os_mock.path.exists.return_value = True self.mock_popen_res.stdout.read.side_effect = [b"", b"my_stdout\n", b"second_line"] self.mock_popen_res.stderr.read.side_effect = [b"", b"my_stderr"] type(self.mock_popen_res).returncode = PropertyMock(side_effect=[255] * 3 + [0] * 4) self.mock_selector.select.side_effect = [ [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [] ] self.mock_selector.get_map.side_effect = lambda: True self.conn._build_command = MagicMock() self.conn._build_command.return_value = 'ssh' return_code, b_stdout, b_stderr = self.conn.fetch_file('/path/to/in/file', '/path/to/dest/file') assert return_code == 0 assert b_stdout == b"my_stdout\nsecond_line" assert b_stderr == b"my_stderr" assert self.mock_popen.call_count == 2
def test_unregister_not_registered(self, mock_unlink): """Unregister a unregistered host (systemid missing) locally, check that result is unchanged""" mock_unlink.return_value = True set_module_args({ 'activationkey': 'key', 'username': '******', 'password': '******', 'state': 'absent', }) with patch.object(basic.AnsibleModule, 'run_command') as run_command: with patch.object( rhn_register.Rhn, 'is_registered', PropertyMock(return_value=False)) as mock_is_registered: with patch( 'ansible.modules.packaging.os.rhn_register.xmlrpc_client.Transport.request' ) as req: with self.assertRaises(AnsibleExitJson) as result: self.module.main() self.assertFalse(result.exception.args[0]['changed']) self.assertFalse(req.called) self.assertEqual(mock_is_registered.call_count, 1) self.assertFalse(run_command.called) self.assertFalse(mock_unlink.called)
def test_register_parameters(self): """Registering an unregistered host""" set_module_args({ 'activationkey': 'key', 'username': '******', 'password': '******', }) responses = [ ('auth.login', ['X' * 43]), ('channel.software.listSystemChannels', [[{ 'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6' }]]), ('channel.software.setSystemChannels', [1]), ('auth.logout', [1]), ] with patch.object(basic.AnsibleModule, 'run_command') as run_command: run_command.return_value = 0, '', '' # successful execution, no output with patch.object(rhn_register.Rhn, 'systemid', PropertyMock(return_value=12345)): with mock_request(responses): with self.assertRaises(AnsibleExitJson) as result: self.module.main() self.assertTrue(result.exception.args[0]['changed']) self.assertFalse( responses) # all responses should have been consumed self.assertEqual(self.mock_enable.call_count, 1) self.mock_enable.reset_mock() self.assertEqual(run_command.call_count, 1) self.assertEqual(run_command.call_args[0][0][0], '/usr/sbin/rhnreg_ks')
def test_unregister_unknown_host(self, mock_unlink): """Unregister an unknown host (an host with a systemid available locally, check that result contains failed""" set_module_args({ 'activationkey': 'key', 'username': '******', 'password': '******', 'state': 'absent', }) responses = [ ('auth.login', ['X' * 43]), ('system.deleteSystems', xmlrpc_client.Fault( 1003, 'The following systems were NOT deleted: 123456789')), ('auth.logout', [1]), ] with patch.object(basic.AnsibleModule, 'run_command') as run_command: run_command.return_value = 0, '', '' # successful execution, no output mock_is_registered = PropertyMock(return_value=True) mock_systemid = PropertyMock(return_value=12345) with patch.multiple(rhn_register.Rhn, systemid=mock_systemid, is_registered=mock_is_registered): with mock_request(responses): with self.assertRaises(AnsibleFailJson) as result: self.module.main() self.assertTrue(result.exception.args[0]['failed']) self.assertFalse( responses) # all responses should have been consumed self.assertEqual(mock_systemid.call_count, 1) self.assertEqual(mock_is_registered.call_count, 1) self.assertFalse(run_command.called) self.assertFalse(mock_unlink.called)
def test_netconf_exec_command(self): pc = PlayContext() conn = connection_loader.get('netconf', pc, '/dev/null') conn._connected = True mock_reply = MagicMock(name='reply') type(mock_reply).data_xml = PropertyMock(return_value='<test/>') mock_manager = MagicMock(name='self._manager') mock_manager.rpc.return_value = mock_reply conn._manager = mock_manager out = conn.exec_command('<test/>') self.assertEqual('<test/>', out)
def test_netconf__connect(self): pc = PlayContext() new_stdin = StringIO() conn = netconf.Connection(pc, new_stdin) mock_manager = MagicMock(name='self._manager.connect') type(mock_manager).session_id = PropertyMock(return_value='123456789') netconf.manager.connect.return_value = mock_manager rc, out, err = conn._connect() self.assertEqual(0, rc) self.assertEqual('123456789', out) self.assertEqual('', err) self.assertTrue(conn._connected)
def test_netconf_exec_command(self): pc = PlayContext() new_stdin = StringIO() conn = netconf.Connection(pc, new_stdin) conn._connected = True mock_reply = MagicMock(name='reply') type(mock_reply).data_xml = PropertyMock(return_value='<test/>') mock_manager = MagicMock(name='self._manager') mock_manager.rpc.return_value = mock_reply conn._manager = mock_manager out = conn.exec_command('<test/>') self.assertEqual('<test/>', out)
def test_retry_then_success(self): self.mock_popen_res.stdout.read.side_effect = [b"", b"my_stdout\n", b"second_line"] self.mock_popen_res.stderr.read.side_effect = [b"", b"my_stderr"] type(self.mock_popen_res).returncode = PropertyMock(side_effect=[255] * 3 + [0] * 4) self.mock_selector.select.side_effect = [ [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stdout, 1001, [EVENT_READ], None), EVENT_READ)], [(SelectorKey(self.mock_popen_res.stderr, 1002, [EVENT_READ], None), EVENT_READ)], [] ] self.mock_selector.get_map.side_effect = lambda: True self.conn._build_command = MagicMock() self.conn._build_command.return_value = 'ssh' return_code, b_stdout, b_stderr = self.conn.exec_command('ssh', 'some data') assert return_code == 0 assert b_stdout == b'my_stdout\nsecond_line' assert b_stderr == b'my_stderr'
def test_already_registered(self): """Register an host already registered, check that result is unchanged""" set_module_args({ 'activationkey': 'key', 'username': '******', 'password': '******', }) responses = [] with patch.object(basic.AnsibleModule, 'run_command') as run_command: with patch.object( rhn_register.Rhn, 'is_registered', PropertyMock(return_value=True)) as mock_systemid: with mock_request(responses) as req: with self.assertRaises(AnsibleExitJson) as result: self.module.main() self.assertFalse(result.exception.args[0]['changed']) self.assertFalse(req.called) self.assertEqual(mock_systemid.call_count, 1) self.assertEqual(self.mock_enable.call_count, 0) self.assertFalse(run_command.called)