# Copyright 2011 Google Inc. All Rights Reserved. __author__ = 'asharif@google.com (Ahmad Sharif)' import os.path import re from automation.clients.helper import jobs from automation.clients.helper import perforce from automation.common import command as cmd from automation.common import machine class ScriptsFactory(object): def __init__(self, chromeos_root, scripts_path): self._chromeos_root = chromeos_root self._scripts_path = scripts_path def SummarizeResults(self, logs_path): return cmd.Shell('summarize_results.py', logs_path, path=self._scripts_path) def Buildbot(self, config_name): buildbot = os.path.join(self._chromeos_root, 'chromite/cbuildbot/cbuildbot.py') return cmd.Shell(buildbot, '--buildroot=%s' % self._chromeos_root, '--resume', '--noarchive', '--noprebuilts', '--nosync', '--nouprev', '--notests', '--noclean', config_name) def RunBenchmarks(self, board, tests): image_path = os.path.join(self._chromeos_root, 'src/build/images', board, 'latest/chromiumos_image.bin') return cmd.Shell('cros_run_benchmarks.py', '--remote=$SECONDARY_MACHINES[0]', '--board=%s' % board, '--tests=%s' % tests, '--full_table', image_path, path='/home/mobiletc-prebuild') def SetupChromeOS(self, version='latest', use_minilayout=False): setup_chromeos = cmd.Shell('setup_chromeos.py', '--public', '--dir=%s' % self._chromeos_root, '--version=%s' % version, path=self._scripts_path) if use_minilayout: setup_chromeos.AddOption('--minilayout') return setup_chromeos class CommandsFactory(object): DEPOT2_DIR = '//depot2/' P4_CHECKOUT_DIR = 'perforce2/' P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14') CHROMEOS_ROOT = 'chromeos' CHROMEOS_SCRIPTS_DIR = os.path.join(CHROMEOS_ROOT, 'src/scripts') CHROMEOS_BUILDS_DIR = '/home/mobiletc-prebuild/www/chromeos_builds' def __init__(self, chromeos_version, board, toolchain, p4_snapshot): self.chromeos_version = chromeos_version self.board = board self.toolchain = toolchain self.p4_snapshot = p4_snapshot self.scripts = ScriptsFactory(self.CHROMEOS_ROOT, self.P4_VERSION_DIR) def AddBuildbotConfig(self, config_name, config_list): config_header = 'add_config(%r, [%s])' % (config_name, ', '.join(config_list)) config_file = os.path.join(self.CHROMEOS_ROOT, 'chromite/cbuildbot/cbuildbot_config.py') quoted_config_header = '%r' % config_header quoted_config_header = re.sub("'", "\\\"", quoted_config_header) return cmd.Pipe( cmd.Shell('echo', quoted_config_header), cmd.Shell('tee', '--append', config_file)) def RunBuildbot(self): config_dict = {'board': self.board, 'build_tests': True, 'chrome_tests': True, 'unittests': False, 'vm_tests': False, 'prebuilts': False, 'latest_toolchain': True, 'useflags': ['chrome_internal'], 'usepkg_chroot': True, self.toolchain: True} config_name = '%s-toolchain-test' % self.board if 'arm' in self.board: config_list = ['arm'] else: config_list = [] config_list.extend(['internal', 'full', 'official', str(config_dict)]) add_config_shell = self.AddBuildbotConfig(config_name, config_list) return cmd.Chain(add_config_shell, self.scripts.Buildbot(config_name)) def BuildAndBenchmark(self): return cmd.Chain( self.CheckoutV14Dir(), self.SetupChromeOSCheckout(self.chromeos_version, True), self.RunBuildbot(), self.scripts.RunBenchmarks(self.board, 'BootPerfServer,10:Page,3')) def GetP4Snapshot(self, p4view): p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view) if self.p4_snapshot: return p4client.CheckoutFromSnapshot(self.p4_snapshot) else: return p4client.SetupAndDo(p4client.Sync(), p4client.Remove()) def CheckoutV14Dir(self): p4view = perforce.View(self.DEPOT2_DIR, [ perforce.PathMapping('gcctools/chromeos/v14/...') ]) return self.GetP4Snapshot(p4view) def SetupChromeOSCheckout(self, version, use_minilayout=False): version_re = '^\d+\.\d+\.\d+\.[a-zA-Z0-9]+$' location = os.path.join(self.CHROMEOS_BUILDS_DIR, version) if version in ['weekly', 'quarterly']: assert os.path.islink(location), 'Symlink %s does not exist.' % location location_expanded = os.path.abspath(os.path.realpath(location)) version = os.path.basename(location_expanded) if version in ['top', 'latest'] or re.match(version_re, version): return self.scripts.SetupChromeOS(version, use_minilayout) elif version.endswith('bz2') or version.endswith('gz'): return cmd.UnTar(location_expanded, self.CHROMEOS_ROOT) else: signature_file_location = os.path.join(location, 'src/scripts/enter_chroot.sh') assert os.path.exists(signature_file_location), ( 'Signature file %s does not exist.' % signature_file_location) return cmd.Copy(location, to_dir=self.CHROMEOS_ROOT, recursive=True) class JobsFactory(object): def __init__(self, chromeos_version='top', board='x86-mario', toolchain='trunk', p4_snapshot=''): self.chromeos_version = chromeos_version self.board = board self.toolchain = toolchain self.commands = CommandsFactory(chromeos_version, board, toolchain, p4_snapshot) def BuildAndBenchmark(self): command = self.commands.BuildAndBenchmark() label = 'BuildAndBenchmark(%s,%s,%s)' % (self.toolchain, self.board, self.chromeos_version) machine_label = 'chromeos-%s' % self.board job = jobs.CreateLinuxJob(label, command) job.DependsOnMachine( machine.MachineSpecification(label=machine_label, lock_required=True), False) return job