aboutsummaryrefslogtreecommitdiff
path: root/crosperf/settings.py
diff options
context:
space:
mode:
Diffstat (limited to 'crosperf/settings.py')
-rw-r--r--crosperf/settings.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/crosperf/settings.py b/crosperf/settings.py
new file mode 100644
index 00000000..8d5a25fd
--- /dev/null
+++ b/crosperf/settings.py
@@ -0,0 +1,81 @@
+# Copyright 2011 Google Inc. All Rights Reserved.
+"""Module to get the settings from experiment file."""
+
+from __future__ import print_function
+
+from cros_utils import logger
+from cros_utils import misc
+from download_images import ImageDownloader
+
+
+class Settings(object):
+ """Class representing settings (a set of fields) from an experiment file."""
+
+ def __init__(self, name, settings_type):
+ self.name = name
+ self.settings_type = settings_type
+ self.fields = {}
+ self.parent = None
+
+ def SetParentSettings(self, settings):
+ """Set the parent settings which these settings can inherit from."""
+ self.parent = settings
+
+ def AddField(self, field):
+ name = field.name
+ if name in self.fields:
+ raise SyntaxError('Field %s defined previously.' % name)
+ self.fields[name] = field
+
+ def SetField(self, name, value, append=False):
+ if name not in self.fields:
+ raise SyntaxError("'%s' is not a valid field in '%s' settings" %
+ (name, self.settings_type))
+ if append:
+ self.fields[name].Append(value)
+ else:
+ self.fields[name].Set(value)
+
+ def GetField(self, name):
+ """Get the value of a field with a given name."""
+ if name not in self.fields:
+ raise SyntaxError("Field '%s' not a valid field in '%s' settings." %
+ (name, self.name))
+ field = self.fields[name]
+ if not field.assigned and field.required:
+ raise SyntaxError("Required field '%s' not defined in '%s' settings." %
+ (name, self.name))
+ return self.fields[name].Get()
+
+ def Inherit(self):
+ """Inherit any unset values from the parent settings."""
+ for name in self.fields:
+ if (not self.fields[name].assigned and self.parent and
+ name in self.parent.fields and self.parent.fields[name].assigned):
+ self.fields[name].Set(self.parent.GetField(name), parse=False)
+
+ def Override(self, settings):
+ """Override settings with settings from a different object."""
+ for name in settings.fields:
+ if name in self.fields and settings.fields[name].assigned:
+ self.fields[name].Set(settings.GetField(name), parse=False)
+
+ def Validate(self):
+ """Check that all required fields have been set."""
+ for name in self.fields:
+ if not self.fields[name].assigned and self.fields[name].required:
+ raise SyntaxError('Field %s is invalid.' % name)
+
+ def GetXbuddyPath(self, path_str, autotest_path, board, chromeos_root,
+ log_level):
+ prefix = 'remote'
+ l = logger.GetLogger()
+ if (path_str.find('trybot') < 0 and path_str.find('toolchain') < 0 and
+ path_str.find(board) < 0):
+ xbuddy_path = '%s/%s/%s' % (prefix, board, path_str)
+ else:
+ xbuddy_path = '%s/%s' % (prefix, path_str)
+ image_downloader = ImageDownloader(l, log_level)
+ image_and_autotest_path = image_downloader.Run(
+ misc.CanonicalizePath(chromeos_root), xbuddy_path, autotest_path)
+ return image_and_autotest_path