Symlink in the binaries from the bindir. This will speed up environment cloning and save a lot of disk space. In addition it leaves the test environment with a directory that looks like it should
Project: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/commit/80b147a9 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/tree/80b147a9 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/diff/80b147a9 Branch: refs/heads/master Commit: 80b147a92c9ff8a28f559cfaed0af30f40aaa704 Parents: 358c86b Author: Thomas Jackson <[email protected]> Authored: Thu Jan 22 15:10:17 2015 -0800 Committer: Thomas Jackson <[email protected]> Committed: Thu Jan 22 15:11:48 2015 -0800 ---------------------------------------------------------------------- tsqa/environment.py | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver-qa/blob/80b147a9/tsqa/environment.py ---------------------------------------------------------------------- diff --git a/tsqa/environment.py b/tsqa/environment.py index f98d3ff..c2d16cf 100644 --- a/tsqa/environment.py +++ b/tsqa/environment.py @@ -199,7 +199,7 @@ class Layout: if self.prefix is None: return None # Yay, we have a path. - return os.path.join(self.prefix, Layout.suffixes[name]) + return str(os.path.join(self.prefix, Layout.suffixes[name])) @classmethod def ParseFromLayout(self, path): @@ -220,10 +220,8 @@ class Layout: class Environment: - def __exec_cop(self): - path = os.path.join(self.layout.bindir, 'traffic_cop') - cmd = [path, '--debug', '--stdout'] - + @property + def shell_env(self): environ = copy.copy(os.environ) environ['TS_ROOT'] = self.layout.prefix @@ -231,10 +229,15 @@ class Environment: environ['LD_LIBRARY_PATH'] = self.layout.libdir + ':' + environ['LD_LIBRARY_PATH'] else: environ['LD_LIBRARY_PATH'] = self.layout.libdir + return environ + + def __exec_cop(self): + path = os.path.join(self.layout.bindir, 'traffic_cop') + cmd = [path, '--debug', '--stdout'] with open(os.path.join(self.layout.logdir, 'cop.log'), 'w+') as logfile: self.cop = subprocess.Popen(cmd, - env=environ, + env=self.shell_env, stdout=logfile, stderr=logfile, ) @@ -288,12 +291,21 @@ class Environment: for item in os.listdir(layout.prefix): src_path = os.path.join(layout.prefix, item) dst_path = os.path.join(self.layout.prefix, item) - if os.path.isdir(src_path): + # if its the bindir, lets symlink in everything + if item == layout.suffixes['bindir']: + os.makedirs(dst_path) # make the dest dir + for bin_item in os.listdir(src_path): + os.symlink(os.path.join(src_path, bin_item), + os.path.join(dst_path, bin_item), + ) + + elif os.path.isdir(src_path): shutil.copytree(src_path, dst_path, symlinks=True, ignore=None, ) + elif os.path.isfile(src_path): shutil.copyfile(src_path, dst_path) @@ -320,7 +332,7 @@ class Environment: 'proxy.config.config_dir': self.layout.sysconfdir, 'proxy.config.body_factory.template_sets_dir': os.path.join(self.layout.sysconfdir, 'body_factory'), 'proxy.config.plugin.plugin_dir': self.layout.plugindir, - 'proxy.config.bin_path': self.layout.bindir, # TODO: symlink over the bins, instead of copying + 'proxy.config.bin_path': self.layout.bindir, 'proxy.config.log.logfile_dir': self.layout.logdir, 'proxy.config.local_state_dir': self.layout.runtimedir, 'proxy.config.http.server_ports': str(http_server_port), # your own listen port @@ -334,6 +346,17 @@ class Environment: os.chmod(os.path.join(os.path.dirname(self.layout.runtimedir)), 0777) os.chmod(os.path.join(self.layout.runtimedir), 0777) + # write out a conveinence script to + fd = os.open(os.path.join(self.layout.prefix, 'run'), os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0755) + with os.fdopen(fd, 'w') as runscript: + runscript.write('#! /usr/bin/env sh\n\n') + runscript.write('# run PROGRAM [ARGS ...]\n') + runscript.write('# Run a Traffic Server program in this environment\n\n') + for k, v in self.shell_env.iteritems(): + runscript.write('{0}="{1}"\n'.format(k, v)) + runscript.write('export {0}\n\n'.format(k)) + runscript.write('exec "$@"\n') + def destroy(self): """ Tear down the environment. Kill any running processes and remove any
