From 687f52b435aa1e467e218ba220547b127ef3a695 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Sep 20 2018 13:36:56 +0000 Subject: Introduce toplevel_work_dir to get the Pungi working dir no matter what the compose state is. --- diff --git a/server/odcs/server/models.py b/server/odcs/server/models.py index 8205970..0ee7581 100644 --- a/server/odcs/server/models.py +++ b/server/odcs/server/models.py @@ -199,18 +199,25 @@ class Compose(ODCSBase): return "latest-%s-1" % self.name @property - def toplevel_dir(self): + def toplevel_work_dir(self): # In case this compose failed, there won't be latest-* directory, # but there might be the odcs-$id-1-$date.n.0 directory. # The issue is that we cannot really know the date, because there is # a race between we start Pungi and when Pungi generates that dir, # so just use `glob` to find out the rigth directory. + glob_str = os.path.join( + conf.target_dir, "odcs-%d-1-*.n.0" % self.id) + toplevel_dirs = glob.glob(glob_str) + if toplevel_dirs: + return toplevel_dirs[0] + return None + + @property + def toplevel_dir(self): if self.state == COMPOSE_STATES["failed"]: - glob_str = os.path.join( - conf.target_dir, "odcs-%d-1-*.n.0" % self.id) - toplevel_dirs = glob.glob(glob_str) - if toplevel_dirs: - return toplevel_dirs[0] + toplevel_dir = self.toplevel_work_dir + if toplevel_dir: + return toplevel_dir return os.path.join(conf.target_dir, self.latest_dir) @property diff --git a/server/odcs/server/pungi.py b/server/odcs/server/pungi.py index 46baf21..7d4db79 100644 --- a/server/odcs/server/pungi.py +++ b/server/odcs/server/pungi.py @@ -447,7 +447,7 @@ class PungiLogs(object): Returns the path to pungi.global.log. """ return os.path.join( - self.compose.toplevel_dir, "logs", "global", "pungi.global.log") + self.compose.toplevel_work_dir, "logs", "global", "pungi.global.log") def _get_global_log_errors(self): """ diff --git a/server/tests/utils.py b/server/tests/utils.py index fe72fe6..44e1f81 100644 --- a/server/tests/utils.py +++ b/server/tests/utils.py @@ -21,12 +21,14 @@ # # Written by Chenxiong Qi +import os import unittest from odcs.server import db from sqlalchemy import event from odcs.server.events import cache_composes_if_state_changed from odcs.server.events import start_to_publish_messages +from odcs.server import conf from flask_sqlalchemy import SignallingSession from mock import patch @@ -100,6 +102,12 @@ class ModelsBaseTest(unittest.TestCase): event.listen(SignallingSession, 'after_commit', start_to_publish_messages) + # Make Compose.toplevel_work_dir to work everytime. + self.patch_glob = patch("odcs.server.models.glob.glob") + self.glob = self.patch_glob.start() + self.glob.return_value = [ + os.path.join(conf.target_dir, "odcs-1-2018-1")] + def tearDown(self): if not self.disable_event_handlers: event.remove(SignallingSession, 'after_flush', @@ -117,3 +125,5 @@ class ModelsBaseTest(unittest.TestCase): cache_composes_if_state_changed) event.listen(SignallingSession, 'after_commit', start_to_publish_messages) + + self.patch_glob.stop()