diff --git a/docs/guides/beaker_hostRequires.rst b/docs/guides/beaker_hostRequires.rst index 4bb04a55..21c7aec2 100644 --- a/docs/guides/beaker_hostRequires.rst +++ b/docs/guides/beaker_hostRequires.rst @@ -139,3 +139,42 @@ And the result would be following XML: + +Here is an example of Beaker provisioning using hostRequires without and/or: + +.. code:: yaml + + domains: + - hosts: + ######### + # Provisioning c9s + ######### + - group: client + name: bkr-c9s-latest.eagle.test + os: c9s + provider: beaker + beaker: # use some beaker specific requirements + hostRequires: + cpu_count: + _value: 1 + _op: "=" + name: eagle.test + type: linux + + +This requirement is then translated to XML for the Beaker job, along with other specifics: + +.. code:: xml + + + + + // from provisioning config + // default + // from provisioning config + + + // translated `hostRequires` key + // translated `cpu_count`, `_value` and `_op` keys + + diff --git a/src/mrack/providers/beaker.py b/src/mrack/providers/beaker.py index 0fc6e7c4..c1de721b 100644 --- a/src/mrack/providers/beaker.py +++ b/src/mrack/providers/beaker.py @@ -174,7 +174,7 @@ def _req_to_bkr_job(self, req): # pylint: disable=too-many-locals recipe.addDistroRequires(arch_node) host_requires = specs.get("hostRequires") - if host_requires: # suppose to be dict like {"or": [dict()], "and": [dict()]} + if host_requires: for operand, operand_value in host_requires.items(): if operand.startswith("_"): recipe.node.getElementsByTagName("hostRequires")[0].setAttribute( @@ -182,6 +182,13 @@ def _req_to_bkr_job(self, req): # pylint: disable=too-many-locals operand_value, ) continue + if operand not in ["and", "or"]: + req_node = xml_doc().createElement(operand) + req_node = add_dict_to_node(req_node, operand_value) + recipe.node.getElementsByTagName("hostRequires")[0].appendChild( + req_node + ) + continue # known operands are ["and", "or"] req_node = xml_doc().createElement(operand) for dct in operand_value: