Add OEM name to model_sku.json

Add a new top-level field oem_name in model_sku.json, and the data will
later be written to VPD based on its key (i.e., the custom label). This
is part of the OEM name customization process, see
go/cros-healthd-customize-impl-oem.

BUG=b:239674405
TEST=./generate.sh
TEST=(cd test/project/fake/fake && config/bin/gen_config config.star)
     then verify model_sku.json
TEST=./run_py_unittests.sh && ./run_go_unittests.sh

Cq-Depend: chrome-internal:4923552,chrome-internal:4923553,chrome-internal:4922938,chrome-internal:4923122
Cq-Depend: chrome-internal:4923577,chrome-internal:4922772,chrome-internal:4923554,chrome-internal:4922336
Cq-Depend: chrome-internal:4923555,chrome-internal:4923597,chrome-internal:4923123,chrome-internal:4923556
Cq-Depend: chrome-internal:4923071,chrome-internal:4922398,chrome-internal:4923344,chrome-internal:4922071
Cq-Depend: chrome-internal:4923124,chrome-internal:4923345,chrome-internal:4923598,chrome-internal:4923599
Cq-Depend: chrome-internal:4923125,chrome-internal:4923346,chrome-internal:4923618,chrome-internal:4922773
Cq-Depend: chrome-internal:4923347,chrome-internal:4923126,chrome-internal:4923348,chrome-internal:4923600
Cq-Depend: chrome-internal:4923619,chrome-internal:4923349,chrome-internal:4922774,chrome-internal:4923620
Cq-Depend: chrome-internal:4923601,chrome-internal:4923602,chrome-internal:4923621,chrome-internal:4922939
Cq-Depend: chrome-internal:4922775,chrome-internal:4923127,chrome-internal:4923072,chrome-internal:4923622
Cq-Depend: chrome-internal:4923623,chrome-internal:4923073,chrome-internal:4922072,chrome-internal:4923603
Cq-Depend: chrome-internal:4923128,chrome-internal:4923578,chrome-internal:4923624,chrome-internal:4922073
Cq-Depend: chrome-internal:4922776,chrome-internal:4923604,chrome-internal:4923129,chrome-internal:4923130
Cq-Depend: chrome-internal:4923350,chrome-internal:4922399
Cq-Depend: chrome-internal:4949287,chrome-internal:4949110,chrome-internal:4949111
Cq-Depend: chrome-internal:4949112,chrome-internal:4948205,chrome-internal:4949508
Cq-Depend: chrome-internal:4953762
Change-Id: I280d0964510e3d465ccdbed66e7b6e77d8ee8c0c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/config/+/3687034
Reviewed-by: Sam McNally <sammc@chromium.org>
Commit-Queue: Denny Huang <dennyh@google.com>
Reviewed-by: YH Lin <yueherngl@chromium.org>
Reviewed-by: Cheng Yueh <cyueh@chromium.org>
diff --git a/payload_utils/factory_config_proto_converter.py b/payload_utils/factory_config_proto_converter.py
index fb03782..5e3ea01 100755
--- a/payload_utils/factory_config_proto_converter.py
+++ b/payload_utils/factory_config_proto_converter.py
@@ -267,6 +267,10 @@
     dict that maps the design id onto the factory test config.
   """
   product_sku = {}
+  oem_name = {}
+  partners = {x.id.value: x for x in config.partner_list}
+  brand_configs = {x.brand_id.value: x for x in config.brand_configs}
+
   # Enumerate designs.
   for hw_design in config.design_list:
     design_name = hw_design.id.value
@@ -283,6 +287,25 @@
         design_config_table.update({'custom_type': 'whitelabel'})
       elif custom_type == design_pb2.Design.CustomType.REBRAND:
         design_config_table.update({'custom_type': 'rebrand'})
+  # Create map from custom label to oem name.
+  if config.device_brand_list:
+    for device_brand in config.device_brand_list:
+      device_brand_id = device_brand.id.value
+      # Design names should be lowercase, to be consistent with `model`.
+      design_name = device_brand.design_id.value.lower()
+      design_oem_name_table = oem_name.setdefault(design_name, {})
+      if not partners.get(device_brand.oem_id.value):
+        print(
+            "OEM %r for the device_brand %r is not found in partner_list %r." %
+            (device_brand.oem_id.value, device_brand_id, list(partners.keys())),
+            file=sys.stderr)
+        continue
+      key = ''
+      value = partners[device_brand.oem_id.value].name
+      brand_config = brand_configs.get(device_brand_id)
+      if brand_config and brand_config.scan_config.whitelabel_tag:
+        key = brand_config.scan_config.whitelabel_tag
+      design_oem_name_table.setdefault(key, value)
   # Enumerate (design, sku id).
   for sw_design in config.software_configs:
     design_name, sku_id = ParseDesignConfigId(sw_design.design_config_id.value)
@@ -321,7 +344,7 @@
             file=sys.stderr)
       else:
         product_name_table[sku_id] = content
-  return {'model': model, 'product_sku': new_product_sku}
+  return {'model': model, 'oem_name': oem_name, 'product_sku': new_product_sku}
 
 
 def _ReadConfig(path):
diff --git a/payload_utils/test_data/model_sku.json b/payload_utils/test_data/model_sku.json
index d5aee05..b78e212 100644
--- a/payload_utils/test_data/model_sku.json
+++ b/payload_utils/test_data/model_sku.json
@@ -318,6 +318,31 @@
       "fw_config": 90914
     }
   },
+  "oem_name": {
+    "fake_ref_design": {
+      "": "FAKE_OEM"
+    },
+    "project_a": {
+      "": "FAKE_OEMA"
+    },
+    "project_b": {
+      "": "FAKE_OEMB"
+    },
+    "project_box": {
+      "": "FAKE_OEM"
+    },
+    "project_c": {
+      "": "FAKE_OEMC"
+    },
+    "project_rebrand": {
+      "branda": "FAKE_OEMD"
+    },
+    "project_wl": {
+      "loema": "FAKE_LOEMA",
+      "loemb": "FAKE_LOEMB",
+      "loemc": "FAKE_LOEMC"
+    }
+  },
   "product_sku": {
     "FAKE_REF_DESIGN": {
       "0": {
diff --git a/test/project/fake/fake/factory/generated/model_sku.json b/test/project/fake/fake/factory/generated/model_sku.json
index d5aee05..b78e212 100644
--- a/test/project/fake/fake/factory/generated/model_sku.json
+++ b/test/project/fake/fake/factory/generated/model_sku.json
@@ -318,6 +318,31 @@
       "fw_config": 90914
     }
   },
+  "oem_name": {
+    "fake_ref_design": {
+      "": "FAKE_OEM"
+    },
+    "project_a": {
+      "": "FAKE_OEMA"
+    },
+    "project_b": {
+      "": "FAKE_OEMB"
+    },
+    "project_box": {
+      "": "FAKE_OEM"
+    },
+    "project_c": {
+      "": "FAKE_OEMC"
+    },
+    "project_rebrand": {
+      "branda": "FAKE_OEMD"
+    },
+    "project_wl": {
+      "loema": "FAKE_LOEMA",
+      "loemb": "FAKE_LOEMB",
+      "loemc": "FAKE_LOEMC"
+    }
+  },
   "product_sku": {
     "FAKE_REF_DESIGN": {
       "0": {