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