cronvar - use correct binary name (#63279)

Fixes regression introduced by #62554
Add integration tests for cronvar
This commit is contained in:
Sam Doran 2019-10-09 18:33:25 -04:00 committed by GitHub
parent ce402f003f
commit 9d014778ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 273 additions and 161 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- cronvar - use correct binary name (https://github.com/ansible/ansible/issues/63274)

View file

@ -126,7 +126,7 @@ class CronVar(object):
self.user = user
self.lines = None
self.wordchars = ''.join(chr(x) for x in range(128) if chr(x) not in ('=', "'", '"',))
self.cron_cmd = self.module.get_bin_path('cronvar', required=True)
self.cron_cmd = self.module.get_bin_path('crontab', required=True)
if cron_file:
self.cron_file = ""

View file

@ -1,2 +1 @@
---
faketime_pkg: libfaketime

View file

@ -0,0 +1,2 @@
dependencies:
- setup_cron

View file

@ -1,173 +1,101 @@
- include_vars: "{{ lookup('first_found', search) }}"
vars:
search:
files:
- 'cron.{{ ansible_system | lower }}.yml'
- 'cron.{{ ansible_distribution | lower }}.yml'
- 'cron.{{ ansible_os_family | lower }}.yml'
paths:
- '../defaults/'
- name: add cron task (check mode enabled, cron task not already created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
check_mode: yes
register: check_mode_enabled_state_present
- vars:
remote_dir: "{{ lookup('env', 'OUTPUT_DIR') }}"
block:
- name: install cron package
package:
name: '{{ cron_pkg }}'
when: cron_pkg|default(false, true)
register: cron_package_installed
until: cron_package_installed is success
- assert:
that: check_mode_enabled_state_present is changed
- when: faketime_pkg|default(false, true)
block:
- name: install cron and faketime packages
package:
name: '{{ faketime_pkg }}'
register: faketime_package_installed
until: faketime_package_installed is success
- name: add cron task (check mode disabled, task hasn't already been created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
register: add_cron_task
- name: Find libfaketime path
shell: '{{ list_pkg_files }} {{ faketime_pkg }} | grep -F libfaketime.so.1'
args:
warn: false
register: libfaketime_path
- assert:
that: add_cron_task is changed
- when: ansible_service_mgr == 'systemd'
block:
- name: create directory for cron drop-in file
file:
path: '/etc/systemd/system/{{ cron_service }}.service.d'
state: directory
owner: root
group: root
mode: 0755
- name: add cron task (check mode enabled, cron task already exists)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
check_mode: yes
register: check_mode_enabled_state_present_cron_task_already_exists
- name: Use faketime with cron service
copy:
content: |-
[Service]
Environment=LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }}
Environment="FAKETIME=+0y x10"
Environment=RANDOM_DELAY=0
dest: '/etc/systemd/system/{{ cron_service }}.service.d/faketime.conf'
owner: root
group: root
mode: 0644
- assert:
that: check_mode_enabled_state_present_cron_task_already_exists is not changed
- when: ansible_system == 'FreeBSD'
name: Use faketime with cron service
copy:
content: |-
cron_env='LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }} FAKETIME="+0y x10"'
dest: '/etc/rc.conf.d/cron'
owner: root
group: wheel
mode: 0644
- name: add cron task (check mode disabled, cron task already created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
register: cron_task_already_created
- name: enable cron service
service:
daemon-reload: "{{ (ansible_service_mgr == 'systemd')|ternary(true, omit) }}"
name: '{{ cron_service }}'
state: restarted
- assert:
that: cron_task_already_created is not changed
- name: add cron task (check mode enabled, cron task not already created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
check_mode: yes
register: check_mode_enabled_state_present
- block:
- name: wait for canary creation
wait_for:
path: '{{ remote_dir }}/cron_canary1'
timeout: '{{ 20 if faketime_pkg else 70 }}'
register: wait_canary
always:
- name: display some logs in case of failure
command: 'journalctl -u {{ cron_service }}'
when: wait_canary is failed and ansible_service_mgr == 'systemd'
- assert:
that: check_mode_enabled_state_present is changed
- debug:
msg: 'elapsed time waiting for canary: {{ wait_canary.elapsed }}'
- name: add cron task (check mode disabled, task hasn't already been created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
register: add_cron_task
- name: Check check_mode
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
check_mode: yes
register: check_check_mode
- assert:
that: add_cron_task is changed
- assert:
that: check_check_mode is changed
- name: add cron task (check mode enabled, cron task already exists)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
check_mode: yes
register: check_mode_enabled_state_present_cron_task_already_exists
- name: Remove a cron task
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: remove_task
- assert:
that: check_mode_enabled_state_present_cron_task_already_exists is not changed
- assert:
that: remove_task is changed
- name: add cron task (check mode disabled, cron task already created)
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
register: cron_task_already_created
- name: 'cron task missing: check idempotence (check mode enabled, state=absent)'
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: check_mode_enabled_remove_task_idempotence
- assert:
that: cron_task_already_created is not changed
- assert:
that: check_mode_enabled_remove_task_idempotence is not changed
- block:
- name: wait for canary creation
wait_for:
path: '{{ remote_dir }}/cron_canary1'
timeout: '{{ 20 if faketime_pkg else 70 }}'
register: wait_canary
always:
- name: display some logs in case of failure
command: 'journalctl -u {{ cron_service }}'
when: wait_canary is failed and ansible_service_mgr == 'systemd'
- name: 'cron task missing: check idempotence (check mode disabled, state=absent)'
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: remove_task_idempotence
- debug:
msg: 'elapsed time waiting for canary: {{ wait_canary.elapsed }}'
- assert:
that: remove_task_idempotence is not changed
- name: Check check_mode
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
check_mode: yes
register: check_check_mode
- name: Check that removing a cron task with cron_file and without specifying an user is allowed (#58493)
cron:
cron_file: unexistent_cron_file
state: absent
register: remove_cron_file
- assert:
that: check_check_mode is changed
- name: Remove a cron task
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: remove_task
- assert:
that: remove_task is changed
- name: 'cron task missing: check idempotence (check mode enabled, state=absent)'
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: check_mode_enabled_remove_task_idempotence
- assert:
that: check_mode_enabled_remove_task_idempotence is not changed
- name: 'cron task missing: check idempotence (check mode disabled, state=absent)'
cron:
name: test cron task
job: 'date > {{ remote_dir }}/cron_canary1'
state: absent
register: remove_task_idempotence
- assert:
that: remove_task_idempotence is not changed
- name: Check that removing a cron task with cron_file and without specifying an user is allowed (#58493)
cron:
cron_file: unexistent_cron_file
state: absent
register: remove_cron_file
- assert:
that: remove_cron_file is not changed
- assert:
that: remove_cron_file is not changed

View file

@ -0,0 +1,3 @@
destructive
shippable/posix/group4
skip/osx

View file

@ -0,0 +1 @@
cron_config_path: /etc/cron.d

View file

@ -0,0 +1,2 @@
dependencies:
- setup_cron

View file

@ -0,0 +1,109 @@
- name: Create EMAIL cron var
cronvar:
name: EMAIL
value: doug@ansibmod.con.com
register: create_cronvar1
- name: Create EMAIL cron var again
cronvar:
name: EMAIL
value: doug@ansibmod.con.com
register: create_cronvar2
- name: Check cron var value
shell: crontab -l -u root | grep -c EMAIL=doug@ansibmod.con.com
register: varcheck1
- name: Modify EMAIL cron var
cronvar:
name: EMAIL
value: jane@ansibmod.con.com
register: create_cronvar3
- name: Check cron var value again
shell: crontab -l -u root | grep -c EMAIL=jane@ansibmod.con.com
register: varcheck2
- name: Remove EMAIL cron var
cronvar:
name: EMAIL
state: absent
register: remove_cronvar1
- name: Remove EMAIL cron var again
cronvar:
name: EMAIL
state: absent
register: remove_cronvar2
- name: Check cron var value again
shell: crontab -l -u root | grep -c EMAIL
register: varcheck3
failed_when: varcheck3.rc == 0
- name: Add cron var to custom file
cronvar:
name: TESTVAR
value: somevalue
cron_file: cronvar_test
register: custom_cronfile1
- name: Add cron var to custom file again
cronvar:
name: TESTVAR
value: somevalue
cron_file: cronvar_test
register: custom_cronfile2
- name: Check cron var value in custom file
command: grep -c TESTVAR=somevalue {{ cron_config_path }}/cronvar_test
register: custom_varcheck1
- name: Change cron var in custom file
cronvar:
name: TESTVAR
value: newvalue
cron_file: cronvar_test
register: custom_cronfile3
- name: Check cron var value in custom file
command: grep -c TESTVAR=newvalue {{ cron_config_path }}/cronvar_test
register: custom_varcheck2
- name: Remove cron var from custom file
cronvar:
name: TESTVAR
value: newvalue
cron_file: cronvar_test
state: absent
register: custom_remove_cronvar1
- name: Remove cron var from custom file again
cronvar:
name: TESTVAR
value: newvalue
cron_file: cronvar_test
state: absent
register: custom_remove_cronvar2
- name: Check cron var value
command: grep -c TESTVAR=newvalue {{ cron_config_path }}/cronvar_test
register: custom_varcheck3
failed_when: custom_varcheck3.rc == 0
- name: Esure cronvar tasks did the right thing
assert:
that:
- create_cronvar1 is changed
- create_cronvar2 is not changed
- create_cronvar3 is changed
- remove_cronvar1 is changed
- remove_cronvar2 is not changed
- varcheck1.stdout == '1'
- varcheck2.stdout == '1'
- varcheck3.stdout == '0'
- custom_remove_cronvar1 is changed
- custom_remove_cronvar2 is not changed
- custom_varcheck1.stdout == '1'
- custom_varcheck2.stdout == '1'
- custom_varcheck3.stdout == '0'

View file

@ -0,0 +1 @@
remote_dir: "{{ lookup('env', 'OUTPUT_DIR') }}"

View file

@ -0,0 +1,70 @@
- name: Include distribution specific variables
include_vars: "{{ lookup('first_found', search) }}"
vars:
search:
files:
- '{{ ansible_distribution | lower }}.yml'
- '{{ ansible_os_family | lower }}.yml'
- '{{ ansible_system | lower }}.yml'
- default.yml
paths:
- vars
- name: install cron package
package:
name: '{{ cron_pkg }}'
when: cron_pkg | default(false, true)
register: cron_package_installed
until: cron_package_installed is success
- when: faketime_pkg | default(false, true)
block:
- name: install cron and faketime packages
package:
name: '{{ faketime_pkg }}'
register: faketime_package_installed
until: faketime_package_installed is success
- name: Find libfaketime path
shell: '{{ list_pkg_files }} {{ faketime_pkg }} | grep -F libfaketime.so.1'
args:
warn: false
register: libfaketime_path
- when: ansible_service_mgr == 'systemd'
block:
- name: create directory for cron drop-in file
file:
path: '/etc/systemd/system/{{ cron_service }}.service.d'
state: directory
owner: root
group: root
mode: 0755
- name: Use faketime with cron service
copy:
content: |-
[Service]
Environment=LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }}
Environment="FAKETIME=+0y x10"
Environment=RANDOM_DELAY=0
dest: '/etc/systemd/system/{{ cron_service }}.service.d/faketime.conf'
owner: root
group: root
mode: 0644
- when: ansible_system == 'FreeBSD'
name: Use faketime with cron service
copy:
content: |-
cron_env='LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }} FAKETIME="+0y x10"'
dest: '/etc/rc.conf.d/cron'
owner: root
group: wheel
mode: 0644
- name: enable cron service
service:
daemon-reload: "{{ (ansible_service_mgr == 'systemd') | ternary(true, omit) }}"
name: '{{ cron_service }}'
state: restarted

View file

@ -1,4 +1,3 @@
---
cron_pkg: cron
cron_service: cron
list_pkg_files: dpkg -L

View file

@ -1,4 +1,3 @@
---
cron_pkg: cronie
cron_service: crond
list_pkg_files: rpm -ql

View file

@ -1,4 +1,3 @@
---
cron_pkg:
cron_service: cron
list_pkg_files: pkg info --list-files

View file

@ -1,4 +1,3 @@
---
cron_pkg: cronie
cron_service: crond
faketime_pkg:

View file

@ -1,4 +1,3 @@
---
cron_pkg: cron
cron_service: cron
list_pkg_files: rpm -ql