This is an automated email from the ASF dual-hosted git repository.

akitouni pushed a commit to branch abderrahim/dummy-sandbox
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 4875f1e2e02d700d17be8b087c8c74d42f1d95f1
Author: Abderrahim Kitouni <[email protected]>
AuthorDate: Sun Sep 11 21:17:20 2022 +0100

    sandbox: add dummy sandbox for checking out artifacts from different arches
---
 buildstream/_platform/linux.py       | 43 +++++++++++++++++++++++++++++++++++-
 buildstream/sandbox/__init__.py      |  1 +
 buildstream/sandbox/_sandboxbwrap.py | 41 +---------------------------------
 buildstream/sandbox/_sandboxdummy.py | 15 +++++++++++++
 4 files changed, 59 insertions(+), 41 deletions(-)

diff --git a/buildstream/_platform/linux.py b/buildstream/_platform/linux.py
index b7a3f7f8b..017c3a434 100644
--- a/buildstream/_platform/linux.py
+++ b/buildstream/_platform/linux.py
@@ -22,13 +22,21 @@ import subprocess
 
 from .. import _site
 from .. import utils
-from ..sandbox import SandboxBwrap
+from ..sandbox import SandboxBwrap, SandboxDummy
 
 from . import Platform
 
 
 class Linux(Platform):
 
+    ARCHITECTURES = {
+        'amd64': 'x86_64',
+        'arm64': 'aarch64',
+        'i386': 'i686',
+        'armhf': 'armv7l',
+        'ppc64el': 'ppc64le',
+    }
+
     def __init__(self):
 
         super().__init__()
@@ -43,6 +51,39 @@ class Linux(Platform):
         # Inform the bubblewrap sandbox as to whether it can use user 
namespaces or not
         kwargs['user_ns_available'] = self._user_ns_available
         kwargs['die_with_parent_available'] = self._die_with_parent_available
+        kwargs['linux32'] = False
+
+        host_os, _, _, _, host_arch = os.uname()
+        config = kwargs['config']
+
+        # We can't do builds for another host OS
+        if config.build_os != host_os:
+            return SandboxDummy("Configured and host OS don't match.", *args, 
**kwargs)
+
+        if config.build_arch != host_arch:
+            try:
+                archtest = utils.get_host_tool('arch-test')
+                supported = subprocess.getoutput(archtest).splitlines()
+                supported_architectures = map(self.ARCHITECTURES.get, 
supported, supported)
+            except utils.ProgramNotFoundError:
+                supported_architectures = []
+                if host_arch == "x86_64":
+                    supported_architectures = ["i686"]
+                elif host_arch == "aarch64":
+                    supported_architectures = ["armv7l"]
+
+            if config.build_arch not in supported_architectures:
+                return SandboxDummy("Configured and host architecture don't 
match.", *args, **kwargs)
+
+            if ((config.build_arch == "i686" and host_arch == "x86_64") or
+                (config.build_arch == "armv7l" and host_arch == "aarch64")):
+                # check whether linux32 is available
+                try:
+                    utils.get_host_tool('linux32')
+                    kwargs['linux32'] = True
+                except utils.ProgramNotFoundError as e:
+                    return SandboxDummy("Configured and host architecture 
don't match.", *args, **kwargs)
+
         return SandboxBwrap(*args, **kwargs)
 
     def check_sandbox_config(self, config):
diff --git a/buildstream/sandbox/__init__.py b/buildstream/sandbox/__init__.py
index 53e170fbd..afdd7c384 100644
--- a/buildstream/sandbox/__init__.py
+++ b/buildstream/sandbox/__init__.py
@@ -20,3 +20,4 @@
 from .sandbox import Sandbox, SandboxFlags
 from ._sandboxchroot import SandboxChroot
 from ._sandboxbwrap import SandboxBwrap
+from ._sandboxdummy import SandboxDummy
diff --git a/buildstream/sandbox/_sandboxbwrap.py 
b/buildstream/sandbox/_sandboxbwrap.py
index 2bcb80b07..94490dba3 100644
--- a/buildstream/sandbox/_sandboxbwrap.py
+++ b/buildstream/sandbox/_sandboxbwrap.py
@@ -49,50 +49,11 @@ class SandboxBwrap(Sandbox):
         '/dev/zero'
     ]
 
-    ARCHITECTURES = {
-        'amd64': 'x86_64',
-        'arm64': 'aarch64',
-        'i386': 'i686',
-        'armhf': 'armv7l',
-        'ppc64el': 'ppc64le',
-    }
-
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.user_ns_available = kwargs['user_ns_available']
         self.die_with_parent_available = kwargs['die_with_parent_available']
-        self._linux32 = False
-
-        host_os, _, _, _, host_arch = os.uname()
-        config = self._get_config()
-
-        # We can't do builds for another host OS
-        if config.build_os != host_os:
-            raise SandboxError("Configured and host OS don't match.")
-
-        if config.build_arch != host_arch:
-            try:
-                archtest = utils.get_host_tool('arch-test')
-                supported = subprocess.getoutput(archtest).splitlines()
-                supported_architectures = map(self.ARCHITECTURES.get, 
supported, supported)
-            except utils.ProgramNotFoundError:
-                supported_architectures = []
-                if host_arch == "x86_64":
-                    supported_architectures = ["i686"]
-                elif host_arch == "aarch64":
-                    supported_architectures = ["armv7l"]
-
-            if config.build_arch not in supported_architectures:
-                raise SandboxError("Configured and host architecture don't 
match.")
-
-            if ((config.build_arch == "i686" and host_arch == "x86_64") or
-                (config.build_arch == "armv7l" and host_arch == "aarch64")):
-                # check whether linux32 is available
-                try:
-                    utils.get_host_tool('linux32')
-                    self._linux32 = True
-                except utils.ProgramNotFoundError as e:
-                    raise SandboxError("Configured and host architecture don't 
match.") from e
+        self._linux32 = kwargs['linux32']
 
     def run(self, command, flags, *, cwd=None, env=None):
         stdout, stderr = self._get_output()
diff --git a/buildstream/sandbox/_sandboxdummy.py 
b/buildstream/sandbox/_sandboxdummy.py
new file mode 100644
index 000000000..eb944975c
--- /dev/null
+++ b/buildstream/sandbox/_sandboxdummy.py
@@ -0,0 +1,15 @@
+from .._exceptions import SandboxError
+from . import Sandbox, SandboxFlags
+
+
+# SandboxDummy()
+#
+# Dummy sandbox to use on a different.
+#
+class SandboxDummy(Sandbox):
+    def __init__(self, reason, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self._reason = reason
+
+    def run(self, command, flags, *, cwd=None, env=None):
+        raise SandboxError(reason)

Reply via email to