[devserver] Create/update timestamp when a build is used.
This timestamp will then be consumed by clean_staged_images.py to
determine when it is safe to wipe a build from the server.
BUG=chromium-os:32912
TEST=unit
Change-Id: I0c06dd55cd915332f7aa580d846adce4972f6223
Reviewed-on: https://gerrit.chromium.org/gerrit/28627
Tested-by: Alex Miller <[email protected]>
Reviewed-by: Chris Masone <[email protected]>
Commit-Ready: Alex Miller <[email protected]>
diff --git a/downloader.py b/downloader.py
index 7f53ec3..682a874 100755
--- a/downloader.py
+++ b/downloader.py
@@ -25,6 +25,8 @@
"""
_LOG_TAG = 'DOWNLOAD'
+ # This filename must be kept in sync with clean_staged_images.py
+ _TIMESTAMP_FILENAME = 'staged.timestamp'
def __init__(self, static_dir):
self._static_dir = static_dir
@@ -61,11 +63,24 @@
return '/'.join([rel_path, short_build])
@staticmethod
+ def _TouchTimestampForStaged(directory_path):
+ file_name = os.path.join(directory_path, Downloader._TIMESTAMP_FILENAME)
+ # Easiest python version of |touch file_name|
+ with file(file_name, 'a'):
+ os.utime(file_name, None)
+
+ @staticmethod
def BuildStaged(archive_url, static_dir):
"""Returns True if the build is already staged."""
rel_path, short_build = Downloader.ParseUrl(archive_url)
sub_directory = Downloader.GenerateLockTag(rel_path, short_build)
- return os.path.isdir(os.path.join(static_dir, sub_directory))
+ directory_path = os.path.join(static_dir, sub_directory)
+ exists = os.path.isdir(directory_path)
+ # If the build exists, then touch the timestamp to tell
+ # clean_stages_images.py that we're using this build.
+ if exists:
+ Downloader._TouchTimestampForStaged(directory_path)
+ return exists
def Download(self, archive_url, background=False):
"""Downloads the given build artifacts defined by the |archive_url|.
@@ -97,6 +112,7 @@
# which would not be qualified as part of the suffix.
self._staging_dir = tempfile.mkdtemp(suffix='_'.join(
[rel_path.replace('/', '_'), short_build]))
+ Downloader._TouchTimestampForStaged(self._staging_dir)
cherrypy.log('Gathering download requirements %s' % archive_url,
self._LOG_TAG)
artifacts = self.GatherArtifactDownloads(
diff --git a/downloader_unittest.py b/downloader_unittest.py
index a7ce2b8..0a4e4ed 100755
--- a/downloader_unittest.py
+++ b/downloader_unittest.py
@@ -193,6 +193,9 @@
self.assertTrue(downloader.Downloader.BuildStaged(archive_url,
self._work_dir))
+ self.assertTrue(os.path.exists(
+ os.path.join(os.path.join(self._work_dir, build_dir),
+ downloader.Downloader._TIMESTAMP_FILENAME)))
self.assertFalse(downloader.Downloader.BuildStaged(archive_url_non_staged,
self._work_dir))
def testTrybotBuildStaged(self):