• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python2
2#
3# Copyright 2013 Google Inc. All Rights Reserved.
4"""Script to maintain the Telemetry benchmark default results file.
5
6This script allows the user to see and update the set of default
7results to be used in generating reports from running the Telemetry
8benchmarks.
9"""
10
11from __future__ import print_function
12
13__author__ = 'cmtice@google.com (Caroline Tice)'
14
15import os
16import sys
17import json
18
19from cros_utils import misc
20
21Defaults = {}
22
23
24class TelemetryDefaults(object):
25  """Class for handling telemetry default return result fields."""
26
27  DEFAULTS_FILE_NAME = 'crosperf/default-telemetry-results.json'
28
29  def __init__(self):
30    # Get the Crosperf directory; that is where the defaults
31    # file should be.
32    dirname, __ = misc.GetRoot(__file__)
33    fullname = os.path.join(dirname, self.DEFAULTS_FILE_NAME)
34    self._filename = fullname
35    self._defaults = {}
36
37  def ReadDefaultsFile(self):
38    if os.path.exists(self._filename):
39      with open(self._filename, 'r') as fp:
40        self._defaults = json.load(fp)
41
42  def WriteDefaultsFile(self):
43    with open(self._filename, 'w') as fp:
44      json.dump(self._defaults, fp, indent=2)
45
46  def ListCurrentDefaults(self, benchmark=all):
47    # Show user current defaults. By default, show all.  The user
48    # can specify the name of a particular benchmark to see only that
49    # benchmark's default values.
50    if len(self._defaults) == 0:
51      print('The benchmark default results are currently empty.')
52    if benchmark == all:
53      for b in self._defaults.keys():
54        results = self._defaults[b]
55        out_str = b + ' : '
56        for r in results:
57          out_str += r + ' '
58        print(out_str)
59    elif benchmark in self._defaults:
60      results = self._defaults[benchmark]
61      out_str = benchmark + ' : '
62      for r in results:
63        out_str += r + ' '
64      print(out_str)
65    else:
66      print("Error:  Unrecognized benchmark '%s'" % benchmark)
67
68  def AddDefault(self, benchmark, result):
69    if benchmark in self._defaults:
70      resultList = self._defaults[benchmark]
71    else:
72      resultList = []
73    resultList.append(result)
74    self._defaults[benchmark] = resultList
75    print("Updated results set for '%s': " % benchmark)
76    print('%s : %s' % (benchmark, repr(self._defaults[benchmark])))
77
78  def RemoveDefault(self, benchmark, result):
79    if benchmark in self._defaults:
80      resultList = self._defaults[benchmark]
81      if result in resultList:
82        resultList.remove(result)
83        print("Updated results set for '%s': " % benchmark)
84        print('%s : %s' % (benchmark, repr(self._defaults[benchmark])))
85      else:
86        print("'%s' is not in '%s's default results list." % (result,
87                                                              benchmark))
88    else:
89      print("Cannot find benchmark named '%s'" % benchmark)
90
91  def GetDefault(self):
92    return self._defaults
93
94  def RemoveBenchmark(self, benchmark):
95    if benchmark in self._defaults:
96      del self._defaults[benchmark]
97      print("Deleted benchmark '%s' from list of benchmarks." % benchmark)
98    else:
99      print("Cannot find benchmark named '%s'" % benchmark)
100
101  def RenameBenchmark(self, old_name, new_name):
102    if old_name in self._defaults:
103      resultsList = self._defaults[old_name]
104      del self._defaults[old_name]
105      self._defaults[new_name] = resultsList
106      print("Renamed '%s' to '%s'." % (old_name, new_name))
107    else:
108      print("Cannot find benchmark named '%s'" % old_name)
109
110  def UsageError(self, user_input):
111    # Print error message, then show options
112    print("Error:Invalid user input: '%s'" % user_input)
113    self.ShowOptions()
114
115  def ShowOptions(self):
116    print("""
117Below are the valid user options and their arguments, and an explanation
118of what each option does.  You may either print out the full name of the
119option, or you may use the first letter of the option.  Case (upper or
120lower) does not matter, for the command (case of the result name DOES matter):
121
122    (L)ist                           - List all current defaults
123    (L)ist <benchmark>               - List current defaults for benchmark
124    (H)elp                           - Show this information.
125    (A)dd <benchmark> <result>       - Add a default result for a particular
126                                       benchmark (appends to benchmark's list
127                                       of results, if list already exists)
128    (D)elete <benchmark> <result>    - Delete a default result for a
129                                       particular benchmark
130    (R)emove <benchmark>             - Remove an entire benchmark (and its
131                                       results)
132    (M)ove <old-benchmark> <new-benchmark>    - Rename a benchmark
133    (Q)uit                           - Exit this program, saving changes.
134    (T)erminate                      - Exit this program; abandon changes.
135
136""")
137
138  def GetUserInput(self):
139    # Prompt user
140    print('Enter option> ')
141    # Process user input
142    inp = sys.stdin.readline()
143    inp = inp[:-1]
144    # inp = inp.lower()
145    words = inp.split(' ')
146    option = words[0]
147    option = option.lower()
148    if option == 'h' or option == 'help':
149      self.ShowOptions()
150    elif option == 'l' or option == 'list':
151      if len(words) == 1:
152        self.ListCurrentDefaults()
153      else:
154        self.ListCurrentDefaults(benchmark=words[1])
155    elif option == 'a' or option == 'add':
156      if len(words) < 3:
157        self.UsageError(inp)
158      else:
159        benchmark = words[1]
160        resultList = words[2:]
161        for r in resultList:
162          self.AddDefault(benchmark, r)
163    elif option == 'd' or option == 'delete':
164      if len(words) != 3:
165        self.UsageError(inp)
166      else:
167        benchmark = words[1]
168        result = words[2]
169        self.RemoveDefault(benchmark, result)
170    elif option == 'r' or option == 'remove':
171      if len(words) != 2:
172        self.UsageError(inp)
173      else:
174        benchmark = words[1]
175        self.RemoveBenchmark(benchmark)
176    elif option == 'm' or option == 'move':
177      if len(words) != 3:
178        self.UsageError(inp)
179      else:
180        old_name = words[1]
181        new_name = words[2]
182        self.RenameBenchmark(old_name, new_name)
183    elif option == 'q' or option == 'quit':
184      self.WriteDefaultsFile()
185
186    return (option == 'q' or option == 'quit' or option == 't' or
187            option == 'terminate')
188
189
190def Main():
191  defaults = TelemetryDefaults()
192  defaults.ReadDefaultsFile()
193  defaults.ShowOptions()
194  done = defaults.GetUserInput()
195  while not done:
196    done = defaults.GetUserInput()
197  return 0
198
199
200if __name__ == '__main__':
201  retval = Main()
202  sys.exit(retval)
203