21020: Make arv-keepdocker use a cache from the environment
authorBrett Smith <brett.smith@curii.com>
Fri, 24 May 2024 15:04:03 +0000 (11:04 -0400)
committerBrett Smith <brett.smith@curii.com>
Fri, 24 May 2024 21:02:45 +0000 (17:02 -0400)
Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith@curii.com>

sdk/python/arvados/commands/keepdocker.py
sdk/python/tests/test_arv_keepdocker.py

index 6823ee1beada080526c9a9aa901d752e7b5aefd9..188f8be45791765985dbae714671615290875d7c 100644 (file)
@@ -18,6 +18,7 @@ import tempfile
 
 import ciso8601
 from operator import itemgetter
+from pathlib import Path
 from stat import *
 
 import arvados
@@ -27,6 +28,10 @@ import arvados.commands._util as arv_cmd
 import arvados.commands.put as arv_put
 from arvados._version import __version__
 
+from typing import (
+    Callable,
+)
+
 logger = logging.getLogger('arvados.keepdocker')
 logger.setLevel(logging.DEBUG if arvados.config.get('ARVADOS_DEBUG')
                 else logging.INFO)
@@ -181,9 +186,12 @@ def save_image(image_hash, image_file):
     except STAT_CACHE_ERRORS:
         pass  # We won't resume from this cache.  No big deal.
 
-def get_cache_dir():
-    return arv_cmd.make_home_conf_dir(
-        os.path.join('.cache', 'arvados', 'docker'), 0o700)
+def get_cache_dir(
+        mkparent: Callable[[], Path]=arvados.util._BaseDirectories('CACHE').storage_path,
+) -> str:
+    path = mkparent() / 'docker'
+    path.mkdir(mode=0o700, exist_ok=True)
+    return str(path)
 
 def prep_image_file(filename):
     # Return a file object ready to save a Docker image,
index 5d23dfb378069219966a25c9fb2f8ce1a5a52437..c5bcfff41b17c74f51f91d5cc9f01d54653892a3 100644 (file)
@@ -18,6 +18,7 @@ from pathlib import Path
 from unittest import mock
 
 import parameterized
+import pytest
 
 import arvados.commands.keepdocker as arv_keepdocker
 from . import arvados_testutil as tutil
@@ -255,3 +256,12 @@ class ImageMetadataTestCase(unittest.TestCase):
     def test_image_config(self):
         self.assertIsInstance(self.config, collections.abc.Mapping)
         self.assertEqual(self.config.get('created'), '2023-05-02T16:49:27Z')
+
+
+def test_get_cache_dir(tmp_path):
+    actual = arv_keepdocker.get_cache_dir(lambda: tmp_path)
+    assert isinstance(actual, str)
+    actual = Path(actual)
+    assert actual.is_dir()
+    assert actual.name == 'docker'
+    assert actual.parent == tmp_path