179 lines
5.4 KiB
C
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;
|
|
}
|