Simplify cheeps args passing into GCE metadata

Bug: 226315107
Test: atest --host
Test: acloud-dev create --avd-type cheeps
Change-Id: I3d89f844a67efc05b492c6f1296296fbfe25a6d4
diff --git a/create/avd_spec.py b/create/avd_spec.py
index 71d0ccc..9eff3fc 100644
--- a/create/avd_spec.py
+++ b/create/avd_spec.py
@@ -157,6 +157,8 @@
         self._stable_cheeps_host_image_project = None
         self._username = None
         self._password = None
+        self._cheeps_betty_image = None
+        self._cheeps_features = None
 
         # The maximum time in seconds used to wait for the AVD to boot.
         self._boot_timeout_secs = None
@@ -368,6 +370,9 @@
         self._stable_cheeps_host_image_project = args.stable_cheeps_host_image_project
         self._username = args.username
         self._password = args.password
+        self._cheeps_betty_image = (
+            args.cheeps_betty_image or self._cfg.betty_image)
+        self._cheeps_features = args.cheeps_features
 
         self._boot_timeout_secs = args.boot_timeout_secs
         self._ins_timeout_secs = args.ins_timeout_secs
@@ -602,11 +607,6 @@
                 self._remote_image[constants.BUILD_TARGET],
                 self._remote_image[constants.BUILD_BRANCH])
 
-        self._remote_image[constants.CHEEPS_BETTY_IMAGE] = (
-            args.cheeps_betty_image or self._cfg.betty_image)
-        self._remote_image[constants.CHEEPS_FEATURES] = ','.join(
-            args.cheeps_features)
-
         # Process system image, kernel image, bootloader, and otatools.
         self._system_build_info = {constants.BUILD_ID: args.system_build_id,
                                    constants.BUILD_BRANCH: args.system_branch,
@@ -952,6 +952,16 @@
         return self._password
 
     @property
+    def cheeps_betty_image(self):
+        """Return cheeps_betty_image."""
+        return self._cheeps_betty_image
+
+    @property
+    def cheeps_features(self):
+        """Return cheeps_features."""
+        return self._cheeps_features
+
+    @property
     def boot_timeout_secs(self):
         """Return boot_timeout_secs."""
         return self._boot_timeout_secs
diff --git a/create/avd_spec_test.py b/create/avd_spec_test.py
index ad41336..71d2405 100644
--- a/create/avd_spec_test.py
+++ b/create/avd_spec_test.py
@@ -49,6 +49,12 @@
         self.args.launch_args = None
         self.Patch(list_instances, "ChooseOneRemoteInstance", return_value=mock.MagicMock())
         self.Patch(list_instances, "GetInstancesFromInstanceNames", return_value=mock.MagicMock())
+
+        # Setup mock Acloud config for usage in tests.
+        self.mock_config = mock.MagicMock()
+        self.mock_config.launch_args = None
+        self.Patch(config, 'GetAcloudConfig', return_value=self.mock_config)
+
         self.AvdSpec = avd_spec.AVDSpec(self.args)
 
     # pylint: disable=protected-access
@@ -411,32 +417,6 @@
         self.AvdSpec._ProcessRemoteBuildArgs(self.args)
         self.assertTrue(self.AvdSpec.avd_type == "cuttlefish")
 
-        # Setup acloud config with betty_image spec
-        cfg = mock.MagicMock()
-        cfg.betty_image = 'foobarbaz'
-        cfg.launch_args = None
-        self.Patch(config, 'GetAcloudConfig', return_value=cfg)
-        self.AvdSpec = avd_spec.AVDSpec(self.args)
-        # --betty-image from cmdline should override config
-        self.args.cheeps_betty_image = 'abcdefg'
-        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
-        self.assertEqual(
-            self.AvdSpec.remote_image[constants.CHEEPS_BETTY_IMAGE],
-            self.args.cheeps_betty_image)
-        # acloud config value is used otherwise
-        self.args.cheeps_betty_image = None
-        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
-        self.assertEqual(
-            self.AvdSpec.remote_image[constants.CHEEPS_BETTY_IMAGE],
-            cfg.betty_image)
-
-        # Verify cheeps_features is assigned from args.
-        self.args.cheeps_features = ['a', 'b', 'c']
-        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
-        self.assertEqual(
-            self.AvdSpec.remote_image[constants.CHEEPS_FEATURES],
-            'a,b,c')
-
     def testEscapeAnsi(self):
         """Test EscapeAnsi."""
         test_string = "\033[1;32;40m Manifest branch:"
@@ -536,6 +516,22 @@
         self.AvdSpec._ProcessMiscArgs(self.args)
         self.assertEqual(self.AvdSpec.stable_host_image_name, "fake_host_image")
 
+        # Setup acloud config with betty_image spec
+        self.mock_config.betty_image = 'from-config'
+        # --betty-image from cmdline should override config
+        self.args.cheeps_betty_image = 'from-cmdline'
+        self.AvdSpec._ProcessMiscArgs(self.args)
+        self.assertEqual(self.AvdSpec.cheeps_betty_image, 'from-cmdline')
+        # acloud config value is used otherwise
+        self.args.cheeps_betty_image = None
+        self.AvdSpec._ProcessMiscArgs(self.args)
+        self.assertEqual(self.AvdSpec.cheeps_betty_image, 'from-config')
+
+        # Verify cheeps_features is assigned from args.
+        self.args.cheeps_features = ['a', 'b', 'c']
+        self.AvdSpec._ProcessMiscArgs(self.args)
+        self.assertEqual(self.args.cheeps_features, ['a', 'b', 'c'])
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/internal/constants.py b/internal/constants.py
index ae81865..c0a8732 100755
--- a/internal/constants.py
+++ b/internal/constants.py
@@ -209,10 +209,6 @@
 # Remote Log
 REMOTE_LOG_FOLDER = "cuttlefish_runtime"
 
-# Cheeps specific stuff.
-CHEEPS_BETTY_IMAGE = "betty_image"
-CHEEPS_FEATURES = "cheeps_features"
-
 # Key name in report
 ERROR_LOG_FOLDER = "error_log_folder"
 
diff --git a/internal/lib/cheeps_compute_client.py b/internal/lib/cheeps_compute_client.py
index c1d9c4b..f6f4aa4 100644
--- a/internal/lib/cheeps_compute_client.py
+++ b/internal/lib/cheeps_compute_client.py
@@ -90,8 +90,8 @@
 
             metadata["android_build_id"] = avd_spec.remote_image[constants.BUILD_ID]
             metadata["android_build_target"] = avd_spec.remote_image[constants.BUILD_TARGET]
-            metadata["betty_image"] = avd_spec.remote_image[constants.CHEEPS_BETTY_IMAGE]
-            metadata["cheeps_features"] = avd_spec.remote_image[constants.CHEEPS_FEATURES]
+            metadata["betty_image"] = avd_spec.cheeps_betty_image
+            metadata["cheeps_features"] = ','.join(avd_spec.cheeps_features)
 
         gcompute_client.ComputeClient.CreateInstance(
             self,
diff --git a/internal/lib/cheeps_compute_client_test.py b/internal/lib/cheeps_compute_client_test.py
index 4c66695..8e51592 100644
--- a/internal/lib/cheeps_compute_client_test.py
+++ b/internal/lib/cheeps_compute_client_test.py
@@ -45,7 +45,7 @@
     USER = "test_user"
     PASSWORD = "test_password"
     CHEEPS_BETTY_IMAGE = 'abcasdf'
-    CHEEPS_FEATURES = 'a,b,c'
+    CHEEPS_FEATURES = ['a', 'b', 'c']
 
     def _GetFakeConfig(self):
         """Create a fake configuration object.
@@ -89,7 +89,7 @@
             'android_build_target': self.ANDROID_BUILD_TARGET,
             'avd_type': "cheeps",
             'betty_image': self.CHEEPS_BETTY_IMAGE,
-            'cheeps_features': self.CHEEPS_FEATURES,
+            'cheeps_features': ','.join(self.CHEEPS_FEATURES),
             'cvd_01_dpi': str(self.DPI),
             'cvd_01_x_res': str(self.X_RES),
             'cvd_01_y_res': str(self.Y_RES),
@@ -111,9 +111,9 @@
         avd_spec.remote_image = {
             constants.BUILD_ID: self.ANDROID_BUILD_ID,
             constants.BUILD_TARGET: self.ANDROID_BUILD_TARGET,
-            constants.CHEEPS_BETTY_IMAGE: self.CHEEPS_BETTY_IMAGE,
-            constants.CHEEPS_FEATURES: self.CHEEPS_FEATURES,
         }
+        avd_spec.cheeps_betty_image = self.CHEEPS_BETTY_IMAGE
+        avd_spec.cheeps_features = self.CHEEPS_FEATURES
 
         self.cheeps_compute_client.CreateInstance(
             self.INSTANCE,
@@ -139,7 +139,7 @@
             'android_build_target': self.ANDROID_BUILD_TARGET,
             'avd_type': "cheeps",
             'betty_image': None,
-            'cheeps_features': None,
+            'cheeps_features': "",
             'cvd_01_dpi': str(self.DPI),
             'cvd_01_x_res': str(self.X_RES),
             'cvd_01_y_res': str(self.Y_RES),
@@ -160,9 +160,9 @@
         avd_spec.remote_image = {
             constants.BUILD_ID: self.ANDROID_BUILD_ID,
             constants.BUILD_TARGET: self.ANDROID_BUILD_TARGET,
-            constants.CHEEPS_BETTY_IMAGE: None,
-            constants.CHEEPS_FEATURES: None,
         }
+        avd_spec.cheeps_betty_image = None
+        avd_spec.cheeps_features = []
 
         self.cheeps_compute_client.CreateInstance(
             self.INSTANCE,