[[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 }}}