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
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
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
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()
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()
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)
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)
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
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
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