Skip to content

Instantly share code, notes, and snippets.

@noahgift
Last active December 22, 2015 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save noahgift/6459197 to your computer and use it in GitHub Desktop.
Save noahgift/6459197 to your computer and use it in GitHub Desktop.
#! /usr/bin/env python
from optparse import OptionParser
import smtplib
from smtplib import SMTP_SSL as SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from boto.opsworks.layer1 import OpsWorksConnection
from git_url import gurl, git_remote
__version__ = '0.0.2'
def connect():
return OpsWorksConnection()
def deploy(api, stack_name, app_name, layer_name=None, instance_name=None):
command = {
'Name': 'deploy'
}
stack_id = get_stack_id(api, stack_name)
if not stack_id:
raise Exception('No stack by that name: %s' % stack_name)
app_id = get_app_id(api, stack_id, app_name)
if not app_id:
raise Exception('No app by that name: %s' % app_name)
layer_ids = []
if not layer_name:
layer_ids.extend(get_layer_ids(api, stack_id))
else:
layer_ids.append(get_layer_id(api, stack_id, layer_name))
instance_ids = []
if not instance_name:
for layer_id in layer_ids:
instance_ids.extend(get_instance_ids(api, layer_id))
else:
for layer_id in layer_ids:
instance_ids.append(get_instance_id(api, layer_id,
instance_name))
return api.create_deployment(stack_id, command, instance_ids=instance_ids,
app_id=app_id)
def get_instance_ids(api, layer_id):
instances = api.describe_instances(layer_id=layer_id)
instance_ids = []
for i in instances['Instances']:
instance_ids.append(str(i['InstanceId']))
return instance_ids
def get_instance_id(api, layer_id, name):
instances = api.describe_instances(layer_id=layer_id)
for i in instances['Instances']:
if name.lower() == i['Name'].lower():
return str(i['IstanceId'])
return None
def get_layer_ids(api, stack_id):
layers = api.describe_layers(stack_id)
layer_ids = []
for l in layers['Layers']:
layer_ids.append(str(l['LayerId']))
return layer_ids
def get_layer_id(api, stack_id, name):
layers = api.describe_layers(stack_id)
for l in layers['Layers']:
if name.lower() == l['Name'].lower():
return str(l['LayerId'])
return None
def get_stack_id(api, name):
stacks = api.describe_stacks()
for s in stacks['Stacks']:
if name.lower() == s['Name'].lower():
return str(s['StackId'])
return None
def get_app_id(api, stack_id, name):
apps = api.describe_apps(stack_id)
for a in apps['Apps']:
if name.lower() == a['Name'].lower():
return str(a['AppId'])
return None
def create_deploy_url(stack_id, deploy_id):
"""Generates a deployment URL based on stack_id and deploy_id
deploy_id is a GUID generated by Opsworks when the deploy lifecycle
is called, which in turn calls Chef recipes inside that lifecycle.
"""
base_url = "https://console.aws.amazon.com/opsworks/home?#"
deploy_url = "%s/stack/%s/deployments/%s" % (base_url, stack_id, deploy_id)
return deploy_url
def mail_opsworks_deploy_notification(url,
env,
app,
git_project,
git_full_url,
email_address="dev@sqor.com"):
"""Mails Opsworks Deployment URL"""
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "[Deployment-Triggered-%s-%s]" % (git_project, env)
msg['From'] = "sqorai-deploy@sqor.com"
msg['To'] = email_address
html = """\
<html>
<head></head>
<body>
<p>
Environment: %s<br>
Opsworks Application: %s<br>
Git Project: %s<br>
GitHub Commits Pushed: <a href="%s">%s</a><br>
Opsworks Deployment: <a href="%s">%s</a><br>
</p>
</body>
</html>
""" % (env, app, git_project, git_full_url, git_full_url, url, url)
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(url, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
#Send message
SMTPserver = "email-smtp.us-east-1.amazonaws.com"
USERNAME = "AKIAITI2NS23SUKMM3NQ"
PASSWORD = "AgCubFVpi5zO0RaWc+lrQrmehMPXLqv4nFmBjF9+t5aG"
conn = SMTP(SMTPserver)
conn.set_debuglevel(True)
conn.login(USERNAME, PASSWORD)
try:
conn.sendmail(msg['From'],msg['To'], msg.as_string())
finally:
conn.close()
return
if __name__ == '__main__':
parser = OptionParser(version='%prog ' + __version__)
parser.add_option('-s', '--stack', dest='stack_name',
help='OPSWorks Stack Name to preform operation on')
parser.add_option('-l', '--layer', dest='layer_name',
help='OPSWorks Layer Name to preform operation on')
parser.add_option('-i', '--instance', dest='instance_id',
help='OPSWorks Instance ID to preform operation on')
parser.add_option('-a', '--app', dest='app_name',
help='OPSWorks App name to preform operation on')
parser.add_option('-v', '--verbose', action="store_true", default=False,
help="Verbose Output")
parser.add_option('-m', '--mail', action="store_true", default=False,
help="Email Deployment Link")
(options, args) = parser.parse_args()
if 'h' not in args:
app_name = None
stack_name = None
layer_name = None
instance_id = None
if hasattr(options, 'stack_name'):
stack_name = options.stack_name
if hasattr(options, 'layer_name'):
layer_name = options.layer_name
if hasattr(options, 'instance_id'):
instance_id = options.instance_id
if hasattr(options, 'app_name'):
app_name = options.app_name
api = connect()
deploy_id = deploy(api, stack_name, app_name, layer_name, instance_id).get('DeploymentId')
if options.verbose:
print(deploy_id)
if options.mail:
stack_id = get_stack_id(api,stack_name)
git_project = git_remote()
git_full_url = gurl()
url = create_deploy_url(stack_id=stack_id, deploy_id=deploy_id)
mail_opsworks_deploy_notification(url=url,
env=stack_name,
app=app_name,
git_project=git_project,
git_full_url=git_full_url,
email_address="dev@sqor.com")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment