[[PageOutline]]
= Web services for remote job submission =
This document describes remote interfaces for remotely submitting jobs and batches of jobs
to a BOINC server.
The APIs are accessed by sending a POST request,
using HTTPS, to PROJECT_URL/job_control.php
The inputs and outputs of each API are XML documents.
If an operation fails, the output is of the form
{{{
X
}}}
where X is an error message.
All operations include the authenticator of the user making the request.
This user must be marked as a "job submitter" in the BOINC database.
== Describing a batch ==
A job is described by
{{{
[C]
[URL or path]
... other input files
}}}
Each input file is specified by either a URL accessible to the server,
or by a path on the server.
A batch of jobs is described by:
{{{
appname
[x]
[x]
...
... more jobs
}}}
The names of the input and output template files may be specified;
otherwise the defaults '''appname_in''' and '''appname_out''' are used.
== Batch runtime estimation ==
Estimates the completion time of a batch.
Input:
{{{
X
...
[N]
}}}
'''Priority''', if specified, is relative to other batches submitted by this user.
Output:
{{{
X
}}}
== Submitting a batch ==
Input:
{{{
X
...
[N]
}}}
Output:
{{{
N
}}}
== Querying jobs ==
The jobs in a batch are numbered starting from 0.
Input:
{{{
X
N
M
}}}
Output:
{{{
or
or
N
M
X
X
... other instances
}}}
== Querying batches ==
Input:
{{{
X
N
}}}
Output:
{{{
X
N
X
}}}
== Aborting jobs ==
Input:
{{{
X
N
}}}
Output:
{{{
}}}
== Access control ==
Users can submit jobs only if they have been
given access (via a web interface) by project administrators.
In addition, project admins can allow users to submit jobs for any app,
or can designate which apps they can submit jobs to.
== Example usage ==
PHP:
{{{
$ch = curl_init("https://project.edu/job_control.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "request=
myappname
--t ALPHA
");
$reply = curl_exec($ch);
if (!$reply) die("HTTP op failed\n");
$r = simplexml_load_string($reply);
if (!$r) die("bad reply: $reply\n");
$name = $r->getName();
if ($name == 'estimate') {
echo "estimate: ".(string)$r->seconds."\n";
} else if ($name == 'error') {
foreach ($r->message as $msg) {
echo "$msg\n";
}
} else {
die("bad reply\n");
}
}}}
== Implementation notes ==
New tables
{{{
batch
id
create_time
logical_start_time
logical_end_time
estimated_completion_time
njobs
user_submit
user_id
quota
logical_start_time
bool all_apps
user_app
user_id
app_id
}}}