From 5f1ffe2b99d8d3a71184c3b0e69b97dc0e539fbc Mon Sep 17 00:00:00 2001 From: Will Szumski Date: Thu, 20 Jan 2022 19:39:28 +0000 Subject: [PATCH] Handle aggregate host list set to None A freshly created host aggregate can have the host list set to None, consequently you'd hit: ``` failed: [localhost] (item={'name': 'gpu', 'hosts': [], 'metadata': {'type': 'gpu'}}) => {"ansible_loop_var": "item", "changed": false, "item": {"hosts": [], "metadata": {"type": "gpu"}, "name": "gpu"}, "module_stderr": "Traceback (most recent call last):\n File \"/var/lib/home/stackhpc/.ansible/tmp/ansible-tmp-1642696576.6728637-1456290-187052400642084/Ansiba llZ_host_aggregate.py\", line 100, in \n _ansiballz_main()\n File \"/var/lib/home/stackhpc/.ansible/tmp/ansible-tmp-1642696576.6728637-1456290-187052400642084/AnsiballZ_host_aggregate.py\", line 92, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/var/lib/home/stackhpc/.ansible/tmp/ansible-tmp-1642696576.672 8637-1456290-187052400642084/AnsiballZ_host_aggregate.py\", line 41, in invoke_module\n run_name='__main__', alter_sys=True)\n File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\n return _run_module_code(code, init_globals, run_name, mod_spec)\n File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\n mod_name, mod_spec, p kg_name, script_name)\n File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\n exec(code, run_globals)\n File \"/tmp/ansible_os_nova_host_aggregate_payload_qwjtdtjj/ansible_os_nova_host_aggregate_payload.zip/ansible_collections/openstack/cloud/plugins/modules/host_aggregate.py\", line 214, in \n File \"/tmp/ansible_os_nova_host_aggregate _payload_qwjtdtjj/ansible_os_nova_host_aggregate_payload.zip/ansible_collections/openstack/cloud/plugins/modules/host_aggregate.py\", line 210, in main\n File \"/tmp/ansible_os_nova_host_aggregate_payload_qwjtdtjj/ansible_os_nova_host_aggregate_payload.zip/ansible_collections/openstack/cloud/plugins/module_utils/openstack.py\", line 407, in __call__\n File \ "/tmp/ansible_os_nova_host_aggregate_payload_qwjtdtjj/ansible_os_nova_host_aggregate_payload.zip/ansible_collections/openstack/cloud/plugins/modules/host_aggregate.py\", line 176, in run\n File \"/tmp/ansible_os_nova_host_aggregate_payload_qwjtdtjj/ansible_os_nova_host_aggregate_payload.zip/ansible_collections/openstack/cloud/plugins/modules/host_aggregate.py \", line 138, in _update_hosts\nTypeError: 'NoneType' object is not iterable\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1} ``` I've not investigated which API and library combinations elict this behaviour, but it does seem to occur. We can safely handle this possibility in backwards compatible way. It is possible to workaround this issue by invoking the module a second time. Change-Id: Ie14391f18c0f65833d00a4b4f6b1b314a0903d2b --- plugins/modules/host_aggregate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/modules/host_aggregate.py b/plugins/modules/host_aggregate.py index 7444545e..421b37d6 100644 --- a/plugins/modules/host_aggregate.py +++ b/plugins/modules/host_aggregate.py @@ -135,14 +135,14 @@ class ComputeHostAggregateModule(OpenStackModule): if hosts is None: return - hosts_to_add = set(hosts) - set(aggregate.get("hosts", [])) + hosts_to_add = set(hosts) - set(aggregate.get("hosts") or []) for i in hosts_to_add: self.conn.add_host_to_aggregate(aggregate.id, i) if not purge_hosts: return - hosts_to_remove = set(aggregate.get("hosts", [])) - set(hosts) + hosts_to_remove = set(aggregate.get("hosts") or []) - set(hosts) for i in hosts_to_remove: self.conn.remove_host_from_aggregate(aggregate.id, i)