Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*****************************************************************************\
* wiki_startjob.cpp - handle a Wiki STARTJOB command.
*****************************************************************************
* Copyright (C) 2002 The Regents of the University of California.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Kevin Tew <tew1@llnl.gov> et. al.
* UCRL-CODE-2002-040.
*
* This file is part of SLURM, a resource management program.
* For details, see <http://www.llnl.gov/linux/slurm/>.
*
* SLURM is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with SLURM; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
\*****************************************************************************/
#include <string.h>
extern "C" {
# include "src/common/log.h"
# include "src/common/xassert.h"
}
#include "wiki_message.h"
#include "wiki_parser.h"
// **************************************************************************
// TAG( wiki_startjob.cpp )
// **************************************************************************
wiki_startjob_t::wiki_startjob_t( char *data, size_t len ) :
wiki_command_t( data, len, wiki_message_t::STARTJOB )
{
wiki_relation_t *relation;
char *node;
ListIterator j;
// * Get the node list.
relation = (wiki_relation_t *) list_next( m_arg_iterator );
if ( relation == NULL )
throw "malformed command (missing task list)";
if ( strcmp( relation->name(), "TASKLIST" ) != 0 )
throw "malformed command (expected TASKLIST=<nodes>)";
m_nodelist = list_create( NULL );
j = list_iterator_create( relation->values() );
while ( ( node = (char *) list_next( j ) ) != NULL ) {
list_append( m_nodelist, node );
}
list_iterator_destroy( j );
}
// **************************************************************************
// TAG( action )
// **************************************************************************
message_t *
wiki_startjob_t::action( void )
{
u_int32_t id = (u_int32_t) atol( m_jobid );
char status_msg[128];
// *
// If Maui has specified a node list to run on, change the
// controller's requested node list so that it matches.
// *
if ( list_count( m_nodelist ) > 0 ) {
char *node;
dstring_t node_list;
ListIterator i = list_iterator_create( m_nodelist );
// * There's at least one node.
node = (char *) list_next( i );
xassert( i );
node_list += node;
// * Add the rest of the nodes.
while ( ( node = (char *) list_next( i ) ) != NULL ) {
node_list += ",";
node_list += node;
}
if ( sched_set_nodelist( id, node_list.s() ) == SLURM_ERROR ) {
error( "Wiki cannot assign nodes to job %d", id );
}
}
verbose( "Wiki starting job %s", m_jobid );
rc = sched_start_job( id, (u_int32_t) 1 );
if (rc == SLURM_SUCCESS)
{
snprintf(status_msg, sizeof(status_msg),
"SUCCESS: job %s started successfully", m_jobid);
return new wiki_status_t( 0, status_msg);
}
else
{
snprintf(status_msg, sizeof(status_msg),
"ERROR: job %s failed to start", m_jobid);
return new wiki_status_t( -1, status_msg);