Create metadata json file for each module
This CL creates a metadata json file for each module that support java APIs. The metadata file contains the information about - 1. the api-diff file name 2. the size of the api-diff file 3. module extension version More information will be added to this metadata file, which will be used by the mainline module api checks gantry gate to improve its functionality. Bug: 242316893 Test: Generate metadata file for each module. Passes all tests. Test: atest --host mainline_modules_sdks_test --no-bazel-mode Change-Id: I517e59e5a7bb0f6675950d7455a724816d599692
This commit is contained in:
@@ -288,6 +288,12 @@ def sdk_snapshot_api_diff_file(snapshots_dir, sdk_name):
|
|||||||
return os.path.join(snapshots_dir, f"{sdk_name}-{SDK_VERSION}-api-diff.txt")
|
return os.path.join(snapshots_dir, f"{sdk_name}-{SDK_VERSION}-api-diff.txt")
|
||||||
|
|
||||||
|
|
||||||
|
def sdk_snapshot_gantry_metadata_json_file(snapshots_dir, sdk_name):
|
||||||
|
"""Get the path to the sdk snapshot gantry metadata json file."""
|
||||||
|
return os.path.join(snapshots_dir,
|
||||||
|
f"{sdk_name}-{SDK_VERSION}-gantry-metadata.json")
|
||||||
|
|
||||||
|
|
||||||
# The default time to use in zip entries. Ideally, this should be the same as is
|
# The default time to use in zip entries. Ideally, this should be the same as is
|
||||||
# used by soong_zip and ziptime but there is no strict need for that to be the
|
# used by soong_zip and ziptime but there is no strict need for that to be the
|
||||||
# case. What matters is this is a fixed time so that the contents of zip files
|
# case. What matters is this is a fixed time so that the contents of zip files
|
||||||
@@ -541,8 +547,10 @@ java_sdk_library_import {{
|
|||||||
capture_output=True).stdout.decode("utf-8")
|
capture_output=True).stdout.decode("utf-8")
|
||||||
file_object.write(diff)
|
file_object.write(diff)
|
||||||
|
|
||||||
def create_snapshot_api_diff(self, sdk, target_dict, snapshots_dir):
|
def create_snapshot_gantry_metadata_and_api_diff(self, sdk, target_dict,
|
||||||
"""Creates api diff files for each module sdk.
|
snapshots_dir,
|
||||||
|
module_extension_version):
|
||||||
|
"""Creates gantry metadata and api diff files for each module sdk.
|
||||||
|
|
||||||
For each module sdk, the scope targets are obtained for each java sdk
|
For each module sdk, the scope targets are obtained for each java sdk
|
||||||
library and the api diff files are generated by performing a diff
|
library and the api diff files are generated by performing a diff
|
||||||
@@ -551,6 +559,8 @@ java_sdk_library_import {{
|
|||||||
sdk_info_file = sdk_snapshot_info_file(snapshots_dir, sdk)
|
sdk_info_file = sdk_snapshot_info_file(snapshots_dir, sdk)
|
||||||
sdk_zip_file = sdk_snapshot_zip_file(snapshots_dir, sdk)
|
sdk_zip_file = sdk_snapshot_zip_file(snapshots_dir, sdk)
|
||||||
sdk_api_diff_file = sdk_snapshot_api_diff_file(snapshots_dir, sdk)
|
sdk_api_diff_file = sdk_snapshot_api_diff_file(snapshots_dir, sdk)
|
||||||
|
|
||||||
|
gantry_metadata_dict = {}
|
||||||
with open(
|
with open(
|
||||||
sdk_api_diff_file, "w",
|
sdk_api_diff_file, "w",
|
||||||
encoding="utf8") as sdk_api_diff_file_object:
|
encoding="utf8") as sdk_api_diff_file_object:
|
||||||
@@ -569,14 +579,39 @@ java_sdk_library_import {{
|
|||||||
sdk_zip_file, removed_api,
|
sdk_zip_file, removed_api,
|
||||||
latest_removed_api, snapshots_dir)
|
latest_removed_api, snapshots_dir)
|
||||||
|
|
||||||
def build_snapshot_api_diff(self, modules, target_dict, snapshots_dir):
|
gantry_metadata_dict["api_diff_file"] = sdk_api_diff_file.rsplit(
|
||||||
"""For each module sdk, create the api diff file."""
|
"/", 1)[-1]
|
||||||
|
gantry_metadata_dict["api_diff_file_size"] = os.path.getsize(
|
||||||
|
sdk_api_diff_file)
|
||||||
|
gantry_metadata_dict[
|
||||||
|
"module_extension_version"] = module_extension_version
|
||||||
|
sdk_metadata_json_file = sdk_snapshot_gantry_metadata_json_file(
|
||||||
|
snapshots_dir, sdk)
|
||||||
|
|
||||||
|
gantry_metadata_json_object = json.dumps(gantry_metadata_dict, indent=4)
|
||||||
|
with open(sdk_metadata_json_file,
|
||||||
|
"w") as gantry_metadata_json_file_object:
|
||||||
|
gantry_metadata_json_file_object.write(gantry_metadata_json_object)
|
||||||
|
|
||||||
|
def get_module_extension_version(self):
|
||||||
|
return int(
|
||||||
|
subprocess.run([
|
||||||
|
"build/soong/soong_ui.bash", "--dumpvar-mode",
|
||||||
|
"PLATFORM_SDK_EXTENSION_VERSION"
|
||||||
|
],
|
||||||
|
capture_output=True).stdout.decode("utf-8").strip())
|
||||||
|
|
||||||
|
def build_snapshot_gantry_metadata_and_api_diff(self, modules, target_dict,
|
||||||
|
snapshots_dir):
|
||||||
|
"""For each module sdk, create the metadata and api diff file."""
|
||||||
|
module_extension_version = self.get_module_extension_version()
|
||||||
for module in modules:
|
for module in modules:
|
||||||
for sdk in module.sdks:
|
for sdk in module.sdks:
|
||||||
sdk_type = sdk_type_from_name(sdk)
|
sdk_type = sdk_type_from_name(sdk)
|
||||||
if not sdk_type.providesApis:
|
if not sdk_type.providesApis:
|
||||||
continue
|
continue
|
||||||
self.create_snapshot_api_diff(sdk, target_dict, snapshots_dir)
|
self.create_snapshot_gantry_metadata_and_api_diff(
|
||||||
|
sdk, target_dict, snapshots_dir, module_extension_version)
|
||||||
|
|
||||||
|
|
||||||
# The sdk version to build
|
# The sdk version to build
|
||||||
@@ -1164,7 +1199,7 @@ class SdkDistProducer:
|
|||||||
if build_release == LATEST:
|
if build_release == LATEST:
|
||||||
target_dict = self.snapshot_builder.build_sdk_scope_targets(
|
target_dict = self.snapshot_builder.build_sdk_scope_targets(
|
||||||
build_release, modules)
|
build_release, modules)
|
||||||
self.snapshot_builder.build_snapshot_api_diff(
|
self.snapshot_builder.build_snapshot_gantry_metadata_and_api_diff(
|
||||||
modules, target_dict, snapshots_dir)
|
modules, target_dict, snapshots_dir)
|
||||||
self.populate_unbundled_dist(build_release, modules, snapshots_dir)
|
self.populate_unbundled_dist(build_release, modules, snapshots_dir)
|
||||||
return snapshots_dir
|
return snapshots_dir
|
||||||
@@ -1176,18 +1211,26 @@ class SdkDistProducer:
|
|||||||
build_release, modules)
|
build_release, modules)
|
||||||
self.populate_bundled_dist(build_release, modules, snapshots_dir)
|
self.populate_bundled_dist(build_release, modules, snapshots_dir)
|
||||||
|
|
||||||
def dist_sdk_snapshot_api_diff(self, sdk_dist_dir, sdk, module,
|
def dist_sdk_snapshot_gantry_metadata_and_api_diff(self, sdk_dist_dir, sdk,
|
||||||
snapshots_dir):
|
module, snapshots_dir):
|
||||||
"""Copy the sdk snapshot api diff file to a dist directory."""
|
"""Copy the sdk snapshot api diff file to a dist directory."""
|
||||||
sdk_type = sdk_type_from_name(sdk)
|
sdk_type = sdk_type_from_name(sdk)
|
||||||
if not sdk_type.providesApis:
|
if not sdk_type.providesApis:
|
||||||
return
|
return
|
||||||
|
|
||||||
sdk_dist_subdir = os.path.join(sdk_dist_dir, module.apex, "sdk")
|
sdk_dist_module_subdir = os.path.join(sdk_dist_dir, module.apex)
|
||||||
|
sdk_dist_subdir = os.path.join(sdk_dist_module_subdir, "sdk")
|
||||||
os.makedirs(sdk_dist_subdir, exist_ok=True)
|
os.makedirs(sdk_dist_subdir, exist_ok=True)
|
||||||
sdk_api_diff_path = sdk_snapshot_api_diff_file(snapshots_dir, sdk)
|
sdk_api_diff_path = sdk_snapshot_api_diff_file(snapshots_dir, sdk)
|
||||||
shutil.copy(sdk_api_diff_path, sdk_dist_subdir)
|
shutil.copy(sdk_api_diff_path, sdk_dist_subdir)
|
||||||
|
|
||||||
|
sdk_gantry_metadata_json_path = sdk_snapshot_gantry_metadata_json_file(
|
||||||
|
snapshots_dir, sdk)
|
||||||
|
sdk_dist_gantry_metadata_json_path = os.path.join(
|
||||||
|
sdk_dist_module_subdir, "gantry-metadata.json")
|
||||||
|
shutil.copy(sdk_gantry_metadata_json_path,
|
||||||
|
sdk_dist_gantry_metadata_json_path)
|
||||||
|
|
||||||
def populate_unbundled_dist(self, build_release, modules, snapshots_dir):
|
def populate_unbundled_dist(self, build_release, modules, snapshots_dir):
|
||||||
build_release_dist_dir = os.path.join(self.mainline_sdks_dir,
|
build_release_dist_dir = os.path.join(self.mainline_sdks_dir,
|
||||||
build_release.sub_dir)
|
build_release.sub_dir)
|
||||||
@@ -1195,8 +1238,8 @@ class SdkDistProducer:
|
|||||||
for sdk in module.sdks:
|
for sdk in module.sdks:
|
||||||
sdk_dist_dir = os.path.join(build_release_dist_dir, SDK_VERSION)
|
sdk_dist_dir = os.path.join(build_release_dist_dir, SDK_VERSION)
|
||||||
if build_release == LATEST:
|
if build_release == LATEST:
|
||||||
self.dist_sdk_snapshot_api_diff(sdk_dist_dir, sdk, module,
|
self.dist_sdk_snapshot_gantry_metadata_and_api_diff(
|
||||||
snapshots_dir)
|
sdk_dist_dir, sdk, module, snapshots_dir)
|
||||||
self.populate_dist_snapshot(build_release, module, sdk,
|
self.populate_dist_snapshot(build_release, module, sdk,
|
||||||
sdk_dist_dir, snapshots_dir)
|
sdk_dist_dir, snapshots_dir)
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import shutil
|
|||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
import zipfile
|
import zipfile
|
||||||
|
import json
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
import mainline_modules_sdks as mm
|
import mainline_modules_sdks as mm
|
||||||
@@ -108,6 +109,10 @@ class FakeSnapshotBuilder(mm.SnapshotBuilder):
|
|||||||
# For rest of the modules, generate an empty .info file.
|
# For rest of the modules, generate an empty .info file.
|
||||||
self.write_data_to_file(sdk_info_file, "[]")
|
self.write_data_to_file(sdk_info_file, "[]")
|
||||||
|
|
||||||
|
def get_module_extension_version(self):
|
||||||
|
# Return any integer value indicating the module extension version for testing.
|
||||||
|
return 5
|
||||||
|
|
||||||
def build_sdk_scope_targets(self, build_release, modules):
|
def build_sdk_scope_targets(self, build_release, modules):
|
||||||
target_paths = []
|
target_paths = []
|
||||||
target_dict = {}
|
target_dict = {}
|
||||||
@@ -199,14 +204,18 @@ class TestProduceDist(unittest.TestCase):
|
|||||||
"mainline-sdks/for-S-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
|
"mainline-sdks/for-S-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
|
||||||
"mainline-sdks/for-S-build/current/com.android.tethering/sdk/tethering-module-sdk-current.zip",
|
"mainline-sdks/for-S-build/current/com.android.tethering/sdk/tethering-module-sdk-current.zip",
|
||||||
"mainline-sdks/for-S-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
|
"mainline-sdks/for-S-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
|
||||||
|
"mainline-sdks/for-latest-build/current/com.android.art/gantry-metadata.json",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current-api-diff.txt",
|
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current-api-diff.txt",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.art/test-exports/art-module-test-exports-current.zip",
|
||||||
|
"mainline-sdks/for-latest-build/current/com.android.ipsec/gantry-metadata.json",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current-api-diff.txt",
|
"mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current-api-diff.txt",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.ipsec/sdk/ipsec-module-sdk-current.zip",
|
||||||
|
"mainline-sdks/for-latest-build/current/com.android.tethering/gantry-metadata.json",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.tethering/sdk/tethering-module-sdk-current-api-diff.txt",
|
"mainline-sdks/for-latest-build/current/com.android.tethering/sdk/tethering-module-sdk-current-api-diff.txt",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.tethering/sdk/tethering-module-sdk-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.tethering/sdk/tethering-module-sdk-current.zip",
|
||||||
|
"mainline-sdks/for-latest-build/current/com.google.android.wifi/gantry-metadata.json",
|
||||||
"mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current-api-diff.txt",
|
"mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current-api-diff.txt",
|
||||||
"mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
|
"mainline-sdks/for-latest-build/current/com.google.android.wifi/sdk/wifi-module-sdk-current.zip",
|
||||||
],
|
],
|
||||||
@@ -295,6 +304,7 @@ class TestProduceDist(unittest.TestCase):
|
|||||||
"bundled-mainline-sdks/platform-mainline/sdk/platform-mainline-sdk-current.zip",
|
"bundled-mainline-sdks/platform-mainline/sdk/platform-mainline-sdk-current.zip",
|
||||||
"bundled-mainline-sdks/platform-mainline/test-exports/platform-mainline-test-exports-current.zip",
|
"bundled-mainline-sdks/platform-mainline/test-exports/platform-mainline-test-exports-current.zip",
|
||||||
# Unbundled (normal) modules.
|
# Unbundled (normal) modules.
|
||||||
|
"mainline-sdks/for-latest-build/current/com.android.art/gantry-metadata.json",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.art/host-exports/art-module-host-exports-current.zip",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current-api-diff.txt",
|
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current-api-diff.txt",
|
||||||
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
|
"mainline-sdks/for-latest-build/current/com.android.art/sdk/art-module-sdk-current.zip",
|
||||||
@@ -311,6 +321,29 @@ class TestProduceDist(unittest.TestCase):
|
|||||||
0,
|
0,
|
||||||
msg="Api diff file should not be empty for the art module")
|
msg="Api diff file should not be empty for the art module")
|
||||||
|
|
||||||
|
art_gantry_metadata_json_file = os.path.join(
|
||||||
|
self.tmp_dist_dir,
|
||||||
|
"mainline-sdks/for-latest-build/current/com.android.art/gantry-metadata.json"
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(art_gantry_metadata_json_file, "r",
|
||||||
|
encoding="utf8") as gantry_metadata_json_file_object:
|
||||||
|
json_data = json.load(gantry_metadata_json_file_object)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
json_data["api_diff_file"],
|
||||||
|
"art-module-sdk-current-api-diff.txt",
|
||||||
|
msg="Incorrect api-diff file name.")
|
||||||
|
self.assertEqual(
|
||||||
|
json_data["api_diff_file_size"],
|
||||||
|
267,
|
||||||
|
msg="Incorrect api-diff file size.")
|
||||||
|
self.assertEqual(
|
||||||
|
json_data["module_extension_version"],
|
||||||
|
5,
|
||||||
|
msg="The module extension version does not match the expected value."
|
||||||
|
)
|
||||||
|
|
||||||
def create_build_number_file(self):
|
def create_build_number_file(self):
|
||||||
soong_dir = os.path.join(self.tmp_out_dir, "soong")
|
soong_dir = os.path.join(self.tmp_out_dir, "soong")
|
||||||
os.makedirs(soong_dir, exist_ok=True)
|
os.makedirs(soong_dir, exist_ok=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user