Last active
December 22, 2015 10:29
-
-
Save noahgift/6459197 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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