Cherrypick cl/230919088 and cl/231435617

Bug: 123894473
Test: atest acloud_test --host
Change-Id: I18afbcd794399adf1c2f2b274dd1ea689d30d685
diff --git a/internal/lib/android_compute_client.py b/internal/lib/android_compute_client.py
index 63b36c4..2c77cfb 100755
--- a/internal/lib/android_compute_client.py
+++ b/internal/lib/android_compute_client.py
@@ -238,8 +238,10 @@
                        gpu=None,
                        extra_disk_name=None,
                        labels=None,
-                       avd_spec=None):
+                       avd_spec=None,
+                       extra_scopes=None):
         """Create a gce instance with a gce image.
+
         Args:
             instance: String, instance name.
             image_name: String, source image used to create this disk.
@@ -259,6 +261,8 @@
             extra_disk_name: String,the name of the extra disk to attach.
             labels: Dict, will be added to the instance's labels.
             avd_spec: AVDSpec object that tells us what we're going to create.
+            extra_scopes: List, extra scopes (strings) to be passed to the
+                          instance.
         """
         self._CheckMachineSize()
         disk_args = self._GetDiskArgs(instance, image_name)
@@ -293,7 +297,7 @@
         super(AndroidComputeClient, self).CreateInstance(
             instance, image_name, self._machine_type, metadata, self._network,
             self._zone, disk_args, image_project, gpu, extra_disk_name,
-            labels=labels)
+            labels=labels, extra_scopes=extra_scopes)
 
     def CheckBootFailure(self, serial_out, instance):
         """Determine if serial output has indicated any boot failure.
diff --git a/internal/lib/android_compute_client_test.py b/internal/lib/android_compute_client_test.py
index 9b4bdca..f73913f 100644
--- a/internal/lib/android_compute_client_test.py
+++ b/internal/lib/android_compute_client_test.py
@@ -48,6 +48,7 @@
     DPI = 160
     X_RES = 720
     Y_RES = 1280
+    EXTRA_SCOPES = None
 
     def _GetFakeConfig(self):
         """Create a fake configuration object.
@@ -67,6 +68,7 @@
         fake_cfg.orientation = self.ORIENTATION
         fake_cfg.resolution = self.DEVICE_RESOLUTION
         fake_cfg.metadata_variable = {self.METADATA[0]: self.METADATA[1]}
+        fake_cfg.extra_scopes = self.EXTRA_SCOPES
         return fake_cfg
 
     def setUp(self):
@@ -137,7 +139,7 @@
                   instance_name, self.IMAGE, self.MACHINE_TYPE,
                   expected_metadata, self.NETWORK, self.ZONE,
                   expected_disk_args, image_project, gpu, extra_disk_name,
-                  labels=labels)
+                  labels=labels, extra_scopes=self.EXTRA_SCOPES)
 
     # pylint: disable=invalid-name
     def testCheckMachineSizeMeetsRequirement(self):
diff --git a/internal/lib/cvd_compute_client.py b/internal/lib/cvd_compute_client.py
index 2c06b29..920e807 100644
--- a/internal/lib/cvd_compute_client.py
+++ b/internal/lib/cvd_compute_client.py
@@ -61,7 +61,8 @@
     def CreateInstance(self, instance, image_name, image_project,
                        build_target=None, branch=None, build_id=None,
                        kernel_branch=None, kernel_build_id=None,
-                       blank_data_disk_size_gb=None, avd_spec=None):
+                       blank_data_disk_size_gb=None, avd_spec=None,
+                       extra_scopes=None):
         """Create a cuttlefish instance given stable host image and build id.
 
         Args:
@@ -76,6 +77,7 @@
             kernel_build_id: Kernel build id, a string, e.g. "223051", "P280427"
             blank_data_disk_size_gb: Size of the blank data disk in GB.
             avd_spec: An AVDSpec instance.
+            extra_scopes: A list of extra scopes to be passed to the instance.
         """
         self._CheckMachineSize()
 
@@ -169,4 +171,5 @@
             machine_type=self._machine_type,
             network=self._network,
             zone=self._zone,
-            labels=labels)
+            labels=labels,
+            extra_scopes=extra_scopes)
diff --git a/internal/lib/cvd_compute_client_test.py b/internal/lib/cvd_compute_client_test.py
index d154c0e..aea2579 100644
--- a/internal/lib/cvd_compute_client_test.py
+++ b/internal/lib/cvd_compute_client_test.py
@@ -50,6 +50,7 @@
     EXTRA_DATA_DISK_SIZE_GB = 4
     BOOT_DISK_SIZE_GB = 10
     LAUNCH_ARGS = "--setupwizard_mode=REQUIRED"
+    EXTRA_SCOPES = ["scope1"]
 
     def _GetFakeConfig(self):
         """Create a fake configuration object.
@@ -67,6 +68,7 @@
         fake_cfg.metadata_variable = self.METADATA
         fake_cfg.extra_data_disk_size_gb = self.EXTRA_DATA_DISK_SIZE_GB
         fake_cfg.launch_args = self.LAUNCH_ARGS
+        fake_cfg.extra_scopes = self.EXTRA_SCOPES
         return fake_cfg
 
     def setUp(self):
@@ -112,7 +114,8 @@
         self.cvd_compute_client.CreateInstance(
             self.INSTANCE, self.IMAGE, self.IMAGE_PROJECT, self.TARGET,
             self.BRANCH, self.BUILD_ID, self.KERNEL_BRANCH,
-            self.KERNEL_BUILD_ID, self.EXTRA_DATA_DISK_SIZE_GB)
+            self.KERNEL_BUILD_ID, self.EXTRA_DATA_DISK_SIZE_GB,
+            extra_scopes=self.EXTRA_SCOPES)
         mock_create.assert_called_with(
             self.cvd_compute_client,
             instance=self.INSTANCE,
@@ -123,7 +126,8 @@
             machine_type=self.MACHINE_TYPE,
             network=self.NETWORK,
             zone=self.ZONE,
-            labels={constants.LABEL_CREATE_BY: "fake_user"})
+            labels={constants.LABEL_CREATE_BY: "fake_user"},
+            extra_scopes=self.EXTRA_SCOPES)
 
         #test use local image in the remote instance.
         local_image_metadata = dict(expected_metadata)
@@ -148,7 +152,8 @@
         self.cvd_compute_client.CreateInstance(
             self.INSTANCE, self.IMAGE, self.IMAGE_PROJECT, self.TARGET, self.BRANCH,
             self.BUILD_ID, self.KERNEL_BRANCH, self.KERNEL_BUILD_ID,
-            self.EXTRA_DATA_DISK_SIZE_GB, fake_avd_spec)
+            self.EXTRA_DATA_DISK_SIZE_GB, fake_avd_spec,
+            extra_scopes=self.EXTRA_SCOPES)
 
         expected_labels = {constants.LABEL_CREATE_BY: "fake_user"}
         mock_create.assert_called_with(
@@ -161,7 +166,8 @@
             machine_type=self.MACHINE_TYPE,
             network=self.NETWORK,
             zone=self.ZONE,
-            labels=expected_labels)
+            labels=expected_labels,
+            extra_scopes=self.EXTRA_SCOPES)
 
 
 if __name__ == "__main__":
diff --git a/internal/lib/gcompute_client.py b/internal/lib/gcompute_client.py
index f70a5ea..759fb65 100755
--- a/internal/lib/gcompute_client.py
+++ b/internal/lib/gcompute_client.py
@@ -1083,7 +1083,8 @@
                        image_project=None,
                        gpu=None,
                        extra_disk_name=None,
-                       labels=None):
+                       labels=None,
+                       extra_scopes=None):
         """Create a gce instance with a gce image.
 
         Args:
@@ -1104,11 +1105,18 @@
                  https://cloud.google.com/compute/docs/gpus/add-gpus
             extra_disk_name: String,the name of the extra disk to attach.
             labels: Dict, will be added to the instance's labels.
+            extra_scopes: A list of extra scopes to be provided to the instance.
         """
         disk_args = (disk_args
                      or self._GetDiskArgs(instance, image_name, image_project))
         if extra_disk_name:
             disk_args.extend(self._GetExtraDiskArgs(extra_disk_name, zone))
+
+        scopes = []
+        scopes.extend(self.DEFAULT_INSTANCE_SCOPE)
+        if extra_scopes:
+            scopes.extend(extra_scopes)
+
         body = {
             "machineType": self.GetMachineType(machine_type, zone)["selfLink"],
             "name": instance,
@@ -1116,10 +1124,11 @@
             "disks": disk_args,
             "serviceAccounts": [{
                 "email": "default",
-                "scopes": self.DEFAULT_INSTANCE_SCOPE
+                "scopes": scopes,
             }],
         }
 
+
         if labels is not None:
             body["labels"] = labels
         if gpu:
diff --git a/internal/lib/gcompute_client_test.py b/internal/lib/gcompute_client_test.py
index f9ed0c7..5176306 100644
--- a/internal/lib/gcompute_client_test.py
+++ b/internal/lib/gcompute_client_test.py
@@ -65,6 +65,7 @@
         "pxXR7I2YhynqovkEt/OXG4qWgvLEXGsWtSQs0CtCzqEVxz0Y9ECr7er4VdjSQxV"
         "AaeLAsQsK9ROae8hMBFZ3//8zLVapBwpuffCu+fUoql9qeV9xagZcc9zj8XOUOW"
         "ApiihqNL1111 test@test1.org")
+    EXTRA_SCOPES = ["scope1"]
 
     def setUp(self):
         """Set up test."""
@@ -72,6 +73,7 @@
         self.Patch(gcompute_client.ComputeClient, "InitResourceHandle")
         fake_cfg = mock.MagicMock()
         fake_cfg.project = PROJECT
+        fake_cfg.extra_scopes = self.EXTRA_SCOPES
         self.compute_client = gcompute_client.ComputeClient(
             fake_cfg, mock.MagicMock())
         self.compute_client._service = mock.MagicMock()
@@ -530,6 +532,9 @@
         extra_disk_name = "gce-x86-userdebug-2345-abcd-data"
         expected_disk_args = [self._disk_args]
         expected_disk_args.extend([{"fake_extra_arg": "fake_extra_value"}])
+        expected_scope = []
+        expected_scope.extend(self.compute_client.DEFAULT_INSTANCE_SCOPE)
+        expected_scope.extend(self.EXTRA_SCOPES)
 
         expected_body = {
             "machineType": self.MACHINE_TYPE_URL,
@@ -547,7 +552,7 @@
             "disks": expected_disk_args,
             "serviceAccounts": [
                 {"email": "default",
-                 "scopes": self.compute_client.DEFAULT_INSTANCE_SCOPE}
+                 "scopes": expected_scope}
             ],
             "metadata": {
                 "items": [{"key": self.METADATA[0],
@@ -562,7 +567,8 @@
             metadata={self.METADATA[0]: self.METADATA[1]},
             network=self.NETWORK,
             zone=self.ZONE,
-            extra_disk_name=extra_disk_name)
+            extra_disk_name=extra_disk_name,
+            extra_scopes=self.EXTRA_SCOPES)
 
         resource_mock.insert.assert_called_with(
             project=PROJECT, zone=self.ZONE, body=expected_body)
@@ -632,7 +638,8 @@
             metadata={self.METADATA[0]: self.METADATA[1]},
             network=self.NETWORK,
             zone=self.ZONE,
-            gpu=self.GPU)
+            gpu=self.GPU,
+            extra_scopes=None)
 
         resource_mock.insert.assert_called_with(
             project=PROJECT, zone=self.ZONE, body=expected_body)
diff --git a/internal/lib/goldfish_compute_client.py b/internal/lib/goldfish_compute_client.py
index be2209c..877eb3d 100644
--- a/internal/lib/goldfish_compute_client.py
+++ b/internal/lib/goldfish_compute_client.py
@@ -134,7 +134,8 @@
                        emulator_build_id=None,
                        blank_data_disk_size_gb=None,
                        gpu=None,
-                       avd_spec=None):
+                       avd_spec=None,
+                       extra_scopes=None):
         """Create a goldfish instance given a stable host image and a build id.
 
         Args:
@@ -151,6 +152,7 @@
             gpu: String, GPU that should be attached to the instance, or None of no
                  acceleration is needed. e.g. "nvidia-tesla-k80"
             avd_spec: An AVDSpec instance.
+            extra_scopes: A list of extra scopes to be passed to the instance.
         """
         self._CheckMachineSize()
 
@@ -221,4 +223,5 @@
             network=self._network,
             zone=self._zone,
             gpu=gpu,
-            labels=labels)
+            labels=labels,
+            extra_scopes=extra_scopes)
diff --git a/internal/lib/goldfish_compute_client_test.py b/internal/lib/goldfish_compute_client_test.py
index 33f16e7..fcdf085 100644
--- a/internal/lib/goldfish_compute_client_test.py
+++ b/internal/lib/goldfish_compute_client_test.py
@@ -44,6 +44,7 @@
     EXTRA_DATA_DISK_SIZE_GB = 4
     BOOT_DISK_SIZE_GB = 10
     GPU = "nvidia-tesla-k80"
+    EXTRA_SCOPES = "scope1"
 
     def _GetFakeConfig(self):
         """Create a fake configuration object.
@@ -60,6 +61,7 @@
             x=self.X_RES, y=self.Y_RES, dpi=self.DPI)
         fake_cfg.metadata_variable = self.METADATA
         fake_cfg.extra_data_disk_size_gb = self.EXTRA_DATA_DISK_SIZE_GB
+        fake_cfg.extra_scopes = self.EXTRA_SCOPES
         return fake_cfg
 
     def setUp(self):
@@ -112,7 +114,8 @@
         self.goldfish_compute_client.CreateInstance(
             self.INSTANCE, self.IMAGE, self.IMAGE_PROJECT, self.TARGET,
             self.BRANCH, self.BUILD_ID, self.EMULATOR_BRANCH,
-            self.EMULATOR_BUILD_ID, self.EXTRA_DATA_DISK_SIZE_GB, self.GPU)
+            self.EMULATOR_BUILD_ID, self.EXTRA_DATA_DISK_SIZE_GB, self.GPU,
+            extra_scopes=self.EXTRA_SCOPES)
 
         # pylint: disable=no-member
         gcompute_client.ComputeClient.CreateInstance.assert_called_with(
@@ -126,7 +129,8 @@
             network=self.NETWORK,
             zone=self.ZONE,
             gpu=self.GPU,
-            labels=expected_labels)
+            labels=expected_labels,
+            extra_scopes=self.EXTRA_SCOPES)
 
 
 if __name__ == "__main__":