From 0641b17a5aa0fb0935bdea9f821be8978cf35176 Mon Sep 17 00:00:00 2001 From: Mathieu Bultel Date: Wed, 25 Nov 2020 17:40:17 +0100 Subject: [PATCH] Handle unreachable case in the log statistics The unreachable status is a fail state that should be treat. Change-Id: Ia610448421196572909567deb144d9a490be27a0 --- validations_libs/tests/fakes.py | 31 ++++++++++++++- validations_libs/tests/test_validation_log.py | 38 ++++++++++++++++++- validations_libs/validation_logs.py | 4 ++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/validations_libs/tests/fakes.py b/validations_libs/tests/fakes.py index 9d5541f5..2e459dd8 100644 --- a/validations_libs/tests/fakes.py +++ b/validations_libs/tests/fakes.py @@ -50,9 +50,36 @@ BAD_VALIDATIONS_LOGS_CONTENTS_LIST = [{ 'changed': 0, 'failures': 0, 'ignored': 0, - 'ok': 1, + 'ok': 0, 'rescued': 0, - 'skipped': 1 + 'skipped': 0, + 'unreachable': 1 + } + }, + 'validation_output': [] +}] + +FAILED_VALIDATIONS_LOGS_CONTENTS_LIST = [{ + 'plays': [{ + 'play': { + 'duration': { + 'end': '2019-11-25T13:40:17.538611Z', + }, + 'host': 'undercloud', + 'id': '008886df-d297-1eaa-2a74-000000000008', + 'validation_id': '512e', + 'validation_path': + '/usr/share/openstack-tripleo-validations/playbooks' + }}], + 'stats': { + 'undercloud': { + 'changed': 0, + 'failures': 1, + 'ignored': 0, + 'ok': 0, + 'rescued': 0, + 'skipped': 0, + 'unreachable': 0 } }, 'validation_output': [] diff --git a/validations_libs/tests/test_validation_log.py b/validations_libs/tests/test_validation_log.py index 0561eef2..32145f6e 100644 --- a/validations_libs/tests/test_validation_log.py +++ b/validations_libs/tests/test_validation_log.py @@ -144,6 +144,24 @@ class TestValidationLog(TestCase): status = val.get_status self.assertEquals(status, 'PASSED') + @mock.patch('json.load', + return_value=fakes.FAILED_VALIDATIONS_LOGS_CONTENTS_LIST[0]) + @mock.patch('six.moves.builtins.open') + def test_get_status_failed(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + status = val.get_status + self.assertEquals(status, 'FAILED') + + @mock.patch('json.load', + return_value=fakes.BAD_VALIDATIONS_LOGS_CONTENTS_LIST[0]) + @mock.patch('six.moves.builtins.open') + def test_get_status_unreachable(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + status = val.get_status + self.assertEquals(status, 'FAILED') + @mock.patch('json.load', return_value=fakes.VALIDATIONS_LOGS_CONTENTS_LIST[0]) @mock.patch('six.moves.builtins.open') @@ -162,6 +180,24 @@ class TestValidationLog(TestCase): host_group = val.get_hosts_status self.assertEquals(host_group, 'undercloud,PASSED') + @mock.patch('json.load', + return_value=fakes.FAILED_VALIDATIONS_LOGS_CONTENTS_LIST[0]) + @mock.patch('six.moves.builtins.open') + def test_get_hosts_status_failed(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + host_group = val.get_hosts_status + self.assertEquals(host_group, 'undercloud,FAILED') + + @mock.patch('json.load', + return_value=fakes.BAD_VALIDATIONS_LOGS_CONTENTS_LIST[0]) + @mock.patch('six.moves.builtins.open') + def test_get_hosts_status_unreachable(self, mock_open, mock_json): + val = ValidationLog( + logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') + host_group = val.get_hosts_status + self.assertEquals(host_group, 'undercloud,UNREACHABLE') + @mock.patch('json.load', return_value=fakes.VALIDATIONS_LOGS_CONTENTS_LIST[0]) @mock.patch('six.moves.builtins.open') @@ -178,7 +214,7 @@ class TestValidationLog(TestCase): val = ValidationLog( logfile='/tmp/123_foo_2020-03-30T13:17:22.447857Z.json') unreachable = val.get_unreachable_hosts - self.assertEquals(unreachable, '') + self.assertEquals(unreachable, 'undercloud') @mock.patch('json.load', return_value=fakes.VALIDATIONS_LOGS_CONTENTS_LIST[0]) diff --git a/validations_libs/validation_logs.py b/validations_libs/validation_logs.py index 9a0c5ba6..1570e481 100644 --- a/validations_libs/validation_logs.py +++ b/validations_libs/validation_logs.py @@ -190,6 +190,8 @@ class ValidationLog(object): for h in self.content['stats'].keys(): if self.content['stats'][h].get('failures'): failed += 1 + if self.content['stats'][h].get('unreachable'): + failed += 1 return ('FAILED' if failed else 'PASSED') @property @@ -220,6 +222,8 @@ class ValidationLog(object): for h in self.content['stats'].keys(): if self.content['stats'][h].get('failures'): hosts.append('{},{}'.format(h, 'FAILED')) + elif self.content['stats'][h].get('unreachable'): + hosts.append('{},{}'.format(h, 'UNREACHABLE')) else: hosts.append('{},{}'.format(h, 'PASSED')) return ', '.join(hosts)