1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2019 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""Module to get the settings from experiment file.""" 7*760c253cSXin Li 8*760c253cSXin Li 9*760c253cSXin Lifrom cros_utils import logger 10*760c253cSXin Lifrom cros_utils import misc 11*760c253cSXin Lifrom download_images import ImageDownloader 12*760c253cSXin Li 13*760c253cSXin Li 14*760c253cSXin Liclass Settings(object): 15*760c253cSXin Li """Class representing settings (a set of fields) from an experiment file.""" 16*760c253cSXin Li 17*760c253cSXin Li def __init__(self, name, settings_type): 18*760c253cSXin Li self.name = name 19*760c253cSXin Li self.settings_type = settings_type 20*760c253cSXin Li self.fields = {} 21*760c253cSXin Li self.parent = None 22*760c253cSXin Li 23*760c253cSXin Li def SetParentSettings(self, settings): 24*760c253cSXin Li """Set the parent settings which these settings can inherit from.""" 25*760c253cSXin Li self.parent = settings 26*760c253cSXin Li 27*760c253cSXin Li def AddField(self, field): 28*760c253cSXin Li name = field.name 29*760c253cSXin Li if name in self.fields: 30*760c253cSXin Li raise SyntaxError("Field %s defined previously." % name) 31*760c253cSXin Li self.fields[name] = field 32*760c253cSXin Li 33*760c253cSXin Li def SetField(self, name, value, append=False): 34*760c253cSXin Li if name not in self.fields: 35*760c253cSXin Li raise SyntaxError( 36*760c253cSXin Li "'%s' is not a valid field in '%s' settings" 37*760c253cSXin Li % (name, self.settings_type) 38*760c253cSXin Li ) 39*760c253cSXin Li if append: 40*760c253cSXin Li self.fields[name].Append(value) 41*760c253cSXin Li else: 42*760c253cSXin Li self.fields[name].Set(value) 43*760c253cSXin Li 44*760c253cSXin Li def GetField(self, name): 45*760c253cSXin Li """Get the value of a field with a given name.""" 46*760c253cSXin Li if name not in self.fields: 47*760c253cSXin Li raise SyntaxError( 48*760c253cSXin Li "Field '%s' not a valid field in '%s' settings." 49*760c253cSXin Li % (name, self.name) 50*760c253cSXin Li ) 51*760c253cSXin Li field = self.fields[name] 52*760c253cSXin Li if not field.assigned and field.required: 53*760c253cSXin Li raise SyntaxError( 54*760c253cSXin Li "Required field '%s' not defined in '%s' settings." 55*760c253cSXin Li % (name, self.name) 56*760c253cSXin Li ) 57*760c253cSXin Li return self.fields[name].Get() 58*760c253cSXin Li 59*760c253cSXin Li def Inherit(self): 60*760c253cSXin Li """Inherit any unset values from the parent settings.""" 61*760c253cSXin Li for name in self.fields: 62*760c253cSXin Li if ( 63*760c253cSXin Li not self.fields[name].assigned 64*760c253cSXin Li and self.parent 65*760c253cSXin Li and name in self.parent.fields 66*760c253cSXin Li and self.parent.fields[name].assigned 67*760c253cSXin Li ): 68*760c253cSXin Li self.fields[name].Set(self.parent.GetField(name), parse=False) 69*760c253cSXin Li 70*760c253cSXin Li def Override(self, settings): 71*760c253cSXin Li """Override settings with settings from a different object.""" 72*760c253cSXin Li for name in settings.fields: 73*760c253cSXin Li if name in self.fields and settings.fields[name].assigned: 74*760c253cSXin Li self.fields[name].Set(settings.GetField(name), parse=False) 75*760c253cSXin Li 76*760c253cSXin Li def Validate(self): 77*760c253cSXin Li """Check that all required fields have been set.""" 78*760c253cSXin Li for name in self.fields: 79*760c253cSXin Li if not self.fields[name].assigned and self.fields[name].required: 80*760c253cSXin Li raise SyntaxError("Field %s is invalid." % name) 81*760c253cSXin Li 82*760c253cSXin Li def GetXbuddyPath( 83*760c253cSXin Li self, 84*760c253cSXin Li path_str, 85*760c253cSXin Li autotest_path, 86*760c253cSXin Li debug_path, 87*760c253cSXin Li board, 88*760c253cSXin Li chromeos_root, 89*760c253cSXin Li log_level, 90*760c253cSXin Li download_debug, 91*760c253cSXin Li ): 92*760c253cSXin Li prefix = "remote" 93*760c253cSXin Li l = logger.GetLogger() 94*760c253cSXin Li if ( 95*760c253cSXin Li path_str.find("trybot") < 0 96*760c253cSXin Li and path_str.find("toolchain") < 0 97*760c253cSXin Li and path_str.find(board) < 0 98*760c253cSXin Li and path_str.find(board.replace("_", "-")) 99*760c253cSXin Li ): 100*760c253cSXin Li xbuddy_path = "%s/%s/%s" % (prefix, board, path_str) 101*760c253cSXin Li else: 102*760c253cSXin Li xbuddy_path = "%s/%s" % (prefix, path_str) 103*760c253cSXin Li image_downloader = ImageDownloader(l, log_level) 104*760c253cSXin Li # Returns three variables: image, autotest_path, debug_path 105*760c253cSXin Li return image_downloader.Run( 106*760c253cSXin Li misc.CanonicalizePath(chromeos_root), 107*760c253cSXin Li xbuddy_path, 108*760c253cSXin Li autotest_path, 109*760c253cSXin Li debug_path, 110*760c253cSXin Li download_debug, 111*760c253cSXin Li ) 112