Слияние кода завершено, страница обновится автоматически
From 16da66344854a75ce7a9d7908e0a75732eb147dc Mon Sep 17 00:00:00 2001
From: liuxu <liuxu156@huawei.com>
Date: Wed, 27 Nov 2024 15:11:57 +0800
Subject: [PATCH 01/11] sandbox: del shim_sandbox and change sandbox ops
Signed-off-by: liuxu <liuxu156@huawei.com>
---
src/daemon/sandbox/sandbox.cc | 28 ++
src/daemon/sandbox/sandbox.h | 15 +-
src/daemon/sandbox/sandbox_manager.cc | 9 +-
src/daemon/sandbox/sandbox_ops.cc | 363 +---------------
.../sandbox/sandboxer/sandboxer_sandbox.cc | 401 ++++++++++++++++++
.../sandbox/sandboxer/sandboxer_sandbox.h | 33 +-
src/daemon/sandbox/shim/shim_sandbox.cc | 65 ---
src/daemon/sandbox/shim/shim_sandbox.h | 49 ---
8 files changed, 469 insertions(+), 494 deletions(-)
delete mode 100644 src/daemon/sandbox/shim/shim_sandbox.cc
delete mode 100644 src/daemon/sandbox/shim/shim_sandbox.h
diff --git a/src/daemon/sandbox/sandbox.cc b/src/daemon/sandbox/sandbox.cc
index 3715e5e0..d105d71a 100644
--- a/src/daemon/sandbox/sandbox.cc
+++ b/src/daemon/sandbox/sandbox.cc
@@ -1118,4 +1118,32 @@ void Sandbox::FillSandboxMetadata(sandbox_metadata* metadata, Errors &error)
metadata->sandbox_config_json = util_strdup_s(jsonStr.c_str());
}
+
+void Sandbox::LoadSandboxTasks()
+{
+}
+
+auto Sandbox::PrepareContainer(const char *containerId, const char *baseFs,
+ const oci_runtime_spec *ociSpec,
+ const char *consoleFifos[]) -> int
+{
+ return 0;
+}
+
+auto Sandbox::PrepareExec(const char *containerId, const char *execId,
+ defs_process *processSpec, const char *consoleFifos[]) -> int
+{
+ return 0;
+}
+
+auto Sandbox::PurgeContainer(const char *containerId) -> int
+{
+ return 0;
+}
+
+auto Sandbox::PurgeExec(const char *containerId, const char *execId) -> int
+{
+ return 0;
+}
+
}
\ No newline at end of file
diff --git a/src/daemon/sandbox/sandbox.h b/src/daemon/sandbox/sandbox.h
index 415406ff..58d60ecb 100644
--- a/src/daemon/sandbox/sandbox.h
+++ b/src/daemon/sandbox/sandbox.h
@@ -141,13 +141,14 @@ public:
void Status(runtime::v1::PodSandboxStatus &status);
// for sandbox api update
- virtual void LoadSandboxTasks() = 0;
- virtual auto SaveSandboxTasks() -> bool = 0;
- virtual auto AddSandboxTasks(sandbox_task *task) -> bool = 0;
- virtual auto GetAnySandboxTasks() -> std::string = 0;
- virtual void DeleteSandboxTasks(const char *containerId) = 0;
- virtual auto AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool = 0;
- virtual void DeleteSandboxTasksProcess(const char *containerId, const char *execId) = 0;
+ virtual void LoadSandboxTasks();
+ virtual auto PrepareContainer(const char *containerId, const char *baseFs,
+ const oci_runtime_spec *ociSpec,
+ const char *consoleFifos[]) -> int;
+ virtual auto PrepareExec(const char *containerId, const char *execId,
+ defs_process *processSpec, const char *consoleFifos[]) -> int;
+ virtual auto PurgeContainer(const char *containerId) -> int;
+ virtual auto PurgeExec(const char *containerId, const char *execId) -> int;
private:
auto SaveState(Errors &error) -> bool;
diff --git a/src/daemon/sandbox/sandbox_manager.cc b/src/daemon/sandbox/sandbox_manager.cc
index ba003d56..a7908a60 100644
--- a/src/daemon/sandbox/sandbox_manager.cc
+++ b/src/daemon/sandbox/sandbox_manager.cc
@@ -27,7 +27,6 @@
#ifdef ENABLE_SANDBOXER
#include "sandboxer_sandbox.h"
#endif
-#include "shim_sandbox.h"
#include "isulad_config.h"
#include "utils_verify.h"
#include "utils_file.h"
@@ -116,12 +115,12 @@ auto SandboxManager::CreateSandbox(const std::string &name, RuntimeInfo &info, s
#ifdef ENABLE_SANDBOXER
if (info.sandboxer == SHIM_CONTROLLER_NAME) {
- sandbox = std::make_shared<ShimSandbox>(id, m_rootdir, m_statedir, name, info, netMode, netNsPath, sandboxConfig, image);
+ sandbox = std::make_shared<Sandbox>(id, m_rootdir, m_statedir, name, info, netMode, netNsPath, sandboxConfig, image);
} else {
sandbox = std::make_shared<SandboxerSandbox>(id, m_rootdir, m_statedir, name, info, netMode, netNsPath, sandboxConfig, image);
}
#else
- sandbox = std::make_shared<ShimSandbox>(id, m_rootdir, m_statedir, name, info, netMode, netNsPath, sandboxConfig, image);
+ sandbox = std::make_shared<Sandbox>(id, m_rootdir, m_statedir, name, info, netMode, netNsPath, sandboxConfig, image);
#endif
if (sandbox == nullptr) {
ERROR("Failed to malloc for sandbox: %s", name.c_str());
@@ -485,12 +484,12 @@ auto SandboxManager::LoadSandbox(std::string &id) -> std::shared_ptr<Sandbox>
#ifdef ENABLE_SANDBOXER
if (IsShimSandbox(id, m_rootdir)) {
- sandbox = std::make_shared<ShimSandbox>(id, m_rootdir, m_statedir);
+ sandbox = std::make_shared<Sandbox>(id, m_rootdir, m_statedir);
} else {
sandbox = std::make_shared<SandboxerSandbox>(id, m_rootdir, m_statedir);
}
#else
- sandbox = std::make_shared<ShimSandbox>(id, m_rootdir, m_statedir);
+ sandbox = std::make_shared<Sandbox>(id, m_rootdir, m_statedir);
#endif
if (sandbox == nullptr) {
ERROR("Failed to malloc for sandboxes: %s", id.c_str());
diff --git a/src/daemon/sandbox/sandbox_ops.cc b/src/daemon/sandbox/sandbox_ops.cc
index f50a1033..ae881933 100644
--- a/src/daemon/sandbox/sandbox_ops.cc
+++ b/src/daemon/sandbox/sandbox_ops.cc
@@ -24,12 +24,6 @@
#include "sandbox.h"
#include "namespace.h"
#include "utils.h"
-#include "utils_timestamp.h"
-#include "utils_array.h"
-
-const std::string SANDBOX_EXTENSIONS_TASKS = "extensions.tasks";
-const std::string SANDBOX_TASKS_KEY = "tasks";
-const std::string SANDBOX_TASKS_TYPEURL = "github.com/containerd/containerd/Tasks";
static inline bool validate_sandbox_info(const container_sandbox_info *sandbox)
{
@@ -37,99 +31,6 @@ static inline bool validate_sandbox_info(const container_sandbox_info *sandbox)
sandbox->id != NULL);
}
-static int generate_ctrl_rootfs(sandbox_task *task,
- const container_config_v2_common_config *config)
-{
- size_t len = 1;
- if (nullptr == config->base_fs) {
- ERROR("Container %s has no base fs", config->id);
- return -1;
- }
-
- // TODO: rootfs's options left to be configured
- task->rootfs = (sandbox_mount **)util_smart_calloc_s(sizeof(sandbox_mount *), len);
- if (task->rootfs == nullptr) {
- ERROR("Out of memory.");
- return -1;
- }
- task->rootfs[0] = (sandbox_mount *)util_common_calloc_s(sizeof(sandbox_mount));
- if (task->rootfs[0] == nullptr) {
- ERROR("Out of memory.");
- return -1;
- }
- task->rootfs_len = len;
- task->rootfs[0]->type = util_strdup_s(MOUNT_TYPE_BIND);
- task->rootfs[0]->source = util_strdup_s(config->base_fs);
-
- return 0;
-}
-
-static int do_sandbox_update(std::shared_ptr<sandbox::Sandbox> &sandbox, sandbox_sandbox *apiSandbox)
-{
- Errors err;
- size_t fields_len = 1;
- __isula_auto_string_array_t string_array *fields = nullptr;
-
- fields = util_string_array_new(fields_len);
- if (fields == nullptr) {
- ERROR("Out of memory.");
- return -1;
- }
- if (util_append_string_array(fields, SANDBOX_EXTENSIONS_TASKS.c_str())) {
- ERROR("Out of memory.");
- return -1;
- }
-
- auto controller = sandbox::ControllerManager::GetInstance()->GetController(sandbox->GetSandboxer());
- if (nullptr == controller) {
- ERROR("Invalid sandboxer name: %s", sandbox->GetSandboxer().c_str());
- return -1;
- }
-
- if (!controller->Update(apiSandbox, fields, err)) {
- ERROR("Failed to update in container controller update: %s", err.GetCMessage());
- return -1;
- }
-
- return 0;
-}
-
-static oci_runtime_spec *clone_oci_runtime_spec(const oci_runtime_spec *oci_spec)
-{
- __isula_auto_free char *json_str = nullptr;
- __isula_auto_free parser_error err = nullptr;
- oci_runtime_spec *ret = nullptr;
-
- json_str = oci_runtime_spec_generate_json(oci_spec, nullptr, &err);
- if (json_str == nullptr) {
- ERROR("Failed to generate spec json: %s", err);
- return nullptr;
- }
- ret = oci_runtime_spec_parse_data(json_str, nullptr, &err);
- if (ret == nullptr) {
- ERROR("Failed to generate spec: %s", err);
- }
- return ret;
-}
-
-static defs_process *clone_defs_process(defs_process *process_spec)
-{
- __isula_auto_free char *json_str = nullptr;
- __isula_auto_free parser_error err = nullptr;
- defs_process *ret = nullptr;
-
- json_str = defs_process_generate_json(process_spec, nullptr, &err);
- if (json_str == nullptr) {
- ERROR("Failed to generate process spec json: %s", err);
- return nullptr;
- }
- ret = defs_process_parse_data(json_str, nullptr, &err);
- if (ret == nullptr) {
- ERROR("Failed to generate process spec: %s", err);
- }
- return ret;
-}
-
static std::shared_ptr<sandbox::Sandbox> get_prepare_sandbox(const container_config_v2_common_config *config)
{
if (nullptr == config || nullptr == config->id) {
@@ -151,126 +52,11 @@ static std::shared_ptr<sandbox::Sandbox> get_prepare_sandbox(const container_con
return sandbox;
}
-static sandbox_sandbox_runtime *init_sandbox_runtime(std::shared_ptr<sandbox::Sandbox> sandbox)
-{
- sandbox_sandbox_runtime *runtime = nullptr;
-
- auto runtime_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox_runtime>(free_sandbox_sandbox_runtime);
- if (runtime_wrapper == nullptr) {
- ERROR("Out of memory");
- return nullptr;
- }
- runtime = runtime_wrapper->get();
- runtime->name = util_strdup_s(sandbox->GetRuntime().c_str());
- // Just ignore options for now
-
- return runtime_wrapper->move();
-}
-
-static json_map_string_string *init_sandbox_labels(std::shared_ptr<sandbox::Sandbox> sandbox)
-{
- json_map_string_string *labels = nullptr;
-
- auto labels_wrapper = makeUniquePtrCStructWrapper<json_map_string_string>(free_json_map_string_string);
- if (labels_wrapper == nullptr) {
- ERROR("Out of memory");
- return nullptr;
- }
- labels = labels_wrapper->get();
- if (append_json_map_string_string(labels, "name", sandbox->GetName().c_str()) != 0) {
- ERROR("Out of memory");
- return nullptr;
- }
-
- return labels_wrapper->move();
-}
-
-static defs_map_string_object_any *init_sandbox_extensions(std::shared_ptr<sandbox::Sandbox> sandbox)
-{
- defs_map_string_object_any *extensions = nullptr;
- size_t len = 1;
- std::string task_json;
-
- auto extensions_wrapper = makeUniquePtrCStructWrapper<defs_map_string_object_any>(free_defs_map_string_object_any);
- if (extensions_wrapper == nullptr) {
- ERROR("Out of memory");
- return nullptr;
- }
- extensions = extensions_wrapper->get();
- extensions->keys = (char **)util_smart_calloc_s(sizeof(char *), len);
- if (extensions->keys == nullptr) {
- ERROR("Out of memory.");
- return nullptr;
- }
- extensions->len = len;
- extensions->values = (defs_map_string_object_any_element **)
- util_smart_calloc_s(sizeof(defs_map_string_object_any_element *), len);
- if (extensions->values == nullptr) {
- ERROR("Out of memory.");
- return nullptr;
- }
- extensions->values[0] = (defs_map_string_object_any_element *)
- util_common_calloc_s(sizeof(defs_map_string_object_any_element));
- if (extensions->values[0] == nullptr) {
- ERROR("Out of memory.");
- return nullptr;
- }
- extensions->values[0]->element = (defs_any *)util_common_calloc_s(sizeof(defs_any));
- if (extensions->values[0]->element == nullptr) {
- ERROR("Out of memory.");
- return nullptr;
- }
-
- extensions->keys[0] = util_strdup_s(SANDBOX_TASKS_KEY.c_str());
- task_json = sandbox->GetAnySandboxTasks();
- if (task_json.empty()) {
- ERROR("Failed to get any sandbox tasks");
- return nullptr;
- }
- DEBUG("Get any sandbox tasks %s", task_json.c_str());
- extensions->values[0]->element->type_url = util_strdup_s(SANDBOX_TASKS_TYPEURL.c_str());
- extensions->values[0]->element->value = reinterpret_cast<uint8_t *>(util_strdup_s(task_json.c_str()));
- extensions->values[0]->element->value_len = strlen(task_json.c_str());
-
- return extensions_wrapper->move();
-}
-
-static int init_api_sandbox(std::shared_ptr<sandbox::Sandbox> sandbox, sandbox_sandbox *apiSandbox)
-{
- apiSandbox->sandbox_id = util_strdup_s(sandbox->GetId().c_str());
- apiSandbox->runtime = init_sandbox_runtime(sandbox);
- if (apiSandbox->runtime == nullptr) {
- ERROR("Failed to init sandbox runtime");
- return -1;
- }
- // Just ignore spec
- apiSandbox->labels = init_sandbox_labels(sandbox);
- if (apiSandbox->labels == nullptr) {
- ERROR("Failed to init sandbox runtime");
- return -1;
- }
- apiSandbox->created_at = sandbox->GetCreatedAt();
- apiSandbox->updated_at = util_get_now_time_nanos();
- apiSandbox->extensions = init_sandbox_extensions(sandbox);
- if (apiSandbox->extensions == nullptr) {
- ERROR("Failed to init sandbox runtime");
- return -1;
- }
- apiSandbox->sandboxer = util_strdup_s(sandbox->GetSandboxer().c_str());
-
- return 0;
-}
int sandbox_prepare_container(const container_config_v2_common_config *config,
const oci_runtime_spec *oci_spec,
const char * console_fifos[], bool tty)
{
- sandbox_task *task = nullptr;
- sandbox_sandbox *apiSandbox = nullptr;
- int ret = -1;
-
- INFO("Prepare container for sandbox");
-
if (nullptr == console_fifos) {
ERROR("Invlaid parameter: console_fifos");
return -1;
@@ -282,67 +68,13 @@ int sandbox_prepare_container(const container_config_v2_common_config *config,
return -1;
}
- auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
- if (apiSandbox_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- apiSandbox = apiSandbox_wrapper->get();
- auto task_wrapper = makeUniquePtrCStructWrapper<sandbox_task>(free_sandbox_task);
- if (task_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- task = task_wrapper->get();
-
- task->task_id = util_strdup_s(config->id);
- task->spec = clone_oci_runtime_spec(oci_spec);
- if (task->spec == nullptr) {
- ERROR("Out of memory.");
- return -1;
- }
- if (generate_ctrl_rootfs(task, config) != 0) {
- ERROR("Invalid rootfs");
- return -1;
- }
- task->stdin = util_strdup_s((nullptr == console_fifos[0]) ? "" : console_fifos[0]);
- task->stdout = util_strdup_s((nullptr == console_fifos[1]) ? "" : console_fifos[1]);
- task->stderr = util_strdup_s((nullptr == console_fifos[2]) ? "" : console_fifos[2]);
-
- if (!sandbox->AddSandboxTasks(task)) {
- ERROR("Failed to add sandbox %s task.", config->id);
- return -1;
- }
- task = task_wrapper->move();
- ret = init_api_sandbox(sandbox, apiSandbox);
- if (ret != 0) {
- ERROR("Failed to init %s api sandbox.", config->id);
- goto del_out;
- }
- ret = do_sandbox_update(sandbox, apiSandbox);
-
-del_out:
- if (ret != 0) {
- sandbox->DeleteSandboxTasks(config->id);
- }
- if (!sandbox->SaveSandboxTasks()) {
- ERROR("Failed to Save %s sandbox tasks.", config->id);
- ret = -1;
- }
-
- return ret;
+ return sandbox->PrepareContainer(config->id, config->base_fs, oci_spec, console_fifos);
}
int sandbox_prepare_exec(const container_config_v2_common_config *config,
const char *exec_id, defs_process *process_spec,
const char * console_fifos[], bool tty)
{
- sandbox_process *process = nullptr;
- sandbox_sandbox *apiSandbox = nullptr;
- int ret = -1;
-
- INFO("Prepare exec for container in sandbox");
-
if (nullptr == console_fifos) {
ERROR("Invlaid parameter: console_fifos");
return -1;
@@ -354,116 +86,29 @@ int sandbox_prepare_exec(const container_config_v2_common_config *config,
return -1;
}
- auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
- if (apiSandbox_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- apiSandbox = apiSandbox_wrapper->get();
- auto process_wrapper = makeUniquePtrCStructWrapper<sandbox_process>(free_sandbox_process);
- if (process_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- process = process_wrapper->get();
-
- process->exec_id = util_strdup_s(exec_id);
- process->spec = clone_defs_process(process_spec);
- if (process->spec == nullptr) {
- ERROR("Out of memory.");
- return -1;
- }
- process->stdin = util_strdup_s((nullptr == console_fifos[0]) ? "" : console_fifos[0]);
- process->stdout = util_strdup_s((nullptr == console_fifos[1]) ? "" : console_fifos[1]);
- process->stderr = util_strdup_s((nullptr == console_fifos[2]) ? "" : console_fifos[2]);
-
- if (!sandbox->AddSandboxTasksProcess(config->id, process)) {
- ERROR("Failed to add sandbox %s process.", config->id);
- return -1;
- }
- process = process_wrapper->move();
- ret = init_api_sandbox(sandbox, apiSandbox);
- if (ret != 0) {
- ERROR("Failed to init %s api sandbox.", config->id);
- goto del_out;
- }
- ret = do_sandbox_update(sandbox, apiSandbox);
-
-del_out:
- if (ret != 0) {
- sandbox->DeleteSandboxTasksProcess(config->id, exec_id);
- }
- if (!sandbox->SaveSandboxTasks()) {
- ERROR("Failed to Save %s sandbox tasks.", config->id);
- ret = -1;
- }
-
- return ret;
+ return sandbox->PrepareExec(config->id, exec_id, process_spec, console_fifos);
}
int sandbox_purge_container(const container_config_v2_common_config *config)
{
- sandbox_sandbox *apiSandbox = nullptr;
-
- INFO("Purge container for sandbox");
-
auto sandbox = get_prepare_sandbox(config);
if (sandbox == nullptr) {
ERROR("Sandbox not found");
return -1;
}
- auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
- if (apiSandbox_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- apiSandbox = apiSandbox_wrapper->get();
-
- sandbox->DeleteSandboxTasks(config->id);
- if (!sandbox->SaveSandboxTasks()) {
- ERROR("Failed to Save %s sandbox tasks.", config->id);
- return -1;
- }
-
- if (init_api_sandbox(sandbox, apiSandbox) != 0) {
- ERROR("Failed to init %s api sandbox.", config->id);
- return -1;
- }
- return do_sandbox_update(sandbox, apiSandbox);
+ return sandbox->PurgeContainer(config->id);
}
int sandbox_purge_exec(const container_config_v2_common_config *config, const char *exec_id)
{
- sandbox_sandbox *apiSandbox = nullptr;
-
- INFO("Purge exec for container in sandbox");
-
auto sandbox = get_prepare_sandbox(config);
if (sandbox == nullptr) {
ERROR("Sandbox not found");
return -1;
}
- auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
- if (apiSandbox_wrapper == nullptr) {
- ERROR("Out of memory");
- return -1;
- }
- apiSandbox = apiSandbox_wrapper->get();
-
- sandbox->DeleteSandboxTasksProcess(config->id, exec_id);
- if (!sandbox->SaveSandboxTasks()) {
- ERROR("Failed to Save %s sandbox tasks.", config->id);
- return -1;
- }
-
- if (init_api_sandbox(sandbox, apiSandbox) != 0) {
- ERROR("Failed to init %s api sandbox.", exec_id);
- return -1;
- }
-
- return do_sandbox_update(sandbox, apiSandbox);
+ return sandbox->PurgeExec(config->id, exec_id);
}
int sandbox_on_sandbox_exit(const char *sandbox_id, int exit_code)
diff --git a/src/daemon/sandbox/sandboxer/sandboxer_sandbox.cc b/src/daemon/sandbox/sandboxer/sandboxer_sandbox.cc
index 726b7b3a..b2e2fb32 100644
--- a/src/daemon/sandbox/sandboxer/sandboxer_sandbox.cc
+++ b/src/daemon/sandbox/sandboxer/sandboxer_sandbox.cc
@@ -23,13 +23,21 @@
#include <isula_libutils/log.h>
#include <isula_libutils/auto_cleanup.h>
+#include <isula_libutils/sandbox_sandbox.h>
+#include <isula_libutils/defs_process.h>
#include "utils_file.h"
#include "utils.h"
#include "cxxutils.h"
+#include "utils_timestamp.h"
+#include "utils_array.h"
namespace sandbox {
+const std::string SANDBOX_EXTENSIONS_TASKS = "extensions.tasks";
+const std::string SANDBOX_TASKS_KEY = "tasks";
+const std::string SANDBOX_TASKS_TYPEURL = "github.com/containerd/containerd/Tasks";
+
SandboxerSandbox::SandboxerSandbox(const std::string id, const std::string &rootdir, const std::string &statedir, const std::string name,
const RuntimeInfo info, std::string netMode, std::string netNsPath, const runtime::v1::PodSandboxConfig sandboxConfig,
const std::string image):Sandbox(id, rootdir, statedir, name, info, netMode,
@@ -251,4 +259,397 @@ void SandboxerSandbox::DeleteSandboxTasksProcess(const char *containerId, const
iter->second->DeleteSandboxTasksProcess(execId);
}
+static oci_runtime_spec *clone_oci_runtime_spec(const oci_runtime_spec *oci_spec)
+{
+ __isula_auto_free char *json_str = nullptr;
+ __isula_auto_free parser_error err = nullptr;
+ oci_runtime_spec *ret = nullptr;
+
+ json_str = oci_runtime_spec_generate_json(oci_spec, nullptr, &err);
+ if (json_str == nullptr) {
+ ERROR("Failed to generate spec json: %s", err);
+ return nullptr;
+ }
+ ret = oci_runtime_spec_parse_data(json_str, nullptr, &err);
+ if (ret == nullptr) {
+ ERROR("Failed to generate spec: %s", err);
+ }
+ return ret;
+}
+
+static defs_process *clone_defs_process(defs_process *process_spec)
+{
+ __isula_auto_free char *json_str = nullptr;
+ __isula_auto_free parser_error err = nullptr;
+ defs_process *ret = nullptr;
+
+ json_str = defs_process_generate_json(process_spec, nullptr, &err);
+ if (json_str == nullptr) {
+ ERROR("Failed to generate process spec json: %s", err);
+ return nullptr;
+ }
+ ret = defs_process_parse_data(json_str, nullptr, &err);
+ if (ret == nullptr) {
+ ERROR("Failed to generate process spec: %s", err);
+ }
+ return ret;
+}
+
+auto SandboxerSandbox::GenerateCtrlRootfs(sandbox_task *task, const char *baseFs) -> int
+{
+ size_t len = 1;
+ if (nullptr == baseFs) {
+ ERROR("Container %s has no base fs", task->task_id);
+ return -1;
+ }
+
+ // TODO: rootfs's options left to be configured
+ task->rootfs = (sandbox_mount **)util_smart_calloc_s(sizeof(sandbox_mount *), len);
+ if (task->rootfs == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ task->rootfs[0] = (sandbox_mount *)util_common_calloc_s(sizeof(sandbox_mount));
+ if (task->rootfs[0] == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ task->rootfs_len = len;
+ task->rootfs[0]->type = util_strdup_s(MOUNT_TYPE_BIND);
+ task->rootfs[0]->source = util_strdup_s(baseFs);
+
+ return 0;
+}
+
+auto SandboxerSandbox::InitSandboxRuntime() -> sandbox_sandbox_runtime *
+{
+ sandbox_sandbox_runtime *runtime = nullptr;
+
+ auto runtime_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox_runtime>(free_sandbox_sandbox_runtime);
+ if (runtime_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return nullptr;
+ }
+ runtime = runtime_wrapper->get();
+ runtime->name = util_strdup_s(GetRuntime().c_str());
+ // Just ignore options for now
+
+ return runtime_wrapper->move();
+}
+
+auto SandboxerSandbox::InitSandboxLabels() -> json_map_string_string *
+{
+ json_map_string_string *labels = nullptr;
+
+ auto labels_wrapper = makeUniquePtrCStructWrapper<json_map_string_string>(free_json_map_string_string);
+ if (labels_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return nullptr;
+ }
+ labels = labels_wrapper->get();
+ if (append_json_map_string_string(labels, "name", GetName().c_str()) != 0) {
+ ERROR("Out of memory");
+ return nullptr;
+ }
+
+ return labels_wrapper->move();
+}
+
+auto SandboxerSandbox::InitSandboxExtensions() -> defs_map_string_object_any *
+{
+ defs_map_string_object_any *extensions = nullptr;
+ size_t len = 1;
+ std::string task_json;
+
+ auto extensions_wrapper = makeUniquePtrCStructWrapper<defs_map_string_object_any>(free_defs_map_string_object_any);
+ if (extensions_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return nullptr;
+ }
+ extensions = extensions_wrapper->get();
+
+ extensions->keys = (char **)util_smart_calloc_s(sizeof(char *), len);
+ if (extensions->keys == nullptr) {
+ ERROR("Out of memory.");
+ return nullptr;
+ }
+ extensions->values = (defs_map_string_object_any_element **)
+ util_smart_calloc_s(sizeof(defs_map_string_object_any_element *), len);
+ if (extensions->values == nullptr) {
+ ERROR("Out of memory.");
+ free(extensions->keys);
+ extensions->keys = nullptr;
+ return nullptr;
+ }
+ extensions->len = len;
+
+ extensions->values[0] = (defs_map_string_object_any_element *)
+ util_common_calloc_s(sizeof(defs_map_string_object_any_element));
+ if (extensions->values[0] == nullptr) {
+ ERROR("Out of memory.");
+ return nullptr;
+ }
+ extensions->values[0]->element = (defs_any *)util_common_calloc_s(sizeof(defs_any));
+ if (extensions->values[0]->element == nullptr) {
+ ERROR("Out of memory.");
+ return nullptr;
+ }
+
+ extensions->keys[0] = util_strdup_s(SANDBOX_TASKS_KEY.c_str());
+ task_json = GetAnySandboxTasks();
+ if (task_json.empty()) {
+ ERROR("Failed to get any sandbox tasks");
+ return nullptr;
+ }
+ DEBUG("Get any sandbox tasks %s", task_json.c_str());
+ extensions->values[0]->element->type_url = util_strdup_s(SANDBOX_TASKS_TYPEURL.c_str());
+ extensions->values[0]->element->value = reinterpret_cast<uint8_t *>(util_strdup_s(task_json.c_str()));
+ extensions->values[0]->element->value_len = strlen(task_json.c_str());
+
+ return extensions_wrapper->move();
+}
+
+auto SandboxerSandbox::InitApiSandbox(sandbox_sandbox *apiSandbox) -> int
+{
+ apiSandbox->sandbox_id = util_strdup_s(GetId().c_str());
+ apiSandbox->runtime = InitSandboxRuntime();
+ if (apiSandbox->runtime == nullptr) {
+ ERROR("Failed to init sandbox runtime");
+ return -1;
+ }
+ // Just ignore spec
+ apiSandbox->labels = InitSandboxLabels();
+ if (apiSandbox->labels == nullptr) {
+ ERROR("Failed to init sandbox runtime");
+ return -1;
+ }
+ apiSandbox->created_at = GetCreatedAt();
+ apiSandbox->updated_at = util_get_now_time_nanos();
+ apiSandbox->extensions = InitSandboxExtensions();
+ if (apiSandbox->extensions == nullptr) {
+ ERROR("Failed to init sandbox runtime");
+ return -1;
+ }
+ apiSandbox->sandboxer = util_strdup_s(GetSandboxer().c_str());
+
+ return 0;
+}
+
+auto SandboxerSandbox::DoSandboxUpdate(sandbox_sandbox *apiSandbox) -> int
+{
+ Errors err;
+ size_t fields_len = 1;
+ __isula_auto_string_array_t string_array *fields = nullptr;
+
+ fields = util_string_array_new(fields_len);
+ if (fields == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ if (util_append_string_array(fields, SANDBOX_EXTENSIONS_TASKS.c_str())) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+
+ auto controller = sandbox::ControllerManager::GetInstance()->GetController(GetSandboxer());
+ if (nullptr == controller) {
+ ERROR("Invalid sandboxer name: %s", GetSandboxer().c_str());
+ return -1;
+ }
+
+ if (!controller->Update(apiSandbox, fields, err)) {
+ ERROR("Failed to update in container controller update: %s", err.GetCMessage());
+ return -1;
+ }
+
+ return 0;
+}
+
+auto SandboxerSandbox::PrepareContainer(const char *containerId, const char *baseFs,
+ const oci_runtime_spec *ociSpec,
+ const char *consoleFifos[]) -> int
+{
+ sandbox_task *task = nullptr;
+ sandbox_sandbox *apiSandbox = nullptr;
+
+ INFO("Prepare container for sandbox");
+
+ if (nullptr == consoleFifos) {
+ ERROR("Invlaid parameter: consoleFifos");
+ return -1;
+ }
+
+ auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
+ if (apiSandbox_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ apiSandbox = apiSandbox_wrapper->get();
+ auto task_wrapper = makeUniquePtrCStructWrapper<sandbox_task>(free_sandbox_task);
+ if (task_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ task = task_wrapper->get();
+
+ task->task_id = util_strdup_s(containerId);
+ task->spec = clone_oci_runtime_spec(ociSpec);
+ if (task->spec == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ if (GenerateCtrlRootfs(task, baseFs) != 0) {
+ ERROR("Invalid rootfs");
+ return -1;
+ }
+ task->stdin = util_strdup_s((nullptr == consoleFifos[0]) ? "" : consoleFifos[0]);
+ task->stdout = util_strdup_s((nullptr == consoleFifos[1]) ? "" : consoleFifos[1]);
+ task->stderr = util_strdup_s((nullptr == consoleFifos[2]) ? "" : consoleFifos[2]);
+
+ if (!AddSandboxTasks(task)) {
+ ERROR("Failed to add sandbox %s task.", containerId);
+ return -1;
+ }
+ task = task_wrapper->move();
+ if (InitApiSandbox(apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", containerId);
+ goto del_out;
+ }
+ if (DoSandboxUpdate(apiSandbox) != 0) {
+ ERROR("Failed to update %s api sandbox.", containerId);
+ goto del_out;
+ }
+ if (!SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", containerId);
+ (void)PurgeContainer(containerId);
+ return -1;
+ }
+ return 0;
+
+del_out:
+ DeleteSandboxTasks(containerId);
+ return -1;
+}
+
+auto SandboxerSandbox::PrepareExec(const char *containerId, const char *execId,
+ defs_process *processSpec, const char *consoleFifos[]) -> int
+{
+ sandbox_process *process = nullptr;
+ sandbox_sandbox *apiSandbox = nullptr;
+
+ INFO("Prepare exec for container in sandbox");
+
+ if (nullptr == consoleFifos) {
+ ERROR("Invlaid parameter: consoleFifos");
+ return -1;
+ }
+
+ auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
+ if (apiSandbox_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ apiSandbox = apiSandbox_wrapper->get();
+ auto process_wrapper = makeUniquePtrCStructWrapper<sandbox_process>(free_sandbox_process);
+ if (process_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ process = process_wrapper->get();
+
+ process->exec_id = util_strdup_s(execId);
+ process->spec = clone_defs_process(processSpec);
+ if (process->spec == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ process->stdin = util_strdup_s((nullptr == consoleFifos[0]) ? "" : consoleFifos[0]);
+ process->stdout = util_strdup_s((nullptr == consoleFifos[1]) ? "" : consoleFifos[1]);
+ process->stderr = util_strdup_s((nullptr == consoleFifos[2]) ? "" : consoleFifos[2]);
+
+ if (!AddSandboxTasksProcess(containerId, process)) {
+ ERROR("Failed to add sandbox %s process.", containerId);
+ return -1;
+ }
+ process = process_wrapper->move();
+ if (InitApiSandbox(apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", containerId);
+ goto del_out;
+ }
+ if (DoSandboxUpdate(apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", containerId);
+ goto del_out;
+ }
+ if (!SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", containerId);
+ (void)PurgeExec(containerId, execId);
+ return -1;
+ }
+ return 0;
+
+del_out:
+ DeleteSandboxTasksProcess(containerId, execId);
+ return -1;
+}
+
+auto SandboxerSandbox::PurgeContainer(const char *containerId) -> int
+{
+ sandbox_sandbox *apiSandbox = nullptr;
+
+ INFO("Purge container for sandbox");
+
+ auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
+ if (apiSandbox_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ apiSandbox = apiSandbox_wrapper->get();
+
+ DeleteSandboxTasks(containerId);
+
+ if (InitApiSandbox(apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", containerId);
+ return -1;
+ }
+ if (DoSandboxUpdate(apiSandbox) != 0) {
+ ERROR("Failed to update %s api sandbox.", containerId);
+ return -1;
+ }
+ if (!SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", containerId);
+ return -1;
+ }
+ return 0;
+}
+
+auto SandboxerSandbox::PurgeExec(const char *containerId, const char *execId) -> int
+{
+ sandbox_sandbox *apiSandbox = nullptr;
+
+ INFO("Purge exec for container in sandbox");
+
+ auto apiSandbox_wrapper = makeUniquePtrCStructWrapper<sandbox_sandbox>(free_sandbox_sandbox);
+ if (apiSandbox_wrapper == nullptr) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ apiSandbox = apiSandbox_wrapper->get();
+
+ DeleteSandboxTasksProcess(containerId, execId);
+
+ if (InitApiSandbox(apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", execId);
+ return -1;
+ }
+ if (DoSandboxUpdate(apiSandbox) != 0) {
+ ERROR("Failed to update %s api sandbox.", execId);
+ return -1;
+ }
+ if (!SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", containerId);
+ return -1;
+ }
+ return 0;
+}
+
}
\ No newline at end of file
diff --git a/src/daemon/sandbox/sandboxer/sandboxer_sandbox.h b/src/daemon/sandbox/sandboxer/sandboxer_sandbox.h
index 552eb328..37a96cd6 100644
--- a/src/daemon/sandbox/sandboxer/sandboxer_sandbox.h
+++ b/src/daemon/sandbox/sandboxer/sandboxer_sandbox.h
@@ -33,24 +33,39 @@ public:
const runtime::v1::PodSandboxConfig sandboxConfig = runtime::v1::PodSandboxConfig::default_instance(),
const std::string image = "");
virtual ~SandboxerSandbox() = default;
-
- // for sandbox api update
- auto GetTasksJsonPath() -> std::string;
+
void LoadSandboxTasks() override;
- auto SaveSandboxTasks() -> bool override;
- auto AddSandboxTasks(sandbox_task *task) -> bool override;
- auto GetAnySandboxTasks() -> std::string override;
- void DeleteSandboxTasks(const char *containerId) override;
- auto AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool override;
- void DeleteSandboxTasksProcess(const char *containerId, const char *execId) override;
+
+ auto PrepareContainer(const char *containerId, const char *baseFs,
+ const oci_runtime_spec *ociSpec,
+ const char *consoleFifos[]) -> int override;
+ auto PrepareExec(const char *containerId, const char *execId,
+ defs_process *processSpec, const char *consoleFifos[]) -> int override;
+ auto PurgeContainer(const char *containerId) -> int override;
+ auto PurgeExec(const char *containerId, const char *execId) -> int override;
private:
+ auto GetTasksJsonPath() -> std::string;
+ auto SaveSandboxTasks() -> bool;
+ auto AddSandboxTasks(sandbox_task *task) -> bool;
+ auto GetAnySandboxTasks() -> std::string;
+ void DeleteSandboxTasks(const char *containerId);
+ auto AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool;
+ void DeleteSandboxTasksProcess(const char *containerId, const char *execId);
+
auto AddTaskById(const char *task_id, sandbox_task *task) -> bool;
auto ReadSandboxTasksJson() -> sandbox_tasks *;
auto WriteSandboxTasksJson(std::string &tasks_json) -> bool;
auto DeleteSandboxTasksJson() -> bool;
void AddSandboxTasksByArray(sandbox_tasks *tasksArray);
+ auto GenerateCtrlRootfs(sandbox_task *task, const char *baseFs) -> int;
+ auto InitSandboxRuntime() -> sandbox_sandbox_runtime *;
+ auto InitSandboxLabels() -> json_map_string_string *;
+ auto InitSandboxExtensions() -> defs_map_string_object_any *;
+ auto InitApiSandbox(sandbox_sandbox *apiSandbox) -> int;
+ auto DoSandboxUpdate(sandbox_sandbox *apiSandbox) -> int;
+
private:
// use m_tasksMutex to ensure the correctness of the tasks
RWMutex m_tasksMutex;
diff --git a/src/daemon/sandbox/shim/shim_sandbox.cc b/src/daemon/sandbox/shim/shim_sandbox.cc
deleted file mode 100644
index 2efb8d7c..00000000
--- a/src/daemon/sandbox/shim/shim_sandbox.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/******************************************************************************
- * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
- * iSulad licensed under the Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
- * PURPOSE.
- * See the Mulan PSL v2 for more details.
- * Author: liuxu
- * Create: 2024-11-20
- * Description: provide sandboxer sandbox class definition
- *********************************************************************************/
-#include "shim_sandbox.h"
-
-#include <unistd.h>
-#include <string>
-
-#include <isula_libutils/log.h>
-#include <isula_libutils/auto_cleanup.h>
-
-
-namespace sandbox {
-
-ShimSandbox::ShimSandbox(const std::string id, const std::string &rootdir, const std::string &statedir, const std::string name,
- const RuntimeInfo info, std::string netMode, std::string netNsPath, const runtime::v1::PodSandboxConfig sandboxConfig,
- const std::string image):Sandbox(id, rootdir, statedir, name, info, netMode,
- netNsPath, sandboxConfig, image)
-{
-}
-
-void ShimSandbox::LoadSandboxTasks()
-{
-}
-
-auto ShimSandbox::SaveSandboxTasks() -> bool
-{
- return true;
-}
-
-auto ShimSandbox::AddSandboxTasks(sandbox_task *task) -> bool
-{
- return true;
-}
-
-auto ShimSandbox::GetAnySandboxTasks() -> std::string
-{
- return std::string("Nothing for shim.");
-}
-
-void ShimSandbox::DeleteSandboxTasks(const char *containerId)
-{
-}
-
-auto ShimSandbox::AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool
-{
- return true;
-}
-
-void ShimSandbox::DeleteSandboxTasksProcess(const char *containerId, const char *execId)
-{
-}
-
-}
\ No newline at end of file
diff --git a/src/daemon/sandbox/shim/shim_sandbox.h b/src/daemon/sandbox/shim/shim_sandbox.h
deleted file mode 100644
index 82da0573..00000000
--- a/src/daemon/sandbox/shim/shim_sandbox.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/******************************************************************************
- * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
- * iSulad licensed under the Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
- * PURPOSE.
- * See the Mulan PSL v2 for more details.
- * Author: liuxu
- * Create: 2024-11-20
- * Description: provide shim sandbox class definition
- *********************************************************************************/
-
-#ifndef DAEMON_SANDBOX_SHIM_SANDBOX_H
-#define DAEMON_SANDBOX_SHIM_SANDBOX_H
-
-#include <string>
-#include <mutex>
-#include <google/protobuf/map.h>
-
-#include "read_write_lock.h"
-#include "sandbox_task.h"
-#include "sandbox.h"
-
-namespace sandbox {
-
-class ShimSandbox : public Sandbox {
-public:
- ShimSandbox(const std::string id, const std::string &rootdir, const std::string &statedir, const std::string name = "",
- const RuntimeInfo info = {"", "", ""}, std::string netMode = DEFAULT_NETMODE, std::string netNsPath = "",
- const runtime::v1::PodSandboxConfig sandboxConfig = runtime::v1::PodSandboxConfig::default_instance(),
- const std::string image = "");
- virtual ~ShimSandbox() = default;
-
- // for sandbox api update
- void LoadSandboxTasks() override;
- auto SaveSandboxTasks() -> bool override;
- auto AddSandboxTasks(sandbox_task *task) -> bool override;
- auto GetAnySandboxTasks() -> std::string override;
- void DeleteSandboxTasks(const char *containerId) override;
- auto AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool override;
- void DeleteSandboxTasksProcess(const char *containerId, const char *execId) override;
-};
-
-} // namespace sandbox
-
-#endif // DAEMON_SANDBOX_SHIM_SANDBOX_H
\ No newline at end of file
--
2.23.0
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )