Commit 1af1bc07 authored by Yusuke Sato's avatar Yusuke Sato Committed by Commit Bot

arcvm: Start arcvm-adbd on starting ARCVM

This CL depends on the following CLs:
https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2380431
https://chromium-review.googlesource.com/c/chromiumos/overlays/chromiumos-overlay/+/2378806
https://chrome-internal-review.googlesource.com/c/chromeos/overlays/project-cheets-private/+/3238221

BUG=b:166314117
TEST=arc.Boot.vm still passes, arcvm-adbd runs

Change-Id: I385a807d84a98b4a97dcc66daf6bef5881eef2bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2380733
Commit-Queue: Yusuke Sato <yusukes@chromium.org>
Reviewed-by: default avatarHidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#803035}
parent 0c52f287
...@@ -65,6 +65,7 @@ constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles"; ...@@ -65,6 +65,7 @@ constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles";
constexpr const char kArcVmMountRemovableMediaJobName[] = constexpr const char kArcVmMountRemovableMediaJobName[] =
"arcvm_2dmount_2dremovable_2dmedia"; "arcvm_2dmount_2dremovable_2dmedia";
constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy"; constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy";
constexpr const char kArcVmAdbdJobName[] = "arcvm_2dadbd";
constexpr const char kArcVmPerBoardFeaturesJobName[] = constexpr const char kArcVmPerBoardFeaturesJobName[] =
"arcvm_2dper_2dboard_2dfeatures"; "arcvm_2dper_2dboard_2dfeatures";
constexpr const char kArcVmBootNotificationServerJobName[] = constexpr const char kArcVmBootNotificationServerJobName[] =
...@@ -83,6 +84,7 @@ constexpr base::TimeDelta kConnectSleepDurationInitial = ...@@ -83,6 +84,7 @@ constexpr base::TimeDelta kConnectSleepDurationInitial =
base::Optional<base::TimeDelta> g_connect_timeout_limit_for_testing; base::Optional<base::TimeDelta> g_connect_timeout_limit_for_testing;
base::Optional<base::TimeDelta> g_connect_sleep_duration_initial_for_testing; base::Optional<base::TimeDelta> g_connect_sleep_duration_initial_for_testing;
bool g_enable_adb_over_usb_for_testing = false;
chromeos::ConciergeClient* GetConciergeClient() { chromeos::ConciergeClient* GetConciergeClient() {
return chromeos::DBusThreadManager::Get()->GetConciergeClient(); return chromeos::DBusThreadManager::Get()->GetConciergeClient();
...@@ -447,6 +449,16 @@ void OnConfigureUpstartJobs(std::deque<JobDesc> jobs, ...@@ -447,6 +449,16 @@ void OnConfigureUpstartJobs(std::deque<JobDesc> jobs,
ConfigureUpstartJobs(std::move(jobs), std::move(callback)); ConfigureUpstartJobs(std::move(jobs), std::move(callback));
} }
// Returns true if the daemon for adb-over-usb should be started on the device.
bool ShouldStartAdbd(bool is_dev_mode,
bool is_host_on_vm,
bool has_adbd_json,
bool is_adb_over_usb_disabled) {
// Do the same check as ArcSetup::MaybeStartAdbdProxy().
return is_dev_mode && !is_host_on_vm && has_adbd_json &&
!is_adb_over_usb_disabled;
}
} // namespace } // namespace
class ArcVmClientAdapter : public ArcClientAdapter, class ArcVmClientAdapter : public ArcClientAdapter,
...@@ -590,6 +602,20 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -590,6 +602,20 @@ class ArcVmClientAdapter : public ArcClientAdapter,
void OnIsDevMode(chromeos::VoidDBusMethodCallback callback, void OnIsDevMode(chromeos::VoidDBusMethodCallback callback,
bool is_dev_mode) { bool is_dev_mode) {
is_dev_mode_ = is_dev_mode; is_dev_mode_ = is_dev_mode;
base::ThreadPool::PostTaskAndReplyWithResult(
FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
base::BindOnce([]() {
std::string output;
return base::GetAppOutput({"crossystem", "dev_enable_udc?0"},
&output);
}),
base::BindOnce(&ArcVmClientAdapter::OnIsAdbOverUsbDisabled,
weak_factory_.GetWeakPtr(), std::move(callback)));
}
void OnIsAdbOverUsbDisabled(chromeos::VoidDBusMethodCallback callback,
bool is_adb_over_usb_disabled) {
is_adb_over_usb_disabled_ = is_adb_over_usb_disabled;
std::deque<JobDesc> jobs{ std::deque<JobDesc> jobs{
// Note: the first Upstart job is a task, and the callback for the start // Note: the first Upstart job is a task, and the callback for the start
// request won't be called until the task finishes. When the callback is // request won't be called until the task finishes. When the callback is
...@@ -652,34 +678,6 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -652,34 +678,6 @@ class ArcVmClientAdapter : public ArcClientAdapter,
std::move(callback).Run(false); std::move(callback).Run(false);
return; return;
} }
std::vector<std::string> environment = {
"CHROMEOS_USER=" +
cryptohome::CreateAccountIdentifierFromIdentification(cryptohome_id_)
.account_id()};
std::deque<JobDesc> jobs{
JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_START, {}},
JobDesc{kArcCreateDataJobName, UpstartOperation::JOB_START,
std::move(environment)},
JobDesc{kArcVmMountMyFilesJobName, UpstartOperation::JOB_START, {}},
JobDesc{
kArcVmMountRemovableMediaJobName, UpstartOperation::JOB_START, {}},
};
ConfigureUpstartJobs(
std::move(jobs),
base::BindOnce(&ArcVmClientAdapter::OnConfigureUpstartJobsOnUpgradeArc,
weak_factory_.GetWeakPtr(), std::move(params),
std::move(callback)));
}
void OnConfigureUpstartJobsOnUpgradeArc(
UpgradeParams params,
chromeos::VoidDBusMethodCallback callback,
bool result) {
if (!result) {
LOG(ERROR) << "ConfigureUpstartJobs (on upgrading ARCVM) failed";
std::move(callback).Run(false);
return;
}
VLOG(2) << "Checking file system status"; VLOG(2) << "Checking file system status";
base::ThreadPool::PostTaskAndReplyWithResult( base::ThreadPool::PostTaskAndReplyWithResult(
FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
...@@ -707,6 +705,47 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -707,6 +705,47 @@ class ArcVmClientAdapter : public ArcClientAdapter,
return; return;
} }
std::vector<std::string> environment_for_create_data = {
"CHROMEOS_USER=" +
cryptohome::CreateAccountIdentifierFromIdentification(cryptohome_id_)
.account_id()};
std::deque<JobDesc> jobs{
JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_START, {}},
JobDesc{kArcCreateDataJobName, UpstartOperation::JOB_START,
std::move(environment_for_create_data)},
JobDesc{kArcVmMountMyFilesJobName, UpstartOperation::JOB_START, {}},
JobDesc{
kArcVmMountRemovableMediaJobName, UpstartOperation::JOB_START, {}},
};
if (ShouldStartAdbd(*is_dev_mode_, is_host_on_vm_,
file_system_status.has_adbd_json(),
*is_adb_over_usb_disabled_) ||
g_enable_adb_over_usb_for_testing) {
// Start the daemon for supporting adb-over-usb.
std::vector<std::string> environment_for_adbd = {"SERIALNUMBER=" +
serial_number_};
jobs.emplace_back(JobDesc{kArcVmAdbdJobName,
UpstartOperation::JOB_STOP_AND_START,
std::move(environment_for_adbd)});
}
ConfigureUpstartJobs(
std::move(jobs),
base::BindOnce(&ArcVmClientAdapter::OnConfigureUpstartJobsOnUpgradeArc,
weak_factory_.GetWeakPtr(), std::move(params),
std::move(file_system_status), std::move(callback)));
}
void OnConfigureUpstartJobsOnUpgradeArc(
UpgradeParams params,
FileSystemStatus file_system_status,
chromeos::VoidDBusMethodCallback callback,
bool result) {
if (!result) {
LOG(ERROR) << "ConfigureUpstartJobs (on upgrading ARCVM) failed";
std::move(callback).Run(false);
return;
}
const int32_t cpus = const int32_t cpus =
base::SysInfo::NumberOfProcessors() - start_params_.num_cores_disabled; base::SysInfo::NumberOfProcessors() - start_params_.num_cores_disabled;
DCHECK_LT(0, cpus); DCHECK_LT(0, cpus);
...@@ -787,6 +826,8 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -787,6 +826,8 @@ class ArcVmClientAdapter : public ArcClientAdapter,
base::Optional<bool> is_dev_mode_; base::Optional<bool> is_dev_mode_;
// True when the *host* is running on a VM. // True when the *host* is running on a VM.
const bool is_host_on_vm_; const bool is_host_on_vm_;
// True when adb-over-usb is disabled.
base::Optional<bool> is_adb_over_usb_disabled_;
// A cryptohome ID of the primary profile. // A cryptohome ID of the primary profile.
cryptohome::Identification cryptohome_id_; cryptohome::Identification cryptohome_id_;
...@@ -834,6 +875,10 @@ void SetArcVmBootNotificationServerAddressForTesting( ...@@ -834,6 +875,10 @@ void SetArcVmBootNotificationServerAddressForTesting(
g_connect_sleep_duration_initial_for_testing = connect_sleep_duration_initial; g_connect_sleep_duration_initial_for_testing = connect_sleep_duration_initial;
} }
void EnableAdbOverUsbForTesting() {
g_enable_adb_over_usb_for_testing = true;
}
std::vector<std::string> GenerateUpgradeProps( std::vector<std::string> GenerateUpgradeProps(
const UpgradeParams& upgrade_params, const UpgradeParams& upgrade_params,
const std::string& serial_number, const std::string& serial_number,
......
...@@ -38,6 +38,9 @@ void SetArcVmBootNotificationServerAddressForTesting( ...@@ -38,6 +38,9 @@ void SetArcVmBootNotificationServerAddressForTesting(
base::TimeDelta connect_timeout_limit, base::TimeDelta connect_timeout_limit,
base::TimeDelta connect_sleep_duration_initial); base::TimeDelta connect_sleep_duration_initial);
// Enable adb-over-usb and let the adapter start the support daemon for testing.
void EnableAdbOverUsbForTesting();
// Generates a list of props from |upgrade_params|, each of which takes the form // Generates a list of props from |upgrade_params|, each of which takes the form
// "prefix.prop_name=value" // "prefix.prop_name=value"
std::vector<std::string> GenerateUpgradeProps( std::vector<std::string> GenerateUpgradeProps(
......
...@@ -49,6 +49,7 @@ constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles"; ...@@ -49,6 +49,7 @@ constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles";
constexpr const char kArcVmMountRemovableMediaJobName[] = constexpr const char kArcVmMountRemovableMediaJobName[] =
"arcvm_2dmount_2dremovable_2dmedia"; "arcvm_2dmount_2dremovable_2dmedia";
constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy"; constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy";
constexpr const char kArcVmAdbdJobName[] = "arcvm_2dadbd";
constexpr const char kArcVmPerBoardFeaturesJobName[] = constexpr const char kArcVmPerBoardFeaturesJobName[] =
"arcvm_2dper_2dboard_2dfeatures"; "arcvm_2dper_2dboard_2dfeatures";
constexpr const char kArcVmBootNotificationServerJobName[] = constexpr const char kArcVmBootNotificationServerJobName[] =
...@@ -281,10 +282,10 @@ class ArcVmClientAdapterTest : public testing::Test, ...@@ -281,10 +282,10 @@ class ArcVmClientAdapterTest : public testing::Test,
SetArcVmBootNotificationServerAddressForTesting( SetArcVmBootNotificationServerAddressForTesting(
std::string(kArcVmBootNotificationServerAddress, std::string(kArcVmBootNotificationServerAddress,
sizeof(kArcVmBootNotificationServerAddress)), sizeof(kArcVmBootNotificationServerAddress)),
base::TimeDelta::FromMilliseconds(100) /* connect_timeout_limit */, // connect_timeout_limit
base::TimeDelta::FromMilliseconds( base::TimeDelta::FromMilliseconds(100),
20) /* connect_sleep_duration_initial */ // connect_sleep_duration_initial
); base::TimeDelta::FromMilliseconds(20));
} }
void TearDown() override { void TearDown() override {
...@@ -474,7 +475,6 @@ class ArcVmClientAdapterTest : public testing::Test, ...@@ -474,7 +475,6 @@ class ArcVmClientAdapterTest : public testing::Test,
} }
private: private:
void RewriteStatus(FileSystemStatus* status) { void RewriteStatus(FileSystemStatus* status) {
status->set_host_rootfs_writable_for_testing(host_rootfs_writable_); status->set_host_rootfs_writable_for_testing(host_rootfs_writable_);
status->set_system_image_ext_format_for_testing(system_image_ext_format_); status->set_system_image_ext_format_for_testing(system_image_ext_format_);
...@@ -747,6 +747,47 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmProxyFailure) { ...@@ -747,6 +747,47 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmProxyFailure) {
EXPECT_TRUE(arc_instance_stopped_called()); EXPECT_TRUE(arc_instance_stopped_called());
} }
// Tests that UpgradeArc() handles arcvm-adbd stop failures properly.
TEST_F(ArcVmClientAdapterTest, UpgradeArc_StopArcVmAdbdFailure) {
SetValidUserInfo();
StartMiniArc();
// Inject failure to FakeUpstartClient.
InjectUpstartStopJobFailure(kArcVmAdbdJobName);
// Upgrade should still succeed.
UpgradeArc(true);
EXPECT_TRUE(GetStartConciergeCalled());
EXPECT_TRUE(GetTestConciergeClient()->start_arc_vm_called());
EXPECT_FALSE(arc_instance_stopped_called());
}
// Tests that UpgradeArc() handles arcvm-adbd startup failures properly.
TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmAdbdFailure) {
SetValidUserInfo();
StartMiniArc();
// Inject failure to FakeUpstartClient.
InjectUpstartStartJobFailure(kArcVmAdbdJobName);
EnableAdbOverUsbForTesting();
UpgradeArc(false);
EXPECT_TRUE(GetStartConciergeCalled());
EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
EXPECT_FALSE(arc_instance_stopped_called());
// Try to stop the VM. StopVm will fail in this case because
// no VM is running.
vm_tools::concierge::StopVmResponse response;
response.set_success(false);
GetTestConciergeClient()->set_stop_vm_response(response);
adapter()->StopArcInstance(/*on_shutdown=*/false,
/*should_backup_log=*/false);
run_loop()->Run();
EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
EXPECT_TRUE(arc_instance_stopped_called());
}
// Tests that UpgradeArc() handles arc-create-data startup failures properly. // Tests that UpgradeArc() handles arc-create-data startup failures properly.
TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcCreateDataFailure) { TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcCreateDataFailure) {
SetValidUserInfo(); SetValidUserInfo();
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
namespace arc { namespace arc {
namespace { namespace {
constexpr const char kAdbdJson[] = "/etc/arc/adbd.json";
constexpr const char kArcVmConfigJsonPath[] = "/usr/share/arcvm/config.json"; constexpr const char kArcVmConfigJsonPath[] = "/usr/share/arcvm/config.json";
constexpr const char kBuiltinPath[] = "/opt/google/vms/android"; constexpr const char kBuiltinPath[] = "/opt/google/vms/android";
constexpr const char kFstabPath[] = "/run/arcvm/host_generated/fstab"; constexpr const char kFstabPath[] = "/run/arcvm/host_generated/fstab";
...@@ -42,7 +43,8 @@ FileSystemStatus::FileSystemStatus() ...@@ -42,7 +43,8 @@ FileSystemStatus::FileSystemStatus()
vendor_image_path_(base::FilePath(kBuiltinPath).Append(kVendorImage)), vendor_image_path_(base::FilePath(kBuiltinPath).Append(kVendorImage)),
guest_kernel_path_(base::FilePath(kBuiltinPath).Append(kKernel)), guest_kernel_path_(base::FilePath(kBuiltinPath).Append(kKernel)),
fstab_path_(kFstabPath), fstab_path_(kFstabPath),
is_system_image_ext_format_(IsSystemImageExtFormat(system_image_path_)) {} is_system_image_ext_format_(IsSystemImageExtFormat(system_image_path_)),
has_adbd_json_(base::PathExists(base::FilePath(kAdbdJson))) {}
// static // static
bool FileSystemStatus::IsAndroidDebuggable(const base::FilePath& json_path) { bool FileSystemStatus::IsAndroidDebuggable(const base::FilePath& json_path) {
......
...@@ -30,6 +30,7 @@ class FileSystemStatus { ...@@ -30,6 +30,7 @@ class FileSystemStatus {
bool is_system_image_ext_format() const { bool is_system_image_ext_format() const {
return is_system_image_ext_format_; return is_system_image_ext_format_;
} }
bool has_adbd_json() const { return has_adbd_json_; }
const base::FilePath& system_image_path() const { return system_image_path_; } const base::FilePath& system_image_path() const { return system_image_path_; }
const base::FilePath& vendor_image_path() const { return vendor_image_path_; } const base::FilePath& vendor_image_path() const { return vendor_image_path_; }
const base::FilePath& guest_kernel_path() const { return guest_kernel_path_; } const base::FilePath& guest_kernel_path() const { return guest_kernel_path_; }
...@@ -92,6 +93,7 @@ class FileSystemStatus { ...@@ -92,6 +93,7 @@ class FileSystemStatus {
base::FilePath guest_kernel_path_; base::FilePath guest_kernel_path_;
base::FilePath fstab_path_; base::FilePath fstab_path_;
bool is_system_image_ext_format_; bool is_system_image_ext_format_;
bool has_adbd_json_;
}; };
} // namespace arc } // namespace arc
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment