iSulad/0016-support-default-container-log-options.patch
haozi007 112089d24b sync from openeuler
1. support default container log options
2. fix bugs
3. show all mutl network's ips
4. update api.proto to k8s v1.19.3

Signed-off-by: haozi007 <liuhao27@huawei.com>
2020-12-03 19:20:13 +08:00

1304 lines
46 KiB
Diff

From f4c5700bcf82bacc85e4e25b7afe94d65d3e54f4 Mon Sep 17 00:00:00 2001
From: haozi007 <liuhao27@huawei.com>
Date: Sat, 14 Nov 2020 18:44:08 +0800
Subject: [PATCH 16/17] support default container log options
Signed-off-by: haozi007 <liuhao27@huawei.com>
---
src/cmd/isula/base/create.c | 141 +--------
src/cmd/isula/client_arguments.c | 1 -
src/cmd/isulad/isulad_commands.c | 84 ++++++
src/cmd/isulad/isulad_commands.h | 38 ++-
src/cmd/isulad/main.c | 73 +++++
src/cmd/options/opt_log.c | 276 ++++++++++++++++++
src/cmd/options/opt_log.h | 39 +++
src/common/constants.h | 4 +
src/contrib/config/daemon.json | 3 +
src/daemon/config/daemon_arguments.c | 12 +-
src/daemon/config/daemon_arguments.h | 54 ++--
src/daemon/config/isulad_config.c | 84 +++++-
src/daemon/config/isulad_config.h | 2 +
.../executor/container_cb/execution_create.c | 150 +++++++---
.../modules/service/service_container.c | 1 +
15 files changed, 750 insertions(+), 212 deletions(-)
create mode 100644 src/cmd/options/opt_log.c
create mode 100644 src/cmd/options/opt_log.h
diff --git a/src/cmd/isula/base/create.c b/src/cmd/isula/base/create.c
index a79b18b9..87c1086b 100644
--- a/src/cmd/isula/base/create.c
+++ b/src/cmd/isula/base/create.c
@@ -38,6 +38,7 @@
#include "pull.h"
#include "constants.h"
#include "connect.h"
+#include "opt_log.h"
#include "utils_array.h"
#include "utils_convert.h"
@@ -1348,120 +1349,6 @@ static int add_new_annotation(const char *key, const char *value, struct client_
return 0;
}
-typedef int (*log_opt_callback_t)(const char *key, const char *value, struct client_arguments *args);
-
-typedef struct log_opt_parse {
- const char *key;
- const char *anno_key;
- log_opt_callback_t cb;
-} log_opt_parse_t;
-
-static int log_opt_common_cb(const char *key, const char *value, struct client_arguments *args)
-{
- return add_new_annotation(key, value, args);
-}
-
-static int log_opt_max_file_cb(const char *key, const char *value, struct client_arguments *args)
-{
- unsigned int ptr = 0;
- int ret = -1;
-
- if (util_safe_uint(value, &ptr)) {
- return ret;
- }
- if (ptr == 0) {
- COMMAND_ERROR("Invalid option 'max-file', value:%s", value);
- return ret;
- }
-
- return add_new_annotation(key, value, args);
-}
-
-static int log_opt_syslog_facility(const char *key, const char *value, struct client_arguments *args)
-{
-#define FACILITIES_LEN 20
- const char *facility_keys[FACILITIES_LEN] = { "kern", "user", "mail", "daemon", "auth",
- "syslog", "lpr", "news", "uucp", "cron",
- "authpriv", "ftp", "local0", "local1", "local2",
- "local3", "local4", "local5", "local6", "local7"
- };
- int i;
-
- for (i = 0; i < FACILITIES_LEN; i++) {
- if (strcmp(facility_keys[i], value) == 0) {
- break;
- }
- }
-
- if (i == FACILITIES_LEN) {
- return -1;
- }
-
- return add_new_annotation(key, value, args);
-}
-
-static int log_opt_disable_log_cb(const char *key, const char *value, struct client_arguments *args)
-{
- int ret = -1;
-
- if (strcmp(value, "true") == 0) {
- ret = add_new_annotation(key, "none", args);
- } else if (strcmp(value, "false") == 0) {
- ret = 0;
- } else {
- COMMAND_ERROR("Invalid option 'disable-log', value:%s", value);
- }
-
- return ret;
-}
-
-static int log_opt_parse_options(struct client_arguments *args, const char *optkey, const char *value)
-{
-#define OPTIONS_MAX 5
- log_opt_parse_t log_opts[OPTIONS_MAX] = {
- {
- .key = "max-size",
- .anno_key = CONTAINER_LOG_CONFIG_KEY_SIZE,
- .cb = &log_opt_common_cb,
- },
- {
- .key = "max-file",
- .anno_key = CONTAINER_LOG_CONFIG_KEY_ROTATE,
- .cb = &log_opt_max_file_cb,
- },
- {
- .key = "disable-log",
- .anno_key = CONTAINER_LOG_CONFIG_KEY_FILE,
- .cb = &log_opt_disable_log_cb,
- },
- {
- .key = "syslog-tag",
- .anno_key = CONTAINER_LOG_CONFIG_KEY_SYSLOG_TAG,
- .cb = &log_opt_common_cb,
- },
- {
- .key = "syslog-facility",
- .anno_key = CONTAINER_LOG_CONFIG_KEY_SYSLOG_FACILITY,
- .cb = &log_opt_syslog_facility,
- },
- };
- int ret = -1;
- int i;
-
- for (i = 0; i < OPTIONS_MAX; i++) {
- if (strcmp(optkey, log_opts[i].key) == 0) {
- ret = log_opts[i].cb(log_opts[i].anno_key, value, args);
- break;
- }
- }
-
- if (i == OPTIONS_MAX) {
- COMMAND_ERROR("Unsupported log opt: %s", optkey);
- }
-
- return ret;
-}
-
int log_opt_parser(struct client_arguments *args, const char *option)
{
int ret = -1;
@@ -1504,10 +1391,22 @@ int log_opt_parser(struct client_arguments *args, const char *option)
tmp[len] = '\0';
value += 1;
- ret = log_opt_parse_options(args, optkey, value);
+ if (args->annotations == NULL) {
+ args->annotations = util_common_calloc_s(sizeof(json_map_string_string));
+ if (args->annotations == NULL) {
+ COMMAND_ERROR("Out of Memory");
+ goto out;
+ }
+ }
+ if (!parse_container_log_opt(optkey, value, args->annotations)) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = 0;
out:
- if (ret < 0) {
+ if (ret != 0) {
COMMAND_ERROR("Invalid option: %s", option);
}
free(tmp);
@@ -1523,21 +1422,13 @@ int callback_log_opt(command_option_t *option, const char *value)
int callback_log_driver(command_option_t *option, const char *value)
{
-#define DRIVER_MAX 2
- const char *drivers[] = { CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER, CONTAINER_LOG_CONFIG_SYSLOG_DRIVER };
- int i = 0;
struct client_arguments *args = (struct client_arguments *)option->data;
if (value == NULL) {
return -1;
}
- for (; i < DRIVER_MAX; i++) {
- if (strcmp(value, drivers[i]) == 0) {
- break;
- }
- }
- if (i == DRIVER_MAX) {
+ if (!check_opt_container_log_driver(value)) {
return -1;
}
diff --git a/src/cmd/isula/client_arguments.c b/src/cmd/isula/client_arguments.c
index ad6ba40c..ffe40c2e 100644
--- a/src/cmd/isula/client_arguments.c
+++ b/src/cmd/isula/client_arguments.c
@@ -123,7 +123,6 @@ int client_arguments_init(struct client_arguments *args)
} else {
args->socket = util_strdup_s(DEFAULT_UNIX_SOCKET);
}
- args->log_driver = util_strdup_s("json-file");
(void)memset(&args->custom_conf, 0, sizeof(struct custom_configs));
(void)memset(&args->cr, 0, sizeof(struct args_cgroup_resources));
diff --git a/src/cmd/isulad/isulad_commands.c b/src/cmd/isulad/isulad_commands.c
index 11e166fc..d0ab029c 100644
--- a/src/cmd/isulad/isulad_commands.c
+++ b/src/cmd/isulad/isulad_commands.c
@@ -32,6 +32,7 @@
#include "utils_string.h"
#include "utils_verify.h"
#include "opt_ulimit.h"
+#include "opt_log.h"
const char isulad_desc[] = "GLOBAL OPTIONS:";
const char isulad_usage[] = "[global options]";
@@ -103,6 +104,89 @@ out:
return ret;
}
+int server_callback_container_log_driver(command_option_t *option, const char *value)
+{
+ int ret = 0;
+ struct service_arguments *args = NULL;
+
+ if (option == NULL || value == NULL) {
+ COMMAND_ERROR("Invalid input arguments");
+ ret = -1;
+ goto out;
+ }
+ if (!check_opt_container_log_driver(value)) {
+ ret = -1;
+ goto out;
+ }
+
+ args = (struct service_arguments *)option->data;
+
+ free(args->json_confs->container_log->driver);
+ args->json_confs->container_log->driver = util_strdup_s(value);
+
+out:
+ return ret;
+}
+
+int server_callback_container_log(command_option_t *option, const char *value)
+{
+ int ret = 0;
+ struct service_arguments *args = NULL;
+ json_map_string_string *log_opts = NULL;
+ char **split_opts = NULL;
+ size_t i;
+
+ if (option == NULL || value == NULL) {
+ COMMAND_ERROR("Invalid input arguments");
+ ret = -1;
+ goto out;
+ }
+ split_opts = util_string_split_multi(value, '=');
+ // value must be format of 'key = value'
+ if (util_array_len((const char **)split_opts) != 2) {
+ COMMAND_ERROR("Invalid input arguments: %s", value);
+ ret = -1;
+ goto out;
+ }
+
+ if (!check_raw_log_opt(split_opts[0])) {
+ COMMAND_ERROR("Unsupport container log key: %s", split_opts[0]);
+ ret = -1;
+ goto out;
+ }
+
+ args = (struct service_arguments *)option->data;
+ if (args->json_confs->container_log->opts == NULL) {
+ args->json_confs->container_log->opts = util_common_calloc_s(sizeof(json_map_string_string));
+ }
+ log_opts = args->json_confs->container_log->opts;
+ if (log_opts == NULL) {
+ COMMAND_ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+
+ for (i = 0; i < log_opts->len; i++) {
+ // just update found key-value
+ if (strcmp(split_opts[0], log_opts->keys[i]) == 0) {
+ free(log_opts->values[i]);
+ log_opts->values[i] = util_strdup_s(split_opts[1]);
+ goto out;
+ }
+ }
+
+ ret = append_json_map_string_string(log_opts, split_opts[0], split_opts[1]);
+ if (ret != 0) {
+ COMMAND_ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+
+out:
+ util_free_array(split_opts);
+ return ret;
+}
+
static void command_init_isulad(command_t *self, command_option_t *options, int options_len, int argc,
const char **argv, const char *description, const char *usage)
{
diff --git a/src/cmd/isulad/isulad_commands.h b/src/cmd/isulad/isulad_commands.h
index 78ec5846..02007f3c 100644
--- a/src/cmd/isulad/isulad_commands.h
+++ b/src/cmd/isulad/isulad_commands.h
@@ -37,14 +37,14 @@ int update_hosts(struct service_arguments *args);
int update_default_ulimit(struct service_arguments *args);
int command_default_ulimit_append(command_option_t *option, const char *arg);
-#define ISULAD_OPTIONS(cmdargs) \
- { CMD_OPT_TYPE_CALLBACK, \
- false, \
- "host", \
- 'H', \
- &(cmdargs)->hosts, \
- "The socket name used to create gRPC server", \
- command_valid_socket_append_array }, \
+#define ISULAD_OPTIONS(cmdargs) \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, \
+ "host", \
+ 'H', \
+ &(cmdargs)->hosts, \
+ "The socket name used to create gRPC server", \
+ command_valid_socket_append_array }, \
{ CMD_OPT_TYPE_STRING_DUP, false, "pidfile", 'p', &(cmdargs)->json_confs->pidfile, \
"Save pid into this file", NULL }, \
{ CMD_OPT_TYPE_BOOL, false, "help", 0, &(cmdargs)->help, "Show help", NULL }, \
@@ -99,13 +99,27 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
(cmdargs), \
"Set daemon log driver options, such as: log-path=/tmp/logs/ to set directory where to store daemon logs", \
server_callback_log_opt }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, \
+ "container-log-driver", \
+ 0, \
+ (cmdargs), \
+ "Set default container log driver, such as: json-file", \
+ server_callback_container_log_driver }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, \
+ "container-log-opts", \
+ 0, \
+ (cmdargs), \
+ "Set default container log driver options, such as: max-file=7 to set max number of container log files", \
+ server_callback_container_log }, \
{ CMD_OPT_TYPE_BOOL, false, "version", 'V', &(cmdargs)->version, "Print the version", NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"group", \
'G', \
&(cmdargs)->json_confs->group, \
- "Group for the unix socket(default is isula)", \
+ "Group for the unix socket(default is isula)", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
@@ -249,9 +263,9 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
&(cmdargs)->json_confs->websocket_server_listening_port, \
"CRI websocket streaming service listening port (default 10350)", \
command_convert_uint }, \
- { \
- CMD_OPT_TYPE_BOOL, false, "selinux-enabled", 0, &(cmdargs)->json_confs->selinux_enabled, \
- "Enable selinux support", NULL \
+ { CMD_OPT_TYPE_BOOL, \
+ false, "selinux-enabled", 0, &(cmdargs)->json_confs->selinux_enabled, \
+ "Enable selinux support", NULL \
}
#ifdef __cplusplus
diff --git a/src/cmd/isulad/main.c b/src/cmd/isulad/main.c
index bef78f87..ce93eaa0 100644
--- a/src/cmd/isulad/main.c
+++ b/src/cmd/isulad/main.c
@@ -70,6 +70,7 @@
#include "utils_string.h"
#include "utils_verify.h"
#include "volume_api.h"
+#include "opt_log.h"
#ifdef GRPC_CONNECTOR
#include "clibcni/api.h"
@@ -836,6 +837,73 @@ static int configure_kernel_security_support(const struct service_arguments *arg
}
#endif
+static int use_default_log_opts_for_json_file(bool rotate_found, bool size_found,
+ isulad_daemon_configs_container_log *conf)
+{
+ int nret = 0;
+
+ if (conf->opts == NULL) {
+ conf->opts = util_common_calloc_s(sizeof(json_map_string_string));
+ }
+ if (conf->opts == NULL) {
+ ERROR("Out of memory");
+ return -1;
+ }
+
+ if (!rotate_found) {
+ nret = append_json_map_string_string(conf->opts, CONTAINER_LOG_CONFIG_KEY_ROTATE, "7");
+ if (nret != 0) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ }
+
+ if (!size_found) {
+ nret = append_json_map_string_string(conf->opts, CONTAINER_LOG_CONFIG_KEY_SIZE, "1MB");
+ if (nret != 0) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static int update_container_log_configs(isulad_daemon_configs_container_log *conf)
+{
+ bool rotate_found = false;
+ bool size_found = false;
+ size_t i;
+
+ if (conf->driver == NULL) {
+ conf->driver = util_strdup_s(CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER);
+ }
+
+ if (!parse_container_log_opts(&conf->opts)) {
+ return -1;
+ }
+
+ /* validate daemon container log configs */
+ for (i = 0; conf->opts != NULL && i < conf->opts->len; i++) {
+ if (!check_opt_container_log_opt(conf->driver, conf->opts->keys[i])) {
+ return -1;
+ }
+
+ if (strcmp(CONTAINER_LOG_CONFIG_KEY_ROTATE, conf->opts->keys[i]) == 0) {
+ rotate_found = true;
+ } else if (strcmp(CONTAINER_LOG_CONFIG_KEY_SIZE, conf->opts->keys[i]) == 0) {
+ size_found = true;
+ }
+ }
+
+ // set default log opts for json file driver
+ if (strcmp(conf->driver, CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER) == 0) {
+ return use_default_log_opts_for_json_file(rotate_found, size_found, conf);
+ }
+
+ return 0;
+}
+
static int update_server_args(struct service_arguments *args)
{
int ret = 0;
@@ -860,6 +928,11 @@ static int update_server_args(struct service_arguments *args)
goto out;
}
+ if (update_container_log_configs(args->json_confs->container_log) != 0) {
+ ret = -1;
+ goto out;
+ }
+
/* check args */
if (check_args(args)) {
ret = -1;
diff --git a/src/cmd/options/opt_log.c b/src/cmd/options/opt_log.c
new file mode 100644
index 00000000..f6c18b23
--- /dev/null
+++ b/src/cmd/options/opt_log.c
@@ -0,0 +1,276 @@
+/******************************************************************************
+ * 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: haozi007
+ * Create: 2020-11-16
+ * Description: provide log options parse function
+ ******************************************************************************/
+#include "opt_log.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include <isula_libutils/log.h>
+
+#include "constants.h"
+#include "utils.h"
+#include "utils_array.h"
+#include "utils_convert.h"
+#include "utils_string.h"
+
+#define DRIVER_MAX 2
+
+typedef int (*log_opt_callback_t)(const char *key, const char *value, char **parsed_val);
+
+typedef struct log_opt_parse {
+ const char *key;
+ const char *real_key;
+ log_opt_callback_t cb;
+} log_opt_parse_t;
+
+static int log_opt_common_cb(const char *key, const char *value, char **parsed_val)
+{
+ *parsed_val = util_strdup_s(value);
+ return 0;
+}
+
+static int log_opt_max_file_cb(const char *key, const char *value, char **parsed_val)
+{
+ unsigned int ptr = 0;
+ int ret = -1;
+
+ if (util_safe_uint(value, &ptr)) {
+ return ret;
+ }
+ if (ptr == 0) {
+ ERROR("Invalid option 'max-file', value:%s", value);
+ return ret;
+ }
+
+ *parsed_val = util_strdup_s(value);
+ return 0;
+}
+
+static int log_opt_syslog_facility(const char *key, const char *value, char **parsed_val)
+{
+ const char *facility_values[] = { "kern", "user", "mail", "daemon", "auth",
+ "syslog", "lpr", "news", "uucp", "cron",
+ "authpriv", "ftp", "local0", "local1", "local2",
+ "local3", "local4", "local5", "local6", "local7"
+ };
+ int i;
+ size_t f_len = sizeof(facility_values) / sizeof(const char *);
+
+ for (i = 0; i < f_len; i++) {
+ if (strcmp(facility_values[i], value) == 0) {
+ break;
+ }
+ }
+
+ if (i == f_len) {
+ ERROR("Invalid option 'syslog-facility', value:%s", value);
+ return -1;
+ }
+
+ *parsed_val = util_strdup_s(value);
+ return 0;
+}
+
+static int log_opt_disable_log_cb(const char *key, const char *value, char **parsed_val)
+{
+ int ret = -1;
+
+ if (strcmp(value, "true") == 0) {
+ *parsed_val = util_strdup_s("none");
+ ret = 0;
+ } else if (strcmp(value, "false") == 0) {
+ ret = 0;
+ }
+
+ if (ret != 0) {
+ ERROR("Invalid option 'disable-log', value:%s", value);
+ }
+
+ return ret;
+}
+
+bool parse_container_log_opt(const char *key, const char *val, json_map_string_string *opts)
+{
+#define LOG_PARSER_MAX 5
+ size_t i, j;
+ log_opt_parse_t support_parsers[LOG_PARSER_MAX] = {
+ {
+ .key = "max-size",
+ .real_key = CONTAINER_LOG_CONFIG_KEY_SIZE,
+ .cb = &log_opt_common_cb,
+ },
+ {
+ .key = "max-file",
+ .real_key = CONTAINER_LOG_CONFIG_KEY_ROTATE,
+ .cb = &log_opt_max_file_cb,
+ },
+ {
+ .key = "disable-log",
+ .real_key = CONTAINER_LOG_CONFIG_KEY_FILE,
+ .cb = &log_opt_disable_log_cb,
+ },
+ {
+ .key = "syslog-tag",
+ .real_key = CONTAINER_LOG_CONFIG_KEY_SYSLOG_TAG,
+ .cb = &log_opt_common_cb,
+ },
+ {
+ .key = "syslog-facility",
+ .real_key = CONTAINER_LOG_CONFIG_KEY_SYSLOG_FACILITY,
+ .cb = &log_opt_syslog_facility,
+ },
+ };
+
+ if (key == NULL || opts == NULL) {
+ return false;
+ }
+
+ for (i = 0; i < LOG_PARSER_MAX; i++) {
+ if (strcmp(key, support_parsers[i].key) == 0) {
+ char *parsed_val = NULL;
+ int nret;
+
+ nret = support_parsers[i].cb(support_parsers[i].real_key, val, &parsed_val);
+ if (nret != 0) {
+ return false;
+ }
+ if (parsed_val == NULL) {
+ return true;
+ }
+
+ // check whether seted option, if setted, ust replace
+ for (j = 0; j < opts->len; j++) {
+ if (strcmp(opts->keys[j], support_parsers[i].real_key) == 0) {
+ free(opts->values[j]);
+ opts->values[j] = parsed_val;
+ return true;
+ }
+ }
+ nret = append_json_map_string_string(opts, support_parsers[i].real_key, parsed_val);
+ return true;
+ }
+ }
+ ERROR("Unknow log opts: %s = %s", key, val);
+ return false;
+}
+
+bool parse_container_log_opts(json_map_string_string **opts)
+{
+ size_t i;
+ json_map_string_string *result = NULL;
+
+ if (opts == NULL || *opts == NULL) {
+ return true;
+ }
+ result = util_common_calloc_s(sizeof(json_map_string_string));
+ if (result == NULL) {
+ ERROR("Out of memory");
+ return false;
+ }
+
+ for (i = 0; i < (*opts)->len; i++) {
+ if ((*opts)->values[i] == NULL || strlen((*opts)->values[i]) > OPT_MAX_LEN) {
+ ERROR("Too large value: %s for key:%s", (*opts)->values[i], (*opts)->keys[i]);
+ free_json_map_string_string(result);
+ return false;
+ }
+
+ if (!parse_container_log_opt((*opts)->keys[i], (*opts)->values[i], result)) {
+ free_json_map_string_string(result);
+ return false;
+ }
+ }
+
+ free_json_map_string_string(*opts);
+ *opts = result;
+ return true;
+}
+
+bool check_opt_container_log_opt(const char *driver, const char *opt_key)
+{
+#define DRIVER_MAX 2
+#define MAX_SUPPORT_KEY_LEN 3
+ const char *support_keys[][MAX_SUPPORT_KEY_LEN] = {
+ { CONTAINER_LOG_CONFIG_KEY_FILE, CONTAINER_LOG_CONFIG_KEY_ROTATE, CONTAINER_LOG_CONFIG_KEY_SIZE },
+ { CONTAINER_LOG_CONFIG_KEY_SYSLOG_TAG, CONTAINER_LOG_CONFIG_KEY_SYSLOG_FACILITY, NULL}
+ };
+ const char *driver_idx[] = { CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER, CONTAINER_LOG_CONFIG_SYSLOG_DRIVER };
+ size_t i, idx;
+
+ if (driver == NULL || opt_key == NULL) {
+ return false;
+ }
+ for (idx = 0; idx < DRIVER_MAX; idx++) {
+ if (strcmp(driver_idx[idx], driver) == 0) {
+ break;
+ }
+ }
+ if (idx == DRIVER_MAX) {
+ ERROR("Unsupport driver: %s", driver);
+ return false;
+ }
+
+ for (i = 0; i < MAX_SUPPORT_KEY_LEN; i++) {
+ if (support_keys[idx][i] == NULL) {
+ break;
+ }
+ if (strcmp(support_keys[idx][i], opt_key) == 0) {
+ return true;
+ }
+ }
+
+ ERROR("driver: %s, unsupport opts: %s", driver, opt_key);
+ return false;
+}
+
+bool check_raw_log_opt(const char *key)
+{
+ size_t i;
+ const char *support_keys[] = {
+ "max-size", "max-file", "disable-log", "syslog-tag", "syslog-facility"
+ };
+
+ if (key == NULL) {
+ return false;
+ }
+
+ for (i = 0; i < sizeof(support_keys) / sizeof(const char *); i++) {
+ if (strcmp(key, support_keys[i]) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool check_opt_container_log_driver(const char *driver)
+{
+ const char *supported_drivers[] = { CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER, CONTAINER_LOG_CONFIG_SYSLOG_DRIVER };
+ int i = 0;
+
+ if (driver == NULL) {
+ return false;
+ }
+
+ for (; i < DRIVER_MAX; i++) {
+ if (strcmp(driver, supported_drivers[i]) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
diff --git a/src/cmd/options/opt_log.h b/src/cmd/options/opt_log.h
new file mode 100644
index 00000000..f9daa02d
--- /dev/null
+++ b/src/cmd/options/opt_log.h
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * 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: haozi007
+ * Create: 2020-11-13
+ * Description: provide log options parse function
+ ******************************************************************************/
+#ifndef CMD_OPTIONS_LOG_H
+#define CMD_OPTIONS_LOG_H
+
+#include <stdbool.h>
+#include <isula_libutils/json_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool check_raw_log_opt(const char *key);
+
+bool check_opt_container_log_opt(const char *driver, const char *opt);
+
+bool check_opt_container_log_driver(const char *driver);
+
+bool parse_container_log_opt(const char *key, const char *val, json_map_string_string *opts);
+
+bool parse_container_log_opts(json_map_string_string **opts);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/common/constants.h b/src/common/constants.h
index 457e2423..dd2f3e5e 100644
--- a/src/common/constants.h
+++ b/src/common/constants.h
@@ -82,6 +82,8 @@ extern "C" {
#define CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER "json-file"
#define CONTAINER_LOG_CONFIG_SYSLOG_DRIVER "syslog"
+
+#define CONTAINER_LOG_CONFIG_KEY_PREFIX "log.console."
#define CONTAINER_LOG_CONFIG_KEY_DRIVER "log.console.driver"
#define CONTAINER_LOG_CONFIG_KEY_FILE "log.console.file"
#define CONTAINER_LOG_CONFIG_KEY_ROTATE "log.console.filerotate"
@@ -121,6 +123,8 @@ extern "C" {
#define MAX_HOSTS 10
+#define OPT_MAX_LEN 255
+
#define EVENT_ARGS_MAX 255
#define EVENT_EXTRA_ANNOTATION_MAX 255
diff --git a/src/contrib/config/daemon.json b/src/contrib/config/daemon.json
index 9ffb08ef..d2ce4d02 100644
--- a/src/contrib/config/daemon.json
+++ b/src/contrib/config/daemon.json
@@ -13,6 +13,9 @@
"max-size": "30KB"
},
"log-driver": "stdout",
+ "container-log": {
+ "driver": "json-file"
+ },
"hook-spec": "/etc/default/isulad/hooks/default.json",
"start-timeout": "2m",
"storage-driver": "overlay2",
diff --git a/src/daemon/config/daemon_arguments.c b/src/daemon/config/daemon_arguments.c
index ef287645..ba41a9a5 100644
--- a/src/daemon/config/daemon_arguments.c
+++ b/src/daemon/config/daemon_arguments.c
@@ -137,6 +137,14 @@ int service_arguments_init(struct service_arguments *args)
args->max_file = 7;
args->max_size = 1024 * 1024;
+ // init container log configs
+ args->json_confs->container_log = (isulad_daemon_configs_container_log *)util_common_calloc_s(sizeof(
+ isulad_daemon_configs_container_log));
+ if (args->json_confs->container_log == NULL) {
+ ERROR("Out of memory");
+ goto free_out;
+ }
+
args->json_confs->pidfile = util_strdup_s("/var/run/isulad.pid");
args->json_confs->storage_driver = util_strdup_s("overlay2");
args->json_confs->native_umask = util_strdup_s(UMASK_SECURE);
@@ -149,7 +157,6 @@ int service_arguments_init(struct service_arguments *args)
*(args->json_confs->use_decrypted_key) = true;
args->json_confs->insecure_skip_verify_enforce = false;
- args->image_opt_timeout = 5 * 60; // default image operation timeout 300s
if (set_daemon_default_tls_options(args) != 0) {
goto free_out;
}
@@ -241,6 +248,7 @@ int server_log_opt_parser(struct service_arguments *args, const char *option)
ret = append_json_map_string_string(args->json_confs->log_opts, key, value);
}
+ tmp[len] = '=';
out:
free(tmp);
return ret;
@@ -310,4 +318,4 @@ void free_default_ulimit(host_config_ulimits_element **default_ulimit)
free_host_config_ulimits_element(*p);
}
free(default_ulimit);
-}
\ No newline at end of file
+}
diff --git a/src/daemon/config/daemon_arguments.h b/src/daemon/config/daemon_arguments.h
index 77feb4d1..54099c81 100644
--- a/src/daemon/config/daemon_arguments.h
+++ b/src/daemon/config/daemon_arguments.h
@@ -31,38 +31,40 @@ extern "C" {
typedef void (*service_arguments_help_t)(void);
struct service_arguments {
- char *progname;
service_arguments_help_t print_help;
- bool quiet;
- bool help;
- bool version;
- char **hosts;
- size_t hosts_len;
-
- // struct service_arguments *server_conf;
+ struct { /* common args */
+ char *progname;
+ bool quiet;
+ bool help;
+ bool version;
+ char **hosts;
+ size_t hosts_len;
+ unsigned int websocket_server_listening_port;
+ };
+
+ struct { /* default configs for container */
+ // daemon hooks config
+ oci_runtime_spec_hooks *hooks;
+
+ host_config_ulimits_element **default_ulimit;
+ size_t default_ulimit_len;
+
+ unsigned int start_timeout;
+ };
+
+ struct { /* daemon log configs */
+ unsigned int log_file_mode;
+ char *logpath;
+ int64_t max_size;
+ int max_file;
+ };
+
+ // store all daemon.json configs
isulad_daemon_configs *json_confs;
- /* parsed configs */
- oci_runtime_spec_hooks *hooks;
-
- unsigned int start_timeout;
- unsigned int image_opt_timeout;
-
- /* log-opts */
- unsigned int log_file_mode;
- char *logpath;
- int64_t max_size;
- int max_file;
-
- /* default configs */
- host_config_ulimits_element **default_ulimit;
- size_t default_ulimit_len;
- unsigned int websocket_server_listening_port;
-
// remaining arguments
char * const *argv;
-
int argc;
};
diff --git a/src/daemon/config/isulad_config.c b/src/daemon/config/isulad_config.c
index f6e5ffdb..314545fa 100644
--- a/src/daemon/config/isulad_config.c
+++ b/src/daemon/config/isulad_config.c
@@ -27,9 +27,9 @@
#include <isula_libutils/isulad_daemon_configs.h>
#include <isula_libutils/json_common.h>
#include <isula_libutils/oci_runtime_spec.h>
+#include <isula_libutils/log.h>
#include "constants.h"
-#include "isula_libutils/log.h"
#include "utils.h"
#include "sysinfo.h"
#include "err_msg.h"
@@ -815,6 +815,61 @@ out:
return logdriver;
}
+/* conf get default container log opts */
+int conf_get_container_log_opts(isulad_daemon_configs_container_log **opts)
+{
+ struct service_arguments *conf = NULL;
+ isulad_daemon_configs_container_log *result = NULL;
+ isulad_daemon_configs_container_log *work = NULL;
+ size_t i;
+ int ret = 0;
+
+ if (isulad_server_conf_rdlock() != 0) {
+ return -1;
+ }
+
+ conf = conf_get_server_conf();
+ if (conf == NULL || conf->json_confs->container_log == NULL) {
+ goto out;
+ }
+ work = conf->json_confs->container_log;
+
+ result = util_common_calloc_s(sizeof(isulad_daemon_configs_container_log));
+ if (result == NULL) {
+ ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+ result->driver = util_strdup_s(work->driver);
+ if (work->opts == NULL) {
+ *opts = result;
+ result = NULL;
+ goto out;
+ }
+ if (work->opts->len > 0) {
+ result->opts = util_common_calloc_s(sizeof(json_map_string_string));
+ if (result->opts == NULL) {
+ ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+ }
+ for (i = 0; i < work->opts->len; i++) {
+ if (append_json_map_string_string(result->opts, work->opts->keys[i], work->opts->values[i]) != 0) {
+ ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+ }
+
+ *opts = result;
+ result = NULL;
+out:
+ (void)isulad_server_conf_unlock();
+ free_isulad_daemon_configs_container_log(result);
+ return ret;
+}
+
/* conf get image layer check flag */
bool conf_get_image_layer_check_flag()
{
@@ -1311,7 +1366,7 @@ static int merge_hosts_conf_into_global(struct service_arguments *args, const is
return 0;
}
-static int merge_logs_conf_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
+static int do_merge_daemon_logs_conf(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
{
size_t i;
@@ -1334,6 +1389,31 @@ static int merge_logs_conf_into_global(struct service_arguments *args, isulad_da
return 0;
}
+// just mask isulad config to args
+static int do_merge_container_logs_conf(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
+{
+ if (tmp_json_confs->container_log == NULL) {
+ return 0;
+ }
+
+ // do not check valid of json log opts at here;
+ // while all config ready to do check.
+ free_isulad_daemon_configs_container_log(args->json_confs->container_log);
+ args->json_confs->container_log = tmp_json_confs->container_log;
+ tmp_json_confs->container_log = NULL;
+
+ return 0;
+}
+
+static int merge_logs_conf_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
+{
+ if (do_merge_daemon_logs_conf(args, tmp_json_confs)) {
+ return -1;
+ }
+
+ return do_merge_container_logs_conf(args, tmp_json_confs);
+}
+
static int merge_authorization_conf_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
{
args->json_confs->tls = tmp_json_confs->tls;
diff --git a/src/daemon/config/isulad_config.h b/src/daemon/config/isulad_config.h
index b5c64c54..fb523e5d 100644
--- a/src/daemon/config/isulad_config.h
+++ b/src/daemon/config/isulad_config.h
@@ -51,6 +51,8 @@ char *conf_get_isulad_log_gather_fifo_path();
int conf_get_cgroup_cpu_rt(int64_t *cpu_rt_period, int64_t *cpu_rt_runtime);
+int conf_get_container_log_opts(isulad_daemon_configs_container_log **opts);
+
char *conf_get_isulad_log_file();
char *conf_get_engine_log_file();
char *conf_get_enable_plugins();
diff --git a/src/daemon/executor/container_cb/execution_create.c b/src/daemon/executor/container_cb/execution_create.c
index 188d58b2..c2ddf88b 100644
--- a/src/daemon/executor/container_cb/execution_create.c
+++ b/src/daemon/executor/container_cb/execution_create.c
@@ -57,6 +57,7 @@
#include "utils_timestamp.h"
#include "utils_verify.h"
#include "selinux_label.h"
+#include "opt_log.h"
static int do_init_cpurt_cgroups_path(const char *path, int recursive_depth, const char *mnt_root,
int64_t cpu_rt_period, int64_t cpu_rt_runtime);
@@ -213,67 +214,128 @@ static container_config *get_container_spec_from_request(const container_create_
return container_spec;
}
-static int add_default_log_config_to_container_spec(const char *id, const char *runtime_root,
- container_config *container_spec)
+static void set_container_log_config_driver(isulad_daemon_configs_container_log *opts, container_config *container_spec)
{
- int ret = 0;
- int i = 0;
- bool file_found = false;
- bool rotate_found = false;
- bool size_found = false;
+ if (container_spec->log_driver != NULL) {
+ return;
+ }
+
+ // use daemon container log driver
+ container_spec->log_driver = util_strdup_s(opts->driver);
+ if (container_spec->log_driver != NULL) {
+ return;
+ }
+
+ // use default container log driver
+ container_spec->log_driver = util_strdup_s(CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER);
+}
- /* generate default log path */
- if (container_spec->log_driver != NULL &&
- strcmp(CONTAINER_LOG_CONFIG_SYSLOG_DRIVER, container_spec->log_driver) == 0) {
+static int merge_container_log_config_opts(const char *daemon_driver, const json_map_string_string *daemon_opts,
+ container_config *spec)
+{
+ size_t i, j;
+
+ if (daemon_driver == NULL || strcmp(daemon_driver, spec->log_driver) != 0) {
+ // daemon driver different with spec, just ignore log opts of daemon
return 0;
}
- if (container_spec->annotations == NULL) {
- container_spec->annotations = util_common_calloc_s(sizeof(json_map_string_string));
+ // merge daemon container log opts into spec
+ for (i = 0; daemon_opts != NULL && i < daemon_opts->len; i++) {
+ for (j = 0; j < spec->annotations->len; j++) {
+ if (strcmp(spec->annotations->keys[j], daemon_opts->keys[i]) == 0) {
+ break;
+ }
+ }
+ if (j == spec->annotations->len &&
+ append_json_map_string_string(spec->annotations, daemon_opts->keys[i], daemon_opts->values[i]) != 0) {
+ ERROR("Out of memory");
+ return -1;
+ }
}
- if (container_spec->annotations == NULL) {
+
+ return 0;
+}
+
+static int do_set_default_log_path_for_json_file(const char *id, const char *root, bool file_found,
+ container_config *spec)
+{
+ int nret = 0;
+ char default_path[PATH_MAX] = { 0 };
+
+ nret = snprintf(default_path, PATH_MAX, "%s/%s/console.log", root, id);
+ if (nret < 0 || nret >= PATH_MAX) {
+ ERROR("Create default log path for container %s failed", id);
+ return -1;
+ }
+ nret = append_json_map_string_string(spec->annotations, CONTAINER_LOG_CONFIG_KEY_FILE, default_path);
+ if (nret != 0) {
ERROR("Out of memory");
- ret = -1;
- goto out;
+ return -1;
}
- for (; i < container_spec->annotations->len; i++) {
- const char *tmp_key = container_spec->annotations->keys[i];
+ return 0;
+}
+
+static int do_check_container_log_config_opts(const char *id, const char *root, container_config *spec)
+{
+ size_t i;
+ bool file_found = false;
+
+ // check log opts is support by driver
+ for (i = 0; i < spec->annotations->len; i++) {
+ const char *tmp_key = spec->annotations->keys[i];
+ if (strncmp(tmp_key, CONTAINER_LOG_CONFIG_KEY_PREFIX, strlen(CONTAINER_LOG_CONFIG_KEY_PREFIX)) != 0) {
+ // ignore other configs
+ continue;
+ }
+ DEBUG("check log opt key: %s for driver: %s", tmp_key, spec->log_driver);
+ if (!check_opt_container_log_opt(spec->log_driver, tmp_key)) {
+ isulad_set_error_message("container log driver: %s, unsupport: %s", spec->log_driver, tmp_key);
+ return -1;
+ }
+
if (strcmp(CONTAINER_LOG_CONFIG_KEY_FILE, tmp_key) == 0) {
file_found = true;
- } else if (strcmp(CONTAINER_LOG_CONFIG_KEY_ROTATE, tmp_key) == 0) {
- rotate_found = true;
- } else if (strcmp(CONTAINER_LOG_CONFIG_KEY_SIZE, tmp_key) == 0) {
- size_found = true;
}
}
- if (!file_found) {
- char default_path[PATH_MAX] = { 0 };
- int nret = snprintf(default_path, PATH_MAX, "%s/%s/console.log", runtime_root, id);
- if (nret < 0 || nret >= PATH_MAX) {
- ERROR("Create default log path for container %s failed", id);
- ret = -1;
- goto out;
- }
- ret = append_json_map_string_string(container_spec->annotations, CONTAINER_LOG_CONFIG_KEY_FILE, default_path);
- if (ret != 0) {
- goto out;
- }
+
+ if (!file_found && strcmp(spec->log_driver, CONTAINER_LOG_CONFIG_JSON_FILE_DRIVER) == 0) {
+ return do_set_default_log_path_for_json_file(id, root, file_found, spec);
}
- if (!rotate_found) {
- ret = append_json_map_string_string(container_spec->annotations, CONTAINER_LOG_CONFIG_KEY_ROTATE, "7");
- if (ret != 0) {
- goto out;
- }
+
+ return 0;
+}
+
+static int set_container_log_config_to_container_spec(const char *id, const char *runtime_root,
+ container_config *container_spec)
+{
+ int ret = 0;
+ isulad_daemon_configs_container_log *daemon_container_opts = NULL;
+
+ if (conf_get_container_log_opts(&daemon_container_opts) != 0) {
+ return -1;
}
- if (!size_found) {
- ret = append_json_map_string_string(container_spec->annotations, CONTAINER_LOG_CONFIG_KEY_SIZE, "30KB");
- if (ret != 0) {
- goto out;
- }
+
+ set_container_log_config_driver(daemon_container_opts, container_spec);
+
+ if (container_spec->annotations == NULL) {
+ container_spec->annotations = util_common_calloc_s(sizeof(json_map_string_string));
+ }
+ if (container_spec->annotations == NULL) {
+ ERROR("Out of memory");
+ ret = -1;
+ goto out;
+ }
+
+ ret = merge_container_log_config_opts(daemon_container_opts->driver, daemon_container_opts->opts, container_spec);
+ if (ret != 0) {
+ goto out;
}
+ ret = do_check_container_log_config_opts(id, runtime_root, container_spec);
out:
+ free_isulad_daemon_configs_container_log(daemon_container_opts);
return ret;
}
@@ -287,7 +349,7 @@ static container_config *get_container_spec(const char *id, const char *runtime_
return NULL;
}
- if (add_default_log_config_to_container_spec(id, runtime_root, container_spec)) {
+ if (set_container_log_config_to_container_spec(id, runtime_root, container_spec)) {
goto error_out;
}
diff --git a/src/daemon/modules/service/service_container.c b/src/daemon/modules/service/service_container.c
index 529a68de..ae5db17d 100644
--- a/src/daemon/modules/service/service_container.c
+++ b/src/daemon/modules/service/service_container.c
@@ -770,6 +770,7 @@ static int do_start_container(container_t *cont, const char *console_fifos[], bo
goto close_exit_fd;
}
+
create_params.bundle = bundle;
create_params.state = cont->state_path;
create_params.oci_config_data = oci_spec;
--
2.25.1