settings.py revision f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbe
1# Copyright 2011 Google Inc. All Rights Reserved.
2"""Module to get the settings from experiment file."""
3
4from __future__ import print_function
5
6from cros_utils import logger
7from download_images import ImageDownloader
8
9
10class Settings(object):
11  """Class representing settings (a set of fields) from an experiment file."""
12
13  def __init__(self, name, settings_type):
14    self.name = name
15    self.settings_type = settings_type
16    self.fields = {}
17    self.parent = None
18
19  def SetParentSettings(self, settings):
20    """Set the parent settings which these settings can inherit from."""
21    self.parent = settings
22
23  def AddField(self, field):
24    name = field.name
25    if name in self.fields:
26      raise Exception('Field %s defined previously.' % name)
27    self.fields[name] = field
28
29  def SetField(self, name, value, append=False):
30    if name not in self.fields:
31      raise Exception("'%s' is not a valid field in '%s' settings" %
32                      (name, self.settings_type))
33    if append:
34      self.fields[name].Append(value)
35    else:
36      self.fields[name].Set(value)
37
38  def GetField(self, name):
39    """Get the value of a field with a given name."""
40    if name not in self.fields:
41      raise Exception("Field '%s' not a valid field in '%s' settings." %
42                      (name, self.name))
43    field = self.fields[name]
44    if not field.assigned and field.required:
45      raise Exception("Required field '%s' not defined in '%s' settings." %
46                      (name, self.name))
47    return self.fields[name].Get()
48
49  def Inherit(self):
50    """Inherit any unset values from the parent settings."""
51    for name in self.fields:
52      if (not self.fields[name].assigned and self.parent and
53          name in self.parent.fields and self.parent.fields[name].assigned):
54        self.fields[name].Set(self.parent.GetField(name), parse=False)
55
56  def Override(self, settings):
57    """Override settings with settings from a different object."""
58    for name in settings.fields:
59      if name in self.fields and settings.fields[name].assigned:
60        self.fields[name].Set(settings.GetField(name), parse=False)
61
62  def Validate(self):
63    """Check that all required fields have been set."""
64    for name in self.fields:
65      if not self.fields[name].assigned and self.fields[name].required:
66        raise Exception('Field %s is invalid.' % name)
67
68  def GetXbuddyPath(self, path_str, board, chromeos_root, log_level):
69    prefix = 'remote'
70    l = logger.GetLogger()
71    if path_str.find('trybot') < 0 and path_str.find(board) < 0:
72      xbuddy_path = '%s/%s/%s' % (prefix, board, path_str)
73    else:
74      xbuddy_path = '%s/%s' % (prefix, path_str)
75    image_downloader = ImageDownloader(l, log_level)
76    retval, image_path = image_downloader.Run(chromeos_root, xbuddy_path)
77    if retval != 0:
78      raise Exception('Unable to find/download xbuddy image.')
79    return image_path
80