User:Catlee/BuildAPI: Difference between revisions
(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} -> | 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. | |||
POST / | == 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. |
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.