From 0f9dbd12b412347ab7148a91fe56824e5d7fff35 Mon Sep 17 00:00:00 2001 From: leizhongkai Date: Thu, 23 Jun 2022 20:51:31 +0800 Subject: [PATCH] refactor gRPC create service Signed-off-by: leizhongkai --- src/daemon/entry/connect/CMakeLists.txt | 22 +++-- src/daemon/entry/connect/grpc/CMakeLists.txt | 5 +- .../connect/grpc/container/CMakeLists.txt | 7 ++ .../connect/grpc/container/create_service.cc | 94 ++++++++++++++++++ .../connect/grpc/container/create_service.h | 45 +++++++++ .../connect/grpc/container/service_base.h | 97 +++++++++++++++++++ .../connect/grpc/grpc_containers_service.cc | 34 +------ 7 files changed, 263 insertions(+), 41 deletions(-) create mode 100644 src/daemon/entry/connect/grpc/container/CMakeLists.txt create mode 100644 src/daemon/entry/connect/grpc/container/create_service.cc create mode 100644 src/daemon/entry/connect/grpc/container/create_service.h create mode 100644 src/daemon/entry/connect/grpc/container/service_base.h diff --git a/src/daemon/entry/connect/CMakeLists.txt b/src/daemon/entry/connect/CMakeLists.txt index 7f4dffc56..e237bc1e8 100644 --- a/src/daemon/entry/connect/CMakeLists.txt +++ b/src/daemon/entry/connect/CMakeLists.txt @@ -3,10 +3,12 @@ aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} local_server_connect_srcs) set(local_server_connect_incs ${CMAKE_CURRENT_SOURCE_DIR}) -if (GRPC_CONNECTOR) +if(GRPC_CONNECTOR) add_subdirectory(grpc) list(APPEND local_server_connect_srcs ${SERVICE_GRPC_SRCS}) list(APPEND local_server_connect_incs ${CMAKE_CURRENT_SOURCE_DIR}/grpc) + list(APPEND local_server_connect_incs ${CMAKE_CURRENT_SOURCE_DIR}/grpc/container) + if(NOT ENABLE_NATIVE_NETWORK) list(REMOVE_ITEM local_server_connect_incs "${CMAKE_CURRENT_SOURCE_DIR}/grpc/grpc_network_service.h") endif() @@ -14,19 +16,20 @@ else() add_subdirectory(rest) list(APPEND local_server_connect_srcs ${SERVICE_REST_SRCS}) list(APPEND local_server_connect_incs ${CMAKE_CURRENT_SOURCE_DIR}/rest) + if(NOT ENABLE_NATIVE_NETWORK) list(REMOVE_ITEM local_server_connect_incs "${CMAKE_CURRENT_SOURCE_DIR}/rest/rest_network_service.h") endif() endif() -if (ENABLE_METRICS) +if(ENABLE_METRICS) add_subdirectory(metrics) list(APPEND local_server_connect_srcs ${METRICS_SERVICE_SRCS}) list(APPEND local_server_connect_incs ${CMAKE_CURRENT_SOURCE_DIR}/metrics) endif() -if (GRPC_CONNECTOR) - # GRPC +if(GRPC_CONNECTOR) + # GRPC aux_source_directory(${CMAKE_BINARY_DIR}/grpc/src/api/services/containers CONNECT_API_CONTAINERS) aux_source_directory(${CMAKE_BINARY_DIR}/grpc/src/api/services/images CONNECT_API_IMAGES) aux_source_directory(${CMAKE_BINARY_DIR}/grpc/src/api/services/volumes CONNECT_API_VOLUMES) @@ -39,15 +42,14 @@ if (GRPC_CONNECTOR) ${CMAKE_BINARY_DIR}/grpc/src/api/services/images ${CMAKE_BINARY_DIR}/grpc/src/api/services/volumes ${CMAKE_BINARY_DIR}/grpc/src/api/services/cri - ) + ) - if (ENABLE_NATIVE_NETWORK) - aux_source_directory(${CMAKE_BINARY_DIR}/grpc/src/api/services/network CONNECT_API_NETWORK) - list(APPEND local_server_connect_srcs ${CONNECT_API_NETWORK}) - list(APPEND local_server_connect_incs ${CMAKE_BINARY_DIR}/grpc/src/api/services/network) + if(ENABLE_NATIVE_NETWORK) + aux_source_directory(${CMAKE_BINARY_DIR}/grpc/src/api/services/network CONNECT_API_NETWORK) + list(APPEND local_server_connect_srcs ${CONNECT_API_NETWORK}) + list(APPEND local_server_connect_incs ${CMAKE_BINARY_DIR}/grpc/src/api/services/network) endif() endif() - set(SERVER_CONNECT_SRCS ${local_server_connect_srcs} PARENT_SCOPE) set(SERVER_CONNECT_INCS ${local_server_connect_incs} PARENT_SCOPE) diff --git a/src/daemon/entry/connect/grpc/CMakeLists.txt b/src/daemon/entry/connect/grpc/CMakeLists.txt index 89e0dd80d..3433ee1dc 100644 --- a/src/daemon/entry/connect/grpc/CMakeLists.txt +++ b/src/daemon/entry/connect/grpc/CMakeLists.txt @@ -1,6 +1,9 @@ # get current directory sources files aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} local_service_grpc_srcs) +add_subdirectory(container) +list(APPEND local_service_grpc_srcs ${GRPC_CONTAINER_SERVICE_SRCS}) + if(NOT ENABLE_NATIVE_NETWORK) list(REMOVE_ITEM local_service_grpc_srcs "${CMAKE_CURRENT_SOURCE_DIR}/grpc_network_service.cc") endif() @@ -8,4 +11,4 @@ endif() set(SERVICE_GRPC_SRCS ${local_service_grpc_srcs} PARENT_SCOPE - ) +) diff --git a/src/daemon/entry/connect/grpc/container/CMakeLists.txt b/src/daemon/entry/connect/grpc/container/CMakeLists.txt new file mode 100644 index 000000000..5082a5efc --- /dev/null +++ b/src/daemon/entry/connect/grpc/container/CMakeLists.txt @@ -0,0 +1,7 @@ +# get current directory sources files +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} local_grpc_container_service_srcs) + +set(GRPC_CONTAINER_SERVICE_SRCS + ${local_grpc_container_service_srcs} + PARENT_SCOPE +) diff --git a/src/daemon/entry/connect/grpc/container/create_service.cc b/src/daemon/entry/connect/grpc/container/create_service.cc new file mode 100644 index 000000000..f108e5476 --- /dev/null +++ b/src/daemon/entry/connect/grpc/container/create_service.cc @@ -0,0 +1,94 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022. 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: wujing + * Create: 2022-06-14 + * Description: implement grpc container create service functions + ******************************************************************************/ +#include "create_service.h" + +void ContainerCreateService::SetThreadName() +{ + SetOperationThreadName("ContCreate"); +} + +Status ContainerCreateService::Authenticate(ServerContext *context) +{ + return AuthenticateOperation(context, "container_create"); +} + +bool ContainerCreateService::WithServiceExecutorOperator(service_executor_t *cb) +{ + return cb->container.create != nullptr; +} + +int ContainerCreateService::FillRequestFromgRPC(const CreateRequest *request, void *contReq) +{ + container_create_request *tmpreq = nullptr; + + tmpreq = static_cast(util_common_calloc_s(sizeof(container_create_request))); + if (tmpreq == nullptr) { + ERROR("Out of memory"); + return -1; + } + + if (!request->id().empty()) { + tmpreq->id = util_strdup_s(request->id().c_str()); + } + if (!request->rootfs().empty()) { + tmpreq->rootfs = util_strdup_s(request->rootfs().c_str()); + } + if (!request->image().empty()) { + tmpreq->image = util_strdup_s(request->image().c_str()); + } + if (!request->runtime().empty()) { + tmpreq->runtime = util_strdup_s(request->runtime().c_str()); + } + if (!request->hostconfig().empty()) { + tmpreq->hostconfig = util_strdup_s(request->hostconfig().c_str()); + } + if (!request->customconfig().empty()) { + tmpreq->customconfig = util_strdup_s(request->customconfig().c_str()); + } + + *static_cast(contReq) = tmpreq; + + return 0; +} + +void ContainerCreateService::ServiceRun(service_executor_t *cb, void *containerReq, void *containerRes) +{ + (void)cb->container.create(static_cast(containerReq), + static_cast(containerRes)); +} + +void ContainerCreateService::FillResponseTogRPC(void *containerRes, CreateResponse *gresponse) +{ + const container_create_response *response = static_cast(containerRes); + if (response == nullptr) { + gresponse->set_cc(ISULAD_ERR_MEMOUT); + return; + } + + gresponse->set_cc(response->cc); + if (response->errmsg != nullptr) { + gresponse->set_errmsg(response->errmsg); + } + + if (response->id != nullptr) { + gresponse->set_id(response->id); + } +} + +void ContainerCreateService::CleanUp(void *containerReq, void *containerRes) +{ + free_container_create_request(static_cast(containerReq)); + free_container_create_response(static_cast(containerRes)); +} \ No newline at end of file diff --git a/src/daemon/entry/connect/grpc/container/create_service.h b/src/daemon/entry/connect/grpc/container/create_service.h new file mode 100644 index 000000000..578547256 --- /dev/null +++ b/src/daemon/entry/connect/grpc/container/create_service.h @@ -0,0 +1,45 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022. 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: wujing + * Create: 2022-06-14 + * Description: define grpc container create service functions + ******************************************************************************/ +#ifndef DAEMON_ENTRY_CONNECT_GRPC_CONTAINER_SERVICES_CREATE_H +#define DAEMON_ENTRY_CONNECT_GRPC_CONTAINERS_SERVICES_CREATE_H + +#include "service_base.h" +#include +#include "container.pb.h" +#include "callback.h" +#include "error.h" + +using grpc::ServerContext; +// Implement of containers service +using namespace containers; + +class ContainerCreateService : public ContainerServiceBase { +public: + ContainerCreateService() = default; + ContainerCreateService(const ContainerCreateService &) = default; + ContainerCreateService &operator=(const ContainerCreateService &) = delete; + ~ContainerCreateService() = default; + +protected: + void SetThreadName() override; + Status Authenticate(ServerContext *context) override; + bool WithServiceExecutorOperator(service_executor_t *cb) override; + int FillRequestFromgRPC(const CreateRequest *request, void *containerReq) override; + void ServiceRun(service_executor_t *cb, void *containerReq, void *containerRes) override; + void FillResponseTogRPC(void *containerRes, CreateResponse *reply) override; + void CleanUp(void *containerReq, void *containerRes) override; +}; + +#endif // DAEMON_ENTRY_CONNECT_GRPC_CONTAINER_SERVICES_CREATE_H \ No newline at end of file diff --git a/src/daemon/entry/connect/grpc/container/service_base.h b/src/daemon/entry/connect/grpc/container/service_base.h new file mode 100644 index 000000000..ba0916a91 --- /dev/null +++ b/src/daemon/entry/connect/grpc/container/service_base.h @@ -0,0 +1,97 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022. 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: wujing + * Create: 2022-06-14 + * Description: provide container service base functions + ******************************************************************************/ +#ifndef DAEMON_ENTRY_CONNECT_GRPC_CONTAINER_SERVICES_CONTAINERS_SERVICE_H +#define DAEMON_ENTRY_CONNECT_GRPC_CONTAINER_SERVICES_CONTAINERS_SERVICE_H +#include +#include + +#include "grpc_server_tls_auth.h" +#include "callback.h" +#include "error.h" +#include "isula_libutils/log.h" +#include "utils.h" + +using grpc::Status; +using grpc::ServerContext; +using grpc::StatusCode; + +template +class ContainerServiceBase { +public: + ContainerServiceBase() = default; + + virtual ~ContainerServiceBase() = default; + + virtual auto Run(ServerContext *context, const RQ *request, RP *reply) -> Status + { + service_executor_t *cb = nullptr; + container_create_response *containerRes = nullptr; + container_create_request *containerReq = nullptr; + + SetThreadName(); + + auto status = Authenticate(context); + if (!status.ok()) { + return status; + } + + cb = get_service_executor(); + if (cb == nullptr || !WithServiceExecutorOperator(cb)) { + return Status(StatusCode::UNIMPLEMENTED, "Unimplemented callback"); + } + + if (FillRequestFromgRPC(request, &containerReq) != 0) { + ERROR("Failed to transform grpc request"); + reply->set_cc(ISULAD_ERR_INPUT); + return Status::OK; + } + + ServiceRun(cb, containerReq, &containerRes); + + FillResponseTogRPC(containerRes, reply); + + CleanUp(containerReq, containerRes); + + return Status::OK; + } + + void SetOperationThreadName(const std::string &name) + { + pthread_setname_np(pthread_self(), name.c_str()); + } + + Status AuthenticateOperation(ServerContext *context, const std::string &name) + { + return GrpcServerTlsAuth::auth(context, name.c_str()); + } + +protected: + virtual void SetThreadName() = 0; + virtual Status Authenticate(ServerContext *context) = 0; + virtual bool WithServiceExecutorOperator(service_executor_t *cb) = 0; + virtual int FillRequestFromgRPC(const RQ *request, void *containerReq) = 0; + virtual void ServiceRun(service_executor_t *cb, void *containerReq, void *containerRes) = 0; + virtual void FillResponseTogRPC(void *containerRes, RP *reply) = 0; + virtual void CleanUp(void *containerReq, void *containerRes) = 0; +}; + +template +auto SpecificServiceRun(ContainerServiceBase &service, ServerContext *context, + const REQUEST *request, RESPONSE *response) noexcept -> Status +{ + return service.Run(context, request, response); +} + +#endif // DAEMON_ENTRY_CONNECT_GRPC_CONTAINERS_SERVICE_CONTAINERS_SERVICE_H diff --git a/src/daemon/entry/connect/grpc/grpc_containers_service.cc b/src/daemon/entry/connect/grpc/grpc_containers_service.cc index 62aeb05a0..798c8eaf3 100644 --- a/src/daemon/entry/connect/grpc/grpc_containers_service.cc +++ b/src/daemon/entry/connect/grpc/grpc_containers_service.cc @@ -26,6 +26,8 @@ #include "grpc_server_tls_auth.h" #include "container_api.h" #include "isula_libutils/logger_json_file.h" +#include "service_base.h" +#include "create_service.h" void protobuf_timestamp_to_grpc(const types_timestamp_t *timestamp, Timestamp *gtimestamp) { @@ -216,36 +218,8 @@ Status ContainerServiceImpl::Info(ServerContext *context, const InfoRequest *req Status ContainerServiceImpl::Create(ServerContext *context, const CreateRequest *request, CreateResponse *reply) { - int tret; - service_executor_t *cb = nullptr; - container_create_response *container_res = nullptr; - container_create_request *container_req = nullptr; - - prctl(PR_SET_NAME, "ContCreate"); - - auto status = GrpcServerTlsAuth::auth(context, "container_create"); - if (!status.ok()) { - return status; - } - cb = get_service_executor(); - if (cb == nullptr || cb->container.create == nullptr) { - return Status(StatusCode::UNIMPLEMENTED, "Unimplemented callback"); - } - - tret = create_request_from_grpc(request, &container_req); - if (tret != 0) { - ERROR("Failed to transform grpc request"); - reply->set_cc(ISULAD_ERR_INPUT); - return Status::OK; - } - - (void)cb->container.create(container_req, &container_res); - create_response_to_grpc(container_res, reply); - - free_container_create_request(container_req); - free_container_create_response(container_res); - - return Status::OK; + auto createService { ContainerCreateService() }; + return SpecificServiceRun(createService, context, request, reply); } Status ContainerServiceImpl::Start(ServerContext *context, const StartRequest *request, StartResponse *reply) -- Gitee