提交 ca68fbc4 编写于 作者: W wujing 提交者: lifeng68

image common code extraction

Signed-off-by: Nwujing <wujing50@huawei.com>
上级 9c9f023d
......@@ -37,6 +37,7 @@
#include "utils_fs.h"
#include "utils_base64.h"
#include "utils_aes.h"
#include "utils_images.h"
#ifdef __cplusplus
extern "C" {
......
/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
* iSulad licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* 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 v2 for more details.
* Author: WuJing
* Create: 2020-05-09
* Description: provide isula image common functions
*******************************************************************************/
#define _GNU_SOURCE
#include <stdlib.h>
#include <string.h>
#include "log.h"
#include "utils.h"
#include "utils_images.h"
char *get_last_part(char **parts)
{
char *last_part = NULL;
char **p;
for (p = parts; p != NULL && *p != NULL; p++) {
last_part = *p;
}
return last_part;
}
char *oci_get_host(const char *name)
{
char **parts = NULL;
char *host = NULL;
if (name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
parts = util_string_split(name, '/');
if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") &&
strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) {
util_free_array(parts);
return NULL;
}
if (parts != NULL) {
host = util_strdup_s(parts[0]);
util_free_array(parts);
}
return host;
}
char *oci_default_tag(const char *name)
{
char temp[PATH_MAX] = { 0 };
char **parts = NULL;
char *last_part = NULL;
char *add_default_tag = "";
if (name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
parts = util_string_split(name, '/');
if (parts == NULL) {
ERROR("split %s by '/' failed", name);
return NULL;
}
last_part = get_last_part(parts);
if (last_part != NULL && strrchr(last_part, ':') == NULL) {
add_default_tag = DEFAULT_TAG;
}
util_free_array(parts);
// Add image's default tag
int nret = snprintf(temp, sizeof(temp), "%s%s", name, add_default_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed");
return NULL;
}
return util_strdup_s(temp);
}
char *oci_host_from_mirror(const char *mirror)
{
const char *host = mirror;
if (mirror == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
if (util_has_prefix(mirror, HTTPS_PREFIX)) {
host = mirror + strlen(HTTPS_PREFIX);
} else if (util_has_prefix(mirror, HTTPS_PREFIX)) {
host = mirror + strlen(HTTP_PREFIX);
}
return util_strdup_s(host);
}
char *oci_add_host(const char *host, const char *name)
{
char *with_host = NULL;
bool need_repo_prefix = false;
if (host == NULL || name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
if (strchr(name, '/') == NULL) {
need_repo_prefix = true;
}
with_host = util_common_calloc_s(strlen(host) + strlen("/") + strlen(DEFAULT_REPO_PREFIX) + strlen(name) + 1);
if (with_host == NULL) {
ERROR("out of memory");
return NULL;
}
(void)strcat(with_host, host);
(void)strcat(with_host, "/");
if (need_repo_prefix) {
(void)strcat(with_host, DEFAULT_REPO_PREFIX);
}
(void)strcat(with_host, name);
return with_host;
}
// normalize the unqualified image to be domain/repo/image...
char *oci_normalize_image_name(const char *name)
{
char temp[PATH_MAX] = { 0 };
char **parts = NULL;
char *last_part = NULL;
char *add_dockerio = "";
char *add_library = "";
char *add_default_tag = "";
// Add prefix docker.io if necessary
parts = util_string_split(name, '/');
if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") &&
strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) {
add_dockerio = DEFAULT_HOSTNAME;
}
// Add library if necessary
if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) {
add_library = DEFAULT_REPO_PREFIX;
}
// Add default tag if necessary
last_part = get_last_part(parts);
if (last_part != NULL && strrchr(last_part, ':') == NULL) {
add_default_tag = DEFAULT_TAG;
}
util_free_array(parts);
// Normalize image name
int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed");
return NULL;
}
return util_strdup_s(temp);
}
int oci_split_image_name(const char *image_name, char **host, char **name, char **tag)
{
char *tag_pos = NULL;
char *name_pos = NULL;
char *tmp_image_name = NULL;
if (!util_valid_image_name(image_name)) {
ERROR("Invalid full image name %s", image_name);
return -1;
}
tmp_image_name = util_strdup_s(image_name);
tag_pos = util_tag_pos(tmp_image_name);
if (tag_pos != NULL) {
*tag_pos = 0;
tag_pos++;
if (tag != NULL) {
*tag = util_strdup_s(tag_pos);
}
}
name_pos = strchr(tmp_image_name, '/');
if (name_pos != NULL) {
*name_pos = 0;
name_pos++;
if (name != NULL) {
*name = util_strdup_s(name_pos);
}
if (host != NULL) {
*host = util_strdup_s(tmp_image_name);
}
}
free(tmp_image_name);
tmp_image_name = NULL;
return 0;
}
char *oci_full_image_name(const char *host, const char *name, const char *tag)
{
char temp[PATH_MAX] = { 0 };
const char *tmp_host = "";
const char *tmp_sep = "";
const char *tmp_prefix = "";
const char *tmp_colon = "";
const char *tmp_tag = DEFAULT_TAG;
if (name == NULL) {
ERROR("Invalid NULL name found when getting full image name");
return NULL;
}
if (host != NULL) {
tmp_host = host;
tmp_sep = "/";
}
if (strchr(name, '/') == NULL) {
tmp_prefix = DEFAULT_REPO_PREFIX;
}
if (tag != NULL) {
tmp_colon = ":";
tmp_tag = tag;
}
int nret = snprintf(temp, sizeof(temp), "%s%s%s%s%s%s", tmp_host, tmp_sep, tmp_prefix, name, tmp_colon, tmp_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed, host %s, name %s, tag %s", host, name, tag);
return NULL;
}
if (!util_valid_image_name(temp)) {
ERROR("Invalid full image name %s, host %s, name %s, tag %s", temp, host, name, tag);
return NULL;
}
return util_strdup_s(temp);
}
char *oci_strip_dockerio_prefix(const char *name)
{
char prefix[PATH_MAX] = { 0 };
size_t size = 0;
if (name == NULL) {
ERROR("NULL image name");
return NULL;
}
int nret = snprintf(prefix, sizeof(prefix), "%s%s", DEFAULT_HOSTNAME, DEFAULT_REPO_PREFIX);
if (nret < 0 || (size_t)nret >= sizeof(prefix)) {
ERROR("sprint prefix prefix failed");
return NULL;
}
// Strip docker.io/library
size = strlen(prefix);
if (strncmp(name, prefix, size) == 0 && strlen(name) > size) {
return util_strdup_s(name + size);
}
// Strip docker.io
size = strlen(DEFAULT_HOSTNAME);
if (strncmp(name, DEFAULT_HOSTNAME, size) == 0 && strlen(name) > size) {
return util_strdup_s(name + size);
}
return util_strdup_s(name);
}
/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
* iSulad licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* 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 v2 for more details.
* Author: WuJing
* Create: 2020-05-09
* Description: provide isula image common functions
********************************************************************************/
#ifndef __UTILS_IMAGES_H
#define __UTILS_IMAGE_H
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
#define HTTPS_PREFIX "https://"
#define HTTP_PREFIX "http://"
#define DEFAULT_TAG ":latest"
#define DEFAULT_HOSTNAME "docker.io/"
#define DEFAULT_REPO_PREFIX "library/"
char *oci_get_host(const char *name);
char *oci_host_from_mirror(const char *mirror);
char *oci_default_tag(const char *name);
char *oci_add_host(const char *domain, const char *name);
char *oci_normalize_image_name(const char *name);
int oci_split_image_name(const char *image_name, char **host, char **name, char **tag);
char *oci_full_image_name(const char *host, const char *name, const char *tag);
char *oci_strip_dockerio_prefix(const char *name);
#ifdef __cplusplus
}
#endif
#endif /* __UTILS_IMAGES_H */
......@@ -28,10 +28,6 @@
#include "filters.h"
#define DEFAULT_TAG ":latest"
#define DEFAULT_HOSTNAME "docker.io/"
#define DEFAULT_REPO_PREFIX "library/"
bool oci_detect(const char *image_name)
{
if (image_name == NULL) {
......@@ -41,165 +37,6 @@ bool oci_detect(const char *image_name)
return storage_image_exist(image_name);
}
char *get_last_part(char **parts)
{
char *last_part = NULL;
char **p;
for (p = parts; p != NULL && *p != NULL; p++) {
last_part = *p;
}
return last_part;
}
char *oci_get_host(const char *name)
{
char **parts = NULL;
char *host = NULL;
if (name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
parts = util_string_split(name, '/');
if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") &&
strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) {
util_free_array(parts);
return NULL;
}
if (parts != NULL) {
host = util_strdup_s(parts[0]);
util_free_array(parts);
}
return host;
}
char *oci_default_tag(const char *name)
{
char temp[PATH_MAX] = { 0 };
char **parts = NULL;
char *last_part = NULL;
char *add_default_tag = "";
if (name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
parts = util_string_split(name, '/');
if (parts == NULL) {
ERROR("split %s by '/' failed", name);
return NULL;
}
last_part = get_last_part(parts);
if (last_part != NULL && strrchr(last_part, ':') == NULL) {
add_default_tag = DEFAULT_TAG;
}
util_free_array(parts);
// Add image's default tag
int nret = snprintf(temp, sizeof(temp), "%s%s", name, add_default_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed");
return NULL;
}
return util_strdup_s(temp);
}
char *oci_host_from_mirror(const char *mirror)
{
const char *host = mirror;
if (mirror == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
if (util_has_prefix(mirror, HTTPS_PREFIX)) {
host = mirror + strlen(HTTPS_PREFIX);
} else if (util_has_prefix(mirror, HTTPS_PREFIX)) {
host = mirror + strlen(HTTP_PREFIX);
}
return util_strdup_s(host);
}
char *oci_add_host(const char *host, const char *name)
{
char *with_host = NULL;
bool need_repo_prefix = false;
if (host == NULL || name == NULL) {
ERROR("Invalid NULL param");
return NULL;
}
if (strchr(name, '/') == NULL) {
need_repo_prefix = true;
}
with_host = util_common_calloc_s(strlen(host) + strlen("/") + strlen(DEFAULT_REPO_PREFIX) + strlen(name) + 1);
if (with_host == NULL) {
ERROR("out of memory");
return NULL;
}
(void)strcat(with_host, host);
(void)strcat(with_host, "/");
if (need_repo_prefix) {
(void)strcat(with_host, DEFAULT_REPO_PREFIX);
}
(void)strcat(with_host, name);
return with_host;
}
// normalize the unqualified image to be domain/repo/image...
char *oci_normalize_image_name(const char *name)
{
char temp[PATH_MAX] = { 0 };
char **parts = NULL;
char *last_part = NULL;
char *add_dockerio = "";
char *add_library = "";
char *add_default_tag = "";
// Add prefix docker.io if necessary
parts = util_string_split(name, '/');
if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") &&
strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) {
add_dockerio = DEFAULT_HOSTNAME;
}
// Add library if necessary
if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) {
add_library = DEFAULT_REPO_PREFIX;
}
// Add default tag if necessary
last_part = get_last_part(parts);
if (last_part != NULL && strrchr(last_part, ':') == NULL) {
add_default_tag = DEFAULT_TAG;
}
util_free_array(parts);
// Normalize image name
int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed");
return NULL;
}
return util_strdup_s(temp);
}
char *oci_resolve_image_name(const char *name)
{
if (util_valid_short_sha256_id(name) && storage_image_exist(name)) {
......@@ -209,114 +46,6 @@ char *oci_resolve_image_name(const char *name)
return oci_normalize_image_name(name);
}
int oci_split_image_name(const char *image_name, char **host, char **name, char **tag)
{
char *tag_pos = NULL;
char *name_pos = NULL;
char *tmp_image_name = NULL;
if (!util_valid_image_name(image_name)) {
ERROR("Invalid full image name %s", image_name);
return -1;
}
tmp_image_name = util_strdup_s(image_name);
tag_pos = util_tag_pos(tmp_image_name);
if (tag_pos != NULL) {
*tag_pos = 0;
tag_pos++;
if (tag != NULL) {
*tag = util_strdup_s(tag_pos);
}
}
name_pos = strchr(tmp_image_name, '/');
if (name_pos != NULL) {
*name_pos = 0;
name_pos++;
if (name != NULL) {
*name = util_strdup_s(name_pos);
}
if (host != NULL) {
*host = util_strdup_s(tmp_image_name);
}
}
free(tmp_image_name);
tmp_image_name = NULL;
return 0;
}
char *oci_full_image_name(const char *host, const char *name, const char *tag)
{
char temp[PATH_MAX] = { 0 };
const char *tmp_host = "";
const char *tmp_sep = "";
const char *tmp_prefix = "";
const char *tmp_colon = "";
const char *tmp_tag = DEFAULT_TAG;
if (name == NULL) {
ERROR("Invalid NULL name found when getting full image name");
return NULL;
}
if (host != NULL) {
tmp_host = host;
tmp_sep = "/";
}
if (strchr(name, '/') == NULL) {
tmp_prefix = DEFAULT_REPO_PREFIX;
}
if (tag != NULL) {
tmp_colon = ":";
tmp_tag = tag;
}
int nret = snprintf(temp, sizeof(temp), "%s%s%s%s%s%s", tmp_host, tmp_sep, tmp_prefix, name, tmp_colon, tmp_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed, host %s, name %s, tag %s", host, name, tag);
return NULL;
}
if (!util_valid_image_name(temp)) {
ERROR("Invalid full image name %s, host %s, name %s, tag %s", temp, host, name, tag);
return NULL;
}
return util_strdup_s(temp);
}
static char *oci_strip_dockerio_prefix(const char *name)
{
char prefix[PATH_MAX] = { 0 };
size_t size = 0;
if (name == NULL) {
ERROR("NULL image name");
return NULL;
}
int nret = snprintf(prefix, sizeof(prefix), "%s%s", DEFAULT_HOSTNAME, DEFAULT_REPO_PREFIX);
if (nret < 0 || (size_t)nret >= sizeof(prefix)) {
ERROR("sprint prefix prefix failed");
return NULL;
}
// Strip docker.io/library
size = strlen(prefix);
if (strncmp(name, prefix, size) == 0 && strlen(name) > size) {
return util_strdup_s(name + size);
}
// Strip docker.io
size = strlen(DEFAULT_HOSTNAME);
if (strncmp(name, DEFAULT_HOSTNAME, size) == 0 && strlen(name) > size) {
return util_strdup_s(name + size);
}
return util_strdup_s(name);
}
static void oci_strip_dockerio(const imagetool_image *image)
{
......
......@@ -20,22 +20,12 @@
#include "isula_libutils/imagetool_image.h"
#include "isula_libutils/oci_image_spec.h"
#define HTTPS_PREFIX "https://"
#define HTTP_PREFIX "http://"
#ifdef __cplusplus
extern "C" {
#endif
char *oci_get_host(const char *name);
char *oci_host_from_mirror(const char *mirror);
char *oci_default_tag(const char *name);
char *oci_add_host(const char *domain, const char *name);
char *oci_normalize_image_name(const char *name);
int oci_split_image_name(const char *image_name, char **host, char **name, char **tag);
char *oci_full_image_name(const char *host, const char *name, const char *tag);
bool oci_detect(const char *image_name);
char *oci_resolve_image_name(const char *name);
bool oci_detect(const char *image_name);
int oci_get_user_conf(const char *basefs, host_config *hc, const char *userstr, defs_process_user *puser);
int oci_list_images(const im_list_request *request, imagetool_images_list **images);
int oci_status_image(im_status_request *request, im_status_response **response);
......
......@@ -30,8 +30,6 @@
#include "auths.h"
#include "registry_token.h"
#define HTTPS_PREFIX "https://"
#define HTTP_PREFIX "https://"
#define MIN_TOKEN_EXPIRES_IN 60
static int http_request_get_token(pull_descriptor *desc, challenge *c, char **output);
......
......@@ -744,7 +744,7 @@ static int register_image(pull_descriptor *desc)
ret = storage_img_set_image_size(image_id);
if (ret != 0) {
ERROR("set image size failed for %s failed", image_id);
goto out;
goto out;
}
out:
......
......@@ -2205,62 +2205,6 @@ out:
return ret;
}
#define DEFAULT_TAG ":latest"
#define DEFAULT_HOSTNAME "docker.io/"
#define DEFAULT_REPO_PREFIX "library/"
static char *get_last_part(char **parts)
{
char *last_part = NULL;
char **p;
for (p = parts; p != NULL && *p != NULL; p++) {
last_part = *p;
}
return last_part;
}
// normalize the unqualified image to be domain/repo/image...
static char *normalize_image_name(const char *name)
{
char temp[PATH_MAX] = { 0 };
char **parts = NULL;
char *last_part = NULL;
char *add_dockerio = "";
char *add_library = "";
char *add_default_tag = "";
// Add prefix docker.io if necessary
parts = util_string_split(name, '/');
if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") &&
strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) {
add_dockerio = DEFAULT_HOSTNAME;
}
// Add library if necessary
if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) {
add_library = DEFAULT_REPO_PREFIX;
}
// Add default tag if necessary
last_part = get_last_part(parts);
if (last_part != NULL && strrchr(last_part, ':') == NULL) {
add_default_tag = DEFAULT_TAG;
}
util_free_array(parts);
// Normalize image name
int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag);
if (nret < 0 || (size_t)nret >= sizeof(temp)) {
ERROR("sprint temp image name failed");
return NULL;
}
return util_strdup_s(temp);
}
// Parsing a reference string as a possible identifier, full digest, or familiar name.
static char *parse_digest_reference(const char *ref)
{
......@@ -2274,7 +2218,7 @@ static char *parse_digest_reference(const char *ref)
return util_strdup_s(ref);
}
return normalize_image_name(ref);
return oci_normalize_image_name(ref);
}
static int pack_repo_digest(char ***old_repo_digests, const char **image_tags, const char *digest, char ***repo_digests)
......
......@@ -265,7 +265,7 @@ container_inspect_graph_driver *graphdriver_get_metadata(const char *id)
}
inspect_driver->name = util_strdup_s(g_graphdriver->name);
if (!strcmp(g_graphdriver->name, DRIVER_OVERLAY_NAME) || !strcmp(g_graphdriver->name, DRIVER_OVERLAY2_NAME)) {
for (i = 0; i < metadata->len; i++) {
if (!strcmp(metadata->keys[i], "LowerDir")) {
......
......@@ -10,6 +10,7 @@ add_executable(${EXE}
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_string.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_convert.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_file.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_images.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/util_atomic.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/log.c
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/sha256/sha256.c
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册