iSulad/src/image/oci/isula_image_fs_info.c
Grooooot 7be59a7c67 iSulad: sync openeuler at 3.6
Signed-off-by: Grooooot <isula@huawei.com>
2020-03-06 14:58:03 +08:00

151 lines
4.9 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 fs info operator implement
*******************************************************************************/
#include "isula_image_fs_info.h"
#include "isula_image_connect.h"
#include "isula_helper.h"
#include "connect.h"
#include "utils.h"
#include "log.h"
static int fs_usage_to_json_elem(const struct filesystem_usage *fusage,
imagetool_fs_info_image_filesystems_element **jelem)
{
imagetool_fs_info_image_filesystems_element *tmp_elem = NULL;
tmp_elem = (imagetool_fs_info_image_filesystems_element *)util_common_calloc_s(
sizeof(imagetool_fs_info_image_filesystems_element));
if (tmp_elem == NULL) {
ERROR("Out of memory");
return -1;
}
tmp_elem->timestamp = fusage->timestamp;
tmp_elem->fs_id = (imagetool_fs_info_image_filesystems_fs_id *)util_common_calloc_s(
sizeof(imagetool_fs_info_image_filesystems_fs_id));
if (tmp_elem->fs_id == NULL) {
ERROR("Out of memory");
goto err_out;
}
tmp_elem->fs_id->mountpoint = util_strdup_s(fusage->uuid);
tmp_elem->used_bytes = (imagetool_fs_info_image_filesystems_used_bytes *)util_common_calloc_s(
sizeof(imagetool_fs_info_image_filesystems_used_bytes));
if (tmp_elem->used_bytes == NULL) {
ERROR("Out of memory");
goto err_out;
}
tmp_elem->used_bytes->value = *(fusage->used_bytes);
tmp_elem->inodes_used = (imagetool_fs_info_image_filesystems_inodes_used *)util_common_calloc_s(
sizeof(imagetool_fs_info_image_filesystems_inodes_used));
if (tmp_elem->inodes_used == NULL) {
ERROR("Out of memory");
goto err_out;
}
tmp_elem->inodes_used->value = *(fusage->inodes_used);
*jelem = tmp_elem;
return 0;
err_out:
free_imagetool_fs_info_image_filesystems_element(tmp_elem);
return -1;
}
static int pack_im_response(const struct isula_image_fs_info_response *iresp, im_fs_info_response *resp)
{
size_t i = 0;
imagetool_fs_info *info = NULL;
if (iresp->image_filesystems_len == 0) {
return 0;
}
info = (imagetool_fs_info *)util_common_calloc_s(sizeof(imagetool_fs_info));
if (info == NULL) {
ERROR("Out of memory");
return -1;
}
info->image_filesystems = (imagetool_fs_info_image_filesystems_element **)util_smart_calloc_s(
sizeof(imagetool_fs_info_image_filesystems_element *), iresp->image_filesystems_len);
if (info->image_filesystems == NULL) {
ERROR("Out of memory");
goto err_out;
}
for (i = 0; i < iresp->image_filesystems_len; i++) {
if (fs_usage_to_json_elem(iresp->image_filesystems[i], &(info->image_filesystems[i])) != 0) {
goto err_out;
}
(info->image_filesystems_len)++;
}
resp->fs_info = info;
resp->errmsg = util_strdup_s(iresp->errmsg);
return 0;
err_out:
free_imagetool_fs_info(info);
return -1;
}
int isula_image_fs_info(im_fs_info_response *resp)
{
int ret = -1;
struct isula_image_fs_info_request ireq = {0};
struct isula_image_fs_info_response *iresp = NULL;
client_connect_config_t conf = { 0 };
isula_image_ops *im_ops = NULL;
if (resp == NULL) {
ERROR("Invalid arguments");
return -1;
}
im_ops = get_isula_image_ops();
if (im_ops == NULL) {
ERROR("Don't init isula server grpc client");
return -1;
}
if (im_ops->image_fs_info == NULL) {
ERROR("Umimplement image fs info operator");
return -1;
}
iresp = (struct isula_image_fs_info_response *)util_common_calloc_s(sizeof(struct isula_image_fs_info_response));
if (iresp == NULL) {
ERROR("Out of memory");
goto out;
}
ret = get_isula_image_connect_config(&conf);
if (ret != 0) {
goto out;
}
ret = im_ops->image_fs_info(&ireq, iresp, &conf);
if (ret != 0) {
ERROR("Failed to get image fs info with error: %s", iresp->errmsg);
isulad_set_error_message("Failed to get image fs info with error: %s", iresp->errmsg);
goto out;
}
ret = pack_im_response(iresp, resp);
out:
free_isula_image_fs_info_response(iresp);
free_client_connect_config_value(&conf);
return ret;
}