From 71a6baccdb303fa608581e86ada53ffa5da38439 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Thu, 15 Dec 2022 16:40:51 -0500 Subject: [PATCH] Fix lookup plugins sanity (#13238) * fix pytz * fix NameError * fix tests and add sanity ignore files for import test until distutils replaced * change static method to regular method and update test to instantiate class --- .../plugins/lookup/schedule_rrule.py | 75 ++++++++-------- .../plugins/lookup/schedule_rruleset.py | 70 ++++++++------- awx_collection/test/awx/test_schedule.py | 6 +- awx_collection/tests/sanity/ignore-2.13.txt | 88 +++++++++++++++++++ awx_collection/tests/sanity/ignore-2.14.txt | 88 +++++++++++++++++++ 5 files changed, 253 insertions(+), 74 deletions(-) create mode 100644 awx_collection/tests/sanity/ignore-2.13.txt create mode 100644 awx_collection/tests/sanity/ignore-2.14.txt diff --git a/awx_collection/plugins/lookup/schedule_rrule.py b/awx_collection/plugins/lookup/schedule_rrule.py index c72a9ee6dc..b623dfc86e 100644 --- a/awx_collection/plugins/lookup/schedule_rrule.py +++ b/awx_collection/plugins/lookup/schedule_rrule.py @@ -101,39 +101,39 @@ else: class LookupModule(LookupBase): - frequencies = { - 'none': rrule.DAILY, - 'minute': rrule.MINUTELY, - 'hour': rrule.HOURLY, - 'day': rrule.DAILY, - 'week': rrule.WEEKLY, - 'month': rrule.MONTHLY, - } - - weekdays = { - 'monday': rrule.MO, - 'tuesday': rrule.TU, - 'wednesday': rrule.WE, - 'thursday': rrule.TH, - 'friday': rrule.FR, - 'saturday': rrule.SA, - 'sunday': rrule.SU, - } - - set_positions = { - 'first': 1, - 'second': 2, - 'third': 3, - 'fourth': 4, - 'last': -1, - } - # plugin constructor def __init__(self, *args, **kwargs): if LIBRARY_IMPORT_ERROR: raise_from(AnsibleError('{0}'.format(LIBRARY_IMPORT_ERROR)), LIBRARY_IMPORT_ERROR) super().__init__(*args, **kwargs) + self.frequencies = { + 'none': rrule.DAILY, + 'minute': rrule.MINUTELY, + 'hour': rrule.HOURLY, + 'day': rrule.DAILY, + 'week': rrule.WEEKLY, + 'month': rrule.MONTHLY, + } + + self.weekdays = { + 'monday': rrule.MO, + 'tuesday': rrule.TU, + 'wednesday': rrule.WE, + 'thursday': rrule.TH, + 'friday': rrule.FR, + 'saturday': rrule.SA, + 'sunday': rrule.SU, + } + + self.set_positions = { + 'first': 1, + 'second': 2, + 'third': 3, + 'fourth': 4, + 'last': -1, + } + @staticmethod def parse_date_time(date_string): try: @@ -149,14 +149,13 @@ class LookupModule(LookupBase): return self.get_rrule(frequency, kwargs) - @staticmethod - def get_rrule(frequency, kwargs): + def get_rrule(self, frequency, kwargs): - if frequency not in LookupModule.frequencies: + if frequency not in self.frequencies: raise AnsibleError('Frequency of {0} is invalid'.format(frequency)) rrule_kwargs = { - 'freq': LookupModule.frequencies[frequency], + 'freq': self.frequencies[frequency], 'interval': kwargs.get('every', 1), } @@ -187,9 +186,9 @@ class LookupModule(LookupBase): days = [] for day in kwargs['on_days'].split(','): day = day.strip() - if day not in LookupModule.weekdays: - raise AnsibleError('Parameter on_days must only contain values {0}'.format(', '.join(LookupModule.weekdays.keys()))) - days.append(LookupModule.weekdays[day]) + if day not in self.weekdays: + raise AnsibleError('Parameter on_days must only contain values {0}'.format(', '.join(self.weekdays.keys()))) + days.append(self.weekdays[day]) rrule_kwargs['byweekday'] = days @@ -214,13 +213,13 @@ class LookupModule(LookupBase): except Exception as e: raise_from(AnsibleError('on_the parameter must be two words separated by a space'), e) - if weekday not in LookupModule.weekdays: + if weekday not in self.weekdays: raise AnsibleError('Weekday portion of on_the parameter is not valid') - if occurance not in LookupModule.set_positions: + if occurance not in self.set_positions: raise AnsibleError('The first string of the on_the parameter is not valid') - rrule_kwargs['byweekday'] = LookupModule.weekdays[weekday] - rrule_kwargs['bysetpos'] = LookupModule.set_positions[occurance] + rrule_kwargs['byweekday'] = self.weekdays[weekday] + rrule_kwargs['bysetpos'] = self.set_positions[occurance] my_rule = rrule.rrule(**rrule_kwargs) diff --git a/awx_collection/plugins/lookup/schedule_rruleset.py b/awx_collection/plugins/lookup/schedule_rruleset.py index ead49bbc2a..a32b9d51cb 100644 --- a/awx_collection/plugins/lookup/schedule_rruleset.py +++ b/awx_collection/plugins/lookup/schedule_rruleset.py @@ -136,40 +136,44 @@ try: import pytz from dateutil import rrule except ImportError as imp_exc: - raise_from(AnsibleError('{0}'.format(imp_exc)), imp_exc) + LIBRARY_IMPORT_ERROR = imp_exc +else: + LIBRARY_IMPORT_ERROR = None class LookupModule(LookupBase): - frequencies = { - 'none': rrule.DAILY, - 'minute': rrule.MINUTELY, - 'hour': rrule.HOURLY, - 'day': rrule.DAILY, - 'week': rrule.WEEKLY, - 'month': rrule.MONTHLY, - } - - weekdays = { - 'monday': rrule.MO, - 'tuesday': rrule.TU, - 'wednesday': rrule.WE, - 'thursday': rrule.TH, - 'friday': rrule.FR, - 'saturday': rrule.SA, - 'sunday': rrule.SU, - } - - set_positions = { - 'first': 1, - 'second': 2, - 'third': 3, - 'fourth': 4, - 'last': -1, - } - # plugin constructor def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + if LIBRARY_IMPORT_ERROR: + raise_from(AnsibleError('{0}'.format(LIBRARY_IMPORT_ERROR)), LIBRARY_IMPORT_ERROR) + super().__init__(*args, **kwargs) + + self.frequencies = { + 'none': rrule.DAILY, + 'minute': rrule.MINUTELY, + 'hour': rrule.HOURLY, + 'day': rrule.DAILY, + 'week': rrule.WEEKLY, + 'month': rrule.MONTHLY, + } + + self.weekdays = { + 'monday': rrule.MO, + 'tuesday': rrule.TU, + 'wednesday': rrule.WE, + 'thursday': rrule.TH, + 'friday': rrule.FR, + 'saturday': rrule.SA, + 'sunday': rrule.SU, + } + + self.set_positions = { + 'first': 1, + 'second': 2, + 'third': 3, + 'fourth': 4, + 'last': -1, + } @staticmethod def parse_date_time(date_string): @@ -260,11 +264,11 @@ class LookupModule(LookupBase): frequency = rule.get('frequency', None) if not frequency: raise AnsibleError("Rule {0} is missing a frequency".format(rule_number)) - if frequency not in LookupModule.frequencies: + if frequency not in self.frequencies: raise AnsibleError('Frequency of rule {0} is invalid {1}'.format(rule_number, frequency)) rrule_kwargs = { - 'freq': LookupModule.frequencies[frequency], + 'freq': self.frequencies[frequency], 'interval': rule.get('interval', 1), 'dtstart': start_date, } @@ -287,7 +291,7 @@ class LookupModule(LookupBase): ) if 'bysetpos' in rule: - rrule_kwargs['bysetpos'] = self.process_list('bysetpos', rule, LookupModule.set_positions, rule_number) + rrule_kwargs['bysetpos'] = self.process_list('bysetpos', rule, self.set_positions, rule_number) if 'bymonth' in rule: rrule_kwargs['bymonth'] = self.process_integer('bymonth', rule, 1, 12, rule_number) @@ -302,7 +306,7 @@ class LookupModule(LookupBase): rrule_kwargs['byweekno'] = self.process_integer('byweekno', rule, 1, 52, rule_number) if 'byweekday' in rule: - rrule_kwargs['byweekday'] = self.process_list('byweekday', rule, LookupModule.weekdays, rule_number) + rrule_kwargs['byweekday'] = self.process_list('byweekday', rule, self.weekdays, rule_number) if 'byhour' in rule: rrule_kwargs['byhour'] = self.process_integer('byhour', rule, 0, 23, rule_number) diff --git a/awx_collection/test/awx/test_schedule.py b/awx_collection/test/awx/test_schedule.py index 13d70311ac..13f14c8145 100644 --- a/awx_collection/test/awx/test_schedule.py +++ b/awx_collection/test/awx/test_schedule.py @@ -81,7 +81,7 @@ def test_delete_same_named_schedule(run_module, project, inventory, admin_user): ], ) def test_rrule_lookup_plugin(collection_import, freq, kwargs, expect): - LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule + LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule() generated_rule = LookupModule.get_rrule(freq, kwargs) assert generated_rule == expect rrule_checker = SchedulePreviewSerializer() @@ -92,7 +92,7 @@ def test_rrule_lookup_plugin(collection_import, freq, kwargs, expect): @pytest.mark.parametrize("freq", ('none', 'minute', 'hour', 'day', 'week', 'month')) def test_empty_schedule_rrule(collection_import, freq): - LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule + LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule() if freq == 'day': pfreq = 'DAILY' elif freq == 'none': @@ -136,7 +136,7 @@ def test_empty_schedule_rrule(collection_import, freq): ], ) def test_rrule_lookup_plugin_failure(collection_import, freq, kwargs, msg): - LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule + LookupModule = collection_import('plugins.lookup.schedule_rrule').LookupModule() with pytest.raises(AnsibleError) as e: assert LookupModule.get_rrule(freq, kwargs) assert msg in str(e.value) diff --git a/awx_collection/tests/sanity/ignore-2.13.txt b/awx_collection/tests/sanity/ignore-2.13.txt new file mode 100644 index 0000000000..cd98399548 --- /dev/null +++ b/awx_collection/tests/sanity/ignore-2.13.txt @@ -0,0 +1,88 @@ +plugins/module_utils/awxkit.py import-3.9 +plugins/module_utils/controller_api.py import-3.9 +plugins/modules/ad_hoc_command.py import-3.9 +plugins/modules/ad_hoc_command_cancel.py import-3.9 +plugins/modules/ad_hoc_command_wait.py import-3.9 +plugins/modules/application.py import-3.9 +plugins/modules/controller_meta.py import-3.9 +plugins/modules/credential.py import-3.92 +plugins/modules/credential_input_source.py import-3.9 +plugins/modules/credential_type.py import-3.9 +plugins/modules/execution_environment.py import-3.9 +plugins/modules/export.py import-3.9 +plugins/modules/group.py import-3.9 +plugins/modules/host.py import-3.9 +plugins/modules/import.py import-3.9 +plugins/modules/instance.py import-3.9 +plugins/modules/instance_group.py import-3.9 +plugins/modules/inventory.py import-3.9 +plugins/modules/inventory_source.py import-3.9 +plugins/modules/inventory_source_update.py import-3.9 +plugins/modules/job_cancel.py import-3.9 +plugins/modules/job_launch.py import-3.9 +plugins/modules/job_list.py import-3.9 +plugins/modules/job_template.py import-3.93 +plugins/modules/job_wait.py import-3.9 +plugins/modules/label.py import-3.9 +plugins/modules/license.py import-3.9 +plugins/modules/notification_template.py import-3.9 +plugins/modules/organization.py import-3.9 +plugins/modules/project.py import-3.92 +plugins/modules/project_update.py import-3.9 +plugins/modules/role.py import-3.9 +plugins/modules/schedule.py import-3.9 +plugins/modules/settings.py import-3.9 +plugins/modules/subscriptions.py import-3.9 +plugins/modules/team.py import-3.9 +plugins/modules/token.py import-3.9 +plugins/modules/user.py import-3.9 +plugins/modules/workflow_approval.py import-3.9 +plugins/modules/workflow_job_template.py import-3.9 +plugins/modules/workflow_job_template_node.py import-3.9 +plugins/modules/workflow_launch.py import-3.9 +plugins/modules/workflow_node_wait.py import-3.9 +plugins/inventory/controller.py import-3.10 +plugins/lookup/controller_api.py import-3.10 +plugins/module_utils/awxkit.py import-3.10 +plugins/module_utils/controller_api.py import-3.10 +plugins/modules/ad_hoc_command.py import-3.10 +plugins/modules/ad_hoc_command_cancel.py import-3.10 +plugins/modules/ad_hoc_command_wait.py import-3.10 +plugins/modules/application.py import-3.10 +plugins/modules/controller_meta.py import-3.10 +plugins/modules/credential.py import-3.10 +plugins/modules/credential_input_source.py import-3.10 +plugins/modules/credential_type.py import-3.10 +plugins/modules/execution_environment.py import-3.10 +plugins/modules/export.py import-3.10 +plugins/modules/group.py import-3.10 +plugins/modules/host.py import-3.10 +plugins/modules/import.py import-3.10 +plugins/modules/instance.py import-3.10 +plugins/modules/instance_group.py import-3.10 +plugins/modules/inventory.py import-3.10 +plugins/modules/inventory_source.py import-3.10 +plugins/modules/inventory_source_update.py import-3.10 +plugins/modules/job_cancel.py import-3.10 +plugins/modules/job_launch.py import-3.10 +plugins/modules/job_list.py import-3.10 +plugins/modules/job_template.py import-3.10 +plugins/modules/job_wait.py import-3.10 +plugins/modules/label.py import-3.10 +plugins/modules/license.py import-3.10 +plugins/modules/notification_template.py import-3.10 +plugins/modules/organization.py import-3.10 +plugins/modules/project.py import-3.10 +plugins/modules/project_update.py import-3.10 +plugins/modules/role.py import-3.10 +plugins/modules/schedule.py import-3.10 +plugins/modules/settings.py import-3.10 +plugins/modules/subscriptions.py import-3.10 +plugins/modules/team.py import-3.10 +plugins/modules/token.py import-3.10 +plugins/modules/user.py import-3.10 +plugins/modules/workflow_approval.py import-3.10 +plugins/modules/workflow_job_template.py import-3.10 +plugins/modules/workflow_job_template_node.py import-3.10 +plugins/modules/workflow_launch.py import-3.10 +plugins/modules/workflow_node_wait.py import-3.10 diff --git a/awx_collection/tests/sanity/ignore-2.14.txt b/awx_collection/tests/sanity/ignore-2.14.txt new file mode 100644 index 0000000000..cd98399548 --- /dev/null +++ b/awx_collection/tests/sanity/ignore-2.14.txt @@ -0,0 +1,88 @@ +plugins/module_utils/awxkit.py import-3.9 +plugins/module_utils/controller_api.py import-3.9 +plugins/modules/ad_hoc_command.py import-3.9 +plugins/modules/ad_hoc_command_cancel.py import-3.9 +plugins/modules/ad_hoc_command_wait.py import-3.9 +plugins/modules/application.py import-3.9 +plugins/modules/controller_meta.py import-3.9 +plugins/modules/credential.py import-3.92 +plugins/modules/credential_input_source.py import-3.9 +plugins/modules/credential_type.py import-3.9 +plugins/modules/execution_environment.py import-3.9 +plugins/modules/export.py import-3.9 +plugins/modules/group.py import-3.9 +plugins/modules/host.py import-3.9 +plugins/modules/import.py import-3.9 +plugins/modules/instance.py import-3.9 +plugins/modules/instance_group.py import-3.9 +plugins/modules/inventory.py import-3.9 +plugins/modules/inventory_source.py import-3.9 +plugins/modules/inventory_source_update.py import-3.9 +plugins/modules/job_cancel.py import-3.9 +plugins/modules/job_launch.py import-3.9 +plugins/modules/job_list.py import-3.9 +plugins/modules/job_template.py import-3.93 +plugins/modules/job_wait.py import-3.9 +plugins/modules/label.py import-3.9 +plugins/modules/license.py import-3.9 +plugins/modules/notification_template.py import-3.9 +plugins/modules/organization.py import-3.9 +plugins/modules/project.py import-3.92 +plugins/modules/project_update.py import-3.9 +plugins/modules/role.py import-3.9 +plugins/modules/schedule.py import-3.9 +plugins/modules/settings.py import-3.9 +plugins/modules/subscriptions.py import-3.9 +plugins/modules/team.py import-3.9 +plugins/modules/token.py import-3.9 +plugins/modules/user.py import-3.9 +plugins/modules/workflow_approval.py import-3.9 +plugins/modules/workflow_job_template.py import-3.9 +plugins/modules/workflow_job_template_node.py import-3.9 +plugins/modules/workflow_launch.py import-3.9 +plugins/modules/workflow_node_wait.py import-3.9 +plugins/inventory/controller.py import-3.10 +plugins/lookup/controller_api.py import-3.10 +plugins/module_utils/awxkit.py import-3.10 +plugins/module_utils/controller_api.py import-3.10 +plugins/modules/ad_hoc_command.py import-3.10 +plugins/modules/ad_hoc_command_cancel.py import-3.10 +plugins/modules/ad_hoc_command_wait.py import-3.10 +plugins/modules/application.py import-3.10 +plugins/modules/controller_meta.py import-3.10 +plugins/modules/credential.py import-3.10 +plugins/modules/credential_input_source.py import-3.10 +plugins/modules/credential_type.py import-3.10 +plugins/modules/execution_environment.py import-3.10 +plugins/modules/export.py import-3.10 +plugins/modules/group.py import-3.10 +plugins/modules/host.py import-3.10 +plugins/modules/import.py import-3.10 +plugins/modules/instance.py import-3.10 +plugins/modules/instance_group.py import-3.10 +plugins/modules/inventory.py import-3.10 +plugins/modules/inventory_source.py import-3.10 +plugins/modules/inventory_source_update.py import-3.10 +plugins/modules/job_cancel.py import-3.10 +plugins/modules/job_launch.py import-3.10 +plugins/modules/job_list.py import-3.10 +plugins/modules/job_template.py import-3.10 +plugins/modules/job_wait.py import-3.10 +plugins/modules/label.py import-3.10 +plugins/modules/license.py import-3.10 +plugins/modules/notification_template.py import-3.10 +plugins/modules/organization.py import-3.10 +plugins/modules/project.py import-3.10 +plugins/modules/project_update.py import-3.10 +plugins/modules/role.py import-3.10 +plugins/modules/schedule.py import-3.10 +plugins/modules/settings.py import-3.10 +plugins/modules/subscriptions.py import-3.10 +plugins/modules/team.py import-3.10 +plugins/modules/token.py import-3.10 +plugins/modules/user.py import-3.10 +plugins/modules/workflow_approval.py import-3.10 +plugins/modules/workflow_job_template.py import-3.10 +plugins/modules/workflow_job_template_node.py import-3.10 +plugins/modules/workflow_launch.py import-3.10 +plugins/modules/workflow_node_wait.py import-3.10