summaryrefslogtreecommitdiff
path: root/0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch
diff options
context:
space:
mode:
Diffstat (limited to '0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch')
-rw-r--r--0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch399
1 files changed, 399 insertions, 0 deletions
diff --git a/0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch b/0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch
new file mode 100644
index 0000000..084b8b2
--- /dev/null
+++ b/0190-modified-the-procedure-of-start-pod-and-set-up-netwo.patch
@@ -0,0 +1,399 @@
+From 1d42d850b71e3a0e269f268411999c265a1a8f5b Mon Sep 17 00:00:00 2001
+From: zhongtao <zhongtao17@huawei.com>
+Date: Mon, 10 Feb 2025 10:44:01 +0800
+Subject: [PATCH 190/198] modified the procedure of start pod and set up
+ network in cri v1
+
+Signed-off-by: zhongtao <zhongtao17@huawei.com>
+---
+ .../v1/v1_cri_pod_sandbox_manager_service.cc | 276 +++++++++++++-----
+ .../v1/v1_cri_pod_sandbox_manager_service.h | 3 +
+ 2 files changed, 206 insertions(+), 73 deletions(-)
+
+diff --git a/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.cc b/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.cc
+index 43705853..62464acd 100644
+--- a/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.cc
++++ b/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.cc
+@@ -19,6 +19,7 @@
+ #include <isula_libutils/host_config.h>
+ #include <isula_libutils/container_config.h>
+ #include <isula_libutils/auto_cleanup.h>
++#include <isula_libutils/container_network_settings.h>
+ #include <algorithm>
+
+ #include "checkpoint_handler.h"
+@@ -273,12 +274,6 @@ void PodSandboxManagerService::SetupSandboxNetwork(const std::shared_ptr<sandbox
+ std::map<std::string, std::string> networkOptions;
+ networkOptions["UID"] = config.metadata().uid();
+
+- if (prepare_network_namespace(sandboxKey.c_str(), false, 0) != 0) {
+- error.Errorf("Failed to prepare network namespace: %s", sandboxKey.c_str());
+- ERROR("Failed to prepare network namespace: %s", sandboxKey.c_str());
+- return;
+- }
+-
+ // Setup networking for the sandbox.
+ m_pluginManager->SetUpPod(config.metadata().namespace_(), config.metadata().name(),
+ Network::DEFAULT_NETWORK_INTERFACE_NAME, sandbox->GetId(), stdAnnos, networkOptions,
+@@ -295,85 +290,137 @@ void PodSandboxManagerService::SetupSandboxNetwork(const std::shared_ptr<sandbox
+ DEBUG("set %s ready", sandbox->GetId().c_str());
+ }
+
+-auto PodSandboxManagerService::RunPodSandbox(const runtime::v1::PodSandboxConfig &config,
+- const std::string &runtimeHandler, Errors &error) -> std::string
++void PodSandboxManagerService::GenerateNetworkSetting(std::string &sandboxKey, std::string &network_setting_json, Errors &error)
++{
++ container_network_settings *settings = NULL;
++ __isula_auto_free char *jerr = NULL;
++ __isula_auto_free char *setting_json { nullptr };
++
++ settings = (container_network_settings *)util_common_calloc_s(sizeof(container_network_settings));
++ if (settings == NULL) {
++ ERROR("Out of memory");
++ error.Errorf("Out of memory");
++ return;
++ }
++
++ auto settingsWarpper = std::unique_ptr<CStructWrapper<container_network_settings>>(new CStructWrapper<container_network_settings>(settings, free_container_network_settings));
++
++ settings->sandbox_key = util_strdup_s(sandboxKey.c_str());
++ if (settings->sandbox_key == NULL) {
++ ERROR("Failed to set sandbox key for network setting");
++ error.Errorf("Failed to set sandbox key for network setting");
++ return;
++ }
++
++ setting_json = container_network_settings_generate_json(settings, nullptr, &jerr);
++ if (setting_json == nullptr) {
++ error.Errorf("Get network settings json err:%s", jerr);
++ }
++
++ network_setting_json = std::string(setting_json);
++}
++
++void PodSandboxManagerService::StartPodSandboxAndSetupNetowrk(std::shared_ptr<sandbox::Sandbox> sandbox, std::string &sandboxKey, std::string &sandboxName, std::string &networkMode, Errors &error)
+ {
+- std::string response_id;
+- std::string sandboxName;
+- sandbox::RuntimeInfo runtimeInfo;
+- std::string networkMode;
+- std::string sandboxKey;
+- std::string jsonCheckpoint;
+- std::string network_setting_json;
+- runtime::v1::PodSandboxConfig copyConfig = config;
+ cri_container_message_t msg = { 0 };
+-#ifdef ENABLE_NRI
+- Errors nriErr;
+-#endif
++ std::string network_setting_json;
+
+- // Step 1: Parepare sandbox name, runtime and networkMode
+- PrepareSandboxData(config, runtimeHandler, sandboxName, runtimeInfo, networkMode, error);
++ // Step 7.2.1: Call sandbox create.
++ sandbox->Create(error);
+ if (error.NotEmpty()) {
+- return response_id;
++ ERROR("Failed to create sandbox: %s", sandboxName.c_str());
++ return;
+ }
+
+- // Step 2: Pull the image for the sandbox.
+- // Maybe we should pull image in shim controller ?
+- // But pull image interface is only in CRI image service, and it can't be called in shim controller,
+- // so we pull image in CRI pod service.
+- const std::string &image = m_podSandboxImage;
+- if (!EnsureSandboxImageExists(image, runtimeInfo.sandboxer, error)) {
+- ERROR("Failed to pull sandbox image %s: %s", image.c_str(), error.NotEmpty() ? error.GetCMessage() : "");
+- error.Errorf("Failed to pull sandbox image %s: %s", image.c_str(), error.NotEmpty() ? error.GetCMessage() : "");
+- return response_id;
++ msg.container_id = sandbox->GetId().c_str();
++ msg.sandbox_id = sandbox->GetId().c_str();
++ msg.type = CRI_CONTAINER_MESSAGE_TYPE_CREATED;
++ mailbox_publish(MAILBOX_TOPIC_CRI_CONTAINER, &msg);
++
++ // Step 7.2.2: Save network settings json to disk
++ // Update network settings before start sandbox since sandbox container will use the sandbox key
++ if (namespace_is_cni(networkMode.c_str())) {
++ GenerateNetworkSetting(sandboxKey, network_setting_json, error);
++ // If saving network settings failed, ignore error
++ if (error.NotEmpty()) {
++ ERROR("Failed to generate networksetting :%s", error.GetCMessage());
++ return;
++ }
++
++ sandbox->UpdateNetworkSettings(network_setting_json, error);
++ // If saving network settings failed, ignore error
++ if (error.NotEmpty()) {
++ ERROR("%s", error.GetCMessage());
++ return;
++ }
+ }
+
+- // Step 3: Prepare sandbox checkpoint
+- PrepareSandboxCheckpoint(config, jsonCheckpoint, error);
++ // Step 7.2.3: Call sandbox start.
++ sandbox->Start(error);
+ if (error.NotEmpty()) {
+- return response_id;
++ ERROR("Failed to start sandbox: %s", sandboxName.c_str());
++ return;
+ }
+
+- // Step 4: Update sandbox instance config
+- UpdateSandboxConfig(copyConfig, jsonCheckpoint, error);
++ // Step 7.2.4:Setup networking for the sandbox.
++ SetupSandboxNetwork(sandbox, network_setting_json, error);
+ if (error.NotEmpty()) {
+- return response_id;
++ goto stop_sandbox;
+ }
+
+- // Step 5: Prepare sandboxKey
++ // Step 7.2.5:update Network settings after setup network to update ip info.
+ if (namespace_is_cni(networkMode.c_str())) {
+- // cleanup sandboxKey file in DeleteSandbox
+- PrepareSandboxKey(sandboxKey, error);
+- if (error.NotEmpty()) {
+- return response_id;
++ Errors tmpErr;
++ sandbox->UpdateNetworkSettings(network_setting_json, tmpErr);
++ // If saving network settings failed, ignore error
++ if (tmpErr.NotEmpty()) {
++ WARN("%s", tmpErr.GetCMessage());
+ }
+ }
+
+- // Step 6: Create sandbox instance
+- auto sandbox = sandbox::SandboxManager::GetInstance()->CreateSandbox(sandboxName, runtimeInfo, sandboxKey,
+- networkMode, copyConfig, image, error);
++ // Step 7.2.6: Save sandbox to disk
++ sandbox->Save(error);
+ if (error.NotEmpty()) {
+- if (namespace_is_cni(networkMode.c_str())) {
+- (void)remove_network_namespace_file(sandboxKey.c_str());
++ ERROR("Failed to save sandbox, %s", sandboxName.c_str());
++ goto cleanup_network;
++ }
++ return;
++
++cleanup_network:
++ if (namespace_is_cni(sandbox->GetNetMode().c_str())) {
++ Errors clearErr;
++ ClearCniNetwork(sandbox, clearErr);
++ if (clearErr.NotEmpty()) {
++ ERROR("Failed to clean cni network: %s", clearErr.GetCMessage());
+ }
+- return response_id;
+ }
+
+- // Step 7: Setup networking for the sandbox.
++stop_sandbox:
++ Errors stopError;
++ CRIHelpers::StopContainerHelper(m_cb, sandbox->GetId(), 0, stopError);
++ WARN("Error stop container: %s: %s", sandbox->GetId().c_str(), stopError.GetCMessage());
++}
++
++void PodSandboxManagerService::SetupNetowrkAndStartPodSandbox(std::shared_ptr<sandbox::Sandbox> sandbox, std::string &sandboxName, std::string &networkMode, Errors &error)
++{
++ cri_container_message_t msg = { 0 };
++ std::string network_setting_json;
++
++ // Step 7.1.1: Setup networking for the sandbox.
+ // Setup sandbox network before create sandbox since the remote create might fail for sandbox
+ SetupSandboxNetwork(sandbox, network_setting_json, error);
+ if (error.NotEmpty()) {
+- goto cleanup_sandbox;
++ return;
+ }
+
+- // Step 8: Save sandbox to disk
++ // Step 7.1.2: Save sandbox to disk
+ sandbox->Save(error);
+ if (error.NotEmpty()) {
+ ERROR("Failed to save sandbox, %s", sandboxName.c_str());
+ goto cleanup_network;
+ }
+
+- // Step 9: Call sandbox create.
++ // Step 7.1.3: Call sandbox create.
+ sandbox->Create(error);
+ if (error.NotEmpty()) {
+ ERROR("Failed to create sandbox: %s", sandboxName.c_str());
+@@ -385,7 +432,7 @@ auto PodSandboxManagerService::RunPodSandbox(const runtime::v1::PodSandboxConfig
+ msg.type = CRI_CONTAINER_MESSAGE_TYPE_CREATED;
+ mailbox_publish(MAILBOX_TOPIC_CRI_CONTAINER, &msg);
+
+- // Step 10: Save network settings json to disk
++ // Step 7.1.4: Save network settings json to disk
+ // Update network settings before start sandbox since sandbox container will use the sandbox key
+ if (namespace_is_cni(networkMode.c_str())) {
+ Errors tmpErr;
+@@ -396,26 +443,15 @@ auto PodSandboxManagerService::RunPodSandbox(const runtime::v1::PodSandboxConfig
+ }
+ }
+
+- // Step 11: Call sandbox start.
++ // Step 7.1.5: Call sandbox start.
+ sandbox->Start(error);
+ if (error.NotEmpty()) {
+ ERROR("Failed to start sandbox: %s", sandboxName.c_str());
+- // If start failed, sandbox should be NotReady, we cleanup network and delete sandbox in remove
+- return response_id;
+- }
+-
+- msg.type = CRI_CONTAINER_MESSAGE_TYPE_STARTED;
+- mailbox_publish(MAILBOX_TOPIC_CRI_CONTAINER, &msg);
+-
+-#ifdef ENABLE_NRI
+- if (!NRIAdaptation::GetInstance()->RunPodSandbox(sandbox, nriErr)) {
+- ERROR("NRI RunPodSandbox failed: %s", nriErr.GetCMessage());
+- error.Errorf("NRI RunPodSandbox failed: %s", nriErr.GetCMessage());
+- return response_id;
++ // If start failed, sandbox should be NotReady, we cleanup network, but delete sandbox in remove
++ goto cleanup_network;
+ }
+-#endif
+
+- return sandbox->GetId();
++ return;
+
+ cleanup_network:
+ if (namespace_is_cni(sandbox->GetNetMode().c_str())) {
+@@ -423,21 +459,115 @@ cleanup_network:
+ ClearCniNetwork(sandbox, clearErr);
+ if (clearErr.NotEmpty()) {
+ ERROR("Failed to clean cni network: %s", clearErr.GetCMessage());
++ return;
++ }
++ }
++}
++
++auto PodSandboxManagerService::RunPodSandbox(const runtime::v1::PodSandboxConfig &config,
++ const std::string &runtimeHandler, Errors &error) -> std::string
++{
++ std::string response_id;
++ std::string sandboxName;
++ sandbox::RuntimeInfo runtimeInfo;
++ std::string networkMode;
++ std::string sandboxKey;
++ std::string jsonCheckpoint;
++ runtime::v1::PodSandboxConfig copyConfig = config;
++ std::map<std::string, std::string> stdAnnos;
++ cri_container_message_t msg = { 0 };
++ std::shared_ptr<sandbox::Sandbox> sandbox;
++#ifdef ENABLE_NRI
++ Errors nriErr;
++#endif
++
++ // Step 1: Parepare sandbox name, runtime and networkMode
++ PrepareSandboxData(config, runtimeHandler, sandboxName, runtimeInfo, networkMode, error);
++ if (error.NotEmpty()) {
++ return response_id;
++ }
++
++ // Step 2: Pull the image for the sandbox.
++ // Maybe we should pull image in shim controller ?
++ // But pull image interface is only in CRI image service, and it can't be called in shim controller,
++ // so we pull image in CRI pod service.
++ const std::string &image = m_podSandboxImage;
++ if (!EnsureSandboxImageExists(image, runtimeInfo.sandboxer, error)) {
++ ERROR("Failed to pull sandbox image %s: %s", image.c_str(), error.NotEmpty() ? error.GetCMessage() : "");
++ error.Errorf("Failed to pull sandbox image %s: %s", image.c_str(), error.NotEmpty() ? error.GetCMessage() : "");
++ return response_id;
++ }
++
++ // Step 3: Prepare sandbox checkpoint
++ PrepareSandboxCheckpoint(config, jsonCheckpoint, error);
++ if (error.NotEmpty()) {
++ return response_id;
++ }
++
++ // Step 4: Update sandbox instance config
++ UpdateSandboxConfig(copyConfig, jsonCheckpoint, error);
++ if (error.NotEmpty()) {
++ return response_id;
++ }
++
++ // Step 5: Prepare sandboxKey and mount ns namespace
++ if (namespace_is_cni(networkMode.c_str())) {
++ // cleanup sandboxKey file in DeleteSandbox
++ PrepareSandboxKey(sandboxKey, error);
++ if (error.NotEmpty()) {
+ return response_id;
+ }
++ if (prepare_network_namespace(sandboxKey.c_str(), false, 0) != 0) {
++ error.Errorf("Failed to prepare network namespace: %s", sandboxKey.c_str());
++ ERROR("Failed to prepare network namespace: %s", sandboxKey.c_str());
++ goto clean_ns;
++ }
+ }
+
+-cleanup_sandbox:
+- sandbox::SandboxManager::GetInstance()->DeleteSandbox(sandbox->GetId(), error);
++ // Step 6: Create sandbox instance
++ sandbox = sandbox::SandboxManager::GetInstance()->CreateSandbox(sandboxName, runtimeInfo, sandboxKey,
++ networkMode, copyConfig, image, error);
++ if (error.NotEmpty()) {
++ goto clean_ns;
++ }
++
++ CRIHelpers::ProtobufAnnoMapToStd(sandbox->GetSandboxConfig().annotations(), stdAnnos);
++ // Step 7: According to the annotation and network namespace mode,
++ // determine the order of start sandbox and setup network.
++ // tips: clean sandbox and network in sub function.
++ if (CRIHelpers::SetupNetworkFirst(stdAnnos)) {
++ // Step 7.1: Setup networking for the sandbox, and then start the sandbox container.
++ SetupNetowrkAndStartPodSandbox(sandbox, sandboxName, networkMode, error);
++ } else {
++ // Step 7.2: (Default)Start the sandbox container, and then setup networking for the sandbox.
++ // why: Some kata multi-network plane plugins (such as configuring vfio device pass-through)
++ // need to be called after the pod is already running.
++ StartPodSandboxAndSetupNetowrk(sandbox, sandboxKey, sandboxName, networkMode, error);
++ }
+ if (error.NotEmpty()) {
+- ERROR("Failed to delete sandbox: %s", sandbox->GetId().c_str());
++ goto clean_ns;
+ }
++
++ msg.type = CRI_CONTAINER_MESSAGE_TYPE_STARTED;
++ mailbox_publish(MAILBOX_TOPIC_CRI_CONTAINER, &msg);
++
+ #ifdef ENABLE_NRI
+- if (!NRIAdaptation::GetInstance()->RemovePodSandbox(sandbox, nriErr)) {
+- DEBUG("NRI RemovePodSandbox failed: %s", nriErr.GetCMessage());
++ if (!NRIAdaptation::GetInstance()->RunPodSandbox(sandbox, nriErr)) {
++ ERROR("NRI RunPodSandbox failed: %s", nriErr.GetCMessage());
++ error.Errorf("NRI RunPodSandbox failed: %s", nriErr.GetCMessage());
++ return response_id;
+ }
+ #endif
+
++ return sandbox->GetId();
++clean_ns:
++ if (namespace_is_cni(networkMode.c_str())) {
++ // umount netns when prepare runp failed
++ if (remove_network_namespace(sandboxKey.c_str()) != 0) {
++ SYSERROR("Failed to umount directory %s", sandboxKey.c_str());
++ }
++ (void)remove_network_namespace_file(sandboxKey.c_str());
++ }
+ return response_id;
+ }
+
+diff --git a/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.h b/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.h
+index b02216c0..01d06624 100644
+--- a/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.h
++++ b/src/daemon/entry/cri/v1/v1_cri_pod_sandbox_manager_service.h
+@@ -86,6 +86,9 @@ private:
+ void UpdateSandboxConfig(runtime::v1::PodSandboxConfig &config, std::string &jsonCheckpoint, Errors &error);
+ void SetupSandboxFiles(const std::string &resolvPath, const runtime::v1::PodSandboxConfig &config,
+ Errors &error);
++ void GenerateNetworkSetting(std::string &sandboxKey, std::string &network_setting_json, Errors &error);
++ void StartPodSandboxAndSetupNetowrk(std::shared_ptr<sandbox::Sandbox> sandbox, std::string &sandboxKey, std::string &sandboxName, std::string &networkMode, Errors &error);
++ void SetupNetowrkAndStartPodSandbox(std::shared_ptr<sandbox::Sandbox> sandbox, std::string &sandboxName, std::string &networkMode, Errors &error);
+ void SetupSandboxNetwork(const std::shared_ptr<sandbox::Sandbox> sandbox, std::string &network_settings_json,
+ Errors &error);
+ void ClearCniNetwork(const std::shared_ptr<sandbox::Sandbox> sandbox, Errors &error);
+--
+2.34.1
+