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