Commit d9157456 authored by Olya Kalitova's avatar Olya Kalitova Committed by Commit Bot

Add playbook application step to Crostini startup

Adds Ansible playbook application step to default Crostini container
startup if Ansible is successfully installed to default Crostini container.

Test: unit_tests --gtest_filter="Crostini*"
Bug: 998124
Change-Id: Id892b5316e2971e4a81ab6d155654c30202d4a6f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1847343Reviewed-by: default avatarNic Hollingum <hollingum@google.com>
Reviewed-by: default avatarTimothy Loh <timloh@chromium.org>
Commit-Queue: Olya Kalitova <okalitova@chromium.org>
Cr-Commit-Position: refs/heads/master@{#704621}
parent d170943c
...@@ -1982,11 +1982,31 @@ void CrostiniManager::OnAnsibleInDefaultContainerInstalled(bool success) { ...@@ -1982,11 +1982,31 @@ void CrostiniManager::OnAnsibleInDefaultContainerInstalled(bool success) {
RemoveLinuxPackageOperationProgressObserver( RemoveLinuxPackageOperationProgressObserver(
AnsibleManagementService::GetForProfile(profile_)); AnsibleManagementService::GetForProfile(profile_));
if (!success) {
LOG(ERROR) << "Failed to install Ansible in default Crostini container";
// TODO(https://crbug.com/998124): Add a proper error.
InvokeAndErasePendingContainerCallbacks(
&start_container_callbacks_, kCrostiniDefaultVmName,
kCrostiniDefaultContainerName, CrostiniResult::UNKNOWN_ERROR);
return;
}
// TODO(https://crbug.com/998124): Propagate playbook to be applied.
AnsibleManagementService::GetForProfile(profile_)
->ApplyAnsiblePlaybookToDefaultContainer(
/*playbook=*/"---",
base::BindOnce(
&CrostiniManager::OnAnsiblePlaybookToDefaultContainerApplied,
weak_ptr_factory_.GetWeakPtr()));
}
void CrostiniManager::OnAnsiblePlaybookToDefaultContainerApplied(bool success) {
CrostiniResult result = CrostiniResult::SUCCESS; CrostiniResult result = CrostiniResult::SUCCESS;
if (!success) { if (!success) {
LOG(ERROR) << "Failed to install Ansible to default Crostini container"; LOG(ERROR) << "Failed to apply Ansible playbook to default Crostini "
// TODO(okalitova): Add proper bug. << "container";
result = CrostiniResult::CONTAINER_START_FAILED; // TODO(https://crbug.com/998124): Add a proper error.
result = CrostiniResult::UNKNOWN_ERROR;
} }
InvokeAndErasePendingContainerCallbacks( InvokeAndErasePendingContainerCallbacks(
......
...@@ -700,6 +700,10 @@ class CrostiniManager : public KeyedService, ...@@ -700,6 +700,10 @@ class CrostiniManager : public KeyedService,
// CrostiniAnsibleManagementService::InstallAnsibleInDefaultContainer // CrostiniAnsibleManagementService::InstallAnsibleInDefaultContainer
void OnAnsibleInDefaultContainerInstalled(bool success); void OnAnsibleInDefaultContainerInstalled(bool success);
// Callback for
// CrostiniAnsibleManagementService::ApplyAnsiblePlaybookToDefaultContainer
void OnAnsiblePlaybookToDefaultContainerApplied(bool success);
// Helper for CrostiniManager::MaybeUpgradeCrostini. Makes blocking calls to // Helper for CrostiniManager::MaybeUpgradeCrostini. Makes blocking calls to
// check for file paths and registered components. // check for file paths and registered components.
static void CheckPathsAndComponents(); static void CheckPathsAndComponents();
......
...@@ -209,6 +209,17 @@ class CrostiniManagerTest : public testing::Test { ...@@ -209,6 +209,17 @@ class CrostiniManagerTest : public testing::Test {
fake_cicerone_client_->InstallLinuxPackageProgress(signal); fake_cicerone_client_->InstallLinuxPackageProgress(signal);
} }
void SendSucceededApplySignal() {
vm_tools::cicerone::ApplyAnsiblePlaybookProgressSignal signal;
signal.set_owner_id(CryptohomeIdForProfile(profile()));
signal.set_vm_name(kCrostiniDefaultVmName);
signal.set_container_name(kCrostiniDefaultContainerName);
signal.set_status(
vm_tools::cicerone::ApplyAnsiblePlaybookProgressSignal::SUCCEEDED);
fake_cicerone_client_->NotifyApplyAnsiblePlaybookProgress(signal);
}
base::RunLoop* run_loop() { return run_loop_.get(); } base::RunLoop* run_loop() { return run_loop_.get(); }
Profile* profile() { return profile_.get(); } Profile* profile() { return profile_.get(); }
CrostiniManager* crostini_manager() { return crostini_manager_; } CrostiniManager* crostini_manager() { return crostini_manager_; }
...@@ -1419,33 +1430,71 @@ TEST_F(CrostiniManagerTest, StartContainerSuccess) { ...@@ -1419,33 +1430,71 @@ TEST_F(CrostiniManagerTest, StartContainerSuccess) {
run_loop()->Run(); run_loop()->Run();
} }
TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfrastructureFailure) { TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfraInstallFailure) {
scoped_feature_list_.Reset(); scoped_feature_list_.Reset();
scoped_feature_list_.InitAndEnableFeature( scoped_feature_list_.InitAndEnableFeature(
features::kCrostiniAnsibleInfrastructure); features::kCrostiniAnsibleInfrastructure);
// Response for failed Ansible installation. // Response for failed Ansible installation.
vm_tools::cicerone::InstallLinuxPackageResponse response; vm_tools::cicerone::InstallLinuxPackageResponse install_response;
response.set_status(vm_tools::cicerone::InstallLinuxPackageResponse::FAILED); install_response.set_status(
fake_cicerone_client_->set_install_linux_package_response(response); vm_tools::cicerone::InstallLinuxPackageResponse::FAILED);
fake_cicerone_client_->set_install_linux_package_response(install_response);
crostini_manager()->StartLxdContainer( crostini_manager()->StartLxdContainer(
kCrostiniDefaultVmName, kCrostiniDefaultContainerName, kCrostiniDefaultVmName, kCrostiniDefaultContainerName,
base::BindOnce(&ExpectCrostiniResult, run_loop()->QuitClosure(), base::BindOnce(&ExpectCrostiniResult, run_loop()->QuitClosure(),
CrostiniResult::CONTAINER_START_FAILED)); CrostiniResult::UNKNOWN_ERROR));
run_loop()->Run(); run_loop()->Run();
} }
TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfrastructureSuccess) { TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfraApplicationFailure) {
scoped_feature_list_.Reset(); scoped_feature_list_.Reset();
scoped_feature_list_.InitAndEnableFeature( scoped_feature_list_.InitAndEnableFeature(
features::kCrostiniAnsibleInfrastructure); features::kCrostiniAnsibleInfrastructure);
// Response for successful Ansible installation. // Response for successful Ansible installation.
vm_tools::cicerone::InstallLinuxPackageResponse response; vm_tools::cicerone::InstallLinuxPackageResponse install_response;
response.set_status(vm_tools::cicerone::InstallLinuxPackageResponse::STARTED); install_response.set_status(
fake_cicerone_client_->set_install_linux_package_response(response); vm_tools::cicerone::InstallLinuxPackageResponse::STARTED);
fake_cicerone_client_->set_install_linux_package_response(install_response);
// Response for failed Ansible playbook application.
vm_tools::cicerone::ApplyAnsiblePlaybookResponse apply_response;
apply_response.set_status(
vm_tools::cicerone::ApplyAnsiblePlaybookResponse::FAILED);
fake_cicerone_client_->set_apply_ansible_playbook_response(apply_response);
crostini_manager()->StartLxdContainer(
kCrostiniDefaultVmName, kCrostiniDefaultContainerName,
base::BindOnce(&ExpectCrostiniResult, run_loop()->QuitClosure(),
CrostiniResult::UNKNOWN_ERROR));
base::RunLoop().RunUntilIdle();
// Finish successful Ansible installation.
SendSucceededInstallSignal();
run_loop()->Run();
}
TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfraSuccess) {
scoped_feature_list_.Reset();
scoped_feature_list_.InitAndEnableFeature(
features::kCrostiniAnsibleInfrastructure);
// Response for successful Ansible installation.
vm_tools::cicerone::InstallLinuxPackageResponse install_response;
install_response.set_status(
vm_tools::cicerone::InstallLinuxPackageResponse::STARTED);
fake_cicerone_client_->set_install_linux_package_response(install_response);
// Response for successful Ansible playbook application.
vm_tools::cicerone::ApplyAnsiblePlaybookResponse apply_response;
apply_response.set_status(
vm_tools::cicerone::ApplyAnsiblePlaybookResponse::STARTED);
fake_cicerone_client_->set_apply_ansible_playbook_response(apply_response);
crostini_manager()->StartLxdContainer( crostini_manager()->StartLxdContainer(
kCrostiniDefaultVmName, kCrostiniDefaultContainerName, kCrostiniDefaultVmName, kCrostiniDefaultContainerName,
...@@ -1457,6 +1506,9 @@ TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfrastructureSuccess) { ...@@ -1457,6 +1506,9 @@ TEST_F(CrostiniManagerTest, StartContainerWithAnsibleInfrastructureSuccess) {
// Finish successful Ansible installation. // Finish successful Ansible installation.
SendSucceededInstallSignal(); SendSucceededInstallSignal();
// Finish successful Ansible playbook application.
SendSucceededApplySignal();
run_loop()->Run(); run_loop()->Run();
} }
......
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