From 5a0476a328a39764874257faa23696320656d3e3 Mon Sep 17 00:00:00 2001 From: zhangxiaoyu Date: Tue, 6 Sep 2022 18:45:53 +0800 Subject: [PATCH 5/5] add isulad args Signed-off-by: zhangxiaoyu --- src/cmd/isulad/isulad_commands.c | 18 +++++ src/cmd/isulad/isulad_commands.h | 80 ++++++++++++-------- src/cmd/isulad/main.c | 58 +++------------ src/daemon/config/daemon_arguments.c | 101 ++++++++++++++++++++------ src/daemon/config/daemon_arguments.h | 1 + src/daemon/config/isulad_config.c | 61 ++++++++++++++-- src/daemon/modules/events/collector.c | 2 +- 7 files changed, 213 insertions(+), 108 deletions(-) diff --git a/src/cmd/isulad/isulad_commands.c b/src/cmd/isulad/isulad_commands.c index ba7ca0e7..42d0bde6 100644 --- a/src/cmd/isulad/isulad_commands.c +++ b/src/cmd/isulad/isulad_commands.c @@ -105,6 +105,24 @@ out: return ret; } +int server_callback_cri_runtime(command_option_t *option, const char *value) +{ + struct service_arguments *args = NULL; + + if (option == NULL || value == NULL) { + COMMAND_ERROR("Invalid input arguments"); + return -1; + } + + args = (struct service_arguments *)option->data; + if (server_cri_runtime_parser(args, value) != 0) { + COMMAND_ERROR("Invalid value \"%s\" for flag --%s", value, option->large); + return -1; + } + + return 0; +} + int server_callback_container_log_driver(command_option_t *option, const char *value) { int ret = 0; diff --git a/src/cmd/isulad/isulad_commands.h b/src/cmd/isulad/isulad_commands.h index 0d70da4c..dc278f9c 100644 --- a/src/cmd/isulad/isulad_commands.h +++ b/src/cmd/isulad/isulad_commands.h @@ -71,10 +71,10 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); "host", \ 'H', \ &(cmdargs)->hosts, \ - "The socket name used to create gRPC server", \ + "The socket name used to create gRPC server (default \"unix:///var/run/isulad.sock\")", \ command_valid_socket_append_array }, \ { CMD_OPT_TYPE_STRING_DUP, false, "pidfile", 'p', &(cmdargs)->json_confs->pidfile, \ - "Save pid into this file", NULL }, \ + "Save pid into this file (default \"/var/run/isulad.pid\")", NULL }, \ { CMD_OPT_TYPE_BOOL, false, "help", 0, &(cmdargs)->help, "Show help", NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ @@ -88,14 +88,14 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); "graph", \ 'g', \ &(cmdargs)->json_confs->graph, \ - "Root directory of the iSulad runtime", \ + "Root directory of the iSulad runtime (default \"/var/lib/isulad\")", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "state", \ 'S', \ &(cmdargs)->json_confs->state, \ - "Root directory for execution state files", \ + "Root directory for execution state files (default \"/var/run/isulad\")", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ @@ -105,20 +105,20 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); "timeout duration for waiting on a container to start before it is killed", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, false, "engine", 'e', &(cmdargs)->json_confs->engine, \ - "Select backend engine", NULL }, \ + "Select backend engine (default lcr)", NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "log-level", \ 'l', \ &(cmdargs)->json_confs->log_level, \ - "Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE", \ + "Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE (default INFO)", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "log-driver", \ 0, \ &(cmdargs)->json_confs->log_driver, \ - "Set daemon log driver, such as: file", \ + "Set daemon log driver, support stdout and file (default file)", \ NULL }, \ { CMD_OPT_TYPE_CALLBACK, \ false, \ @@ -127,34 +127,34 @@ 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_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 isula)", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "storage-driver", \ 0, \ &(cmdargs)->json_confs->storage_driver, \ - "Storage driver to use(default overlay2)", \ + "Storage driver to use (default overlay2)", \ NULL }, \ { CMD_OPT_TYPE_CALLBACK, \ false, \ @@ -166,7 +166,7 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); SUP_GROUPS_OPT(cmdargs) \ { CMD_OPT_TYPE_CALLBACK, \ false, \ - "registry-mirrors", \ + "registry-mirrors", \ 0, \ &(cmdargs)->json_confs->registry_mirrors, \ "Registry to be prepended when pulling unqualified images, can be specified multiple times", \ @@ -197,28 +197,28 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); "pod-sandbox-image", \ 0, \ &(cmdargs)->json_confs->pod_sandbox_image, \ - "The image whose network/ipc namespaces containers in each pod will use. (default \"pause-${machine}:3.0\")", \ + "The image whose network/ipc namespaces containers in each pod will use (default \"pause-${machine}:3.0\")",\ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "network-plugin", \ 0, \ &(cmdargs)->json_confs->network_plugin, \ - "Set network plugin, default is null, suppport null and cni", \ + "Set network plugin, suppport null and cni (default null)", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "cni-bin-dir", \ 0, \ &(cmdargs)->json_confs->cni_bin_dir, \ - "The full path of the directory in which to search for CNI plugin binaries. Default: /opt/cni/bin", \ + "The full path of the directory in which to search for CNI plugin binaries (default \"/opt/cni/bin\")", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ "cni-conf-dir", \ 0, \ &(cmdargs)->json_confs->cni_conf_dir, \ - "The full path of the directory in which to search for CNI config files. Default: /etc/cni/net.d", \ + "The full path of the directory in which to search for CNI config files (default \"/etc/cni/net.d\")", \ NULL }, \ { CMD_OPT_TYPE_BOOL, \ false, \ @@ -232,14 +232,14 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); "insecure-skip-verify-enforce", \ 0, \ &(cmdargs)->json_confs->insecure_skip_verify_enforce, \ - "Force to skip the insecure verify(default false)", \ + "Force to skip the insecure verify (default false)", \ NULL }, \ { CMD_OPT_TYPE_BOOL, \ false, \ "use-decrypted-key", \ 0, \ (cmdargs)->json_confs->use_decrypted_key, \ - "Use decrypted private key by default(default true)", \ + "Use decrypted private key by default (default true)", \ NULL }, \ { CMD_OPT_TYPE_STRING_DUP, \ false, \ @@ -296,6 +296,26 @@ int command_default_ulimit_append(command_option_t *option, const char *arg); false, "selinux-enabled", 0, &(cmdargs)->json_confs->selinux_enabled, \ "Enable selinux support", NULL \ }, \ + { CMD_OPT_TYPE_STRING_DUP, \ + false, "default-runtime", 0, &(cmdargs)->json_confs->default_runtime, \ + "Default container runtime (default lcr)", NULL \ + }, \ + { CMD_OPT_TYPE_CALLBACK, \ + false, "cpu-rt-period", 0, &(cmdargs)->json_confs->cpu_rt_period, \ + "Limit CPU real-time period in microseconds for all containers", command_convert_llong \ + }, \ + { CMD_OPT_TYPE_CALLBACK, \ + false, "cpu-rt-runtime", 0, &(cmdargs)->json_confs->cpu_rt_runtime, \ + "Limit CPU real-time runtime in microseconds for all containers", command_convert_llong \ + }, \ + { CMD_OPT_TYPE_STRING_DUP, \ + false, "enable-plugins", 0, &(cmdargs)->json_confs->enable_plugins, \ + "Enable plugins for all containers", NULL \ + }, \ + { CMD_OPT_TYPE_CALLBACK, \ + false, "cri-runtime", 0, (cmdargs), \ + "CRI runtime class transform", server_callback_cri_runtime \ + }, \ #ifdef __cplusplus } diff --git a/src/cmd/isulad/main.c b/src/cmd/isulad/main.c index ccba7107..d4f984d5 100644 --- a/src/cmd/isulad/main.c +++ b/src/cmd/isulad/main.c @@ -501,47 +501,6 @@ int check_and_set_default_isulad_log_file(struct service_arguments *args) return 0; } -static int set_parent_mount_dir(struct service_arguments *args) -{ - int ret = -1; - int nret; - size_t len; - char *rootfsdir = NULL; - - if (args->json_confs == NULL) { - ERROR("Empty json configs"); - goto out; - } - if (strlen(args->json_confs->graph) > (SIZE_MAX - strlen("/mnt/rootfs")) - 1) { - ERROR("Root directory of the isulad runtime is too long"); - goto out; - } - len = strlen(args->json_confs->graph) + strlen("/mnt/rootfs") + 1; - if (len > PATH_MAX) { - ERROR("The size of path exceeds the limit"); - goto out; - } - rootfsdir = util_common_calloc_s(len); - if (rootfsdir == NULL) { - ERROR("Out of memory"); - goto out; - } - nret = snprintf(rootfsdir, len, "%s/mnt/rootfs", args->json_confs->graph); - if (nret < 0 || (size_t)nret >= len) { - ERROR("Failed to print string"); - goto out; - } - - free(args->json_confs->rootfsmntdir); - args->json_confs->rootfsmntdir = util_strdup_s(rootfsdir); - - ret = 0; - -out: - free(rootfsdir); - return ret; -} - static int check_hook_spec_file(const char *hook_spec) { struct stat hookstat = { 0 }; @@ -1004,10 +963,6 @@ static int update_server_args(struct service_arguments *args) return -1; } - if (set_parent_mount_dir(args)) { - return -1; - } - /* parse hook spec */ if (parse_conf_hooks(args) != 0) { return -1; @@ -1050,6 +1005,7 @@ static int server_conf_parse_save(int argc, const char **argv) /* Step2: load json configs and merge into global configs */ if (merge_json_confs_into_global(args) != 0) { + ERROR("Failed to merge json conf into global"); ret = -1; goto out; } @@ -1062,6 +1018,7 @@ static int server_conf_parse_save(int argc, const char **argv) } if (update_server_args(args) != 0) { + ERROR("Failed to update server args"); ret = -1; goto out; } @@ -1165,6 +1122,7 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch const char *fifo_full_path) { int ret = 0; + char *rootfs_mnt_dir = NULL; #ifdef ENABLE_USERNS_REMAP char* userns_remap = conf_get_isulad_userns_remap(); char *isulad_root = NULL; @@ -1228,7 +1186,14 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch } #endif - if (mount_rootfs_mnt_dir(args->json_confs->rootfsmntdir)) { + rootfs_mnt_dir = conf_get_isulad_mount_rootfs(); + if (rootfs_mnt_dir == NULL) { + ERROR("Failed to get isulad mount rootfs"); + ret = -1; + goto out; + } + + if (mount_rootfs_mnt_dir(rootfs_mnt_dir)) { ERROR("Create and mount parent directory failed"); ret = -1; goto out; @@ -1241,6 +1206,7 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch } out: + free(rootfs_mnt_dir); #ifdef ENABLE_USERNS_REMAP free(isulad_root); free(userns_remap); diff --git a/src/daemon/config/daemon_arguments.c b/src/daemon/config/daemon_arguments.c index 719efef0..076c10a6 100644 --- a/src/daemon/config/daemon_arguments.c +++ b/src/daemon/config/daemon_arguments.c @@ -148,7 +148,6 @@ int service_arguments_init(struct service_arguments *args) args->json_confs->pidfile = util_strdup_s(DEFAULT_PID_FILE); args->json_confs->storage_driver = util_strdup_s("overlay2"); args->json_confs->native_umask = util_strdup_s(UMASK_SECURE); - args->json_confs->image_service = true; args->json_confs->image_layer_check = false; args->json_confs->use_decrypted_key = (bool *)util_common_calloc_s(sizeof(bool)); if (args->json_confs->use_decrypted_key == NULL) { @@ -165,6 +164,11 @@ int service_arguments_init(struct service_arguments *args) args->default_ulimit_len = 0; args->json_confs->websocket_server_listening_port = DEFAULT_WEBSOCKET_SERVER_LISTENING_PORT; args->json_confs->selinux_enabled = false; + args->json_confs->default_runtime = util_strdup_s(DEFAULT_RUNTIME_NAME); + args->json_confs->cri_runtimes = (json_map_string_string *)util_common_calloc_s(sizeof(json_map_string_string)); + if (args->json_confs->cri_runtimes == NULL) { + goto free_out; + } ret = 0; @@ -200,57 +204,108 @@ void service_arguments_free(struct service_arguments *args) free_default_ulimit(args->default_ulimit); args->default_ulimit = NULL; args->default_ulimit_len = 0; + + free(args->json_confs->default_runtime); + args->json_confs->default_runtime = NULL; + + free_json_map_string_string(args->json_confs->cri_runtimes); + args->json_confs->cri_runtimes = NULL; } -/* server log opt parser */ -int server_log_opt_parser(struct service_arguments *args, const char *option) +static int key_value_opt_parser(const char *option, char **key, char **value) { int ret = -1; - char *key = NULL; - char *value = NULL; - char *tmp = NULL; + char *tmp_key = NULL; + char *tmp_value = NULL; + char *tmp_option = NULL; size_t len = 0; size_t total_len = 0; - if (option == NULL || args == NULL) { - goto out; - } - // option format: key=value total_len = strlen(option); - if (args == NULL || total_len <= 2) { - goto out; + if (total_len <= 2) { + return -1; } - tmp = util_strdup_s(option); - key = tmp; - value = strchr(tmp, '='); + tmp_option = util_strdup_s(option); + tmp_key = tmp_option; + tmp_value = strchr(tmp_option, '='); // option do not contain '=' - if (value == NULL) { + if (tmp_value == NULL) { goto out; } - len = (size_t)(value - key); + len = (size_t)(tmp_value - tmp_key); // if option is '=key' if (len == 0) { goto out; } + // if option is 'key=' if (total_len == len + 1) { goto out; } - tmp[len] = '\0'; - value += 1; - ret = parse_log_opts(args, key, value); + tmp_option[len] = '\0'; + *key = util_strdup_s(tmp_key); + tmp_option[len] = '='; + + tmp_value += 1; + *value = util_strdup_s(tmp_value); + + ret = 0; + +out: + free(tmp_option); + return ret; +} +/* server log opt parser */ +int server_log_opt_parser(struct service_arguments *args, const char *option) +{ + int ret = -1; + char *key = NULL; + char *value = NULL; + + if (option == NULL || args == NULL) { + return -1; + } + + if (key_value_opt_parser(option, &key, &value) != 0) { + return -1; + } + + ret = parse_log_opts(args, key, value); if (ret == 0 && args->json_confs != NULL && args->json_confs->log_opts != NULL) { ret = append_json_map_string_string(args->json_confs->log_opts, key, value); } - tmp[len] = '='; -out: - free(tmp); + free(key); + free(value); + return ret; +} + +/* server cri runtime parser */ +int server_cri_runtime_parser(struct service_arguments *args, const char *option) +{ + int ret = 0; + char *key = NULL; + char *value = NULL; + + if (option == NULL || args == NULL) { + return -1; + } + + if (key_value_opt_parser(option, &key, &value) != 0) { + return -1; + } + + if (args->json_confs != NULL && args->json_confs->cri_runtimes != NULL) { + ret = append_json_map_string_string(args->json_confs->cri_runtimes, key, value); + } + + free(key); + free(value); return ret; } diff --git a/src/daemon/config/daemon_arguments.h b/src/daemon/config/daemon_arguments.h index 54099c81..49f5961e 100644 --- a/src/daemon/config/daemon_arguments.h +++ b/src/daemon/config/daemon_arguments.h @@ -71,6 +71,7 @@ struct service_arguments { int service_arguments_init(struct service_arguments *args); void service_arguments_free(struct service_arguments *args); int server_log_opt_parser(struct service_arguments *args, const char *option); +int server_cri_runtime_parser(struct service_arguments *args, const char *option); size_t ulimit_array_len(host_config_ulimits_element **default_ulimit); diff --git a/src/daemon/config/isulad_config.c b/src/daemon/config/isulad_config.c index 6f17660b..86a9609a 100644 --- a/src/daemon/config/isulad_config.c +++ b/src/daemon/config/isulad_config.c @@ -529,6 +529,34 @@ out: return result; } +static char *get_parent_mount_dir(char *graph) +{ + int nret; + size_t len; + char *rootfsdir = NULL; + + len = strlen(graph) + strlen("/mnt/rootfs") + 1; + if (len > PATH_MAX) { + ERROR("The size of path exceeds the limit"); + return NULL; + } + + rootfsdir = util_common_calloc_s(len); + if (rootfsdir == NULL) { + ERROR("Out of memory"); + return NULL; + } + + nret = snprintf(rootfsdir, len, "%s/mnt/rootfs", graph); + if (nret < 0 || (size_t)nret >= len) { + ERROR("Failed to print string"); + free(rootfsdir); + return NULL; + } + + return rootfsdir; +} + /* conf get isulad mount rootfs */ char *conf_get_isulad_mount_rootfs() { @@ -540,11 +568,11 @@ char *conf_get_isulad_mount_rootfs() } conf = conf_get_server_conf(); - if (conf == NULL || conf->json_confs->rootfsmntdir == NULL) { + if (conf == NULL || conf->json_confs == NULL || conf->json_confs->graph == NULL) { goto out; } - path = util_strdup_s(conf->json_confs->rootfsmntdir); + path = get_parent_mount_dir(conf->json_confs->graph); out: (void)isulad_server_conf_unlock(); @@ -1449,6 +1477,25 @@ static int merge_logs_conf_into_global(struct service_arguments *args, isulad_da return do_merge_container_logs_conf(args, tmp_json_confs); } +static int merge_cri_runtimes_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs) +{ + size_t i; + + if (tmp_json_confs->cri_runtimes == NULL) { + return 0; + } + + for (i = 0; i < tmp_json_confs->cri_runtimes->len; i++) { + if (append_json_map_string_string(args->json_confs->cri_runtimes, tmp_json_confs->cri_runtimes->keys[i], + tmp_json_confs->cri_runtimes->values[i]) != 0) { + ERROR("Out of memory"); + return -1; + } + } + + return 0; +} + 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; @@ -1549,7 +1596,6 @@ int merge_json_confs_into_global(struct service_arguments *args) #endif override_string_value(&args->json_confs->native_umask, &tmp_json_confs->native_umask); override_string_value(&args->json_confs->cgroup_parent, &tmp_json_confs->cgroup_parent); - override_string_value(&args->json_confs->rootfsmntdir, &tmp_json_confs->rootfsmntdir); override_string_value(&args->json_confs->start_timeout, &tmp_json_confs->start_timeout); override_string_value(&args->json_confs->pod_sandbox_image, &tmp_json_confs->pod_sandbox_image); override_string_value(&args->json_confs->network_plugin, &tmp_json_confs->network_plugin); @@ -1559,8 +1605,10 @@ int merge_json_confs_into_global(struct service_arguments *args) args->json_confs->runtimes = tmp_json_confs->runtimes; tmp_json_confs->runtimes = NULL; - args->json_confs->cri_runtimes = tmp_json_confs->cri_runtimes; - tmp_json_confs->cri_runtimes = NULL; + if (merge_cri_runtimes_into_global(args, tmp_json_confs)) { + ret = -1; + goto out; + } #ifdef ENABLE_SUP_GROUPS args->json_confs->sup_groups = tmp_json_confs->sup_groups; @@ -1588,9 +1636,6 @@ int merge_json_confs_into_global(struct service_arguments *args) args->json_confs->cpu_rt_runtime = tmp_json_confs->cpu_rt_runtime; } - if (tmp_json_confs->image_service) { - args->json_confs->image_service = tmp_json_confs->image_service; - } if (tmp_json_confs->image_layer_check) { args->json_confs->image_layer_check = tmp_json_confs->image_layer_check; } diff --git a/src/daemon/modules/events/collector.c b/src/daemon/modules/events/collector.c index 319e777a..9dc4dbe7 100644 --- a/src/daemon/modules/events/collector.c +++ b/src/daemon/modules/events/collector.c @@ -578,7 +578,7 @@ static int do_write_events(const stream_func_wrapper *stream, struct isulad_even goto out; } if (!stream->write_func(stream->writer, event)) { - ERROR("Failed to send exit event for 'events' client"); + ERROR("Failed to send event for 'events' client"); ret = -1; goto out; } -- 2.25.1