diff --git a/plugins/modules/alert_contact_point.py b/plugins/modules/alert_contact_point.py index dcd5ead..b38cb93 100644 --- a/plugins/modules/alert_contact_point.py +++ b/plugins/modules/alert_contact_point.py @@ -148,29 +148,39 @@ def present_alert_contact_point(module): if result.status_code == 202: return False, True, result.json() elif result.status_code == 500: - api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/contact-points/' + module.params['uid'] + sameConfig = False + contactPointInfo = {} - result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/contact-points' - if result.status_code == 202: - api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/contact-points' + result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) - result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + for contact_points in result.json(): + if contact_points['uid'] == module.params['uid']: + if (contact_points['name'] == module.params['name'] and contact_points['type'] == module.params['type'] and contact_points['settings'] + and contact_points['settings'] == module.params['settings'] + and contact_points['disableResolveMessage'] == module.params['disableResolveMessage']): - contactPointFound = False - contactPointInfo = {} - - for contact_points in result.json(): - if contact_points['uid'] == module.params['uid']: - contactPointFound = True + sameConfig = True contactPointInfo = contact_points - if contactPointFound: - return False, True, contactPointInfo - else: - return True, False, "Contact Point not found" + if sameConfig: + return False, False, contactPointInfo else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} + api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/contact-points/' + \ + module.params['uid'] + result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + + if result.status_code == 202: + api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/contact-points' + + result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + + for contact_points in result.json(): + if contact_points['uid'] == module.params['uid']: + return False, True, contact_points + else: + return True, False, {"status": result.status_code, 'response': result.json()['message']} else: return True, False, {"status": result.status_code, 'response': result.json()['message']} diff --git a/plugins/modules/alert_notification_policy.py b/plugins/modules/alert_notification_policy.py index bf1ec78..f01a798 100644 --- a/plugins/modules/alert_notification_policy.py +++ b/plugins/modules/alert_notification_policy.py @@ -179,16 +179,21 @@ def alert_notification_policy(module): 'repeat_interval': module.params['repeatInterval']} api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/policies' + result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) - result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) - - if result.status_code == 202: + if (result.json()['receiver'] == module.params['rootPolicyReceiver'] and result.json()['routes'] == module.params['routes'] + and result.json()['group_wait'] == module.params['groupWait'] and result.json()['group_interval'] == module.params['groupInterval'] + and result.json()['repeat_interval'] == module.params['repeatInterval']): + return False, False, result.json() + else: api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/v1/provisioning/policies' - result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} + result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + + if result.status_code == 202: + return False, True, result.json() + else: + return True, False, {"status": result.status_code, 'response': result.json()['message']} def main(): diff --git a/plugins/modules/cloud_plugin.py b/plugins/modules/cloud_plugin.py index 7fb9bdc..a6399b6 100644 --- a/plugins/modules/cloud_plugin.py +++ b/plugins/modules/cloud_plugin.py @@ -115,12 +115,18 @@ def present_cloud_plugin(module): if result.status_code == 200: return False, True, result.json() elif result.status_code == 409: - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params[ - 'name'] - result = requests.post(api_url, json={'version': module.params['version']}, - headers={"Authorization": 'Bearer ' + module.params['cloud_api_key']}) + api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params['name'] + result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['cloud_api_key']}) - return False, True, result.json() + if result.json()['pluginSlug'] == module.params['name'] and result.json()['version'] == module.params['version']: + return False, False, result.json() + else: + api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params[ + 'name'] + result = requests.post(api_url, json={'version': module.params['version']}, + headers={"Authorization": 'Bearer ' + module.params['cloud_api_key']}) + + return False, True, result.json() else: return True, False, {"status": result.status_code, 'response': result.json()['message']} diff --git a/plugins/modules/folder.py b/plugins/modules/folder.py index 41c9c5a..8824503 100644 --- a/plugins/modules/folder.py +++ b/plugins/modules/folder.py @@ -176,20 +176,33 @@ def present_folder(module): if result.status_code == 200: return False, True, result.json() elif result.status_code == 412: - body = { - 'uid': module.params['uid'], - 'title': module.params['title'], - 'overwrite': module.params['overwrite'] - } - api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/folders/' + module.params['uid'] + sameConfig = False + folderInfo = {} - result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/folders' + result = requests.get(api_url, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) - if result.status_code == 200: - return False, True, result.json() + for folder in result.json(): + if folder['uid'] == module.params['uid'] and folder['title'] == module.params['title']: + sameConfig = True + folderInfo = folder + + if sameConfig: + return False, False, folderInfo else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} + body = { + 'uid': module.params['uid'], + 'title': module.params['title'], + 'overwrite': module.params['overwrite'] + } + api_url = 'https://' + module.params['stack_slug'] + '.grafana.net/api/folders/' + module.params['uid'] + result = requests.put(api_url, json=body, headers={"Authorization": 'Bearer ' + module.params['grafana_api_key']}) + + if result.status_code == 200: + return False, True, result.json() + else: + return True, False, {"status": result.status_code, 'response': result.json()['message']} else: return True, False, {"status": result.status_code, 'response': result.json()['message']} diff --git a/tests/integration/targets/alert_contact_point/tasks/main.yml b/tests/integration/targets/alert_contact_point/tasks/main.yml index 36665db..c6727fa 100644 --- a/tests/integration/targets/alert_contact_point/tasks/main.yml +++ b/tests/integration/targets/alert_contact_point/tasks/main.yml @@ -16,6 +16,24 @@ - add_result.failed == false - add_result.output.provenance == "api" +- name: Idempotency Check + grafana.grafana.alert_contact_point: + name: ops-email + uid: opsemail + type: email + settings: { + addresses: "ops@mydomain.com,devs@mydomain.com" + } + stack_slug: "{{ stack_name }}" + grafana_api_key: "{{ grafana_api_key }}" + state: present + register: idempotent_result + +- assert: + that: + - idempotent_result.changed == false + - idempotent_result.output.provenance == "api" + - name: Update Alerting contact point grafana.grafana.alert_contact_point: name: ops-email diff --git a/tests/integration/targets/cloud_plugin/tasks/main.yml b/tests/integration/targets/cloud_plugin/tasks/main.yml index 7c6272d..125de80 100644 --- a/tests/integration/targets/cloud_plugin/tasks/main.yml +++ b/tests/integration/targets/cloud_plugin/tasks/main.yml @@ -12,7 +12,21 @@ - add_result.changed == true - add_result.pluginName == "GitHub" -- name: update a plugin +- name: Idempotency Check + grafana.grafana.cloud_plugin: + name: grafana-github-datasource + version: 1.0.14 + stack_slug: "{{ stack_name }}" + cloud_api_key: "{{ grafana_cloud_api_key }}" + state: present + register: idempotency_result + +- assert: + that: + - idempotency_result.changed == false + - idempotency_result.pluginName == "GitHub" + +- name: Update a plugin grafana.grafana.cloud_plugin: name: grafana-github-datasource version: 1.0.15 diff --git a/tests/integration/targets/folder/tasks/main.yml b/tests/integration/targets/folder/tasks/main.yml index 6ec3432..65450e6 100644 --- a/tests/integration/targets/folder/tasks/main.yml +++ b/tests/integration/targets/folder/tasks/main.yml @@ -10,8 +10,7 @@ - assert: that: - - create_result.changed == true - - create_result.output.url == "/dashboards/f/test123/ansible-integration-test" + - create_result.failed == false - name: Delete a folder grafana.grafana.folder: