diff --git a/src/api/allocate.c b/src/api/allocate.c index 9baad9f054623920a1e3d9239587cbd9717fcfc7..d05cc44277322941dc825abcf18f731b3a7c88ab 100644 --- a/src/api/allocate.c +++ b/src/api/allocate.c @@ -1,5 +1,5 @@ /*****************************************************************************\ - * allocate.c - allocate nodes for a job with supplied contraints + * allocate.c - allocate nodes for a job or step with supplied contraints ***************************************************************************** * Copyright (C) 2002 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -87,6 +87,7 @@ slurm_allocate_resources (job_desc_msg_t * job_desc_msg , slurm_seterrno ( rc ); return SLURM_PROTOCOL_ERROR; } + *slurm_alloc_msg = NULL; break ; case RESPONSE_RESOURCE_ALLOCATION: case RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION: @@ -151,6 +152,7 @@ int slurm_job_will_run (job_desc_msg_t * job_desc_msg , resource_allocation_resp slurm_seterrno ( rc ); return SLURM_PROTOCOL_ERROR; } + *slurm_alloc_msg = NULL; break ; case RESPONSE_JOB_WILL_RUN: *slurm_alloc_msg = ( resource_allocation_response_msg_t * ) response_msg . data ; @@ -215,6 +217,7 @@ slurm_allocate_resources_and_run (job_desc_msg_t * job_desc_msg , slurm_seterrno ( rc ); return SLURM_PROTOCOL_ERROR; } + *slurm_alloc_msg = NULL; break ; case RESPONSE_ALLOCATION_AND_RUN_JOB_STEP: /* Calling method is responsible to free this memory */ @@ -230,3 +233,68 @@ slurm_allocate_resources_and_run (job_desc_msg_t * job_desc_msg , return SLURM_PROTOCOL_SUCCESS ; } +/* slurm_job_step_create - create a job step for a given job id */ +int +slurm_job_step_create (job_step_create_request_msg_t * slurm_step_alloc_req_msg, + job_step_create_response_msg_t ** slurm_step_alloc_resp_msg ) +{ + int msg_size ; + int rc ; + slurm_fd sockfd ; + slurm_msg_t request_msg ; + slurm_msg_t response_msg ; + return_code_msg_t * slurm_rc_msg ; + + /* init message connection for message communication with controller */ + if ( ( sockfd = slurm_open_controller_conn ( ) ) == SLURM_SOCKET_ERROR ) { + slurm_seterrno ( SLURM_COMMUNICATIONS_CONNECTION_ERROR ); + return SLURM_SOCKET_ERROR ; + } + + /* send request message */ + request_msg . msg_type = REQUEST_JOB_STEP_CREATE ; + request_msg . data = slurm_step_alloc_req_msg ; + if ( ( rc = slurm_send_controller_msg ( sockfd , & request_msg ) ) == SLURM_SOCKET_ERROR ) { + slurm_seterrno ( SLURM_COMMUNICATIONS_SEND_ERROR ); + return SLURM_SOCKET_ERROR ; + } + + /* receive message */ + if ( ( msg_size = slurm_receive_msg ( sockfd , & response_msg ) ) == SLURM_SOCKET_ERROR ) { + slurm_seterrno ( SLURM_COMMUNICATIONS_RECEIVE_ERROR ); + return SLURM_SOCKET_ERROR ; + } + + /* shutdown message connection */ + if ( ( rc = slurm_shutdown_msg_conn ( sockfd ) ) == SLURM_SOCKET_ERROR ) { + slurm_seterrno ( SLURM_COMMUNICATIONS_SHUTDOWN_ERROR ); + return SLURM_SOCKET_ERROR ; + } + if ( msg_size ) + return msg_size; + + switch ( response_msg . msg_type ) + { + case RESPONSE_SLURM_RC: + slurm_rc_msg = ( return_code_msg_t * ) response_msg . data ; + rc = slurm_rc_msg->return_code; + slurm_free_return_code_msg ( slurm_rc_msg ); + if (rc) { + slurm_seterrno ( rc ); + return SLURM_PROTOCOL_ERROR; + *slurm_step_alloc_resp_msg = NULL; + } + break ; + case RESPONSE_JOB_STEP_CREATE: + /* Calling method is responsible to free this memory */ + *slurm_step_alloc_resp_msg = ( job_step_create_response_msg_t * ) response_msg . data ; + return SLURM_PROTOCOL_SUCCESS; + break ; + default: + slurm_seterrno ( SLURM_UNEXPECTED_MSG_ERROR ); + return SLURM_PROTOCOL_ERROR; + break ; + } + + return SLURM_PROTOCOL_SUCCESS ; +} diff --git a/src/api/slurm.h b/src/api/slurm.h index 23e3fbc797e8b83963817376282fa42ec70aa23b..884cef695ca6db9dcf089d040d9bb4bba43ab382 100644 --- a/src/api/slurm.h +++ b/src/api/slurm.h @@ -114,6 +114,10 @@ extern int slurm_load_partitions (time_t update_time, partition_info_msg_t **par extern int slurm_submit_batch_job (job_desc_msg_t * job_desc_msg, submit_response_msg_t ** slurm_alloc_msg ); +/* slurm_job_step_create - create a job step for a given job id */ +extern int slurm_job_step_create (job_step_create_request_msg_t * slurm_step_alloc_req_msg, + job_step_create_response_msg_t ** slurm_step_alloc_resp_msg ); + extern int slurm_get_job_steps (time_t update_time, uint32_t job_id, uint32_t step_id, job_step_info_response_msg_t **step_response_pptr); extern void slurm_print_job_step_info_msg ( FILE* out, job_step_info_response_msg_t * job_step_info_msg_ptr ); extern void slurm_print_job_step_info ( FILE* out, job_step_info_t * job_step_ptr );