def Delete(self): """Execute stop_cvd to stop local cuttlefish instance. - We should get the same host tool used to launch cvd to delete instance , So get stop_cvd bin from the cvd runtime config. - Add CUTTLEFISH_CONFIG_FILE env variable to tell stop_cvd which cvd need to be deleted. - Stop adb since local instance use the fixed adb port and could be reused again soon. """ 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) adb_cmd = AdbTools(self.adb_port) # When relaunch a local instance, we need to pass in retry=True to make # sure adb device is completely gone since it will use the same adb port adb_cmd.DisconnectAdb(retry=True)
def ReconnectInstance(ssh_private_key_path, instance, reconnect_report, extra_args_ssh_tunnel=None, connect_vnc=True): """Reconnect to the specified instance. It will: - re-establish ssh tunnels for adb/vnc port forwarding - re-establish adb connection - restart vnc client - update device information in reconnect_report Args: ssh_private_key_path: Path to the private key file. e.g. ~/.ssh/acloud_rsa instance: list.Instance() object. reconnect_report: Report object. extra_args_ssh_tunnel: String, extra args for ssh tunnel connection. connect_vnc: Boolean, True will launch vnc. Raises: errors.UnknownAvdType: Unable to reconnect to instance of unknown avd type. """ if instance.avd_type not in utils.AVD_PORT_DICT: raise errors.UnknownAvdType("Unable to reconnect to instance (%s) of " "unknown avd type: %s" % (instance.name, instance.avd_type)) adb_cmd = AdbTools(instance.adb_port) vnc_port = instance.vnc_port adb_port = instance.adb_port # ssh tunnel is up but device is disconnected on adb if instance.ssh_tunnel_is_connected and not adb_cmd.IsAdbConnectionAlive(): adb_cmd.DisconnectAdb() adb_cmd.ConnectAdb() # ssh tunnel is down and it's a remote instance elif not instance.ssh_tunnel_is_connected and not instance.islocal: adb_cmd.DisconnectAdb() forwarded_ports = utils.AutoConnect( ip_addr=instance.ip, rsa_key_file=ssh_private_key_path, target_vnc_port=utils.AVD_PORT_DICT[instance.avd_type].vnc_port, target_adb_port=utils.AVD_PORT_DICT[instance.avd_type].adb_port, ssh_user=constants.GCE_USER, extra_args_ssh_tunnel=extra_args_ssh_tunnel) vnc_port = forwarded_ports.vnc_port adb_port = forwarded_ports.adb_port if _IsWebrtcEnable(instance, constants.GCE_USER, ssh_private_key_path, extra_args_ssh_tunnel): if instance.islocal: if _WebrtcPortOccupied(): raise errors.PortOccupied( "\nReconnect to a local webrtc instance " "is not work because remote webrtc " "instance has established ssh tunnel " "which occupied local webrtc instance " "port. If you want to connect to a " "local-instance of webrtc. please run " "'acloud create --local-instance " "--autoconnect webrtc' directly.") else: utils.EstablishWebRTCSshTunnel( ip_addr=instance.ip, rsa_key_file=ssh_private_key_path, ssh_user=constants.GCE_USER, extra_args_ssh_tunnel=extra_args_ssh_tunnel) utils.LaunchBrowser(constants.WEBRTC_LOCAL_HOST, constants.WEBRTC_LOCAL_PORT) elif (vnc_port and connect_vnc): StartVnc(vnc_port, instance.display) device_dict = { constants.IP: instance.ip, constants.INSTANCE_NAME: instance.name, constants.VNC_PORT: vnc_port, constants.ADB_PORT: adb_port } if vnc_port and adb_port: reconnect_report.AddData(key="devices", value=device_dict) else: # We use 'ps aux' to grep adb/vnc fowarding port from ssh tunnel # command. Therefore we report failure here if no vnc_port and # adb_port found. reconnect_report.AddData(key="device_failing_reconnect", value=device_dict) reconnect_report.AddError(instance.name)