User:Catlee/BuildAPI: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
= REST Interface =
= REST Interface =
== List of request methods, urls, and parameters ==
PUT and DELETE can also be achieved by POSTing to the URL with a POST field "_method" set to PUT or DELETE.
PUT, POST, and DELETE methods will return a job id that can be queried with the 'job_status' method.


GET /builds/branches -> list of branches
GET /builds/branches -> list of branches
Line 6: Line 12:


GET /builds/{branch}/build/{buildid} -> information about a particular build
GET /builds/{branch}/build/{buildid} -> information about a particular build
GET /builds/{branch}/request/{requestid} -> information about a particular build request


GET /builds/{branch}/rev/{revision} -> list of builds for this revision
GET /builds/{branch}/rev/{revision} -> list of builds for this revision
Line 13: Line 21:
GET /builds/{branch}/builders/{buildername} -> list of recent builds, including completed, running, and pending for this builder name
GET /builds/{branch}/builders/{buildername} -> list of recent builds, including completed, running, and pending for this builder name


PUT /builds/{branch}/build/{buildid} -> update this build (e.g. re-prioritize request)
GET /builds/jobs/{job_id} -> status on job request (e.g. cancel build, etc.)
 
PUT /builds/{branch}/request/{requestid} -> update this build
* priority (required, sets the build request's priority)
 
DELETE /builds/{branch}/build/{buildid} -> cancel this build
 
DELETE /builds/{branch}/request/{requestid} -> cancel this buildrequest
* onlyifrunning (optional, set to only cancel builds if they're running)
* onlyifpending (optional, set to only cancel builds if they're pending)
 
DELETE /builds/{branch}/rev/{revision} -> cancel pending/running builds for this revision
* onlyifrunning (optional, set to only cancel builds if they're running)
* onlyifpending (optional, set to only cancel builds if they're pending)
* killmerged (optional, set to cancel builds that are merged with other revisions)
 
POST /builds/{branch}/rev/{revision} -> create a new build with this revision
* properties (optional, extra properties for this build)
 
POST /builds/{branch}/builders/{buildername} -> create a new build on this builder
* revision (optional, which revision to build)
* properties (optional, extra properties for this build)
 
POST /builds/{branch}/build -> rebuilds an old build on this branch
* buildid (which build to rebuild)
* properties (optional, extra properties for this build)
 
POST /builds/{branch}/request -> rebuilds an old build on this branch
* requestid (which request to rebuild)
* properties (optional, extra properties for this build)
 
== Object definitions ==
 
Builds:
* buildid
* buildrequests
* buildnumber
* buildername
* branch
* revision
* starttime
* endtime
* status
 
Build Requests:
* buildrequestid
* buildername
* branch
* revision
* submittime
 
= Implementation Notes =
 
(source at http://hg.mozilla.org/users/catlee_mozilla.com/buildapi/file/493320c66935/RESTAPI_NOTES.txt)
 
== Routing ==
Or, how do URLs get turned into method calls?
 
Look in buildapi/config/routing.py.  All the /builds/ urls are to support
the REST API.
 
URLs get matched to an appropriate route based on these rules, and then
methods in buildapi/controllers/builds.py are called.
 
== GETting data ==
Most GET queries do a few simple operations:
 
1) validate parameters
 
2) make db calls with methods in buildapi/model/builds


DELETE /builds/{branch}/build/{buildid} -> cancel this build (takes onlyifrunning/onlyifpending parameters)
3) return results


POST /builds/{branch}/rev/{revision} -> create a new build with this revision (requires builder names as part of POST data)
Results are formatted according to the 'format' query parameter
("?format=html" or "?format=json").  If 'format' is not set, and the
'Accept' header of the request is set to 'application/json', the format
will be set to json.  Otherwise the format will be html.  These rules are
implemented in buildapi.lib.base.BaseController._get_method_args.


POST /builds/{branch}/builders/{buildername} -> create a new build on this builder (optional revision accepted as part of POST data)
== Job Requests ==
PUT, POST, and DELETE requests (which can be faked by setting a '_method_'
field to 'PUT' or 'DELETE' in a regular POST request if your client doesn't
support PUT/DELETE easiliy...a nice feature of Routes!) represent requests
to change buildbot state.  These are called "Job Requests".


POST /builds/{branch}/build -> rebuilds an old build on this branch (requires buildid of build to rebuild)
Job requests follow a simple flow:


PUT and DELETE can also be achieved by POSTing to the URL with a POST field "_method" set to PUT or DELETE.
1) log request in jobrequests table of buildapi database.  Return
jobrequest id to client.  The client can query the status of this job via
the /builds/job_status/{job_id} method.
 
2) send message to message broker on the 'requests' routing key with
details of job request.
 
3) an external agent (such as buildapi/scripts/buildapi-agent.py) receives
the message, acts on it, and then sends a message on the 'finished' routing
key to indicate the job was completed.
TODO: agent should have a way of attaching failure information
 
4) a thread in the web app is waiting for messages on the 'finished'
routing key.  It will update the jobrequests table when jobs are completed.

Latest revision as of 22:15, 7 December 2010

REST Interface

List of request methods, urls, and parameters

PUT and DELETE can also be achieved by POSTing to the URL with a POST field "_method" set to PUT or DELETE.

PUT, POST, and DELETE methods will return a job id that can be queried with the 'job_status' method.

GET /builds/branches -> list of branches

GET /builds/{branch} -> list of recent builds, including completed, running and pending

GET /builds/{branch}/build/{buildid} -> information about a particular build

GET /builds/{branch}/request/{requestid} -> information about a particular build request

GET /builds/{branch}/rev/{revision} -> list of builds for this revision

GET /builds/{branch}/builders -> list of valid builder names

GET /builds/{branch}/builders/{buildername} -> list of recent builds, including completed, running, and pending for this builder name

GET /builds/jobs/{job_id} -> status on job request (e.g. cancel build, etc.)

PUT /builds/{branch}/request/{requestid} -> update this build

  • priority (required, sets the build request's priority)

DELETE /builds/{branch}/build/{buildid} -> cancel this build

DELETE /builds/{branch}/request/{requestid} -> cancel this buildrequest

  • onlyifrunning (optional, set to only cancel builds if they're running)
  • onlyifpending (optional, set to only cancel builds if they're pending)

DELETE /builds/{branch}/rev/{revision} -> cancel pending/running builds for this revision

  • onlyifrunning (optional, set to only cancel builds if they're running)
  • onlyifpending (optional, set to only cancel builds if they're pending)
  • killmerged (optional, set to cancel builds that are merged with other revisions)

POST /builds/{branch}/rev/{revision} -> create a new build with this revision

  • properties (optional, extra properties for this build)

POST /builds/{branch}/builders/{buildername} -> create a new build on this builder

  • revision (optional, which revision to build)
  • properties (optional, extra properties for this build)

POST /builds/{branch}/build -> rebuilds an old build on this branch

  • buildid (which build to rebuild)
  • properties (optional, extra properties for this build)

POST /builds/{branch}/request -> rebuilds an old build on this branch

  • requestid (which request to rebuild)
  • properties (optional, extra properties for this build)

Object definitions

Builds:

  • buildid
  • buildrequests
  • buildnumber
  • buildername
  • branch
  • revision
  • starttime
  • endtime
  • status

Build Requests:

  • buildrequestid
  • buildername
  • branch
  • revision
  • submittime

Implementation Notes

(source at http://hg.mozilla.org/users/catlee_mozilla.com/buildapi/file/493320c66935/RESTAPI_NOTES.txt)

Routing

Or, how do URLs get turned into method calls?

Look in buildapi/config/routing.py. All the /builds/ urls are to support the REST API.

URLs get matched to an appropriate route based on these rules, and then methods in buildapi/controllers/builds.py are called.

GETting data

Most GET queries do a few simple operations:

1) validate parameters

2) make db calls with methods in buildapi/model/builds

3) return results

Results are formatted according to the 'format' query parameter ("?format=html" or "?format=json"). If 'format' is not set, and the 'Accept' header of the request is set to 'application/json', the format will be set to json. Otherwise the format will be html. These rules are implemented in buildapi.lib.base.BaseController._get_method_args.

Job Requests

PUT, POST, and DELETE requests (which can be faked by setting a '_method_' field to 'PUT' or 'DELETE' in a regular POST request if your client doesn't support PUT/DELETE easiliy...a nice feature of Routes!) represent requests to change buildbot state. These are called "Job Requests".

Job requests follow a simple flow:

1) log request in jobrequests table of buildapi database. Return jobrequest id to client. The client can query the status of this job via the /builds/job_status/{job_id} method.

2) send message to message broker on the 'requests' routing key with details of job request.

3) an external agent (such as buildapi/scripts/buildapi-agent.py) receives the message, acts on it, and then sends a message on the 'finished' routing key to indicate the job was completed. TODO: agent should have a way of attaching failure information

4) a thread in the web app is waiting for messages on the 'finished' routing key. It will update the jobrequests table when jobs are completed.