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:
Brian C. Lane 2019-10-28 10:56:47 -07:00
parent af3494fc46
commit e365e476af
4 changed files with 45 additions and 8 deletions

View File

@ -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

View File

@ -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():

View File

@ -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)

View File

@ -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",