From 0f05484cceb58117f165bcc402156194289ea9c3 Mon Sep 17 00:00:00 2001 From: chengzrz Date: Thu, 28 Apr 2022 19:11:46 +0800 Subject: [PATCH 4/5] add isula import restful mode Signed-off-by: chengzrz --- 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)