268 lines
7.9 KiB
Diff
268 lines
7.9 KiB
Diff
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 04/16] 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.20.1
|
|
|