| #include <slurm/spank.h> |
| #include <string.h> |
| |
| #define STRINGIFY(x) #x |
| #define TOSTRING(x) STRINGIFY(x) |
| |
| #ifndef PLUGIN_NAME |
| #define PLUGIN_NAME spank_fail_test |
| #endif |
| |
| SPANK_PLUGIN(PLUGIN_NAME, 1); |
| |
| int slurm_spank_init_failure_mode = ESPANK_NODE_FAILURE; |
| |
| static char *current_context(void) |
| { |
| switch (spank_context()) { |
| case S_CTX_ERROR: |
| return "error"; |
| case S_CTX_LOCAL: |
| return "local"; |
| case S_CTX_REMOTE: |
| return "remote"; |
| case S_CTX_ALLOCATOR: |
| return "allocator"; |
| case S_CTX_SLURMD: |
| return "slurmd"; |
| case S_CTX_JOB_SCRIPT: |
| return "job_script"; |
| default: |
| return "unknown"; |
| } |
| } |
| |
| /* |
| * This plugin will fail in one of the SPANK plugin entrypoints if configured |
| * to do so via flags in the plugstack file. |
| * Syntax: |
| * required spank_test.so <func> <context> [<job|node>] |
| * Examples: |
| * required spank_test.so slurm_spank_init remote |
| * required spank_test.so slurm_spank_init remote job |
| * required spank_test.so slurm_spank_init remote node |
| */ |
| static int fail_if(int ac, char **av, const char *func) |
| { |
| if (ac == 0) |
| return ESPANK_SUCCESS; |
| if (ac == 2 || ac == 3) { |
| if (ac == 3) { |
| if (strcasecmp(av[2], "job") == 0) |
| slurm_spank_init_failure_mode = |
| ESPANK_JOB_FAILURE; |
| else if (strcasecmp(av[2], "node")) |
| slurm_error( |
| "Invalid failure mode '%s'. Use 'job' or 'node'.", |
| av[2]); |
| } |
| |
| /* Match function name and context. */ |
| if (!strcmp(av[0], func) && |
| !strcasecmp(av[1], current_context())) |
| return -1; |
| return ESPANK_SUCCESS; |
| } |
| |
| slurm_error( |
| "The plugin must be configured with both <func> <context> [<job|node>] or neither."); |
| return -1; |
| } |
| |
| #define ENTRYPOINT(FUNC) \ |
| int FUNC(spank_t sp, int ac, char **av) \ |
| { \ |
| slurm_spank_log("%s: %s %s", TOSTRING(PLUGIN_NAME), __func__, \ |
| current_context()); \ |
| return fail_if(ac, av, __func__); \ |
| } |
| |
| ENTRYPOINT(slurm_spank_init) |
| ENTRYPOINT(slurm_spank_job_prolog) |
| ENTRYPOINT(slurm_spank_init_post_opt) |
| ENTRYPOINT(slurm_spank_local_user_init) |
| ENTRYPOINT(slurm_spank_user_init) |
| ENTRYPOINT(slurm_spank_task_init_privileged) |
| ENTRYPOINT(slurm_spank_task_init) |
| ENTRYPOINT(slurm_spank_task_post_fork) |
| ENTRYPOINT(slurm_spank_task_exit) |
| ENTRYPOINT(slurm_spank_job_epilog) |
| ENTRYPOINT(slurm_spank_slurmd_exit) |
| ENTRYPOINT(slurm_spank_exit) |