iSulad/src/image/oci/isula_image_pull.c
openeuler-iSula ee41558c0c iSUlad: remove seucrec new
Signed-off-by: openeuler-iSula <isula@huawei.com>
2019-12-29 15:59:28 +08:00

179 lines
5.4 KiB
C

/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
* iSulad licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* 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 v1 for more details.
* Author: liuhao
* Create: 2019-07-15
* Description: isula image pull operator implement
*******************************************************************************/
#include "isula_image_pull.h"
#include "log.h"
#include "utils.h"
#include "isula_image_connect.h"
#include "isula_helper.h"
#include "connect.h"
#include "oci_images_store.h"
#include "oci_common_operators.h"
static bool need_new_isula_auth(const im_pull_request *request)
{
return ((request->username != NULL) || (request->password != NULL) || (request->auth != NULL) ||
(request->server_address != NULL) || (request->identity_token != NULL) ||
(request->registry_token != NULL));
}
static int generate_isula_auth_from_im_pull_request(const im_pull_request *request, struct isula_pull_request *ireq)
{
if (!need_new_isula_auth(request)) {
return 0;
}
ireq->auth = (struct isula_auth_config *)util_common_calloc_s(sizeof(struct isula_auth_config));
if (ireq->auth == NULL) {
ERROR("Out of memory");
return -1;
}
ireq->auth->username = util_strdup_s(request->username);
ireq->auth->password = util_strdup_s(request->password);
ireq->auth->auth = util_strdup_s(request->auth);
ireq->auth->server_address = util_strdup_s(request->server_address);
ireq->auth->identity_token = util_strdup_s(request->identity_token);
ireq->auth->registry_token = util_strdup_s(request->registry_token);
return 0;
}
static int im_pull_request_to_isula_request(const im_pull_request *request, struct isula_pull_request **ireq)
{
struct isula_pull_request *tmpreq = NULL;
int ret = -1;
if (request == NULL || ireq == NULL) {
return -1;
}
tmpreq = (struct isula_pull_request *)util_common_calloc_s(sizeof(struct isula_pull_request));
if (tmpreq == NULL) {
ERROR("Out of memory");
return -1;
}
if (request->image != NULL) {
tmpreq->image = (struct image_spec *)util_common_calloc_s(sizeof(struct image_spec));
if (tmpreq->image == NULL) {
ERROR("Out of memory");
goto err_out;
}
tmpreq->image->image = util_strdup_s(request->image);
}
ret = generate_isula_auth_from_im_pull_request(request, tmpreq);
if (ret != 0) {
goto err_out;
}
*ireq = tmpreq;
return 0;
err_out:
free_isula_pull_request(tmpreq);
return -1;
}
static int isula_pull_response_to_im(const struct isula_pull_response *iresp, im_pull_response **response)
{
if (iresp == NULL) {
INFO("Get empty isula response");
return 0;
}
*response = (im_pull_response *)util_common_calloc_s(sizeof(im_pull_response));
if (*response == NULL) {
ERROR("Out of memory");
return -1;
}
(*response)->errmsg = util_strdup_s(iresp->errmsg);
(*response)->image_ref = util_strdup_s(iresp->image_ref);
return 0;
}
int isula_pull_image(const im_pull_request *request, im_pull_response **response)
{
isula_image_ops *im_ops;
struct isula_pull_request *ireq = NULL;
struct isula_pull_response *iresp = NULL;
int ret = -1;
client_connect_config_t conf = { 0 };
char *normalized = NULL;
im_ops = get_isula_image_ops();
if (im_ops == NULL) {
ERROR("Don't init isula server grpc client");
return -1;
}
if (im_ops->pull == NULL) {
ERROR("Umimplement pull operator");
return -1;
}
ret = im_pull_request_to_isula_request(request, &ireq);
if (ret != 0) {
ERROR("Parse im pull request failed");
return -1;
}
iresp = (struct isula_pull_response *)util_common_calloc_s(sizeof(struct isula_pull_response));
if (iresp == NULL) {
ERROR("Out of memory");
ret = -1;
goto err_out;
}
ret = get_isula_image_connect_config(&conf);
if (ret != 0) {
goto err_out;
}
INFO("Send pull image GRPC request");
ret = im_ops->pull(ireq, iresp, &conf);
if (ret != 0) {
ERROR("Pull image failed: %s", iresp != NULL ? iresp->errmsg : "null");
goto err_out;
}
ret = isula_pull_response_to_im(iresp, response);
if (ret != 0) {
ERROR("Parse response failed");
goto err_out;
}
normalized = oci_normalize_image_name(request->image);
if (normalized == NULL) {
ret = -1;
ERROR("Normalize image name %s failed", request->image);
goto err_out;
}
ret = register_new_oci_image_into_memory(normalized);
if (ret != 0) {
ERROR("Register image %s into store failed", normalized);
goto err_out;
}
goto out;
err_out:
free_im_pull_response(*response);
*response = NULL;
ret = -1;
out:
free(normalized);
free_client_connect_config_value(&conf);
free_isula_pull_request(ireq);
free_isula_pull_response(iresp);
return ret;
}