Display stderr and stdout of stop_cvd on console
Bug: 176131784
Test: acloud-dev delete --instance-names local-instance-1
Change-Id: If0a55aea1832da225b8bdf39ab61eb0fd2a8b004
diff --git a/list/instance.py b/list/instance.py
index c589a08..6c7ed7f 100644
--- a/list/instance.py
+++ b/list/instance.py
@@ -386,7 +386,7 @@
if adb_device.IsAdbConnected():
device_information = adb_device.device_information
- super(LocalInstance, self).__init__(
+ super().__init__(
name=name, fullname=fullname, display=display, ip="0.0.0.0",
status=constants.INS_STATUS_RUNNING,
adb_port=self._cf_runtime_cfg.adb_port,
@@ -398,7 +398,7 @@
def Summary(self):
"""Return the string that this class is holding."""
instance_home = "%s instance home: %s" % (_INDENT, self._instance_dir)
- return "%s\n%s" % (super(LocalInstance, self).Summary(), instance_home)
+ return "%s\n%s" % (super().Summary(), instance_home)
def CvdStatus(self):
"""check if local instance is active.
@@ -463,20 +463,19 @@
stop_cvd_cmd = os.path.join(self.cf_runtime_cfg.cvd_tools_path,
constants.CMD_STOP_CVD)
logger.debug("Running cmd[%s] to delete local cvd", stop_cvd_cmd)
- with open(os.devnull, "w") as dev_null:
- cvd_env = os.environ.copy()
- if self.instance_dir:
- cvd_env[constants.ENV_CUTTLEFISH_CONFIG_FILE] = self._cf_runtime_cfg.config_path
- cvd_env[constants.ENV_CVD_HOME] = GetLocalInstanceHomeDir(
- self._local_instance_id)
- cvd_env[constants.ENV_CUTTLEFISH_INSTANCE] = str(self._local_instance_id)
- else:
- logger.error("instance_dir is null!! instance[%d] might not be"
- " deleted", self._local_instance_id)
- subprocess.check_call(
- utils.AddUserGroupsToCmd(stop_cvd_cmd,
- constants.LIST_CF_USER_GROUPS),
- stderr=dev_null, stdout=dev_null, shell=True, env=cvd_env)
+ cvd_env = os.environ.copy()
+ if self.instance_dir:
+ cvd_env[constants.ENV_CUTTLEFISH_CONFIG_FILE] = self._cf_runtime_cfg.config_path
+ cvd_env[constants.ENV_CVD_HOME] = GetLocalInstanceHomeDir(
+ self._local_instance_id)
+ cvd_env[constants.ENV_CUTTLEFISH_INSTANCE] = str(self._local_instance_id)
+ else:
+ logger.error("instance_dir is null!! instance[%d] might not be"
+ " deleted", self._local_instance_id)
+ subprocess.check_call(
+ utils.AddUserGroupsToCmd(stop_cvd_cmd,
+ constants.LIST_CF_USER_GROUPS),
+ stderr=subprocess.STDOUT, shell=True, env=cvd_env)
adb_cmd = AdbTools(self.adb_port)
# When relaunch a local instance, we need to pass in retry=True to make
@@ -561,7 +560,7 @@
device_information = (self._adb.device_information if
self._adb.device_information else None)
- super(LocalGoldfishInstance, self).__init__(
+ super().__init__(
name=name, fullname=fullname, display=display, ip="127.0.0.1",
status=None, adb_port=adb_port, avd_type=constants.TYPE_GF,
createtime=create_time, elapsed_time=elapsed_time,
@@ -732,7 +731,7 @@
"instance_name": name,
"elapsed_time": elapsed_time})
- super(RemoteInstance, self).__init__(
+ super().__init__(
name=name, fullname=fullname, display=display, ip=ip, status=status,
adb_port=adb_port, vnc_port=vnc_port,
ssh_tunnel_is_connected=ssh_tunnel_is_connected,
diff --git a/list/instance_test.py b/list/instance_test.py
index 36f5ea6..4bc1418 100644
--- a/list/instance_test.py
+++ b/list/instance_test.py
@@ -29,6 +29,7 @@
from acloud.internal import constants
from acloud.internal.lib import cvd_runtime_config
from acloud.internal.lib import driver_test_lib
+from acloud.internal.lib import utils
from acloud.internal.lib.adb_tools import AdbTools
from acloud.list import instance
@@ -41,8 +42,6 @@
"-o UserKnownHostsFile=/dev/null "
"-o StrictHostKeyChecking=no -L 54321:127.0.0.1:6520 "
"-L 12345:127.0.0.1:6444 -N -f -l user 1.1.1.1")
- PS_LAUNCH_CVD = b("Sat Nov 10 21:55:10 2018 /fake_path/bin/run_cvd ")
- PS_RUNTIME_CF_CONFIG = {"x_res": "1080", "y_res": "1920", "dpi": "480"}
GCE_INSTANCE = {
constants.INS_KEY_NAME: "fake_ins_name",
constants.INS_KEY_CREATETIME: "fake_create_time",
@@ -58,11 +57,10 @@
"value":"fake_flavor"}]}
}
- # pylint: disable=protected-access
- def testCreateLocalInstance(self):
- """"Test get local instance info from launch_cvd process."""
- self.Patch(subprocess, "check_output", return_value=self.PS_LAUNCH_CVD)
- cf_config = mock.MagicMock(
+ @staticmethod
+ def _MockCvdRuntimeConfig():
+ """Create a mock CvdRuntimeConfig."""
+ return mock.MagicMock(
instance_id=2,
x_res=1080,
y_res=1920,
@@ -71,10 +69,19 @@
adb_port=6521,
vnc_port=6445,
adb_ip_port="127.0.0.1:6521",
+ cvd_tools_path="fake_cvd_tools_path",
+ config_path="fake_config_path",
)
+
+ @mock.patch("acloud.list.instance.AdbTools")
+ def testCreateLocalInstance(self, mock_adb_tools):
+ """Test getting local instance info from cvd runtime config."""
+ mock_adb_tools_object = mock.Mock(device_information={})
+ mock_adb_tools_object.IsAdbConnected.return_value = True
+ mock_adb_tools.return_value = mock_adb_tools_object
self.Patch(cvd_runtime_config, "CvdRuntimeConfig",
- return_value=cf_config)
- local_instance = instance.LocalInstance(cf_config)
+ return_value=self._MockCvdRuntimeConfig())
+ local_instance = instance.LocalInstance("fake_config_path")
self.assertEqual("local-instance-2", local_instance.name)
self.assertEqual(True, local_instance.islocal)
@@ -87,6 +94,32 @@
self.assertEqual(6521, local_instance.adb_port)
self.assertEqual(6445, local_instance.vnc_port)
+ @mock.patch("acloud.list.instance.AdbTools")
+ def testDeleteLocalInstance(self, mock_adb_tools):
+ """Test executing stop_cvd command."""
+ self.Patch(cvd_runtime_config, "CvdRuntimeConfig",
+ return_value=self._MockCvdRuntimeConfig())
+ mock_adb_tools_object = mock.Mock(device_information={})
+ mock_adb_tools_object.IsAdbConnected.return_value = True
+ mock_adb_tools.return_value = mock_adb_tools_object
+ self.Patch(utils, "AddUserGroupsToCmd",
+ side_effect=lambda cmd, groups: cmd)
+ mock_check_call = self.Patch(subprocess, "check_call")
+
+ local_instance = instance.LocalInstance("fake_config_path")
+ with mock.patch.dict("acloud.list.instance.os.environ", clear=True):
+ local_instance.Delete()
+
+ expected_env = {
+ 'CUTTLEFISH_INSTANCE': '2',
+ 'HOME': '/tmp/acloud_cvd_temp/local-instance-2',
+ 'CUTTLEFISH_CONFIG_FILE': 'fake_config_path',
+ }
+ mock_check_call.assert_called_with(
+ 'fake_cvd_tools_path/stop_cvd', stderr=subprocess.STDOUT,
+ shell=True, env=expected_env)
+ mock_adb_tools_object.DisconnectAdb.assert_called()
+
@mock.patch("acloud.list.instance.tempfile")
@mock.patch("acloud.list.instance.AdbTools")
def testCreateLocalGoldfishInstance(self, mock_adb_tools, mock_tempfile):
@@ -133,6 +166,7 @@
num = instance.LocalGoldfishInstance.GetMaxNumberOfInstances()
self.assertEqual(num, 6)
+ # pylint: disable=protected-access
def testGetElapsedTime(self):
"""Test _GetElapsedTime"""
# Instance time can't parse