Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 124 lines (107 sloc) 4.189 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
from fabric.api import *
from fabric.decorators import runs_once

env.runtime = 'production'
env.hosts = ['chimera.ericholscher.com', 'kirin.ericholscher.com', 'ladon.ericholscher.com']
env.user = 'docs'
env.code_dir = '/home/docs/sites/readthedocs.org/checkouts/readthedocs.org'
env.virtualenv = '/home/docs/sites/readthedocs.org'
env.rundir = '/home/docs/sites/readthedocs.org/run'

def push():
    "Push new code, but don't restart/reload."
    local('git push origin master')
    with cd(env.code_dir):
        run('git pull origin master')

def update_requirements():
    "Update requirements in the virtualenv."
    run("%s/bin/pip install -r %s/deploy_requirements.txt" % (env.virtualenv, env.code_dir))

def migrate(project=None):
    if project:
        run('django-admin.py migrate %s' % project)
    else:
        run('django-admin.py migrate')

@hosts(['chimera.ericholscher.com', 'ladon.ericholscher.com'])
def restart():
    "Restart (or just start) the server"
    env.user = "root"
    run("restart readthedocs-gunicorn")

@hosts(['chimera.ericholscher.com'])
#@hosts(['kirin.ericholscher.com'])
def celery():
    "Restart (or just start) the server"
    env.user = "root"
    run("restart readthedocs-celery")

def pull():
    "Pull new code"
    with cd(env.code_dir):
        run('git pull origin master')

@runs_once
def spider():
    local('patu.py -d1 readthedocs.org')

def _aws_wrapper(f, *args, **kwargs):
    "get AWS credentials if not defined"
    #these are normally defined in ~/.fabricrc
    @hosts('run_once') #so fab doesn't go crazy
    def wrapped(*args, **kwargs):
        from boto.cloudfront.exception import CloudFrontServerError
        from boto.cloudfront import CloudFrontConnection
        c = CloudFrontConnection(env.aws_access_key_id,
                                 env.aws_secret_access_key)
        if not hasattr(env, 'aws_access_key_id'):
            prompt('AWS Access Key ID: ', key='aws_access_key_id')
        if not hasattr(env, 'aws_secret_access_key'):
            prompt('AWS Secret Access Key: ', key='aws_secret_access_key')
        try:
            return f(c, *args, **kwargs)
        except CloudFrontServerError as e:
            print "Error: \n", e.error_message
    return wrapped

@_aws_wrapper
def to_cdn(c, slug):
    "Create a new Distribution object on CloudFront"
    from boto.cloudfront import CloudFrontConnection
    from boto.cloudfront.origin import CustomOrigin

    c = CloudFrontConnection(env.aws_access_key_id,
                             env.aws_secret_access_key)
    d = c.create_distribution(
        origin=CustomOrigin(slug + '.cdn.readthedocs.org',
                            origin_protocol_policy='http-only'),
        enabled=True,
        comment='Slug: ' + slug,
        cnames=[slug + '.readthedocs.org']
        )
    print "Created: " + d.domain_name + " for " + slug
    list_cdn()

@_aws_wrapper
def list_cdn(c):
    "List Distributions on CloudFront"
    distributions = c.get_all_distributions()
    for d in distributions:
        print "%3s %4s %40s %30s" % ('Ena' if d.enabled else 'Dis',
                                     d.status[:4], d.origin.dns_name,
                                     d.domain_name)

@_aws_wrapper
def disable_cdn(c, *args):
    "Sets a Distribution entry to disabled. Required before deletion."
    distributions = c.get_all_distributions()
    for distro in distributions:
        dist_slug = distro.origin.dns_name.split('.')[0]
        if dist_slug in args:
            print "Disabling:", dist_slug
            #this is broken as of boto 2.0b4.
            #fix is to comment out lines 347-352 in cloudfront/distribution.py
            distro.get_distribution().disable()

@_aws_wrapper
def delete_cdn(c):
    "Deletes all Distributions in the 'Disabled' state."
    distributions = c.get_all_distributions()
    for distro in distributions:
        if not distro.enabled and distro.status=="Deployed":
            print "Deleting", distro.origin.dns_name
            distro.get_distribution().delete()


@hosts(['chimera.ericholscher.com'])
def full_deploy():
    push()
    update_requirements()
    migrate()
    restart()
    celery()
Something went wrong with that request. Please try again.