Commit a980e70b authored by Youkichi Hosoi's avatar Youkichi Hosoi Committed by Commit Bot

arcvm: Start/stop upstart jobs to share media files with ARCVM

This CL lets ArcVmClientAdapter start and stop new upstart jobs
arcvm-mount-myfiles and arcvm-mount-removable-media. They mount the
media directories (/media/removable and /home/chronos/user/MyFiles)
under /run/arcvm/media when a user signs in.
The directory /run/arcvm/media is supposed to have been exported to
ARCVM, and these jobs will make the media directories visible for ARCVM.

BUG=b:123377807
BUG=b:123641356
TEST=$ components_unittests --gtest_filter="ArcVmClientAdapterTest.*"
TEST=Start ARCVM from various states (using e.g. `pkill crosvm`,
TEST=`adb reboot`), then check the log /var/log/chrome/chrome and the
TEST=directory /run/arcvm/media. Confirm that the jobs always start
TEST=without errors, and the media directories are successfully mounted.

Change-Id: Ife673620b41f9b4e4cf72df29ce3ab59d4bbac7d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2266053
Commit-Queue: Youkichi Hosoi <youkichihosoi@chromium.org>
Reviewed-by: default avatarYusuke Sato <yusukes@chromium.org>
Reviewed-by: default avatarSatoshi Niwa <niwa@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799681}
parent 09b4a197
...@@ -61,6 +61,9 @@ namespace { ...@@ -61,6 +61,9 @@ namespace {
constexpr const char kArcCreateDataJobName[] = "arc_2dcreate_2ddata"; constexpr const char kArcCreateDataJobName[] = "arc_2dcreate_2ddata";
constexpr const char kArcKeymasterJobName[] = "arc_2dkeymasterd"; constexpr const char kArcKeymasterJobName[] = "arc_2dkeymasterd";
constexpr const char kArcSensorServiceJobName[] = "arc_2dsensor_2dservice"; constexpr const char kArcSensorServiceJobName[] = "arc_2dsensor_2dservice";
constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles";
constexpr const char kArcVmMountRemovableMediaJobName[] =
"arcvm_2dmount_2dremovable_2dmedia";
constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy"; constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy";
constexpr const char kArcVmPerBoardFeaturesJobName[] = constexpr const char kArcVmPerBoardFeaturesJobName[] =
"arcvm_2dper_2dboard_2dfeatures"; "arcvm_2dper_2dboard_2dfeatures";
...@@ -578,6 +581,9 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -578,6 +581,9 @@ class ArcVmClientAdapter : public ArcClientAdapter,
JobDesc{kArcVmPerBoardFeaturesJobName, UpstartOperation::JOB_START, {}}, JobDesc{kArcVmPerBoardFeaturesJobName, UpstartOperation::JOB_START, {}},
JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_STOP, {}}, JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_STOP, {}},
JobDesc{kArcVmMountMyFilesJobName, UpstartOperation::JOB_STOP, {}},
JobDesc{
kArcVmMountRemovableMediaJobName, UpstartOperation::JOB_STOP, {}},
JobDesc{kArcKeymasterJobName, UpstartOperation::JOB_STOP, {}}, JobDesc{kArcKeymasterJobName, UpstartOperation::JOB_STOP, {}},
JobDesc{kArcKeymasterJobName, UpstartOperation::JOB_START, {}}, JobDesc{kArcKeymasterJobName, UpstartOperation::JOB_START, {}},
JobDesc{kArcSensorServiceJobName, UpstartOperation::JOB_STOP, {}}, JobDesc{kArcSensorServiceJobName, UpstartOperation::JOB_STOP, {}},
...@@ -592,15 +598,15 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -592,15 +598,15 @@ class ArcVmClientAdapter : public ArcClientAdapter,
ConfigureUpstartJobs( ConfigureUpstartJobs(
std::move(jobs), std::move(jobs),
base::BindOnce( base::BindOnce(
&ArcVmClientAdapter::OnArcVmBootNotificationServerStarted, &ArcVmClientAdapter::OnConfigureUpstartJobsOnStartMiniArc,
weak_factory_.GetWeakPtr(), std::move(callback))); weak_factory_.GetWeakPtr(), std::move(callback)));
} }
void OnArcVmBootNotificationServerStarted( void OnConfigureUpstartJobsOnStartMiniArc(
chromeos::VoidDBusMethodCallback callback, chromeos::VoidDBusMethodCallback callback,
bool result) { bool result) {
if (!result) { if (!result) {
LOG(ERROR) << "ConfigureUpstartJobs failed"; LOG(ERROR) << "ConfigureUpstartJobs (on starting mini ARCVM) failed";
std::move(callback).Run(false); std::move(callback).Run(false);
return; return;
} }
...@@ -641,17 +647,21 @@ class ArcVmClientAdapter : public ArcClientAdapter, ...@@ -641,17 +647,21 @@ class ArcVmClientAdapter : public ArcClientAdapter,
JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_START, {}}, JobDesc{kArcVmServerProxyJobName, UpstartOperation::JOB_START, {}},
JobDesc{kArcCreateDataJobName, UpstartOperation::JOB_START, JobDesc{kArcCreateDataJobName, UpstartOperation::JOB_START,
std::move(environment)}, std::move(environment)},
JobDesc{kArcVmMountMyFilesJobName, UpstartOperation::JOB_START, {}},
JobDesc{
kArcVmMountRemovableMediaJobName, UpstartOperation::JOB_START, {}},
}; };
ConfigureUpstartJobs( ConfigureUpstartJobs(
std::move(jobs), std::move(jobs),
base::BindOnce(&ArcVmClientAdapter::OnArcCreateDataJobStarted, base::BindOnce(&ArcVmClientAdapter::OnConfigureUpstartJobsOnUpgradeArc,
weak_factory_.GetWeakPtr(), std::move(params), weak_factory_.GetWeakPtr(), std::move(params),
std::move(callback))); std::move(callback)));
} }
void OnArcCreateDataJobStarted(UpgradeParams params, void OnConfigureUpstartJobsOnUpgradeArc(
chromeos::VoidDBusMethodCallback callback, UpgradeParams params,
bool result) { chromeos::VoidDBusMethodCallback callback,
bool result) {
if (!result) { if (!result) {
LOG(ERROR) << "ConfigureUpstartJobs (on upgrading ARCVM) failed"; LOG(ERROR) << "ConfigureUpstartJobs (on upgrading ARCVM) failed";
std::move(callback).Run(false); std::move(callback).Run(false);
......
...@@ -44,6 +44,9 @@ namespace { ...@@ -44,6 +44,9 @@ namespace {
constexpr const char kArcCreateDataJobName[] = "arc_2dcreate_2ddata"; constexpr const char kArcCreateDataJobName[] = "arc_2dcreate_2ddata";
constexpr const char kArcKeymasterJobName[] = "arc_2dkeymasterd"; constexpr const char kArcKeymasterJobName[] = "arc_2dkeymasterd";
constexpr const char kArcSensorServiceJobName[] = "arc_2dsensor_2dservice"; constexpr const char kArcSensorServiceJobName[] = "arc_2dsensor_2dservice";
constexpr const char kArcVmMountMyFilesJobName[] = "arcvm_2dmount_2dmyfiles";
constexpr const char kArcVmMountRemovableMediaJobName[] =
"arcvm_2dmount_2dremovable_2dmedia";
constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy"; constexpr const char kArcVmServerProxyJobName[] = "arcvm_2dserver_2dproxy";
constexpr const char kArcVmPerBoardFeaturesJobName[] = constexpr const char kArcVmPerBoardFeaturesJobName[] =
"arcvm_2dper_2dboard_2dfeatures"; "arcvm_2dper_2dboard_2dfeatures";
...@@ -545,6 +548,29 @@ TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopArcSensorServiceJobFail) { ...@@ -545,6 +548,29 @@ TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopArcSensorServiceJobFail) {
EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called()); EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
} }
// Tests that StartMiniArc() still succeeds even when Upstart fails to stop
// arcvm-mount-myfiles.
TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopArcVmMountMyFilesJobFail) {
// Inject failure to FakeUpstartClient.
InjectUpstartStopJobFailure(kArcVmMountMyFilesJobName);
StartMiniArc();
// Confirm that no VM is started. ARCVM doesn't support mini ARC yet.
EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
}
// Tests that StartMiniArc() still succeeds even when Upstart fails to stop
// arcvm-mount-removable-media.
TEST_F(ArcVmClientAdapterTest,
StartMiniArc_StopArcVmMountRemovableMediaJobFail) {
// Inject failure to FakeUpstartClient.
InjectUpstartStopJobFailure(kArcVmMountRemovableMediaJobName);
StartMiniArc();
// Confirm that no VM is started. ARCVM doesn't support mini ARC yet.
EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
}
// Tests that StartMiniArc() fails when Upstart fails to start the job. // Tests that StartMiniArc() fails when Upstart fails to start the job.
TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmPerBoardFeaturesJobFail) { TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmPerBoardFeaturesJobFail) {
// Inject failure to FakeUpstartClient. // Inject failure to FakeUpstartClient.
...@@ -703,6 +729,59 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcCreateDataFailure) { ...@@ -703,6 +729,59 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcCreateDataFailure) {
EXPECT_TRUE(arc_instance_stopped_called()); EXPECT_TRUE(arc_instance_stopped_called());
} }
// Tests that UpgradeArc() handles arcvm-mount-myfiles startup failures
// properly.
TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmMountMyFilesJobFail) {
SetValidUserInfo();
StartMiniArc();
// Inject failure to FakeUpstartClient.
InjectUpstartStartJobFailure(kArcVmMountMyFilesJobName);
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 arcvm-mount-removable-media startup failures
// properly.
TEST_F(ArcVmClientAdapterTest,
UpgradeArc_StartArcVmMountRemovableMediaJobFail) {
SetValidUserInfo();
StartMiniArc();
// Inject failure to FakeUpstartClient.
InjectUpstartStartJobFailure(kArcVmMountRemovableMediaJobName);
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 StartConcierge() failures properly. // Tests that UpgradeArc() handles StartConcierge() failures properly.
TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartConciergeFailure) { TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartConciergeFailure) {
SetValidUserInfo(); SetValidUserInfo();
......
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