Beispiel #1
0
def _get_django_sites():
    """
    Get a list of sites as dictionaries {site_id:'domain.name'}

    """
    deployed = version_state('deploy_project')
    if not env.sites and 'django.contrib.sites' in env.INSTALLED_APPS and deployed:
        with cd('/'.join([deployment_root(),'env',env.project_fullname,'project',env.project_package_name,'sitesettings'])):
            venv = '/'.join([deployment_root(),'env',env.project_fullname,'bin','activate'])
            #since this is the first time we run ./manage.py on the server it can be
            #a point of failure for installations
            with settings(warn_only=True):
                output = run(' '.join(['source',venv,'&&',"./manage.py dumpdata sites"]))

                if output.failed:
                    print "ERROR: There was an error running ./manage.py on the node"
                    print "See the troubleshooting docs for hints on how to diagnose deployment issues"
                    if hasattr(output, 'stderr'):
                        print output.stderr
                    sys.exit(1)
            output = output.split('\n')[-1] #ignore any lines prior to the data being dumped
            sites = json.loads(output)
            env.sites = {}
            for s in sites:
                env.sites[s['pk']] = s['fields']['domain']
    return env.sites
Beispiel #2
0
 def decorated(*args, **kwargs):
     if not hasattr(env, 'patch'):
         env.patch = False
     state = version_state(func.__name__)
     if not env.patch and state:
         verbose = " ".join([
             env.host,
             func.__name__,
             "completed. Skipping...",
             ])
     elif env.patch and not state:
         verbose = " ".join([
             env.host,
             func.__name__,
             "not previously completed. Skipping...",
             ])
     else:
         results = func(*args, **kwargs)
         verbose = ''
         if results:
             set_version_state(func.__name__, object=results)
         else:
             set_version_state(func.__name__)
         return results
     if env.verbosity and verbose:
         print verbose
     return
Beispiel #3
0
def _get_django_sites():
    """
    Get a list of sites as dictionaries {site_id:'domain.name'}

    """
    deployed = version_state('deploy_project')
    if not env.sites and 'django.contrib.sites' in env.INSTALLED_APPS and deployed:
        with cd('/'.join([deployment_root(),'env',env.project_fullname,'project',env.project_package_name,'sitesettings'])):
            venv = '/'.join([deployment_root(),'env',env.project_fullname,'bin','activate'])
            #since this is the first time we run ./manage.py on the server it can be
            #a point of failure for installations
            with settings(warn_only=True):
                output = run(' '.join(['source',venv,'&&',"django-admin.py dumpdata sites --settings=%s.sitesettings.settings"% env.project_package_name]))

                if output.failed:
                    print "ERROR: There was an error running ./manage.py on the node"
                    print "See the troubleshooting docs for hints on how to diagnose deployment issues"
                    if hasattr(output, 'stderr'):
                        print output.stderr
                    sys.exit(1)
            output = output.split('\n')[-1] #ignore any lines prior to the data being dumped
            sites = json.loads(output)
            env.sites = {}
            for s in sites:
                env.sites[s['pk']] = s['fields']['domain']
    return env.sites
Beispiel #4
0
def test_env_version_state():
    with settings(host_string=HS, user=R, password=R):
        setup()
        env.project_fullname = 'example_project-0.1'
        sudo('rm -rf /var/local/woven')
        #test
        set_version_state('example', delete=True)
        set_version_state('example')
        assert version_state('example')
        set_version_state('example', object=['something'])
        state = version_state('example')
        assert state == ['something']
        state = version_state('example', prefix=True)
        assert state

        set_version_state('example', delete=True)
        state = version_state('example')
        assert not state
        teardown()
Beispiel #5
0
def test_env_version_state():
    with settings(host_string=HS,user=R,password=R):
        setup()
        env.project_fullname = 'example_project-0.1'
        sudo('rm -rf /var/local/woven')
        #test
        set_version_state('example',delete=True)
        set_version_state('example')
        assert version_state('example')
        set_version_state('example',object=['something'])
        state = version_state('example')
        assert state == ['something']
        state = version_state('example', prefix=True)
        assert state
        
        set_version_state('example',delete=True)
        state = version_state('example')
        assert not state
        teardown()
Beispiel #6
0
def rmvirtualenv():
    """
    Remove the current or ``env.project_version`` environment and all content in it
    """
    path = '/'.join([deployment_root(),'env',env.project_fullname])
    link = '/'.join([deployment_root(),'env',env.project_name])
    if version_state('mkvirtualenv'):
        sudo(' '.join(['rm -rf',path]))
        sudo(' '.join(['rm -f',link]))
        sudo('rm -f /var/local/woven/%s*'% env.project_fullname)
        set_version_state('mkvirtualenv',delete=True)
Beispiel #7
0
def rmvirtualenv():
    """
    Remove the current or ``env.project_version`` environment and all content in it
    """
    path = '/'.join([deployment_root(), 'env', env.project_fullname])
    link = '/'.join([deployment_root(), 'env', env.project_name])
    if version_state('mkvirtualenv'):
        sudo(' '.join(['rm -rf', path]))
        sudo(' '.join(['rm -f', link]))
        sudo('rm -f /var/local/woven/%s*' % env.project_fullname)
        set_version_state('mkvirtualenv', delete=True)
Beispiel #8
0
 def decorated(*args, **kwargs):
     if not hasattr(env, 'patch'): env.patch = False
     state = version_state(func.__name__)
     if not env.patch and state:
         verbose = " ".join(
             [env.host, func.__name__, "completed. Skipping..."])
     elif env.patch and not state:
         verbose = " ".join([
             env.host, func.__name__,
             "not previously completed. Skipping..."
         ])
     else:
         results = func(*args, **kwargs)
         verbose = ''
         if results: set_version_state(func.__name__, object=results)
         else: set_version_state(func.__name__)
         return results
     if env.verbosity and verbose: print verbose
     return
Beispiel #9
0
def pip_install_requirements():
    """
    Install on current installed virtualenv version from a pip bundle [dist/project name-version].zip or pip ``req.txt``|``requirements.txt``
    or a env.pip_requirements list.
    
    By default it will look for a zip bundle in the dist directory first then a requirements file.

    
    The limitations of installing requirements are that you cannot point directly to packages
    in your local filesystem. In this case you would bundle instead.
    """
    if not version_state('mkvirtualenv'):
        print env.host,'Error: Cannot run pip_install_requirements. A virtualenv is not created for this version. Run mkvirtualenv first'
        return
    if env.verbosity:
        print env.host, 'PIP INSTALLING REQUIREMENTS:'
    
    #Remove any pre-existing pip-log from any previous failed installation
    pip_log_dir = '/'.join(['/home',env.user,'.pip'])
    if exists(pip_log_dir): run('rm -f %s/*.txt'% pip_log_dir)
    
    #determine what req files or bundle files we need to deploy
    if not env.PIP_REQUIREMENTS:
        req_files = {}.fromkeys(glob('req*'))
    else:
        req_files = {}.fromkeys(env.PIP_REQUIREMENTS)
    
    for key in req_files:
        bundle = ''.join([key.split('.')[0],'.zip'])
        if os.path.exists(os.path.join('dist',bundle)):
            req_files[key] = bundle

    #if no requirements file exists create one
    if not req_files:
        f = open("requirements.txt","w+")
        text = render_to_string('woven/requirements.txt')
        f.write(text)
        f.close()
        req_files["requirements.txt"]=''
        
    req_files_list = req_files.keys()
    req_files_list.sort()
        
    #determine the django version
    file_patterns =''
    if 'file://' in env.DJANGO_REQUIREMENT: 
        django_req = os.path.split(env.DJANGO_REQUIREMENT.replace('file://',''))[1]
        file_patterns = ''.join([django_req])

    elif env.DJANGO_REQUIREMENT:
        django_req = env.DJANGO_REQUIREMENT
    else:
        django_version = get_version()
        svn_version = django_version.find('SVN')
        if svn_version > -1:
            django_version = django_version[svn_version+4:]
            django_req = ''.join(['-e svn+http://code.djangoproject.com/svn/django/trunk@',django_version,'#egg=Django'])
        else:
            other_builds = ['alpha','beta','rc']
            for b in other_builds:
                if b in django_version:
                    print "ERROR: Unsupported Django version", django_version
                    print "Define a DJANGO_REQUIREMENT pointing to the tar.gz for",django_version
                    print "and re-deploy, or use the official or SVN release of Django."
                    sys.exit(1)
            django_req = ''.join(['Django==',django_version])
    req_files[django_req]=None
    req_files_list.insert(0,django_req)
    
    #patterns for bundles
    if req_files: file_patterns = '|'.join([file_patterns,'req*.zip'])

    #create a pip cache & src directory
    cache =  '/'.join([deployment_root(),'.pip','cache'])
    src = '/'.join([deployment_root(),'.pip','src'])
    deployed = mkdirs(cache)
    deployed += mkdirs(src)
    #deploy bundles and any local copy of django
    local_dir = os.path.join(os.getcwd(),'dist')
    remote_dir = '/'.join([deployment_root(),'env',env.project_fullname,'dist'])
    if os.path.exists(local_dir):  
        if file_patterns: deployed += deploy_files(local_dir, remote_dir, pattern=file_patterns)
    
    #deploy any requirement files
    deployed +=  deploy_files(os.getcwd(), remote_dir, pattern = 'req*') 
    
    #install in the env
    out = State(' '.join([env.host,'pip install requirements']))
    python_path = '/'.join([deployment_root(),'env',env.project_fullname,'bin','python'])
    with settings(warn_only=True):
        with cd(remote_dir):
            for req in req_files_list:
                bundle = req_files[req]
                if bundle: req=bundle
                if env.verbosity:
                    print ' * installing',req
                if 'django' in req.lower():
                    install = run('pip install %s -q --environment=%s --src=%s --download-cache=%s --log=/home/%s/.pip/django_pip_log.txt'%
                                  (req, python_path, src, cache, env.user))  

                elif '.zip' in req.lower():
                    install = run('pip install %s -q --environment=%s --log=/home/%s/.pip/%s_pip_log.txt'%
                                  (req, python_path, env.user, req.replace('.','_')))
                  
                else:
                    install = run('pip install -q --environment=%s --src=%s --download-cache=%s --requirement=%s --log=/home/%s/.pip/%s_pip_log.txt'%
                                  (python_path,src,cache,req, env.user,req.replace('.','_')))
                if install.failed:
                    out.failed =True
                    out.stderr += ' '.join([env.host, "ERROR INSTALLING",req,'\n'])
    
    out.object = deployed
              
    if out.failed:
        print out.stderr
        print "Review the pip install logs at %s/.pip and re-deploy"% deployment_root()
        sys.exit(1)
    return out
Beispiel #10
0
def pip_install_requirements():
    """
    Install on current installed virtualenv version from a pip bundle [dist/project name-version].zip or pip ``req.txt``|``requirements.txt``
    or a env.pip_requirements list.
    
    By default it will look for a zip bundle in the dist directory first then a requirements file.

    
    The limitations of installing requirements are that you cannot point directly to packages
    in your local filesystem. In this case you would bundle instead.
    """
    if not version_state('mkvirtualenv'):
        print env.host, 'Error: Cannot run pip_install_requirements. A virtualenv is not created for this version. Run mkvirtualenv first'
        return
    if env.verbosity:
        print env.host, 'PIP INSTALLING REQUIREMENTS:'

    #Remove any pre-existing pip-log from any previous failed installation
    pip_log_dir = '/'.join(['/home', env.user, '.pip'])
    if exists(pip_log_dir): run('rm -f %s/*.txt' % pip_log_dir)

    #determine what req files or bundle files we need to deploy
    if not env.PIP_REQUIREMENTS:
        req_files = {}.fromkeys(glob('req*'))
    else:
        req_files = {}.fromkeys(env.PIP_REQUIREMENTS)

    for key in req_files:
        bundle = ''.join([key.split('.')[0], '.zip'])
        if os.path.exists(os.path.join('dist', bundle)):
            req_files[key] = bundle

    #determine the django version
    file_patterns = ''
    django_version = get_version()
    svn_version = django_version.find('SVN')
    if svn_version > -1:
        django_version = django_version[svn_version + 4:]
        django_req = ''.join([
            '-e svn+http://code.djangoproject.com/svn/django/trunk@',
            django_version, '#egg=Django'
        ])
    else:
        other_builds = ['alpha', 'beta', 'rc']
        for b in other_builds:
            if b in django_version:
                print "ERROR: Unsupported Django version", django_version
                print "Define a DJANGO_REQUIREMENT pointing to the tar.gz for", django_version
                print "and re-deploy, or use the official or SVN release of Django."
                sys.exit(1)
        django_req = ''.join(['Django==', django_version])

    #if no requirements file exists create one
    if not req_files:
        f = open("requirements.txt", "w+")
        text = render_to_string('woven/requirements.txt',
                                {'django': django_req})
        f.write(text)
        f.close()
        if env.verbosity:
            print "Created local requirements.txt"
        req_files["requirements.txt"] = ''

    req_files_list = req_files.keys()
    req_files_list.sort()

    #patterns for bundles
    if req_files: file_patterns = '|'.join([file_patterns, 'req*.zip'])

    #create a pip cache & src directory
    cache = '/'.join([deployment_root(), '.pip', 'cache'])
    src = '/'.join([deployment_root(), '.pip', 'src'])
    deployed = mkdirs(cache)
    deployed += mkdirs(src)
    #deploy bundles and any local copy of django
    local_dir = os.path.join(os.getcwd(), 'dist')
    remote_dir = '/'.join(
        [deployment_root(), 'env', env.project_fullname, 'dist'])
    if os.path.exists(local_dir):
        if file_patterns:
            deployed += deploy_files(local_dir,
                                     remote_dir,
                                     pattern=file_patterns)

    #deploy any requirement files
    deployed += deploy_files(os.getcwd(), remote_dir, pattern='req*')

    #install in the env
    out = State(' '.join([env.host, 'pip install requirements']))
    python_path = '/'.join(
        [deployment_root(), 'env', env.project_fullname, 'bin', 'python'])
    with settings(warn_only=True):
        with cd(remote_dir):
            for req in req_files_list:
                bundle = req_files[req]
                if bundle: req = bundle
                if env.verbosity:
                    print ' * installing', req
                if '.zip' in req.lower():
                    install = run(
                        'pip install %s -q --environment=%s --log=/home/%s/.pip/%s_pip_log.txt'
                        % (req, python_path, env.user, req.replace('.', '_')))

                else:
                    install = run(
                        'pip install -q --environment=%s --src=%s --download-cache=%s --requirement=%s --log=/home/%s/.pip/%s_pip_log.txt'
                        % (python_path, src, cache, req, env.user,
                           req.replace('.', '_')))
                if install.failed:
                    out.failed = True
                    out.stderr += ' '.join(
                        [env.host, "ERROR INSTALLING", req, '\n'])

    out.object = deployed

    if out.failed:
        print out.stderr
        print "Review the pip install logs at %s/.pip and re-deploy" % deployment_root(
        )
        sys.exit(1)
    return out