Disable some compose types on other architectures
The 'enabled' field in the /compose/types output now reflects whether or not the type is supported on the current architecture. Disabled types are not allowed to be built, and will raise an error like: Compose type 'alibaba' is disabled on this architecture
This commit is contained in:
parent
af3494fc46
commit
e365e476af
@ -68,7 +68,10 @@ def test_templates(dbo, share_dir):
|
|||||||
Return a list of templates and errors encountered or an empty list
|
Return a list of templates and errors encountered or an empty list
|
||||||
"""
|
"""
|
||||||
template_errors = []
|
template_errors = []
|
||||||
for compose_type in compose_types(share_dir):
|
for compose_type, enabled in compose_types(share_dir):
|
||||||
|
if not enabled:
|
||||||
|
continue
|
||||||
|
|
||||||
# Read the kickstart template for this type
|
# Read the kickstart template for this type
|
||||||
ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks"
|
ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks"
|
||||||
ks_template = open(ks_template_path, "r").read()
|
ks_template = open(ks_template_path, "r").read()
|
||||||
@ -688,9 +691,12 @@ def start_build(cfg, dnflock, gitlock, branch, recipe_name, compose_type, test_m
|
|||||||
share_dir = cfg.get("composer", "share_dir")
|
share_dir = cfg.get("composer", "share_dir")
|
||||||
lib_dir = cfg.get("composer", "lib_dir")
|
lib_dir = cfg.get("composer", "lib_dir")
|
||||||
|
|
||||||
# Make sure compose_type is valid
|
# Make sure compose_type is valid, only allow enabled types
|
||||||
if compose_type not in compose_types(share_dir):
|
type_enabled = dict(compose_types(share_dir)).get(compose_type)
|
||||||
raise RuntimeError("Invalid compose type (%s), must be one of %s" % (compose_type, compose_types(share_dir)))
|
if type_enabled is None:
|
||||||
|
raise RuntimeError("Invalid compose type (%s), must be one of %s" % (compose_type, [t for t, e in compose_types(share_dir)]))
|
||||||
|
if not type_enabled:
|
||||||
|
raise RuntimeError("Compose type '%s' is disabled on this architecture" % compose_type)
|
||||||
|
|
||||||
# Some image types (live-iso) need extra packages for composer to execute the output template
|
# Some image types (live-iso) need extra packages for composer to execute the output template
|
||||||
with dnflock.lock:
|
with dnflock.lock:
|
||||||
@ -859,11 +865,30 @@ def start_build(cfg, dnflock, gitlock, branch, recipe_name, compose_type, test_m
|
|||||||
|
|
||||||
# Supported output types
|
# Supported output types
|
||||||
def compose_types(share_dir):
|
def compose_types(share_dir):
|
||||||
r""" Returns a list of the supported output types
|
r""" Returns a list of tuples of the supported output types, and their state
|
||||||
|
|
||||||
The output types come from the kickstart names in /usr/share/lorax/composer/\*ks
|
The output types come from the kickstart names in /usr/share/lorax/composer/\*ks
|
||||||
|
|
||||||
|
If they are disabled on the current arch their state is False. If enabled, it is True.
|
||||||
|
eg. [("alibaba", False), ("ext4-filesystem", True), ...]
|
||||||
"""
|
"""
|
||||||
return sorted([os.path.basename(ks)[:-3] for ks in glob(joinpaths(share_dir, "composer/*.ks"))])
|
# These are compose types that are not supported on an architecture. eg. hyper-v on s390
|
||||||
|
# If it is not listed, it is allowed
|
||||||
|
disable_map = {
|
||||||
|
"arm": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"armhfp": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"aarch64": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"ppc": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"ppc64": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"ppc64le": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"s390": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
"s390x": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"],
|
||||||
|
}
|
||||||
|
|
||||||
|
all_types = sorted([os.path.basename(ks)[:-3] for ks in glob(joinpaths(share_dir, "composer/*.ks"))])
|
||||||
|
arch_disabled = disable_map.get(os.uname().machine, [])
|
||||||
|
|
||||||
|
return [(t, t not in arch_disabled) for t in all_types]
|
||||||
|
|
||||||
def compose_args(compose_type):
|
def compose_args(compose_type):
|
||||||
""" Returns the settings to pass to novirt_install for the compose type
|
""" Returns the settings to pass to novirt_install for the compose type
|
||||||
|
@ -1495,7 +1495,7 @@ def v0_compose_types():
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
share_dir = api.config["COMPOSER_CFG"].get("composer", "share_dir")
|
share_dir = api.config["COMPOSER_CFG"].get("composer", "share_dir")
|
||||||
return jsonify(types=[{"name": k, "enabled": True} for k in compose_types(share_dir)])
|
return jsonify(types=[{"name": t, "enabled": e} for t, e in compose_types(share_dir)])
|
||||||
|
|
||||||
@v0_api.route("/compose/queue")
|
@v0_api.route("/compose/queue")
|
||||||
def v0_compose_queue():
|
def v0_compose_queue():
|
||||||
|
@ -744,7 +744,7 @@ disabled = ["postfix", "telnetd"]
|
|||||||
# Test against all of the available templates
|
# Test against all of the available templates
|
||||||
share_dir = "./share/"
|
share_dir = "./share/"
|
||||||
errors = []
|
errors = []
|
||||||
for compose_type in compose_types(share_dir):
|
for compose_type, _enabled in compose_types(share_dir):
|
||||||
# Read the kickstart template for this type
|
# Read the kickstart template for this type
|
||||||
ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks"
|
ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks"
|
||||||
ks_template = open(ks_template_path, "r").read()
|
ks_template = open(ks_template_path, "r").read()
|
||||||
@ -837,3 +837,11 @@ class ExtraPkgsTest(unittest.TestCase):
|
|||||||
"""Test that non-live doesn't parse live-install.tmpl"""
|
"""Test that non-live doesn't parse live-install.tmpl"""
|
||||||
extra_pkgs = get_extra_pkgs(self.dbo, "./share/", "qcow2")
|
extra_pkgs = get_extra_pkgs(self.dbo, "./share/", "qcow2")
|
||||||
self.assertEqual(extra_pkgs, [])
|
self.assertEqual(extra_pkgs, [])
|
||||||
|
|
||||||
|
class ComposeTypesTest(unittest.TestCase):
|
||||||
|
def test_compose_types(self):
|
||||||
|
types = compose_types("./share/")
|
||||||
|
self.assertTrue(("qcow2", True) in types)
|
||||||
|
|
||||||
|
if os.uname().machine != 'x86_64':
|
||||||
|
self.assertTrue(("alibaba", False) in types)
|
||||||
|
@ -960,6 +960,10 @@ class ServerAPIV0TestCase(unittest.TestCase):
|
|||||||
self.assertNotEqual(data, None)
|
self.assertNotEqual(data, None)
|
||||||
self.assertEqual({"name": "tar", "enabled": True} in data["types"], True)
|
self.assertEqual({"name": "tar", "enabled": True} in data["types"], True)
|
||||||
|
|
||||||
|
# All of the non-x86 compose types disable alibaba
|
||||||
|
if os.uname().machine != 'x86_64':
|
||||||
|
self.assertEqual({"name": "alibaba", "enabled": False} in data["types"], True)
|
||||||
|
|
||||||
def test_compose_02_bad_type(self):
|
def test_compose_02_bad_type(self):
|
||||||
"""Test that using an unsupported image type failes"""
|
"""Test that using an unsupported image type failes"""
|
||||||
test_compose = {"blueprint_name": "example-glusterfs",
|
test_compose = {"blueprint_name": "example-glusterfs",
|
||||||
|
Loading…
Reference in New Issue
Block a user