# -*- coding: utf-8 -*- # Copyright 2019 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Module to get the settings from experiment file.""" 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, debug_path, board, chromeos_root, log_level, download_debug, ): prefix = "remote" l = logger.GetLogger() if ( path_str.find("trybot") < 0 and path_str.find("toolchain") < 0 and path_str.find(board) < 0 and path_str.find(board.replace("_", "-")) ): xbuddy_path = "%s/%s/%s" % (prefix, board, path_str) else: xbuddy_path = "%s/%s" % (prefix, path_str) image_downloader = ImageDownloader(l, log_level) # Returns three variables: image, autotest_path, debug_path return image_downloader.Run( misc.CanonicalizePath(chromeos_root), xbuddy_path, autotest_path, debug_path, download_debug, )