Skip to content

Commit 0da9252

Browse files
committed
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 <rmeggins@redhat.com>
1 parent be1486d commit 0da9252

12 files changed

Lines changed: 92 additions & 75 deletions
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
# Task file: clear_facts, run linux-system-roles.nbde_server.
3+
# Include this with include_tasks or import_tasks
4+
# Input:
5+
# - __sr_tasks_from: tasks_from to run - same as tasks_from in include_role
6+
# - __sr_public: export private vars from role - same as public in include_role
7+
# - __sr_failed_when: set to false to ignore role errors - same as failed_when in include_role
8+
- name: Clear facts
9+
meta: clear_facts
10+
11+
# note that you can use failed_when with import_role but not with include_role
12+
# so this simulates the __sr_failed_when false case
13+
# Q: Why do we need a separate task to run the role normally? Why not just
14+
# run the role in the block and rethrow the error in the rescue block?
15+
# A: Because you cannot rethrow the error in exactly the same way as the role does.
16+
# It might be possible to exactly reconstruct ansible_failed_result but it's not worth the effort.
17+
- name: Run the role with __sr_failed_when false
18+
when:
19+
- __sr_failed_when is defined
20+
- not __sr_failed_when
21+
block:
22+
- name: Run the role
23+
include_role:
24+
name: linux-system-roles.nbde_server
25+
tasks_from: "{{ __sr_tasks_from | default('main') }}"
26+
public: "{{ __sr_public | default(false) }}"
27+
rescue:
28+
- name: Ignore the failure when __sr_failed_when is false
29+
debug:
30+
msg: Ignoring failure when __sr_failed_when is false
31+
32+
- name: Run the role normally
33+
include_role:
34+
name: linux-system-roles.nbde_server
35+
tasks_from: "{{ __sr_tasks_from | default('main') }}"
36+
public: "{{ __sr_public | default(false) }}"
37+
when: __sr_failed_when | d(true)

tests/tests_default.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
---
22
- name: Ensure that the role runs with default parameters
33
hosts: all
4-
gather_facts: false
54
tasks:
65
- name: Run test
76
block:
87
- name: Run role
9-
include_role:
10-
name: linux-system-roles.nbde_server
11-
public: true
8+
include_tasks: tasks/run_role_with_clear_facts.yml
9+
vars:
10+
__sr_public: true
1211

1312
- name: Verify role results
1413
include_tasks: tasks/verify-role-results.yml

tests/tests_default_vars.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
- name: Run test
66
block:
77
- name: Run role
8-
include_role:
9-
name: linux-system-roles.nbde_server
10-
public: true
8+
include_tasks: tasks/run_role_with_clear_facts.yml
9+
vars:
10+
__sr_public: true
1111

1212
- name: Assert that the role declares all parameters in defaults
1313
assert:

tests/tests_deploy_keys.yml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,12 @@
2121
nbde_server_keys_dir: "{{ __tmpdir.path }}"
2222

2323
- name: Ensure we have keys
24-
include_role:
25-
name: linux-system-roles.nbde_server
24+
include_tasks: tasks/run_role_with_clear_facts.yml
2625

2726
- name: Fetch the keys from every host
28-
include_role:
29-
name: linux-system-roles.nbde_server
30-
public: true
27+
include_tasks: tasks/run_role_with_clear_facts.yml
3128
vars:
29+
__sr_public: true
3230
nbde_server_fetch_keys: true
3331
nbde_server_deploy_keys: false
3432

@@ -42,10 +40,9 @@
4240
register: nbde_server_keys_before_redeploy
4341

4442
- name: Redeploy these same keys
45-
include_role:
46-
name: linux-system-roles.nbde_server
47-
public: true
43+
include_tasks: tasks/run_role_with_clear_facts.yml
4844
vars:
45+
__sr_public: true
4946
nbde_server_fetch_keys: false
5047
nbde_server_deploy_keys: true
5148

tests/tests_fetch_keys_deploy_not_set.yml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
nbde_server_keys_dir: "{{ __tmpdir.path }}"
2626

2727
- name: Ensure we have keys
28-
include_role:
29-
name: linux-system-roles.nbde_server
30-
public: true
28+
include_tasks: tasks/run_role_with_clear_facts.yml
29+
vars:
30+
__sr_public: true
3131

3232
- name: Gather keys
3333
find:
@@ -39,10 +39,9 @@
3939
register: nbde_server_host_keys
4040

4141
- name: Run with nbde_server_deploy_keys not set to check the keys
42-
include_role:
43-
name: linux-system-roles.nbde_server
44-
public: true
42+
include_tasks: tasks/run_role_with_clear_facts.yml
4543
vars:
44+
__sr_public: true
4645
nbde_server_rotate_keys: false
4746
nbde_server_fetch_keys: true
4847
nbde_server_deploy_keys: false

tests/tests_fetch_keys_deploy_set.yml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
nbde_server_keys_dir: "{{ __tmpdir.path }}"
3131

3232
- name: Ensure we have keys
33-
include_role:
34-
name: linux-system-roles.nbde_server
35-
public: true
33+
include_tasks: tasks/run_role_with_clear_facts.yml
34+
vars:
35+
__sr_public: true
3636

3737
- name: Gather common keys, from the first host in the inventory
3838
run_once: true
@@ -45,10 +45,9 @@
4545
register: nbde_server_host_common_keys
4646

4747
- name: Run with nbde_server_deploy_keys set to check the common keys
48-
include_role:
49-
name: linux-system-roles.nbde_server
50-
public: true
48+
include_tasks: tasks/run_role_with_clear_facts.yml
5149
vars:
50+
__sr_public: true
5251
nbde_server_rotate_keys: false
5352
nbde_server_fetch_keys: true
5453
nbde_server_deploy_keys: true

tests/tests_include_vars_from_parent.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
---
22
- name: Test role include variable override
33
hosts: all
4-
gather_facts: true
54
tasks:
65
- name: Create var file in caller that can override the one in called role
76
delegate_to: localhost

tests/tests_nbde_server_keys_dir.yml

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
- name: Test 1 - only nbde_server_fetch_keys set
1010
block:
1111
- name: With nbde_server_fetch_keys
12-
include_role:
13-
name: linux-system-roles.nbde_server
14-
public: true
12+
include_tasks: tasks/run_role_with_clear_facts.yml
1513
vars:
14+
__sr_public: true
1615
nbde_server_fetch_keys: true
1716

1817
- name: Unreachable task
@@ -32,10 +31,9 @@
3231
- name: Test 2 - only nbde_server_deploy_keys set
3332
block:
3433
- name: With nbde_server_deploy_keys
35-
include_role:
36-
name: linux-system-roles.nbde_server
37-
public: true
34+
include_tasks: tasks/run_role_with_clear_facts.yml
3835
vars:
36+
__sr_public: true
3937
nbde_server_deploy_keys: true
4038

4139
- name: Unreachable task
@@ -55,10 +53,9 @@
5553
- name: Test 3 - nbde_server_fetch_keys and nbde_server_deploy_keys set
5654
block:
5755
- name: With nbde_server_fetch_keys and deploy keys
58-
include_role:
59-
name: linux-system-roles.nbde_server
60-
public: true
56+
include_tasks: tasks/run_role_with_clear_facts.yml
6157
vars:
58+
__sr_public: true
6259
nbde_server_fetch_keys: true
6360
nbde_server_deploy_keys: true
6461

@@ -79,10 +76,9 @@
7976
- name: Test 4 - nbde_server_keys_dir is absolute path
8077
block:
8178
- name: Directory starting with ./
82-
include_role:
83-
name: linux-system-roles.nbde_server
84-
public: true
79+
include_tasks: tasks/run_role_with_clear_facts.yml
8580
vars:
81+
__sr_public: true
8682
nbde_server_fetch_keys: true
8783
nbde_server_keys_dir: ./foobar
8884

@@ -103,10 +99,9 @@
10399
- name: Test 5 - nbde_server_keys_dir is absolute path
104100
block:
105101
- name: Directory without leading ./
106-
include_role:
107-
name: linux-system-roles.nbde_server
108-
public: true
102+
include_tasks: tasks/run_role_with_clear_facts.yml
109103
vars:
104+
__sr_public: true
110105
nbde_server_fetch_keys: true
111106
nbde_server_keys_dir: foobar
112107

tests/tests_nbde_server_rotate_keys.yml

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
- name: Run tests
1111
block:
1212
- name: Ensure we have keys
13-
include_role:
14-
name: linux-system-roles.nbde_server
15-
public: true
13+
include_tasks: tasks/run_role_with_clear_facts.yml
14+
vars:
15+
__sr_public: true
1616

1717
- name: Gather keys
1818
find:
@@ -26,10 +26,9 @@
2626
register: nbde_server_keys
2727

2828
- name: Run with nbde_server_rotate_keys not set to check keys
29-
include_role:
30-
name: linux-system-roles.nbde_server
31-
public: true
29+
include_tasks: tasks/run_role_with_clear_facts.yml
3230
vars:
31+
__sr_public: true
3332
nbde_server_rotate_keys: false
3433

3534
- name: Gather keys after running with nbde_server_rotate_keys not set
@@ -48,10 +47,9 @@
4847
that: nbde_server_keys.files == nbde_server_rotate_not_set.files
4948

5049
- name: Run with nbde_server_rotate_keys set to check keys
51-
include_role:
52-
name: linux-system-roles.nbde_server
53-
public: true
50+
include_tasks: tasks/run_role_with_clear_facts.yml
5451
vars:
52+
__sr_public: true
5553
nbde_server_rotate_keys: true
5654

5755
- name: Gather keys after running with nbde_server_rotate_keys set

tests/tests_nbde_server_service_state.yml

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
- name: Run tests
1111
block:
1212
- name: Accepting connections without specifying state
13-
include_role:
14-
name: linux-system-roles.nbde_server
15-
public: true
13+
include_tasks: tasks/run_role_with_clear_facts.yml
14+
vars:
15+
__sr_public: true
1616

1717
- name: Gather state of services
1818
service:
@@ -29,10 +29,9 @@
2929
loop: "{{ nbde_server_state.results }}"
3030

3131
- name: Not accepting connections specifying state stopped
32-
include_role:
33-
name: linux-system-roles.nbde_server
34-
public: true
32+
include_tasks: tasks/run_role_with_clear_facts.yml
3533
vars:
34+
__sr_public: true
3635
nbde_server_service_state: stopped
3736

3837
- name: Gather state of services
@@ -50,10 +49,9 @@
5049
loop: "{{ nbde_server_state.results }}"
5150

5251
- name: Accepting connections specifying state started
53-
include_role:
54-
name: linux-system-roles.nbde_server
55-
public: true
52+
include_tasks: tasks/run_role_with_clear_facts.yml
5653
vars:
54+
__sr_public: true
5755
nbde_server_service_state: started
5856

5957
- name: Gather state of services

0 commit comments

Comments
 (0)