diff --git a/changelogs/fragments/1501_newrelic_v2_api_change.yml b/changelogs/fragments/1501_newrelic_v2_api_change.yml new file mode 100644 index 00000000000..c66229c0986 --- /dev/null +++ b/changelogs/fragments/1501_newrelic_v2_api_change.yml @@ -0,0 +1,7 @@ +major_changes: + - newrelic_deployment - removed newrelic v1 API, added support for v2 API (https://github.com/ansible-collections/community.general/pull/1501). +breaking_changes: + - newrelic_deployment - the ``revision`` option is required in v2 API (https://github.com/ansible-collections/community.general/pull/1501). + - newrelic_deployment - check_mode is not supported. +deprecated_features: + - newrelic_deployment - ``check_mode`` , ``appname`` , ``environment`` and ``validate_certs`` are deprecated as not required in v2 API. \ No newline at end of file diff --git a/plugins/modules/monitoring/newrelic_deployment.py b/plugins/modules/monitoring/newrelic_deployment.py index af953e0a759..9a72eadb315 100644 --- a/plugins/modules/monitoring/newrelic_deployment.py +++ b/plugins/modules/monitoring/newrelic_deployment.py @@ -2,94 +2,101 @@ # -*- coding: utf-8 -*- # Copyright 2013 Matt Coddington -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type - DOCUMENTATION = ''' --- module: newrelic_deployment -author: "Matt Coddington (@mcodd)" +author: + - "Davinder Pal (@116davinder)" + - "Matt Coddington (@mcodd)" short_description: Notify newrelic about app deployments description: - - Notify newrelic about app deployments (see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/deployment-notifications#api) + - Notify newrelic about app deployments + (U(https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-deployments)). options: token: - type: str description: - API token, to place in the x-api-key header. required: true - app_name: type: str + app_name: description: - - (one of app_name or application_id are required) The value of app_name in the newrelic.yml file used by the application + - The value of C(app_name) in the C(newrelic.yml) file used by the application. + - Exactly one of I(app_name) or I(application_id) is required. required: false - application_id: type: str + application_id: description: - - (one of app_name or application_id are required) The application id, found in the URL when viewing the application in RPM + - The I(application_id), found in the URL when viewing the application in RPM. + - See U(https://rpm.newrelic.com/api/explore/applications/list). + - Exactly one of I(app_name) or I(application_id) is required. required: false - changelog: type: str + changelog: description: - - A list of changes for this deployment + - A list of changes for this deployment. required: false - description: type: str + description: description: - - Text annotation for the deployment - notes for you + - Text annotation for the deployment - notes for you. required: false - revision: type: str + revision: description: - - A revision number (e.g., git commit SHA) - required: false - user: + - A revision number (for example, git commit SHA). + required: true type: str - description: - - The name of the user/process that triggered this deployment - required: false appname: type: str description: - - Name of the application + - Name of the application. The value is not used for the v2 API. + - This option has been deprecated and will be removed in community.general 4.0.0. required: false environment: type: str description: - - The environment for this deployment + - Name of the environment for this deployment. The value is not used for the v2 API. + - This option has been deprecated and will be removed in community.general 4.0.0. required: false validate_certs: description: - - If C(no), SSL certificates will not be validated. This should only be used - on personally controlled sites using self-signed certificates. + - If C(no), SSL certificates will not be validated. + - This should only be used on personally controlled sites using self-signed certificates. + - This option has been deprecated and will be removed in community.general 4.0.0. required: false default: 'yes' type: bool - -requirements: [] + user: + description: + - The name of the user/process that triggered this deployment + required: false + type: str ''' EXAMPLES = ''' - name: Notify newrelic about an app deployment community.general.newrelic_deployment: - token: AAAAAA - app_name: myapp - user: ansible deployment - revision: '1.0' + token: XXXXXXXXX + app_name: ansible_app + user: ansible_deployment_user + revision: '1.X' ''' from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import fetch_url -from ansible.module_utils.six.moves.urllib.parse import urlencode +import json + # =========================================== # Module execution. # - def main(): module = AnsibleModule( @@ -99,47 +106,58 @@ def main(): application_id=dict(required=False), changelog=dict(required=False), description=dict(required=False), - revision=dict(required=False), + revision=dict(required=True), user=dict(required=False), - appname=dict(required=False), - environment=dict(required=False), - validate_certs=dict(default=True, type='bool'), + appname=dict(required=False, removed_in_version='4.0.0', removed_from_collection='community.general'), + environment=dict(required=False, removed_in_version='4.0.0', removed_from_collection='community.general'), + validate_certs=dict(default=True, type='bool', removed_in_version='4.0.0', removed_from_collection='community.general'), ), required_one_of=[['app_name', 'application_id']], - supports_check_mode=True + mutually_exclusive=[['app_name', 'application_id']], ) - # build list of params - params = {} - if module.params["app_name"] and module.params["application_id"]: - module.fail_json(msg="only one of 'app_name' or 'application_id' can be set") - - if module.params["app_name"]: - params["app_name"] = module.params["app_name"] - elif module.params["application_id"]: - params["application_id"] = module.params["application_id"] + if module.params['app_name']: + data = 'filter[name]=' + str(module.params['app_name']) + newrelic_api = 'https://api.newrelic.com/v2/applications.json' + headers = {'x-api-key': module.params['token'], + 'Content-Type': 'application/x-www-form-urlencoded'} + (resp, info) = fetch_url(module, + newrelic_api, + headers=headers, + data=data, + method='GET') + if info['status'] != 200: + module.fail_json(msg="unable to get application list from newrelic: %s" % info['msg']) + else: + body = json.loads(resp.read()) + if body is None: + module.fail_json(msg='No Data for applications') + else: + app_id = body['applications'][0]['id'] + if app_id is None: + module.fail_json(msg="App not found in NewRelic Registerd Applications List") else: - module.fail_json(msg="you must set one of 'app_name' or 'application_id'") - - for item in ["changelog", "description", "revision", "user", "appname", "environment"]: - if module.params[item]: - params[item] = module.params[item] - - # If we're in check mode, just exit pretending like we succeeded - if module.check_mode: - module.exit_json(changed=True) + app_id = module.params['application_id'] # Send the data to NewRelic - url = "https://rpm.newrelic.com/deployments.xml" - data = urlencode(params) - headers = { - 'x-api-key': module.params["token"], + url = 'https://api.newrelic.com/v2/applications/' + str(app_id) + '/deployments.json' + data = { + 'deployment': { + 'revision': str(module.params['revision']), + 'changelog': str(module.params['changelog']), + 'description': str(module.params['description']), + 'user': str(module.params['user']), } } - response, info = fetch_url(module, url, data=data, headers=headers) - if info['status'] in (200, 201): + + headers = {'x-api-key': module.params['token'], + 'Content-Type': 'application/json'} + (response, info) = fetch_url(module, url, + data=module.jsonify(data), + headers=headers, method='POST') + if info['status'] == 201: module.exit_json(changed=True) else: - module.fail_json(msg="unable to update newrelic: %s" % info['msg']) + module.fail_json(msg='unable to update newrelic: %s' % info['msg']) if __name__ == '__main__':