1"""Functions related to processing BuildMetadata from SystemImage 2 3See proto definitions for descriptions of arguments. 4""" 5 6# Add @unused to silence lint. 7load("@stdlib//internal/re.star", "re") 8 9# Needed to load from @proto. Add @unused to silence lint. 10load("//config/util/bindings/proto.star", "protos") 11load( 12 "@proto//chromiumos/build/api/system_image.proto", 13 system_pb = "chromiumos.build.api", 14) 15 16def _overlay(build_metadata): 17 """Break out the overlay name from BuildMetadata.""" 18 return build_metadata.build_target.portage_build_target.overlay_name 19 20def _kernel_version(build_metadata): 21 """Gets the major kernel version for the overlay""" 22 return build_metadata.package_summary.kernel.version 23 24def _soc_family(build_metadata): 25 """Gets the SoC Family name for a given overlay""" 26 return build_metadata.package_summary.chipset.overlay 27 28def _remove_invalid_entries(bs_list): 29 """Filter out any invalid metadata based on overlay name.""" 30 invalid = [ 31 "galaxy", # Test overlay 32 # TODO: Filter non-cros devices. 33 # Warning ... they may not be public and this is a public repo. 34 ] 35 return [bs for bs in bs_list if _overlay(bs).lower() not in invalid] 36 37def _read(file_path): 38 """Read a BuildMetadataList from a json proto.""" 39 build_metadata_list = proto.from_jsonpb( 40 system_pb.SystemImage.BuildMetadataList, 41 io.read_file(file_path), 42 ) 43 return _remove_invalid_entries(build_metadata_list.values) 44 45def _get_kernel_versions(build_metadata_list): 46 """Returns dict of {kernel-version: [overlay-name, ...]}""" 47 kernel_versions = {} 48 for build_metadata in build_metadata_list: 49 overlay = _overlay(build_metadata) 50 version = _kernel_version(build_metadata) 51 if not version: 52 continue 53 54 overlays = kernel_versions.get(version, []) 55 overlays.append(overlay) 56 kernel_versions[version] = overlays 57 unique_kernel_overlays = {} 58 for version in kernel_versions: 59 unique_kernel_overlays[version] = set(kernel_versions[version]) 60 return unique_kernel_overlays 61 62def _get_soc_families(build_metadata_list): 63 """Returns dict of {overlay-name: soc-family} if the SOC value is set""" 64 soc_families = {} 65 for build_metadata in build_metadata_list: 66 overlay = _overlay(build_metadata) 67 soc_family = _soc_family(build_metadata) 68 if soc_family: 69 soc_families[overlay] = soc_family 70 return soc_families 71 72def _get_overlays(build_metadata_list): 73 """Returns set of all overlays""" 74 return set([_overlay(bm) for bm in build_metadata_list]) 75 76def _get_socs_kernels_overlays(build_metadata_list): 77 """Returns a map of all unique SoC familes, kernel-versions, and overlays 78 79 Args: 80 build_metadata_list: Software Build config bundle 81 Returns: 82 map: {soc-family: {kernel-version: overlays[]}} 83 """ 84 socs_kernels_overlays = {} 85 for build_metadata in build_metadata_list: 86 overlay = _overlay(build_metadata) 87 soc_family = _soc_family(build_metadata) 88 kernel = _kernel_version(build_metadata) 89 if soc_family and kernel: 90 kernels = socs_kernels_overlays.setdefault(soc_family, {}) 91 overlays = kernels.setdefault(kernel, []) 92 overlays.append(overlay) 93 return socs_kernels_overlays 94 95build_metadata = struct( 96 read = _read, 97 get_kernel_versions = _get_kernel_versions, 98 get_soc_families = _get_soc_families, 99 get_socs_kernels_overlays = _get_socs_kernels_overlays, 100 get_overlays = _get_overlays, 101) 102