sbin/sync/fabfile.py
changeset 1 5778de052a1b
parent 0 87104b7cb3d6
child 3 800c48d0e3c1
equal deleted inserted replaced
0:87104b7cb3d6 1:5778de052a1b
     1 from fabric.api import task, run, local, env, cd, put, prefix, sudo
     1 from fabric.api import task, run, local, env, cd, put, prefix, sudo, lcd
     2 from fabric.colors import green
     2 from fabric.colors import green
     3 from fabric.contrib.project import rsync_project
     3 from fabric.contrib.project import rsync_project
     4 from fabric.contrib.files import exists, upload_template
     4 from fabric.contrib.files import exists, upload_template
     5 from fabric.context_managers import settings 
     5 from fabric.context_managers import settings 
     6 from mercurial import commands, ui, hg, cmdutil
     6 from mercurial import commands, ui, hg, cmdutil
     7 import imp
     7 import imp
     8 import os, os.path
     8 import os, os.path
     9 import shutil
     9 import shutil
    10 import sys
    10 import sys
       
    11 import urlparse
    11 
    12 
    12 import config
    13 import config
    13 
    14 
    14 def get_export_path(version):
    15 def get_export_path(version):
    15     base_path = os.path.join(env.base_export_path,env.export_prefix).rstrip("/")
    16     base_path = os.path.join(env.base_export_path,env.export_prefix).rstrip("/")
    18 def clean_export_folder(path):
    19 def clean_export_folder(path):
    19     print("Removing %s" % path)
    20     print("Removing %s" % path)
    20     if os.path.isdir(path):
    21     if os.path.isdir(path):
    21         shutil.rmtree(path, ignore_errors=True)
    22         shutil.rmtree(path, ignore_errors=True)
    22 
    23 
    23 def do_export_version(path, version):
    24 def do_export_version(path, version, *export_keys):
    24     print("Export version %s"%str(version))
    25     print("Export version %s with keys %s" % (str(version), repr(export_keys)))
    25         
    26 
    26     local("hg archive -r \'%s\' \"%s\"" % (str(version),path))
    27     for export_key in export_keys:
       
    28         export_path = os.path.join(path,export_key)
       
    29         
       
    30         repo_url = env.repos[export_key]
       
    31         url_part = urlparse.urlparse(repo_url)
       
    32         if url_part.scheme or url_part.netloc:
       
    33             # this is a remote repo. Let's clone first
       
    34             clone_path = os.path.join(path,'clone',export_keys)
       
    35             os.makedirs(clone_path)
       
    36             local("hg clone \"%s\" \"%s\"" % (repo_url,clone_path))
       
    37         else:
       
    38             clone_path = repo_url
       
    39         
       
    40         with lcd(clone_path):
       
    41             local("hg archive -r \'%s\' \"%s\"" % (str(version),export_path))
       
    42     
    27     print("Export version %s done"%str(version))
    43     print("Export version %s done"%str(version))
    28 
    44 
    29     
    45     
    30 def get_remote_env(remotepath, remotevirtualenvpath, platform_web_module, settings_key):
    46 def get_remote_env(remotepath, remotevirtualenvpath, platform_web_module, settings_key):
    31     activate_path = os.path.join(remotevirtualenvpath, "bin/activate")
    47     activate_path = os.path.join(remotevirtualenvpath, "bin/activate")
    91     return (version, version_str) 
   107     return (version, version_str) 
    92     
   108     
    93 
   109 
    94 def sync_build(path):
   110 def sync_build(path):
    95     print("Sync build %s" % path)
   111     print("Sync build %s" % path)
    96     with cd(env.remote_ldt_base_path):
   112     with cd(env.remote_path['ldt_base']):
    97         filename = os.path.basename(path)
   113         filename = os.path.basename(path)
    98         res_trans = put(path, os.path.join(env.remote_ldt_base_path, filename))
   114         res_trans = put(path, os.path.join(env.remote_path['ldt_base'], filename))
    99         print("Sync build %s to %s" % (path,repr(res_trans)))
   115         print("Sync build %s to %s" % (path,repr(res_trans)))
   100         return res_trans
   116         return res_trans
   101 
   117 
   102 def remove_build(path):
   118 def remove_build(path):
   103     print("remove build build %s" % path)
   119     print("remove build build %s" % path)
   120         run("rm -fr \"%s\"" % (remotestaticsitepath))
   136         run("rm -fr \"%s\"" % (remotestaticsitepath))
   121         run("python manage.py collectstatic --noinput")
   137         run("python manage.py collectstatic --noinput")
   122         
   138         
   123 def create_config(export_path):    
   139 def create_config(export_path):    
   124     print("Create config from %s" % (export_path,))
   140     print("Create config from %s" % (export_path,))
   125     remotepath = env.remote_web_path
   141     remotepath = env.remote_path['web']
   126     remote_config_path = os.path.join(remotepath, env.platform_web_module, "config.py")
   142     remote_config_path = os.path.join(remotepath, env.platform_web_module, "config.py")
   127     template_path = os.path.join(export_path, "web", env.platform_web_module, "config.py.tmpl")
   143     template_path = os.path.join(export_path, "web", env.platform_web_module, "config.py.tmpl")
   128     
   144     
   129     context = {
   145     context = {
   130      'base_dir': os.path.join(remotepath, env.platform_web_module).rstrip("/")+"/",
   146      'base_dir': os.path.join(remotepath, env.platform_web_module).rstrip("/")+"/",
   150     }
   166     }
   151     
   167     
   152     if not exists(remote_config_path, verbose=True):
   168     if not exists(remote_config_path, verbose=True):
   153         upload_template(template_path, remote_config_path, context=context)
   169         upload_template(template_path, remote_config_path, context=context)
   154 
   170 
   155 def export_version(version):
   171 def export_version(version, *args):
   156     print("export version %s" % str(version))
   172     print("export version %s for %s" % (str(version), args))
   157     
   173     
   158     export_path = get_export_path(version)
   174     export_path = get_export_path(version)
   159     
   175     
   160     clean_export_folder(export_path)
   176     clean_export_folder(export_path)
   161     do_export_version(export_path,version)
   177     
       
   178     do_export_version(export_path,version, *args)
   162     
   179     
   163     return export_path
   180     return export_path
   164 
   181 
   165 def do_create_virtualenv(remote_venv_export_path, remotevirtualenvpath):
   182 def do_create_virtualenv(remote_venv_export_path, remotevirtualenvpath):
   166     print("Create virtualenv export_path : %s - remote venvpath : %s" % (remote_venv_export_path, remotevirtualenvpath))
   183     print("Create virtualenv export_path : %s - remote venvpath : %s" % (remote_venv_export_path, remotevirtualenvpath))
   178     with prefix("source \"%s\"" % activate_path):
   195     with prefix("source \"%s\"" % activate_path):
   179         run("pip install -r \"%s\"" % os.path.join(remote_venv_export_path,"virtualenv","web","res","srvr_requirements.txt"))
   196         run("pip install -r \"%s\"" % os.path.join(remote_venv_export_path,"virtualenv","web","res","srvr_requirements.txt"))
   180 
   197 
   181 def do_sync_ldt(version, export_path):
   198 def do_sync_ldt(version, export_path):
   182     print("do_sync_ldt with version %s and path %s" % (version,export_path))
   199     print("do_sync_ldt with version %s and path %s" % (version,export_path))
       
   200     
       
   201     ##
   183     src_path = export_path + "/src/ldt"
   202     src_path = export_path + "/src/ldt"
   184     build_src(src_path)
   203     build_src(src_path)
   185     (_,version_str) = get_src_version(src_path)
   204     (_,version_str) = get_src_version(src_path)
   186     build_path = os.path.join(src_path,"dist","ldt-%s.tar.gz" % version_str)
   205     build_path = os.path.join(src_path,"dist","ldt-%s.tar.gz" % version_str)
   187     sync_install_build(build_path)
   206     sync_install_build(build_path)
   189 
   208 
   190 def sync_install_build(build_path):
   209 def sync_install_build(build_path):
   191     res_trans = None
   210     res_trans = None
   192     try:
   211     try:
   193         res_trans = sync_build(build_path)
   212         res_trans = sync_build(build_path)
   194         install_build(res_trans[0], env.remote_virtualenv_path)        
   213         install_build(res_trans[0], env.remote_path['virtualenv'])        
   195     finally:
   214     finally:
   196         if res_trans:
   215         if res_trans:
   197             remove_build(res_trans[0])
   216             remove_build(res_trans[0])
   198 
   217 
   199 
   218 
   200 def do_sync_web(version, export_path):
   219 def do_sync_web(version, export_path):
   201     print("do_sync_web with version %s and path %s" % (version,export_path))
   220     print("do_sync_web with version %s and path %s" % (version,export_path))
       
   221     #sync web
   202     web_path = os.path.join(export_path,"web/") 
   222     web_path = os.path.join(export_path,"web/") 
   203     rsync_export(web_path, env.remote_web_path, env.web_rsync_filters)    
   223     rsync_export(web_path, env.remote_path['web'], env.rsync_filters['web'])
       
   224     #sync src
       
   225     src_path = os.path.join(export_path,"src/") 
       
   226     rsync_export(src_path, env.remote_path['src'], env.rsync_filters['web'])
       
   227         
   204     
   228     
   205 def check_folder_access():
   229 def check_folder_access():
   206     print("Check folder access")
   230     print("Check folder access")
   207     # get remote user
   231     # get remote user
   208     for folder_path in env.folders:
   232     for folder_path in env.folders:
   209         if not os.path.isabs(folder_path):
   233         if not os.path.isabs(folder_path):
   210             folder_path = env.remote_web_path.rstrip("/")+ "/" + folder_path
   234             folder_path = env.remote_path['web'].rstrip("/")+ "/" + folder_path
   211             with settings(warn_only=True):
   235             with settings(warn_only=True):
   212                 if not exists(folder_path):
   236                 if not exists(folder_path):
   213                     run("mkdir -p \"%s\"" % folder_path)
   237                     run("mkdir -p \"%s\"" % folder_path)
   214                 run("chown -R -c :%s \"%s\"" % (env.web_group, folder_path))
   238                 run("chown -R -c :%s \"%s\"" % (env.web_group, folder_path))
   215                 run("chmod -R -c g+w \"%s\"" % folder_path)
   239                 run("chmod -R -c g+w \"%s\"" % folder_path)
   216 @task
   240 @task
   217 def relaunch_server(do_collectstatic=True):
   241 def relaunch_server(do_collectstatic=True):
   218     print("Relaunch server")
   242     print("Relaunch server")
   219     check_folder_access()
   243     check_folder_access()
   220     if do_collectstatic:
   244     if do_collectstatic:
   221         collectstatic(env.remote_web_path, env.remote_virtualenv_path, env.platform_web_module)
   245         collectstatic(env.remote_path['web'], env.remote_path['virtualenv'], env.platform_web_module)
   222     sudo(env.web_relaunch_cmd, shell=False)
   246     sudo(env.web_relaunch_cmd, shell=False)
   223 
   247 
   224 @task
   248 @task
   225 def sync_web(version):
   249 def sync_web(version):
   226     print(green("sync web with version %s" % version))
   250     print(green("sync web with version %s" % version))
   227     export_path = export_version(version)
   251     export_path = export_version(version, 'web')
   228     do_sync_web(version, export_path)
   252     export_path_full = os.path.join(export_path,'web')
   229     create_config(export_path)
   253     do_sync_web(version, export_path_full)
       
   254     create_config(export_path_full)
   230     clean_export_folder(export_path)
   255     clean_export_folder(export_path)
   231     relaunch_server()
   256     relaunch_server()
   232 
   257 
   233 @task
   258 @task
   234 def sync_ldt(version):
   259 def sync_ldt(version):
   235     print(green("sync ldt with version %s" % version))
   260     print(green("sync ldt with version %s" % version))
   236     export_path = export_version(version)
   261     export_path = export_version(version, 'ldt')
   237     do_sync_ldt(version, export_path)
   262     export_path_full = os.path.join(export_path,'ldt')
       
   263     do_sync_ldt(version, export_path_full)
   238     clean_export_folder(export_path)
   264     clean_export_folder(export_path)
   239     relaunch_server()
   265     relaunch_server()
   240     
   266     
   241 @task
   267 @task
   242 def update_lib(version, package):
   268 def update_lib(version, package):
   243     print(green("update ldt with version %s" % version))
   269     print(green("update ldt with version %s" % version))
   244     export_path = export_version(version)
   270     export_path = export_version(version,'web')
   245     lib_path = os.path.join(export_path, "virtualenv", "res", "lib")
   271     export_path_full = os.path.join(export_path,'web')
       
   272     lib_path = os.path.join(export_path_full, "virtualenv", "res", "lib")
   246     
   273     
   247     f, pathname, description = imp.find_module("patch", [lib_path])
   274     f, pathname, description = imp.find_module("patch", [lib_path])
   248     patch = imp.load_module("patch", f, pathname, description)
   275     patch = imp.load_module("patch", f, pathname, description)
   249     f, pathname, description = imp.find_module("lib_create_env", [lib_path])
   276     f, pathname, description = imp.find_module("lib_create_env", [lib_path])
   250     lib_create_env = imp.load_module("lib_create_env", f, pathname, description)
   277     lib_create_env = imp.load_module("lib_create_env", f, pathname, description)
   251     
   278     
   252     package_path = os.path.join(export_path, "virtualenv", "res", "src", lib_create_env.URLS[package]['local'])
   279     package_path = os.path.join(export_path_full, "virtualenv", "res", "src", lib_create_env.URLS[package]['local'])
   253     
   280     
   254     sync_install_build(package_path)
   281     sync_install_build(package_path_full)
   255     clean_export_folder(export_path)
   282     clean_export_folder(export_path)
   256     relaunch_server()
   283     relaunch_server()
   257     
   284     
   258 @task
   285 @task
   259 def sync_platform(version):
   286 def sync_platform(version):
   260     print(green("sync platform with version %s" % version))
   287     print(green("sync platform with version %s" % version))
   261     export_path = export_version(version)
   288     export_path = export_version(version, 'ldt', 'web')
   262     do_sync_ldt(version, export_path)
   289     export_path_ldt = os.path.join(export_path,'ldt')
   263     do_sync_web(version, export_path)
   290     export_path_web = os.path.join(export_path,'web')
   264     create_config(export_path)
   291     do_sync_ldt(version, export_path_ldt)
       
   292     do_sync_web(version, export_path_web)
       
   293     create_config(export_path_web)
   265     clean_export_folder(export_path)
   294     clean_export_folder(export_path)
   266     relaunch_server()
   295     relaunch_server()
   267 
   296 
   268 @task
   297 @task
   269 def create_virtualenv(version):
   298 def create_virtualenv(version):
   270     print(green("create virtualenv with version %s" % version))
   299     print(green("create virtualenv with version %s" % version))
   271     export_path = export_version(version)
   300     export_path = export_version(version, 'web')
       
   301     export_path_web = os.path.join(export_path,'web')
   272     venv_remote_export_path = ""
   302     venv_remote_export_path = ""
   273     try:
   303     try:
   274         virtualenv_path = os.path.join(export_path, "virtualenv")
   304         virtualenv_path = os.path.join(export_path_web, "virtualenv")
   275     
   305     
   276         venv_remote_export_path = os.path.join(env.remote_venv_export_path, env.export_prefix, version,"virtualenv")
   306         venv_remote_export_path = os.path.join(env.remote_path['venv_export'], env.export_prefix, version,"virtualenv")
   277         rsync_export(virtualenv_path, venv_remote_export_path, env.venv_rsync_filters)
   307         rsync_export(virtualenv_path, venv_remote_export_path, env.rsync_filters['venv'])
   278         do_create_virtualenv(venv_remote_export_path, env.remote_virtualenv_path)
   308         do_create_virtualenv(venv_remote_export_path, env.remote_path['virtualenv'])
   279     finally:
   309     finally:
   280         clean_export_folder(export_path)
   310         clean_export_folder(export_path)
   281         if venv_remote_export_path:
   311         if venv_remote_export_path:
   282             clean_rsync_folder(venv_remote_export_path)
   312             clean_rsync_folder(venv_remote_export_path)
       
   313 
       
   314