Add controller calls to fill out ModelMetadata using service calls.

BUG=chromium:1071620
TEST=manual, run_tests

Change-Id: Ia09f2a6a547460f36484ce309ad84b1f1f52903d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2220161
Tested-by: Michael Mortensen <mmortensen@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index ef1a050..909b66a 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -232,8 +232,6 @@
   build_target_metadata.arc_use_set = 'arc' in portage_util.GetBoardUseFlags(
       build_target.name)
 
-  # TODO(crbug/1071620): Add service layer calls to fill out the rest of
-  # build_target_metadata and model_metadata.
   fw_versions = packages.determine_firmware_versions(build_target)
   build_target_metadata.main_firmware_version = fw_versions.main_fw_version
   build_target_metadata.ec_firmware_version = fw_versions.ec_fw_version
@@ -242,6 +240,25 @@
   for fingerprint in packages.find_fingerprints(build_target):
     build_target_metadata.fingerprints.append(fingerprint)
 
+  models = packages.get_models(build_target)
+  if models:
+    all_fw_versions = packages.get_all_firmware_versions(build_target)
+    for model in models:
+      if model in all_fw_versions:
+        fw_versions = all_fw_versions[model]
+        ec = fw_versions.ec_rw or fw_versions.ec
+        main_ro = fw_versions.main
+        main_rw = fw_versions.main_rw or main_ro
+        # Get the firmware key-id for the current board and model.
+        key_id = packages.get_key_id(build_target, model)
+        model_metadata = output_proto.model_metadata.add()
+        model_metadata.model_name = model
+        model_metadata.ec_firmware_version = ec
+        model_metadata.firmware_key_id = key_id
+        model_metadata.main_readonly_firmware_version = main_ro
+        model_metadata.main_readwrite_firmware_version = main_rw
+
+
 def _HasPrebuiltSuccess(_input_proto, output_proto, _config):
   """The mock success case for HasChromePrebuilt."""
   output_proto.has_prebuilt = True
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index 354d7cc..2d76a2e 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -566,6 +566,30 @@
     fingerprints = ['fingerprint1', 'fingerprint2']
     self.PatchObject(packages_service, 'find_fingerprints',
                      return_value=fingerprints)
+    # Patch packages.get_models, packages.get_all_firmware_versions,
+    # and packages.get_key_id for calls needed by model_metadata.
+    model_list = ['pyro', 'reef']
+    all_fw_versions = {
+        'pyro': packages_service.FirmwareVersions(
+            'pyro',
+            'Google_Pyro.9042.87.1',
+            'Google_Pyro.9042.110.0',
+            'pyro_v1.1.5900-ab1ee51',
+            'pyro_v1.1.5909-bd1f0c9'),
+        'reef': packages_service.FirmwareVersions(
+            'reef',
+            'Google_Reef.9042.87.1',
+            'Google_Reef.9042.110.0',
+            'reef_v1.1.5900-ab1ee51',
+            'reef_v1.1.5909-bd1f0c9')
+    }
+    self.PatchObject(packages_service, 'get_all_firmware_versions',
+                     return_value=all_fw_versions)
+    self.PatchObject(packages_service, 'get_models',
+                     return_value=model_list)
+    self.PatchObject(packages_service, 'get_key_id',
+                     return_value='key')
+
     request = self._GetRequest(board='betty')
     packages_controller.GetBuilderMetadata(request, self.response,
                                            self.api_config)
@@ -605,6 +629,34 @@
     self.assertEqual(
         self.response.build_target_metadata[0].fingerprints,
         fingerprints)
+    self.assertEqual(
+        len(self.response.model_metadata), 2)
+    self.assertEqual(
+        self.response.model_metadata[0].model_name, 'pyro')
+    self.assertEqual(
+        self.response.model_metadata[0].ec_firmware_version,
+        'pyro_v1.1.5909-bd1f0c9')
+    self.assertEqual(
+        self.response.model_metadata[0].firmware_key_id, 'key')
+    self.assertEqual(
+        self.response.model_metadata[0].main_readonly_firmware_version,
+        'Google_Pyro.9042.87.1')
+    self.assertEqual(
+        self.response.model_metadata[0].main_readwrite_firmware_version,
+        'Google_Pyro.9042.110.0')
+    self.assertEqual(
+        self.response.model_metadata[1].model_name, 'reef')
+    self.assertEqual(
+        self.response.model_metadata[1].ec_firmware_version,
+        'reef_v1.1.5909-bd1f0c9')
+    self.assertEqual(
+        self.response.model_metadata[1].firmware_key_id, 'key')
+    self.assertEqual(
+        self.response.model_metadata[1].main_readonly_firmware_version,
+        'Google_Reef.9042.87.1')
+    self.assertEqual(
+        self.response.model_metadata[1].main_readwrite_firmware_version,
+        'Google_Reef.9042.110.0')
 
 
 class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):