From 2d5613a2f0b22cbb96b9402e457d7f65a21f250d Mon Sep 17 00:00:00 2001 From: Mike Sul Date: Wed, 29 Nov 2023 12:31:04 +0100 Subject: [PATCH] apps: App fetch and install using CLI utility Add implementation of the app fetching and installation methods that make use of the `composectl` utility to perform their action. Signed-off-by: Mike Sul --- src/composeappmanager.cc | 2 +- src/ctr/appengine.cc | 9 ++++++++- src/ctr/appengine.h | 7 +++++-- src/docker/restorableappengine.h | 8 +++++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/composeappmanager.cc b/src/composeappmanager.cc index cba841f1..445dd56b 100644 --- a/src/composeappmanager.cc +++ b/src/composeappmanager.cc @@ -149,7 +149,7 @@ ComposeAppManager::ComposeAppManager(const PackageConfig& pconfig, const Bootloa app_engine_ = std::make_shared( cfg_.reset_apps_root, cfg_.apps_root, cfg_.images_data_root, registry_client, std::make_shared(), skopeo_cmd, docker_host, compose_cmd, composectl_cmd, - Docker::RestorableAppEngine::GetDefStorageSpaceFunc(cfg_.storage_watermark)); + cfg_.storage_watermark, Docker::RestorableAppEngine::GetDefStorageSpaceFunc(cfg_.storage_watermark)); #else app_engine_ = std::make_shared( cfg_.reset_apps_root, cfg_.apps_root, cfg_.images_data_root, registry_client, diff --git a/src/ctr/appengine.cc b/src/ctr/appengine.cc index b5ef0e07..8520f410 100644 --- a/src/ctr/appengine.cc +++ b/src/ctr/appengine.cc @@ -1,10 +1,17 @@ #include "appengine.h" +#include +#include + +#include "exec.h" namespace ctr { AppEngine::Result AppEngine::fetch(const App& app) { - // TODO + exec(boost::format{"%s --store %s pull %s --storage-usage-watermark %d"} % composectl_cmd_ % storeRoot() % app.uri % storage_watermark_, "failed to pull compose app"); return true; } + void AppEngine::installAppAndImages(const App& app) { + exec(boost::format{"%s --store %s install --compose-dir %s --docker-host %s %s"} % composectl_cmd_ % storeRoot() % installRoot() % dockerHost() % app.uri, "failed to installl compose app"); + } } // namespace ctr diff --git a/src/ctr/appengine.h b/src/ctr/appengine.h index cee4d532..6e21f120 100644 --- a/src/ctr/appengine.h +++ b/src/ctr/appengine.h @@ -12,18 +12,21 @@ class AppEngine : public Docker::RestorableAppEngine { boost::filesystem::path store_root, boost::filesystem::path install_root, boost::filesystem::path docker_root, Docker::RegistryClient::Ptr registry_client, Docker::DockerClient::Ptr docker_client, std::string client = "/sbin/skopeo", std::string docker_host = "unix:///var/run/docker.sock", - std::string compose_cmd = "/usr/bin/docker-compose", std::string composectl_cmd = "/usr/bin/composectl", + std::string compose_cmd = "/usr/bin/docker-compose", std::string composectl_cmd = "/usr/bin/composectl", int storage_watermark = 80, StorageSpaceFunc storage_space_func = RestorableAppEngine::GetDefStorageSpaceFunc(), ClientImageSrcFunc client_image_src_func = [](const Docker::Uri& /* app_uri */, const std::string& image_uri) { return "docker://" + image_uri; }, bool create_containers_if_install = true, bool offline = false): - Docker::RestorableAppEngine(store_root, install_root, docker_root, registry_client, docker_client, client, docker_host, compose_cmd, storage_space_func, client_image_src_func), composectl_cmd_{composectl_cmd} {} + Docker::RestorableAppEngine(store_root, install_root, docker_root, registry_client, docker_client, client, docker_host, compose_cmd, storage_space_func, client_image_src_func), composectl_cmd_{composectl_cmd}, storage_watermark_{storage_watermark} {} Result fetch(const App& app) override; + private: + void installAppAndImages(const App& app) override; private: const std::string composectl_cmd_; + const int storage_watermark_; }; } // namespace ctr diff --git a/src/docker/restorableappengine.h b/src/docker/restorableappengine.h index 3ff07bf0..4841e774 100644 --- a/src/docker/restorableappengine.h +++ b/src/docker/restorableappengine.h @@ -110,6 +110,13 @@ class RestorableAppEngine : public AppEngine { static bool areDockerAndSkopeoOnTheSameVolume(const boost::filesystem::path& skopeo_path, const boost::filesystem::path& docker_path); + protected: + const boost::filesystem::path& storeRoot() const { return store_root_; } + const boost::filesystem::path& installRoot() const { return install_root_; } + const std::string& dockerHost() const { return docker_host_; } + + virtual void installAppAndImages(const App& app); + private: class LoadImageException : public std::runtime_error { public: @@ -124,7 +131,6 @@ class RestorableAppEngine : public AppEngine { // install App&Images Result installAndCreateOrRunContainers(const App& app, bool run = false); Result installContainerless(const App& app); - void installAppAndImages(const App& app); static void installApp(const boost::filesystem::path& app_dir, const boost::filesystem::path& dst_dir); void installAppImages(const boost::filesystem::path& app_dir);