summaryrefslogtreecommitdiff
path: root/buildstream/sandbox/sandbox.py
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2017-11-06 18:49:58 +0900
committerTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2017-11-06 20:31:08 +0900
commit69cc9ef00b957a202a80c7690f7ee3e5ad8b8eda (patch)
tree795b7a254425c1aa7950240408380ba6fa78d75e /buildstream/sandbox/sandbox.py
parente2959c27382464f1b5ba37f6ea6db14f21d71b72 (diff)
downloadbuildstream-69cc9ef00b957a202a80c7690f7ee3e5ad8b8eda.tar.gz
sandbox: Refactoring, moving accidentally public MountMap into it's own file
Diffstat (limited to 'buildstream/sandbox/sandbox.py')
-rw-r--r--buildstream/sandbox/sandbox.py106
1 files changed, 0 insertions, 106 deletions
diff --git a/buildstream/sandbox/sandbox.py b/buildstream/sandbox/sandbox.py
index 0dc9aa2a5..7c4887fe9 100644
--- a/buildstream/sandbox/sandbox.py
+++ b/buildstream/sandbox/sandbox.py
@@ -29,12 +29,7 @@ conform to this interface.
"""
import os
-from collections import OrderedDict
-from contextlib import contextmanager, ExitStack
-
-from .. import utils
from .._exceptions import ImplError
-from .._fuse import SafeHardlinks
class SandboxFlags():
@@ -65,107 +60,6 @@ class SandboxFlags():
"""
-# Mount()
-#
-# Helper data object representing a single mount point in the mount map
-#
-class Mount():
- def __init__(self, sandbox, mount_point, safe_hardlinks):
- scratch_directory = sandbox._get_scratch_directory()
- root_directory = sandbox.get_directory()
-
- self.mount_point = mount_point
- self.safe_hardlinks = safe_hardlinks
-
- # FIXME: When the criteria for mounting something and it's parent
- # mount is identical, then there is no need to mount an additional
- # fuse layer (i.e. if the root is read-write and there is a directory
- # marked for staged artifacts directly within the rootfs, they can
- # safely share the same fuse layer).
- #
- # In these cases it would be saner to redirect the sub-mount to
- # a regular mount point within the parent's redirected mount.
- #
- if self.safe_hardlinks:
- # Redirected mount
- self.mount_origin = os.path.join(root_directory, mount_point.lstrip(os.sep))
- self.mount_base = os.path.join(scratch_directory, utils.url_directory_name(mount_point))
- self.mount_source = os.path.join(self.mount_base, 'mount')
- self.mount_tempdir = os.path.join(self.mount_base, 'temp')
- os.makedirs(self.mount_origin, exist_ok=True)
- os.makedirs(self.mount_source, exist_ok=True)
- os.makedirs(self.mount_tempdir, exist_ok=True)
- else:
- # No redirection needed
- self.mount_source = os.path.join(root_directory, mount_point.lstrip(os.sep))
- os.makedirs(self.mount_source, exist_ok=True)
-
- @contextmanager
- def mounted(self, sandbox):
- if self.safe_hardlinks:
- mount = SafeHardlinks(self.mount_origin, self.mount_tempdir)
- with mount.mounted(self.mount_source):
- yield
- else:
- # Nothing to mount here
- yield
-
-
-# MountMap()
-#
-# Helper object for mapping of the sandbox mountpoints
-#
-# Args:
-# sandbox (Sandbox): The sandbox object
-# root_readonly (bool): Whether the sandbox root is readonly
-#
-class MountMap():
-
- def __init__(self, sandbox, root_readonly):
- # We will be doing the mounts in the order in which they were declared.
- self.mounts = OrderedDict()
-
- # We want safe hardlinks on rootfs whenever root is not readonly
- self.mounts['/'] = Mount(sandbox, '/', not root_readonly)
-
- for mark in sandbox._get_marked_directories():
- directory = mark['directory']
- artifact = mark['artifact']
-
- # We want safe hardlinks for any non-root directory where
- # artifacts will be staged to
- self.mounts[directory] = Mount(sandbox, directory, artifact)
-
- # get_mount_source()
- #
- # Gets the host directory where the mountpoint in the
- # sandbox should be bind mounted from
- #
- # Args:
- # mountpoint (str): The absolute mountpoint path inside the sandbox
- #
- # Returns:
- # The host path to be mounted at the mount point
- #
- def get_mount_source(self, mountpoint):
- return self.mounts[mountpoint].mount_source
-
- # mounted()
- #
- # A context manager which ensures all the mount sources
- # were mounted with any fuse layers which may have been needed.
- #
- # Args:
- # sandbox (Sandbox): The sandbox
- #
- @contextmanager
- def mounted(self, sandbox):
- with ExitStack() as stack:
- for mountpoint, mount in self.mounts.items():
- stack.enter_context(mount.mounted(sandbox))
- yield
-
-
class Sandbox():
"""Sandbox()