From ea75902c40eb3f9f6f6c87fa91e787f90f59a04e Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Nov 06 2018 08:33:40 +0000 Subject: Fix PungiLogs exception when toplevel_work_dir does not exist. This can happen for example when Pulp compose fails for some reason, for example when the requested content set does not exist in Pulp. This also catches any possible future PungiLogs exception and logs it, so these exceptions won't be lost in the future again. --- diff --git a/server/odcs/server/backend.py b/server/odcs/server/backend.py index 8a5a0be..b13a4f6 100644 --- a/server/odcs/server/backend.py +++ b/server/odcs/server/backend.py @@ -697,9 +697,13 @@ def generate_compose(compose_id, lost_compose=False): else: log.exception("Error while generating compose %d", compose_id) - pungi_logs = PungiLogs(compose) - state_reason = "Error while generating compose: {}\n{}".format( - str(e), pungi_logs.get_error_string()) + state_reason = "Error while generating compose: {}".format(str(e)) + + try: + pungi_logs = PungiLogs(compose) + state_reason += "\n{}".format(pungi_logs.get_error_string()) + except Exception: + log.exception("Exception raised when getting Pungi logs.") compose.transition(COMPOSE_STATES["failed"], state_reason) diff --git a/server/odcs/server/pungi.py b/server/odcs/server/pungi.py index 23550d5..cc36670 100644 --- a/server/odcs/server/pungi.py +++ b/server/odcs/server/pungi.py @@ -449,10 +449,13 @@ class PungiLogs(object): @property def global_log_path(self): """ - Returns the path to pungi.global.log. + Returns the path to pungi.global.log if it exists. """ + toplevel_work_dir = self.compose.toplevel_work_dir + if not toplevel_work_dir: + return None return os.path.join( - self.compose.toplevel_work_dir, "logs", "global", "pungi.global.log") + toplevel_work_dir, "logs", "global", "pungi.global.log") def _get_global_log_errors(self): """ @@ -463,8 +466,11 @@ class PungiLogs(object): :return: List of error strings. """ errors = [] + global_log_path = self.global_log_path + if not global_log_path: + return errors try: - with open(self.global_log_path, "r") as global_log: + with open(global_log_path, "r") as global_log: error = "" for line in global_log.readlines(): idx = line.find("[ERROR ]") diff --git a/server/tests/test_backend.py b/server/tests/test_backend.py index 9b7dec4..c0b6803 100644 --- a/server/tests/test_backend.py +++ b/server/tests/test_backend.py @@ -555,6 +555,28 @@ gpgcheck=0 r'Error while generating compose: Expected exception\n' 'Compose failed for unknown reason*') + @patch("odcs.server.backend.resolve_compose") + @patch("odcs.server.backend.generate_pungi_compose") + @patch("odcs.server.pungi.PungiLogs.get_error_string") + def test_generate_compose_pungi_logs_exceptions( + self, get_error_string, generate_pungi_compose, resolve_compose): + get_error_string.side_effect = RuntimeError("PungiLogs Expected exception") + generate_pungi_compose.side_effect = RuntimeError("Expected exception") + + c = Compose.create( + db.session, "me", PungiSourceType.KOJI_TAG, "foo-1", + COMPOSE_RESULTS["repository"], 3600) + db.session.add(c) + db.session.commit() + + generate_compose(1) + + c1 = Compose.query.filter(Compose.id == 1).one() + self.assertEqual(c1.state, COMPOSE_STATES["failed"]) + self.assertRegexpMatches( + c1.state_reason, + r'Error while generating compose: Expected exception*') + @patch('odcs.server.backend.tag_changed', return_value=True) @patch('odcs.server.backend.create_koji_session') def test_resolve_compose_from_koji_tag_get_last_event_if_tag_changed( diff --git a/server/tests/test_pungi.py b/server/tests/test_pungi.py index e899a53..6524586 100644 --- a/server/tests/test_pungi.py +++ b/server/tests/test_pungi.py @@ -346,6 +346,13 @@ For more details see {0}/odcs-717-1-20180323.n.0/work/x86_64/pungi/Temporary.x86 errors = pungi_logs.get_error_string() self.assertEqual(errors, "") + def test_toplevel_work_dir(self): + # The self.glob is inherited from ModelsBaseTest. + self.glob.return_value = [] + pungi_logs = PungiLogs(self.compose) + errors = pungi_logs.get_error_string() + self.assertEqual(errors, "") + class TestPungiRunroot(unittest.TestCase):