build_dlc: Add --used-by flag

This flag allows us to define the user of DLC and make proper actions to
whether ref-count the DLC or not.

BUG=chromium:1069162
TEST=CQ passes
TEST=build_dlc_unittest

Exempt-From-Owner-Approval: Owner already approved with minor nits.
Change-Id: I997efaa21e0979ebb9fbb54ee9834e4bb2022b76
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2148146
Commit-Queue: Amin Hassani <ahassani@chromium.org>
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Jae Hoon Kim <kimjae@chromium.org>
Reviewed-by: Andrew Lassalle <andrewlassalle@chromium.org>
diff --git a/scripts/build_dlc.py b/scripts/build_dlc.py
index c65413a..9e9ccf5 100644
--- a/scripts/build_dlc.py
+++ b/scripts/build_dlc.py
@@ -43,6 +43,9 @@
 _SQUASHFS_TYPE = 'squashfs'
 _EXT4_TYPE = 'ext4'
 
+_USED_BY_USER = 'user'
+_USED_BY_SYSTEM = 'system'
+
 MAX_ID_NAME = 40
 
 
@@ -87,10 +90,11 @@
     name: (str) DLC name.
     description: (str) DLC description.
     preload: (bool) allow for preloading DLC.
+    used_by: (str) The user of this DLC, e.g. "system" or "user"
   """
 
   def __init__(self, dlc_id, dlc_package, fs_type, pre_allocated_blocks,
-               version, name, description, preload):
+               version, name, description, preload, used_by):
     self.dlc_id = dlc_id
     self.dlc_package = dlc_package
     self.fs_type = fs_type
@@ -99,6 +103,7 @@
     self.name = name
     self.description = description
     self.preload = preload
+    self.used_by = used_by
 
   def StoreDlcParameters(self, install_root_dir, sudo):
     """Store DLC parameters defined in the ebuild.
@@ -399,6 +404,7 @@
         'table-sha256-hash': table_hash,
         'version': self.ebuild_params.version,
         'preload-allowed': self.ebuild_params.preload,
+        'used-by': self.ebuild_params.used_by,
     }
 
   def GenerateVerity(self):
@@ -663,6 +669,13 @@
       action='store_true',
       help='Allow preloading of DLC.')
   one_dlc.add_argument(
+      '--used-by', default=_USED_BY_SYSTEM,
+      choices=(_USED_BY_USER, _USED_BY_SYSTEM),
+      help='Defines how this DLC will be used so dlcservice can take proper '
+      'actions based on the type of usage. For example, if "user" is passed, '
+      'dlcservice does ref counting when DLC is installed/uninstalled. For '
+      '"system", there will be no such provisions.')
+  one_dlc.add_argument(
       '--build-package',
       default=False,
       action='store_true',
@@ -759,7 +772,8 @@
         description=opts.description,
         pre_allocated_blocks=opts.pre_allocated_blocks,
         version=opts.version,
-        preload=opts.preload)
+        preload=opts.preload,
+        used_by=opts.used_by)
     params.StoreDlcParameters(install_root_dir=opts.install_root_dir, sudo=True)
 
   else: