Skip to content
This repository has been archived by the owner on May 21, 2024. It is now read-only.

dockerapp: avoid multiple current ostree installs #1665

Merged
merged 1 commit into from
May 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/libaktualizr/package_manager/dockerapp_bundles.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,19 @@ bool DockerAppBundles::fetchTarget(const Uptane::Target &target, Uptane::Fetcher
}

data::InstallationResult DockerAppBundles::install(const Uptane::Target &target) const {
auto res = OstreeManager::install(target);
data::InstallationResult res;
Uptane::Target current = OstreeManager::getCurrent();
if (current.sha256Hash() != target.sha256Hash()) {
res = OstreeManager::install(target);
if (res.result_code.num_code == data::ResultCode::Numeric::kInstallFailed) {
LOG_ERROR << "Failed to install OSTree target, skipping Docker Apps";
return res;
}
} else {
LOG_INFO << "Target " << target.sha256Hash() << " is same as current";
res = data::InstallationResult(data::ResultCode::Numeric::kOk, "OSTree hash already installed, same as current");
}

handleRemovedApps(target);
for (const auto &pair : iterate_apps(target)) {
LOG_INFO << "Installing " << pair.first << " -> " << pair.second;
Expand Down
14 changes: 13 additions & 1 deletion src/libaktualizr/package_manager/dockerapp_standalone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,19 @@ bool DockerAppStandalone::fetchTarget(const Uptane::Target &target, Uptane::Fetc
}

data::InstallationResult DockerAppStandalone::install(const Uptane::Target &target) const {
auto res = OstreeManager::install(target);
data::InstallationResult res;
Uptane::Target current = OstreeManager::getCurrent();
if (current.sha256Hash() != target.sha256Hash()) {
res = OstreeManager::install(target);
if (res.result_code.num_code == data::ResultCode::Numeric::kInstallFailed) {
LOG_ERROR << "Failed to install OSTree target, skipping Docker Apps";
return res;
}
} else {
LOG_INFO << "Target " << target.sha256Hash() << " is same as current";
res = data::InstallationResult(data::ResultCode::Numeric::kOk, "OSTree hash already installed, same as current");
}

handleRemovedApps(target);
auto cb = [this](const std::string &app, const Uptane::Target &app_target) {
LOG_INFO << "Installing " << app << " -> " << app_target;
Expand Down
27 changes: 27 additions & 0 deletions src/libaktualizr/package_manager/dockerappmanager_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,26 @@ static std::string treehub_server = "http://127.0.0.1:";
static boost::filesystem::path test_sysroot;
static boost::filesystem::path uptane_gen;

static struct {
int serial{0};
std::string rev;
} ostree_deployment;
static std::string new_rev;

extern "C" OstreeDeployment* ostree_sysroot_get_booted_deployment(OstreeSysroot* self) {
(void)self;
static GObjectUniquePtr<OstreeDeployment> dep;

dep.reset(ostree_deployment_new(0, "dummy-os", ostree_deployment.rev.c_str(), ostree_deployment.serial,
ostree_deployment.rev.c_str(), ostree_deployment.serial));
return dep.get();
}

extern "C" const char* ostree_deployment_get_csum(OstreeDeployment* self) {
(void)self;
return ostree_deployment.rev.c_str();
}

static void progress_cb(const Uptane::Target& target, const std::string& description, unsigned int progress) {
(void)description;
LOG_INFO << "progress_cb " << target << " " << progress;
Expand Down Expand Up @@ -87,6 +107,9 @@ TEST(DockerAppManager, DockerAppStandalone) {
auto repo = temp_dir.Path();
auto repod = create_repo(repo);

ostree_deployment.serial = 1;
ostree_deployment.rev = sha;

boost::filesystem::path apps_root = temp_dir / "docker_apps";

Config config;
Expand All @@ -109,6 +132,7 @@ TEST(DockerAppManager, DockerAppStandalone) {
boost::filesystem::create_directories(apps_root / "app2");

std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
storage->savePrimaryInstalledVersion(target, InstalledVersionUpdateMode::kCurrent);
KeyManager keys(storage, config.keymanagerConfig());
auto client = std_::make_unique<SotaUptaneClient>(config, storage);
ASSERT_NO_THROW(client->updateImageMeta());
Expand Down Expand Up @@ -154,6 +178,9 @@ TEST(DockerAppManager, DockerAppBundles) {
target_json["custom"]["docker_apps"]["app1"]["filename"] = "foo.dockerapp";
Uptane::Target target("pull", target_json);

ostree_deployment.serial = 1;
ostree_deployment.rev = sha;

TemporaryDirectory temp_dir;

// Insert a facke "docker" binary into our path
Expand Down