aosp12/external/toolchain-utils/crosperf/label.py

189 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""The label of benchamrks."""
from __future__ import print_function
import hashlib
import os
from image_checksummer import ImageChecksummer
from cros_utils.file_utils import FileUtils
from cros_utils import misc
class Label(object):
"""The label class."""
def __init__(self,
name,
build,
chromeos_image,
autotest_path,
debug_path,
chromeos_root,
board,
remote,
image_args,
cache_dir,
cache_only,
log_level,
compiler,
skylab=False,
chrome_src=None):
self.image_type = self._GetImageType(chromeos_image)
# Expand ~
chromeos_root = os.path.expanduser(chromeos_root)
if self.image_type == 'local':
chromeos_image = os.path.expanduser(chromeos_image)
self.name = name
self.build = build
self.chromeos_image = chromeos_image
self.autotest_path = autotest_path
self.debug_path = debug_path
self.board = board
self.remote = remote
self.image_args = image_args
self.cache_dir = cache_dir
self.cache_only = cache_only
self.log_level = log_level
self.chrome_version = ''
self.compiler = compiler
self.skylab = skylab
if not chromeos_root:
if self.image_type == 'local':
chromeos_root = FileUtils().ChromeOSRootFromImage(chromeos_image)
if not chromeos_root:
raise RuntimeError("No ChromeOS root given for label '%s' and could "
"not determine one from image path: '%s'." %
(name, chromeos_image))
else:
chromeos_root = FileUtils().CanonicalizeChromeOSRoot(chromeos_root)
if not chromeos_root:
raise RuntimeError("Invalid ChromeOS root given for label '%s': '%s'." %
(name, chromeos_root))
self.chromeos_root = chromeos_root
if not chrome_src:
# Old and new chroots may have different chrome src locations.
# The path also depends on the chrome build flags.
# Give priority to chrome-src-internal.
chrome_src_rel_paths = [
'.cache/distfiles/target/chrome-src-internal',
'.cache/distfiles/chrome-src-internal',
'.cache/distfiles/target/chrome-src',
'.cache/distfiles/chrome-src',
]
for chrome_src_rel_path in chrome_src_rel_paths:
chrome_src_abs_path = os.path.join(self.chromeos_root,
chrome_src_rel_path)
if os.path.exists(chrome_src_abs_path):
chrome_src = chrome_src_abs_path
break
if not chrome_src:
raise RuntimeError('Can not find location of Chrome sources.\n'
f'Checked paths: {chrome_src_rel_paths}')
else:
chrome_src = misc.CanonicalizePath(chrome_src)
# Make sure the path exists.
if not os.path.exists(chrome_src):
raise RuntimeError("Invalid Chrome src given for label '%s': '%s'." %
(name, chrome_src))
self.chrome_src = chrome_src
self._SetupChecksum()
def _SetupChecksum(self):
"""Compute label checksum only once."""
self.checksum = None
if self.image_type == 'local':
self.checksum = ImageChecksummer().Checksum(self, self.log_level)
elif self.image_type == 'trybot':
self.checksum = hashlib.md5(
self.chromeos_image.encode('utf-8')).hexdigest()
def _GetImageType(self, chromeos_image):
image_type = None
if chromeos_image.find('xbuddy://') < 0:
image_type = 'local'
elif chromeos_image.find('trybot') >= 0:
image_type = 'trybot'
else:
image_type = 'official'
return image_type
def __hash__(self):
"""Label objects are used in a map, so provide "hash" and "equal"."""
return hash(self.name)
def __eq__(self, other):
"""Label objects are used in a map, so provide "hash" and "equal"."""
return isinstance(other, Label) and other.name == self.name
def __str__(self):
"""For better debugging."""
return 'label[name="{}"]'.format(self.name)
class MockLabel(object):
"""The mock label class."""
def __init__(self,
name,
build,
chromeos_image,
autotest_path,
debug_path,
chromeos_root,
board,
remote,
image_args,
cache_dir,
cache_only,
log_level,
compiler,
skylab=False,
chrome_src=None):
self.name = name
self.build = build
self.chromeos_image = chromeos_image
self.autotest_path = autotest_path
self.debug_path = debug_path
self.board = board
self.remote = remote
self.cache_dir = cache_dir
self.cache_only = cache_only
if not chromeos_root:
self.chromeos_root = '/tmp/chromeos_root'
else:
self.chromeos_root = chromeos_root
self.image_args = image_args
self.chrome_src = chrome_src
self.image_type = self._GetImageType(chromeos_image)
self.checksum = ''
self.log_level = log_level
self.compiler = compiler
self.skylab = skylab
self.chrome_version = 'Fake Chrome Version 50'
def _GetImageType(self, chromeos_image):
image_type = None
if chromeos_image.find('xbuddy://') < 0:
image_type = 'local'
elif chromeos_image.find('trybot') >= 0:
image_type = 'trybot'
else:
image_type = 'official'
return image_type