CP cl/247518556

Bug: 123894473
Test: atest acloud_test --host
Change-Id: If667d3de04fdb1a5a53e3ceacb0acf6b2792a628
diff --git a/public/acloud_main.py b/public/acloud_main.py
index 83a2573..c30837f 100644
--- a/public/acloud_main.py
+++ b/public/acloud_main.py
@@ -242,6 +242,24 @@
         required=False,
         default=None,
         help="Tags to be set on to the created instance. e.g. https-server.")
+    create_gf_parser.add_argument(
+        "--kernel_build_id",
+        type=str,
+        dest="kernel_build_id",
+        help="Android kernel build id, e.g. 4586590. This is to test a new"
+        " kernel build with a particular Android build (--build_id). If neither"
+        " kernel_branch nor kernel_build_id are specified, the kernel that's"
+        " bundled with the Android build would be used.")
+    create_gf_parser.add_argument(
+        "--kernel_branch",
+        type=str,
+        dest="kernel_branch",
+        help="Android kernel build branch name, "
+        "e.g. kernel-common-android-4.14. This is to test a new kernel build "
+        "with a particular Android build (--build_id). If specified without "
+        "specifying kernel_build_id, the last green build in the branch will "
+        "be used. If neither kernel_branch nor kernel_build_id are specified, "
+        "the kernel that's bundled with the Android build would be used.")
 
     create_args.AddCommonCreateArgs(create_gf_parser)
     subparser_list.append(create_gf_parser)
@@ -422,6 +440,8 @@
             emulator_build_id=args.emulator_build_id,
             branch=args.branch,
             emulator_branch=args.emulator_branch,
+            kernel_build_id=args.kernel_build_id,
+            kernel_branch=args.kernel_branch,
             gpu=args.gpu,
             num=args.num,
             serial_log_file=args.serial_log_file,
diff --git a/public/actions/create_goldfish_action.py b/public/actions/create_goldfish_action.py
index d24cf87..b2591ea 100644
--- a/public/actions/create_goldfish_action.py
+++ b/public/actions/create_goldfish_action.py
@@ -64,6 +64,8 @@
                  build_id,
                  emulator_build_target,
                  emulator_build_id,
+                 kernel_build_id=None,
+                 kernel_branch=None,
                  gpu=None,
                  avd_spec=None,
                  tags=None,
@@ -109,6 +111,8 @@
             build_target, build_id, branch)
         self.emulator_build_info = self._build_client.GetBuildInfo(
             emulator_build_target, emulator_build_id, emulator_branch)
+        self.kernel_build_info = self._build_client.GetBuildInfo(
+            cfg.kernel_build_target, kernel_build_id, kernel_branch)
 
     def GetBuildInfoDict(self):
         """Get build info dictionary.
@@ -123,6 +127,12 @@
             {"emulator_%s" % key: val
              for key, val in self.emulator_build_info.__dict__.items() if val}
             )
+
+        build_info_dict.update(
+            {"kernel_%s" % key: val
+             for key, val in self.kernel_build_info.__dict__.items() if val}
+            )
+
         return build_info_dict
 
     def CreateInstance(self):
@@ -146,6 +156,8 @@
             build_id=self.build_info.build_id,
             emulator_branch=self.emulator_build_info.branch,
             emulator_build_id=self.emulator_build_info.gcs_bucket_build_id,
+            kernel_branch=self.kernel_build_info.branch,
+            kernel_build_id=self.kernel_build_info.build_id,
             gpu=self._gpu,
             blank_data_disk_size_gb=self._blank_data_disk_size_gb,
             avd_spec=self._avd_spec,
@@ -210,12 +222,15 @@
         return ParseBuildInfo(temp_filename)
 
 
+#pylint: disable=too-many-locals
 def CreateDevices(avd_spec=None,
                   cfg=None,
                   build_target=None,
                   build_id=None,
                   emulator_build_id=None,
                   emulator_branch=None,
+                  kernel_build_id=None,
+                  kernel_branch=None,
                   gpu=None,
                   num=1,
                   serial_log_file=None,
@@ -235,6 +250,8 @@
         emulator_build_id: String, emulator build id.
         emulator_branch: String, Emulator branch name.
         gpu: String, GPU to attach to the device or None. e.g. "nvidia-k80"
+        kernel_build_id: Kernel build id, a string.
+        kernel_branch: Kernel branch name, a string.
         num: Integer, Number of devices to create.
         serial_log_file: String, A path to a file where serial output should
                         be saved to.
@@ -295,17 +312,21 @@
                                      "in %s" % _SYSIMAGE_INFO_FILENAME)
     logger.info(
         "Creating a goldfish device in project %s, build_target: %s, "
-        "build_id: %s, emulator_bid: %s, GPU: %s, num: %s, "
+        "build_id: %s, emulator_bid: %s, kernel_build_id: %s, "
+        "kernel_branh: %s, GPU: %s, num: %s, "
         "serial_log_file: %s, logcat_file: %s, "
         "autoconnect: %s", cfg.project, build_target, build_id,
-        emulator_build_id, gpu, num, serial_log_file, logcat_file, autoconnect)
+        emulator_build_id, kernel_build_id, kernel_branch, gpu, num,
+        serial_log_file, logcat_file, autoconnect)
 
     device_factory = GoldfishDeviceFactory(cfg, build_target, build_id,
                                            cfg.emulator_build_target,
                                            emulator_build_id, gpu=gpu,
                                            avd_spec=avd_spec, tags=tags,
                                            branch=branch,
-                                           emulator_branch=emulator_branch)
+                                           emulator_branch=emulator_branch,
+                                           kernel_build_id=kernel_build_id,
+                                           kernel_branch=kernel_branch)
 
     return common_operations.CreateDevices("create_gf", cfg, device_factory,
                                            num, constants.TYPE_GF,
diff --git a/public/actions/create_goldfish_action_test.py b/public/actions/create_goldfish_action_test.py
index dc6202a..d90c7f6 100644
--- a/public/actions/create_goldfish_action_test.py
+++ b/public/actions/create_goldfish_action_test.py
@@ -41,6 +41,9 @@
     GPU = "nvidia-tesla-k80"
     BRANCH = "fake-branch"
     EMULATOR_BRANCH = "emu-fake-branch"
+    KERNEL_BRANCH = "fake-kernel-branch"
+    KERNEL_BUILD_ID = "54321"
+    KERNEL_BUILD_TARGET = "kernel"
     GOLDFISH_HOST_IMAGE_NAME = "fake-stable-host-image-name"
     GOLDFISH_HOST_IMAGE_PROJECT = "fake-stable-host-image-project"
     EXTRA_DATA_DISK_GB = 4
@@ -109,7 +112,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         none_avd_spec = None
 
@@ -117,7 +123,7 @@
         report = create_goldfish_action.CreateDevices(
             none_avd_spec, cfg, build_target=self.BUILD_TARGET,
             build_id=self.BUILD_ID, emulator_build_id=self.EMULATOR_BUILD_ID,
-            gpu=self.GPU)
+            gpu=self.GPU, kernel_build_id=self.KERNEL_BUILD_ID)
 
         # Verify
         self.compute_client.CreateInstance.assert_called_with(
@@ -130,6 +136,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=none_avd_spec,
             extra_scopes=self.EXTRA_SCOPES,
@@ -148,6 +156,10 @@
                     "emulator_build_id": self.EMULATOR_BUILD_ID,
                     "emulator_build_target": self.EMULATOR_BUILD_TARGET,
                     "emulator_gcs_bucket_build_id": self.EMULATOR_BUILD_ID,
+                    "kernel_branch": self.KERNEL_BRANCH,
+                    "kernel_build_id": self.KERNEL_BUILD_ID,
+                    "kernel_build_target": self.KERNEL_BUILD_TARGET,
+                    "kernel_gcs_bucket_build_id": self.KERNEL_BUILD_ID,
                 },
             ],
         })
@@ -165,7 +177,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec)
         # Verify
@@ -179,6 +194,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=self.avd_spec,
             extra_scopes=self.EXTRA_SCOPES,
@@ -203,7 +220,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         # Mock _FetchBuildIdFromFile method
         self.Patch(
@@ -221,9 +241,8 @@
             emulator_build_id=self.EMULATOR_BUILD_ID,
             emulator_branch=None,
             gpu=self.GPU,
-            branch=None)
-            # HACK HACK HACK
-            # branch=self.BRANCH)
+            branch=None,
+            kernel_build_id=self.KERNEL_BUILD_ID)
 
         # Verify
         self.compute_client.CreateInstance.assert_called_with(
@@ -236,6 +255,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=none_avd_spec,
             extra_scopes=self.EXTRA_SCOPES,
@@ -253,6 +274,10 @@
                 "emulator_build_id": self.EMULATOR_BUILD_ID,
                 "emulator_build_target": self.EMULATOR_BUILD_TARGET,
                 "emulator_gcs_bucket_build_id": self.EMULATOR_BUILD_ID,
+                "kernel_branch": self.KERNEL_BRANCH,
+                "kernel_build_id": self.KERNEL_BUILD_ID,
+                "kernel_build_target": self.KERNEL_BUILD_TARGET,
+                "kernel_gcs_bucket_build_id": self.KERNEL_BUILD_ID
             },],
         })
         self.assertEquals(report.command, "create_gf")
@@ -269,7 +294,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec)
         # Verify
@@ -283,6 +311,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=self.avd_spec,
             extra_scopes=self.EXTRA_SCOPES,
@@ -308,7 +338,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         # Mock _FetchBuildIdFromFile method
         self.Patch(
@@ -334,6 +367,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=none_avd_spec,
             extra_scopes=self.EXTRA_SCOPES,
@@ -351,6 +386,10 @@
                 "emulator_build_id": self.EMULATOR_BUILD_ID,
                 "emulator_build_target": self.EMULATOR_BUILD_TARGET,
                 "emulator_gcs_bucket_build_id": self.EMULATOR_BUILD_ID,
+                "kernel_branch": self.KERNEL_BRANCH,
+                "kernel_build_id": self.KERNEL_BUILD_ID,
+                "kernel_build_target": self.KERNEL_BUILD_TARGET,
+                "kernel_gcs_bucket_build_id": self.KERNEL_BUILD_ID,
             },],
         })
         self.assertEquals(report.command, "create_gf")
@@ -367,7 +406,10 @@
                 self.BRANCH, self.BUILD_ID, self.BUILD_TARGET, self.BUILD_ID),
             android_build_client.BuildInfo(
                 self.EMULATOR_BRANCH, self.EMULATOR_BUILD_ID,
-                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID)]
+                self.EMULATOR_BUILD_TARGET, self.EMULATOR_BUILD_ID),
+            android_build_client.BuildInfo(
+                self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
+                self.KERNEL_BUILD_TARGET, self.KERNEL_BUILD_ID)]
 
         report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec)
         # Verify
@@ -381,6 +423,8 @@
             build_id=self.BUILD_ID,
             emulator_branch=self.EMULATOR_BRANCH,
             emulator_build_id=self.EMULATOR_BUILD_ID,
+            kernel_branch=self.KERNEL_BRANCH,
+            kernel_build_id=self.KERNEL_BUILD_ID,
             gpu=self.GPU,
             avd_spec=self.avd_spec,
             extra_scopes=self.EXTRA_SCOPES,