1043e1132d1af7969a8f67871188ef34e050c2186jadmanskiimport os, sys 2043e1132d1af7969a8f67871188ef34e050c2186jadmanskiimport common 3043e1132d1af7969a8f67871188ef34e050c2186jadmanski 4043e1132d1af7969a8f67871188ef34e050c2186jadmanskifrom autotest_lib.client.common_lib import error, utils, packages 5043e1132d1af7969a8f67871188ef34e050c2186jadmanski 6043e1132d1af7969a8f67871188ef34e050c2186jadmanski 7043e1132d1af7969a8f67871188ef34e050c2186jadmanskiclass ProfilerNotPresentError(error.JobError): 8043e1132d1af7969a8f67871188ef34e050c2186jadmanski def __init__(self, name, *args, **dargs): 9043e1132d1af7969a8f67871188ef34e050c2186jadmanski msg = "%s not present" % name 10bccad480b242b63f93f35b55a0e77517e3a76febmbligh error.JobError.__init__(self, msg, *args, **dargs) 11043e1132d1af7969a8f67871188ef34e050c2186jadmanski 12043e1132d1af7969a8f67871188ef34e050c2186jadmanski 13043e1132d1af7969a8f67871188ef34e050c2186jadmanskiclass profiler_manager(object): 14043e1132d1af7969a8f67871188ef34e050c2186jadmanski def __init__(self, job): 15043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.job = job 16043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.list = [] 17043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.tmpdir = job.tmpdir 18d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh self.profile_run_only = False 19043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.active_flag = False 20f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh self.created_dirs = [] 21043e1132d1af7969a8f67871188ef34e050c2186jadmanski 22043e1132d1af7969a8f67871188ef34e050c2186jadmanski 23043e1132d1af7969a8f67871188ef34e050c2186jadmanski def load_profiler(self, profiler, args, dargs): 24043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Given a name and args, loads a profiler, initializes it 25043e1132d1af7969a8f67871188ef34e050c2186jadmanski with the required arguments, and returns an instance of it. Raises 26043e1132d1af7969a8f67871188ef34e050c2186jadmanski a ProfilerNotPresentError if the module isn't found. """ 27043e1132d1af7969a8f67871188ef34e050c2186jadmanski raise NotImplementedError("load_profiler not implemented") 28043e1132d1af7969a8f67871188ef34e050c2186jadmanski 29043e1132d1af7969a8f67871188ef34e050c2186jadmanski 30043e1132d1af7969a8f67871188ef34e050c2186jadmanski def add(self, profiler, *args, **dargs): 31043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Add a profiler """ 32043e1132d1af7969a8f67871188ef34e050c2186jadmanski new_profiler = self.load_profiler(profiler, args, dargs) 33043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.list.append(new_profiler) 34043e1132d1af7969a8f67871188ef34e050c2186jadmanski 35043e1132d1af7969a8f67871188ef34e050c2186jadmanski 36043e1132d1af7969a8f67871188ef34e050c2186jadmanski def delete(self, profiler): 37043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Remove a profiler """ 38043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.list = [p for p in self.list if p.name != profiler] 39043e1132d1af7969a8f67871188ef34e050c2186jadmanski 40043e1132d1af7969a8f67871188ef34e050c2186jadmanski 41043e1132d1af7969a8f67871188ef34e050c2186jadmanski def current_profilers(self): 42043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Returns a set of the currently enabled profilers """ 43043e1132d1af7969a8f67871188ef34e050c2186jadmanski return set(p.name for p in self.list) 44043e1132d1af7969a8f67871188ef34e050c2186jadmanski 45043e1132d1af7969a8f67871188ef34e050c2186jadmanski 46043e1132d1af7969a8f67871188ef34e050c2186jadmanski def present(self): 47043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Indicates if any profilers are enabled """ 48043e1132d1af7969a8f67871188ef34e050c2186jadmanski return len(self.list) > 0 49043e1132d1af7969a8f67871188ef34e050c2186jadmanski 50043e1132d1af7969a8f67871188ef34e050c2186jadmanski 51d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh def only(self): 52d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh """ Returns True if job is supposed to be run only with profiling 53d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh turned on, False otherwise """ 54d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh return self.profile_run_only 55d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh 56d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh 57d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh def set_only(self, value): 58d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh """ Changes the flag which determines whether or not the job is to be 59d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh run without profilers at all """ 60d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh self.profile_run_only = value 61d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh 62d543369815ecfa74c70e2b9d1e24d65a5431f743mbligh 631b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh def before_start(self, test): 641b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh """ 651b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh Override to do any setup needed before actually starting the profilers 661b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh (this function is called before calling test.before_run_once() and 671b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh profilers.start() in a profiled run). 681b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh """ 691b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh pass 701b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh 711b0faf92eda0f62f60d3b4472f9ba0efdd455b54mbligh 72043e1132d1af7969a8f67871188ef34e050c2186jadmanski def start(self, test): 73043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Start all enabled profilers """ 74043e1132d1af7969a8f67871188ef34e050c2186jadmanski for p in self.list: 75043e1132d1af7969a8f67871188ef34e050c2186jadmanski p.start(test) 76043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.active_flag = True 77043e1132d1af7969a8f67871188ef34e050c2186jadmanski 78043e1132d1af7969a8f67871188ef34e050c2186jadmanski 79043e1132d1af7969a8f67871188ef34e050c2186jadmanski def stop(self, test): 80043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Stop all enabled profilers """ 81043e1132d1af7969a8f67871188ef34e050c2186jadmanski for p in self.list: 82043e1132d1af7969a8f67871188ef34e050c2186jadmanski p.stop(test) 83043e1132d1af7969a8f67871188ef34e050c2186jadmanski self.active_flag = False 84043e1132d1af7969a8f67871188ef34e050c2186jadmanski 85043e1132d1af7969a8f67871188ef34e050c2186jadmanski 86043e1132d1af7969a8f67871188ef34e050c2186jadmanski def active(self): 87043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Returns True if profilers are present and started, False 88043e1132d1af7969a8f67871188ef34e050c2186jadmanski otherwise """ 89043e1132d1af7969a8f67871188ef34e050c2186jadmanski return self.present() and self.active_flag 90043e1132d1af7969a8f67871188ef34e050c2186jadmanski 91043e1132d1af7969a8f67871188ef34e050c2186jadmanski 92043e1132d1af7969a8f67871188ef34e050c2186jadmanski def report(self, test): 93043e1132d1af7969a8f67871188ef34e050c2186jadmanski """ Report on all enabled profilers """ 94043e1132d1af7969a8f67871188ef34e050c2186jadmanski for p in self.list: 95043e1132d1af7969a8f67871188ef34e050c2186jadmanski p.report(test) 96aad5c50cbe80574ac956b7f89b98fb271e90bd30mbligh 97aad5c50cbe80574ac956b7f89b98fb271e90bd30mbligh if getattr(test, 'iteration', None): 98f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh name = 'iteration.%s' % test.iteration 99f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh iter_path = os.path.join(test.profdir, name) 100f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh os.system('mkdir -p %s' % iter_path) 101f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh self.created_dirs.append(name) 102f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh for file in os.listdir(test.profdir): 103f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh if file in self.created_dirs: 104f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh continue 105f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh file_path = os.path.join(test.profdir, file) 106f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh iter_path_file = os.path.join(iter_path, file) 107f58865f3e987fd9930ccb14dfe160e65c0364cc6mbligh os.rename(file_path, iter_path_file) 108