From bcaba1f7f5be752001764669ab647b7650066b08 Mon Sep 17 00:00:00 2001 From: Matt Coddington Date: Fri, 10 May 2013 16:02:21 -0400 Subject: [PATCH] newrelic_deployment notification module --- notification/newrelic_deployment | 147 +++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 notification/newrelic_deployment diff --git a/notification/newrelic_deployment b/notification/newrelic_deployment new file mode 100644 index 00000000000..245586821e6 --- /dev/null +++ b/notification/newrelic_deployment @@ -0,0 +1,147 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2013 Matt Coddington +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +DOCUMENTATION = ''' +--- +module: newrelic_deployment +author: Matt Coddington +short_description: Notify newrelic about app deployments +description: + - Notify newrelic about app deployments (see http://newrelic.github.io/newrelic_api/NewRelicApi/Deployment.html) +options: + token: + description: + - API token. + required: true + 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 + required: false + 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 + required: false + changelog: + description: + - A list of changes for this deployment + required: false + description: + description: + - Text annotation for the deployment - notes for you + required: false + revision: + description: + - A revision number (e.g., git commit SHA) + required: false + user: + description: + - The name of the user/process that triggered this deployment + required: false + appname: + description: + - Name of the application + required: false + environment: + description: + - The environment for this deployment + required: false + +# informational: requirements for nodes +requirements: [ urllib, urllib2 ] +''' + +EXAMPLES = ''' +action: newrelic_deployment token=AAAAAA app_name=myapp user='ansible deployment' revision=1.0 +''' + +HAS_URLLIB = True +try: + import urllib +except ImportError: + HAS_URLLIB = False + +HAS_URLLIB2 = True +try: + import urllib2 +except ImportError: + HAS_URLLIB2 = False + +# =========================================== +# Module execution. +# + +def main(): + + if not HAS_URLLIB: + module.fail_json(msg="urllib is not installed") + if not HAS_URLLIB2: + module.fail_json(msg="urllib2 is not installed") + + module = AnsibleModule( + argument_spec=dict( + token=dict(required=True), + app_name=dict(required=False), + application_id=dict(required=False), + changelog=dict(required=False), + description=dict(required=False), + revision=dict(required=False), + user=dict(required=False), + appname=dict(required=False), + environment=dict(required=False), + ), + supports_check_mode=True + ) + + # 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"] + 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) + + # Send the data to NewRelic + try: + req = urllib2.Request("https://rpm.newrelic.com/deployments.xml", urllib.urlencode(params)) + req.add_header('x-api-key',module.params["token"]) + urllib2.urlopen(req) + except Exception, e: + # 201 is an ok response from this service + if e.code == 201: + module.exit_json(changed=True) + else: + module.fail_json(msg="unable to update newrelic: %s" % e) + +# this is magic, see lib/ansible/module_common.py +#<> +main() +