diff --git a/validations_libs/tests/fakes.py b/validations_libs/tests/fakes.py index fe5d9d34..8d1bdfdd 100644 --- a/validations_libs/tests/fakes.py +++ b/validations_libs/tests/fakes.py @@ -131,6 +131,70 @@ FAILED_VALIDATIONS_LOGS_CONTENTS_LIST = [{ ] }] +FAILED_VALIDATIONS_LOGS_WRONG_MSG_LIST = [{ + 'stats': { + 'undercloud': { + 'changed': 0, + 'failures': 1, + 'ignored': 0, + 'ok': 0, + 'rescued': 0, + 'skipped': 0, + 'unreachable': 0 + } + }, + 'validation_output': [ + { + "task": { + "hosts": { + "localhost": { + "_ansible_no_log": False, + "action": "fail", + "changed": False, + "failed": True, + "failed_when_result": True, + "msg": ["Fake", "Failed"] + } + }, + "name": "Verify Fake requirements", + "status": "FAILED" + } + } + ] +}] + +FAILED_VALIDATIONS_LOGS_WRONG_MSG_TYPE = [{ + 'stats': { + 'undercloud': { + 'changed': 0, + 'failures': 1, + 'ignored': 0, + 'ok': 0, + 'rescued': 0, + 'skipped': 0, + 'unreachable': 0 + } + }, + 'validation_output': [ + { + "task": { + "hosts": { + "localhost": { + "_ansible_no_log": False, + "action": "fail", + "changed": False, + "failed": True, + "failed_when_result": True, + "msg": True + } + }, + "name": "Verify Fake requirements", + "status": "FAILED" + } + } + ] +}] + VALIDATIONS_LOGS_CONTENTS_LIST = [{ 'plays': [{ 'play': { diff --git a/validations_libs/tests/test_validation_log.py b/validations_libs/tests/test_validation_log.py index 3df15fc8..c9b0557b 100644 --- a/validations_libs/tests/test_validation_log.py +++ b/validations_libs/tests/test_validation_log.py @@ -309,3 +309,35 @@ class TestValidationLog(TestCase): [ fakes.VALIDATIONS_LOGS_CONTENTS_LIST[0] ['validation_output'][0]['task']]) + + @mock.patch('json.load', + return_value=fakes.FAILED_VALIDATIONS_LOGS_CONTENTS_LIST[0]) + @mock.patch('builtins.open') + def test_get_reason(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + get_reason = val.get_reason + fake_reason = 'localhost: {}\n'.format( + fakes.FAILED_VALIDATIONS_LOGS_CONTENTS_LIST[0] + ['validation_output'][0]['task']['hosts']['localhost']['msg']) + self.assertEqual(get_reason, fake_reason) + + @mock.patch('json.load', + return_value=fakes.FAILED_VALIDATIONS_LOGS_WRONG_MSG_LIST[0]) + @mock.patch('builtins.open') + def test_get_reason_list_wrong_msg(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + get_reason = val.get_reason + fake_reason = 'localhost: FakeFailed\n' + self.assertEqual(get_reason, fake_reason) + + @mock.patch('json.load', + return_value=fakes.FAILED_VALIDATIONS_LOGS_WRONG_MSG_TYPE[0]) + @mock.patch('builtins.open') + def test_get_reason_list_wrong_type(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + get_reason = val.get_reason + fake_reason = 'Unknown' + self.assertEqual(get_reason, fake_reason) diff --git a/validations_libs/validation_logs.py b/validations_libs/validation_logs.py index fda5b762..2f901bb1 100644 --- a/validations_libs/validation_logs.py +++ b/validations_libs/validation_logs.py @@ -299,8 +299,14 @@ class ValidationLog: for h in v_output['task']['hosts']: msg = v_output['task']['hosts'][h].get('msg', 'Unknown') - msg = msg[:50] + '\n' + msg[50:] - reason.append('{}: {}'.format(h, msg)) + if isinstance(msg, list): + msg = ''.join(msg) + try: + msg = msg[:50] + '\n' + msg[50:] + reason.append('{}: {}'.format(h, msg)) + except TypeError: + LOG.warning('Wrong failure message type. skipping...') + reason.append('Unknown') if not self.content['validation_output']: if self.get_unreachable_hosts: reason.append('Unreachable')