1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/src-openeuler-iSulad

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
0151-sandbox-sandbox-api-update.patch 59 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
liuxu Отправлено 25.11.2024 11:34 471309a
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600
From b994e99a4188bef549e5fa1f944eb3546be43201 Mon Sep 17 00:00:00 2001
From: liuxu <liuxu156@huawei.com>
Date: Wed, 18 Sep 2024 11:40:15 +0800
Subject: [PATCH 151/156] sandbox:sandbox api update
Signed-off-by: liuxu <liuxu156@huawei.com>
---
cmake/protoc.cmake | 1 +
src/api/services/sandbox/sandbox.proto | 107 +++---
.../sandbox/sandbox/types/metrics.proto | 30 ++
.../sandbox/sandbox/types/platform.proto | 3 +-
.../sandbox/sandbox/types/sandbox.proto | 15 +-
src/daemon/sandbox/controller/controller.h | 12 +-
.../sandboxer/client/grpc_sandboxer_client.cc | 111 ++----
.../sandboxer/client/grpc_sandboxer_client.h | 18 +-
.../sandboxer/sandboxer_controller.cc | 19 +-
.../sandboxer/sandboxer_controller.h | 9 +-
.../controller/shim/shim_controller.cc | 11 +-
.../sandbox/controller/shim/shim_controller.h | 9 +-
src/daemon/sandbox/sandbox.cc | 221 +++++++++++-
src/daemon/sandbox/sandbox.h | 24 ++
src/daemon/sandbox/sandbox_ops.cc | 333 ++++++++++++++----
src/daemon/sandbox/sandbox_task.cc | 99 ++++++
src/daemon/sandbox/sandbox_task.h | 48 +++
17 files changed, 808 insertions(+), 262 deletions(-)
create mode 100644 src/api/services/sandbox/sandbox/types/metrics.proto
create mode 100644 src/daemon/sandbox/sandbox_task.cc
create mode 100644 src/daemon/sandbox/sandbox_task.h
diff --git a/cmake/protoc.cmake b/cmake/protoc.cmake
index 6e2d1b84..6343fe3e 100644
--- a/cmake/protoc.cmake
+++ b/cmake/protoc.cmake
@@ -72,6 +72,7 @@ if (ENABLE_CRI_API_V1 AND ENABLE_SANDBOXER)
PROTOC_CPP_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox/types/sandbox.proto)
PROTOC_CPP_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox/types/mount.proto)
PROTOC_CPP_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox/types/platform.proto)
+ PROTOC_CPP_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox/types/metrics.proto)
PROTOC_CPP_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox.proto)
PROTOC_GRPC_GEN(sandbox ${SANDBOX_PROTOS_OUT_PATH} ${PROTOS_PATH}/sandbox/sandbox.proto)
endif()
diff --git a/src/api/services/sandbox/sandbox.proto b/src/api/services/sandbox/sandbox.proto
index 87c7e27c..dcc78444 100644
--- a/src/api/services/sandbox/sandbox.proto
+++ b/src/api/services/sandbox/sandbox.proto
@@ -31,6 +31,7 @@ import "google/protobuf/timestamp.proto";
import "sandbox/types/sandbox.proto";
import "sandbox/types/mount.proto";
import "sandbox/types/platform.proto";
+import "sandbox/types/metrics.proto";
option go_package = "github.com/containerd/containerd/api/services/sandbox/v1;sandbox";
@@ -89,21 +90,22 @@ service Controller {
rpc Create(ControllerCreateRequest) returns (ControllerCreateResponse);
rpc Start(ControllerStartRequest) returns (ControllerStartResponse);
rpc Platform(ControllerPlatformRequest) returns (ControllerPlatformResponse);
- rpc Prepare(PrepareRequest) returns (PrepareResponse);
- rpc Purge(PurgeRequest) returns (PurgeResponse);
- rpc UpdateResources(UpdateResourcesRequest) returns (UpdateResourcesResponse);
rpc Stop(ControllerStopRequest) returns (ControllerStopResponse);
rpc Wait(ControllerWaitRequest) returns (ControllerWaitResponse);
rpc Status(ControllerStatusRequest) returns (ControllerStatusResponse);
rpc Shutdown(ControllerShutdownRequest) returns (ControllerShutdownResponse);
+ rpc Metrics(ControllerMetricsRequest) returns (ControllerMetricsResponse);
+ rpc Update(ControllerUpdateRequest) returns (ControllerUpdateResponse);
}
message ControllerCreateRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- repeated containerd.types.Mount rootfs = 3;
- google.protobuf.Any options = 4;
- string netns_path = 5;
+ string sandbox_id = 1;
+ repeated containerd.types.Mount rootfs = 2;
+ google.protobuf.Any options = 3;
+ string netns_path = 4;
+ map<string, string> annotations = 5;
+ containerd.types.Sandbox sandbox = 6;
+ string sandboxer = 10;
}
message ControllerCreateResponse {
@@ -111,8 +113,8 @@ message ControllerCreateResponse {
}
message ControllerStartRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
+ string sandbox_id = 1;
+ string sandboxer = 10;
}
message ControllerStartResponse {
@@ -120,12 +122,16 @@ message ControllerStartResponse {
uint32 pid = 2;
google.protobuf.Timestamp created_at = 3;
map<string, string> labels = 4;
- string task_address = 5;
+ // Address of the sandbox for containerd to connect,
+ // for calling Task or other APIs serving in the sandbox.
+ // it is in the form of ttrpc+unix://path/to/uds or grpc+vsock://<vsock cid>:<port>.
+ string address = 5;
+ uint32 version = 6;
}
message ControllerPlatformRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
+ string sandbox_id = 1;
+ string sandboxer = 10;
}
message ControllerPlatformResponse {
@@ -133,16 +139,16 @@ message ControllerPlatformResponse {
}
message ControllerStopRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- uint32 timeout_secs = 3;
+ string sandbox_id = 1;
+ uint32 timeout_secs = 2;
+ string sandboxer = 10;
}
message ControllerStopResponse {}
message ControllerWaitRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
+ string sandbox_id = 1;
+ string sandboxer = 10;
}
message ControllerWaitResponse {
@@ -151,61 +157,48 @@ message ControllerWaitResponse {
}
message ControllerStatusRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- bool verbose = 3;
+ string sandbox_id = 1;
+ bool verbose = 2;
+ string sandboxer = 10;
}
message ControllerStatusResponse {
string sandbox_id = 1;
uint32 pid = 2;
string state = 3;
- string task_address = 4;
- map<string, string> info = 5;
- google.protobuf.Timestamp created_at = 6;
- google.protobuf.Timestamp exited_at = 7;
- google.protobuf.Any extra = 8;
+ map<string, string> info = 4;
+ google.protobuf.Timestamp created_at = 5;
+ google.protobuf.Timestamp exited_at = 6;
+ google.protobuf.Any extra = 7;
+ // Address of the sandbox for containerd to connect,
+ // for calling Task or other APIs serving in the sandbox.
+ // it is in the form of ttrpc+unix://path/to/uds or grpc+vsock://<vsock cid>:<port>.
+ string address = 8;
+ uint32 version = 9;
}
message ControllerShutdownRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
+ string sandbox_id = 1;
+ string sandboxer = 10;
}
message ControllerShutdownResponse {}
-message PrepareRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- string container_id = 3;
- string exec_id = 4;
- google.protobuf.Any spec = 5;
- repeated containerd.types.Mount rootfs = 6;
- string stdin = 7;
- string stdout = 8;
- string stderr = 9;
- bool terminal = 10;
-}
-
-message PrepareResponse {
- string bundle = 1;
+message ControllerMetricsRequest {
+ string sandbox_id = 1;
+ string sandboxer = 10;
}
-message PurgeRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- string container_id = 3;
- string exec_id = 4;
+message ControllerMetricsResponse {
+ types.Metric metrics = 1;
}
-message PurgeResponse {}
-
-message UpdateResourcesRequest {
- string sandboxer = 1;
- string sandbox_id = 2;
- string container_id = 3;
- google.protobuf.Any resources = 4;
- map<string, string> annotations = 5;
+message ControllerUpdateRequest {
+ string sandbox_id = 1;
+ string sandboxer = 2;
+ containerd.types.Sandbox sandbox = 3;
+ repeated string fields = 4;
}
-message UpdateResourcesResponse {}
+message ControllerUpdateResponse {
+}
\ No newline at end of file
diff --git a/src/api/services/sandbox/sandbox/types/metrics.proto b/src/api/services/sandbox/sandbox/types/metrics.proto
new file mode 100644
index 00000000..61185939
--- /dev/null
+++ b/src/api/services/sandbox/sandbox/types/metrics.proto
@@ -0,0 +1,30 @@
+/*
+ Copyright The containerd Authors.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+syntax = "proto3";
+
+package containerd.types;
+
+import "google/protobuf/any.proto";
+import "google/protobuf/timestamp.proto";
+
+option go_package = "github.com/containerd/containerd/api/types;types";
+
+message Metric {
+ google.protobuf.Timestamp timestamp = 1;
+ string id = 2;
+ google.protobuf.Any data = 3;
+}
\ No newline at end of file
diff --git a/src/api/services/sandbox/sandbox/types/platform.proto b/src/api/services/sandbox/sandbox/types/platform.proto
index b6088251..102e6e2b 100644
--- a/src/api/services/sandbox/sandbox/types/platform.proto
+++ b/src/api/services/sandbox/sandbox/types/platform.proto
@@ -26,4 +26,5 @@ message Platform {
string os = 1;
string architecture = 2;
string variant = 3;
-}
+ string os_version = 4;
+}
\ No newline at end of file
diff --git a/src/api/services/sandbox/sandbox/types/sandbox.proto b/src/api/services/sandbox/sandbox/types/sandbox.proto
index 7b9d196b..6fe08d40 100644
--- a/src/api/services/sandbox/sandbox/types/sandbox.proto
+++ b/src/api/services/sandbox/sandbox/types/sandbox.proto
@@ -40,14 +40,15 @@ message Sandbox {
// Spec is sandbox configuration (kin of OCI runtime spec), spec's data will be written to a config.json file in the
// bundle directory (similary to OCI spec).
google.protobuf.Any spec = 3;
- // Sandboxer is the name of the sandbox controller who manages the sandbox.
- string sandboxer = 4;
// Labels provides an area to include arbitrary data on containers.
- map<string, string> labels = 5;
+ map<string, string> labels = 4;
// CreatedAt is the time the container was first created.
- google.protobuf.Timestamp created_at = 6;
+ google.protobuf.Timestamp created_at = 5;
// UpdatedAt is the last time the container was mutated.
- google.protobuf.Timestamp updated_at = 7;
+ google.protobuf.Timestamp updated_at = 6;
// Extensions allow clients to provide optional blobs that can be handled by runtime.
- map<string, google.protobuf.Any> extensions = 8;
-}
+ map<string, google.protobuf.Any> extensions = 7;
+ // Sandboxer is the name of the sandbox controller who manages the sandbox.
+ string sandboxer = 10;
+
+}
\ No newline at end of file
diff --git a/src/daemon/sandbox/controller/controller.h b/src/daemon/sandbox/controller/controller.h
index 9ad45855..60d2dee5 100644
--- a/src/daemon/sandbox/controller/controller.h
+++ b/src/daemon/sandbox/controller/controller.h
@@ -24,6 +24,7 @@
#include "errors.h"
#include "api_v1.pb.h"
+#include "sandbox.pb.h"
namespace sandbox {
@@ -65,6 +66,7 @@ struct ControllerSandboxInfo {
uint32_t pid;
uint64_t createdAt;
std::string taskAddress;
+ std::string version;
google::protobuf::Map<std::string, std::string> labels;
};
@@ -78,6 +80,7 @@ struct ControllerSandboxStatus {
uint32_t pid;
std::string state;
std::string taskAddress;
+ std::string version;
google::protobuf::Map<std::string, std::string> info;
uint64_t createdAt;
uint64_t exitedAt;
@@ -123,11 +126,10 @@ public:
Errors &error) = 0;
virtual std::unique_ptr<ControllerSandboxInfo> Start(const std::string &sandboxId, Errors &error) = 0 ;
virtual std::unique_ptr<ControllerPlatformInfo> Platform(const std::string &sandboxId, Errors &error) = 0;
- virtual std::string Prepare(const std::string &sandboxId,
- const ControllerPrepareParams &params,
- Errors &error) = 0;
- virtual bool Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error) = 0;
+ virtual bool Prepare(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) = 0;
+ virtual bool Purge(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) = 0;
virtual bool UpdateResources(const std::string &sandboxId,
const ControllerUpdateResourcesParams &params,
Errors &error) = 0;
diff --git a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.cc b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.cc
index 11c2b014..e042ad45 100644
--- a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.cc
+++ b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.cc
@@ -74,6 +74,7 @@ auto SandboxerClient::InitCreateRequest(containerd::services::sandbox::v1::Contr
}
}
request.set_netns_path(params.netNSPath);
+ // The arg sandbox is useless for now
return true;
}
@@ -117,7 +118,8 @@ void SandboxerClient::StartResponseToSandboxInfo(const containerd::services::san
sandboxInfo.id = response.sandbox_id();
sandboxInfo.pid = response.pid();
sandboxInfo.createdAt = TimestampToNanos(response.created_at());
- sandboxInfo.taskAddress = response.task_address();
+ sandboxInfo.taskAddress = response.address();
+ sandboxInfo.version = response.version();
sandboxInfo.labels = response.labels();
}
@@ -144,53 +146,27 @@ auto SandboxerClient::Start(const std::string &sandboxId, ControllerSandboxInfo
return true;
}
-auto SandboxerClient::InitPrepareRequest(containerd::services::sandbox::v1::PrepareRequest &request,
- const std::string &sandboxId, const ControllerPrepareParams &params) -> bool
+void SandboxerClient::InitUpdateRequest(containerd::services::sandbox::v1::ControllerUpdateRequest &request,
+ containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields)
{
- if (params.spec == nullptr) {
- ERROR("Sandboxer controller prepare request failed, spec is null");
- return false;
- }
- request.mutable_spec()->set_value(*(params.spec));
- request.set_sandboxer(m_sandboxer);
- request.set_sandbox_id(sandboxId);
- request.set_container_id(params.containerId);
- request.set_exec_id(params.execId);
- for (const auto &entry : params.rootfs) {
- if (entry != nullptr) {
- Mount* mount = request.add_rootfs();
- InitMountInfo(*mount, *entry);
- }
- }
- if (params.streamInfo != nullptr) {
- request.set_stdin(params.streamInfo->stdin);
- request.set_stdout(params.streamInfo->stdout);
- request.set_stderr(params.streamInfo->stderr);
- request.set_terminal(params.streamInfo->terminal);
- } else {
- request.set_stdin("");
- request.set_stdout("");
- request.set_stderr("");
- request.set_terminal(false);
- }
-
- return true;
+ request.set_sandbox_id(apiSandbox.sandbox_id());
+ request.set_sandboxer(apiSandbox.sandboxer());
+ *(request.mutable_sandbox()) = apiSandbox;
+ *(request.mutable_fields()) = {fields.begin(), fields.end()};
}
-auto SandboxerClient::Prepare(const std::string &sandboxId, const ControllerPrepareParams &params, std::string &bundle,
- Errors &error) -> bool
+auto SandboxerClient::Prepare(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) -> bool
{
grpc::ClientContext context;
- containerd::services::sandbox::v1::PrepareRequest request;
- containerd::services::sandbox::v1::PrepareResponse response;
+ containerd::services::sandbox::v1::ControllerUpdateRequest request;
+ containerd::services::sandbox::v1::ControllerUpdateResponse response;
grpc::Status status;
- if (!InitPrepareRequest(request, sandboxId, params)) {
- error.SetError("Failed to init prepare request for sandboxer prepare request, sandbox id: " + sandboxId);
- return false;
- }
+ InitUpdateRequest(request, apiSandbox, fields);
- status = m_stub->Prepare(&context, request, &response);
+ status = m_stub->Update(&context, request, &response);
if (!status.ok()) {
error.SetError(status.error_message());
ERROR("Sandboxer controller prepare request failed, error_code: %d: %s", status.error_code(),
@@ -198,25 +174,20 @@ auto SandboxerClient::Prepare(const std::string &sandboxId, const ControllerPrep
return false;
}
- bundle = response.bundle();
-
return true;
}
-auto SandboxerClient::Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error) -> bool
+auto SandboxerClient::Purge(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) -> bool
{
grpc::ClientContext context;
- containerd::services::sandbox::v1::PurgeRequest request;
- containerd::services::sandbox::v1::PurgeResponse response;
+ containerd::services::sandbox::v1::ControllerUpdateRequest request;
+ containerd::services::sandbox::v1::ControllerUpdateResponse response;
grpc::Status status;
- request.set_sandboxer(m_sandboxer);
- request.set_sandbox_id(sandboxId);
- request.set_container_id(containerId);
- request.set_exec_id(execId);
+ InitUpdateRequest(request, apiSandbox, fields);
- status = m_stub->Purge(&context, request, &response);
+ status = m_stub->Update(&context, request, &response);
if (!status.ok()) {
error.SetError(status.error_message());
ERROR("Sandboxer controller purge request failed, error_code: %d: %s", status.error_code(),
@@ -227,44 +198,9 @@ auto SandboxerClient::Purge(const std::string &sandboxId, const std::string &con
return true;
}
-auto SandboxerClient::InitUpdateResourcesRequest(containerd::services::sandbox::v1::UpdateResourcesRequest &request,
- const std::string &sandboxId,
- const ControllerUpdateResourcesParams &params) -> bool
-{
- if (params.resources == nullptr) {
- ERROR("Sandboxer controller update resources request failed, resources is null");
- return false;
- }
- request.mutable_resources()->set_value(*(params.resources));
- request.set_sandboxer(m_sandboxer);
- request.set_sandbox_id(sandboxId);
- request.set_container_id(params.containerId);
- request.mutable_annotations()->insert(params.annotations.begin(), params.annotations.end());
- return true;
-}
-
auto SandboxerClient::UpdateResources(const std::string &sandboxId, const ControllerUpdateResourcesParams &params,
Errors &error) -> bool
{
- grpc::ClientContext context;
- containerd::services::sandbox::v1::UpdateResourcesRequest request;
- containerd::services::sandbox::v1::UpdateResourcesResponse response;
- grpc::Status status;
-
- if (!InitUpdateResourcesRequest(request, sandboxId, params)) {
- error.SetError("Failed to init update-resources request for sandboxer update-resources request, sandbox id: " +
- sandboxId);
- return false;
- }
-
- status = m_stub->UpdateResources(&context, request, &response);
- if (!status.ok()) {
- error.SetError(status.error_message());
- ERROR("Sandboxer controller update resources request failed, error_code: %d: %s", status.error_code(),
- status.error_message().c_str());
- return false;
- }
-
return true;
}
@@ -331,7 +267,8 @@ void SandboxerClient::StatusResponseToSandboxStatus(const containerd::services::
sandboxStatus.id = response.sandbox_id();
sandboxStatus.pid = response.pid();
sandboxStatus.state = response.state();
- sandboxStatus.taskAddress = response.task_address();
+ sandboxStatus.taskAddress = response.address();
+ sandboxStatus.version = response.version();
sandboxStatus.info.insert(response.info().begin(), response.info().end());
sandboxStatus.createdAt = TimestampToNanos(response.created_at());
sandboxStatus.exitedAt = TimestampToNanos(response.exited_at());
diff --git a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.h b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.h
index accca16b..eeb5d7f2 100644
--- a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.h
+++ b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_client.h
@@ -48,11 +48,11 @@ public:
auto Platform(const std::string &sandboxId, ControllerPlatformInfo &platformInfo, Errors &error) -> bool;
- auto Prepare(const std::string &sandboxId, const ControllerPrepareParams &params, std::string &bundle,
- Errors &error) -> bool;
+ auto Prepare(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) -> bool;
- auto Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error) -> bool;
+ auto Purge(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error) -> bool;
auto UpdateResources(const std::string &sandboxId, const ControllerUpdateResourcesParams &params,
Errors &error) -> bool;
@@ -72,11 +72,11 @@ private:
const ControllerCreateParams &params) -> bool;
void StartResponseToSandboxInfo(const containerd::services::sandbox::v1::ControllerStartResponse &response,
ControllerSandboxInfo &sandboxInfo);
- auto InitPrepareRequest(containerd::services::sandbox::v1::PrepareRequest &request,
- const std::string &sandboxId, const ControllerPrepareParams &params) -> bool;
- auto InitUpdateResourcesRequest(containerd::services::sandbox::v1::UpdateResourcesRequest &request,
- const std::string &sandboxId,
- const ControllerUpdateResourcesParams &params) -> bool;
+ void InitUpdateRequest(containerd::services::sandbox::v1::ControllerUpdateRequest &request,
+ containerd::types::Sandbox &apiSandbox, std::vector<std::string> &fields);
+ // auto InitUpdateResourcesRequest(containerd::services::sandbox::v1::UpdateResourcesRequest &request,
+ // const std::string &sandboxId,
+ // const ControllerUpdateResourcesParams &params) -> bool;
void PlatformResponseToPlatformInfo(const containerd::services::sandbox::v1::ControllerPlatformResponse &response,
ControllerPlatformInfo &platformInfo);
void StatusResponseToSandboxStatus(const containerd::services::sandbox::v1::ControllerStatusResponse &response,
diff --git a/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.cc b/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.cc
index d35f1118..70cab015 100644
--- a/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.cc
+++ b/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.cc
@@ -61,21 +61,18 @@ std::unique_ptr<ControllerPlatformInfo> SandboxerController::Platform(const std:
return platformInfo;
}
-std::string SandboxerController::Prepare(const std::string &sandboxId,
- const ControllerPrepareParams &params,
- Errors &error)
+bool SandboxerController::Prepare(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields,
+ Errors &error)
{
- std::string bundle;
- if (!m_client->Prepare(sandboxId, params, bundle, error)) {
- return "";
- }
- return bundle;
+ return m_client->Prepare(apiSandbox, fields, error);
}
-bool SandboxerController::Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error)
+bool SandboxerController::Purge(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields,
+ Errors &error)
{
- return m_client->Purge(sandboxId, containerId, execId, error);
+ return m_client->Purge(apiSandbox, fields, error);
}
bool SandboxerController::UpdateResources(const std::string &sandboxId,
diff --git a/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.h b/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.h
index ff66d3d8..8cb7fe7c 100644
--- a/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.h
+++ b/src/daemon/sandbox/controller/sandboxer/sandboxer_controller.h
@@ -37,11 +37,10 @@ public:
Errors &error) override;
std::unique_ptr<ControllerSandboxInfo> Start(const std::string &sandboxId, Errors &error) override;
std::unique_ptr<ControllerPlatformInfo> Platform(const std::string &sandboxId, Errors &error) override;
- std::string Prepare(const std::string &sandboxId,
- const ControllerPrepareParams &params,
- Errors &error) override;
- bool Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error) override;
+ bool Prepare(containerd::types::Sandbox &apiSandbox, std::vector<std::string> &fields,
+ Errors &error) override;
+ bool Purge(containerd::types::Sandbox &apiSandbox, std::vector<std::string> &fields,
+ Errors &error) override;
bool UpdateResources(const std::string &sandboxId,
const ControllerUpdateResourcesParams &params,
Errors &error) override;
diff --git a/src/daemon/sandbox/controller/shim/shim_controller.cc b/src/daemon/sandbox/controller/shim/shim_controller.cc
index ce09c076..14c99168 100644
--- a/src/daemon/sandbox/controller/shim/shim_controller.cc
+++ b/src/daemon/sandbox/controller/shim/shim_controller.cc
@@ -340,15 +340,14 @@ std::unique_ptr<ControllerPlatformInfo> ShimController::Platform(const std::stri
return nullptr;
}
-std::string ShimController::Prepare(const std::string &sandboxId,
- const ControllerPrepareParams &params,
- Errors &error)
+bool ShimController::Prepare(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error)
{
- return std::string("");
+ return true;
}
-bool ShimController::Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error)
+bool ShimController::Purge(containerd::types::Sandbox &apiSandbox,
+ std::vector<std::string> &fields, Errors &error)
{
return true;
}
diff --git a/src/daemon/sandbox/controller/shim/shim_controller.h b/src/daemon/sandbox/controller/shim/shim_controller.h
index 5d097bac..1985ddc0 100644
--- a/src/daemon/sandbox/controller/shim/shim_controller.h
+++ b/src/daemon/sandbox/controller/shim/shim_controller.h
@@ -45,11 +45,10 @@ public:
Errors &error) override;
std::unique_ptr<ControllerSandboxInfo> Start(const std::string &sandboxId, Errors &error) override;
std::unique_ptr<ControllerPlatformInfo> Platform(const std::string &sandboxId, Errors &error) override;
- std::string Prepare(const std::string &sandboxId,
- const ControllerPrepareParams &params,
- Errors &error) override;
- bool Purge(const std::string &sandboxId, const std::string &containerId,
- const std::string &execId, Errors &error) override;
+ bool Prepare(containerd::types::Sandbox &apiSandbox, std::vector<std::string> &fields,
+ Errors &error) override;
+ bool Purge(containerd::types::Sandbox &apiSandbox, std::vector<std::string> &fields,
+ Errors &error) override;
bool UpdateResources(const std::string &sandboxId,
const ControllerUpdateResourcesParams &params,
Errors &error) override;
diff --git a/src/daemon/sandbox/sandbox.cc b/src/daemon/sandbox/sandbox.cc
index dec082bc..97b77f22 100644
--- a/src/daemon/sandbox/sandbox.cc
+++ b/src/daemon/sandbox/sandbox.cc
@@ -494,6 +494,7 @@ auto Sandbox::Load(Errors &error) -> bool
}
LoadNetworkSetting();
+ LoadSandboxTasks();
// When the sandbox status acquisition fails or wait fails, the sandbox status is set to not ready,
// and the user decides whether to delete the sandbox.
@@ -698,6 +699,7 @@ auto Sandbox::Start(Errors &error) -> bool
m_state.pid = info->pid;
m_state.createdAt = info->createdAt;
m_taskAddress = info->taskAddress;
+ m_version = info->version;
m_state.status = SANDBOX_STATUS_RUNNING;
if (!SaveState(error)) {
@@ -814,7 +816,7 @@ void Sandbox::Status(runtime::v1::PodSandboxStatus &status)
auto Sandbox::GenerateSandboxStateJson(sandbox_state *state) -> std::string
{
- __isula_auto_free parser_error error;
+ __isula_auto_free parser_error error = NULL;
std::string ret;
__isula_auto_free char *state_json = NULL;
state_json = sandbox_state_generate_json(state, NULL, &(error));
@@ -874,7 +876,7 @@ auto Sandbox::SaveNetworkSetting(Errors &error) -> bool
auto Sandbox::GenerateSandboxMetadataJson(sandbox_metadata *metadata) -> std::string
{
- __isula_auto_free parser_error error;
+ __isula_auto_free parser_error error = NULL;
std::string ret;
__isula_auto_free char *metadata_json = NULL;
metadata_json = sandbox_metadata_generate_json(metadata, NULL, &(error));
@@ -1096,6 +1098,11 @@ auto Sandbox::GetNetworkSettingsPath() -> std::string
return m_rootdir + std::string("/") + NETWORK_SETTINGS_JSON;
}
+auto Sandbox::GetTasksJsonPath() -> std::string
+{
+ return m_rootdir + std::string("/") + SANDBOX_TASKS_JSON;
+}
+
void Sandbox::FillSandboxMetadata(sandbox_metadata* metadata, Errors &error)
{
std::string jsonStr;
@@ -1116,4 +1123,214 @@ void Sandbox::FillSandboxMetadata(sandbox_metadata* metadata, Errors &error)
metadata->sandbox_config_json = util_strdup_s(jsonStr.c_str());
}
+
+auto Sandbox::AddTaskById(const char *task_id, sandbox_task *task) -> bool
+{
+
+ std::string taskId = std::string(task_id);
+ auto iter = m_tasks.find(taskId);
+
+ if (iter != m_tasks.end()) {
+ ERROR("Failed to add exits sandbox task %s for sandbox: %s",
+ task_id, m_id.c_str());
+ return false;
+ }
+ m_tasks[taskId] = std::make_shared<SandboxTask>(task);
+ return true;
+}
+
+auto Sandbox::ReadSandboxTasksJson() -> sandbox_tasks *
+{
+ const std::string path = GetTasksJsonPath();
+ __isula_auto_free parser_error err = nullptr;
+ sandbox_tasks *tasksArray = nullptr;
+
+ ReadGuard<RWMutex> lock(m_tasksMutex);
+ tasksArray = sandbox_tasks_parse_file(path.c_str(), nullptr, &err);
+ if (tasksArray == nullptr) {
+ WARN("Failed to read %s tasks json: %s", path.c_str(), err);
+ }
+ return tasksArray;
+}
+
+auto Sandbox::WriteSandboxTasksJson(std::string &tasks_json) -> bool
+{
+ int nret = 0;
+ const std::string path = GetTasksJsonPath();
+
+ WriteGuard<RWMutex> lock(m_tasksMutex);
+ nret = util_atomic_write_file(path.c_str(), tasks_json.c_str(), tasks_json.size(), CONFIG_FILE_MODE, false);
+ if (nret != 0) {
+ SYSERROR("Failed to write file %s", path.c_str());
+ }
+ return nret == 0;
+}
+
+auto Sandbox::DeleteSandboxTasksJson() -> bool
+{
+ int get_err = 0;
+ const std::string path = GetTasksJsonPath();
+
+ WriteGuard<RWMutex> lock(m_tasksMutex);
+ if (util_fileself_exists(path.c_str()) &&
+ !util_force_remove_file(path.c_str(), &get_err)) {
+ errno = get_err;
+ SYSERROR("Failed to remove file %s", path.c_str());
+ return false;
+ }
+
+ return true;
+}
+
+void Sandbox::AddSandboxTasksByArray(sandbox_tasks *tasksArray)
+{
+ size_t i;
+
+ WriteGuard<RWMutex> lock(m_tasksMutex);
+ for (i = 0; i < tasksArray->tasks_len; i++) {
+ if (!AddTaskById(tasksArray->tasks[i]->task_id, tasksArray->tasks[i])) {
+ return;
+ }
+ tasksArray->tasks[i] = nullptr;
+ }
+ tasksArray->tasks_len = 0;
+}
+
+void Sandbox::LoadSandboxTasks()
+{
+ sandbox_tasks *tasksArray = nullptr;
+
+ tasksArray = ReadSandboxTasksJson();
+ if (tasksArray == nullptr) {
+ return;
+ }
+
+ AddSandboxTasksByArray(tasksArray);
+
+ free_sandbox_tasks(tasksArray);
+}
+
+auto Sandbox::SaveSandboxTasks() -> bool
+{
+ std::string tasks_json;
+
+ if (m_tasks.empty()) {
+ return DeleteSandboxTasksJson();
+ }
+
+ tasks_json = GetAnySandboxTasks();
+ if (tasks_json.empty()) {
+ ERROR("Failed to get sandbox tasks json for sandbox: '%s'", m_id.c_str());
+ return false;
+ }
+
+ return WriteSandboxTasksJson(tasks_json);
+}
+
+auto Sandbox::AddSandboxTasks(sandbox_task *task) -> bool
+{
+ if (task == nullptr) {
+ return true;
+ }
+ if (task->task_id == nullptr) {
+ return false;
+ }
+
+ WriteGuard<RWMutex> lock(m_tasksMutex);
+
+ return AddTaskById(task->task_id, task);
+}
+
+auto Sandbox::GetAnySandboxTasks() -> std::string
+{
+ __isula_auto_free parser_error err = nullptr;
+ sandbox_tasks tasksArray = { 0 };
+ size_t i = 0;
+ __isula_auto_free char *tasks_json = nullptr;
+
+ tasksArray.tasks = (sandbox_task **)util_smart_calloc_s(sizeof(sandbox_task *), m_tasks.size());
+ if (tasksArray.tasks == nullptr) {
+ SYSERROR("Out of memory.");
+ return std::string("");
+ }
+
+ ReadGuard<RWMutex> lock(m_tasksMutex);
+ for (auto const& [_, val] : m_tasks) {
+ /*
+ * We ignore that the processes are modified
+ * when we generate tasks json string.
+ * Because no matter whether a process is deleted or added,
+ * the Update of sandbox api will be called eventually.
+ *
+ * And we ignore that the task is freed after we do GetTask().
+ * Because the only way to free task is DeleteSandboxTasks()
+ * which needs write lock of m_tasksMutex.
+ */
+ tasksArray.tasks[i] = val->GetTask();
+ i++;
+ }
+ tasksArray.tasks_len = m_tasks.size();
+
+ tasks_json = sandbox_tasks_generate_json(&tasksArray, nullptr, &(err));
+ if (tasks_json == nullptr || strlen(tasks_json) == 0) {
+ ERROR("Failed to get sandbox tasks json for sandbox: '%s'", m_id.c_str());
+ free(tasksArray.tasks);
+ return std::string("");
+ }
+
+ free(tasksArray.tasks);
+ return std::string(tasks_json);
+}
+
+void Sandbox::DeleteSandboxTasks(const char *containerId)
+{
+ if (containerId == nullptr) {
+ return;
+ }
+
+ std::string taskId = std::string(containerId);
+
+ WriteGuard<RWMutex> lock(m_tasksMutex);
+ auto iter = m_tasks.find(taskId);
+ if (iter == m_tasks.end()) {
+ return;
+ }
+ m_tasks.erase(iter);
+}
+
+auto Sandbox::AddSandboxTasksProcess(const char *containerId, sandbox_process *processes) -> bool
+{
+ if (containerId == nullptr || processes == nullptr) {
+ ERROR("Empty args.");
+ return false;
+ }
+
+ std::string taskId = std::string(containerId);
+
+ ReadGuard<RWMutex> lock(m_tasksMutex);
+ auto iter = m_tasks.find(taskId);
+ if (iter == m_tasks.end()) {
+ SYSERROR("Failed to find container %s", containerId);
+ return false;
+ }
+
+ return iter->second->AddSandboxTasksProcess(processes);
+}
+
+void Sandbox::DeleteSandboxTasksProcess(const char *containerId, const char *execId)
+{
+ if (containerId == nullptr || execId == nullptr) {
+ return;
+ }
+
+ std::string taskId = std::string(containerId);
+
+ ReadGuard<RWMutex> lock(m_tasksMutex);
+ auto iter = m_tasks.find(taskId);
+ if (iter == m_tasks.end()) {
+ return;
+ }
+ iter->second->DeleteSandboxTasksProcess(execId);
+}
+
}
\ No newline at end of file
diff --git a/src/daemon/sandbox/sandbox.h b/src/daemon/sandbox/sandbox.h
index 42fbee2a..437b6113 100644
--- a/src/daemon/sandbox/sandbox.h
+++ b/src/daemon/sandbox/sandbox.h
@@ -30,12 +30,14 @@
#include "controller_manager.h"
#include "cstruct_wrapper.h"
#include "read_write_lock.h"
+#include "sandbox_task.h"
namespace sandbox {
const std::string SANDBOX_METADATA_JSON = "sandbox_metadata.json";
const std::string SANDBOX_STATE_JSON = "sandbox_state.json";
const std::string NETWORK_SETTINGS_JSON = "network_settings.json";
+const std::string SANDBOX_TASKS_JSON = "sandbox_tasks.json";
// Keep consistent with the default values set in containerd and cri-o.
const uint32_t DEFAULT_STOP_TIMEOUT = 10;
@@ -138,6 +140,15 @@ public:
auto Remove(Errors &error) -> bool;
void Status(runtime::v1::PodSandboxStatus &status);
+ // for sandbox api update
+ void LoadSandboxTasks();
+ 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);
+
private:
auto SaveState(Errors &error) -> bool;
auto SaveMetadata(Errors &error) -> bool;
@@ -161,6 +172,7 @@ private:
auto GetMetadataJsonPath() -> std::string;
auto GetStatePath() -> std::string;
auto GetNetworkSettingsPath() -> std::string;
+ auto GetTasksJsonPath() -> std::string;
void FillSandboxState(sandbox_state *state);
void FillSandboxMetadata(sandbox_metadata* metadata, Errors &error);
@@ -177,6 +189,12 @@ private:
void updateSelinuxLabels(std::string &selinuxLabels);
+ 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);
+
private:
// Since the cri module will operate concurrently on the sandbox instance,
// use m_mutex to ensure the correctness of the sandbox instance
@@ -191,6 +209,7 @@ private:
std::string m_rootdir;
std::string m_statedir;
std::string m_taskAddress;
+ uint32_t m_version;
StatsInfo m_statsInfo;
// Store network information in the sandbox, which is convenient for the cri module to obtain
// and update the network settings of the pause container in the shim-controller.
@@ -211,6 +230,11 @@ private:
// vsock ports
std::mutex m_vsockPortsMutex;
std::set<uint32_t> m_vsockPorts;
+
+ // use m_tasksMutex to ensure the correctness of the tasks
+ RWMutex m_tasksMutex;
+ // for sandbox api update, containerId --> tasks
+ std::map<std::string, std::shared_ptr<SandboxTask>> m_tasks;
};
} // namespace sandbox
diff --git a/src/daemon/sandbox/sandbox_ops.cc b/src/daemon/sandbox/sandbox_ops.cc
index 22cfea95..96e541a4 100644
--- a/src/daemon/sandbox/sandbox_ops.cc
+++ b/src/daemon/sandbox/sandbox_ops.cc
@@ -16,11 +16,18 @@
#include <isula_libutils/auto_cleanup.h>
#include <isula_libutils/log.h>
+#include <google/protobuf/util/time_util.h>
#include "controller_manager.h"
#include "sandbox_manager.h"
+#include "sandbox.h"
#include "namespace.h"
#include "utils.h"
+#include "utils_timestamp.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)
{
@@ -28,106 +35,166 @@ static inline bool validate_sandbox_info(const container_sandbox_info *sandbox)
sandbox->id != NULL);
}
-static int generate_ctrl_rootfs(sandbox::ControllerPrepareParams &params,
+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
- std::unique_ptr<sandbox::ControllerMountInfo> mount_info(new sandbox::ControllerMountInfo());
- mount_info->type = MOUNT_TYPE_BIND;
- mount_info->source = config->base_fs;
- params.rootfs.push_back(std::move(mount_info));
+ 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_prepare(const container_config_v2_common_config *config,
- const char *exec_id, const char *oci_spec,
- const char * console_fifos[], bool tty)
+static int do_sandbox_prepare(std::shared_ptr<sandbox::Sandbox> &sandbox, containerd::types::Sandbox &apiSandbox)
{
Errors err;
- sandbox::ControllerPrepareParams params;
- std::unique_ptr<sandbox::ControllerStreamInfo> stream_info(new sandbox::ControllerStreamInfo());
- const container_sandbox_info *sandbox_info = nullptr;
-
- if (nullptr == config || nullptr == config->id) {
- ERROR("Invalid parameter: config");
- return -1;
- }
+ std::vector<std::string> fields;
+
+ fields.push_back(SANDBOX_EXTENSIONS_TASKS);
- sandbox_info = config->sandbox_info;
- if (false == validate_sandbox_info(sandbox_info)) {
- ERROR("Invalid parameter: sandbox");
+ auto controller = sandbox::ControllerManager::GetInstance()->GetController(sandbox->GetSandboxer());
+ if (nullptr == controller) {
+ ERROR("Invalid sandboxer name: %s", sandbox->GetSandboxer().c_str());
return -1;
}
- if (nullptr == console_fifos) {
- ERROR("Invlaid parameter: console_fifos");
+ if (!controller->Prepare(apiSandbox, fields, err)) {
+ ERROR("Failed to prepare in container controller prepare: %s", err.GetCMessage());
return -1;
}
- params.containerId = config->id;
- params.execId = (nullptr == exec_id) ? "" : exec_id;
- params.spec = std::unique_ptr<std::string>(new std::string(oci_spec));
-
- if (generate_ctrl_rootfs(params, config) != 0) {
- ERROR("Invalid rootfs");
- return -1;
- }
+ return 0;
+}
- stream_info->stdin = (nullptr == console_fifos[0]) ? "" : console_fifos[0];
- stream_info->stdout = (nullptr == console_fifos[1]) ? "" : console_fifos[1];
- stream_info->stderr = (nullptr == console_fifos[2]) ? "" : console_fifos[2];
- stream_info->terminal = tty;
- params.streamInfo = std::move(stream_info);
+static int do_sandbox_purge(std::shared_ptr<sandbox::Sandbox> &sandbox, containerd::types::Sandbox &apiSandbox)
+{
+ Errors err;
+ std::vector<std::string> fields;
+
+ fields.push_back(SANDBOX_EXTENSIONS_TASKS);
- auto controller = sandbox::ControllerManager::GetInstance()->GetController(sandbox_info->sandboxer);
+ auto controller = sandbox::ControllerManager::GetInstance()->GetController(sandbox->GetSandboxer());
if (nullptr == controller) {
- ERROR("Invalid sandboxer name: %s", sandbox_info->sandboxer);
+ ERROR("Invalid sandboxer name: %s", sandbox->GetSandboxer().c_str());
return -1;
}
- std::string bundle = controller->Prepare(sandbox_info->id, params, err);
- if (err.NotEmpty()) {
- ERROR("Failed to prepare in container controller prepare: %s", err.GetCMessage());
+ if (!controller->Purge(apiSandbox, fields, err)) {
+ ERROR("Failed to purge: %s", err.GetCMessage());
return -1;
}
return 0;
}
-static int do_sandbox_purge(const container_config_v2_common_config *config,
- const char *exec_id)
+static oci_runtime_spec *clone_oci_runtime_spec(const oci_runtime_spec *oci_spec)
{
- Errors err;
- const container_sandbox_info *sandbox_info = nullptr;
+ __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) {
ERROR("Invalid parameter: config");
- return -1;
+ return nullptr;
}
- sandbox_info = config->sandbox_info;
+ auto sandbox_info = config->sandbox_info;
if (false == validate_sandbox_info(sandbox_info)) {
ERROR("Invalid parameter: sandbox");
- return -1;
+ return nullptr;
}
- auto controller = sandbox::ControllerManager::GetInstance()->GetController(sandbox_info->sandboxer);
- if (nullptr == controller) {
- ERROR("Invalid sandboxer name: %s", sandbox_info->sandboxer);
- return -1;
+ auto sandbox = sandbox::SandboxManager::GetInstance()->GetSandbox(sandbox_info->id);
+ if (nullptr == sandbox) {
+ ERROR("Sandbox not found");
+ return nullptr;
}
+ return sandbox;
+}
- if (!controller->Purge(sandbox_info->id, config->id,
- (nullptr == exec_id) ? "" : exec_id, err)) {
- ERROR("Failed to purge: %s", err.GetCMessage());
+static int init_prepare_api_sandbox(std::shared_ptr<sandbox::Sandbox> sandbox, const char *containerId,
+ containerd::types::Sandbox &apiSandbox)
+{
+ google::protobuf::Map<std::string, std::string> *labels = apiSandbox.mutable_labels();
+ google::protobuf::Map<std::string, google::protobuf::Any> *extensions = apiSandbox.mutable_extensions();
+ google::protobuf::Any any;
+ auto created_at = new (std::nothrow) google::protobuf::Timestamp;
+ auto updated_at = new (std::nothrow) google::protobuf::Timestamp;
+
+ apiSandbox.set_sandbox_id(sandbox->GetId());
+ apiSandbox.mutable_runtime()->set_name(sandbox->GetRuntime());
+ // TODO how get options
+ // apiSandbox.mutable_runtime()->set_options(sandbox->GetRuntime());
+ // Just ignore spec
+ (*labels)[std::string("name")] = sandbox->GetName();
+
+ *created_at = google::protobuf::util::TimeUtil::NanosecondsToTimestamp(
+ sandbox->GetCreatedAt());
+ apiSandbox.set_allocated_created_at(created_at);
+ *updated_at = google::protobuf::util::TimeUtil::NanosecondsToTimestamp(util_get_now_time_nanos());
+ apiSandbox.set_allocated_updated_at(updated_at);
+
+ auto any_type_url = any.mutable_type_url();
+ *any_type_url = SANDBOX_TASKS_TYPEURL;
+ auto any_value = any.mutable_value();
+ *any_value = sandbox->GetAnySandboxTasks();
+ if ((*any_value).empty()) {
+ ERROR("Failed to get any sandbox tasks");
return -1;
}
+ DEBUG("Get any sandbox tasks %s", (*any_value).c_str());
+ (*extensions)[SANDBOX_TASKS_KEY] = any;
+
+ apiSandbox.set_sandboxer(sandbox->GetSandboxer());
return 0;
}
@@ -136,45 +203,177 @@ int sandbox_prepare_container(const container_config_v2_common_config *config,
const oci_runtime_spec *oci_spec,
const char * console_fifos[], bool tty)
{
- __isula_auto_free char *json_oci_spec = nullptr;
- __isula_auto_free parser_error err = nullptr;
+ sandbox_task *task = nullptr;
+ containerd::types::Sandbox apiSandbox;
+ int ret = -1;
INFO("Prepare container for sandbox");
- json_oci_spec = oci_runtime_spec_generate_json(oci_spec, nullptr, &err);
- if (nullptr == json_oci_spec) {
- ERROR("Failed to generate container spec json: %s", err);
+ if (nullptr == console_fifos) {
+ ERROR("Invlaid parameter: console_fifos");
+ return -1;
+ }
+
+ auto sandbox = get_prepare_sandbox(config);
+ if (sandbox == nullptr) {
+ ERROR("Sandbox not found");
+ return -1;
+ }
+
+ task = (sandbox_task *)util_common_calloc_s(sizeof(sandbox_task));
+ if (task == nullptr) {
+ ERROR("Out of memory.");
return -1;
}
- return do_sandbox_prepare(config, nullptr, json_oci_spec, console_fifos, tty);
+ task->task_id = util_strdup_s(config->id);
+ task->spec = clone_oci_runtime_spec(oci_spec);
+ if (task->spec == nullptr) {
+ ERROR("Out of memory.");
+ goto free_out;
+ }
+ if (generate_ctrl_rootfs(task, config) != 0) {
+ ERROR("Invalid rootfs");
+ goto free_out;
+ }
+ 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);
+ goto free_out;
+ }
+ task = nullptr;
+ ret = init_prepare_api_sandbox(sandbox, config->id, apiSandbox);
+ if (ret != 0) {
+ ERROR("Failed to init %s api sandbox.", config->id);
+ goto del_out;
+ }
+ ret = do_sandbox_prepare(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;
+ }
+free_out:
+ free_sandbox_task(task);
+ return ret;
}
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)
{
- __isula_auto_free char *json_process = nullptr;
- __isula_auto_free parser_error err = nullptr;
+ sandbox_process *process = nullptr;
+ containerd::types::Sandbox apiSandbox;
+ int ret = -1;
INFO("Prepare exec for container in sandbox");
- json_process = defs_process_generate_json(process_spec, nullptr, &err);
- if (nullptr == json_process) {
- ERROR("Failed to generate process spec json: %s", err);
+ if (nullptr == console_fifos) {
+ ERROR("Invlaid parameter: console_fifos");
return -1;
}
- return do_sandbox_prepare(config, exec_id, json_process, console_fifos, tty);
+ auto sandbox = get_prepare_sandbox(config);
+ if (sandbox == nullptr) {
+ ERROR("Sandbox not found");
+ return -1;
+ }
+
+ process = (sandbox_process *)util_common_calloc_s(sizeof(sandbox_process));
+ if (process == nullptr) {
+ ERROR("Out of memory.");
+ return -1;
+ }
+ process->exec_id = util_strdup_s(exec_id);
+ process->spec = clone_defs_process(process_spec);
+ if (process->spec == nullptr) {
+ ERROR("Out of memory.");
+ goto free_out;
+ }
+ 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);
+ goto free_out;
+ }
+ process = nullptr;
+ ret = init_prepare_api_sandbox(sandbox, config->id, apiSandbox);
+ if (ret != 0) {
+ ERROR("Failed to init %s api sandbox.", config->id);
+ goto del_out;
+ }
+ ret = do_sandbox_prepare(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;
+ }
+free_out:
+ free_sandbox_process(process);
+ return ret;
}
int sandbox_purge_container(const container_config_v2_common_config *config)
{
- return do_sandbox_purge(config, nullptr);
+ containerd::types::Sandbox apiSandbox;
+
+ INFO("Purge container for sandbox");
+
+ auto sandbox = get_prepare_sandbox(config);
+ if (sandbox == nullptr) {
+ ERROR("Sandbox not found");
+ return -1;
+ }
+
+ sandbox->DeleteSandboxTasks(config->id);
+ if (!sandbox->SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", config->id);
+ return -1;
+ }
+
+ if (init_prepare_api_sandbox(sandbox, config->id, apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", config->id);
+ return -1;
+ }
+ return do_sandbox_purge(sandbox, apiSandbox);
}
int sandbox_purge_exec(const container_config_v2_common_config *config, const char *exec_id)
{
- return do_sandbox_purge(config, exec_id);
+ containerd::types::Sandbox apiSandbox;
+
+ INFO("Purge exec for container in sandbox");
+
+ auto sandbox = get_prepare_sandbox(config);
+ if (sandbox == nullptr) {
+ ERROR("Sandbox not found");
+ return -1;
+ }
+
+ sandbox->DeleteSandboxTasksProcess(config->id, exec_id);
+ if (!sandbox->SaveSandboxTasks()) {
+ ERROR("Failed to Save %s sandbox tasks.", config->id);
+ return -1;
+ }
+
+ if (init_prepare_api_sandbox(sandbox, config->id, apiSandbox) != 0) {
+ ERROR("Failed to init %s api sandbox.", exec_id);
+ return -1;
+ }
+
+ return do_sandbox_purge(sandbox, apiSandbox);
}
int sandbox_on_sandbox_exit(const char *sandbox_id, int exit_code)
diff --git a/src/daemon/sandbox/sandbox_task.cc b/src/daemon/sandbox/sandbox_task.cc
new file mode 100644
index 00000000..b1efc340
--- /dev/null
+++ b/src/daemon/sandbox/sandbox_task.cc
@@ -0,0 +1,99 @@
+/******************************************************************************
+ * 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-10-22
+ * Description: provide sandbox class definition
+ *********************************************************************************/
+#include "sandbox_task.h"
+
+#include <mutex>
+
+#include <isula_libutils/log.h>
+
+#include "utils.h"
+#include "errors.h"
+
+namespace sandbox {
+
+SandboxTask::SandboxTask(sandbox_task *task): m_task(task)
+{
+}
+
+SandboxTask::~SandboxTask()
+{
+ free_sandbox_task(m_task);
+ m_task = nullptr;
+}
+
+auto SandboxTask::GetTask() -> sandbox_task *
+{
+ ReadGuard<RWMutex> lock(m_taskMutex);
+ return m_task;
+}
+
+auto SandboxTask::AddSandboxTasksProcess(sandbox_process *processes) -> bool
+{
+ if (processes == nullptr) {
+ ERROR("Empty args.");
+ return false;
+ }
+
+ WriteGuard<RWMutex> lock(m_taskMutex);
+ if (util_mem_realloc((void **)(&m_task->processes),
+ (m_task->processes_len + 1) * sizeof(sandbox_process *),
+ (void *)m_task->processes,
+ m_task->processes_len * sizeof(sandbox_process *)) != 0) {
+ ERROR("Out of memory");
+ return false;
+ }
+ m_task->processes[m_task->processes_len] = processes;
+ m_task->processes_len++;
+
+ return true;
+}
+
+auto SandboxTask::FindProcessByID(const char *execId) -> int
+{
+ int i;
+ int processes_len = m_task->processes_len;
+
+ if (m_task->processes == nullptr) {
+ return -1;
+ }
+
+ for (i = 0; i < processes_len; i++) {
+ if (strcmp(m_task->processes[i]->exec_id, execId) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void SandboxTask::DeleteSandboxTasksProcess(const char *execId)
+{
+ if (execId == nullptr) {
+ return;
+ }
+
+ int idx;
+
+ WriteGuard<RWMutex> lock(m_taskMutex);
+ idx = FindProcessByID(execId);
+ if (idx < 0) {
+ return;
+ }
+ free_sandbox_process(m_task->processes[idx]);
+ (void)memcpy((void **)&m_task->processes[idx], (void **)&m_task->processes[idx + 1],
+ (m_task->processes_len - idx - 1) * sizeof(void *));
+ m_task->processes_len--;
+}
+
+}
\ No newline at end of file
diff --git a/src/daemon/sandbox/sandbox_task.h b/src/daemon/sandbox/sandbox_task.h
new file mode 100644
index 00000000..1bd0ce58
--- /dev/null
+++ b/src/daemon/sandbox/sandbox_task.h
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * 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-10-22
+ * Description: provide sandbox class definition
+ *********************************************************************************/
+
+#ifndef DAEMON_SANDBOX_SANDBOX_TASK_H
+#define DAEMON_SANDBOX_SANDBOX_TASK_H
+
+#include <string>
+#include <mutex>
+
+#include <isula_libutils/sandbox_tasks.h>
+
+#include "api_v1.grpc.pb.h"
+#include "errors.h"
+#include "read_write_lock.h"
+
+namespace sandbox {
+
+class SandboxTask : public std::enable_shared_from_this<SandboxTask> {
+public:
+ SandboxTask(sandbox_task *task);
+ ~SandboxTask();
+
+ auto GetTask() -> sandbox_task *;
+ auto AddSandboxTasksProcess(sandbox_process *processes) -> bool;
+ void DeleteSandboxTasksProcess(const char *execId);
+
+private:
+ auto FindProcessByID(const char *execId) -> int;
+private:
+ // Do not modify m_task concurrently.
+ RWMutex m_taskMutex;
+ sandbox_task *m_task;
+};
+} // namespace sandbox
+
+#endif // DAEMON_SANDBOX_SANDBOX_TASK_H
\ No newline at end of file
--
2.34.1

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/src-openeuler-iSulad.git
git@api.gitlife.ru:oschina-mirror/src-openeuler-iSulad.git
oschina-mirror
src-openeuler-iSulad
src-openeuler-iSulad
master