Modifying schedules API to allow for rrulesets #5733 (#12043)

* Added schedule_rruleset lookup plugin for awx.awx
* Added DB migration for rrule size
* Updated schedule docs
* The schedule API endpoint will now return an array of errors on rule validation to try and inform the user of all errors instead of just the first
This commit is contained in:
John Westcott IV
2022-04-28 15:38:20 -04:00
committed by GitHub
parent 2bef5ce09b
commit c67f50831b
10 changed files with 1207 additions and 118 deletions

View File

@@ -0,0 +1,342 @@
---
- name: Get our collection package
controller_meta:
register: controller_meta
- name: Generate the name of our plugin
set_fact:
ruleset_plugin_name: "{{ controller_meta.prefix }}.schedule_rruleset"
rule_plugin_name: "{{ controller_meta.prefix }}.schedule_rrule"
- name: Call ruleset with no rules
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45') }}"
ignore_errors: True
register: results
- assert:
that:
- results is failed
- "'You must include rules to be in the ruleset via the rules parameter' in results.msg"
- name: call ruleset with a missing frequency
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- interval: 1
byweekday: 'sunday'
- assert:
that:
- results is failed
- "'Rule 2 is missing a frequency' in results.msg"
- name: call ruleset with a missing frequency
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- interval: 1
byweekday: 'sunday'
- assert:
that:
- results is failed
- "'Rule 2 is missing a frequency' in results.msg"
- name: call rruleset with an invalid frequency
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'asdf'
interval: 1
byweekday: 'sunday'
- assert:
that:
- results is failed
- "'Frequency of rule 2 is invalid asdf' in results.msg"
- name: call rruleset with an invalid end_on
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'day'
interval: 1
byweekday: 'sunday'
end_on: 'a'
- assert:
that:
- results is failed
- "'In rule 2 end_on must either be an integer or in the format YYYY-MM-DD [HH:MM:SS]' in results.msg"
- name: call rruleset with an invalid byweekday
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'day'
interval: 1
byweekday: 'junk'
- assert:
that:
- results is failed
- "'In rule 2 byweekday must only contain values' in results.msg"
- name: call rruleset with a monthly rule with invalid bymonthday (a)
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'month'
interval: 1
bymonthday: 'a'
- assert:
that:
- results is failed
- "'In rule 2 bymonthday must be between 1 and 31' in results.msg"
- name: call rruleset with a monthly rule with invalid bymonthday (-1)
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'month'
interval: 1
bymonthday: '-1'
- assert:
that:
- results is failed
- "'In rule 2 bymonthday must be between 1 and 31' in results.msg"
- name: call rruleset with a monthly rule with invalid bymonthday (32)
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'month'
interval: 1
bymonthday: 32
- assert:
that:
- results is failed
- "'In rule 2 bymonthday must be between 1 and 31' in results.msg"
- name: call rruleset with a monthly rule with invalid bysetpos (junk)
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'month'
interval: 1
bysetpos: 'junk'
- assert:
that:
- results is failed
- "'In rule 2 bysetpos must only contain values in first, second, third, fourth, last' in results.msg"
- name: call rruleset with an invalid timezone
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules, timezone='junk' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'day'
interval: 1
byweekday: 'sunday'
- assert:
that:
- results is failed
- "'Timezone parameter is not valid' in results.msg"
- name: call rruleset with only exclude rules
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
include: False
- frequency: 'day'
interval: 1
byweekday: 'sunday'
include: False
- assert:
that:
- results is failed
- "'A ruleset must contain at least one RRULE' in results.msg"
- name: Every day except for Sundays
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules, timezone='UTC' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'day'
interval: 1
byweekday: 'sunday'
include: False
- assert:
that:
- results is success
- "'DTSTART;TZID=UTC:20220430T103045 RRULE:FREQ=DAILY;INTERVAL=1 EXRULE:FREQ=DAILY;BYDAY=SU;INTERVAL=1' == complex_rule"
- name: Every day except for April 30th
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2023-04-28 17:00:00', rules=rrules, timezone='UTC' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'day'
interval: 1
- frequency: 'day'
interval: 1
bymonth: '4'
bymonthday: 30
include: False
- assert:
that:
- results is success
- "'DTSTART;TZID=UTC:20230428T170000 RRULE:FREQ=DAILY;INTERVAL=1 EXRULE:FREQ=DAILY;BYMONTH=4;BYMONTHDAY=30;INTERVAL=1' == complex_rule"
- name: Every 5 minutes but not on Mondays from 5-7pm
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules, timezone='UTC' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'minute'
interval: 5
- frequency: 'minute'
interval: 5
byweekday: 'monday'
byhour:
- 17
- 18
include: False
- assert:
that:
- results is success
- "'DTSTART;TZID=UTC:20220430T103045 RRULE:FREQ=MINUTELY;INTERVAL=5 EXRULE:FREQ=MINUTELY;INTERVAL=5;BYDAY=MO;BYHOUR=17,18' == complex_rule"
- name: Every 15 minutes Monday to Friday from 10:01am to 6:02pm (inclusive)
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules, timezone='UTC' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'minute'
byweekday:
- monday
- tuesday
- wednesday
- thursday
- friday
interval: 15
byhour: [10, 11, 12, 13, 14, 15, 16, 17, 18]
- frequency: 'minute'
interval: 1
byweekday: "monday,tuesday,wednesday, thursday,friday"
byhour: 18
byminute: "{{ range(3, 60) | list }}"
include: False
- assert:
that:
- results is success
- "'DTSTART;TZID=UTC:20220430T103045 RRULE:FREQ=MINUTELY;INTERVAL=15;BYDAY=MO,TU,WE,TH,FR;BYHOUR=10,11,12,13,14,15,16,17,18 EXRULE:FREQ=MINUTELY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=18;BYMINUTE=3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59;INTERVAL=1' == complex_rule"
- name: Any Saturday whose month day is between 12 and 18
set_fact:
complex_rule: "{{ query(ruleset_plugin_name, '2022-04-30 10:30:45', rules=rrules, timezone='UTC' ) }}"
ignore_errors: True
register: results
vars:
rrules:
- frequency: 'month'
interval: 1
byweekday: 'saturday'
bymonthday: "{{ range(12,19) | list }}"
- assert:
that:
- results is success
- "'DTSTART;TZID=UTC:20220430T103045 RRULE:FREQ=MONTHLY;BYMONTHDAY=12,13,14,15,16,17,18;BYDAY=SA;INTERVAL=1' == complex_rule"