• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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