From 6b517e73d9b630a86f40c915d1952d3566c67a6c Mon Sep 17 00:00:00 2001 From: Federico Stagni Date: Wed, 5 Jun 2024 15:14:12 +0200 Subject: [PATCH] fix: use architectures from opencontainers initiative --- src/DIRAC/Core/Utilities/Os.py | 39 +++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/DIRAC/Core/Utilities/Os.py b/src/DIRAC/Core/Utilities/Os.py index 72b1a453806..484d63be2b8 100755 --- a/src/DIRAC/Core/Utilities/Os.py +++ b/src/DIRAC/Core/Utilities/Os.py @@ -154,34 +154,39 @@ def which(executable): return shutil.which(executable) -def findImage(continer_root="container/apptainer/alma9/"): +def findImage(container_root="container/apptainer/alma9/"): """Finds the image for the current platform - - This looks into location "${CVMFS_locations}/${container_root}/${platform}/" - and expects to find one of the following platforms: - - x86_64 - - aarch64 - - ppc64le + + This looks into location "${CVMFS_locations}/${container_root}/${platform}/" + and expects to find one of the following platforms: + - x86_64 + - aarch64 + - ppc64le """ from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations plat = DIRAC.gConfig.getValue("LocalSite/Platform", platform.machine()) DIRAC.gLogger.info(f"Platform: {plat}") - - # NB: platform compatibility is more complex than the following simple identification. - # sources: + + # NB: platform compatibility is more complex than the following simple identification. + # + # Given that, on Linux, platform.machine() returns the same values as uname -m, + # and this is already "confusing", e.g. see # https://stackoverflow.com/questions/45125516/possible-values-for-uname-m # https://en.wikipedia.org/wiki/Uname - - if plat.lower() == "amd64": - plat = "x86_64" - if plat.lower().startswith("arm"): - plat = "aarch64" + # Since here we are using the architecture specification defined by opencontainers initiative: + # https://github.com/opencontainers/image-spec/blob/main/image-index.md#platform-variants + # we need to make some simple "conversions" to get the right values: + + if plat.lower() == "x86_64": + plat = "amd64" + if plat.lower().startswith("arm") or plat.lower() == "aarch64": + plat = "arm64" if plat.lower().startswith("ppc64"): plat = "ppc64le" - if plat not in ["x86_64", "aarch64", "ppc64le"]: + if plat not in ["amd64", "arm64", "ppc64le"]: DIRAC.gLogger.error(f"Platform {plat} not supported") return None @@ -192,7 +197,7 @@ def findImage(continer_root="container/apptainer/alma9/"): rootImage = None for candidate in CVMFS_locations: - rootImage = os.path.join(candidate, continer_root, plat) + rootImage = os.path.join(candidate, container_root, plat) DIRAC.gLogger.verbose(f"Checking {rootImage} existence") if safe_listdir(rootImage): break