Improve error message for missing "command" entry in containerize (#37590)

fixes #21242
This commit is contained in:
Massimiliano Culpo 2023-05-11 10:33:51 +02:00 committed by GitHub
parent 1b6621a14b
commit 297329f4b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,10 +10,12 @@
from typing import Optional from typing import Optional
import spack.environment as ev import spack.environment as ev
import spack.error
import spack.schema.env import spack.schema.env
import spack.tengine as tengine import spack.tengine as tengine
import spack.util.spack_yaml as syaml import spack.util.spack_yaml as syaml
from spack.container.images import (
from ..images import (
bootstrap_template_for, bootstrap_template_for,
build_info, build_info,
checkout_command, checkout_command,
@ -205,12 +207,20 @@ def manifest(self):
@tengine.context_property @tengine.context_property
def os_packages_final(self): def os_packages_final(self):
"""Additional system packages that are needed at run-time.""" """Additional system packages that are needed at run-time."""
try:
return self._os_packages_for_stage("final") return self._os_packages_for_stage("final")
except Exception as e:
msg = f"an error occurred while rendering the 'final' stage of the image: {e}"
raise spack.error.SpackError(msg) from e
@tengine.context_property @tengine.context_property
def os_packages_build(self): def os_packages_build(self):
"""Additional system packages that are needed at build-time.""" """Additional system packages that are needed at build-time."""
try:
return self._os_packages_for_stage("build") return self._os_packages_for_stage("build")
except Exception as e:
msg = f"an error occurred while rendering the 'build' stage of the image: {e}"
raise spack.error.SpackError(msg) from e
@tengine.context_property @tengine.context_property
def os_package_update(self): def os_package_update(self):
@ -243,13 +253,24 @@ def _package_info_from(self, package_list):
if image is None: if image is None:
os_pkg_manager = os_package_manager_for(image_config["os"]) os_pkg_manager = os_package_manager_for(image_config["os"])
else: else:
os_pkg_manager = self.container_config["os_packages"]["command"] os_pkg_manager = self._os_pkg_manager()
update, install, clean = commands_for(os_pkg_manager) update, install, clean = commands_for(os_pkg_manager)
Packages = collections.namedtuple("Packages", ["update", "install", "list", "clean"]) Packages = collections.namedtuple("Packages", ["update", "install", "list", "clean"])
return Packages(update=update, install=install, list=package_list, clean=clean) return Packages(update=update, install=install, list=package_list, clean=clean)
def _os_pkg_manager(self):
try:
os_pkg_manager = self.container_config["os_packages"]["command"]
except KeyError:
msg = (
"cannot determine the OS package manager to use.\n\n\tPlease add an "
"appropriate 'os_packages:command' entry to the spack.yaml manifest file\n"
)
raise spack.error.SpackError(msg)
return os_pkg_manager
@tengine.context_property @tengine.context_property
def extra_instructions(self): def extra_instructions(self):
Extras = collections.namedtuple("Extra", ["build", "final"]) Extras = collections.namedtuple("Extra", ["build", "final"])