diff --git a/library/mt_system_scheduler.py b/library/mt_system_scheduler.py index d5f1d74..ff54173 100644 --- a/library/mt_system_scheduler.py +++ b/library/mt_system_scheduler.py @@ -64,173 +64,75 @@ EXAMPLES = ''' on_event: put "hello" ''' -from ansible.module_utils import mt_api -from ansible.module_utils.mt_common import clean_params +from ansible.module_utils.mt_common import clean_params, MikrotikIdempotent from ansible.module_utils.basic import AnsibleModule def main(): module = AnsibleModule( argument_spec=dict( - hostname =dict(required=True), - username =dict(required=True), - password =dict(required=True, no_log=True), - name =dict(required=True, type='str'), - on_event =dict(required=False, type='str'), - comment =dict(required=False, type='str'), - interval =dict(required=False, type='str'), - policy =dict(required=False, type='list'), - start_date=dict(required=False, type='str'), - start_time=dict(required=False, type='str'), - state=dict( - required=True, - choices=['present', 'absent'], - type='str' + hostname=dict(required=True), + username=dict(required=True), + password=dict(required=True, no_log=True), + settings=dict(required=True, type='dict'), + parameter = dict( + required = True, + choices = ['scheduler'], + type = 'str' ), + state = dict( + required = False, + choices = ['present', 'absent'], + type = 'str' + ) ), supports_check_mode=True ) - hostname = module.params['hostname'] - username = module.params['username'] - password = module.params['password'] - state = module.params['state'] - check_mode = module.check_mode - ansible_scheduler_name = module.params['name'] - changed = False - changed_message = [] - msg = "" + params = module.params + idempotent_parameter = 'name' - mk = mt_api.Mikrotik(hostname, username, password) - try: - mk.login() - except: + mt_obj = MikrotikIdempotent( + hostname = params['hostname'], + username = params['username'], + password = params['password'], + state = params['state'], + desired_params = params['settings'], + idempotent_param = idempotent_parameter, + api_path = '/system/' + str(params['parameter']), + check_mode = module.check_mode + ) + + # exit if login failed + if not mt_obj.login_success: module.fail_json( - msg="Could not log into Mikrotik device." + - " Check the username and password.", + msg = mt_obj.failed_msg ) - api_path = '/system/scheduler' + # add, remove or edit things + mt_obj.sync_state() - response = mk.api_print(base_path=api_path) - ansible_scheduler_params = module.params - mikrotik_scheduler_task = {} - for item in response: - if 'name' in item[1]: - if ansible_scheduler_name == item[1]['name']: - mikrotik_scheduler_task = item[1] - - ####################################### - # remove unneeded parameters - ###################################### - - remove_params = ['hostname', 'username', 'password', 'state'] - for i in remove_params: - del ansible_scheduler_params[i] - - - ########################################## - # modify params in place - ############################################ - clean_params(ansible_scheduler_params) - - - if '.id' in mikrotik_scheduler_task: - client_id = mikrotik_scheduler_task['.id'] - else: - client_id = False - - if state == "present": - ################################################# - # Convert policy list to comma separated string - ################################################# - - if mikrotik_scheduler_task == {}: - if 'policy' in ansible_scheduler_params: - list_to_string = "" - list_to_string = ','.join(map(str, ansible_scheduler_params['policy'])) - ansible_scheduler_params['policy'] = list_to_string - if not check_mode: - mk.api_add( - base_path=api_path, - params=ansible_scheduler_params - ) - changed_message.append(ansible_scheduler_name + " added to bridge") - changed = True, - else: - scheduler_diff_keys = {} - - ######################################################################## - # policy parameter is a comma separated list of values in a string that - # we receive from mikrotik - # we need to convert it to a list and then do a comparison against - # ansible policy list to get the difference - # if there is a difference between the two we need to convert the - # ansible_scheduler_params['policy'] to a string with comma separated values - ######################################################################### - - if 'policy' in ansible_scheduler_params: - dif_list = [] - if 'policy' in mikrotik_scheduler_task: - policy = mikrotik_scheduler_task['policy'].split(',') - dif_list = set(ansible_scheduler_params['policy']) & set(policy) - - if dif_list == []: - list_to_string = "" - list_to_string = ','.join(map(str, ansible_scheduler_params['policy'])) - scheduler_diff_keys['policy'] = list_to_string - - for key in ansible_scheduler_params: - if key != 'policy': - if key in mikrotik_scheduler_task: - if ansible_scheduler_params[key] != mikrotik_scheduler_task[key]: - scheduler_diff_keys[key] = ansible_scheduler_params[key] - else: - scheduler_diff_keys[key] = ansible_scheduler_params[key] - if scheduler_diff_keys != {}: - scheduler_diff_keys['numbers'] = client_id - if not check_mode: - mk.api_edit(base_path=api_path, params=scheduler_diff_keys) - changed = True - changed_message.append( - "Changed scheduler task : " + ansible_scheduler_params['name'] - ) - else: - #################### - # Already up date - ################### - if not changed: - changed = False - - elif state == "absent": - if client_id: - if not check_mode: - mk.api_remove(base_path=api_path, remove_id=client_id) - changed_message.append(ansible_scheduler_params['name'] + " removed") - changed = True - ##################################################### - # if client_id is not set there is nothing to remove - ##################################################### - else: - if not changed: - changed = False - else: + if mt_obj.failed: + module.fail_json( + msg = mt_obj.failed_msg + ) + elif mt_obj.changed: module.exit_json( - failed=True, - changed=False, - msg="state is invalid" - ) - - if changed: - module.exit_json( - failed=False, - changed=True, - msg=changed_message + failed=False, + changed=True, + msg=mt_obj.changed_msg, + diff={ "prepared": { + "old": mt_obj.old_params, + "new": mt_obj.new_params, + }}, ) else: module.exit_json( - failed=False, - changed=False, + failed=False, + changed=False, + + msg=params['settings'], ) + if __name__ == '__main__': main() diff --git a/tests/integration/tasks/test-scheduler.yml b/tests/integration/tasks/test-scheduler.yml index ee37f7e..89d63fa 100644 --- a/tests/integration/tasks/test-scheduler.yml +++ b/tests/integration/tasks/test-scheduler.yml @@ -5,9 +5,12 @@ username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: ansible_test - on_event: 'put "test"' - interval: 1s + parameter: scheduler + settings: + name: ansible_test + on_event: 'put "test"' + interval: 1s + tags: test1 - name: ALWAYS_CHANGES modify existing scheduler mt_system_scheduler: