1 Star 0 Fork 40

chegJH / srcOpenEuler-iSulad

forked from src-openEuler / iSulad 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0004-add-isula-import-restful-mode.patch 7.87 KB
一键复制 编辑 原始数据 按行查看 历史
chegJH 提交于 2022-05-07 15:37 . bionic adaptation
From 0f05484cceb58117f165bcc402156194289ea9c3 Mon Sep 17 00:00:00 2001
From: chengzrz <czrzrichard@gmail.com>
Date: Thu, 28 Apr 2022 19:11:46 +0800
Subject: [PATCH 4/5] add isula import restful mode
Signed-off-by: chengzrz <czrzrichard@gmail.com>
---
src/api/services/images/rest/image.rest.h | 3 +
src/client/connect/rest/rest_images_client.c | 107 ++++++++++++++++++
.../entry/connect/rest/rest_images_service.c | 89 +++++++++++++++
3 files changed, 199 insertions(+)
diff --git a/src/api/services/images/rest/image.rest.h b/src/api/services/images/rest/image.rest.h
index 6ebdc109..a61a285f 100644
--- a/src/api/services/images/rest/image.rest.h
+++ b/src/api/services/images/rest/image.rest.h
@@ -31,6 +31,8 @@
#include "isula_libutils/image_logout_response.h"
#include "isula_libutils/image_tag_image_request.h"
#include "isula_libutils/image_tag_image_response.h"
+#include "isula_libutils/image_import_request.h"
+#include "isula_libutils/image_import_response.h"
#ifndef RestHttpHead
#define RestHttpHead "http://localhost"
@@ -44,6 +46,7 @@
#define ImagesServiceLogin "/ImagesService/Login"
#define ImagesServiceLogout "/ImagesService/Logout"
#define ImagesServiceTag "/ImagesService/Tag"
+#define ImagesServiceImport "/ImagesService/Import"
#endif
diff --git a/src/client/connect/rest/rest_images_client.c b/src/client/connect/rest/rest_images_client.c
index ae754f76..3deeeead 100644
--- a/src/client/connect/rest/rest_images_client.c
+++ b/src/client/connect/rest/rest_images_client.c
@@ -858,6 +858,112 @@ out:
return ret;
}
+/* image import request to rest */
+static int image_import_request_to_rest(const struct isula_import_request *request, char **body, size_t *body_len)
+{
+ image_import_request *crequest = NULL;
+ parser_error err = NULL;
+ int ret = 0;
+
+ crequest = util_common_calloc_s(sizeof(image_import_request));
+ if (crequest == NULL) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ crequest->file = util_strdup_s(request->file);
+ crequest->tag = util_strdup_s(request->tag);
+
+ *body = image_import_request_generate_json(crequest, NULL, &err);
+ if (*body == NULL) {
+ ERROR("Failed to generate image import request json:%s", err);
+ ret = -1;
+ goto out;
+ }
+ *body_len = strlen(*body) + 1;
+
+out:
+ free(err);
+ free_image_import_request(crequest);
+
+ return ret;
+}
+
+/* unpack image import response */
+static int unpack_image_import_response(const struct parsed_http_message *message, void *arg)
+{
+ struct isula_import_response *c_import_response = (struct isula_import_response *)arg;
+ image_import_response *import_response = NULL;
+ parser_error err = NULL;
+ int ret = 0;
+
+ ret = check_status_code(message->status_code);
+ if (ret != 0) {
+ ERROR("Tag image check status code failed.\n");
+ goto out;
+ }
+
+ import_response = image_import_response_parse_data(message->body, NULL, &err);
+ if (import_response == NULL) {
+ ERROR("Invalid import image response:%s", err);
+ ret = -1;
+ goto out;
+ }
+
+ c_import_response->server_errono = import_response->cc;
+ c_import_response->errmsg = util_strdup_s(import_response->errmsg);
+ c_import_response->id = util_strdup_s(import_response->id);
+
+ ret = (import_response->cc == ISULAD_SUCCESS) ? 0 : -1;
+ if (message->status_code == RESTFUL_RES_SERVERR) {
+ ret = -1;
+ }
+
+out:
+ free(err);
+ free_image_import_response(import_response);
+
+ return ret;
+}
+
+/* rest image import */
+static int rest_image_import(const struct isula_import_request *request, struct isula_import_response *response,
+ void *arg)
+{
+
+ client_connect_config_t *connect_config = (client_connect_config_t *)arg;
+ const char *socketname = (const char *)(connect_config->socket);
+ char *body = NULL;
+ Buffer *output = NULL;
+ int ret = 0;
+ size_t len = 0;
+
+ ret = image_import_request_to_rest(request, &body, &len);
+ if (ret != 0) {
+ goto out;
+ }
+
+ ret = rest_send_requst(socketname, RestHttpHead ImagesServiceImport, body, len, &output);
+ if (ret != 0) {
+ ERROR("Send import request failed.");
+ response->errmsg = util_strdup_s(errno_to_error_message(ISULAD_ERR_CONNECT));
+ response->cc = ISULAD_ERR_EXEC;
+ goto out;
+ }
+
+ ret = get_response(output, unpack_image_import_response, (void *)response);
+ if (ret != 0) {
+ ERROR("Get import response failed.");
+ goto out;
+ }
+
+out:
+ buffer_free(output);
+ put_body(body);
+
+ return ret;
+}
+
+
/* rest images client ops init */
int rest_images_client_ops_init(isula_connect_ops *ops)
{
@@ -873,6 +979,7 @@ int rest_images_client_ops_init(isula_connect_ops *ops)
ops->image.login = &rest_image_login;
ops->image.logout = &rest_image_logout;
ops->image.tag = &rest_image_tag;
+ ops->image.import = &rest_image_import;
return 0;
}
diff --git a/src/daemon/entry/connect/rest/rest_images_service.c b/src/daemon/entry/connect/rest/rest_images_service.c
index 39a3bd6c..7107d255 100644
--- a/src/daemon/entry/connect/rest/rest_images_service.c
+++ b/src/daemon/entry/connect/rest/rest_images_service.c
@@ -797,6 +797,90 @@ out:
free_image_tag_image_response(cresponse);
}
+/* image import request from rest */
+static int image_import_request_from_rest(evhtp_request_t *req, image_import_request **crequest)
+{
+ int ret = 0;
+ size_t body_len;
+ char *body = NULL;
+ parser_error err = NULL;
+
+ if (get_body(req, &body_len, &body) != 0) {
+ ERROR("Failed to get body");
+ return -1;
+ }
+
+ *crequest = image_import_request_parse_data(body, NULL, &err);
+ if (*crequest == NULL) {
+ ERROR("Invalid import request body:%s", err);
+ ret = -1;
+ goto out;
+ }
+
+out:
+ put_body(body);
+ free(err);
+
+ return ret;
+}
+
+/* evhtp send image import repsponse */
+static void evhtp_send_image_import_repsponse(evhtp_request_t *req, image_import_response *response, int rescode)
+{
+ parser_error err = NULL;
+ char *response_data = NULL;
+
+ response_data = image_import_response_generate_json(response, NULL, &err);
+ if (response_data != NULL) {
+ evhtp_send_response(req, response_data, rescode);
+ goto out;
+ }
+
+ ERROR("Import: failed to generate request json:%s", err);
+ evhtp_send_reply(req, RESTFUL_RES_ERROR);
+
+out:
+ free(response_data);
+ free(err);
+}
+
+/* rest image import cb */
+static void rest_image_import_cb(evhtp_request_t *req, void *arg)
+{
+ int tret;
+ service_executor_t *cb = NULL;
+ image_import_request *crequest = NULL;
+ image_import_response *cresponse = NULL;
+
+ // only deal with POST request
+ if (evhtp_request_get_method(req) != htp_method_POST) {
+ evhtp_send_reply(req, RESTFUL_RES_NOTIMPL);
+ return;
+ }
+
+ cb = get_service_executor();
+ if (cb == NULL || cb->image.import == NULL) {
+ ERROR("Unimplemented import callback");
+ evhtp_send_reply(req, RESTFUL_RES_NOTIMPL);
+ return;
+ }
+
+ tret = image_import_request_from_rest(req, &crequest);
+ if (tret < 0) {
+ ERROR("Bad request");
+ evhtp_send_reply(req, RESTFUL_RES_SERVERR);
+ goto out;
+ }
+
+ (void)cb->image.import(crequest, &cresponse);
+ evhtp_send_image_import_repsponse(req, cresponse, RESTFUL_RES_OK);
+
+out:
+ free_image_import_request(crequest);
+ free_image_import_response(cresponse);
+}
+
+
/* rest register images handler */
int rest_register_images_handler(evhtp_t *htp)
{
@@ -840,5 +924,10 @@ int rest_register_images_handler(evhtp_t *htp)
return -1;
}
+ if (evhtp_set_cb(htp, ImagesServiceImport, rest_image_import_cb, NULL) == NULL) {
+ ERROR("Failed to register image logout callback");
+ return -1;
+ }
+
return 0;
}
--
2.32.0 (Apple Git-132)
1
https://gitee.com/chegJH/srcOpenEuler-iSulad.git
git@gitee.com:chegJH/srcOpenEuler-iSulad.git
chegJH
srcOpenEuler-iSulad
srcOpenEuler-iSulad
master

搜索帮助