From 74f63620f5f4c50aca9641616ee81fe364ed995d Mon Sep 17 00:00:00 2001 From: Rich Megginson Date: Thu, 19 Mar 2026 15:55:07 -0600 Subject: [PATCH] test: ensure role gathers the facts it uses by having test clear_facts before include_role The role gathers the facts it uses. For example, if the user uses `ANSIBLE_GATHERING=explicit`, the role uses the `setup` module with the facts and subsets it requires. This change allows us to test this. Before every role invocation, the test will use `meta: clear_facts` so that the role starts with no facts. Create a task file tests/tasks/run_role_with_clear_facts.yml to do the tasks to clear the facts and run the role. Note that this means we don't need to use `gather_facts` for the tests. Some vars defined using `ansible_facts` have been changed to be defined with `set_fact` instead. This is because of the fact that `vars` are lazily evaluated - the var might be referenced when the facts have been cleared, and will issue an error like `ansible_facts["distribution"] is undefined`. This is typically done for blocks that have a `when` condition that uses `ansible_facts` and the block has a role invocation using run_role_with_clear_facts.yml These have been rewritten to define the `when` condition using `set_fact`. This is because the `when` condition is evaluated every time a task is invoked in the block, and if the facts are cleared, this will raise an undefined variable error. Signed-off-by: Rich Megginson --- tests/tasks/run_role_with_clear_facts.yml | 37 +++++++++++++++++++++++ tests/tests_default.yml | 7 ++--- tests/tests_default_vars.yml | 6 ++-- tests/tests_deploy_keys.yml | 13 +++----- tests/tests_fetch_keys_deploy_not_set.yml | 11 +++---- tests/tests_fetch_keys_deploy_set.yml | 11 +++---- tests/tests_include_vars_from_parent.yml | 1 - tests/tests_nbde_server_keys_dir.yml | 25 ++++++--------- tests/tests_nbde_server_rotate_keys.yml | 16 +++++----- tests/tests_nbde_server_service_state.yml | 16 +++++----- tests/tests_share_system_dir.yml | 13 +++----- tests/tests_tangd_custom_port.yml | 11 +++---- 12 files changed, 92 insertions(+), 75 deletions(-) create mode 100644 tests/tasks/run_role_with_clear_facts.yml diff --git a/tests/tasks/run_role_with_clear_facts.yml b/tests/tasks/run_role_with_clear_facts.yml new file mode 100644 index 00000000..0522b62c --- /dev/null +++ b/tests/tasks/run_role_with_clear_facts.yml @@ -0,0 +1,37 @@ +--- +# Task file: clear_facts, run linux-system-roles.nbde_server. +# Include this with include_tasks or import_tasks +# Input: +# - __sr_tasks_from: tasks_from to run - same as tasks_from in include_role +# - __sr_public: export private vars from role - same as public in include_role +# - __sr_failed_when: set to false to ignore role errors - same as failed_when in include_role +- name: Clear facts + meta: clear_facts + +# note that you can use failed_when with import_role but not with include_role +# so this simulates the __sr_failed_when false case +# Q: Why do we need a separate task to run the role normally? Why not just +# run the role in the block and rethrow the error in the rescue block? +# A: Because you cannot rethrow the error in exactly the same way as the role does. +# It might be possible to exactly reconstruct ansible_failed_result but it's not worth the effort. +- name: Run the role with __sr_failed_when false + when: + - __sr_failed_when is defined + - not __sr_failed_when + block: + - name: Run the role + include_role: + name: linux-system-roles.nbde_server + tasks_from: "{{ __sr_tasks_from | default('main') }}" + public: "{{ __sr_public | default(false) }}" + rescue: + - name: Ignore the failure when __sr_failed_when is false + debug: + msg: Ignoring failure when __sr_failed_when is false + +- name: Run the role normally + include_role: + name: linux-system-roles.nbde_server + tasks_from: "{{ __sr_tasks_from | default('main') }}" + public: "{{ __sr_public | default(false) }}" + when: __sr_failed_when | d(true) diff --git a/tests/tests_default.yml b/tests/tests_default.yml index f90ef947..21780633 100644 --- a/tests/tests_default.yml +++ b/tests/tests_default.yml @@ -1,14 +1,13 @@ --- - name: Ensure that the role runs with default parameters hosts: all - gather_facts: false tasks: - name: Run test block: - name: Run role - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Verify role results include_tasks: tasks/verify-role-results.yml diff --git a/tests/tests_default_vars.yml b/tests/tests_default_vars.yml index cf1ba836..67c933cb 100644 --- a/tests/tests_default_vars.yml +++ b/tests/tests_default_vars.yml @@ -5,9 +5,9 @@ - name: Run test block: - name: Run role - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Assert that the role declares all parameters in defaults assert: diff --git a/tests/tests_deploy_keys.yml b/tests/tests_deploy_keys.yml index 934d9bfb..230322d6 100644 --- a/tests/tests_deploy_keys.yml +++ b/tests/tests_deploy_keys.yml @@ -21,14 +21,12 @@ nbde_server_keys_dir: "{{ __tmpdir.path }}" - name: Ensure we have keys - include_role: - name: linux-system-roles.nbde_server + include_tasks: tasks/run_role_with_clear_facts.yml - name: Fetch the keys from every host - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: true nbde_server_deploy_keys: false @@ -42,10 +40,9 @@ register: nbde_server_keys_before_redeploy - name: Redeploy these same keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: false nbde_server_deploy_keys: true diff --git a/tests/tests_fetch_keys_deploy_not_set.yml b/tests/tests_fetch_keys_deploy_not_set.yml index 9b8ad8d8..72f64b40 100644 --- a/tests/tests_fetch_keys_deploy_not_set.yml +++ b/tests/tests_fetch_keys_deploy_not_set.yml @@ -25,9 +25,9 @@ nbde_server_keys_dir: "{{ __tmpdir.path }}" - name: Ensure we have keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Gather keys find: @@ -39,10 +39,9 @@ register: nbde_server_host_keys - name: Run with nbde_server_deploy_keys not set to check the keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_rotate_keys: false nbde_server_fetch_keys: true nbde_server_deploy_keys: false diff --git a/tests/tests_fetch_keys_deploy_set.yml b/tests/tests_fetch_keys_deploy_set.yml index 840746ed..91f93c0b 100644 --- a/tests/tests_fetch_keys_deploy_set.yml +++ b/tests/tests_fetch_keys_deploy_set.yml @@ -30,9 +30,9 @@ nbde_server_keys_dir: "{{ __tmpdir.path }}" - name: Ensure we have keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Gather common keys, from the first host in the inventory run_once: true @@ -45,10 +45,9 @@ register: nbde_server_host_common_keys - name: Run with nbde_server_deploy_keys set to check the common keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_rotate_keys: false nbde_server_fetch_keys: true nbde_server_deploy_keys: true diff --git a/tests/tests_include_vars_from_parent.yml b/tests/tests_include_vars_from_parent.yml index ab088b6f..f4b9e55f 100644 --- a/tests/tests_include_vars_from_parent.yml +++ b/tests/tests_include_vars_from_parent.yml @@ -1,7 +1,6 @@ --- - name: Test role include variable override hosts: all - gather_facts: true tasks: - name: Create var file in caller that can override the one in called role delegate_to: localhost diff --git a/tests/tests_nbde_server_keys_dir.yml b/tests/tests_nbde_server_keys_dir.yml index 0f388161..cd332b8f 100644 --- a/tests/tests_nbde_server_keys_dir.yml +++ b/tests/tests_nbde_server_keys_dir.yml @@ -9,10 +9,9 @@ - name: Test 1 - only nbde_server_fetch_keys set block: - name: With nbde_server_fetch_keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: true - name: Unreachable task @@ -32,10 +31,9 @@ - name: Test 2 - only nbde_server_deploy_keys set block: - name: With nbde_server_deploy_keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_deploy_keys: true - name: Unreachable task @@ -55,10 +53,9 @@ - name: Test 3 - nbde_server_fetch_keys and nbde_server_deploy_keys set block: - name: With nbde_server_fetch_keys and deploy keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: true nbde_server_deploy_keys: true @@ -79,10 +76,9 @@ - name: Test 4 - nbde_server_keys_dir is absolute path block: - name: Directory starting with ./ - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: true nbde_server_keys_dir: ./foobar @@ -103,10 +99,9 @@ - name: Test 5 - nbde_server_keys_dir is absolute path block: - name: Directory without leading ./ - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_fetch_keys: true nbde_server_keys_dir: foobar diff --git a/tests/tests_nbde_server_rotate_keys.yml b/tests/tests_nbde_server_rotate_keys.yml index 00550b90..a0c74bd9 100644 --- a/tests/tests_nbde_server_rotate_keys.yml +++ b/tests/tests_nbde_server_rotate_keys.yml @@ -10,9 +10,9 @@ - name: Run tests block: - name: Ensure we have keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Gather keys find: @@ -26,10 +26,9 @@ register: nbde_server_keys - name: Run with nbde_server_rotate_keys not set to check keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_rotate_keys: false - name: Gather keys after running with nbde_server_rotate_keys not set @@ -48,10 +47,9 @@ that: nbde_server_keys.files == nbde_server_rotate_not_set.files - name: Run with nbde_server_rotate_keys set to check keys - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_rotate_keys: true - name: Gather keys after running with nbde_server_rotate_keys set diff --git a/tests/tests_nbde_server_service_state.yml b/tests/tests_nbde_server_service_state.yml index 6b333420..4198d52e 100644 --- a/tests/tests_nbde_server_service_state.yml +++ b/tests/tests_nbde_server_service_state.yml @@ -10,9 +10,9 @@ - name: Run tests block: - name: Accepting connections without specifying state - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true - name: Gather state of services service: @@ -29,10 +29,9 @@ loop: "{{ nbde_server_state.results }}" - name: Not accepting connections specifying state stopped - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_service_state: stopped - name: Gather state of services @@ -50,10 +49,9 @@ loop: "{{ nbde_server_state.results }}" - name: Accepting connections specifying state started - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_service_state: started - name: Gather state of services diff --git a/tests/tests_share_system_dir.yml b/tests/tests_share_system_dir.yml index d9ca2675..4d2e3a2c 100644 --- a/tests/tests_share_system_dir.yml +++ b/tests/tests_share_system_dir.yml @@ -3,7 +3,6 @@ Ensure that the role can share tangd.socket.d directory with other files hosts: all - gather_facts: false vars: maxcon_conf: /etc/systemd/system/tangd.socket.d/override2.conf tangd_dir_mode: "0775" @@ -26,9 +25,9 @@ mode: "{{ tangd_file_mode }}" - name: Run role - include_role: - name: linux-system-roles.nbde_server - public: true # only need this the first time to get private vars + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true # only need this the first time to get private vars - name: Check tangd socket dir stat: @@ -49,8 +48,7 @@ that: not __nbde_server_custom_dir is changed - name: Run the role with a custom port - include_role: - name: linux-system-roles.nbde_server + include_tasks: tasks/run_role_with_clear_facts.yml vars: nbde_server_port: 7500 nbde_server_firewall_zone: public @@ -87,8 +85,7 @@ state: absent - name: Run the role with default port - include_role: - name: linux-system-roles.nbde_server + include_tasks: tasks/run_role_with_clear_facts.yml - name: Check tangd socket dir is absent stat: diff --git a/tests/tests_tangd_custom_port.yml b/tests/tests_tangd_custom_port.yml index 683e634a..0dfa2208 100644 --- a/tests/tests_tangd_custom_port.yml +++ b/tests/tests_tangd_custom_port.yml @@ -10,9 +10,9 @@ - name: Run tests block: - name: Install with custom port and firewall zone - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml + vars: + __sr_public: true when: not __bootc_validation | d(false) # role does not run during bootc QEMU validation, thus some vars are undefined @@ -80,10 +80,9 @@ - name: Install with default port and firewall zone - include_role: - name: linux-system-roles.nbde_server - public: true + include_tasks: tasks/run_role_with_clear_facts.yml vars: + __sr_public: true nbde_server_port: 80 nbde_server_firewall_zone: public nbde_server_manage_firewall: true