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