|
@@ -43,26 +43,72 @@
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static void display_usage(FILE *stream) {
|
|
static void display_usage(FILE *stream) {
|
|
- char *usage_template =
|
|
|
|
- "Usage: container-executor --checksetup\n" \
|
|
|
|
- " container-executor --mount-cgroups <hierarchy> <controller=path>...\n" \
|
|
|
|
- " container-executor --tc-modify-state <command-file>\n" \
|
|
|
|
- " container-executor --tc-read-state <command-file>\n" \
|
|
|
|
- " container-executor --tc-read-stats <command-file>\n" \
|
|
|
|
- " container-executor --run-docker <command-file>\n" \
|
|
|
|
- " container-executor <user> <yarn-user> <command> <command-args>\n" \
|
|
|
|
|
|
+ char usage_template[4096];
|
|
|
|
+
|
|
|
|
+ usage_template[0] = '\0';
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ "Usage: container-executor --checksetup\n"
|
|
|
|
+ " container-executor --mount-cgroups <hierarchy> "
|
|
|
|
+ "<controller=path>...\n" );
|
|
|
|
+
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ " container-executor --tc-modify-state <command-file>\n"
|
|
|
|
+ " container-executor --tc-read-state <command-file>\n"
|
|
|
|
+ " container-executor --tc-read-stats <command-file>\n" );
|
|
|
|
+ } else {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ "[DISABLED] container-executor --tc-modify-state <command-file>\n"
|
|
|
|
+ "[DISABLED] container-executor --tc-read-state <command-file>\n"
|
|
|
|
+ "[DISABLED] container-executor --tc-read-stats <command-file>\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(is_docker_support_enabled()) {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ " container-executor --run-docker <command-file>\n");
|
|
|
|
+ } else {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ "[DISABLED] container-executor --run-docker <command-file>\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ " container-executor <user> <yarn-user> <command> <command-args>\n"
|
|
" where command and command-args: \n" \
|
|
" where command and command-args: \n" \
|
|
- " initialize container: %2d appid tokens nm-local-dirs nm-log-dirs cmd app...\n" \
|
|
|
|
- " launch container: %2d appid containerid workdir container-script " \
|
|
|
|
- "tokens pidfile nm-local-dirs nm-log-dirs resources optional-tc-command-file\n" \
|
|
|
|
- " launch docker container: %2d appid containerid workdir container-script " \
|
|
|
|
- "tokens pidfile nm-local-dirs nm-log-dirs docker-command-file resources optional-tc-command-file\n" \
|
|
|
|
- " signal container: %2d container-pid signal\n" \
|
|
|
|
- " delete as user: %2d relative-path\n" ;
|
|
|
|
|
|
+ " initialize container: %2d appid tokens nm-local-dirs "
|
|
|
|
+ "nm-log-dirs cmd app...\n"
|
|
|
|
+ " launch container: %2d appid containerid workdir "
|
|
|
|
+ "container-script tokens pidfile nm-local-dirs nm-log-dirs resources ");
|
|
|
|
+
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ strcat(usage_template, "optional-tc-command-file\n");
|
|
|
|
+ } else {
|
|
|
|
+ strcat(usage_template, "\n");
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if(is_docker_support_enabled()) {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ " launch docker container: %2d appid containerid workdir "
|
|
|
|
+ "container-script tokens pidfile nm-local-dirs nm-log-dirs "
|
|
|
|
+ "docker-command-file resources ");
|
|
|
|
+ } else {
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ "[DISABLED] launch docker container: %2d appid containerid workdir "
|
|
|
|
+ "container-script tokens pidfile nm-local-dirs nm-log-dirs "
|
|
|
|
+ "docker-command-file resources ");
|
|
|
|
+ }
|
|
|
|
|
|
- fprintf(stream, usage_template, INITIALIZE_CONTAINER, LAUNCH_CONTAINER, LAUNCH_DOCKER_CONTAINER,
|
|
|
|
- SIGNAL_CONTAINER, DELETE_AS_USER);
|
|
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ strcat(usage_template, "optional-tc-command-file\n");
|
|
|
|
+ } else {
|
|
|
|
+ strcat(usage_template, "\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ strcat(usage_template,
|
|
|
|
+ " signal container: %2d container-pid signal\n"
|
|
|
|
+ " delete as user: %2d relative-path\n");
|
|
|
|
+
|
|
|
|
+ fprintf(stream, usage_template, INITIALIZE_CONTAINER, LAUNCH_CONTAINER,
|
|
|
|
+ LAUNCH_DOCKER_CONTAINER, SIGNAL_CONTAINER, DELETE_AS_USER);
|
|
}
|
|
}
|
|
|
|
|
|
/* Sets up log files for normal/error logging */
|
|
/* Sets up log files for normal/error logging */
|
|
@@ -143,6 +189,10 @@ static void assert_valid_setup(char *current_executable) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+static void display_feature_disabled_message(const char* name) {
|
|
|
|
+ fprintf(ERRORFILE, "Feature disabled: %s\n", name);
|
|
|
|
+}
|
|
|
|
+
|
|
/* Use to store parsed input parmeters for various operations */
|
|
/* Use to store parsed input parmeters for various operations */
|
|
static struct {
|
|
static struct {
|
|
char *cgroups_hierarchy;
|
|
char *cgroups_hierarchy;
|
|
@@ -199,47 +249,67 @@ static int validate_arguments(int argc, char **argv , int *operation) {
|
|
}
|
|
}
|
|
|
|
|
|
if (strcmp("--tc-modify-state", argv[1]) == 0) {
|
|
if (strcmp("--tc-modify-state", argv[1]) == 0) {
|
|
- if (argc != 3) {
|
|
|
|
- display_usage(stdout);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ if (argc != 3) {
|
|
|
|
+ display_usage(stdout);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
+ optind++;
|
|
|
|
+ cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
+ *operation = TRAFFIC_CONTROL_MODIFY_STATE;
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("traffic control");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
}
|
|
}
|
|
- optind++;
|
|
|
|
- cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
- *operation = TRAFFIC_CONTROL_MODIFY_STATE;
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if (strcmp("--tc-read-state", argv[1]) == 0) {
|
|
if (strcmp("--tc-read-state", argv[1]) == 0) {
|
|
- if (argc != 3) {
|
|
|
|
- display_usage(stdout);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ if (argc != 3) {
|
|
|
|
+ display_usage(stdout);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
+ optind++;
|
|
|
|
+ cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
+ *operation = TRAFFIC_CONTROL_READ_STATE;
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("traffic control");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
}
|
|
}
|
|
- optind++;
|
|
|
|
- cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
- *operation = TRAFFIC_CONTROL_READ_STATE;
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if (strcmp("--tc-read-stats", argv[1]) == 0) {
|
|
if (strcmp("--tc-read-stats", argv[1]) == 0) {
|
|
- if (argc != 3) {
|
|
|
|
- display_usage(stdout);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ if (argc != 3) {
|
|
|
|
+ display_usage(stdout);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
+ optind++;
|
|
|
|
+ cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
+ *operation = TRAFFIC_CONTROL_READ_STATS;
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("traffic control");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
}
|
|
}
|
|
- optind++;
|
|
|
|
- cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
- *operation = TRAFFIC_CONTROL_READ_STATS;
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if (strcmp("--run-docker", argv[1]) == 0) {
|
|
if (strcmp("--run-docker", argv[1]) == 0) {
|
|
- if (argc != 3) {
|
|
|
|
- display_usage(stdout);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
|
|
+ if(is_docker_support_enabled()) {
|
|
|
|
+ if (argc != 3) {
|
|
|
|
+ display_usage(stdout);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
+ optind++;
|
|
|
|
+ cmd_input.docker_command_file = argv[optind++];
|
|
|
|
+ *operation = RUN_DOCKER;
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("docker");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
}
|
|
}
|
|
- optind++;
|
|
|
|
- cmd_input.docker_command_file = argv[optind++];
|
|
|
|
- *operation = RUN_DOCKER;
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
/* Now we have to validate 'run as user' operations that don't use
|
|
/* Now we have to validate 'run as user' operations that don't use
|
|
a 'long option' - we should fix this at some point. The validation/argument
|
|
a 'long option' - we should fix this at some point. The validation/argument
|
|
@@ -285,51 +355,64 @@ static int validate_run_as_user_commands(int argc, char **argv, int *operation)
|
|
*operation = RUN_AS_USER_INITIALIZE_CONTAINER;
|
|
*operation = RUN_AS_USER_INITIALIZE_CONTAINER;
|
|
return 0;
|
|
return 0;
|
|
case LAUNCH_DOCKER_CONTAINER:
|
|
case LAUNCH_DOCKER_CONTAINER:
|
|
- //kill me now.
|
|
|
|
- if (!(argc == 14 || argc == 15)) {
|
|
|
|
- fprintf(ERRORFILE, "Wrong number of arguments (%d vs 14 or 15) for launch docker container\n",
|
|
|
|
- argc);
|
|
|
|
- fflush(ERRORFILE);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
- }
|
|
|
|
|
|
+ if(is_docker_support_enabled()) {
|
|
|
|
+ //kill me now.
|
|
|
|
+ if (!(argc == 14 || argc == 15)) {
|
|
|
|
+ fprintf(ERRORFILE, "Wrong number of arguments (%d vs 14 or 15) for"
|
|
|
|
+ " launch docker container\n", argc);
|
|
|
|
+ fflush(ERRORFILE);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
|
|
- cmd_input.app_id = argv[optind++];
|
|
|
|
- cmd_input.container_id = argv[optind++];
|
|
|
|
- cmd_input.current_dir = argv[optind++];
|
|
|
|
- cmd_input.script_file = argv[optind++];
|
|
|
|
- cmd_input.cred_file = argv[optind++];
|
|
|
|
- cmd_input.pid_file = argv[optind++];
|
|
|
|
- cmd_input.local_dirs = argv[optind++];// good local dirs as a comma separated list
|
|
|
|
- cmd_input.log_dirs = argv[optind++];// good log dirs as a comma separated list
|
|
|
|
- cmd_input.docker_command_file = argv[optind++];
|
|
|
|
- resources = argv[optind++];// key,value pair describing resources
|
|
|
|
- resources_key = malloc(strlen(resources));
|
|
|
|
- resources_value = malloc(strlen(resources));
|
|
|
|
- if (get_kv_key(resources, resources_key, strlen(resources)) < 0 ||
|
|
|
|
- get_kv_value(resources, resources_value, strlen(resources)) < 0) {
|
|
|
|
- fprintf(ERRORFILE, "Invalid arguments for cgroups resources: %s",
|
|
|
|
- resources);
|
|
|
|
- fflush(ERRORFILE);
|
|
|
|
- free(resources_key);
|
|
|
|
- free(resources_value);
|
|
|
|
- return INVALID_ARGUMENT_NUMBER;
|
|
|
|
- }
|
|
|
|
- //network isolation through tc
|
|
|
|
- if (argc == 15) {
|
|
|
|
- cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
- }
|
|
|
|
|
|
+ cmd_input.app_id = argv[optind++];
|
|
|
|
+ cmd_input.container_id = argv[optind++];
|
|
|
|
+ cmd_input.current_dir = argv[optind++];
|
|
|
|
+ cmd_input.script_file = argv[optind++];
|
|
|
|
+ cmd_input.cred_file = argv[optind++];
|
|
|
|
+ cmd_input.pid_file = argv[optind++];
|
|
|
|
+ // good local dirs as a comma separated list
|
|
|
|
+ cmd_input.local_dirs = argv[optind++];
|
|
|
|
+ // good log dirs as a comma separated list
|
|
|
|
+ cmd_input.log_dirs = argv[optind++];
|
|
|
|
+ cmd_input.docker_command_file = argv[optind++];
|
|
|
|
+ // key,value pair describing resources
|
|
|
|
+ resources = argv[optind++];
|
|
|
|
+ resources_key = malloc(strlen(resources));
|
|
|
|
+ resources_value = malloc(strlen(resources));
|
|
|
|
+ if (get_kv_key(resources, resources_key, strlen(resources)) < 0 ||
|
|
|
|
+ get_kv_value(resources, resources_value, strlen(resources)) < 0) {
|
|
|
|
+ fprintf(ERRORFILE, "Invalid arguments for cgroups resources: %s",
|
|
|
|
+ resources);
|
|
|
|
+ fflush(ERRORFILE);
|
|
|
|
+ free(resources_key);
|
|
|
|
+ free(resources_value);
|
|
|
|
+ return INVALID_ARGUMENT_NUMBER;
|
|
|
|
+ }
|
|
|
|
+ //network isolation through tc
|
|
|
|
+ if (argc == 15) {
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("traffic control");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- cmd_input.resources_key = resources_key;
|
|
|
|
- cmd_input.resources_value = resources_value;
|
|
|
|
- cmd_input.resources_values = extract_values(resources_value);
|
|
|
|
- *operation = RUN_AS_USER_LAUNCH_DOCKER_CONTAINER;
|
|
|
|
- return 0;
|
|
|
|
|
|
+ cmd_input.resources_key = resources_key;
|
|
|
|
+ cmd_input.resources_value = resources_value;
|
|
|
|
+ cmd_input.resources_values = extract_values(resources_value);
|
|
|
|
+ *operation = RUN_AS_USER_LAUNCH_DOCKER_CONTAINER;
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("docker");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
|
|
+ }
|
|
|
|
|
|
case LAUNCH_CONTAINER:
|
|
case LAUNCH_CONTAINER:
|
|
//kill me now.
|
|
//kill me now.
|
|
if (!(argc == 13 || argc == 14)) {
|
|
if (!(argc == 13 || argc == 14)) {
|
|
- fprintf(ERRORFILE, "Wrong number of arguments (%d vs 13 or 14) for launch container\n",
|
|
|
|
- argc);
|
|
|
|
|
|
+ fprintf(ERRORFILE, "Wrong number of arguments (%d vs 13 or 14)"
|
|
|
|
+ " for launch container\n", argc);
|
|
fflush(ERRORFILE);
|
|
fflush(ERRORFILE);
|
|
return INVALID_ARGUMENT_NUMBER;
|
|
return INVALID_ARGUMENT_NUMBER;
|
|
}
|
|
}
|
|
@@ -358,7 +441,12 @@ static int validate_run_as_user_commands(int argc, char **argv, int *operation)
|
|
|
|
|
|
//network isolation through tc
|
|
//network isolation through tc
|
|
if (argc == 14) {
|
|
if (argc == 14) {
|
|
- cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
|
|
+ if(is_tc_support_enabled()) {
|
|
|
|
+ cmd_input.traffic_control_command_file = argv[optind++];
|
|
|
|
+ } else {
|
|
|
|
+ display_feature_disabled_message("traffic control");
|
|
|
|
+ return FEATURE_DISABLED;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
cmd_input.resources_key = resources_key;
|
|
cmd_input.resources_key = resources_key;
|