cli: Deploy compressed DLC metadata

Load the source metadata files and pipe to the device, then call the
`dlc_metadata_util` to set it on-device.

BUG=b:255627042
TEST=./scripts/run_tests cli/deploy_unittest.py
TEST=cros deploy ${HOST} sample-dlc

Change-Id: I6595edc64a04d8b3352f523c731d6619a0880b16
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4679249
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Jae Hoon Kim <kimjae@chromium.org>
Tested-by: Yuanpeng Ni‎ <yuanpengni@chromium.org>
Commit-Queue: Yuanpeng Ni‎ <yuanpengni@chromium.org>
diff --git a/cli/deploy.py b/cli/deploy.py
index 976b416..253b882 100644
--- a/cli/deploy.py
+++ b/cli/deploy.py
@@ -1359,23 +1359,34 @@
             logging.error("Failed to uninstall DLC.")
             raise
 
-        logging.notice("Deploy the DLC image for %s", dlc_id)
-        dlc_img_path_src = os.path.join(
+        src_dlc_dir = os.path.join(
             sysroot,
             dlc_lib.DLC_BUILD_DIR,
             dlc_id,
-            dlc_package,
-            dlc_lib.DLC_IMAGE,
         )
-        if not os.path.exists(dlc_img_path_src):
-            dlc_img_path_src = os.path.join(
+        if not os.path.exists(src_dlc_dir):
+            src_dlc_dir = os.path.join(
                 sysroot,
                 dlc_lib.DLC_BUILD_DIR_SCALED,
                 dlc_id,
-                dlc_package,
-                dlc_lib.DLC_IMAGE,
             )
 
+        # Deploy the metadata entry to compressed metadata on device.
+        logging.notice("Setting the DLC metadata for %s", dlc_id)
+        metadata = dlc_lib.DlcMetadata.LoadSrcMetadata(src_dlc_dir)
+        device.run(
+            [dlc_lib.DLC_METADATA_UTIL, "--set", f"--id={dlc_id}"],
+            input=json.dumps(metadata),
+            check=False,
+        )
+
+        logging.notice("Deploy the DLC image for %s", dlc_id)
+        dlc_img_path_src = os.path.join(
+            src_dlc_dir,
+            dlc_package,
+            dlc_lib.DLC_IMAGE,
+        )
+
         dlc_img_path = os.path.join(_DLC_INSTALL_ROOT, dlc_id, dlc_package)
         dlc_img_path_a = os.path.join(dlc_img_path, "dlc_a")
         dlc_img_path_b = os.path.join(dlc_img_path, "dlc_b")
@@ -1400,23 +1411,15 @@
         device.run(["chown", "-R", "dlcservice:dlcservice", _DLC_INSTALL_ROOT])
 
         # Copy metadata to device.
+        # TODO(b/290961240): To be removed once the transition to compressed
+        # metadata is complete.
         dest_meta_dir = Path("/") / dlc_lib.DLC_META_DIR / dlc_id / dlc_package
         device.mkdir(dest_meta_dir)
         src_meta_dir = os.path.join(
-            sysroot,
-            dlc_lib.DLC_BUILD_DIR,
-            dlc_id,
+            src_dlc_dir,
             dlc_package,
             dlc_lib.DLC_TMP_META_DIR,
         )
-        if not os.path.exists(src_meta_dir):
-            src_meta_dir = os.path.join(
-                sysroot,
-                dlc_lib.DLC_BUILD_DIR_SCALED,
-                dlc_id,
-                dlc_package,
-                dlc_lib.DLC_TMP_META_DIR,
-            )
         device.CopyToDevice(
             src_meta_dir + "/",
             dest_meta_dir,